]> git.openstreetmap.org Git - rails.git/blob - vendor/assets/iD/iD.js
Merge remote-tracking branch 'upstream/pull/2223'
[rails.git] / vendor / assets / iD / iD.js
1 (function () {
2         var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
3
4         function commonjsRequire () {
5                 throw new Error('Dynamic requires are not currently supported by rollup-plugin-commonjs');
6         }
7
8         function unwrapExports (x) {
9                 return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
10         }
11
12         function createCommonjsModule(fn, module) {
13                 return module = { exports: {} }, fn(module, module.exports), module.exports;
14         }
15
16         function getCjsExportFromNamespace (n) {
17                 return n && n['default'] || n;
18         }
19
20         var isImplemented = function () {
21                 var set, iterator, result;
22                 if (typeof Set !== 'function') return false;
23                 set = new Set(['raz', 'dwa', 'trzy']);
24                 if (String(set) !== '[object Set]') return false;
25                 if (set.size !== 3) return false;
26                 if (typeof set.add !== 'function') return false;
27                 if (typeof set.clear !== 'function') return false;
28                 if (typeof set.delete !== 'function') return false;
29                 if (typeof set.entries !== 'function') return false;
30                 if (typeof set.forEach !== 'function') return false;
31                 if (typeof set.has !== 'function') return false;
32                 if (typeof set.keys !== 'function') return false;
33                 if (typeof set.values !== 'function') return false;
34
35                 iterator = set.values();
36                 result = iterator.next();
37                 if (result.done !== false) return false;
38                 if (result.value !== 'raz') return false;
39
40                 return true;
41         };
42
43         // eslint-disable-next-line no-empty-function
44         var noop = function () {};
45
46         var _undefined = noop(); // Support ES3 engines
47
48         var isValue = function (val) {
49          return (val !== _undefined) && (val !== null);
50         };
51
52         var validValue = function (value) {
53                 if (!isValue(value)) throw new TypeError("Cannot use null or undefined");
54                 return value;
55         };
56
57         var clear = function () {
58                 validValue(this).length = 0;
59                 return this;
60         };
61
62         var isImplemented$1 = function () {
63                 var numberIsNaN = Number.isNaN;
64                 if (typeof numberIsNaN !== "function") return false;
65                 return !numberIsNaN({}) && numberIsNaN(NaN) && !numberIsNaN(34);
66         };
67
68         var shim = function (value) {
69                 // eslint-disable-next-line no-self-compare
70                 return value !== value;
71         };
72
73         var isNan = isImplemented$1()
74                 ? Number.isNaN
75                 : shim;
76
77         var isImplemented$2 = function () {
78                 var sign = Math.sign;
79                 if (typeof sign !== "function") return false;
80                 return (sign(10) === 1) && (sign(-20) === -1);
81         };
82
83         var shim$1 = function (value) {
84                 value = Number(value);
85                 if (isNaN(value) || (value === 0)) return value;
86                 return value > 0 ? 1 : -1;
87         };
88
89         var sign = isImplemented$2()
90                 ? Math.sign
91                 : shim$1;
92
93         var abs = Math.abs, floor = Math.floor;
94
95         var toInteger = function (value) {
96                 if (isNaN(value)) return 0;
97                 value = Number(value);
98                 if ((value === 0) || !isFinite(value)) return value;
99                 return sign(value) * floor(abs(value));
100         };
101
102         var max = Math.max;
103
104         var toPosInteger = function (value) {
105          return max(0, toInteger(value));
106         };
107
108         var indexOf           = Array.prototype.indexOf
109           , objHasOwnProperty = Object.prototype.hasOwnProperty
110           , abs$1               = Math.abs
111           , floor$1             = Math.floor;
112
113         var eIndexOf = function (searchElement /*, fromIndex*/) {
114                 var i, length, fromIndex, val;
115                 if (!isNan(searchElement)) return indexOf.apply(this, arguments);
116
117                 length = toPosInteger(validValue(this).length);
118                 fromIndex = arguments[1];
119                 if (isNaN(fromIndex)) fromIndex = 0;
120                 else if (fromIndex >= 0) fromIndex = floor$1(fromIndex);
121                 else fromIndex = toPosInteger(this.length) - floor$1(abs$1(fromIndex));
122
123                 for (i = fromIndex; i < length; ++i) {
124                         if (objHasOwnProperty.call(this, i)) {
125                                 val = this[i];
126                                 if (isNan(val)) return i; // Jslint: ignore
127                         }
128                 }
129                 return -1;
130         };
131
132         var create = Object.create, getPrototypeOf = Object.getPrototypeOf, plainObject = {};
133
134         var isImplemented$3 = function (/* CustomCreate*/) {
135                 var setPrototypeOf = Object.setPrototypeOf, customCreate = arguments[0] || create;
136                 if (typeof setPrototypeOf !== "function") return false;
137                 return getPrototypeOf(setPrototypeOf(customCreate(null), plainObject)) === plainObject;
138         };
139
140         var map = { function: true, object: true };
141
142         var isObject = function (value) {
143                 return (isValue(value) && map[typeof value]) || false;
144         };
145
146         var create$1 = Object.create, shim$2;
147
148         if (!isImplemented$3()) {
149                 shim$2 = shim$3;
150         }
151
152         var create_1 = (function () {
153                 var nullObject, polyProps, desc;
154                 if (!shim$2) return create$1;
155                 if (shim$2.level !== 1) return create$1;
156
157                 nullObject = {};
158                 polyProps = {};
159                 desc = {
160                         configurable: false,
161                         enumerable: false,
162                         writable: true,
163                         value: undefined
164                 };
165                 Object.getOwnPropertyNames(Object.prototype).forEach(function (name) {
166                         if (name === "__proto__") {
167                                 polyProps[name] = {
168                                         configurable: true,
169                                         enumerable: false,
170                                         writable: true,
171                                         value: undefined
172                                 };
173                                 return;
174                         }
175                         polyProps[name] = desc;
176                 });
177                 Object.defineProperties(nullObject, polyProps);
178
179                 Object.defineProperty(shim$2, "nullPolyfill", {
180                         configurable: false,
181                         enumerable: false,
182                         writable: false,
183                         value: nullObject
184                 });
185
186                 return function (prototype, props) {
187                         return create$1(prototype === null ? nullObject : prototype, props);
188                 };
189         }());
190
191         var objIsPrototypeOf = Object.prototype.isPrototypeOf
192           , defineProperty  = Object.defineProperty
193           , nullDesc        = {
194                 configurable: true,
195                 enumerable: false,
196                 writable: true,
197                 value: undefined
198         }
199           , validate;
200
201         validate = function (obj, prototype) {
202                 validValue(obj);
203                 if (prototype === null || isObject(prototype)) return obj;
204                 throw new TypeError("Prototype must be null or an object");
205         };
206
207         var shim$3 = (function (status) {
208                 var fn, set;
209                 if (!status) return null;
210                 if (status.level === 2) {
211                         if (status.set) {
212                                 set = status.set;
213                                 fn = function (obj, prototype) {
214                                         set.call(validate(obj, prototype), prototype);
215                                         return obj;
216                                 };
217                         } else {
218                                 fn = function (obj, prototype) {
219                                         validate(obj, prototype).__proto__ = prototype;
220                                         return obj;
221                                 };
222                         }
223                 } else {
224                         fn = function self(obj, prototype) {
225                                 var isNullBase;
226                                 validate(obj, prototype);
227                                 isNullBase = objIsPrototypeOf.call(self.nullPolyfill, obj);
228                                 if (isNullBase) delete self.nullPolyfill.__proto__;
229                                 if (prototype === null) prototype = self.nullPolyfill;
230                                 obj.__proto__ = prototype;
231                                 if (isNullBase) defineProperty(self.nullPolyfill, "__proto__", nullDesc);
232                                 return obj;
233                         };
234                 }
235                 return Object.defineProperty(fn, "level", {
236                         configurable: false,
237                         enumerable: false,
238                         writable: false,
239                         value: status.level
240                 });
241         }(
242                 (function () {
243                         var tmpObj1 = Object.create(null)
244                           , tmpObj2 = {}
245                           , set
246                           , desc = Object.getOwnPropertyDescriptor(Object.prototype, "__proto__");
247
248                         if (desc) {
249                                 try {
250                                         set = desc.set; // Opera crashes at this point
251                                         set.call(tmpObj1, tmpObj2);
252                                 } catch (ignore) {}
253                                 if (Object.getPrototypeOf(tmpObj1) === tmpObj2) return { set: set, level: 2 };
254                         }
255
256                         tmpObj1.__proto__ = tmpObj2;
257                         if (Object.getPrototypeOf(tmpObj1) === tmpObj2) return { level: 2 };
258
259                         tmpObj1 = {};
260                         tmpObj1.__proto__ = tmpObj2;
261                         if (Object.getPrototypeOf(tmpObj1) === tmpObj2) return { level: 1 };
262
263                         return false;
264                 })()
265         ));
266
267         var setPrototypeOf = isImplemented$3()
268                 ? Object.setPrototypeOf
269                 : shim$3;
270
271         var validCallable = function (fn) {
272                 if (typeof fn !== "function") throw new TypeError(fn + " is not a function");
273                 return fn;
274         };
275
276         var isImplemented$4 = function () {
277                 var assign = Object.assign, obj;
278                 if (typeof assign !== "function") return false;
279                 obj = { foo: "raz" };
280                 assign(obj, { bar: "dwa" }, { trzy: "trzy" });
281                 return (obj.foo + obj.bar + obj.trzy) === "razdwatrzy";
282         };
283
284         var isImplemented$5 = function () {
285                 try {
286                         Object.keys("primitive");
287                         return true;
288                 } catch (e) {
289                         return false;
290                 }
291         };
292
293         var keys = Object.keys;
294
295         var shim$4 = function (object) { return keys(isValue(object) ? Object(object) : object); };
296
297         var keys$1 = isImplemented$5() ? Object.keys : shim$4;
298
299         var max$1   = Math.max;
300
301         var shim$5 = function (dest, src /*, …srcn*/) {
302                 var error, i, length = max$1(arguments.length, 2), assign;
303                 dest = Object(validValue(dest));
304                 assign = function (key) {
305                         try {
306                                 dest[key] = src[key];
307                         } catch (e) {
308                                 if (!error) error = e;
309                         }
310                 };
311                 for (i = 1; i < length; ++i) {
312                         src = arguments[i];
313                         keys$1(src).forEach(assign);
314                 }
315                 if (error !== undefined) throw error;
316                 return dest;
317         };
318
319         var assign = isImplemented$4()
320                 ? Object.assign
321                 : shim$5;
322
323         var forEach = Array.prototype.forEach, create$2 = Object.create;
324
325         var process$1 = function (src, obj) {
326                 var key;
327                 for (key in src) obj[key] = src[key];
328         };
329
330         // eslint-disable-next-line no-unused-vars
331         var normalizeOptions = function (opts1 /*, …options*/) {
332                 var result = create$2(null);
333                 forEach.call(arguments, function (options) {
334                         if (!isValue(options)) return;
335                         process$1(Object(options), result);
336                 });
337                 return result;
338         };
339
340         // Deprecated
341
342         var isCallable = function (obj) {
343          return typeof obj === "function";
344         };
345
346         var str = "razdwatrzy";
347
348         var isImplemented$6 = function () {
349                 if (typeof str.contains !== "function") return false;
350                 return (str.contains("dwa") === true) && (str.contains("foo") === false);
351         };
352
353         var indexOf$1 = String.prototype.indexOf;
354
355         var shim$6 = function (searchString/*, position*/) {
356                 return indexOf$1.call(this, searchString, arguments[1]) > -1;
357         };
358
359         var contains = isImplemented$6()
360                 ? String.prototype.contains
361                 : shim$6;
362
363         var d_1 = createCommonjsModule(function (module) {
364
365         var d;
366
367         d = module.exports = function (dscr, value/*, options*/) {
368                 var c, e, w, options, desc;
369                 if ((arguments.length < 2) || (typeof dscr !== 'string')) {
370                         options = value;
371                         value = dscr;
372                         dscr = null;
373                 } else {
374                         options = arguments[2];
375                 }
376                 if (dscr == null) {
377                         c = w = true;
378                         e = false;
379                 } else {
380                         c = contains.call(dscr, 'c');
381                         e = contains.call(dscr, 'e');
382                         w = contains.call(dscr, 'w');
383                 }
384
385                 desc = { value: value, configurable: c, enumerable: e, writable: w };
386                 return !options ? desc : assign(normalizeOptions(options), desc);
387         };
388
389         d.gs = function (dscr, get, set/*, options*/) {
390                 var c, e, options, desc;
391                 if (typeof dscr !== 'string') {
392                         options = set;
393                         set = get;
394                         get = dscr;
395                         dscr = null;
396                 } else {
397                         options = arguments[3];
398                 }
399                 if (get == null) {
400                         get = undefined;
401                 } else if (!isCallable(get)) {
402                         options = get;
403                         get = set = undefined;
404                 } else if (set == null) {
405                         set = undefined;
406                 } else if (!isCallable(set)) {
407                         options = set;
408                         set = undefined;
409                 }
410                 if (dscr == null) {
411                         c = true;
412                         e = false;
413                 } else {
414                         c = contains.call(dscr, 'c');
415                         e = contains.call(dscr, 'e');
416                 }
417
418                 desc = { get: get, set: set, configurable: c, enumerable: e };
419                 return !options ? desc : assign(normalizeOptions(options), desc);
420         };
421         });
422
423         var eventEmitter = createCommonjsModule(function (module, exports) {
424
425         var apply = Function.prototype.apply, call = Function.prototype.call
426           , create = Object.create, defineProperty = Object.defineProperty
427           , defineProperties = Object.defineProperties
428           , hasOwnProperty = Object.prototype.hasOwnProperty
429           , descriptor = { configurable: true, enumerable: false, writable: true }
430
431           , on, once, off, emit, methods, descriptors, base;
432
433         on = function (type, listener) {
434                 var data;
435
436                 validCallable(listener);
437
438                 if (!hasOwnProperty.call(this, '__ee__')) {
439                         data = descriptor.value = create(null);
440                         defineProperty(this, '__ee__', descriptor);
441                         descriptor.value = null;
442                 } else {
443                         data = this.__ee__;
444                 }
445                 if (!data[type]) data[type] = listener;
446                 else if (typeof data[type] === 'object') data[type].push(listener);
447                 else data[type] = [data[type], listener];
448
449                 return this;
450         };
451
452         once = function (type, listener) {
453                 var once, self;
454
455                 validCallable(listener);
456                 self = this;
457                 on.call(this, type, once = function () {
458                         off.call(self, type, once);
459                         apply.call(listener, this, arguments);
460                 });
461
462                 once.__eeOnceListener__ = listener;
463                 return this;
464         };
465
466         off = function (type, listener) {
467                 var data, listeners, candidate, i;
468
469                 validCallable(listener);
470
471                 if (!hasOwnProperty.call(this, '__ee__')) return this;
472                 data = this.__ee__;
473                 if (!data[type]) return this;
474                 listeners = data[type];
475
476                 if (typeof listeners === 'object') {
477                         for (i = 0; (candidate = listeners[i]); ++i) {
478                                 if ((candidate === listener) ||
479                                                 (candidate.__eeOnceListener__ === listener)) {
480                                         if (listeners.length === 2) data[type] = listeners[i ? 0 : 1];
481                                         else listeners.splice(i, 1);
482                                 }
483                         }
484                 } else {
485                         if ((listeners === listener) ||
486                                         (listeners.__eeOnceListener__ === listener)) {
487                                 delete data[type];
488                         }
489                 }
490
491                 return this;
492         };
493
494         emit = function (type) {
495                 var i, l, listener, listeners, args;
496
497                 if (!hasOwnProperty.call(this, '__ee__')) return;
498                 listeners = this.__ee__[type];
499                 if (!listeners) return;
500
501                 if (typeof listeners === 'object') {
502                         l = arguments.length;
503                         args = new Array(l - 1);
504                         for (i = 1; i < l; ++i) args[i - 1] = arguments[i];
505
506                         listeners = listeners.slice();
507                         for (i = 0; (listener = listeners[i]); ++i) {
508                                 apply.call(listener, this, args);
509                         }
510                 } else {
511                         switch (arguments.length) {
512                         case 1:
513                                 call.call(listeners, this);
514                                 break;
515                         case 2:
516                                 call.call(listeners, this, arguments[1]);
517                                 break;
518                         case 3:
519                                 call.call(listeners, this, arguments[1], arguments[2]);
520                                 break;
521                         default:
522                                 l = arguments.length;
523                                 args = new Array(l - 1);
524                                 for (i = 1; i < l; ++i) {
525                                         args[i - 1] = arguments[i];
526                                 }
527                                 apply.call(listeners, this, args);
528                         }
529                 }
530         };
531
532         methods = {
533                 on: on,
534                 once: once,
535                 off: off,
536                 emit: emit
537         };
538
539         descriptors = {
540                 on: d_1(on),
541                 once: d_1(once),
542                 off: d_1(off),
543                 emit: d_1(emit)
544         };
545
546         base = defineProperties({}, descriptors);
547
548         module.exports = exports = function (o) {
549                 return (o == null) ? create(base) : defineProperties(Object(o), descriptors);
550         };
551         exports.methods = methods;
552         });
553         var eventEmitter_1 = eventEmitter.methods;
554
555         var validTypes = { object: true, symbol: true };
556
557         var isImplemented$7 = function () {
558                 var symbol;
559                 if (typeof Symbol !== 'function') return false;
560                 symbol = Symbol('test symbol');
561                 try { String(symbol); } catch (e) { return false; }
562
563                 // Return 'true' also for polyfills
564                 if (!validTypes[typeof Symbol.iterator]) return false;
565                 if (!validTypes[typeof Symbol.toPrimitive]) return false;
566                 if (!validTypes[typeof Symbol.toStringTag]) return false;
567
568                 return true;
569         };
570
571         var isSymbol = function (x) {
572                 if (!x) return false;
573                 if (typeof x === 'symbol') return true;
574                 if (!x.constructor) return false;
575                 if (x.constructor.name !== 'Symbol') return false;
576                 return (x[x.constructor.toStringTag] === 'Symbol');
577         };
578
579         var validateSymbol = function (value) {
580                 if (!isSymbol(value)) throw new TypeError(value + " is not a symbol");
581                 return value;
582         };
583
584         var create$3 = Object.create, defineProperties = Object.defineProperties
585           , defineProperty$1 = Object.defineProperty, objPrototype = Object.prototype
586           , NativeSymbol, SymbolPolyfill, HiddenSymbol, globalSymbols = create$3(null)
587           , isNativeSafe;
588
589         if (typeof Symbol === 'function') {
590                 NativeSymbol = Symbol;
591                 try {
592                         String(NativeSymbol());
593                         isNativeSafe = true;
594                 } catch (ignore) {}
595         }
596
597         var generateName = (function () {
598                 var created = create$3(null);
599                 return function (desc) {
600                         var postfix = 0, name, ie11BugWorkaround;
601                         while (created[desc + (postfix || '')]) ++postfix;
602                         desc += (postfix || '');
603                         created[desc] = true;
604                         name = '@@' + desc;
605                         defineProperty$1(objPrototype, name, d_1.gs(null, function (value) {
606                                 // For IE11 issue see:
607                                 // https://connect.microsoft.com/IE/feedbackdetail/view/1928508/
608                                 //    ie11-broken-getters-on-dom-objects
609                                 // https://github.com/medikoo/es6-symbol/issues/12
610                                 if (ie11BugWorkaround) return;
611                                 ie11BugWorkaround = true;
612                                 defineProperty$1(this, name, d_1(value));
613                                 ie11BugWorkaround = false;
614                         }));
615                         return name;
616                 };
617         }());
618
619         // Internal constructor (not one exposed) for creating Symbol instances.
620         // This one is used to ensure that `someSymbol instanceof Symbol` always return false
621         HiddenSymbol = function Symbol(description) {
622                 if (this instanceof HiddenSymbol) throw new TypeError('Symbol is not a constructor');
623                 return SymbolPolyfill(description);
624         };
625
626         // Exposed `Symbol` constructor
627         // (returns instances of HiddenSymbol)
628         var polyfill = SymbolPolyfill = function Symbol(description) {
629                 var symbol;
630                 if (this instanceof Symbol) throw new TypeError('Symbol is not a constructor');
631                 if (isNativeSafe) return NativeSymbol(description);
632                 symbol = create$3(HiddenSymbol.prototype);
633                 description = (description === undefined ? '' : String(description));
634                 return defineProperties(symbol, {
635                         __description__: d_1('', description),
636                         __name__: d_1('', generateName(description))
637                 });
638         };
639         defineProperties(SymbolPolyfill, {
640                 for: d_1(function (key) {
641                         if (globalSymbols[key]) return globalSymbols[key];
642                         return (globalSymbols[key] = SymbolPolyfill(String(key)));
643                 }),
644                 keyFor: d_1(function (s) {
645                         var key;
646                         validateSymbol(s);
647                         for (key in globalSymbols) if (globalSymbols[key] === s) return key;
648                 }),
649
650                 // To ensure proper interoperability with other native functions (e.g. Array.from)
651                 // fallback to eventual native implementation of given symbol
652                 hasInstance: d_1('', (NativeSymbol && NativeSymbol.hasInstance) || SymbolPolyfill('hasInstance')),
653                 isConcatSpreadable: d_1('', (NativeSymbol && NativeSymbol.isConcatSpreadable) ||
654                         SymbolPolyfill('isConcatSpreadable')),
655                 iterator: d_1('', (NativeSymbol && NativeSymbol.iterator) || SymbolPolyfill('iterator')),
656                 match: d_1('', (NativeSymbol && NativeSymbol.match) || SymbolPolyfill('match')),
657                 replace: d_1('', (NativeSymbol && NativeSymbol.replace) || SymbolPolyfill('replace')),
658                 search: d_1('', (NativeSymbol && NativeSymbol.search) || SymbolPolyfill('search')),
659                 species: d_1('', (NativeSymbol && NativeSymbol.species) || SymbolPolyfill('species')),
660                 split: d_1('', (NativeSymbol && NativeSymbol.split) || SymbolPolyfill('split')),
661                 toPrimitive: d_1('', (NativeSymbol && NativeSymbol.toPrimitive) || SymbolPolyfill('toPrimitive')),
662                 toStringTag: d_1('', (NativeSymbol && NativeSymbol.toStringTag) || SymbolPolyfill('toStringTag')),
663                 unscopables: d_1('', (NativeSymbol && NativeSymbol.unscopables) || SymbolPolyfill('unscopables'))
664         });
665
666         // Internal tweaks for real symbol producer
667         defineProperties(HiddenSymbol.prototype, {
668                 constructor: d_1(SymbolPolyfill),
669                 toString: d_1('', function () { return this.__name__; })
670         });
671
672         // Proper implementation of methods exposed on Symbol.prototype
673         // They won't be accessible on produced symbol instances as they derive from HiddenSymbol.prototype
674         defineProperties(SymbolPolyfill.prototype, {
675                 toString: d_1(function () { return 'Symbol (' + validateSymbol(this).__description__ + ')'; }),
676                 valueOf: d_1(function () { return validateSymbol(this); })
677         });
678         defineProperty$1(SymbolPolyfill.prototype, SymbolPolyfill.toPrimitive, d_1('', function () {
679                 var symbol = validateSymbol(this);
680                 if (typeof symbol === 'symbol') return symbol;
681                 return symbol.toString();
682         }));
683         defineProperty$1(SymbolPolyfill.prototype, SymbolPolyfill.toStringTag, d_1('c', 'Symbol'));
684
685         // Proper implementaton of toPrimitive and toStringTag for returned symbol instances
686         defineProperty$1(HiddenSymbol.prototype, SymbolPolyfill.toStringTag,
687                 d_1('c', SymbolPolyfill.prototype[SymbolPolyfill.toStringTag]));
688
689         // Note: It's important to define `toPrimitive` as last one, as some implementations
690         // implement `toPrimitive` natively without implementing `toStringTag` (or other specified symbols)
691         // And that may invoke error in definition flow:
692         // See: https://github.com/medikoo/es6-symbol/issues/13#issuecomment-164146149
693         defineProperty$1(HiddenSymbol.prototype, SymbolPolyfill.toPrimitive,
694                 d_1('c', SymbolPolyfill.prototype[SymbolPolyfill.toPrimitive]));
695
696         var es6Symbol = isImplemented$7() ? Symbol : polyfill;
697
698         var objToString = Object.prototype.toString
699           , id = objToString.call(
700                 (function () {
701                         return arguments;
702                 })()
703         );
704
705         var isArguments = function (value) {
706                 return objToString.call(value) === id;
707         };
708
709         var objToString$1 = Object.prototype.toString, id$1 = objToString$1.call("");
710
711         var isString = function (value) {
712                 return (
713                         typeof value === "string" ||
714                         (value &&
715                                 typeof value === "object" &&
716                                 (value instanceof String || objToString$1.call(value) === id$1)) ||
717                         false
718                 );
719         };
720
721         var iteratorSymbol = es6Symbol.iterator
722           , isArray        = Array.isArray;
723
724         var isIterable = function (value) {
725                 if (!isValue(value)) return false;
726                 if (isArray(value)) return true;
727                 if (isString(value)) return true;
728                 if (isArguments(value)) return true;
729                 return typeof value[iteratorSymbol] === "function";
730         };
731
732         var validIterable = function (value) {
733                 if (!isIterable(value)) throw new TypeError(value + " is not iterable");
734                 return value;
735         };
736
737         var isImplemented$8 = function () {
738                 var from = Array.from, arr, result;
739                 if (typeof from !== "function") return false;
740                 arr = ["raz", "dwa"];
741                 result = from(arr);
742                 return Boolean(result && (result !== arr) && (result[1] === "dwa"));
743         };
744
745         var objToString$2 = Object.prototype.toString, id$2 = objToString$2.call(noop);
746
747         var isFunction = function (value) {
748                 return typeof value === "function" && objToString$2.call(value) === id$2;
749         };
750
751         var iteratorSymbol$1 = es6Symbol.iterator
752           , isArray$1        = Array.isArray
753           , call           = Function.prototype.call
754           , desc           = { configurable: true, enumerable: true, writable: true, value: null }
755           , defineProperty$2 = Object.defineProperty;
756
757         // eslint-disable-next-line complexity, max-lines-per-function
758         var shim$7 = function (arrayLike /*, mapFn, thisArg*/) {
759                 var mapFn = arguments[1]
760                   , thisArg = arguments[2]
761                   , Context
762                   , i
763                   , j
764                   , arr
765                   , length
766                   , code
767                   , iterator
768                   , result
769                   , getIterator
770                   , value;
771
772                 arrayLike = Object(validValue(arrayLike));
773
774                 if (isValue(mapFn)) validCallable(mapFn);
775                 if (!this || this === Array || !isFunction(this)) {
776                         // Result: Plain array
777                         if (!mapFn) {
778                                 if (isArguments(arrayLike)) {
779                                         // Source: Arguments
780                                         length = arrayLike.length;
781                                         if (length !== 1) return Array.apply(null, arrayLike);
782                                         arr = new Array(1);
783                                         arr[0] = arrayLike[0];
784                                         return arr;
785                                 }
786                                 if (isArray$1(arrayLike)) {
787                                         // Source: Array
788                                         arr = new Array(length = arrayLike.length);
789                                         for (i = 0; i < length; ++i) arr[i] = arrayLike[i];
790                                         return arr;
791                                 }
792                         }
793                         arr = [];
794                 } else {
795                         // Result: Non plain array
796                         Context = this;
797                 }
798
799                 if (!isArray$1(arrayLike)) {
800                         if ((getIterator = arrayLike[iteratorSymbol$1]) !== undefined) {
801                                 // Source: Iterator
802                                 iterator = validCallable(getIterator).call(arrayLike);
803                                 if (Context) arr = new Context();
804                                 result = iterator.next();
805                                 i = 0;
806                                 while (!result.done) {
807                                         value = mapFn ? call.call(mapFn, thisArg, result.value, i) : result.value;
808                                         if (Context) {
809                                                 desc.value = value;
810                                                 defineProperty$2(arr, i, desc);
811                                         } else {
812                                                 arr[i] = value;
813                                         }
814                                         result = iterator.next();
815                                         ++i;
816                                 }
817                                 length = i;
818                         } else if (isString(arrayLike)) {
819                                 // Source: String
820                                 length = arrayLike.length;
821                                 if (Context) arr = new Context();
822                                 for (i = 0, j = 0; i < length; ++i) {
823                                         value = arrayLike[i];
824                                         if (i + 1 < length) {
825                                                 code = value.charCodeAt(0);
826                                                 // eslint-disable-next-line max-depth
827                                                 if (code >= 0xd800 && code <= 0xdbff) value += arrayLike[++i];
828                                         }
829                                         value = mapFn ? call.call(mapFn, thisArg, value, j) : value;
830                                         if (Context) {
831                                                 desc.value = value;
832                                                 defineProperty$2(arr, j, desc);
833                                         } else {
834                                                 arr[j] = value;
835                                         }
836                                         ++j;
837                                 }
838                                 length = j;
839                         }
840                 }
841                 if (length === undefined) {
842                         // Source: array or array-like
843                         length = toPosInteger(arrayLike.length);
844                         if (Context) arr = new Context(length);
845                         for (i = 0; i < length; ++i) {
846                                 value = mapFn ? call.call(mapFn, thisArg, arrayLike[i], i) : arrayLike[i];
847                                 if (Context) {
848                                         desc.value = value;
849                                         defineProperty$2(arr, i, desc);
850                                 } else {
851                                         arr[i] = value;
852                                 }
853                         }
854                 }
855                 if (Context) {
856                         desc.value = null;
857                         arr.length = length;
858                 }
859                 return arr;
860         };
861
862         var from_1 = isImplemented$8()
863                 ? Array.from
864                 : shim$7;
865
866         var copy = function (obj/*, propertyNames, options*/) {
867                 var copy = Object(validValue(obj)), propertyNames = arguments[1], options = Object(arguments[2]);
868                 if (copy !== obj && !propertyNames) return copy;
869                 var result = {};
870                 if (propertyNames) {
871                         from_1(propertyNames, function (propertyName) {
872                                 if (options.ensure || propertyName in obj) result[propertyName] = obj[propertyName];
873                         });
874                 } else {
875                         assign(result, obj);
876                 }
877                 return result;
878         };
879
880         var bind                    = Function.prototype.bind
881           , call$1                    = Function.prototype.call
882           , keys$2                    = Object.keys
883           , objPropertyIsEnumerable = Object.prototype.propertyIsEnumerable;
884
885         var _iterate = function (method, defVal) {
886                 return function (obj, cb /*, thisArg, compareFn*/) {
887                         var list, thisArg = arguments[2], compareFn = arguments[3];
888                         obj = Object(validValue(obj));
889                         validCallable(cb);
890
891                         list = keys$2(obj);
892                         if (compareFn) {
893                                 list.sort(typeof compareFn === "function" ? bind.call(compareFn, obj) : undefined);
894                         }
895                         if (typeof method !== "function") method = list[method];
896                         return call$1.call(method, list, function (key, index) {
897                                 if (!objPropertyIsEnumerable.call(obj, key)) return defVal;
898                                 return call$1.call(cb, thisArg, obj[key], key, obj, index);
899                         });
900                 };
901         };
902
903         var forEach$1 = _iterate("forEach");
904
905         var call$2     = Function.prototype.call;
906
907         var map$1 = function (obj, cb /*, thisArg*/) {
908                 var result = {}, thisArg = arguments[2];
909                 validCallable(cb);
910                 forEach$1(obj, function (value, key, targetObj, index) {
911                         result[key] = call$2.call(cb, thisArg, value, key, targetObj, index);
912                 });
913                 return result;
914         };
915
916         var callable         = validCallable
917
918           , bind$1 = Function.prototype.bind, defineProperty$3 = Object.defineProperty
919           , hasOwnProperty = Object.prototype.hasOwnProperty
920           , define;
921
922         define = function (name, desc, options) {
923                 var value = validValue(desc) && callable(desc.value), dgs;
924                 dgs = copy(desc);
925                 delete dgs.writable;
926                 delete dgs.value;
927                 dgs.get = function () {
928                         if (!options.overwriteDefinition && hasOwnProperty.call(this, name)) return value;
929                         desc.value = bind$1.call(value, options.resolveContext ? options.resolveContext(this) : this);
930                         defineProperty$3(this, name, desc);
931                         return this[name];
932                 };
933                 return dgs;
934         };
935
936         var autoBind = function (props/*, options*/) {
937                 var options = normalizeOptions(arguments[1]);
938                 if (options.resolveContext != null) validCallable(options.resolveContext);
939                 return map$1(props, function (desc, name) { return define(name, desc, options); });
940         };
941
942         var defineProperty$4 = Object.defineProperty, defineProperties$1 = Object.defineProperties, Iterator;
943
944         var es6Iterator = Iterator = function (list, context) {
945                 if (!(this instanceof Iterator)) throw new TypeError("Constructor requires 'new'");
946                 defineProperties$1(this, {
947                         __list__: d_1("w", validValue(list)),
948                         __context__: d_1("w", context),
949                         __nextIndex__: d_1("w", 0)
950                 });
951                 if (!context) return;
952                 validCallable(context.on);
953                 context.on("_add", this._onAdd);
954                 context.on("_delete", this._onDelete);
955                 context.on("_clear", this._onClear);
956         };
957
958         // Internal %IteratorPrototype% doesn't expose its constructor
959         delete Iterator.prototype.constructor;
960
961         defineProperties$1(
962                 Iterator.prototype,
963                 assign(
964                         {
965                                 _next: d_1(function () {
966                                         var i;
967                                         if (!this.__list__) return undefined;
968                                         if (this.__redo__) {
969                                                 i = this.__redo__.shift();
970                                                 if (i !== undefined) return i;
971                                         }
972                                         if (this.__nextIndex__ < this.__list__.length) return this.__nextIndex__++;
973                                         this._unBind();
974                                         return undefined;
975                                 }),
976                                 next: d_1(function () {
977                                         return this._createResult(this._next());
978                                 }),
979                                 _createResult: d_1(function (i) {
980                                         if (i === undefined) return { done: true, value: undefined };
981                                         return { done: false, value: this._resolve(i) };
982                                 }),
983                                 _resolve: d_1(function (i) {
984                                         return this.__list__[i];
985                                 }),
986                                 _unBind: d_1(function () {
987                                         this.__list__ = null;
988                                         delete this.__redo__;
989                                         if (!this.__context__) return;
990                                         this.__context__.off("_add", this._onAdd);
991                                         this.__context__.off("_delete", this._onDelete);
992                                         this.__context__.off("_clear", this._onClear);
993                                         this.__context__ = null;
994                                 }),
995                                 toString: d_1(function () {
996                                         return "[object " + (this[es6Symbol.toStringTag] || "Object") + "]";
997                                 })
998                         },
999                         autoBind({
1000                                 _onAdd: d_1(function (index) {
1001                                         if (index >= this.__nextIndex__) return;
1002                                         ++this.__nextIndex__;
1003                                         if (!this.__redo__) {
1004                                                 defineProperty$4(this, "__redo__", d_1("c", [index]));
1005                                                 return;
1006                                         }
1007                                         this.__redo__.forEach(function (redo, i) {
1008                                                 if (redo >= index) this.__redo__[i] = ++redo;
1009                                         }, this);
1010                                         this.__redo__.push(index);
1011                                 }),
1012                                 _onDelete: d_1(function (index) {
1013                                         var i;
1014                                         if (index >= this.__nextIndex__) return;
1015                                         --this.__nextIndex__;
1016                                         if (!this.__redo__) return;
1017                                         i = this.__redo__.indexOf(index);
1018                                         if (i !== -1) this.__redo__.splice(i, 1);
1019                                         this.__redo__.forEach(function (redo, j) {
1020                                                 if (redo > index) this.__redo__[j] = --redo;
1021                                         }, this);
1022                                 }),
1023                                 _onClear: d_1(function () {
1024                                         if (this.__redo__) clear.call(this.__redo__);
1025                                         this.__nextIndex__ = 0;
1026                                 })
1027                         })
1028                 )
1029         );
1030
1031         defineProperty$4(
1032                 Iterator.prototype,
1033                 es6Symbol.iterator,
1034                 d_1(function () {
1035                         return this;
1036                 })
1037         );
1038
1039         var array = createCommonjsModule(function (module) {
1040
1041
1042
1043         var defineProperty = Object.defineProperty, ArrayIterator;
1044
1045         ArrayIterator = module.exports = function (arr, kind) {
1046                 if (!(this instanceof ArrayIterator)) throw new TypeError("Constructor requires 'new'");
1047                 es6Iterator.call(this, arr);
1048                 if (!kind) kind = "value";
1049                 else if (contains.call(kind, "key+value")) kind = "key+value";
1050                 else if (contains.call(kind, "key")) kind = "key";
1051                 else kind = "value";
1052                 defineProperty(this, "__kind__", d_1("", kind));
1053         };
1054         if (setPrototypeOf) setPrototypeOf(ArrayIterator, es6Iterator);
1055
1056         // Internal %ArrayIteratorPrototype% doesn't expose its constructor
1057         delete ArrayIterator.prototype.constructor;
1058
1059         ArrayIterator.prototype = Object.create(es6Iterator.prototype, {
1060                 _resolve: d_1(function (i) {
1061                         if (this.__kind__ === "value") return this.__list__[i];
1062                         if (this.__kind__ === "key+value") return [i, this.__list__[i]];
1063                         return i;
1064                 })
1065         });
1066         defineProperty(ArrayIterator.prototype, es6Symbol.toStringTag, d_1("c", "Array Iterator"));
1067         });
1068
1069         var string = createCommonjsModule(function (module) {
1070
1071
1072
1073         var defineProperty = Object.defineProperty, StringIterator;
1074
1075         StringIterator = module.exports = function (str) {
1076                 if (!(this instanceof StringIterator)) throw new TypeError("Constructor requires 'new'");
1077                 str = String(str);
1078                 es6Iterator.call(this, str);
1079                 defineProperty(this, "__length__", d_1("", str.length));
1080         };
1081         if (setPrototypeOf) setPrototypeOf(StringIterator, es6Iterator);
1082
1083         // Internal %ArrayIteratorPrototype% doesn't expose its constructor
1084         delete StringIterator.prototype.constructor;
1085
1086         StringIterator.prototype = Object.create(es6Iterator.prototype, {
1087                 _next: d_1(function () {
1088                         if (!this.__list__) return undefined;
1089                         if (this.__nextIndex__ < this.__length__) return this.__nextIndex__++;
1090                         this._unBind();
1091                         return undefined;
1092                 }),
1093                 _resolve: d_1(function (i) {
1094                         var char = this.__list__[i], code;
1095                         if (this.__nextIndex__ === this.__length__) return char;
1096                         code = char.charCodeAt(0);
1097                         if (code >= 0xd800 && code <= 0xdbff) return char + this.__list__[this.__nextIndex__++];
1098                         return char;
1099                 })
1100         });
1101         defineProperty(StringIterator.prototype, es6Symbol.toStringTag, d_1("c", "String Iterator"));
1102         });
1103
1104         var iteratorSymbol$2 = es6Symbol.iterator;
1105
1106         var get = function (obj) {
1107                 if (typeof validIterable(obj)[iteratorSymbol$2] === "function") return obj[iteratorSymbol$2]();
1108                 if (isArguments(obj)) return new array(obj);
1109                 if (isString(obj)) return new string(obj);
1110                 return new array(obj);
1111         };
1112
1113         var isArray$2 = Array.isArray, call$3 = Function.prototype.call, some = Array.prototype.some;
1114
1115         var forOf = function (iterable, cb /*, thisArg*/) {
1116                 var mode, thisArg = arguments[2], result, doBreak, broken, i, length, char, code;
1117                 if (isArray$2(iterable) || isArguments(iterable)) mode = "array";
1118                 else if (isString(iterable)) mode = "string";
1119                 else iterable = get(iterable);
1120
1121                 validCallable(cb);
1122                 doBreak = function () {
1123                         broken = true;
1124                 };
1125                 if (mode === "array") {
1126                         some.call(iterable, function (value) {
1127                                 call$3.call(cb, thisArg, value, doBreak);
1128                                 return broken;
1129                         });
1130                         return;
1131                 }
1132                 if (mode === "string") {
1133                         length = iterable.length;
1134                         for (i = 0; i < length; ++i) {
1135                                 char = iterable[i];
1136                                 if (i + 1 < length) {
1137                                         code = char.charCodeAt(0);
1138                                         if (code >= 0xd800 && code <= 0xdbff) char += iterable[++i];
1139                                 }
1140                                 call$3.call(cb, thisArg, char, doBreak);
1141                                 if (broken) break;
1142                         }
1143                         return;
1144                 }
1145                 result = iterable.next();
1146
1147                 while (!result.done) {
1148                         call$3.call(cb, thisArg, result.value, doBreak);
1149                         if (broken) return;
1150                         result = iterable.next();
1151                 }
1152         };
1153
1154         var iterator = createCommonjsModule(function (module) {
1155
1156         var toStringTagSymbol = es6Symbol.toStringTag
1157
1158           , defineProperty = Object.defineProperty
1159           , SetIterator;
1160
1161         SetIterator = module.exports = function (set, kind) {
1162                 if (!(this instanceof SetIterator)) return new SetIterator(set, kind);
1163                 es6Iterator.call(this, set.__setData__, set);
1164                 if (!kind) kind = 'value';
1165                 else if (contains.call(kind, 'key+value')) kind = 'key+value';
1166                 else kind = 'value';
1167                 defineProperty(this, '__kind__', d_1('', kind));
1168         };
1169         if (setPrototypeOf) setPrototypeOf(SetIterator, es6Iterator);
1170
1171         SetIterator.prototype = Object.create(es6Iterator.prototype, {
1172                 constructor: d_1(SetIterator),
1173                 _resolve: d_1(function (i) {
1174                         if (this.__kind__ === 'value') return this.__list__[i];
1175                         return [this.__list__[i], this.__list__[i]];
1176                 }),
1177                 toString: d_1(function () { return '[object Set Iterator]'; })
1178         });
1179         defineProperty(SetIterator.prototype, toStringTagSymbol, d_1('c', 'Set Iterator'));
1180         });
1181
1182         // Exports true if environment provides native `Set` implementation,
1183
1184         var isNativeImplemented = (function () {
1185                 if (typeof Set === 'undefined') return false;
1186                 return (Object.prototype.toString.call(Set.prototype) === '[object Set]');
1187         }());
1188
1189         var iterator$1       = validIterable
1190
1191           , call$4 = Function.prototype.call
1192           , defineProperty$5 = Object.defineProperty, getPrototypeOf$1 = Object.getPrototypeOf
1193           , SetPoly, getValues, NativeSet;
1194
1195         if (isNativeImplemented) NativeSet = Set;
1196
1197         var polyfill$1 = SetPoly = function Set(/*iterable*/) {
1198                 var iterable = arguments[0], self;
1199                 if (!(this instanceof SetPoly)) throw new TypeError('Constructor requires \'new\'');
1200                 if (isNativeImplemented && setPrototypeOf) self = setPrototypeOf(new NativeSet(), getPrototypeOf$1(this));
1201                 else self = this;
1202                 if (iterable != null) iterator$1(iterable);
1203                 defineProperty$5(self, '__setData__', d_1('c', []));
1204                 if (!iterable) return self;
1205                 forOf(iterable, function (value) {
1206                         if (eIndexOf.call(this, value) !== -1) return;
1207                         this.push(value);
1208                 }, self.__setData__);
1209                 return self;
1210         };
1211
1212         if (isNativeImplemented) {
1213                 if (setPrototypeOf) setPrototypeOf(SetPoly, NativeSet);
1214                 SetPoly.prototype = Object.create(NativeSet.prototype, { constructor: d_1(SetPoly) });
1215         }
1216
1217         eventEmitter(Object.defineProperties(SetPoly.prototype, {
1218                 add: d_1(function (value) {
1219                         if (this.has(value)) return this;
1220                         this.emit('_add', this.__setData__.push(value) - 1, value);
1221                         return this;
1222                 }),
1223                 clear: d_1(function () {
1224                         if (!this.__setData__.length) return;
1225                         clear.call(this.__setData__);
1226                         this.emit('_clear');
1227                 }),
1228                 delete: d_1(function (value) {
1229                         var index = eIndexOf.call(this.__setData__, value);
1230                         if (index === -1) return false;
1231                         this.__setData__.splice(index, 1);
1232                         this.emit('_delete', index, value);
1233                         return true;
1234                 }),
1235                 entries: d_1(function () { return new iterator(this, 'key+value'); }),
1236                 forEach: d_1(function (cb/*, thisArg*/) {
1237                         var thisArg = arguments[1], iterator, result, value;
1238                         validCallable(cb);
1239                         iterator = this.values();
1240                         result = iterator._next();
1241                         while (result !== undefined) {
1242                                 value = iterator._resolve(result);
1243                                 call$4.call(cb, thisArg, value, value, this);
1244                                 result = iterator._next();
1245                         }
1246                 }),
1247                 has: d_1(function (value) {
1248                         return (eIndexOf.call(this.__setData__, value) !== -1);
1249                 }),
1250                 keys: d_1(getValues = function () { return this.values(); }),
1251                 size: d_1.gs(function () { return this.__setData__.length; }),
1252                 values: d_1(function () { return new iterator(this); }),
1253                 toString: d_1(function () { return '[object Set]'; })
1254         }));
1255         defineProperty$5(SetPoly.prototype, es6Symbol.iterator, d_1(getValues));
1256         defineProperty$5(SetPoly.prototype, es6Symbol.toStringTag, d_1('c', 'Set'));
1257
1258         var es6Set = isImplemented() ? Set : polyfill$1;
1259
1260         var isImplemented$9 = function () {
1261                 var map, iterator, result;
1262                 if (typeof Map !== 'function') return false;
1263                 try {
1264                         // WebKit doesn't support arguments and crashes
1265                         map = new Map([['raz', 'one'], ['dwa', 'two'], ['trzy', 'three']]);
1266                 } catch (e) {
1267                         return false;
1268                 }
1269                 if (String(map) !== '[object Map]') return false;
1270                 if (map.size !== 3) return false;
1271                 if (typeof map.clear !== 'function') return false;
1272                 if (typeof map.delete !== 'function') return false;
1273                 if (typeof map.entries !== 'function') return false;
1274                 if (typeof map.forEach !== 'function') return false;
1275                 if (typeof map.get !== 'function') return false;
1276                 if (typeof map.has !== 'function') return false;
1277                 if (typeof map.keys !== 'function') return false;
1278                 if (typeof map.set !== 'function') return false;
1279                 if (typeof map.values !== 'function') return false;
1280
1281                 iterator = map.entries();
1282                 result = iterator.next();
1283                 if (result.done !== false) return false;
1284                 if (!result.value) return false;
1285                 if (result.value[0] !== 'raz') return false;
1286                 if (result.value[1] !== 'one') return false;
1287
1288                 return true;
1289         };
1290
1291         var forEach$2 = Array.prototype.forEach, create$4 = Object.create;
1292
1293         // eslint-disable-next-line no-unused-vars
1294         var primitiveSet = function (arg /*, …args*/) {
1295                 var set = create$4(null);
1296                 forEach$2.call(arguments, function (name) {
1297                         set[name] = true;
1298                 });
1299                 return set;
1300         };
1301
1302         var iteratorKinds = primitiveSet('key',
1303                 'value', 'key+value');
1304
1305         var iterator$2 = createCommonjsModule(function (module) {
1306
1307         var toStringTagSymbol = es6Symbol.toStringTag
1308
1309           , defineProperties = Object.defineProperties
1310           , unBind = es6Iterator.prototype._unBind
1311           , MapIterator;
1312
1313         MapIterator = module.exports = function (map, kind) {
1314                 if (!(this instanceof MapIterator)) return new MapIterator(map, kind);
1315                 es6Iterator.call(this, map.__mapKeysData__, map);
1316                 if (!kind || !iteratorKinds[kind]) kind = 'key+value';
1317                 defineProperties(this, {
1318                         __kind__: d_1('', kind),
1319                         __values__: d_1('w', map.__mapValuesData__)
1320                 });
1321         };
1322         if (setPrototypeOf) setPrototypeOf(MapIterator, es6Iterator);
1323
1324         MapIterator.prototype = Object.create(es6Iterator.prototype, {
1325                 constructor: d_1(MapIterator),
1326                 _resolve: d_1(function (i) {
1327                         if (this.__kind__ === 'value') return this.__values__[i];
1328                         if (this.__kind__ === 'key') return this.__list__[i];
1329                         return [this.__list__[i], this.__values__[i]];
1330                 }),
1331                 _unBind: d_1(function () {
1332                         this.__values__ = null;
1333                         unBind.call(this);
1334                 }),
1335                 toString: d_1(function () { return '[object Map Iterator]'; })
1336         });
1337         Object.defineProperty(MapIterator.prototype, toStringTagSymbol,
1338                 d_1('c', 'Map Iterator'));
1339         });
1340
1341         // Exports true if environment provides native `Map` implementation,
1342
1343         var isNativeImplemented$1 = (function () {
1344                 if (typeof Map === 'undefined') return false;
1345                 return (Object.prototype.toString.call(new Map()) === '[object Map]');
1346         }());
1347
1348         var iterator$3       = validIterable
1349
1350           , call$5 = Function.prototype.call
1351           , defineProperties$2 = Object.defineProperties, getPrototypeOf$2 = Object.getPrototypeOf
1352           , MapPoly;
1353
1354         var polyfill$2 = MapPoly = function (/*iterable*/) {
1355                 var iterable = arguments[0], keys, values, self;
1356                 if (!(this instanceof MapPoly)) throw new TypeError('Constructor requires \'new\'');
1357                 if (isNativeImplemented$1 && setPrototypeOf && (Map !== MapPoly)) {
1358                         self = setPrototypeOf(new Map(), getPrototypeOf$2(this));
1359                 } else {
1360                         self = this;
1361                 }
1362                 if (iterable != null) iterator$3(iterable);
1363                 defineProperties$2(self, {
1364                         __mapKeysData__: d_1('c', keys = []),
1365                         __mapValuesData__: d_1('c', values = [])
1366                 });
1367                 if (!iterable) return self;
1368                 forOf(iterable, function (value) {
1369                         var key = validValue(value)[0];
1370                         value = value[1];
1371                         if (eIndexOf.call(keys, key) !== -1) return;
1372                         keys.push(key);
1373                         values.push(value);
1374                 }, self);
1375                 return self;
1376         };
1377
1378         if (isNativeImplemented$1) {
1379                 if (setPrototypeOf) setPrototypeOf(MapPoly, Map);
1380                 MapPoly.prototype = Object.create(Map.prototype, {
1381                         constructor: d_1(MapPoly)
1382                 });
1383         }
1384
1385         eventEmitter(defineProperties$2(MapPoly.prototype, {
1386                 clear: d_1(function () {
1387                         if (!this.__mapKeysData__.length) return;
1388                         clear.call(this.__mapKeysData__);
1389                         clear.call(this.__mapValuesData__);
1390                         this.emit('_clear');
1391                 }),
1392                 delete: d_1(function (key) {
1393                         var index = eIndexOf.call(this.__mapKeysData__, key);
1394                         if (index === -1) return false;
1395                         this.__mapKeysData__.splice(index, 1);
1396                         this.__mapValuesData__.splice(index, 1);
1397                         this.emit('_delete', index, key);
1398                         return true;
1399                 }),
1400                 entries: d_1(function () { return new iterator$2(this, 'key+value'); }),
1401                 forEach: d_1(function (cb/*, thisArg*/) {
1402                         var thisArg = arguments[1], iterator, result;
1403                         validCallable(cb);
1404                         iterator = this.entries();
1405                         result = iterator._next();
1406                         while (result !== undefined) {
1407                                 call$5.call(cb, thisArg, this.__mapValuesData__[result],
1408                                         this.__mapKeysData__[result], this);
1409                                 result = iterator._next();
1410                         }
1411                 }),
1412                 get: d_1(function (key) {
1413                         var index = eIndexOf.call(this.__mapKeysData__, key);
1414                         if (index === -1) return;
1415                         return this.__mapValuesData__[index];
1416                 }),
1417                 has: d_1(function (key) {
1418                         return (eIndexOf.call(this.__mapKeysData__, key) !== -1);
1419                 }),
1420                 keys: d_1(function () { return new iterator$2(this, 'key'); }),
1421                 set: d_1(function (key, value) {
1422                         var index = eIndexOf.call(this.__mapKeysData__, key), emit;
1423                         if (index === -1) {
1424                                 index = this.__mapKeysData__.push(key) - 1;
1425                                 emit = true;
1426                         }
1427                         this.__mapValuesData__[index] = value;
1428                         if (emit) this.emit('_add', index, key);
1429                         return this;
1430                 }),
1431                 size: d_1.gs(function () { return this.__mapKeysData__.length; }),
1432                 values: d_1(function () { return new iterator$2(this, 'value'); }),
1433                 toString: d_1(function () { return '[object Map]'; })
1434         }));
1435         Object.defineProperty(MapPoly.prototype, es6Symbol.iterator, d_1(function () {
1436                 return this.entries();
1437         }));
1438         Object.defineProperty(MapPoly.prototype, es6Symbol.toStringTag, d_1('c', 'Map'));
1439
1440         var es6Map = isImplemented$9() ? Map : polyfill$2;
1441
1442         var toStr = Object.prototype.toString;
1443
1444         var isArguments$1 = function isArguments(value) {
1445                 var str = toStr.call(value);
1446                 var isArgs = str === '[object Arguments]';
1447                 if (!isArgs) {
1448                         isArgs = str !== '[object Array]' &&
1449                                 value !== null &&
1450                                 typeof value === 'object' &&
1451                                 typeof value.length === 'number' &&
1452                                 value.length >= 0 &&
1453                                 toStr.call(value.callee) === '[object Function]';
1454                 }
1455                 return isArgs;
1456         };
1457
1458         var keysShim;
1459         if (!Object.keys) {
1460                 // modified from https://github.com/es-shims/es5-shim
1461                 var has = Object.prototype.hasOwnProperty;
1462                 var toStr$1 = Object.prototype.toString;
1463                 var isArgs = isArguments$1; // eslint-disable-line global-require
1464                 var isEnumerable = Object.prototype.propertyIsEnumerable;
1465                 var hasDontEnumBug = !isEnumerable.call({ toString: null }, 'toString');
1466                 var hasProtoEnumBug = isEnumerable.call(function () {}, 'prototype');
1467                 var dontEnums = [
1468                         'toString',
1469                         'toLocaleString',
1470                         'valueOf',
1471                         'hasOwnProperty',
1472                         'isPrototypeOf',
1473                         'propertyIsEnumerable',
1474                         'constructor'
1475                 ];
1476                 var equalsConstructorPrototype = function (o) {
1477                         var ctor = o.constructor;
1478                         return ctor && ctor.prototype === o;
1479                 };
1480                 var excludedKeys = {
1481                         $applicationCache: true,
1482                         $console: true,
1483                         $external: true,
1484                         $frame: true,
1485                         $frameElement: true,
1486                         $frames: true,
1487                         $innerHeight: true,
1488                         $innerWidth: true,
1489                         $outerHeight: true,
1490                         $outerWidth: true,
1491                         $pageXOffset: true,
1492                         $pageYOffset: true,
1493                         $parent: true,
1494                         $scrollLeft: true,
1495                         $scrollTop: true,
1496                         $scrollX: true,
1497                         $scrollY: true,
1498                         $self: true,
1499                         $webkitIndexedDB: true,
1500                         $webkitStorageInfo: true,
1501                         $window: true
1502                 };
1503                 var hasAutomationEqualityBug = (function () {
1504                         /* global window */
1505                         if (typeof window === 'undefined') { return false; }
1506                         for (var k in window) {
1507                                 try {
1508                                         if (!excludedKeys['$' + k] && has.call(window, k) && window[k] !== null && typeof window[k] === 'object') {
1509                                                 try {
1510                                                         equalsConstructorPrototype(window[k]);
1511                                                 } catch (e) {
1512                                                         return true;
1513                                                 }
1514                                         }
1515                                 } catch (e) {
1516                                         return true;
1517                                 }
1518                         }
1519                         return false;
1520                 }());
1521                 var equalsConstructorPrototypeIfNotBuggy = function (o) {
1522                         /* global window */
1523                         if (typeof window === 'undefined' || !hasAutomationEqualityBug) {
1524                                 return equalsConstructorPrototype(o);
1525                         }
1526                         try {
1527                                 return equalsConstructorPrototype(o);
1528                         } catch (e) {
1529                                 return false;
1530                         }
1531                 };
1532
1533                 keysShim = function keys(object) {
1534                         var isObject = object !== null && typeof object === 'object';
1535                         var isFunction = toStr$1.call(object) === '[object Function]';
1536                         var isArguments = isArgs(object);
1537                         var isString = isObject && toStr$1.call(object) === '[object String]';
1538                         var theKeys = [];
1539
1540                         if (!isObject && !isFunction && !isArguments) {
1541                                 throw new TypeError('Object.keys called on a non-object');
1542                         }
1543
1544                         var skipProto = hasProtoEnumBug && isFunction;
1545                         if (isString && object.length > 0 && !has.call(object, 0)) {
1546                                 for (var i = 0; i < object.length; ++i) {
1547                                         theKeys.push(String(i));
1548                                 }
1549                         }
1550
1551                         if (isArguments && object.length > 0) {
1552                                 for (var j = 0; j < object.length; ++j) {
1553                                         theKeys.push(String(j));
1554                                 }
1555                         } else {
1556                                 for (var name in object) {
1557                                         if (!(skipProto && name === 'prototype') && has.call(object, name)) {
1558                                                 theKeys.push(String(name));
1559                                         }
1560                                 }
1561                         }
1562
1563                         if (hasDontEnumBug) {
1564                                 var skipConstructor = equalsConstructorPrototypeIfNotBuggy(object);
1565
1566                                 for (var k = 0; k < dontEnums.length; ++k) {
1567                                         if (!(skipConstructor && dontEnums[k] === 'constructor') && has.call(object, dontEnums[k])) {
1568                                                 theKeys.push(dontEnums[k]);
1569                                         }
1570                                 }
1571                         }
1572                         return theKeys;
1573                 };
1574         }
1575         var implementation = keysShim;
1576
1577         var slice = Array.prototype.slice;
1578
1579
1580         var origKeys = Object.keys;
1581         var keysShim$1 = origKeys ? function keys(o) { return origKeys(o); } : implementation;
1582
1583         var originalKeys = Object.keys;
1584
1585         keysShim$1.shim = function shimObjectKeys() {
1586                 if (Object.keys) {
1587                         var keysWorksWithArguments = (function () {
1588                                 // Safari 5.0 bug
1589                                 var args = Object.keys(arguments);
1590                                 return args && args.length === arguments.length;
1591                         }(1, 2));
1592                         if (!keysWorksWithArguments) {
1593                                 Object.keys = function keys(object) { // eslint-disable-line func-name-matching
1594                                         if (isArguments$1(object)) {
1595                                                 return originalKeys(slice.call(object));
1596                                         }
1597                                         return originalKeys(object);
1598                                 };
1599                         }
1600                 } else {
1601                         Object.keys = keysShim$1;
1602                 }
1603                 return Object.keys || keysShim$1;
1604         };
1605
1606         var objectKeys = keysShim$1;
1607
1608         var hasSymbols = typeof Symbol === 'function' && typeof Symbol('foo') === 'symbol';
1609
1610         var toStr$2 = Object.prototype.toString;
1611         var concat = Array.prototype.concat;
1612         var origDefineProperty = Object.defineProperty;
1613
1614         var isFunction$1 = function (fn) {
1615                 return typeof fn === 'function' && toStr$2.call(fn) === '[object Function]';
1616         };
1617
1618         var arePropertyDescriptorsSupported = function () {
1619                 var obj = {};
1620                 try {
1621                         origDefineProperty(obj, 'x', { enumerable: false, value: obj });
1622                         // eslint-disable-next-line no-unused-vars, no-restricted-syntax
1623                         for (var _ in obj) { // jscs:ignore disallowUnusedVariables
1624                                 return false;
1625                         }
1626                         return obj.x === obj;
1627                 } catch (e) { /* this is IE 8. */
1628                         return false;
1629                 }
1630         };
1631         var supportsDescriptors = origDefineProperty && arePropertyDescriptorsSupported();
1632
1633         var defineProperty$6 = function (object, name, value, predicate) {
1634                 if (name in object && (!isFunction$1(predicate) || !predicate())) {
1635                         return;
1636                 }
1637                 if (supportsDescriptors) {
1638                         origDefineProperty(object, name, {
1639                                 configurable: true,
1640                                 enumerable: false,
1641                                 value: value,
1642                                 writable: true
1643                         });
1644                 } else {
1645                         object[name] = value;
1646                 }
1647         };
1648
1649         var defineProperties$3 = function (object, map) {
1650                 var predicates = arguments.length > 2 ? arguments[2] : {};
1651                 var props = objectKeys(map);
1652                 if (hasSymbols) {
1653                         props = concat.call(props, Object.getOwnPropertySymbols(map));
1654                 }
1655                 for (var i = 0; i < props.length; i += 1) {
1656                         defineProperty$6(object, props[i], map[props[i]], predicates[props[i]]);
1657                 }
1658         };
1659
1660         defineProperties$3.supportsDescriptors = !!supportsDescriptors;
1661
1662         var defineProperties_1 = defineProperties$3;
1663
1664         /* eslint no-invalid-this: 1 */
1665
1666         var ERROR_MESSAGE = 'Function.prototype.bind called on incompatible ';
1667         var slice$1 = Array.prototype.slice;
1668         var toStr$3 = Object.prototype.toString;
1669         var funcType = '[object Function]';
1670
1671         var implementation$1 = function bind(that) {
1672             var target = this;
1673             if (typeof target !== 'function' || toStr$3.call(target) !== funcType) {
1674                 throw new TypeError(ERROR_MESSAGE + target);
1675             }
1676             var args = slice$1.call(arguments, 1);
1677
1678             var bound;
1679             var binder = function () {
1680                 if (this instanceof bound) {
1681                     var result = target.apply(
1682                         this,
1683                         args.concat(slice$1.call(arguments))
1684                     );
1685                     if (Object(result) === result) {
1686                         return result;
1687                     }
1688                     return this;
1689                 } else {
1690                     return target.apply(
1691                         that,
1692                         args.concat(slice$1.call(arguments))
1693                     );
1694                 }
1695             };
1696
1697             var boundLength = Math.max(0, target.length - args.length);
1698             var boundArgs = [];
1699             for (var i = 0; i < boundLength; i++) {
1700                 boundArgs.push('$' + i);
1701             }
1702
1703             bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this,arguments); }')(binder);
1704
1705             if (target.prototype) {
1706                 var Empty = function Empty() {};
1707                 Empty.prototype = target.prototype;
1708                 bound.prototype = new Empty();
1709                 Empty.prototype = null;
1710             }
1711
1712             return bound;
1713         };
1714
1715         var functionBind = Function.prototype.bind || implementation$1;
1716
1717         var src = functionBind.call(Function.call, Object.prototype.hasOwnProperty);
1718
1719         var isPrimitive = function isPrimitive(value) {
1720                 return value === null || (typeof value !== 'function' && typeof value !== 'object');
1721         };
1722
1723         var fnToStr = Function.prototype.toString;
1724
1725         var constructorRegex = /^\s*class\b/;
1726         var isES6ClassFn = function isES6ClassFunction(value) {
1727                 try {
1728                         var fnStr = fnToStr.call(value);
1729                         return constructorRegex.test(fnStr);
1730                 } catch (e) {
1731                         return false; // not a function
1732                 }
1733         };
1734
1735         var tryFunctionObject = function tryFunctionToStr(value) {
1736                 try {
1737                         if (isES6ClassFn(value)) { return false; }
1738                         fnToStr.call(value);
1739                         return true;
1740                 } catch (e) {
1741                         return false;
1742                 }
1743         };
1744         var toStr$4 = Object.prototype.toString;
1745         var fnClass = '[object Function]';
1746         var genClass = '[object GeneratorFunction]';
1747         var hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';
1748
1749         var isCallable$1 = function isCallable(value) {
1750                 if (!value) { return false; }
1751                 if (typeof value !== 'function' && typeof value !== 'object') { return false; }
1752                 if (typeof value === 'function' && !value.prototype) { return true; }
1753                 if (hasToStringTag) { return tryFunctionObject(value); }
1754                 if (isES6ClassFn(value)) { return false; }
1755                 var strClass = toStr$4.call(value);
1756                 return strClass === fnClass || strClass === genClass;
1757         };
1758
1759         var getDay = Date.prototype.getDay;
1760         var tryDateObject = function tryDateObject(value) {
1761                 try {
1762                         getDay.call(value);
1763                         return true;
1764                 } catch (e) {
1765                         return false;
1766                 }
1767         };
1768
1769         var toStr$5 = Object.prototype.toString;
1770         var dateClass = '[object Date]';
1771         var hasToStringTag$1 = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';
1772
1773         var isDateObject = function isDateObject(value) {
1774                 if (typeof value !== 'object' || value === null) { return false; }
1775                 return hasToStringTag$1 ? tryDateObject(value) : toStr$5.call(value) === dateClass;
1776         };
1777
1778         /* eslint complexity: [2, 17], max-statements: [2, 33] */
1779         var shams = function hasSymbols() {
1780                 if (typeof Symbol !== 'function' || typeof Object.getOwnPropertySymbols !== 'function') { return false; }
1781                 if (typeof Symbol.iterator === 'symbol') { return true; }
1782
1783                 var obj = {};
1784                 var sym = Symbol('test');
1785                 var symObj = Object(sym);
1786                 if (typeof sym === 'string') { return false; }
1787
1788                 if (Object.prototype.toString.call(sym) !== '[object Symbol]') { return false; }
1789                 if (Object.prototype.toString.call(symObj) !== '[object Symbol]') { return false; }
1790
1791                 // temp disabled per https://github.com/ljharb/object.assign/issues/17
1792                 // if (sym instanceof Symbol) { return false; }
1793                 // temp disabled per https://github.com/WebReflection/get-own-property-symbols/issues/4
1794                 // if (!(symObj instanceof Symbol)) { return false; }
1795
1796                 // if (typeof Symbol.prototype.toString !== 'function') { return false; }
1797                 // if (String(sym) !== Symbol.prototype.toString.call(sym)) { return false; }
1798
1799                 var symVal = 42;
1800                 obj[sym] = symVal;
1801                 for (sym in obj) { return false; } // eslint-disable-line no-restricted-syntax
1802                 if (typeof Object.keys === 'function' && Object.keys(obj).length !== 0) { return false; }
1803
1804                 if (typeof Object.getOwnPropertyNames === 'function' && Object.getOwnPropertyNames(obj).length !== 0) { return false; }
1805
1806                 var syms = Object.getOwnPropertySymbols(obj);
1807                 if (syms.length !== 1 || syms[0] !== sym) { return false; }
1808
1809                 if (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { return false; }
1810
1811                 if (typeof Object.getOwnPropertyDescriptor === 'function') {
1812                         var descriptor = Object.getOwnPropertyDescriptor(obj, sym);
1813                         if (descriptor.value !== symVal || descriptor.enumerable !== true) { return false; }
1814                 }
1815
1816                 return true;
1817         };
1818
1819         var origSymbol = commonjsGlobal.Symbol;
1820
1821
1822         var hasSymbols$1 = function hasNativeSymbols() {
1823                 if (typeof origSymbol !== 'function') { return false; }
1824                 if (typeof Symbol !== 'function') { return false; }
1825                 if (typeof origSymbol('foo') !== 'symbol') { return false; }
1826                 if (typeof Symbol('bar') !== 'symbol') { return false; }
1827
1828                 return shams();
1829         };
1830
1831         var isSymbol$1 = createCommonjsModule(function (module) {
1832
1833         var toStr = Object.prototype.toString;
1834         var hasSymbols = hasSymbols$1();
1835
1836         if (hasSymbols) {
1837                 var symToStr = Symbol.prototype.toString;
1838                 var symStringRegex = /^Symbol\(.*\)$/;
1839                 var isSymbolObject = function isRealSymbolObject(value) {
1840                         if (typeof value.valueOf() !== 'symbol') {
1841                                 return false;
1842                         }
1843                         return symStringRegex.test(symToStr.call(value));
1844                 };
1845
1846                 module.exports = function isSymbol(value) {
1847                         if (typeof value === 'symbol') {
1848                                 return true;
1849                         }
1850                         if (toStr.call(value) !== '[object Symbol]') {
1851                                 return false;
1852                         }
1853                         try {
1854                                 return isSymbolObject(value);
1855                         } catch (e) {
1856                                 return false;
1857                         }
1858                 };
1859         } else {
1860
1861                 module.exports = function isSymbol(value) {
1862                         // this environment does not support Symbols.
1863                         return false ;
1864                 };
1865         }
1866         });
1867
1868         var hasSymbols$2 = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol';
1869
1870
1871
1872
1873
1874
1875         var ordinaryToPrimitive = function OrdinaryToPrimitive(O, hint) {
1876                 if (typeof O === 'undefined' || O === null) {
1877                         throw new TypeError('Cannot call method on ' + O);
1878                 }
1879                 if (typeof hint !== 'string' || (hint !== 'number' && hint !== 'string')) {
1880                         throw new TypeError('hint must be "string" or "number"');
1881                 }
1882                 var methodNames = hint === 'string' ? ['toString', 'valueOf'] : ['valueOf', 'toString'];
1883                 var method, result, i;
1884                 for (i = 0; i < methodNames.length; ++i) {
1885                         method = O[methodNames[i]];
1886                         if (isCallable$1(method)) {
1887                                 result = method.call(O);
1888                                 if (isPrimitive(result)) {
1889                                         return result;
1890                                 }
1891                         }
1892                 }
1893                 throw new TypeError('No default value');
1894         };
1895
1896         var GetMethod = function GetMethod(O, P) {
1897                 var func = O[P];
1898                 if (func !== null && typeof func !== 'undefined') {
1899                         if (!isCallable$1(func)) {
1900                                 throw new TypeError(func + ' returned for property ' + P + ' of object ' + O + ' is not a function');
1901                         }
1902                         return func;
1903                 }
1904                 return void 0;
1905         };
1906
1907         // http://www.ecma-international.org/ecma-262/6.0/#sec-toprimitive
1908         var es2015 = function ToPrimitive(input) {
1909                 if (isPrimitive(input)) {
1910                         return input;
1911                 }
1912                 var hint = 'default';
1913                 if (arguments.length > 1) {
1914                         if (arguments[1] === String) {
1915                                 hint = 'string';
1916                         } else if (arguments[1] === Number) {
1917                                 hint = 'number';
1918                         }
1919                 }
1920
1921                 var exoticToPrim;
1922                 if (hasSymbols$2) {
1923                         if (Symbol.toPrimitive) {
1924                                 exoticToPrim = GetMethod(input, Symbol.toPrimitive);
1925                         } else if (isSymbol$1(input)) {
1926                                 exoticToPrim = Symbol.prototype.valueOf;
1927                         }
1928                 }
1929                 if (typeof exoticToPrim !== 'undefined') {
1930                         var result = exoticToPrim.call(input, hint);
1931                         if (isPrimitive(result)) {
1932                                 return result;
1933                         }
1934                         throw new TypeError('unable to convert exotic object to primitive');
1935                 }
1936                 if (hint === 'default' && (isDateObject(input) || isSymbol$1(input))) {
1937                         hint = 'string';
1938                 }
1939                 return ordinaryToPrimitive(input, hint === 'default' ? 'number' : hint);
1940         };
1941
1942         var es6 = es2015;
1943
1944         /* globals
1945                 Set,
1946                 Map,
1947                 WeakSet,
1948                 WeakMap,
1949
1950                 Promise,
1951
1952                 Symbol,
1953                 Proxy,
1954
1955                 Atomics,
1956                 SharedArrayBuffer,
1957
1958                 ArrayBuffer,
1959                 DataView,
1960                 Uint8Array,
1961                 Float32Array,
1962                 Float64Array,
1963                 Int8Array,
1964                 Int16Array,
1965                 Int32Array,
1966                 Uint8ClampedArray,
1967                 Uint16Array,
1968                 Uint32Array,
1969         */
1970
1971         var undefined$1; // eslint-disable-line no-shadow-restricted-names
1972
1973         var ThrowTypeError = Object.getOwnPropertyDescriptor
1974                 ? (function () { return Object.getOwnPropertyDescriptor(arguments, 'callee').get; }())
1975                 : function () { throw new TypeError(); };
1976
1977         var hasSymbols$3 = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol';
1978
1979         var getProto = Object.getPrototypeOf || function (x) { return x.__proto__; }; // eslint-disable-line no-proto
1980         var generatorFunction =  undefined$1;
1981         var asyncFunction =  undefined$1;
1982         var asyncGenFunction =  undefined$1;
1983
1984         var TypedArray = typeof Uint8Array === 'undefined' ? undefined$1 : getProto(Uint8Array);
1985
1986         var INTRINSICS = {
1987                 '$ %Array%': Array,
1988                 '$ %ArrayBuffer%': typeof ArrayBuffer === 'undefined' ? undefined$1 : ArrayBuffer,
1989                 '$ %ArrayBufferPrototype%': typeof ArrayBuffer === 'undefined' ? undefined$1 : ArrayBuffer.prototype,
1990                 '$ %ArrayIteratorPrototype%': hasSymbols$3 ? getProto([][Symbol.iterator]()) : undefined$1,
1991                 '$ %ArrayPrototype%': Array.prototype,
1992                 '$ %ArrayProto_entries%': Array.prototype.entries,
1993                 '$ %ArrayProto_forEach%': Array.prototype.forEach,
1994                 '$ %ArrayProto_keys%': Array.prototype.keys,
1995                 '$ %ArrayProto_values%': Array.prototype.values,
1996                 '$ %AsyncFromSyncIteratorPrototype%': undefined$1,
1997                 '$ %AsyncFunction%': asyncFunction,
1998                 '$ %AsyncFunctionPrototype%':  undefined$1,
1999                 '$ %AsyncGenerator%':  undefined$1,
2000                 '$ %AsyncGeneratorFunction%': asyncGenFunction,
2001                 '$ %AsyncGeneratorPrototype%':  undefined$1,
2002                 '$ %AsyncIteratorPrototype%':  undefined$1,
2003                 '$ %Atomics%': typeof Atomics === 'undefined' ? undefined$1 : Atomics,
2004                 '$ %Boolean%': Boolean,
2005                 '$ %BooleanPrototype%': Boolean.prototype,
2006                 '$ %DataView%': typeof DataView === 'undefined' ? undefined$1 : DataView,
2007                 '$ %DataViewPrototype%': typeof DataView === 'undefined' ? undefined$1 : DataView.prototype,
2008                 '$ %Date%': Date,
2009                 '$ %DatePrototype%': Date.prototype,
2010                 '$ %decodeURI%': decodeURI,
2011                 '$ %decodeURIComponent%': decodeURIComponent,
2012                 '$ %encodeURI%': encodeURI,
2013                 '$ %encodeURIComponent%': encodeURIComponent,
2014                 '$ %Error%': Error,
2015                 '$ %ErrorPrototype%': Error.prototype,
2016                 '$ %eval%': eval, // eslint-disable-line no-eval
2017                 '$ %EvalError%': EvalError,
2018                 '$ %EvalErrorPrototype%': EvalError.prototype,
2019                 '$ %Float32Array%': typeof Float32Array === 'undefined' ? undefined$1 : Float32Array,
2020                 '$ %Float32ArrayPrototype%': typeof Float32Array === 'undefined' ? undefined$1 : Float32Array.prototype,
2021                 '$ %Float64Array%': typeof Float64Array === 'undefined' ? undefined$1 : Float64Array,
2022                 '$ %Float64ArrayPrototype%': typeof Float64Array === 'undefined' ? undefined$1 : Float64Array.prototype,
2023                 '$ %Function%': Function,
2024                 '$ %FunctionPrototype%': Function.prototype,
2025                 '$ %Generator%':  undefined$1,
2026                 '$ %GeneratorFunction%': generatorFunction,
2027                 '$ %GeneratorPrototype%':  undefined$1,
2028                 '$ %Int8Array%': typeof Int8Array === 'undefined' ? undefined$1 : Int8Array,
2029                 '$ %Int8ArrayPrototype%': typeof Int8Array === 'undefined' ? undefined$1 : Int8Array.prototype,
2030                 '$ %Int16Array%': typeof Int16Array === 'undefined' ? undefined$1 : Int16Array,
2031                 '$ %Int16ArrayPrototype%': typeof Int16Array === 'undefined' ? undefined$1 : Int8Array.prototype,
2032                 '$ %Int32Array%': typeof Int32Array === 'undefined' ? undefined$1 : Int32Array,
2033                 '$ %Int32ArrayPrototype%': typeof Int32Array === 'undefined' ? undefined$1 : Int32Array.prototype,
2034                 '$ %isFinite%': isFinite,
2035                 '$ %isNaN%': isNaN,
2036                 '$ %IteratorPrototype%': hasSymbols$3 ? getProto(getProto([][Symbol.iterator]())) : undefined$1,
2037                 '$ %JSON%': JSON,
2038                 '$ %JSONParse%': JSON.parse,
2039                 '$ %Map%': typeof Map === 'undefined' ? undefined$1 : Map,
2040                 '$ %MapIteratorPrototype%': typeof Map === 'undefined' || !hasSymbols$3 ? undefined$1 : getProto(new Map()[Symbol.iterator]()),
2041                 '$ %MapPrototype%': typeof Map === 'undefined' ? undefined$1 : Map.prototype,
2042                 '$ %Math%': Math,
2043                 '$ %Number%': Number,
2044                 '$ %NumberPrototype%': Number.prototype,
2045                 '$ %Object%': Object,
2046                 '$ %ObjectPrototype%': Object.prototype,
2047                 '$ %ObjProto_toString%': Object.prototype.toString,
2048                 '$ %ObjProto_valueOf%': Object.prototype.valueOf,
2049                 '$ %parseFloat%': parseFloat,
2050                 '$ %parseInt%': parseInt,
2051                 '$ %Promise%': typeof Promise === 'undefined' ? undefined$1 : Promise,
2052                 '$ %PromisePrototype%': typeof Promise === 'undefined' ? undefined$1 : Promise.prototype,
2053                 '$ %PromiseProto_then%': typeof Promise === 'undefined' ? undefined$1 : Promise.prototype.then,
2054                 '$ %Promise_all%': typeof Promise === 'undefined' ? undefined$1 : Promise.all,
2055                 '$ %Promise_reject%': typeof Promise === 'undefined' ? undefined$1 : Promise.reject,
2056                 '$ %Promise_resolve%': typeof Promise === 'undefined' ? undefined$1 : Promise.resolve,
2057                 '$ %Proxy%': typeof Proxy === 'undefined' ? undefined$1 : Proxy,
2058                 '$ %RangeError%': RangeError,
2059                 '$ %RangeErrorPrototype%': RangeError.prototype,
2060                 '$ %ReferenceError%': ReferenceError,
2061                 '$ %ReferenceErrorPrototype%': ReferenceError.prototype,
2062                 '$ %Reflect%': typeof Reflect === 'undefined' ? undefined$1 : Reflect,
2063                 '$ %RegExp%': RegExp,
2064                 '$ %RegExpPrototype%': RegExp.prototype,
2065                 '$ %Set%': typeof Set === 'undefined' ? undefined$1 : Set,
2066                 '$ %SetIteratorPrototype%': typeof Set === 'undefined' || !hasSymbols$3 ? undefined$1 : getProto(new Set()[Symbol.iterator]()),
2067                 '$ %SetPrototype%': typeof Set === 'undefined' ? undefined$1 : Set.prototype,
2068                 '$ %SharedArrayBuffer%': typeof SharedArrayBuffer === 'undefined' ? undefined$1 : SharedArrayBuffer,
2069                 '$ %SharedArrayBufferPrototype%': typeof SharedArrayBuffer === 'undefined' ? undefined$1 : SharedArrayBuffer.prototype,
2070                 '$ %String%': String,
2071                 '$ %StringIteratorPrototype%': hasSymbols$3 ? getProto(''[Symbol.iterator]()) : undefined$1,
2072                 '$ %StringPrototype%': String.prototype,
2073                 '$ %Symbol%': hasSymbols$3 ? Symbol : undefined$1,
2074                 '$ %SymbolPrototype%': hasSymbols$3 ? Symbol.prototype : undefined$1,
2075                 '$ %SyntaxError%': SyntaxError,
2076                 '$ %SyntaxErrorPrototype%': SyntaxError.prototype,
2077                 '$ %ThrowTypeError%': ThrowTypeError,
2078                 '$ %TypedArray%': TypedArray,
2079                 '$ %TypedArrayPrototype%': TypedArray ? TypedArray.prototype : undefined$1,
2080                 '$ %TypeError%': TypeError,
2081                 '$ %TypeErrorPrototype%': TypeError.prototype,
2082                 '$ %Uint8Array%': typeof Uint8Array === 'undefined' ? undefined$1 : Uint8Array,
2083                 '$ %Uint8ArrayPrototype%': typeof Uint8Array === 'undefined' ? undefined$1 : Uint8Array.prototype,
2084                 '$ %Uint8ClampedArray%': typeof Uint8ClampedArray === 'undefined' ? undefined$1 : Uint8ClampedArray,
2085                 '$ %Uint8ClampedArrayPrototype%': typeof Uint8ClampedArray === 'undefined' ? undefined$1 : Uint8ClampedArray.prototype,
2086                 '$ %Uint16Array%': typeof Uint16Array === 'undefined' ? undefined$1 : Uint16Array,
2087                 '$ %Uint16ArrayPrototype%': typeof Uint16Array === 'undefined' ? undefined$1 : Uint16Array.prototype,
2088                 '$ %Uint32Array%': typeof Uint32Array === 'undefined' ? undefined$1 : Uint32Array,
2089                 '$ %Uint32ArrayPrototype%': typeof Uint32Array === 'undefined' ? undefined$1 : Uint32Array.prototype,
2090                 '$ %URIError%': URIError,
2091                 '$ %URIErrorPrototype%': URIError.prototype,
2092                 '$ %WeakMap%': typeof WeakMap === 'undefined' ? undefined$1 : WeakMap,
2093                 '$ %WeakMapPrototype%': typeof WeakMap === 'undefined' ? undefined$1 : WeakMap.prototype,
2094                 '$ %WeakSet%': typeof WeakSet === 'undefined' ? undefined$1 : WeakSet,
2095                 '$ %WeakSetPrototype%': typeof WeakSet === 'undefined' ? undefined$1 : WeakSet.prototype
2096         };
2097
2098         var GetIntrinsic = function GetIntrinsic(name, allowMissing) {
2099                 if (arguments.length > 1 && typeof allowMissing !== 'boolean') {
2100                         throw new TypeError('"allowMissing" argument must be a boolean');
2101                 }
2102
2103                 var key = '$ ' + name;
2104                 if (!(key in INTRINSICS)) {
2105                         throw new SyntaxError('intrinsic ' + name + ' does not exist!');
2106                 }
2107
2108                 // istanbul ignore if // hopefully this is impossible to test :-)
2109                 if (typeof INTRINSICS[key] === 'undefined' && !allowMissing) {
2110                         throw new TypeError('intrinsic ' + name + ' exists, but is not available. Please file an issue!');
2111                 }
2112                 return INTRINSICS[key];
2113         };
2114
2115         var $TypeError = GetIntrinsic('%TypeError%');
2116         var $SyntaxError = GetIntrinsic('%SyntaxError%');
2117
2118
2119
2120         var predicates = {
2121           // https://ecma-international.org/ecma-262/6.0/#sec-property-descriptor-specification-type
2122           'Property Descriptor': function isPropertyDescriptor(ES, Desc) {
2123             if (ES.Type(Desc) !== 'Object') {
2124               return false;
2125             }
2126             var allowed = {
2127               '[[Configurable]]': true,
2128               '[[Enumerable]]': true,
2129               '[[Get]]': true,
2130               '[[Set]]': true,
2131               '[[Value]]': true,
2132               '[[Writable]]': true
2133             };
2134
2135             for (var key in Desc) { // eslint-disable-line
2136               if (src(Desc, key) && !allowed[key]) {
2137                 return false;
2138               }
2139             }
2140
2141             var isData = src(Desc, '[[Value]]');
2142             var IsAccessor = src(Desc, '[[Get]]') || src(Desc, '[[Set]]');
2143             if (isData && IsAccessor) {
2144               throw new $TypeError('Property Descriptors may not be both accessor and data descriptors');
2145             }
2146             return true;
2147           }
2148         };
2149
2150         var assertRecord = function assertRecord(ES, recordType, argumentName, value) {
2151           var predicate = predicates[recordType];
2152           if (typeof predicate !== 'function') {
2153             throw new $SyntaxError('unknown record type: ' + recordType);
2154           }
2155           if (!predicate(ES, value)) {
2156             throw new $TypeError(argumentName + ' must be a ' + recordType);
2157           }
2158           console.log(predicate(ES, value), value);
2159         };
2160
2161         var _isNaN = Number.isNaN || function isNaN(a) {
2162                 return a !== a;
2163         };
2164
2165         var $isNaN = Number.isNaN || function (a) { return a !== a; };
2166
2167         var _isFinite = Number.isFinite || function (x) { return typeof x === 'number' && !$isNaN(x) && x !== Infinity && x !== -Infinity; };
2168
2169         var has$1 = functionBind.call(Function.call, Object.prototype.hasOwnProperty);
2170
2171         var $assign = Object.assign;
2172
2173         var assign$1 = function assign(target, source) {
2174                 if ($assign) {
2175                         return $assign(target, source);
2176                 }
2177
2178                 for (var key in source) {
2179                         if (has$1(source, key)) {
2180                                 target[key] = source[key];
2181                         }
2182                 }
2183                 return target;
2184         };
2185
2186         var sign$1 = function sign(number) {
2187                 return number >= 0 ? 1 : -1;
2188         };
2189
2190         var mod = function mod(number, modulo) {
2191                 var remain = number % modulo;
2192                 return Math.floor(remain >= 0 ? remain : remain + modulo);
2193         };
2194
2195         var isPrimitive$1 = function isPrimitive(value) {
2196                 return value === null || (typeof value !== 'function' && typeof value !== 'object');
2197         };
2198
2199         var toStr$6 = Object.prototype.toString;
2200
2201
2202
2203
2204
2205         // http://ecma-international.org/ecma-262/5.1/#sec-8.12.8
2206         var ES5internalSlots = {
2207                 '[[DefaultValue]]': function (O) {
2208                         var actualHint;
2209                         if (arguments.length > 1) {
2210                                 actualHint = arguments[1];
2211                         } else {
2212                                 actualHint = toStr$6.call(O) === '[object Date]' ? String : Number;
2213                         }
2214
2215                         if (actualHint === String || actualHint === Number) {
2216                                 var methods = actualHint === String ? ['toString', 'valueOf'] : ['valueOf', 'toString'];
2217                                 var value, i;
2218                                 for (i = 0; i < methods.length; ++i) {
2219                                         if (isCallable$1(O[methods[i]])) {
2220                                                 value = O[methods[i]]();
2221                                                 if (isPrimitive(value)) {
2222                                                         return value;
2223                                                 }
2224                                         }
2225                                 }
2226                                 throw new TypeError('No default value');
2227                         }
2228                         throw new TypeError('invalid [[DefaultValue]] hint supplied');
2229                 }
2230         };
2231
2232         // http://ecma-international.org/ecma-262/5.1/#sec-9.1
2233         var es5 = function ToPrimitive(input) {
2234                 if (isPrimitive(input)) {
2235                         return input;
2236                 }
2237                 if (arguments.length > 1) {
2238                         return ES5internalSlots['[[DefaultValue]]'](input, arguments[1]);
2239                 }
2240                 return ES5internalSlots['[[DefaultValue]]'](input);
2241         };
2242
2243         var $Object = GetIntrinsic('%Object%');
2244         var $TypeError$1 = GetIntrinsic('%TypeError%');
2245         var $String = GetIntrinsic('%String%');
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259         // https://es5.github.io/#x9
2260         var ES5 = {
2261                 ToPrimitive: es5,
2262
2263                 ToBoolean: function ToBoolean(value) {
2264                         return !!value;
2265                 },
2266                 ToNumber: function ToNumber(value) {
2267                         return +value; // eslint-disable-line no-implicit-coercion
2268                 },
2269                 ToInteger: function ToInteger(value) {
2270                         var number = this.ToNumber(value);
2271                         if (_isNaN(number)) { return 0; }
2272                         if (number === 0 || !_isFinite(number)) { return number; }
2273                         return sign$1(number) * Math.floor(Math.abs(number));
2274                 },
2275                 ToInt32: function ToInt32(x) {
2276                         return this.ToNumber(x) >> 0;
2277                 },
2278                 ToUint32: function ToUint32(x) {
2279                         return this.ToNumber(x) >>> 0;
2280                 },
2281                 ToUint16: function ToUint16(value) {
2282                         var number = this.ToNumber(value);
2283                         if (_isNaN(number) || number === 0 || !_isFinite(number)) { return 0; }
2284                         var posInt = sign$1(number) * Math.floor(Math.abs(number));
2285                         return mod(posInt, 0x10000);
2286                 },
2287                 ToString: function ToString(value) {
2288                         return $String(value);
2289                 },
2290                 ToObject: function ToObject(value) {
2291                         this.CheckObjectCoercible(value);
2292                         return $Object(value);
2293                 },
2294                 CheckObjectCoercible: function CheckObjectCoercible(value, optMessage) {
2295                         /* jshint eqnull:true */
2296                         if (value == null) {
2297                                 throw new $TypeError$1(optMessage || 'Cannot call method on ' + value);
2298                         }
2299                         return value;
2300                 },
2301                 IsCallable: isCallable$1,
2302                 SameValue: function SameValue(x, y) {
2303                         if (x === y) { // 0 === -0, but they are not identical.
2304                                 if (x === 0) { return 1 / x === 1 / y; }
2305                                 return true;
2306                         }
2307                         return _isNaN(x) && _isNaN(y);
2308                 },
2309
2310                 // https://www.ecma-international.org/ecma-262/5.1/#sec-8
2311                 Type: function Type(x) {
2312                         if (x === null) {
2313                                 return 'Null';
2314                         }
2315                         if (typeof x === 'undefined') {
2316                                 return 'Undefined';
2317                         }
2318                         if (typeof x === 'function' || typeof x === 'object') {
2319                                 return 'Object';
2320                         }
2321                         if (typeof x === 'number') {
2322                                 return 'Number';
2323                         }
2324                         if (typeof x === 'boolean') {
2325                                 return 'Boolean';
2326                         }
2327                         if (typeof x === 'string') {
2328                                 return 'String';
2329                         }
2330                 },
2331
2332                 // https://ecma-international.org/ecma-262/6.0/#sec-property-descriptor-specification-type
2333                 IsPropertyDescriptor: function IsPropertyDescriptor(Desc) {
2334                         if (this.Type(Desc) !== 'Object') {
2335                                 return false;
2336                         }
2337                         var allowed = {
2338                                 '[[Configurable]]': true,
2339                                 '[[Enumerable]]': true,
2340                                 '[[Get]]': true,
2341                                 '[[Set]]': true,
2342                                 '[[Value]]': true,
2343                                 '[[Writable]]': true
2344                         };
2345
2346                         for (var key in Desc) { // eslint-disable-line
2347                                 if (src(Desc, key) && !allowed[key]) {
2348                                         return false;
2349                                 }
2350                         }
2351
2352                         var isData = src(Desc, '[[Value]]');
2353                         var IsAccessor = src(Desc, '[[Get]]') || src(Desc, '[[Set]]');
2354                         if (isData && IsAccessor) {
2355                                 throw new $TypeError$1('Property Descriptors may not be both accessor and data descriptors');
2356                         }
2357                         return true;
2358                 },
2359
2360                 // https://ecma-international.org/ecma-262/5.1/#sec-8.10.1
2361                 IsAccessorDescriptor: function IsAccessorDescriptor(Desc) {
2362                         if (typeof Desc === 'undefined') {
2363                                 return false;
2364                         }
2365
2366                         assertRecord(this, 'Property Descriptor', 'Desc', Desc);
2367
2368                         if (!src(Desc, '[[Get]]') && !src(Desc, '[[Set]]')) {
2369                                 return false;
2370                         }
2371
2372                         return true;
2373                 },
2374
2375                 // https://ecma-international.org/ecma-262/5.1/#sec-8.10.2
2376                 IsDataDescriptor: function IsDataDescriptor(Desc) {
2377                         if (typeof Desc === 'undefined') {
2378                                 return false;
2379                         }
2380
2381                         assertRecord(this, 'Property Descriptor', 'Desc', Desc);
2382
2383                         if (!src(Desc, '[[Value]]') && !src(Desc, '[[Writable]]')) {
2384                                 return false;
2385                         }
2386
2387                         return true;
2388                 },
2389
2390                 // https://ecma-international.org/ecma-262/5.1/#sec-8.10.3
2391                 IsGenericDescriptor: function IsGenericDescriptor(Desc) {
2392                         if (typeof Desc === 'undefined') {
2393                                 return false;
2394                         }
2395
2396                         assertRecord(this, 'Property Descriptor', 'Desc', Desc);
2397
2398                         if (!this.IsAccessorDescriptor(Desc) && !this.IsDataDescriptor(Desc)) {
2399                                 return true;
2400                         }
2401
2402                         return false;
2403                 },
2404
2405                 // https://ecma-international.org/ecma-262/5.1/#sec-8.10.4
2406                 FromPropertyDescriptor: function FromPropertyDescriptor(Desc) {
2407                         if (typeof Desc === 'undefined') {
2408                                 return Desc;
2409                         }
2410
2411                         assertRecord(this, 'Property Descriptor', 'Desc', Desc);
2412
2413                         if (this.IsDataDescriptor(Desc)) {
2414                                 return {
2415                                         value: Desc['[[Value]]'],
2416                                         writable: !!Desc['[[Writable]]'],
2417                                         enumerable: !!Desc['[[Enumerable]]'],
2418                                         configurable: !!Desc['[[Configurable]]']
2419                                 };
2420                         } else if (this.IsAccessorDescriptor(Desc)) {
2421                                 return {
2422                                         get: Desc['[[Get]]'],
2423                                         set: Desc['[[Set]]'],
2424                                         enumerable: !!Desc['[[Enumerable]]'],
2425                                         configurable: !!Desc['[[Configurable]]']
2426                                 };
2427                         } else {
2428                                 throw new $TypeError$1('FromPropertyDescriptor must be called with a fully populated Property Descriptor');
2429                         }
2430                 },
2431
2432                 // https://ecma-international.org/ecma-262/5.1/#sec-8.10.5
2433                 ToPropertyDescriptor: function ToPropertyDescriptor(Obj) {
2434                         if (this.Type(Obj) !== 'Object') {
2435                                 throw new $TypeError$1('ToPropertyDescriptor requires an object');
2436                         }
2437
2438                         var desc = {};
2439                         if (src(Obj, 'enumerable')) {
2440                                 desc['[[Enumerable]]'] = this.ToBoolean(Obj.enumerable);
2441                         }
2442                         if (src(Obj, 'configurable')) {
2443                                 desc['[[Configurable]]'] = this.ToBoolean(Obj.configurable);
2444                         }
2445                         if (src(Obj, 'value')) {
2446                                 desc['[[Value]]'] = Obj.value;
2447                         }
2448                         if (src(Obj, 'writable')) {
2449                                 desc['[[Writable]]'] = this.ToBoolean(Obj.writable);
2450                         }
2451                         if (src(Obj, 'get')) {
2452                                 var getter = Obj.get;
2453                                 if (typeof getter !== 'undefined' && !this.IsCallable(getter)) {
2454                                         throw new TypeError('getter must be a function');
2455                                 }
2456                                 desc['[[Get]]'] = getter;
2457                         }
2458                         if (src(Obj, 'set')) {
2459                                 var setter = Obj.set;
2460                                 if (typeof setter !== 'undefined' && !this.IsCallable(setter)) {
2461                                         throw new $TypeError$1('setter must be a function');
2462                                 }
2463                                 desc['[[Set]]'] = setter;
2464                         }
2465
2466                         if ((src(desc, '[[Get]]') || src(desc, '[[Set]]')) && (src(desc, '[[Value]]') || src(desc, '[[Writable]]'))) {
2467                                 throw new $TypeError$1('Invalid property descriptor. Cannot both specify accessors and a value or writable attribute');
2468                         }
2469                         return desc;
2470                 }
2471         };
2472
2473         var es5$1 = ES5;
2474
2475         var regexExec = RegExp.prototype.exec;
2476         var gOPD = Object.getOwnPropertyDescriptor;
2477
2478         var tryRegexExecCall = function tryRegexExec(value) {
2479                 try {
2480                         var lastIndex = value.lastIndex;
2481                         value.lastIndex = 0;
2482
2483                         regexExec.call(value);
2484                         return true;
2485                 } catch (e) {
2486                         return false;
2487                 } finally {
2488                         value.lastIndex = lastIndex;
2489                 }
2490         };
2491         var toStr$7 = Object.prototype.toString;
2492         var regexClass = '[object RegExp]';
2493         var hasToStringTag$2 = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';
2494
2495         var isRegex = function isRegex(value) {
2496                 if (!value || typeof value !== 'object') {
2497                         return false;
2498                 }
2499                 if (!hasToStringTag$2) {
2500                         return toStr$7.call(value) === regexClass;
2501                 }
2502
2503                 var descriptor = gOPD(value, 'lastIndex');
2504                 var hasLastIndexDataProperty = descriptor && src(descriptor, 'value');
2505                 if (!hasLastIndexDataProperty) {
2506                         return false;
2507                 }
2508
2509                 return tryRegexExecCall(value);
2510         };
2511
2512         var $TypeError$2 = GetIntrinsic('%TypeError%');
2513         var $SyntaxError$1 = GetIntrinsic('%SyntaxError%');
2514         var $Array = GetIntrinsic('%Array%');
2515         var $String$1 = GetIntrinsic('%String%');
2516         var $Object$1 = GetIntrinsic('%Object%');
2517         var $Number = GetIntrinsic('%Number%');
2518         var $Symbol = GetIntrinsic('%Symbol%', true);
2519         var $RegExp = GetIntrinsic('%RegExp%');
2520
2521         var hasSymbols$4 = !!$Symbol;
2522
2523
2524
2525
2526         var MAX_SAFE_INTEGER = $Number.MAX_SAFE_INTEGER || Math.pow(2, 53) - 1;
2527
2528
2529
2530
2531
2532         var parseInteger = parseInt;
2533
2534         var arraySlice = functionBind.call(Function.call, $Array.prototype.slice);
2535         var strSlice = functionBind.call(Function.call, $String$1.prototype.slice);
2536         var isBinary = functionBind.call(Function.call, $RegExp.prototype.test, /^0b[01]+$/i);
2537         var isOctal = functionBind.call(Function.call, $RegExp.prototype.test, /^0o[0-7]+$/i);
2538         var regexExec$1 = functionBind.call(Function.call, $RegExp.prototype.exec);
2539         var nonWS = ['\u0085', '\u200b', '\ufffe'].join('');
2540         var nonWSregex = new $RegExp('[' + nonWS + ']', 'g');
2541         var hasNonWS = functionBind.call(Function.call, $RegExp.prototype.test, nonWSregex);
2542         var invalidHexLiteral = /^[-+]0x[0-9a-f]+$/i;
2543         var isInvalidHexLiteral = functionBind.call(Function.call, $RegExp.prototype.test, invalidHexLiteral);
2544         var $charCodeAt = functionBind.call(Function.call, $String$1.prototype.charCodeAt);
2545
2546         var toStr$8 = functionBind.call(Function.call, Object.prototype.toString);
2547
2548         var $NumberValueOf = functionBind.call(Function.call, GetIntrinsic('%NumberPrototype%').valueOf);
2549         var $BooleanValueOf = functionBind.call(Function.call, GetIntrinsic('%BooleanPrototype%').valueOf);
2550         var $StringValueOf = functionBind.call(Function.call, GetIntrinsic('%StringPrototype%').valueOf);
2551         var $DateValueOf = functionBind.call(Function.call, GetIntrinsic('%DatePrototype%').valueOf);
2552
2553         var $floor = Math.floor;
2554         var $abs = Math.abs;
2555
2556         var $ObjectCreate = Object.create;
2557         var $gOPD = $Object$1.getOwnPropertyDescriptor;
2558
2559         var $isExtensible = $Object$1.isExtensible;
2560
2561         var $defineProperty = $Object$1.defineProperty;
2562
2563         // whitespace from: http://es5.github.io/#x15.5.4.20
2564         // implementation from https://github.com/es-shims/es5-shim/blob/v3.4.0/es5-shim.js#L1304-L1324
2565         var ws = [
2566                 '\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003',
2567                 '\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028',
2568                 '\u2029\uFEFF'
2569         ].join('');
2570         var trimRegex = new RegExp('(^[' + ws + ']+)|([' + ws + ']+$)', 'g');
2571         var replace = functionBind.call(Function.call, $String$1.prototype.replace);
2572         var trim = function (value) {
2573                 return replace(value, trimRegex, '');
2574         };
2575
2576
2577
2578
2579
2580         // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-abstract-operations
2581         var ES6 = assign$1(assign$1({}, es5$1), {
2582
2583                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-call-f-v-args
2584                 Call: function Call(F, V) {
2585                         var args = arguments.length > 2 ? arguments[2] : [];
2586                         if (!this.IsCallable(F)) {
2587                                 throw new $TypeError$2(F + ' is not a function');
2588                         }
2589                         return F.apply(V, args);
2590                 },
2591
2592                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-toprimitive
2593                 ToPrimitive: es6,
2594
2595                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-toboolean
2596                 // ToBoolean: ES5.ToBoolean,
2597
2598                 // https://ecma-international.org/ecma-262/6.0/#sec-tonumber
2599                 ToNumber: function ToNumber(argument) {
2600                         var value = isPrimitive$1(argument) ? argument : es6(argument, $Number);
2601                         if (typeof value === 'symbol') {
2602                                 throw new $TypeError$2('Cannot convert a Symbol value to a number');
2603                         }
2604                         if (typeof value === 'string') {
2605                                 if (isBinary(value)) {
2606                                         return this.ToNumber(parseInteger(strSlice(value, 2), 2));
2607                                 } else if (isOctal(value)) {
2608                                         return this.ToNumber(parseInteger(strSlice(value, 2), 8));
2609                                 } else if (hasNonWS(value) || isInvalidHexLiteral(value)) {
2610                                         return NaN;
2611                                 } else {
2612                                         var trimmed = trim(value);
2613                                         if (trimmed !== value) {
2614                                                 return this.ToNumber(trimmed);
2615                                         }
2616                                 }
2617                         }
2618                         return $Number(value);
2619                 },
2620
2621                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tointeger
2622                 // ToInteger: ES5.ToNumber,
2623
2624                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-toint32
2625                 // ToInt32: ES5.ToInt32,
2626
2627                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-touint32
2628                 // ToUint32: ES5.ToUint32,
2629
2630                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-toint16
2631                 ToInt16: function ToInt16(argument) {
2632                         var int16bit = this.ToUint16(argument);
2633                         return int16bit >= 0x8000 ? int16bit - 0x10000 : int16bit;
2634                 },
2635
2636                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-touint16
2637                 // ToUint16: ES5.ToUint16,
2638
2639                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-toint8
2640                 ToInt8: function ToInt8(argument) {
2641                         var int8bit = this.ToUint8(argument);
2642                         return int8bit >= 0x80 ? int8bit - 0x100 : int8bit;
2643                 },
2644
2645                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-touint8
2646                 ToUint8: function ToUint8(argument) {
2647                         var number = this.ToNumber(argument);
2648                         if (_isNaN(number) || number === 0 || !_isFinite(number)) { return 0; }
2649                         var posInt = sign$1(number) * $floor($abs(number));
2650                         return mod(posInt, 0x100);
2651                 },
2652
2653                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-touint8clamp
2654                 ToUint8Clamp: function ToUint8Clamp(argument) {
2655                         var number = this.ToNumber(argument);
2656                         if (_isNaN(number) || number <= 0) { return 0; }
2657                         if (number >= 0xFF) { return 0xFF; }
2658                         var f = $floor(argument);
2659                         if (f + 0.5 < number) { return f + 1; }
2660                         if (number < f + 0.5) { return f; }
2661                         if (f % 2 !== 0) { return f + 1; }
2662                         return f;
2663                 },
2664
2665                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tostring
2666                 ToString: function ToString(argument) {
2667                         if (typeof argument === 'symbol') {
2668                                 throw new $TypeError$2('Cannot convert a Symbol value to a string');
2669                         }
2670                         return $String$1(argument);
2671                 },
2672
2673                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-toobject
2674                 ToObject: function ToObject(value) {
2675                         this.RequireObjectCoercible(value);
2676                         return $Object$1(value);
2677                 },
2678
2679                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-topropertykey
2680                 ToPropertyKey: function ToPropertyKey(argument) {
2681                         var key = this.ToPrimitive(argument, $String$1);
2682                         return typeof key === 'symbol' ? key : this.ToString(key);
2683                 },
2684
2685                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength
2686                 ToLength: function ToLength(argument) {
2687                         var len = this.ToInteger(argument);
2688                         if (len <= 0) { return 0; } // includes converting -0 to +0
2689                         if (len > MAX_SAFE_INTEGER) { return MAX_SAFE_INTEGER; }
2690                         return len;
2691                 },
2692
2693                 // https://ecma-international.org/ecma-262/6.0/#sec-canonicalnumericindexstring
2694                 CanonicalNumericIndexString: function CanonicalNumericIndexString(argument) {
2695                         if (toStr$8(argument) !== '[object String]') {
2696                                 throw new $TypeError$2('must be a string');
2697                         }
2698                         if (argument === '-0') { return -0; }
2699                         var n = this.ToNumber(argument);
2700                         if (this.SameValue(this.ToString(n), argument)) { return n; }
2701                         return void 0;
2702                 },
2703
2704                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-requireobjectcoercible
2705                 RequireObjectCoercible: es5$1.CheckObjectCoercible,
2706
2707                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-isarray
2708                 IsArray: $Array.isArray || function IsArray(argument) {
2709                         return toStr$8(argument) === '[object Array]';
2710                 },
2711
2712                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-iscallable
2713                 // IsCallable: ES5.IsCallable,
2714
2715                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-isconstructor
2716                 IsConstructor: function IsConstructor(argument) {
2717                         return typeof argument === 'function' && !!argument.prototype; // unfortunately there's no way to truly check this without try/catch `new argument`
2718                 },
2719
2720                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-isextensible-o
2721                 IsExtensible: Object.preventExtensions
2722                         ? function IsExtensible(obj) {
2723                                 if (isPrimitive$1(obj)) {
2724                                         return false;
2725                                 }
2726                                 return $isExtensible(obj);
2727                         }
2728                         : function isExtensible(obj) { return true; }, // eslint-disable-line no-unused-vars
2729
2730                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-isinteger
2731                 IsInteger: function IsInteger(argument) {
2732                         if (typeof argument !== 'number' || _isNaN(argument) || !_isFinite(argument)) {
2733                                 return false;
2734                         }
2735                         var abs = $abs(argument);
2736                         return $floor(abs) === abs;
2737                 },
2738
2739                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-ispropertykey
2740                 IsPropertyKey: function IsPropertyKey(argument) {
2741                         return typeof argument === 'string' || typeof argument === 'symbol';
2742                 },
2743
2744                 // https://ecma-international.org/ecma-262/6.0/#sec-isregexp
2745                 IsRegExp: function IsRegExp(argument) {
2746                         if (!argument || typeof argument !== 'object') {
2747                                 return false;
2748                         }
2749                         if (hasSymbols$4) {
2750                                 var isRegExp = argument[$Symbol.match];
2751                                 if (typeof isRegExp !== 'undefined') {
2752                                         return es5$1.ToBoolean(isRegExp);
2753                                 }
2754                         }
2755                         return isRegex(argument);
2756                 },
2757
2758                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevalue
2759                 // SameValue: ES5.SameValue,
2760
2761                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero
2762                 SameValueZero: function SameValueZero(x, y) {
2763                         return (x === y) || (_isNaN(x) && _isNaN(y));
2764                 },
2765
2766                 /**
2767                  * 7.3.2 GetV (V, P)
2768                  * 1. Assert: IsPropertyKey(P) is true.
2769                  * 2. Let O be ToObject(V).
2770                  * 3. ReturnIfAbrupt(O).
2771                  * 4. Return O.[[Get]](P, V).
2772                  */
2773                 GetV: function GetV(V, P) {
2774                         // 7.3.2.1
2775                         if (!this.IsPropertyKey(P)) {
2776                                 throw new $TypeError$2('Assertion failed: IsPropertyKey(P) is not true');
2777                         }
2778
2779                         // 7.3.2.2-3
2780                         var O = this.ToObject(V);
2781
2782                         // 7.3.2.4
2783                         return O[P];
2784                 },
2785
2786                 /**
2787                  * 7.3.9 - https://ecma-international.org/ecma-262/6.0/#sec-getmethod
2788                  * 1. Assert: IsPropertyKey(P) is true.
2789                  * 2. Let func be GetV(O, P).
2790                  * 3. ReturnIfAbrupt(func).
2791                  * 4. If func is either undefined or null, return undefined.
2792                  * 5. If IsCallable(func) is false, throw a TypeError exception.
2793                  * 6. Return func.
2794                  */
2795                 GetMethod: function GetMethod(O, P) {
2796                         // 7.3.9.1
2797                         if (!this.IsPropertyKey(P)) {
2798                                 throw new $TypeError$2('Assertion failed: IsPropertyKey(P) is not true');
2799                         }
2800
2801                         // 7.3.9.2
2802                         var func = this.GetV(O, P);
2803
2804                         // 7.3.9.4
2805                         if (func == null) {
2806                                 return void 0;
2807                         }
2808
2809                         // 7.3.9.5
2810                         if (!this.IsCallable(func)) {
2811                                 throw new $TypeError$2(P + 'is not a function');
2812                         }
2813
2814                         // 7.3.9.6
2815                         return func;
2816                 },
2817
2818                 /**
2819                  * 7.3.1 Get (O, P) - https://ecma-international.org/ecma-262/6.0/#sec-get-o-p
2820                  * 1. Assert: Type(O) is Object.
2821                  * 2. Assert: IsPropertyKey(P) is true.
2822                  * 3. Return O.[[Get]](P, O).
2823                  */
2824                 Get: function Get(O, P) {
2825                         // 7.3.1.1
2826                         if (this.Type(O) !== 'Object') {
2827                                 throw new $TypeError$2('Assertion failed: Type(O) is not Object');
2828                         }
2829                         // 7.3.1.2
2830                         if (!this.IsPropertyKey(P)) {
2831                                 throw new $TypeError$2('Assertion failed: IsPropertyKey(P) is not true');
2832                         }
2833                         // 7.3.1.3
2834                         return O[P];
2835                 },
2836
2837                 Type: function Type(x) {
2838                         if (typeof x === 'symbol') {
2839                                 return 'Symbol';
2840                         }
2841                         return es5$1.Type(x);
2842                 },
2843
2844                 // https://ecma-international.org/ecma-262/6.0/#sec-speciesconstructor
2845                 SpeciesConstructor: function SpeciesConstructor(O, defaultConstructor) {
2846                         if (this.Type(O) !== 'Object') {
2847                                 throw new $TypeError$2('Assertion failed: Type(O) is not Object');
2848                         }
2849                         var C = O.constructor;
2850                         if (typeof C === 'undefined') {
2851                                 return defaultConstructor;
2852                         }
2853                         if (this.Type(C) !== 'Object') {
2854                                 throw new $TypeError$2('O.constructor is not an Object');
2855                         }
2856                         var S = hasSymbols$4 && $Symbol.species ? C[$Symbol.species] : void 0;
2857                         if (S == null) {
2858                                 return defaultConstructor;
2859                         }
2860                         if (this.IsConstructor(S)) {
2861                                 return S;
2862                         }
2863                         throw new $TypeError$2('no constructor found');
2864                 },
2865
2866                 // https://ecma-international.org/ecma-262/6.0/#sec-completepropertydescriptor
2867                 CompletePropertyDescriptor: function CompletePropertyDescriptor(Desc) {
2868                         assertRecord(this, 'Property Descriptor', 'Desc', Desc);
2869
2870                         if (this.IsGenericDescriptor(Desc) || this.IsDataDescriptor(Desc)) {
2871                                 if (!src(Desc, '[[Value]]')) {
2872                                         Desc['[[Value]]'] = void 0;
2873                                 }
2874                                 if (!src(Desc, '[[Writable]]')) {
2875                                         Desc['[[Writable]]'] = false;
2876                                 }
2877                         } else {
2878                                 if (!src(Desc, '[[Get]]')) {
2879                                         Desc['[[Get]]'] = void 0;
2880                                 }
2881                                 if (!src(Desc, '[[Set]]')) {
2882                                         Desc['[[Set]]'] = void 0;
2883                                 }
2884                         }
2885                         if (!src(Desc, '[[Enumerable]]')) {
2886                                 Desc['[[Enumerable]]'] = false;
2887                         }
2888                         if (!src(Desc, '[[Configurable]]')) {
2889                                 Desc['[[Configurable]]'] = false;
2890                         }
2891                         return Desc;
2892                 },
2893
2894                 // https://ecma-international.org/ecma-262/6.0/#sec-set-o-p-v-throw
2895                 Set: function Set(O, P, V, Throw) {
2896                         if (this.Type(O) !== 'Object') {
2897                                 throw new $TypeError$2('O must be an Object');
2898                         }
2899                         if (!this.IsPropertyKey(P)) {
2900                                 throw new $TypeError$2('P must be a Property Key');
2901                         }
2902                         if (this.Type(Throw) !== 'Boolean') {
2903                                 throw new $TypeError$2('Throw must be a Boolean');
2904                         }
2905                         if (Throw) {
2906                                 O[P] = V;
2907                                 return true;
2908                         } else {
2909                                 try {
2910                                         O[P] = V;
2911                                 } catch (e) {
2912                                         return false;
2913                                 }
2914                         }
2915                 },
2916
2917                 // https://ecma-international.org/ecma-262/6.0/#sec-hasownproperty
2918                 HasOwnProperty: function HasOwnProperty(O, P) {
2919                         if (this.Type(O) !== 'Object') {
2920                                 throw new $TypeError$2('O must be an Object');
2921                         }
2922                         if (!this.IsPropertyKey(P)) {
2923                                 throw new $TypeError$2('P must be a Property Key');
2924                         }
2925                         return src(O, P);
2926                 },
2927
2928                 // https://ecma-international.org/ecma-262/6.0/#sec-hasproperty
2929                 HasProperty: function HasProperty(O, P) {
2930                         if (this.Type(O) !== 'Object') {
2931                                 throw new $TypeError$2('O must be an Object');
2932                         }
2933                         if (!this.IsPropertyKey(P)) {
2934                                 throw new $TypeError$2('P must be a Property Key');
2935                         }
2936                         return P in O;
2937                 },
2938
2939                 // https://ecma-international.org/ecma-262/6.0/#sec-isconcatspreadable
2940                 IsConcatSpreadable: function IsConcatSpreadable(O) {
2941                         if (this.Type(O) !== 'Object') {
2942                                 return false;
2943                         }
2944                         if (hasSymbols$4 && typeof $Symbol.isConcatSpreadable === 'symbol') {
2945                                 var spreadable = this.Get(O, Symbol.isConcatSpreadable);
2946                                 if (typeof spreadable !== 'undefined') {
2947                                         return this.ToBoolean(spreadable);
2948                                 }
2949                         }
2950                         return this.IsArray(O);
2951                 },
2952
2953                 // https://ecma-international.org/ecma-262/6.0/#sec-invoke
2954                 Invoke: function Invoke(O, P) {
2955                         if (!this.IsPropertyKey(P)) {
2956                                 throw new $TypeError$2('P must be a Property Key');
2957                         }
2958                         var argumentsList = arraySlice(arguments, 2);
2959                         var func = this.GetV(O, P);
2960                         return this.Call(func, O, argumentsList);
2961                 },
2962
2963                 // https://ecma-international.org/ecma-262/6.0/#sec-getiterator
2964                 GetIterator: function GetIterator(obj, method) {
2965                         if (!hasSymbols$4) {
2966                                 throw new SyntaxError('ES.GetIterator depends on native iterator support.');
2967                         }
2968
2969                         var actualMethod = method;
2970                         if (arguments.length < 2) {
2971                                 actualMethod = this.GetMethod(obj, $Symbol.iterator);
2972                         }
2973                         var iterator = this.Call(actualMethod, obj);
2974                         if (this.Type(iterator) !== 'Object') {
2975                                 throw new $TypeError$2('iterator must return an object');
2976                         }
2977
2978                         return iterator;
2979                 },
2980
2981                 // https://ecma-international.org/ecma-262/6.0/#sec-iteratornext
2982                 IteratorNext: function IteratorNext(iterator, value) {
2983                         var result = this.Invoke(iterator, 'next', arguments.length < 2 ? [] : [value]);
2984                         if (this.Type(result) !== 'Object') {
2985                                 throw new $TypeError$2('iterator next must return an object');
2986                         }
2987                         return result;
2988                 },
2989
2990                 // https://ecma-international.org/ecma-262/6.0/#sec-iteratorcomplete
2991                 IteratorComplete: function IteratorComplete(iterResult) {
2992                         if (this.Type(iterResult) !== 'Object') {
2993                                 throw new $TypeError$2('Assertion failed: Type(iterResult) is not Object');
2994                         }
2995                         return this.ToBoolean(this.Get(iterResult, 'done'));
2996                 },
2997
2998                 // https://ecma-international.org/ecma-262/6.0/#sec-iteratorvalue
2999                 IteratorValue: function IteratorValue(iterResult) {
3000                         if (this.Type(iterResult) !== 'Object') {
3001                                 throw new $TypeError$2('Assertion failed: Type(iterResult) is not Object');
3002                         }
3003                         return this.Get(iterResult, 'value');
3004                 },
3005
3006                 // https://ecma-international.org/ecma-262/6.0/#sec-iteratorstep
3007                 IteratorStep: function IteratorStep(iterator) {
3008                         var result = this.IteratorNext(iterator);
3009                         var done = this.IteratorComplete(result);
3010                         return done === true ? false : result;
3011                 },
3012
3013                 // https://ecma-international.org/ecma-262/6.0/#sec-iteratorclose
3014                 IteratorClose: function IteratorClose(iterator, completion) {
3015                         if (this.Type(iterator) !== 'Object') {
3016                                 throw new $TypeError$2('Assertion failed: Type(iterator) is not Object');
3017                         }
3018                         if (!this.IsCallable(completion)) {
3019                                 throw new $TypeError$2('Assertion failed: completion is not a thunk for a Completion Record');
3020                         }
3021                         var completionThunk = completion;
3022
3023                         var iteratorReturn = this.GetMethod(iterator, 'return');
3024
3025                         if (typeof iteratorReturn === 'undefined') {
3026                                 return completionThunk();
3027                         }
3028
3029                         var completionRecord;
3030                         try {
3031                                 var innerResult = this.Call(iteratorReturn, iterator, []);
3032                         } catch (e) {
3033                                 // if we hit here, then "e" is the innerResult completion that needs re-throwing
3034
3035                                 // if the completion is of type "throw", this will throw.
3036                                 completionRecord = completionThunk();
3037                                 completionThunk = null; // ensure it's not called twice.
3038
3039                                 // if not, then return the innerResult completion
3040                                 throw e;
3041                         }
3042                         completionRecord = completionThunk(); // if innerResult worked, then throw if the completion does
3043                         completionThunk = null; // ensure it's not called twice.
3044
3045                         if (this.Type(innerResult) !== 'Object') {
3046                                 throw new $TypeError$2('iterator .return must return an object');
3047                         }
3048
3049                         return completionRecord;
3050                 },
3051
3052                 // https://ecma-international.org/ecma-262/6.0/#sec-createiterresultobject
3053                 CreateIterResultObject: function CreateIterResultObject(value, done) {
3054                         if (this.Type(done) !== 'Boolean') {
3055                                 throw new $TypeError$2('Assertion failed: Type(done) is not Boolean');
3056                         }
3057                         return {
3058                                 value: value,
3059                                 done: done
3060                         };
3061                 },
3062
3063                 // https://ecma-international.org/ecma-262/6.0/#sec-regexpexec
3064                 RegExpExec: function RegExpExec(R, S) {
3065                         if (this.Type(R) !== 'Object') {
3066                                 throw new $TypeError$2('R must be an Object');
3067                         }
3068                         if (this.Type(S) !== 'String') {
3069                                 throw new $TypeError$2('S must be a String');
3070                         }
3071                         var exec = this.Get(R, 'exec');
3072                         if (this.IsCallable(exec)) {
3073                                 var result = this.Call(exec, R, [S]);
3074                                 if (result === null || this.Type(result) === 'Object') {
3075                                         return result;
3076                                 }
3077                                 throw new $TypeError$2('"exec" method must return `null` or an Object');
3078                         }
3079                         return regexExec$1(R, S);
3080                 },
3081
3082                 // https://ecma-international.org/ecma-262/6.0/#sec-arrayspeciescreate
3083                 ArraySpeciesCreate: function ArraySpeciesCreate(originalArray, length) {
3084                         if (!this.IsInteger(length) || length < 0) {
3085                                 throw new $TypeError$2('Assertion failed: length must be an integer >= 0');
3086                         }
3087                         var len = length === 0 ? 0 : length;
3088                         var C;
3089                         var isArray = this.IsArray(originalArray);
3090                         if (isArray) {
3091                                 C = this.Get(originalArray, 'constructor');
3092                                 // TODO: figure out how to make a cross-realm normal Array, a same-realm Array
3093                                 // if (this.IsConstructor(C)) {
3094                                 //      if C is another realm's Array, C = undefined
3095                                 //      Object.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(Array))) === null ?
3096                                 // }
3097                                 if (this.Type(C) === 'Object' && hasSymbols$4 && $Symbol.species) {
3098                                         C = this.Get(C, $Symbol.species);
3099                                         if (C === null) {
3100                                                 C = void 0;
3101                                         }
3102                                 }
3103                         }
3104                         if (typeof C === 'undefined') {
3105                                 return $Array(len);
3106                         }
3107                         if (!this.IsConstructor(C)) {
3108                                 throw new $TypeError$2('C must be a constructor');
3109                         }
3110                         return new C(len); // this.Construct(C, len);
3111                 },
3112
3113                 CreateDataProperty: function CreateDataProperty(O, P, V) {
3114                         if (this.Type(O) !== 'Object') {
3115                                 throw new $TypeError$2('Assertion failed: Type(O) is not Object');
3116                         }
3117                         if (!this.IsPropertyKey(P)) {
3118                                 throw new $TypeError$2('Assertion failed: IsPropertyKey(P) is not true');
3119                         }
3120                         var oldDesc = $gOPD(O, P);
3121                         var extensible = oldDesc || (typeof $isExtensible !== 'function' || $isExtensible(O));
3122                         var immutable = oldDesc && (!oldDesc.writable || !oldDesc.configurable);
3123                         if (immutable || !extensible) {
3124                                 return false;
3125                         }
3126                         var newDesc = {
3127                                 configurable: true,
3128                                 enumerable: true,
3129                                 value: V,
3130                                 writable: true
3131                         };
3132                         $defineProperty(O, P, newDesc);
3133                         return true;
3134                 },
3135
3136                 // https://ecma-international.org/ecma-262/6.0/#sec-createdatapropertyorthrow
3137                 CreateDataPropertyOrThrow: function CreateDataPropertyOrThrow(O, P, V) {
3138                         if (this.Type(O) !== 'Object') {
3139                                 throw new $TypeError$2('Assertion failed: Type(O) is not Object');
3140                         }
3141                         if (!this.IsPropertyKey(P)) {
3142                                 throw new $TypeError$2('Assertion failed: IsPropertyKey(P) is not true');
3143                         }
3144                         var success = this.CreateDataProperty(O, P, V);
3145                         if (!success) {
3146                                 throw new $TypeError$2('unable to create data property');
3147                         }
3148                         return success;
3149                 },
3150
3151                 // https://www.ecma-international.org/ecma-262/6.0/#sec-objectcreate
3152                 ObjectCreate: function ObjectCreate(proto, internalSlotsList) {
3153                         if (proto !== null && this.Type(proto) !== 'Object') {
3154                                 throw new $TypeError$2('Assertion failed: proto must be null or an object');
3155                         }
3156                         var slots = arguments.length < 2 ? [] : internalSlotsList;
3157                         if (slots.length > 0) {
3158                                 throw new $SyntaxError$1('es-abstract does not yet support internal slots');
3159                         }
3160
3161                         if (proto === null && !$ObjectCreate) {
3162                                 throw new $SyntaxError$1('native Object.create support is required to create null objects');
3163                         }
3164
3165                         return $ObjectCreate(proto);
3166                 },
3167
3168                 // https://ecma-international.org/ecma-262/6.0/#sec-advancestringindex
3169                 AdvanceStringIndex: function AdvanceStringIndex(S, index, unicode) {
3170                         if (this.Type(S) !== 'String') {
3171                                 throw new $TypeError$2('S must be a String');
3172                         }
3173                         if (!this.IsInteger(index) || index < 0 || index > MAX_SAFE_INTEGER) {
3174                                 throw new $TypeError$2('Assertion failed: length must be an integer >= 0 and <= 2**53');
3175                         }
3176                         if (this.Type(unicode) !== 'Boolean') {
3177                                 throw new $TypeError$2('Assertion failed: unicode must be a Boolean');
3178                         }
3179                         if (!unicode) {
3180                                 return index + 1;
3181                         }
3182                         var length = S.length;
3183                         if ((index + 1) >= length) {
3184                                 return index + 1;
3185                         }
3186
3187                         var first = $charCodeAt(S, index);
3188                         if (first < 0xD800 || first > 0xDBFF) {
3189                                 return index + 1;
3190                         }
3191
3192                         var second = $charCodeAt(S, index + 1);
3193                         if (second < 0xDC00 || second > 0xDFFF) {
3194                                 return index + 1;
3195                         }
3196
3197                         return index + 2;
3198                 },
3199
3200                 // https://www.ecma-international.org/ecma-262/6.0/#sec-createmethodproperty
3201                 CreateMethodProperty: function CreateMethodProperty(O, P, V) {
3202                         if (this.Type(O) !== 'Object') {
3203                                 throw new $TypeError$2('Assertion failed: Type(O) is not Object');
3204                         }
3205
3206                         if (!this.IsPropertyKey(P)) {
3207                                 throw new $TypeError$2('Assertion failed: IsPropertyKey(P) is not true');
3208                         }
3209
3210                         var newDesc = {
3211                                 configurable: true,
3212                                 enumerable: false,
3213                                 value: V,
3214                                 writable: true
3215                         };
3216                         return !!$defineProperty(O, P, newDesc);
3217                 },
3218
3219                 // https://www.ecma-international.org/ecma-262/6.0/#sec-definepropertyorthrow
3220                 DefinePropertyOrThrow: function DefinePropertyOrThrow(O, P, desc) {
3221                         if (this.Type(O) !== 'Object') {
3222                                 throw new $TypeError$2('Assertion failed: Type(O) is not Object');
3223                         }
3224
3225                         if (!this.IsPropertyKey(P)) {
3226                                 throw new $TypeError$2('Assertion failed: IsPropertyKey(P) is not true');
3227                         }
3228
3229                         return !!$defineProperty(O, P, desc);
3230                 },
3231
3232                 // https://www.ecma-international.org/ecma-262/6.0/#sec-deletepropertyorthrow
3233                 DeletePropertyOrThrow: function DeletePropertyOrThrow(O, P) {
3234                         if (this.Type(O) !== 'Object') {
3235                                 throw new $TypeError$2('Assertion failed: Type(O) is not Object');
3236                         }
3237
3238                         if (!this.IsPropertyKey(P)) {
3239                                 throw new $TypeError$2('Assertion failed: IsPropertyKey(P) is not true');
3240                         }
3241
3242                         var success = delete O[P];
3243                         if (!success) {
3244                                 throw new TypeError('Attempt to delete property failed.');
3245                         }
3246                         return success;
3247                 },
3248
3249                 // https://www.ecma-international.org/ecma-262/6.0/#sec-enumerableownnames
3250                 EnumerableOwnNames: function EnumerableOwnNames(O) {
3251                         if (this.Type(O) !== 'Object') {
3252                                 throw new $TypeError$2('Assertion failed: Type(O) is not Object');
3253                         }
3254
3255                         return objectKeys(O);
3256                 },
3257
3258                 // https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-number-prototype-object
3259                 thisNumberValue: function thisNumberValue(value) {
3260                         if (this.Type(value) === 'Number') {
3261                                 return value;
3262                         }
3263
3264                         return $NumberValueOf(value);
3265                 },
3266
3267                 // https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-boolean-prototype-object
3268                 thisBooleanValue: function thisBooleanValue(value) {
3269                         if (this.Type(value) === 'Boolean') {
3270                                 return value;
3271                         }
3272
3273                         return $BooleanValueOf(value);
3274                 },
3275
3276                 // https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-string-prototype-object
3277                 thisStringValue: function thisStringValue(value) {
3278                         if (this.Type(value) === 'String') {
3279                                 return value;
3280                         }
3281
3282                         return $StringValueOf(value);
3283                 },
3284
3285                 // https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-date-prototype-object
3286                 thisTimeValue: function thisTimeValue(value) {
3287                         return $DateValueOf(value);
3288                 }
3289         });
3290
3291         delete ES6.CheckObjectCoercible; // renamed in ES6 to RequireObjectCoercible
3292
3293         var es2015$1 = ES6;
3294
3295         var es6$1 = es2015$1;
3296
3297         var implementation$2 = function find(predicate) {
3298                 var list = es6$1.ToObject(this);
3299                 var length = es6$1.ToInteger(es6$1.ToLength(list.length));
3300                 if (!es6$1.IsCallable(predicate)) {
3301                         throw new TypeError('Array#find: predicate must be a function');
3302                 }
3303                 if (length === 0) {
3304                         return undefined;
3305                 }
3306                 var thisArg = arguments[1];
3307                 for (var i = 0, value; i < length; i++) {
3308                         value = list[i];
3309                         if (es6$1.Call(predicate, thisArg, [value, i, list])) {
3310                                 return value;
3311                         }
3312                 }
3313                 return undefined;
3314         };
3315
3316         var polyfill$3 = function getPolyfill() {
3317                 // Detect if an implementation exists
3318                 // Detect early implementations which skipped holes in sparse arrays
3319           // eslint-disable-next-line no-sparse-arrays
3320                 var implemented = Array.prototype.find && [, 1].find(function () {
3321                         return true;
3322                 }) !== 1;
3323
3324           // eslint-disable-next-line global-require
3325                 return implemented ? Array.prototype.find : implementation$2;
3326         };
3327
3328         var shim$8 = function shimArrayPrototypeFind() {
3329                 var polyfill = polyfill$3();
3330
3331                 defineProperties_1(Array.prototype, { find: polyfill }, {
3332                         find: function () {
3333                                 return Array.prototype.find !== polyfill;
3334                         }
3335                 });
3336
3337                 return polyfill;
3338         };
3339
3340         var slice$2 = Array.prototype.slice;
3341
3342         var polyfill$4 = polyfill$3();
3343
3344         var boundFindShim = function find(array, predicate) { // eslint-disable-line no-unused-vars
3345                 es6$1.RequireObjectCoercible(array);
3346                 var args = slice$2.call(arguments, 1);
3347                 return polyfill$4.apply(array, args);
3348         };
3349
3350         defineProperties_1(boundFindShim, {
3351                 getPolyfill: polyfill$3,
3352                 implementation: implementation$2,
3353                 shim: shim$8
3354         });
3355
3356         var array_prototype_find = boundFindShim;
3357
3358         var implementation$3 = function findIndex(predicate) {
3359                 var list = es6$1.ToObject(this);
3360                 var length = es6$1.ToLength(list.length);
3361                 if (!es6$1.IsCallable(predicate)) {
3362                         throw new TypeError('Array#findIndex: predicate must be a function');
3363                 }
3364                 if (length === 0) return -1;
3365                 var thisArg = arguments[1];
3366                 for (var i = 0, value; i < length; i++) {
3367                         value = list[i];
3368                         if (es6$1.Call(predicate, thisArg, [value, i, list])) return i;
3369                 }
3370                 return -1;
3371         };
3372
3373         var polyfill$5 = function getPolyfill() {
3374                 // Detect if an implementation exists
3375                 // Detect early implementations which skipped holes in sparse arrays
3376                 var implemented = Array.prototype.findIndex && ([, 1].findIndex(function (item, idx) {
3377                         return idx === 0;
3378                 }) === 0);
3379
3380
3381                 return implemented ? Array.prototype.findIndex : implementation$3;
3382         };
3383
3384         var shim$9 = function shimArrayPrototypeFindIndex() {
3385                 var polyfill = polyfill$5();
3386
3387                 defineProperties_1(Array.prototype, { findIndex: polyfill }, {
3388                         findIndex: function () {
3389                                 return Array.prototype.findIndex !== polyfill;
3390                         }
3391                 });
3392
3393                 return polyfill;
3394         };
3395
3396         var slice$3 = Array.prototype.slice;
3397
3398         var polyfill$6 = polyfill$5();
3399
3400         var boundShim = function findIndex(array, predicate) {
3401                 es6$1.RequireObjectCoercible(array);
3402                 var args = slice$3.call(arguments, 1);
3403                 return polyfill$6.apply(array, args);
3404         };
3405
3406         defineProperties_1(boundShim, {
3407                 implementation: implementation$3,
3408                 getPolyfill: polyfill$5,
3409                 shim: shim$9
3410         });
3411
3412         var array_prototype_findindex = boundShim;
3413
3414         var supportsDescriptors$1 = defineProperties_1.supportsDescriptors;
3415
3416         /*! https://mths.be/array-from v0.2.0 by @mathias */
3417         var implementation$4 = function from(arrayLike) {
3418                 var defineProperty = supportsDescriptors$1 ? Object.defineProperty : function put(object, key, descriptor) {
3419                         object[key] = descriptor.value;
3420                 };
3421                 var C = this;
3422                 if (arrayLike === null || typeof arrayLike === 'undefined') {
3423                         throw new TypeError('`Array.from` requires an array-like object, not `null` or `undefined`');
3424                 }
3425                 var items = es6$1.ToObject(arrayLike);
3426
3427                 var mapFn, T;
3428                 if (typeof arguments[1] !== 'undefined') {
3429                         mapFn = arguments[1];
3430                         if (!es6$1.IsCallable(mapFn)) {
3431                                 throw new TypeError('When provided, the second argument to `Array.from` must be a function');
3432                         }
3433                         if (arguments.length > 2) {
3434                                 T = arguments[2];
3435                         }
3436                 }
3437
3438                 var len = es6$1.ToLength(items.length);
3439                 var A = es6$1.IsCallable(C) ? es6$1.ToObject(new C(len)) : new Array(len);
3440                 var k = 0;
3441                 var kValue, mappedValue;
3442                 while (k < len) {
3443                         kValue = items[k];
3444                         if (mapFn) {
3445                                 mappedValue = typeof T === 'undefined' ? mapFn(kValue, k) : es6$1.Call(mapFn, T, [kValue, k]);
3446                         } else {
3447                                 mappedValue = kValue;
3448                         }
3449                         defineProperty(A, k, {
3450                                 'configurable': true,
3451                                 'enumerable': true,
3452                                 'value': mappedValue,
3453                                 'writable': true
3454                         });
3455                         k += 1;
3456                 }
3457                 A.length = len;
3458                 return A;
3459         };
3460
3461         var tryCall = function (fn) {
3462                 try {
3463                         fn();
3464                         return true;
3465                 } catch (e) {
3466                         return false;
3467                 }
3468         };
3469
3470         var polyfill$7 = function getPolyfill() {
3471                 var implemented = es6$1.IsCallable(Array.from)
3472                         && tryCall(function () { Array.from({ 'length': -Infinity }); })
3473                         && !tryCall(function () { Array.from([], undefined); });
3474
3475                 return implemented ? Array.from : implementation$4;
3476         };
3477
3478         var shim$a = function shimArrayFrom() {
3479                 var polyfill = polyfill$7();
3480
3481                 defineProperties_1(Array, { 'from': polyfill }, {
3482                         'from': function () {
3483                                 return Array.from !== polyfill;
3484                         }
3485                 });
3486
3487                 return polyfill;
3488         };
3489
3490         // eslint-disable-next-line no-unused-vars
3491         var boundFromShim = function from(array) {
3492             // eslint-disable-next-line no-invalid-this
3493                 return implementation$4.apply(this || Array, arguments);
3494         };
3495
3496         defineProperties_1(boundFromShim, {
3497                 'getPolyfill': polyfill$7,
3498                 'implementation': implementation$4,
3499                 'shim': shim$a
3500         });
3501
3502         var array_from = boundFromShim;
3503
3504         var ES2016 = assign$1(assign$1({}, es2015$1), {
3505                 // https://github.com/tc39/ecma262/pull/60
3506                 SameValueNonNumber: function SameValueNonNumber(x, y) {
3507                         if (typeof x === 'number' || typeof x !== typeof y) {
3508                                 throw new TypeError('SameValueNonNumber requires two non-number values of the same type.');
3509                         }
3510                         return this.SameValue(x, y);
3511                 }
3512         });
3513
3514         var es2016 = ES2016;
3515
3516         var es7 = es2016;
3517
3518         var isEnumerable$1 = functionBind.call(Function.call, Object.prototype.propertyIsEnumerable);
3519
3520         var implementation$5 = function values(O) {
3521                 var obj = es7.RequireObjectCoercible(O);
3522                 var vals = [];
3523                 for (var key in obj) {
3524                         if (src(obj, key) && isEnumerable$1(obj, key)) {
3525                                 vals.push(obj[key]);
3526                         }
3527                 }
3528                 return vals;
3529         };
3530
3531         var polyfill$8 = function getPolyfill() {
3532                 return typeof Object.values === 'function' ? Object.values : implementation$5;
3533         };
3534
3535         var shim$b = function shimValues() {
3536                 var polyfill = polyfill$8();
3537                 defineProperties_1(Object, { values: polyfill }, {
3538                         values: function testValues() {
3539                                 return Object.values !== polyfill;
3540                         }
3541                 });
3542                 return polyfill;
3543         };
3544
3545         var polyfill$9 = polyfill$8();
3546
3547         defineProperties_1(polyfill$9, {
3548                 getPolyfill: polyfill$8,
3549                 implementation: implementation$5,
3550                 shim: shim$b
3551         });
3552
3553         var object_values = polyfill$9;
3554
3555         // modified from https://github.com/es-shims/es6-shim
3556
3557
3558         var canBeObject = function (obj) {
3559                 return typeof obj !== 'undefined' && obj !== null;
3560         };
3561         var hasSymbols$5 = shams();
3562         var toObject = Object;
3563         var push = functionBind.call(Function.call, Array.prototype.push);
3564         var propIsEnumerable = functionBind.call(Function.call, Object.prototype.propertyIsEnumerable);
3565         var originalGetSymbols = hasSymbols$5 ? Object.getOwnPropertySymbols : null;
3566
3567         var implementation$6 = function assign(target, source1) {
3568                 if (!canBeObject(target)) { throw new TypeError('target must be an object'); }
3569                 var objTarget = toObject(target);
3570                 var s, source, i, props, syms, value, key;
3571                 for (s = 1; s < arguments.length; ++s) {
3572                         source = toObject(arguments[s]);
3573                         props = objectKeys(source);
3574                         var getSymbols = hasSymbols$5 && (Object.getOwnPropertySymbols || originalGetSymbols);
3575                         if (getSymbols) {
3576                                 syms = getSymbols(source);
3577                                 for (i = 0; i < syms.length; ++i) {
3578                                         key = syms[i];
3579                                         if (propIsEnumerable(source, key)) {
3580                                                 push(props, key);
3581                                         }
3582                                 }
3583                         }
3584                         for (i = 0; i < props.length; ++i) {
3585                                 key = props[i];
3586                                 value = source[key];
3587                                 if (propIsEnumerable(source, key)) {
3588                                         objTarget[key] = value;
3589                                 }
3590                         }
3591                 }
3592                 return objTarget;
3593         };
3594
3595         var lacksProperEnumerationOrder = function () {
3596                 if (!Object.assign) {
3597                         return false;
3598                 }
3599                 // v8, specifically in node 4.x, has a bug with incorrect property enumeration order
3600                 // note: this does not detect the bug unless there's 20 characters
3601                 var str = 'abcdefghijklmnopqrst';
3602                 var letters = str.split('');
3603                 var map = {};
3604                 for (var i = 0; i < letters.length; ++i) {
3605                         map[letters[i]] = letters[i];
3606                 }
3607                 var obj = Object.assign({}, map);
3608                 var actual = '';
3609                 for (var k in obj) {
3610                         actual += k;
3611                 }
3612                 return str !== actual;
3613         };
3614
3615         var assignHasPendingExceptions = function () {
3616                 if (!Object.assign || !Object.preventExtensions) {
3617                         return false;
3618                 }
3619                 // Firefox 37 still has "pending exception" logic in its Object.assign implementation,
3620                 // which is 72% slower than our shim, and Firefox 40's native implementation.
3621                 var thrower = Object.preventExtensions({ 1: 2 });
3622                 try {
3623                         Object.assign(thrower, 'xy');
3624                 } catch (e) {
3625                         return thrower[1] === 'y';
3626                 }
3627                 return false;
3628         };
3629
3630         var polyfill$a = function getPolyfill() {
3631                 if (!Object.assign) {
3632                         return implementation$6;
3633                 }
3634                 if (lacksProperEnumerationOrder()) {
3635                         return implementation$6;
3636                 }
3637                 if (assignHasPendingExceptions()) {
3638                         return implementation$6;
3639                 }
3640                 return Object.assign;
3641         };
3642
3643         var shim$c = function shimAssign() {
3644                 var polyfill = polyfill$a();
3645                 defineProperties_1(
3646                         Object,
3647                         { assign: polyfill },
3648                         { assign: function () { return Object.assign !== polyfill; } }
3649                 );
3650                 return polyfill;
3651         };
3652
3653         var polyfill$b = polyfill$a();
3654
3655         defineProperties_1(polyfill$b, {
3656                 getPolyfill: polyfill$a,
3657                 implementation: implementation$6,
3658                 shim: shim$c
3659         });
3660
3661         var object_assign = polyfill$b;
3662
3663         /**
3664          * @this {Promise}
3665          */
3666         function finallyConstructor(callback) {
3667           var constructor = this.constructor;
3668           return this.then(
3669             function(value) {
3670               return constructor.resolve(callback()).then(function() {
3671                 return value;
3672               });
3673             },
3674             function(reason) {
3675               return constructor.resolve(callback()).then(function() {
3676                 return constructor.reject(reason);
3677               });
3678             }
3679           );
3680         }
3681
3682         // Store setTimeout reference so promise-polyfill will be unaffected by
3683         // other code modifying setTimeout (like sinon.useFakeTimers())
3684         var setTimeoutFunc = setTimeout;
3685
3686         function noop$1() {}
3687
3688         // Polyfill for Function.prototype.bind
3689         function bind$2(fn, thisArg) {
3690           return function() {
3691             fn.apply(thisArg, arguments);
3692           };
3693         }
3694
3695         /**
3696          * @constructor
3697          * @param {Function} fn
3698          */
3699         function Promise$1(fn) {
3700           if (!(this instanceof Promise$1))
3701             throw new TypeError('Promises must be constructed via new');
3702           if (typeof fn !== 'function') throw new TypeError('not a function');
3703           /** @type {!number} */
3704           this._state = 0;
3705           /** @type {!boolean} */
3706           this._handled = false;
3707           /** @type {Promise|undefined} */
3708           this._value = undefined;
3709           /** @type {!Array<!Function>} */
3710           this._deferreds = [];
3711
3712           doResolve(fn, this);
3713         }
3714
3715         function handle(self, deferred) {
3716           while (self._state === 3) {
3717             self = self._value;
3718           }
3719           if (self._state === 0) {
3720             self._deferreds.push(deferred);
3721             return;
3722           }
3723           self._handled = true;
3724           Promise$1._immediateFn(function() {
3725             var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected;
3726             if (cb === null) {
3727               (self._state === 1 ? resolve : reject)(deferred.promise, self._value);
3728               return;
3729             }
3730             var ret;
3731             try {
3732               ret = cb(self._value);
3733             } catch (e) {
3734               reject(deferred.promise, e);
3735               return;
3736             }
3737             resolve(deferred.promise, ret);
3738           });
3739         }
3740
3741         function resolve(self, newValue) {
3742           try {
3743             // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure
3744             if (newValue === self)
3745               throw new TypeError('A promise cannot be resolved with itself.');
3746             if (
3747               newValue &&
3748               (typeof newValue === 'object' || typeof newValue === 'function')
3749             ) {
3750               var then = newValue.then;
3751               if (newValue instanceof Promise$1) {
3752                 self._state = 3;
3753                 self._value = newValue;
3754                 finale(self);
3755                 return;
3756               } else if (typeof then === 'function') {
3757                 doResolve(bind$2(then, newValue), self);
3758                 return;
3759               }
3760             }
3761             self._state = 1;
3762             self._value = newValue;
3763             finale(self);
3764           } catch (e) {
3765             reject(self, e);
3766           }
3767         }
3768
3769         function reject(self, newValue) {
3770           self._state = 2;
3771           self._value = newValue;
3772           finale(self);
3773         }
3774
3775         function finale(self) {
3776           if (self._state === 2 && self._deferreds.length === 0) {
3777             Promise$1._immediateFn(function() {
3778               if (!self._handled) {
3779                 Promise$1._unhandledRejectionFn(self._value);
3780               }
3781             });
3782           }
3783
3784           for (var i = 0, len = self._deferreds.length; i < len; i++) {
3785             handle(self, self._deferreds[i]);
3786           }
3787           self._deferreds = null;
3788         }
3789
3790         /**
3791          * @constructor
3792          */
3793         function Handler(onFulfilled, onRejected, promise) {
3794           this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;
3795           this.onRejected = typeof onRejected === 'function' ? onRejected : null;
3796           this.promise = promise;
3797         }
3798
3799         /**
3800          * Take a potentially misbehaving resolver function and make sure
3801          * onFulfilled and onRejected are only called once.
3802          *
3803          * Makes no guarantees about asynchrony.
3804          */
3805         function doResolve(fn, self) {
3806           var done = false;
3807           try {
3808             fn(
3809               function(value) {
3810                 if (done) return;
3811                 done = true;
3812                 resolve(self, value);
3813               },
3814               function(reason) {
3815                 if (done) return;
3816                 done = true;
3817                 reject(self, reason);
3818               }
3819             );
3820           } catch (ex) {
3821             if (done) return;
3822             done = true;
3823             reject(self, ex);
3824           }
3825         }
3826
3827         Promise$1.prototype['catch'] = function(onRejected) {
3828           return this.then(null, onRejected);
3829         };
3830
3831         Promise$1.prototype.then = function(onFulfilled, onRejected) {
3832           // @ts-ignore
3833           var prom = new this.constructor(noop$1);
3834
3835           handle(this, new Handler(onFulfilled, onRejected, prom));
3836           return prom;
3837         };
3838
3839         Promise$1.prototype['finally'] = finallyConstructor;
3840
3841         Promise$1.all = function(arr) {
3842           return new Promise$1(function(resolve, reject) {
3843             if (!arr || typeof arr.length === 'undefined')
3844               throw new TypeError('Promise.all accepts an array');
3845             var args = Array.prototype.slice.call(arr);
3846             if (args.length === 0) return resolve([]);
3847             var remaining = args.length;
3848
3849             function res(i, val) {
3850               try {
3851                 if (val && (typeof val === 'object' || typeof val === 'function')) {
3852                   var then = val.then;
3853                   if (typeof then === 'function') {
3854                     then.call(
3855                       val,
3856                       function(val) {
3857                         res(i, val);
3858                       },
3859                       reject
3860                     );
3861                     return;
3862                   }
3863                 }
3864                 args[i] = val;
3865                 if (--remaining === 0) {
3866                   resolve(args);
3867                 }
3868               } catch (ex) {
3869                 reject(ex);
3870               }
3871             }
3872
3873             for (var i = 0; i < args.length; i++) {
3874               res(i, args[i]);
3875             }
3876           });
3877         };
3878
3879         Promise$1.resolve = function(value) {
3880           if (value && typeof value === 'object' && value.constructor === Promise$1) {
3881             return value;
3882           }
3883
3884           return new Promise$1(function(resolve) {
3885             resolve(value);
3886           });
3887         };
3888
3889         Promise$1.reject = function(value) {
3890           return new Promise$1(function(resolve, reject) {
3891             reject(value);
3892           });
3893         };
3894
3895         Promise$1.race = function(values) {
3896           return new Promise$1(function(resolve, reject) {
3897             for (var i = 0, len = values.length; i < len; i++) {
3898               values[i].then(resolve, reject);
3899             }
3900           });
3901         };
3902
3903         // Use polyfill for setImmediate for performance gains
3904         Promise$1._immediateFn =
3905           (typeof setImmediate === 'function' &&
3906             function(fn) {
3907               setImmediate(fn);
3908             }) ||
3909           function(fn) {
3910             setTimeoutFunc(fn, 0);
3911           };
3912
3913         Promise$1._unhandledRejectionFn = function _unhandledRejectionFn(err) {
3914           if (typeof console !== 'undefined' && console) {
3915             console.warn('Possible Unhandled Promise Rejection:', err); // eslint-disable-line no-console
3916           }
3917         };
3918
3919         /** @suppress {undefinedVars} */
3920         var globalNS = (function() {
3921           // the only reliable means to get the global object is
3922           // `Function('return this')()`
3923           // However, this causes CSP violations in Chrome apps.
3924           if (typeof self !== 'undefined') {
3925             return self;
3926           }
3927           if (typeof window !== 'undefined') {
3928             return window;
3929           }
3930           if (typeof global !== 'undefined') {
3931             return global;
3932           }
3933           throw new Error('unable to locate global object');
3934         })();
3935
3936         if (!('Promise' in globalNS)) {
3937           globalNS['Promise'] = Promise$1;
3938         } else if (!globalNS.Promise.prototype['finally']) {
3939           globalNS.Promise.prototype['finally'] = finallyConstructor;
3940         }
3941
3942         var polyfill$c = /*#__PURE__*/Object.freeze({
3943
3944         });
3945
3946         var setAsap = createCommonjsModule(function (module) {
3947         (function (thisVar, undefined$1) {
3948                 var main = (typeof window === 'object' && window) || (typeof commonjsGlobal === 'object' && commonjsGlobal) ||
3949                         typeof self === 'object' && self || thisVar;
3950
3951                 var hasSetImmediate = typeof setImmediate === 'function';
3952                 var hasNextTick = typeof process === 'object' && !!process && typeof process.nextTick === 'function';
3953                 var index = 0;
3954
3955                 function getNewIndex() {
3956                         if (index === 9007199254740991) {
3957                                 return 0;
3958                         }
3959                         return ++index;
3960                 }
3961
3962                 var setAsap = (function () {
3963                         var hiddenDiv, scriptEl, timeoutFn, callbacks;
3964
3965                         // Modern browsers, fastest async
3966                         if (main.MutationObserver) {
3967                                 return function setAsap(callback) {
3968                                         hiddenDiv = document.createElement("div");
3969                                         (new MutationObserver(function() {
3970                                                 callback();
3971                                                 hiddenDiv = null;
3972                                         })).observe(hiddenDiv, { attributes: true });
3973                                         hiddenDiv.setAttribute('i', '1');
3974                                 };
3975
3976                         // Browsers that support postMessage
3977                         } else if (!hasSetImmediate && main.postMessage && !main.importScripts && main.addEventListener) {
3978
3979                                 var MESSAGE_PREFIX = "com.setImmediate" + Math.random();
3980                                 callbacks = {};
3981
3982                                 var onGlobalMessage = function (event) {
3983                                         if (event.source === main && event.data.indexOf(MESSAGE_PREFIX) === 0) {
3984                                                 var i = +event.data.split(':')[1];
3985                                                 callbacks[i]();
3986                                                 delete callbacks[i];
3987                                         }
3988                                 };
3989
3990                                 main.addEventListener("message", onGlobalMessage, false);
3991
3992                                 return function setAsap(callback) {
3993                                         var i = getNewIndex();
3994                                         callbacks[i] = callback;
3995                                         main.postMessage(MESSAGE_PREFIX + ':' + i, "*");
3996                                 };
3997
3998                                 // IE browsers without postMessage
3999                         } else if (!hasSetImmediate && main.document && 'onreadystatechange' in document.createElement('script')) {
4000
4001                                 return function setAsap(callback) {
4002                                         scriptEl = document.createElement("script");
4003                                         scriptEl.onreadystatechange = function onreadystatechange() {
4004                                                 scriptEl.onreadystatechange = null;
4005                                                 scriptEl.parentNode.removeChild(scriptEl);
4006                                                 scriptEl = null;
4007                                                 callback();
4008                                         };
4009                                         document.body.appendChild(scriptEl);
4010                                 };
4011
4012                         // All other browsers and node
4013                         } else {
4014
4015                                 timeoutFn = (hasSetImmediate && setImmediate) || (hasNextTick && process.nextTick) || setTimeout;
4016                                 return function setAsap(callback) {
4017                                         timeoutFn(callback);
4018                                 };
4019                         }
4020
4021                 })();
4022
4023                 if ( module.exports) {
4024                         module.exports = setAsap;
4025                 } else if (typeof commonjsRequire !== 'undefined' && commonjsRequire.amd) {
4026                         undefined$1(function () {
4027                                 return setAsap;
4028                         });
4029                 } else {
4030                         main.setAsap = setAsap;
4031                 }
4032         })(commonjsGlobal);
4033         });
4034
4035         var performanceNow = createCommonjsModule(function (module) {
4036         // Generated by CoffeeScript 1.12.2
4037         (function() {
4038           var getNanoSeconds, hrtime, loadTime, moduleLoadTime, nodeLoadTime, upTime;
4039
4040           if ((typeof performance !== "undefined" && performance !== null) && performance.now) {
4041             module.exports = function() {
4042               return performance.now();
4043             };
4044           } else if ((typeof process !== "undefined" && process !== null) && process.hrtime) {
4045             module.exports = function() {
4046               return (getNanoSeconds() - nodeLoadTime) / 1e6;
4047             };
4048             hrtime = process.hrtime;
4049             getNanoSeconds = function() {
4050               var hr;
4051               hr = hrtime();
4052               return hr[0] * 1e9 + hr[1];
4053             };
4054             moduleLoadTime = getNanoSeconds();
4055             upTime = process.uptime() * 1e9;
4056             nodeLoadTime = moduleLoadTime - upTime;
4057           } else if (Date.now) {
4058             module.exports = function() {
4059               return Date.now() - loadTime;
4060             };
4061             loadTime = Date.now();
4062           } else {
4063             module.exports = function() {
4064               return new Date().getTime() - loadTime;
4065             };
4066             loadTime = new Date().getTime();
4067           }
4068
4069         }).call(commonjsGlobal);
4070
4071
4072         });
4073
4074         var root = typeof window === 'undefined' ? commonjsGlobal : window
4075           , vendors = ['moz', 'webkit']
4076           , suffix = 'AnimationFrame'
4077           , raf = root['request' + suffix]
4078           , caf = root['cancel' + suffix] || root['cancelRequest' + suffix];
4079
4080         for(var i = 0; !raf && i < vendors.length; i++) {
4081           raf = root[vendors[i] + 'Request' + suffix];
4082           caf = root[vendors[i] + 'Cancel' + suffix]
4083               || root[vendors[i] + 'CancelRequest' + suffix];
4084         }
4085
4086         // Some versions of FF have rAF but not cAF
4087         if(!raf || !caf) {
4088           var last = 0
4089             , id$3 = 0
4090             , queue = []
4091             , frameDuration = 1000 / 60;
4092
4093           raf = function(callback) {
4094             if(queue.length === 0) {
4095               var _now = performanceNow()
4096                 , next = Math.max(0, frameDuration - (_now - last));
4097               last = next + _now;
4098               setTimeout(function() {
4099                 var cp = queue.slice(0);
4100                 // Clear queue here to prevent
4101                 // callbacks from appending listeners
4102                 // to the current frame's queue
4103                 queue.length = 0;
4104                 for(var i = 0; i < cp.length; i++) {
4105                   if(!cp[i].cancelled) {
4106                     try{
4107                       cp[i].callback(last);
4108                     } catch(e) {
4109                       setTimeout(function() { throw e }, 0);
4110                     }
4111                   }
4112                 }
4113               }, Math.round(next));
4114             }
4115             queue.push({
4116               handle: ++id$3,
4117               callback: callback,
4118               cancelled: false
4119             });
4120             return id$3
4121           };
4122
4123           caf = function(handle) {
4124             for(var i = 0; i < queue.length; i++) {
4125               if(queue[i].handle === handle) {
4126                 queue[i].cancelled = true;
4127               }
4128             }
4129           };
4130         }
4131
4132         var raf_1 = function(fn) {
4133           // Wrap in a new function to prevent
4134           // `cancel` potentially being assigned
4135           // to the native rAF function
4136           return raf.call(root, fn)
4137         };
4138         var cancel = function() {
4139           caf.apply(root, arguments);
4140         };
4141         var polyfill$d = function(object) {
4142           if (!object) {
4143             object = root;
4144           }
4145           object.requestAnimationFrame = raf;
4146           object.cancelAnimationFrame = caf;
4147         };
4148         raf_1.cancel = cancel;
4149         raf_1.polyfill = polyfill$d;
4150
4151         var support = {
4152           searchParams: 'URLSearchParams' in self,
4153           iterable: 'Symbol' in self && 'iterator' in Symbol,
4154           blob:
4155             'FileReader' in self &&
4156             'Blob' in self &&
4157             (function() {
4158               try {
4159                 new Blob();
4160                 return true
4161               } catch (e) {
4162                 return false
4163               }
4164             })(),
4165           formData: 'FormData' in self,
4166           arrayBuffer: 'ArrayBuffer' in self
4167         };
4168
4169         function isDataView(obj) {
4170           return obj && DataView.prototype.isPrototypeOf(obj)
4171         }
4172
4173         if (support.arrayBuffer) {
4174           var viewClasses = [
4175             '[object Int8Array]',
4176             '[object Uint8Array]',
4177             '[object Uint8ClampedArray]',
4178             '[object Int16Array]',
4179             '[object Uint16Array]',
4180             '[object Int32Array]',
4181             '[object Uint32Array]',
4182             '[object Float32Array]',
4183             '[object Float64Array]'
4184           ];
4185
4186           var isArrayBufferView =
4187             ArrayBuffer.isView ||
4188             function(obj) {
4189               return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1
4190             };
4191         }
4192
4193         function normalizeName(name) {
4194           if (typeof name !== 'string') {
4195             name = String(name);
4196           }
4197           if (/[^a-z0-9\-#$%&'*+.^_`|~]/i.test(name)) {
4198             throw new TypeError('Invalid character in header field name')
4199           }
4200           return name.toLowerCase()
4201         }
4202
4203         function normalizeValue(value) {
4204           if (typeof value !== 'string') {
4205             value = String(value);
4206           }
4207           return value
4208         }
4209
4210         // Build a destructive iterator for the value list
4211         function iteratorFor(items) {
4212           var iterator = {
4213             next: function() {
4214               var value = items.shift();
4215               return {done: value === undefined, value: value}
4216             }
4217           };
4218
4219           if (support.iterable) {
4220             iterator[Symbol.iterator] = function() {
4221               return iterator
4222             };
4223           }
4224
4225           return iterator
4226         }
4227
4228         function Headers(headers) {
4229           this.map = {};
4230
4231           if (headers instanceof Headers) {
4232             headers.forEach(function(value, name) {
4233               this.append(name, value);
4234             }, this);
4235           } else if (Array.isArray(headers)) {
4236             headers.forEach(function(header) {
4237               this.append(header[0], header[1]);
4238             }, this);
4239           } else if (headers) {
4240             Object.getOwnPropertyNames(headers).forEach(function(name) {
4241               this.append(name, headers[name]);
4242             }, this);
4243           }
4244         }
4245
4246         Headers.prototype.append = function(name, value) {
4247           name = normalizeName(name);
4248           value = normalizeValue(value);
4249           var oldValue = this.map[name];
4250           this.map[name] = oldValue ? oldValue + ', ' + value : value;
4251         };
4252
4253         Headers.prototype['delete'] = function(name) {
4254           delete this.map[normalizeName(name)];
4255         };
4256
4257         Headers.prototype.get = function(name) {
4258           name = normalizeName(name);
4259           return this.has(name) ? this.map[name] : null
4260         };
4261
4262         Headers.prototype.has = function(name) {
4263           return this.map.hasOwnProperty(normalizeName(name))
4264         };
4265
4266         Headers.prototype.set = function(name, value) {
4267           this.map[normalizeName(name)] = normalizeValue(value);
4268         };
4269
4270         Headers.prototype.forEach = function(callback, thisArg) {
4271           for (var name in this.map) {
4272             if (this.map.hasOwnProperty(name)) {
4273               callback.call(thisArg, this.map[name], name, this);
4274             }
4275           }
4276         };
4277
4278         Headers.prototype.keys = function() {
4279           var items = [];
4280           this.forEach(function(value, name) {
4281             items.push(name);
4282           });
4283           return iteratorFor(items)
4284         };
4285
4286         Headers.prototype.values = function() {
4287           var items = [];
4288           this.forEach(function(value) {
4289             items.push(value);
4290           });
4291           return iteratorFor(items)
4292         };
4293
4294         Headers.prototype.entries = function() {
4295           var items = [];
4296           this.forEach(function(value, name) {
4297             items.push([name, value]);
4298           });
4299           return iteratorFor(items)
4300         };
4301
4302         if (support.iterable) {
4303           Headers.prototype[Symbol.iterator] = Headers.prototype.entries;
4304         }
4305
4306         function consumed(body) {
4307           if (body.bodyUsed) {
4308             return Promise.reject(new TypeError('Already read'))
4309           }
4310           body.bodyUsed = true;
4311         }
4312
4313         function fileReaderReady(reader) {
4314           return new Promise(function(resolve, reject) {
4315             reader.onload = function() {
4316               resolve(reader.result);
4317             };
4318             reader.onerror = function() {
4319               reject(reader.error);
4320             };
4321           })
4322         }
4323
4324         function readBlobAsArrayBuffer(blob) {
4325           var reader = new FileReader();
4326           var promise = fileReaderReady(reader);
4327           reader.readAsArrayBuffer(blob);
4328           return promise
4329         }
4330
4331         function readBlobAsText(blob) {
4332           var reader = new FileReader();
4333           var promise = fileReaderReady(reader);
4334           reader.readAsText(blob);
4335           return promise
4336         }
4337
4338         function readArrayBufferAsText(buf) {
4339           var view = new Uint8Array(buf);
4340           var chars = new Array(view.length);
4341
4342           for (var i = 0; i < view.length; i++) {
4343             chars[i] = String.fromCharCode(view[i]);
4344           }
4345           return chars.join('')
4346         }
4347
4348         function bufferClone(buf) {
4349           if (buf.slice) {
4350             return buf.slice(0)
4351           } else {
4352             var view = new Uint8Array(buf.byteLength);
4353             view.set(new Uint8Array(buf));
4354             return view.buffer
4355           }
4356         }
4357
4358         function Body() {
4359           this.bodyUsed = false;
4360
4361           this._initBody = function(body) {
4362             this._bodyInit = body;
4363             if (!body) {
4364               this._bodyText = '';
4365             } else if (typeof body === 'string') {
4366               this._bodyText = body;
4367             } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {
4368               this._bodyBlob = body;
4369             } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {
4370               this._bodyFormData = body;
4371             } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {
4372               this._bodyText = body.toString();
4373             } else if (support.arrayBuffer && support.blob && isDataView(body)) {
4374               this._bodyArrayBuffer = bufferClone(body.buffer);
4375               // IE 10-11 can't handle a DataView body.
4376               this._bodyInit = new Blob([this._bodyArrayBuffer]);
4377             } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {
4378               this._bodyArrayBuffer = bufferClone(body);
4379             } else {
4380               this._bodyText = body = Object.prototype.toString.call(body);
4381             }
4382
4383             if (!this.headers.get('content-type')) {
4384               if (typeof body === 'string') {
4385                 this.headers.set('content-type', 'text/plain;charset=UTF-8');
4386               } else if (this._bodyBlob && this._bodyBlob.type) {
4387                 this.headers.set('content-type', this._bodyBlob.type);
4388               } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {
4389                 this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');
4390               }
4391             }
4392           };
4393
4394           if (support.blob) {
4395             this.blob = function() {
4396               var rejected = consumed(this);
4397               if (rejected) {
4398                 return rejected
4399               }
4400
4401               if (this._bodyBlob) {
4402                 return Promise.resolve(this._bodyBlob)
4403               } else if (this._bodyArrayBuffer) {
4404                 return Promise.resolve(new Blob([this._bodyArrayBuffer]))
4405               } else if (this._bodyFormData) {
4406                 throw new Error('could not read FormData body as blob')
4407               } else {
4408                 return Promise.resolve(new Blob([this._bodyText]))
4409               }
4410             };
4411
4412             this.arrayBuffer = function() {
4413               if (this._bodyArrayBuffer) {
4414                 return consumed(this) || Promise.resolve(this._bodyArrayBuffer)
4415               } else {
4416                 return this.blob().then(readBlobAsArrayBuffer)
4417               }
4418             };
4419           }
4420
4421           this.text = function() {
4422             var rejected = consumed(this);
4423             if (rejected) {
4424               return rejected
4425             }
4426
4427             if (this._bodyBlob) {
4428               return readBlobAsText(this._bodyBlob)
4429             } else if (this._bodyArrayBuffer) {
4430               return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))
4431             } else if (this._bodyFormData) {
4432               throw new Error('could not read FormData body as text')
4433             } else {
4434               return Promise.resolve(this._bodyText)
4435             }
4436           };
4437
4438           if (support.formData) {
4439             this.formData = function() {
4440               return this.text().then(decode)
4441             };
4442           }
4443
4444           this.json = function() {
4445             return this.text().then(JSON.parse)
4446           };
4447
4448           return this
4449         }
4450
4451         // HTTP methods whose capitalization should be normalized
4452         var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT'];
4453
4454         function normalizeMethod(method) {
4455           var upcased = method.toUpperCase();
4456           return methods.indexOf(upcased) > -1 ? upcased : method
4457         }
4458
4459         function Request(input, options) {
4460           options = options || {};
4461           var body = options.body;
4462
4463           if (input instanceof Request) {
4464             if (input.bodyUsed) {
4465               throw new TypeError('Already read')
4466             }
4467             this.url = input.url;
4468             this.credentials = input.credentials;
4469             if (!options.headers) {
4470               this.headers = new Headers(input.headers);
4471             }
4472             this.method = input.method;
4473             this.mode = input.mode;
4474             this.signal = input.signal;
4475             if (!body && input._bodyInit != null) {
4476               body = input._bodyInit;
4477               input.bodyUsed = true;
4478             }
4479           } else {
4480             this.url = String(input);
4481           }
4482
4483           this.credentials = options.credentials || this.credentials || 'same-origin';
4484           if (options.headers || !this.headers) {
4485             this.headers = new Headers(options.headers);
4486           }
4487           this.method = normalizeMethod(options.method || this.method || 'GET');
4488           this.mode = options.mode || this.mode || null;
4489           this.signal = options.signal || this.signal;
4490           this.referrer = null;
4491
4492           if ((this.method === 'GET' || this.method === 'HEAD') && body) {
4493             throw new TypeError('Body not allowed for GET or HEAD requests')
4494           }
4495           this._initBody(body);
4496         }
4497
4498         Request.prototype.clone = function() {
4499           return new Request(this, {body: this._bodyInit})
4500         };
4501
4502         function decode(body) {
4503           var form = new FormData();
4504           body
4505             .trim()
4506             .split('&')
4507             .forEach(function(bytes) {
4508               if (bytes) {
4509                 var split = bytes.split('=');
4510                 var name = split.shift().replace(/\+/g, ' ');
4511                 var value = split.join('=').replace(/\+/g, ' ');
4512                 form.append(decodeURIComponent(name), decodeURIComponent(value));
4513               }
4514             });
4515           return form
4516         }
4517
4518         function parseHeaders(rawHeaders) {
4519           var headers = new Headers();
4520           // Replace instances of \r\n and \n followed by at least one space or horizontal tab with a space
4521           // https://tools.ietf.org/html/rfc7230#section-3.2
4522           var preProcessedHeaders = rawHeaders.replace(/\r?\n[\t ]+/g, ' ');
4523           preProcessedHeaders.split(/\r?\n/).forEach(function(line) {
4524             var parts = line.split(':');
4525             var key = parts.shift().trim();
4526             if (key) {
4527               var value = parts.join(':').trim();
4528               headers.append(key, value);
4529             }
4530           });
4531           return headers
4532         }
4533
4534         Body.call(Request.prototype);
4535
4536         function Response(bodyInit, options) {
4537           if (!options) {
4538             options = {};
4539           }
4540
4541           this.type = 'default';
4542           this.status = options.status === undefined ? 200 : options.status;
4543           this.ok = this.status >= 200 && this.status < 300;
4544           this.statusText = 'statusText' in options ? options.statusText : 'OK';
4545           this.headers = new Headers(options.headers);
4546           this.url = options.url || '';
4547           this._initBody(bodyInit);
4548         }
4549
4550         Body.call(Response.prototype);
4551
4552         Response.prototype.clone = function() {
4553           return new Response(this._bodyInit, {
4554             status: this.status,
4555             statusText: this.statusText,
4556             headers: new Headers(this.headers),
4557             url: this.url
4558           })
4559         };
4560
4561         Response.error = function() {
4562           var response = new Response(null, {status: 0, statusText: ''});
4563           response.type = 'error';
4564           return response
4565         };
4566
4567         var redirectStatuses = [301, 302, 303, 307, 308];
4568
4569         Response.redirect = function(url, status) {
4570           if (redirectStatuses.indexOf(status) === -1) {
4571             throw new RangeError('Invalid status code')
4572           }
4573
4574           return new Response(null, {status: status, headers: {location: url}})
4575         };
4576
4577         var DOMException$1 = self.DOMException;
4578         try {
4579           new DOMException$1();
4580         } catch (err) {
4581           DOMException$1 = function(message, name) {
4582             this.message = message;
4583             this.name = name;
4584             var error = Error(message);
4585             this.stack = error.stack;
4586           };
4587           DOMException$1.prototype = Object.create(Error.prototype);
4588           DOMException$1.prototype.constructor = DOMException$1;
4589         }
4590
4591         function fetch$1(input, init) {
4592           return new Promise(function(resolve, reject) {
4593             var request = new Request(input, init);
4594
4595             if (request.signal && request.signal.aborted) {
4596               return reject(new DOMException$1('Aborted', 'AbortError'))
4597             }
4598
4599             var xhr = new XMLHttpRequest();
4600
4601             function abortXhr() {
4602               xhr.abort();
4603             }
4604
4605             xhr.onload = function() {
4606               var options = {
4607                 status: xhr.status,
4608                 statusText: xhr.statusText,
4609                 headers: parseHeaders(xhr.getAllResponseHeaders() || '')
4610               };
4611               options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL');
4612               var body = 'response' in xhr ? xhr.response : xhr.responseText;
4613               resolve(new Response(body, options));
4614             };
4615
4616             xhr.onerror = function() {
4617               reject(new TypeError('Network request failed'));
4618             };
4619
4620             xhr.ontimeout = function() {
4621               reject(new TypeError('Network request failed'));
4622             };
4623
4624             xhr.onabort = function() {
4625               reject(new DOMException$1('Aborted', 'AbortError'));
4626             };
4627
4628             xhr.open(request.method, request.url, true);
4629
4630             if (request.credentials === 'include') {
4631               xhr.withCredentials = true;
4632             } else if (request.credentials === 'omit') {
4633               xhr.withCredentials = false;
4634             }
4635
4636             if ('responseType' in xhr && support.blob) {
4637               xhr.responseType = 'blob';
4638             }
4639
4640             request.headers.forEach(function(value, name) {
4641               xhr.setRequestHeader(name, value);
4642             });
4643
4644             if (request.signal) {
4645               request.signal.addEventListener('abort', abortXhr);
4646
4647               xhr.onreadystatechange = function() {
4648                 // DONE (success or failure)
4649                 if (xhr.readyState === 4) {
4650                   request.signal.removeEventListener('abort', abortXhr);
4651                 }
4652               };
4653             }
4654
4655             xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit);
4656           })
4657         }
4658
4659         fetch$1.polyfill = true;
4660
4661         if (!self.fetch) {
4662           self.fetch = fetch$1;
4663           self.Headers = Headers;
4664           self.Request = Request;
4665           self.Response = Response;
4666         }
4667
4668         var lib = createCommonjsModule(function (module, exports) {
4669         Object.defineProperty(exports, "__esModule", { value: true });
4670
4671
4672
4673
4674
4675
4676
4677
4678
4679
4680         if (!window.Set) {
4681             window.Set = es6Set;
4682         }
4683         if (!window.Map) {
4684             window.Map = es6Map;
4685         }
4686         if (!window.Promise) {
4687             window.Promise = polyfill$c;
4688             window.Promise._immediateFn = setAsap;
4689         }
4690         if (!Array.prototype.find) {
4691             array_prototype_find.shim();
4692         }
4693         if (!Array.prototype.findIndex) {
4694             array_prototype_findindex.shim();
4695         }
4696         if (!Array.from) {
4697             array_from.shim();
4698         }
4699         if (!Object.values) {
4700             object_values.shim();
4701         }
4702         if (!Object.assign) {
4703             object_assign.shim();
4704         }
4705         if (!window.requestAnimationFrame || !window.cancelAnimationFrame) {
4706             window.requestAnimationFrame = raf_1;
4707             window.cancelAnimationFrame = raf_1.cancel;
4708         }
4709
4710         var finalFetch = window.fetch;
4711         var finalPromise = window.Promise;
4712         window.fetch = function (input, init) {
4713             try {
4714                 return finalFetch(input, init);
4715             }
4716             catch (error) {
4717                 return new finalPromise(function (_, reject) { return reject(error); });
4718             }
4719         };
4720         });
4721
4722         unwrapExports(lib);
4723
4724         (function (factory) {
4725           
4726           factory();
4727         }(function () {
4728           function _classCallCheck(instance, Constructor) {
4729             if (!(instance instanceof Constructor)) {
4730               throw new TypeError("Cannot call a class as a function");
4731             }
4732           }
4733
4734           function _defineProperties(target, props) {
4735             for (var i = 0; i < props.length; i++) {
4736               var descriptor = props[i];
4737               descriptor.enumerable = descriptor.enumerable || false;
4738               descriptor.configurable = true;
4739               if ("value" in descriptor) descriptor.writable = true;
4740               Object.defineProperty(target, descriptor.key, descriptor);
4741             }
4742           }
4743
4744           function _createClass(Constructor, protoProps, staticProps) {
4745             if (protoProps) _defineProperties(Constructor.prototype, protoProps);
4746             if (staticProps) _defineProperties(Constructor, staticProps);
4747             return Constructor;
4748           }
4749
4750           function _inherits(subClass, superClass) {
4751             if (typeof superClass !== "function" && superClass !== null) {
4752               throw new TypeError("Super expression must either be null or a function");
4753             }
4754
4755             subClass.prototype = Object.create(superClass && superClass.prototype, {
4756               constructor: {
4757                 value: subClass,
4758                 writable: true,
4759                 configurable: true
4760               }
4761             });
4762             if (superClass) _setPrototypeOf(subClass, superClass);
4763           }
4764
4765           function _getPrototypeOf(o) {
4766             _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {
4767               return o.__proto__ || Object.getPrototypeOf(o);
4768             };
4769             return _getPrototypeOf(o);
4770           }
4771
4772           function _setPrototypeOf(o, p) {
4773             _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
4774               o.__proto__ = p;
4775               return o;
4776             };
4777
4778             return _setPrototypeOf(o, p);
4779           }
4780
4781           function _assertThisInitialized(self) {
4782             if (self === void 0) {
4783               throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
4784             }
4785
4786             return self;
4787           }
4788
4789           function _possibleConstructorReturn(self, call) {
4790             if (call && (typeof call === "object" || typeof call === "function")) {
4791               return call;
4792             }
4793
4794             return _assertThisInitialized(self);
4795           }
4796
4797           function _superPropBase(object, property) {
4798             while (!Object.prototype.hasOwnProperty.call(object, property)) {
4799               object = _getPrototypeOf(object);
4800               if (object === null) break;
4801             }
4802
4803             return object;
4804           }
4805
4806           function _get(target, property, receiver) {
4807             if (typeof Reflect !== "undefined" && Reflect.get) {
4808               _get = Reflect.get;
4809             } else {
4810               _get = function _get(target, property, receiver) {
4811                 var base = _superPropBase(target, property);
4812
4813                 if (!base) return;
4814                 var desc = Object.getOwnPropertyDescriptor(base, property);
4815
4816                 if (desc.get) {
4817                   return desc.get.call(receiver);
4818                 }
4819
4820                 return desc.value;
4821               };
4822             }
4823
4824             return _get(target, property, receiver || target);
4825           }
4826
4827           var Emitter =
4828           /*#__PURE__*/
4829           function () {
4830             function Emitter() {
4831               _classCallCheck(this, Emitter);
4832
4833               Object.defineProperty(this, 'listeners', {
4834                 value: {},
4835                 writable: true,
4836                 configurable: true
4837               });
4838             }
4839
4840             _createClass(Emitter, [{
4841               key: "addEventListener",
4842               value: function addEventListener(type, callback) {
4843                 if (!(type in this.listeners)) {
4844                   this.listeners[type] = [];
4845                 }
4846
4847                 this.listeners[type].push(callback);
4848               }
4849             }, {
4850               key: "removeEventListener",
4851               value: function removeEventListener(type, callback) {
4852                 if (!(type in this.listeners)) {
4853                   return;
4854                 }
4855
4856                 var stack = this.listeners[type];
4857
4858                 for (var i = 0, l = stack.length; i < l; i++) {
4859                   if (stack[i] === callback) {
4860                     stack.splice(i, 1);
4861                     return;
4862                   }
4863                 }
4864               }
4865             }, {
4866               key: "dispatchEvent",
4867               value: function dispatchEvent(event) {
4868                 var _this = this;
4869
4870                 if (!(event.type in this.listeners)) {
4871                   return;
4872                 }
4873
4874                 var debounce = function debounce(callback) {
4875                   setTimeout(function () {
4876                     return callback.call(_this, event);
4877                   });
4878                 };
4879
4880                 var stack = this.listeners[event.type];
4881
4882                 for (var i = 0, l = stack.length; i < l; i++) {
4883                   debounce(stack[i]);
4884                 }
4885
4886                 return !event.defaultPrevented;
4887               }
4888             }]);
4889
4890             return Emitter;
4891           }();
4892
4893           var AbortSignal =
4894           /*#__PURE__*/
4895           function (_Emitter) {
4896             _inherits(AbortSignal, _Emitter);
4897
4898             function AbortSignal() {
4899               var _this2;
4900
4901               _classCallCheck(this, AbortSignal);
4902
4903               _this2 = _possibleConstructorReturn(this, _getPrototypeOf(AbortSignal).call(this)); // Some versions of babel does not transpile super() correctly for IE <= 10, if the parent
4904               // constructor has failed to run, then "this.listeners" will still be undefined and then we call
4905               // the parent constructor directly instead as a workaround. For general details, see babel bug:
4906               // https://github.com/babel/babel/issues/3041
4907               // This hack was added as a fix for the issue described here:
4908               // https://github.com/Financial-Times/polyfill-library/pull/59#issuecomment-477558042
4909
4910               if (!_this2.listeners) {
4911                 Emitter.call(_assertThisInitialized(_this2));
4912               } // Compared to assignment, Object.defineProperty makes properties non-enumerable by default and
4913               // we want Object.keys(new AbortController().signal) to be [] for compat with the native impl
4914
4915
4916               Object.defineProperty(_assertThisInitialized(_this2), 'aborted', {
4917                 value: false,
4918                 writable: true,
4919                 configurable: true
4920               });
4921               Object.defineProperty(_assertThisInitialized(_this2), 'onabort', {
4922                 value: null,
4923                 writable: true,
4924                 configurable: true
4925               });
4926               return _this2;
4927             }
4928
4929             _createClass(AbortSignal, [{
4930               key: "toString",
4931               value: function toString() {
4932                 return '[object AbortSignal]';
4933               }
4934             }, {
4935               key: "dispatchEvent",
4936               value: function dispatchEvent(event) {
4937                 if (event.type === 'abort') {
4938                   this.aborted = true;
4939
4940                   if (typeof this.onabort === 'function') {
4941                     this.onabort.call(this, event);
4942                   }
4943                 }
4944
4945                 _get(_getPrototypeOf(AbortSignal.prototype), "dispatchEvent", this).call(this, event);
4946               }
4947             }]);
4948
4949             return AbortSignal;
4950           }(Emitter);
4951           var AbortController =
4952           /*#__PURE__*/
4953           function () {
4954             function AbortController() {
4955               _classCallCheck(this, AbortController);
4956
4957               // Compared to assignment, Object.defineProperty makes properties non-enumerable by default and
4958               // we want Object.keys(new AbortController()) to be [] for compat with the native impl
4959               Object.defineProperty(this, 'signal', {
4960                 value: new AbortSignal(),
4961                 writable: true,
4962                 configurable: true
4963               });
4964             }
4965
4966             _createClass(AbortController, [{
4967               key: "abort",
4968               value: function abort() {
4969                 var event;
4970
4971                 try {
4972                   event = new Event('abort');
4973                 } catch (e) {
4974                   if (typeof document !== 'undefined') {
4975                     if (!document.createEvent) {
4976                       // For Internet Explorer 8:
4977                       event = document.createEventObject();
4978                       event.type = 'abort';
4979                     } else {
4980                       // For Internet Explorer 11:
4981                       event = document.createEvent('Event');
4982                       event.initEvent('abort', false, false);
4983                     }
4984                   } else {
4985                     // Fallback where document isn't available:
4986                     event = {
4987                       type: 'abort',
4988                       bubbles: false,
4989                       cancelable: false
4990                     };
4991                   }
4992                 }
4993
4994                 this.signal.dispatchEvent(event);
4995               }
4996             }, {
4997               key: "toString",
4998               value: function toString() {
4999                 return '[object AbortController]';
5000               }
5001             }]);
5002
5003             return AbortController;
5004           }();
5005
5006           if (typeof Symbol !== 'undefined' && Symbol.toStringTag) {
5007             // These are necessary to make sure that we get correct output for:
5008             // Object.prototype.toString.call(new AbortController())
5009             AbortController.prototype[Symbol.toStringTag] = 'AbortController';
5010             AbortSignal.prototype[Symbol.toStringTag] = 'AbortSignal';
5011           }
5012
5013           function polyfillNeeded(self) {
5014             if (self.__FORCE_INSTALL_ABORTCONTROLLER_POLYFILL) {
5015               console.log('__FORCE_INSTALL_ABORTCONTROLLER_POLYFILL=true is set, will force install polyfill');
5016               return true;
5017             } // Note that the "unfetch" minimal fetch polyfill defines fetch() without
5018             // defining window.Request, and this polyfill need to work on top of unfetch
5019             // so the below feature detection needs the !self.AbortController part.
5020             // The Request.prototype check is also needed because Safari versions 11.1.2
5021             // up to and including 12.1.x has a window.AbortController present but still
5022             // does NOT correctly implement abortable fetch:
5023             // https://bugs.webkit.org/show_bug.cgi?id=174980#c2
5024
5025
5026             return typeof self.Request === 'function' && !self.Request.prototype.hasOwnProperty('signal') || !self.AbortController;
5027           }
5028
5029           /**
5030            * Note: the "fetch.Request" default value is available for fetch imported from
5031            * the "node-fetch" package and not in browsers. This is OK since browsers
5032            * will be importing umd-polyfill.js from that path "self" is passed the
5033            * decorator so the default value will not be used (because browsers that define
5034            * fetch also has Request). One quirky setup where self.fetch exists but
5035            * self.Request does not is when the "unfetch" minimal fetch polyfill is used
5036            * on top of IE11; for this case the browser will try to use the fetch.Request
5037            * default value which in turn will be undefined but then then "if (Request)"
5038            * will ensure that you get a patched fetch but still no Request (as expected).
5039            * @param {fetch, Request = fetch.Request}
5040            * @returns {fetch: abortableFetch, Request: AbortableRequest}
5041            */
5042
5043           function abortableFetchDecorator(patchTargets) {
5044             if ('function' === typeof patchTargets) {
5045               patchTargets = {
5046                 fetch: patchTargets
5047               };
5048             }
5049
5050             var _patchTargets = patchTargets,
5051                 fetch = _patchTargets.fetch,
5052                 _patchTargets$Request = _patchTargets.Request,
5053                 NativeRequest = _patchTargets$Request === void 0 ? fetch.Request : _patchTargets$Request,
5054                 NativeAbortController = _patchTargets.AbortController,
5055                 _patchTargets$__FORCE = _patchTargets.__FORCE_INSTALL_ABORTCONTROLLER_POLYFILL,
5056                 __FORCE_INSTALL_ABORTCONTROLLER_POLYFILL = _patchTargets$__FORCE === void 0 ? false : _patchTargets$__FORCE;
5057
5058             if (!polyfillNeeded({
5059               fetch: fetch,
5060               Request: NativeRequest,
5061               AbortController: NativeAbortController,
5062               __FORCE_INSTALL_ABORTCONTROLLER_POLYFILL: __FORCE_INSTALL_ABORTCONTROLLER_POLYFILL
5063             })) {
5064               return {
5065                 fetch: fetch,
5066                 Request: Request
5067               };
5068             }
5069
5070             var Request = NativeRequest; // Note that the "unfetch" minimal fetch polyfill defines fetch() without
5071             // defining window.Request, and this polyfill need to work on top of unfetch
5072             // hence we only patch it if it's available. Also we don't patch it if signal
5073             // is already available on the Request prototype because in this case support
5074             // is present and the patching below can cause a crash since it assigns to
5075             // request.signal which is technically a read-only property. This latter error
5076             // happens when you run the main5.js node-fetch example in the repo
5077             // "abortcontroller-polyfill-examples". The exact error is:
5078             //   request.signal = init.signal;
5079             //   ^
5080             // TypeError: Cannot set property signal of #<Request> which has only a getter
5081
5082             if (Request && !Request.prototype.hasOwnProperty('signal') || __FORCE_INSTALL_ABORTCONTROLLER_POLYFILL) {
5083               Request = function Request(input, init) {
5084                 var signal;
5085
5086                 if (init && init.signal) {
5087                   signal = init.signal; // Never pass init.signal to the native Request implementation when the polyfill has
5088                   // been installed because if we're running on top of a browser with a
5089                   // working native AbortController (i.e. the polyfill was installed due to
5090                   // __FORCE_INSTALL_ABORTCONTROLLER_POLYFILL being set), then passing our
5091                   // fake AbortSignal to the native fetch will trigger:
5092                   // TypeError: Failed to construct 'Request': member signal is not of type AbortSignal.
5093
5094                   delete init.signal;
5095                 }
5096
5097                 var request = new NativeRequest(input, init);
5098
5099                 if (signal) {
5100                   Object.defineProperty(request, 'signal', {
5101                     writable: false,
5102                     enumerable: false,
5103                     configurable: true,
5104                     value: signal
5105                   });
5106                 }
5107
5108                 return request;
5109               };
5110
5111               Request.prototype = NativeRequest.prototype;
5112             }
5113
5114             var realFetch = fetch;
5115
5116             var abortableFetch = function abortableFetch(input, init) {
5117               var signal = Request && Request.prototype.isPrototypeOf(input) ? input.signal : init ? init.signal : undefined;
5118
5119               if (signal) {
5120                 var abortError;
5121
5122                 try {
5123                   abortError = new DOMException('Aborted', 'AbortError');
5124                 } catch (err) {
5125                   // IE 11 does not support calling the DOMException constructor, use a
5126                   // regular error object on it instead.
5127                   abortError = new Error('Aborted');
5128                   abortError.name = 'AbortError';
5129                 } // Return early if already aborted, thus avoiding making an HTTP request
5130
5131
5132                 if (signal.aborted) {
5133                   return Promise.reject(abortError);
5134                 } // Turn an event into a promise, reject it once `abort` is dispatched
5135
5136
5137                 var cancellation = new Promise(function (_, reject) {
5138                   signal.addEventListener('abort', function () {
5139                     return reject(abortError);
5140                   }, {
5141                     once: true
5142                   });
5143                 });
5144
5145                 if (init && init.signal) {
5146                   // Never pass .signal to the native implementation when the polyfill has
5147                   // been installed because if we're running on top of a browser with a
5148                   // working native AbortController (i.e. the polyfill was installed due to
5149                   // __FORCE_INSTALL_ABORTCONTROLLER_POLYFILL being set), then passing our
5150                   // fake AbortSignal to the native fetch will trigger:
5151                   // TypeError: Failed to execute 'fetch' on 'Window': member signal is not of type AbortSignal.
5152                   delete init.signal;
5153                 } // Return the fastest promise (don't need to wait for request to finish)
5154
5155
5156                 return Promise.race([cancellation, realFetch(input, init)]);
5157               }
5158
5159               return realFetch(input, init);
5160             };
5161
5162             return {
5163               fetch: abortableFetch,
5164               Request: Request
5165             };
5166           }
5167
5168           (function (self) {
5169
5170             if (!polyfillNeeded(self)) {
5171               return;
5172             }
5173
5174             if (!self.fetch) {
5175               console.warn('fetch() is not available, cannot install abortcontroller-polyfill');
5176               return;
5177             }
5178
5179             var _abortableFetch = abortableFetchDecorator(self),
5180                 fetch = _abortableFetch.fetch,
5181                 Request = _abortableFetch.Request;
5182
5183             self.fetch = fetch;
5184             self.Request = Request;
5185             Object.defineProperty(self, 'AbortController', {
5186               writable: true,
5187               enumerable: false,
5188               configurable: true,
5189               value: AbortController
5190             });
5191             Object.defineProperty(self, 'AbortSignal', {
5192               writable: true,
5193               enumerable: false,
5194               configurable: true,
5195               value: AbortSignal
5196             });
5197           })(typeof self !== 'undefined' ? self : commonjsGlobal);
5198
5199         }));
5200
5201         var version = "5.9.2";
5202
5203         function d3_ascending(a, b) {
5204           return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
5205         }
5206
5207         function d3_bisector(compare) {
5208           if (compare.length === 1) compare = ascendingComparator(compare);
5209           return {
5210             left: function(a, x, lo, hi) {
5211               if (lo == null) lo = 0;
5212               if (hi == null) hi = a.length;
5213               while (lo < hi) {
5214                 var mid = lo + hi >>> 1;
5215                 if (compare(a[mid], x) < 0) lo = mid + 1;
5216                 else hi = mid;
5217               }
5218               return lo;
5219             },
5220             right: function(a, x, lo, hi) {
5221               if (lo == null) lo = 0;
5222               if (hi == null) hi = a.length;
5223               while (lo < hi) {
5224                 var mid = lo + hi >>> 1;
5225                 if (compare(a[mid], x) > 0) hi = mid;
5226                 else lo = mid + 1;
5227               }
5228               return lo;
5229             }
5230           };
5231         }
5232
5233         function ascendingComparator(f) {
5234           return function(d, x) {
5235             return d3_ascending(f(d), x);
5236           };
5237         }
5238
5239         var ascendingBisect = d3_bisector(d3_ascending);
5240         var bisectRight = ascendingBisect.right;
5241         var bisectLeft = ascendingBisect.left;
5242
5243         function pairs(array, f) {
5244           if (f == null) f = pair;
5245           var i = 0, n = array.length - 1, p = array[0], pairs = new Array(n < 0 ? 0 : n);
5246           while (i < n) pairs[i] = f(p, p = array[++i]);
5247           return pairs;
5248         }
5249
5250         function pair(a, b) {
5251           return [a, b];
5252         }
5253
5254         function cross(values0, values1, reduce) {
5255           var n0 = values0.length,
5256               n1 = values1.length,
5257               values = new Array(n0 * n1),
5258               i0,
5259               i1,
5260               i,
5261               value0;
5262
5263           if (reduce == null) reduce = pair;
5264
5265           for (i0 = i = 0; i0 < n0; ++i0) {
5266             for (value0 = values0[i0], i1 = 0; i1 < n1; ++i1, ++i) {
5267               values[i] = reduce(value0, values1[i1]);
5268             }
5269           }
5270
5271           return values;
5272         }
5273
5274         function d3_descending(a, b) {
5275           return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
5276         }
5277
5278         function number(x) {
5279           return x === null ? NaN : +x;
5280         }
5281
5282         function variance(values, valueof) {
5283           var n = values.length,
5284               m = 0,
5285               i = -1,
5286               mean = 0,
5287               value,
5288               delta,
5289               sum = 0;
5290
5291           if (valueof == null) {
5292             while (++i < n) {
5293               if (!isNaN(value = number(values[i]))) {
5294                 delta = value - mean;
5295                 mean += delta / ++m;
5296                 sum += delta * (value - mean);
5297               }
5298             }
5299           }
5300
5301           else {
5302             while (++i < n) {
5303               if (!isNaN(value = number(valueof(values[i], i, values)))) {
5304                 delta = value - mean;
5305                 mean += delta / ++m;
5306                 sum += delta * (value - mean);
5307               }
5308             }
5309           }
5310
5311           if (m > 1) return sum / (m - 1);
5312         }
5313
5314         function deviation(array, f) {
5315           var v = variance(array, f);
5316           return v ? Math.sqrt(v) : v;
5317         }
5318
5319         function extent(values, valueof) {
5320           var n = values.length,
5321               i = -1,
5322               value,
5323               min,
5324               max;
5325
5326           if (valueof == null) {
5327             while (++i < n) { // Find the first comparable value.
5328               if ((value = values[i]) != null && value >= value) {
5329                 min = max = value;
5330                 while (++i < n) { // Compare the remaining values.
5331                   if ((value = values[i]) != null) {
5332                     if (min > value) min = value;
5333                     if (max < value) max = value;
5334                   }
5335                 }
5336               }
5337             }
5338           }
5339
5340           else {
5341             while (++i < n) { // Find the first comparable value.
5342               if ((value = valueof(values[i], i, values)) != null && value >= value) {
5343                 min = max = value;
5344                 while (++i < n) { // Compare the remaining values.
5345                   if ((value = valueof(values[i], i, values)) != null) {
5346                     if (min > value) min = value;
5347                     if (max < value) max = value;
5348                   }
5349                 }
5350               }
5351             }
5352           }
5353
5354           return [min, max];
5355         }
5356
5357         var array$1 = Array.prototype;
5358
5359         var slice$4 = array$1.slice;
5360         var map$2 = array$1.map;
5361
5362         function constant(x) {
5363           return function() {
5364             return x;
5365           };
5366         }
5367
5368         function identity(x) {
5369           return x;
5370         }
5371
5372         function d3_range(start, stop, step) {
5373           start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step;
5374
5375           var i = -1,
5376               n = Math.max(0, Math.ceil((stop - start) / step)) | 0,
5377               range = new Array(n);
5378
5379           while (++i < n) {
5380             range[i] = start + i * step;
5381           }
5382
5383           return range;
5384         }
5385
5386         var e10 = Math.sqrt(50),
5387             e5 = Math.sqrt(10),
5388             e2 = Math.sqrt(2);
5389
5390         function ticks(start, stop, count) {
5391           var reverse,
5392               i = -1,
5393               n,
5394               ticks,
5395               step;
5396
5397           stop = +stop, start = +start, count = +count;
5398           if (start === stop && count > 0) return [start];
5399           if (reverse = stop < start) n = start, start = stop, stop = n;
5400           if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) return [];
5401
5402           if (step > 0) {
5403             start = Math.ceil(start / step);
5404             stop = Math.floor(stop / step);
5405             ticks = new Array(n = Math.ceil(stop - start + 1));
5406             while (++i < n) ticks[i] = (start + i) * step;
5407           } else {
5408             start = Math.floor(start * step);
5409             stop = Math.ceil(stop * step);
5410             ticks = new Array(n = Math.ceil(start - stop + 1));
5411             while (++i < n) ticks[i] = (start - i) / step;
5412           }
5413
5414           if (reverse) ticks.reverse();
5415
5416           return ticks;
5417         }
5418
5419         function tickIncrement(start, stop, count) {
5420           var step = (stop - start) / Math.max(0, count),
5421               power = Math.floor(Math.log(step) / Math.LN10),
5422               error = step / Math.pow(10, power);
5423           return power >= 0
5424               ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power)
5425               : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1);
5426         }
5427
5428         function tickStep(start, stop, count) {
5429           var step0 = Math.abs(stop - start) / Math.max(0, count),
5430               step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)),
5431               error = step0 / step1;
5432           if (error >= e10) step1 *= 10;
5433           else if (error >= e5) step1 *= 5;
5434           else if (error >= e2) step1 *= 2;
5435           return stop < start ? -step1 : step1;
5436         }
5437
5438         function thresholdSturges(values) {
5439           return Math.ceil(Math.log(values.length) / Math.LN2) + 1;
5440         }
5441
5442         function histogram() {
5443           var value = identity,
5444               domain = extent,
5445               threshold = thresholdSturges;
5446
5447           function histogram(data) {
5448             var i,
5449                 n = data.length,
5450                 x,
5451                 values = new Array(n);
5452
5453             for (i = 0; i < n; ++i) {
5454               values[i] = value(data[i], i, data);
5455             }
5456
5457             var xz = domain(values),
5458                 x0 = xz[0],
5459                 x1 = xz[1],
5460                 tz = threshold(values, x0, x1);
5461
5462             // Convert number of thresholds into uniform thresholds.
5463             if (!Array.isArray(tz)) {
5464               tz = tickStep(x0, x1, tz);
5465               tz = d3_range(Math.ceil(x0 / tz) * tz, x1, tz); // exclusive
5466             }
5467
5468             // Remove any thresholds outside the domain.
5469             var m = tz.length;
5470             while (tz[0] <= x0) tz.shift(), --m;
5471             while (tz[m - 1] > x1) tz.pop(), --m;
5472
5473             var bins = new Array(m + 1),
5474                 bin;
5475
5476             // Initialize bins.
5477             for (i = 0; i <= m; ++i) {
5478               bin = bins[i] = [];
5479               bin.x0 = i > 0 ? tz[i - 1] : x0;
5480               bin.x1 = i < m ? tz[i] : x1;
5481             }
5482
5483             // Assign data to bins by value, ignoring any outside the domain.
5484             for (i = 0; i < n; ++i) {
5485               x = values[i];
5486               if (x0 <= x && x <= x1) {
5487                 bins[bisectRight(tz, x, 0, m)].push(data[i]);
5488               }
5489             }
5490
5491             return bins;
5492           }
5493
5494           histogram.value = function(_) {
5495             return arguments.length ? (value = typeof _ === "function" ? _ : constant(_), histogram) : value;
5496           };
5497
5498           histogram.domain = function(_) {
5499             return arguments.length ? (domain = typeof _ === "function" ? _ : constant([_[0], _[1]]), histogram) : domain;
5500           };
5501
5502           histogram.thresholds = function(_) {
5503             return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant(slice$4.call(_)) : constant(_), histogram) : threshold;
5504           };
5505
5506           return histogram;
5507         }
5508
5509         function threshold(values, p, valueof) {
5510           if (valueof == null) valueof = number;
5511           if (!(n = values.length)) return;
5512           if ((p = +p) <= 0 || n < 2) return +valueof(values[0], 0, values);
5513           if (p >= 1) return +valueof(values[n - 1], n - 1, values);
5514           var n,
5515               i = (n - 1) * p,
5516               i0 = Math.floor(i),
5517               value0 = +valueof(values[i0], i0, values),
5518               value1 = +valueof(values[i0 + 1], i0 + 1, values);
5519           return value0 + (value1 - value0) * (i - i0);
5520         }
5521
5522         function freedmanDiaconis(values, min, max) {
5523           values = map$2.call(values, number).sort(d3_ascending);
5524           return Math.ceil((max - min) / (2 * (threshold(values, 0.75) - threshold(values, 0.25)) * Math.pow(values.length, -1 / 3)));
5525         }
5526
5527         function scott(values, min, max) {
5528           return Math.ceil((max - min) / (3.5 * deviation(values) * Math.pow(values.length, -1 / 3)));
5529         }
5530
5531         function max$2(values, valueof) {
5532           var n = values.length,
5533               i = -1,
5534               value,
5535               max;
5536
5537           if (valueof == null) {
5538             while (++i < n) { // Find the first comparable value.
5539               if ((value = values[i]) != null && value >= value) {
5540                 max = value;
5541                 while (++i < n) { // Compare the remaining values.
5542                   if ((value = values[i]) != null && value > max) {
5543                     max = value;
5544                   }
5545                 }
5546               }
5547             }
5548           }
5549
5550           else {
5551             while (++i < n) { // Find the first comparable value.
5552               if ((value = valueof(values[i], i, values)) != null && value >= value) {
5553                 max = value;
5554                 while (++i < n) { // Compare the remaining values.
5555                   if ((value = valueof(values[i], i, values)) != null && value > max) {
5556                     max = value;
5557                   }
5558                 }
5559               }
5560             }
5561           }
5562
5563           return max;
5564         }
5565
5566         function mean(values, valueof) {
5567           var n = values.length,
5568               m = n,
5569               i = -1,
5570               value,
5571               sum = 0;
5572
5573           if (valueof == null) {
5574             while (++i < n) {
5575               if (!isNaN(value = number(values[i]))) sum += value;
5576               else --m;
5577             }
5578           }
5579
5580           else {
5581             while (++i < n) {
5582               if (!isNaN(value = number(valueof(values[i], i, values)))) sum += value;
5583               else --m;
5584             }
5585           }
5586
5587           if (m) return sum / m;
5588         }
5589
5590         function d3_median(values, valueof) {
5591           var n = values.length,
5592               i = -1,
5593               value,
5594               numbers = [];
5595
5596           if (valueof == null) {
5597             while (++i < n) {
5598               if (!isNaN(value = number(values[i]))) {
5599                 numbers.push(value);
5600               }
5601             }
5602           }
5603
5604           else {
5605             while (++i < n) {
5606               if (!isNaN(value = number(valueof(values[i], i, values)))) {
5607                 numbers.push(value);
5608               }
5609             }
5610           }
5611
5612           return threshold(numbers.sort(d3_ascending), 0.5);
5613         }
5614
5615         function merge(arrays) {
5616           var n = arrays.length,
5617               m,
5618               i = -1,
5619               j = 0,
5620               merged,
5621               array;
5622
5623           while (++i < n) j += arrays[i].length;
5624           merged = new Array(j);
5625
5626           while (--n >= 0) {
5627             array = arrays[n];
5628             m = array.length;
5629             while (--m >= 0) {
5630               merged[--j] = array[m];
5631             }
5632           }
5633
5634           return merged;
5635         }
5636
5637         function min(values, valueof) {
5638           var n = values.length,
5639               i = -1,
5640               value,
5641               min;
5642
5643           if (valueof == null) {
5644             while (++i < n) { // Find the first comparable value.
5645               if ((value = values[i]) != null && value >= value) {
5646                 min = value;
5647                 while (++i < n) { // Compare the remaining values.
5648                   if ((value = values[i]) != null && min > value) {
5649                     min = value;
5650                   }
5651                 }
5652               }
5653             }
5654           }
5655
5656           else {
5657             while (++i < n) { // Find the first comparable value.
5658               if ((value = valueof(values[i], i, values)) != null && value >= value) {
5659                 min = value;
5660                 while (++i < n) { // Compare the remaining values.
5661                   if ((value = valueof(values[i], i, values)) != null && min > value) {
5662                     min = value;
5663                   }
5664                 }
5665               }
5666             }
5667           }
5668
5669           return min;
5670         }
5671
5672         function permute(array, indexes) {
5673           var i = indexes.length, permutes = new Array(i);
5674           while (i--) permutes[i] = array[indexes[i]];
5675           return permutes;
5676         }
5677
5678         function scan(values, compare) {
5679           if (!(n = values.length)) return;
5680           var n,
5681               i = 0,
5682               j = 0,
5683               xi,
5684               xj = values[j];
5685
5686           if (compare == null) compare = d3_ascending;
5687
5688           while (++i < n) {
5689             if (compare(xi = values[i], xj) < 0 || compare(xj, xj) !== 0) {
5690               xj = xi, j = i;
5691             }
5692           }
5693
5694           if (compare(xj, xj) === 0) return j;
5695         }
5696
5697         function shuffle(array, i0, i1) {
5698           var m = (i1 == null ? array.length : i1) - (i0 = i0 == null ? 0 : +i0),
5699               t,
5700               i;
5701
5702           while (m) {
5703             i = Math.random() * m-- | 0;
5704             t = array[m + i0];
5705             array[m + i0] = array[i + i0];
5706             array[i + i0] = t;
5707           }
5708
5709           return array;
5710         }
5711
5712         function sum(values, valueof) {
5713           var n = values.length,
5714               i = -1,
5715               value,
5716               sum = 0;
5717
5718           if (valueof == null) {
5719             while (++i < n) {
5720               if (value = +values[i]) sum += value; // Note: zero and null are equivalent.
5721             }
5722           }
5723
5724           else {
5725             while (++i < n) {
5726               if (value = +valueof(values[i], i, values)) sum += value;
5727             }
5728           }
5729
5730           return sum;
5731         }
5732
5733         function transpose(matrix) {
5734           if (!(n = matrix.length)) return [];
5735           for (var i = -1, m = min(matrix, length), transpose = new Array(m); ++i < m;) {
5736             for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n;) {
5737               row[j] = matrix[j][i];
5738             }
5739           }
5740           return transpose;
5741         }
5742
5743         function length(d) {
5744           return d.length;
5745         }
5746
5747         function zip() {
5748           return transpose(arguments);
5749         }
5750
5751         var slice$5 = Array.prototype.slice;
5752
5753         function identity$1(x) {
5754           return x;
5755         }
5756
5757         var top = 1,
5758             right = 2,
5759             bottom = 3,
5760             left = 4,
5761             epsilon = 1e-6;
5762
5763         function translateX(x) {
5764           return "translate(" + (x + 0.5) + ",0)";
5765         }
5766
5767         function translateY(y) {
5768           return "translate(0," + (y + 0.5) + ")";
5769         }
5770
5771         function number$1(scale) {
5772           return function(d) {
5773             return +scale(d);
5774           };
5775         }
5776
5777         function center(scale) {
5778           var offset = Math.max(0, scale.bandwidth() - 1) / 2; // Adjust for 0.5px offset.
5779           if (scale.round()) offset = Math.round(offset);
5780           return function(d) {
5781             return +scale(d) + offset;
5782           };
5783         }
5784
5785         function entering() {
5786           return !this.__axis;
5787         }
5788
5789         function axis(orient, scale) {
5790           var tickArguments = [],
5791               tickValues = null,
5792               tickFormat = null,
5793               tickSizeInner = 6,
5794               tickSizeOuter = 6,
5795               tickPadding = 3,
5796               k = orient === top || orient === left ? -1 : 1,
5797               x = orient === left || orient === right ? "x" : "y",
5798               transform = orient === top || orient === bottom ? translateX : translateY;
5799
5800           function axis(context) {
5801             var values = tickValues == null ? (scale.ticks ? scale.ticks.apply(scale, tickArguments) : scale.domain()) : tickValues,
5802                 format = tickFormat == null ? (scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments) : identity$1) : tickFormat,
5803                 spacing = Math.max(tickSizeInner, 0) + tickPadding,
5804                 range = scale.range(),
5805                 range0 = +range[0] + 0.5,
5806                 range1 = +range[range.length - 1] + 0.5,
5807                 position = (scale.bandwidth ? center : number$1)(scale.copy()),
5808                 selection = context.selection ? context.selection() : context,
5809                 path = selection.selectAll(".domain").data([null]),
5810                 tick = selection.selectAll(".tick").data(values, scale).order(),
5811                 tickExit = tick.exit(),
5812                 tickEnter = tick.enter().append("g").attr("class", "tick"),
5813                 line = tick.select("line"),
5814                 text = tick.select("text");
5815
5816             path = path.merge(path.enter().insert("path", ".tick")
5817                 .attr("class", "domain")
5818                 .attr("stroke", "currentColor"));
5819
5820             tick = tick.merge(tickEnter);
5821
5822             line = line.merge(tickEnter.append("line")
5823                 .attr("stroke", "currentColor")
5824                 .attr(x + "2", k * tickSizeInner));
5825
5826             text = text.merge(tickEnter.append("text")
5827                 .attr("fill", "currentColor")
5828                 .attr(x, k * spacing)
5829                 .attr("dy", orient === top ? "0em" : orient === bottom ? "0.71em" : "0.32em"));
5830
5831             if (context !== selection) {
5832               path = path.transition(context);
5833               tick = tick.transition(context);
5834               line = line.transition(context);
5835               text = text.transition(context);
5836
5837               tickExit = tickExit.transition(context)
5838                   .attr("opacity", epsilon)
5839                   .attr("transform", function(d) { return isFinite(d = position(d)) ? transform(d) : this.getAttribute("transform"); });
5840
5841               tickEnter
5842                   .attr("opacity", epsilon)
5843                   .attr("transform", function(d) { var p = this.parentNode.__axis; return transform(p && isFinite(p = p(d)) ? p : position(d)); });
5844             }
5845
5846             tickExit.remove();
5847
5848             path
5849                 .attr("d", orient === left || orient == right
5850                     ? (tickSizeOuter ? "M" + k * tickSizeOuter + "," + range0 + "H0.5V" + range1 + "H" + k * tickSizeOuter : "M0.5," + range0 + "V" + range1)
5851                     : (tickSizeOuter ? "M" + range0 + "," + k * tickSizeOuter + "V0.5H" + range1 + "V" + k * tickSizeOuter : "M" + range0 + ",0.5H" + range1));
5852
5853             tick
5854                 .attr("opacity", 1)
5855                 .attr("transform", function(d) { return transform(position(d)); });
5856
5857             line
5858                 .attr(x + "2", k * tickSizeInner);
5859
5860             text
5861                 .attr(x, k * spacing)
5862                 .text(format);
5863
5864             selection.filter(entering)
5865                 .attr("fill", "none")
5866                 .attr("font-size", 10)
5867                 .attr("font-family", "sans-serif")
5868                 .attr("text-anchor", orient === right ? "start" : orient === left ? "end" : "middle");
5869
5870             selection
5871                 .each(function() { this.__axis = position; });
5872           }
5873
5874           axis.scale = function(_) {
5875             return arguments.length ? (scale = _, axis) : scale;
5876           };
5877
5878           axis.ticks = function() {
5879             return tickArguments = slice$5.call(arguments), axis;
5880           };
5881
5882           axis.tickArguments = function(_) {
5883             return arguments.length ? (tickArguments = _ == null ? [] : slice$5.call(_), axis) : tickArguments.slice();
5884           };
5885
5886           axis.tickValues = function(_) {
5887             return arguments.length ? (tickValues = _ == null ? null : slice$5.call(_), axis) : tickValues && tickValues.slice();
5888           };
5889
5890           axis.tickFormat = function(_) {
5891             return arguments.length ? (tickFormat = _, axis) : tickFormat;
5892           };
5893
5894           axis.tickSize = function(_) {
5895             return arguments.length ? (tickSizeInner = tickSizeOuter = +_, axis) : tickSizeInner;
5896           };
5897
5898           axis.tickSizeInner = function(_) {
5899             return arguments.length ? (tickSizeInner = +_, axis) : tickSizeInner;
5900           };
5901
5902           axis.tickSizeOuter = function(_) {
5903             return arguments.length ? (tickSizeOuter = +_, axis) : tickSizeOuter;
5904           };
5905
5906           axis.tickPadding = function(_) {
5907             return arguments.length ? (tickPadding = +_, axis) : tickPadding;
5908           };
5909
5910           return axis;
5911         }
5912
5913         function axisTop(scale) {
5914           return axis(top, scale);
5915         }
5916
5917         function axisRight(scale) {
5918           return axis(right, scale);
5919         }
5920
5921         function axisBottom(scale) {
5922           return axis(bottom, scale);
5923         }
5924
5925         function axisLeft(scale) {
5926           return axis(left, scale);
5927         }
5928
5929         var noop$2 = {value: function() {}};
5930
5931         function dispatch() {
5932           for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {
5933             if (!(t = arguments[i] + "") || (t in _)) throw new Error("illegal type: " + t);
5934             _[t] = [];
5935           }
5936           return new Dispatch(_);
5937         }
5938
5939         function Dispatch(_) {
5940           this._ = _;
5941         }
5942
5943         function parseTypenames(typenames, types) {
5944           return typenames.trim().split(/^|\s+/).map(function(t) {
5945             var name = "", i = t.indexOf(".");
5946             if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);
5947             if (t && !types.hasOwnProperty(t)) throw new Error("unknown type: " + t);
5948             return {type: t, name: name};
5949           });
5950         }
5951
5952         Dispatch.prototype = dispatch.prototype = {
5953           constructor: Dispatch,
5954           on: function(typename, callback) {
5955             var _ = this._,
5956                 T = parseTypenames(typename + "", _),
5957                 t,
5958                 i = -1,
5959                 n = T.length;
5960
5961             // If no callback was specified, return the callback of the given type and name.
5962             if (arguments.length < 2) {
5963               while (++i < n) if ((t = (typename = T[i]).type) && (t = get$1(_[t], typename.name))) return t;
5964               return;
5965             }
5966
5967             // If a type was specified, set the callback for the given type and name.
5968             // Otherwise, if a null callback was specified, remove callbacks of the given name.
5969             if (callback != null && typeof callback !== "function") throw new Error("invalid callback: " + callback);
5970             while (++i < n) {
5971               if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback);
5972               else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null);
5973             }
5974
5975             return this;
5976           },
5977           copy: function() {
5978             var copy = {}, _ = this._;
5979             for (var t in _) copy[t] = _[t].slice();
5980             return new Dispatch(copy);
5981           },
5982           call: function(type, that) {
5983             if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2];
5984             if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type);
5985             for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);
5986           },
5987           apply: function(type, that, args) {
5988             if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type);
5989             for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);
5990           }
5991         };
5992
5993         function get$1(type, name) {
5994           for (var i = 0, n = type.length, c; i < n; ++i) {
5995             if ((c = type[i]).name === name) {
5996               return c.value;
5997             }
5998           }
5999         }
6000
6001         function set(type, name, callback) {
6002           for (var i = 0, n = type.length; i < n; ++i) {
6003             if (type[i].name === name) {
6004               type[i] = noop$2, type = type.slice(0, i).concat(type.slice(i + 1));
6005               break;
6006             }
6007           }
6008           if (callback != null) type.push({name: name, value: callback});
6009           return type;
6010         }
6011
6012         var xhtml = "http://www.w3.org/1999/xhtml";
6013
6014         var namespaces = {
6015           svg: "http://www.w3.org/2000/svg",
6016           xhtml: xhtml,
6017           xlink: "http://www.w3.org/1999/xlink",
6018           xml: "http://www.w3.org/XML/1998/namespace",
6019           xmlns: "http://www.w3.org/2000/xmlns/"
6020         };
6021
6022         function namespace(name) {
6023           var prefix = name += "", i = prefix.indexOf(":");
6024           if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns") name = name.slice(i + 1);
6025           return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name;
6026         }
6027
6028         function creatorInherit(name) {
6029           return function() {
6030             var document = this.ownerDocument,
6031                 uri = this.namespaceURI;
6032             return uri === xhtml && document.documentElement.namespaceURI === xhtml
6033                 ? document.createElement(name)
6034                 : document.createElementNS(uri, name);
6035           };
6036         }
6037
6038         function creatorFixed(fullname) {
6039           return function() {
6040             return this.ownerDocument.createElementNS(fullname.space, fullname.local);
6041           };
6042         }
6043
6044         function creator(name) {
6045           var fullname = namespace(name);
6046           return (fullname.local
6047               ? creatorFixed
6048               : creatorInherit)(fullname);
6049         }
6050
6051         function none() {}
6052
6053         function selector(selector) {
6054           return selector == null ? none : function() {
6055             return this.querySelector(selector);
6056           };
6057         }
6058
6059         function selection_select(select) {
6060           if (typeof select !== "function") select = selector(select);
6061
6062           for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
6063             for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {
6064               if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {
6065                 if ("__data__" in node) subnode.__data__ = node.__data__;
6066                 subgroup[i] = subnode;
6067               }
6068             }
6069           }
6070
6071           return new Selection(subgroups, this._parents);
6072         }
6073
6074         function empty() {
6075           return [];
6076         }
6077
6078         function selectorAll(selector) {
6079           return selector == null ? empty : function() {
6080             return this.querySelectorAll(selector);
6081           };
6082         }
6083
6084         function selection_selectAll(select) {
6085           if (typeof select !== "function") select = selectorAll(select);
6086
6087           for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {
6088             for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
6089               if (node = group[i]) {
6090                 subgroups.push(select.call(node, node.__data__, i, group));
6091                 parents.push(node);
6092               }
6093             }
6094           }
6095
6096           return new Selection(subgroups, parents);
6097         }
6098
6099         function matcher(selector) {
6100           return function() {
6101             return this.matches(selector);
6102           };
6103         }
6104
6105         function selection_filter(match) {
6106           if (typeof match !== "function") match = matcher(match);
6107
6108           for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
6109             for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {
6110               if ((node = group[i]) && match.call(node, node.__data__, i, group)) {
6111                 subgroup.push(node);
6112               }
6113             }
6114           }
6115
6116           return new Selection(subgroups, this._parents);
6117         }
6118
6119         function sparse(update) {
6120           return new Array(update.length);
6121         }
6122
6123         function selection_enter() {
6124           return new Selection(this._enter || this._groups.map(sparse), this._parents);
6125         }
6126
6127         function EnterNode(parent, datum) {
6128           this.ownerDocument = parent.ownerDocument;
6129           this.namespaceURI = parent.namespaceURI;
6130           this._next = null;
6131           this._parent = parent;
6132           this.__data__ = datum;
6133         }
6134
6135         EnterNode.prototype = {
6136           constructor: EnterNode,
6137           appendChild: function(child) { return this._parent.insertBefore(child, this._next); },
6138           insertBefore: function(child, next) { return this._parent.insertBefore(child, next); },
6139           querySelector: function(selector) { return this._parent.querySelector(selector); },
6140           querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); }
6141         };
6142
6143         function constant$1(x) {
6144           return function() {
6145             return x;
6146           };
6147         }
6148
6149         var keyPrefix = "$"; // Protect against keys like “__proto__”.
6150
6151         function bindIndex(parent, group, enter, update, exit, data) {
6152           var i = 0,
6153               node,
6154               groupLength = group.length,
6155               dataLength = data.length;
6156
6157           // Put any non-null nodes that fit into update.
6158           // Put any null nodes into enter.
6159           // Put any remaining data into enter.
6160           for (; i < dataLength; ++i) {
6161             if (node = group[i]) {
6162               node.__data__ = data[i];
6163               update[i] = node;
6164             } else {
6165               enter[i] = new EnterNode(parent, data[i]);
6166             }
6167           }
6168
6169           // Put any non-null nodes that don’t fit into exit.
6170           for (; i < groupLength; ++i) {
6171             if (node = group[i]) {
6172               exit[i] = node;
6173             }
6174           }
6175         }
6176
6177         function bindKey(parent, group, enter, update, exit, data, key) {
6178           var i,
6179               node,
6180               nodeByKeyValue = {},
6181               groupLength = group.length,
6182               dataLength = data.length,
6183               keyValues = new Array(groupLength),
6184               keyValue;
6185
6186           // Compute the key for each node.
6187           // If multiple nodes have the same key, the duplicates are added to exit.
6188           for (i = 0; i < groupLength; ++i) {
6189             if (node = group[i]) {
6190               keyValues[i] = keyValue = keyPrefix + key.call(node, node.__data__, i, group);
6191               if (keyValue in nodeByKeyValue) {
6192                 exit[i] = node;
6193               } else {
6194                 nodeByKeyValue[keyValue] = node;
6195               }
6196             }
6197           }
6198
6199           // Compute the key for each datum.
6200           // If there a node associated with this key, join and add it to update.
6201           // If there is not (or the key is a duplicate), add it to enter.
6202           for (i = 0; i < dataLength; ++i) {
6203             keyValue = keyPrefix + key.call(parent, data[i], i, data);
6204             if (node = nodeByKeyValue[keyValue]) {
6205               update[i] = node;
6206               node.__data__ = data[i];
6207               nodeByKeyValue[keyValue] = null;
6208             } else {
6209               enter[i] = new EnterNode(parent, data[i]);
6210             }
6211           }
6212
6213           // Add any remaining nodes that were not bound to data to exit.
6214           for (i = 0; i < groupLength; ++i) {
6215             if ((node = group[i]) && (nodeByKeyValue[keyValues[i]] === node)) {
6216               exit[i] = node;
6217             }
6218           }
6219         }
6220
6221         function selection_data(value, key) {
6222           if (!value) {
6223             data = new Array(this.size()), j = -1;
6224             this.each(function(d) { data[++j] = d; });
6225             return data;
6226           }
6227
6228           var bind = key ? bindKey : bindIndex,
6229               parents = this._parents,
6230               groups = this._groups;
6231
6232           if (typeof value !== "function") value = constant$1(value);
6233
6234           for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) {
6235             var parent = parents[j],
6236                 group = groups[j],
6237                 groupLength = group.length,
6238                 data = value.call(parent, parent && parent.__data__, j, parents),
6239                 dataLength = data.length,
6240                 enterGroup = enter[j] = new Array(dataLength),
6241                 updateGroup = update[j] = new Array(dataLength),
6242                 exitGroup = exit[j] = new Array(groupLength);
6243
6244             bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);
6245
6246             // Now connect the enter nodes to their following update node, such that
6247             // appendChild can insert the materialized enter node before this node,
6248             // rather than at the end of the parent node.
6249             for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {
6250               if (previous = enterGroup[i0]) {
6251                 if (i0 >= i1) i1 = i0 + 1;
6252                 while (!(next = updateGroup[i1]) && ++i1 < dataLength);
6253                 previous._next = next || null;
6254               }
6255             }
6256           }
6257
6258           update = new Selection(update, parents);
6259           update._enter = enter;
6260           update._exit = exit;
6261           return update;
6262         }
6263
6264         function selection_exit() {
6265           return new Selection(this._exit || this._groups.map(sparse), this._parents);
6266         }
6267
6268         function selection_join(onenter, onupdate, onexit) {
6269           var enter = this.enter(), update = this, exit = this.exit();
6270           enter = typeof onenter === "function" ? onenter(enter) : enter.append(onenter + "");
6271           if (onupdate != null) update = onupdate(update);
6272           if (onexit == null) exit.remove(); else onexit(exit);
6273           return enter && update ? enter.merge(update).order() : update;
6274         }
6275
6276         function selection_merge(selection) {
6277
6278           for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {
6279             for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {
6280               if (node = group0[i] || group1[i]) {
6281                 merge[i] = node;
6282               }
6283             }
6284           }
6285
6286           for (; j < m0; ++j) {
6287             merges[j] = groups0[j];
6288           }
6289
6290           return new Selection(merges, this._parents);
6291         }
6292
6293         function selection_order() {
6294
6295           for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) {
6296             for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) {
6297               if (node = group[i]) {
6298                 if (next && node.compareDocumentPosition(next) ^ 4) next.parentNode.insertBefore(node, next);
6299                 next = node;
6300               }
6301             }
6302           }
6303
6304           return this;
6305         }
6306
6307         function selection_sort(compare) {
6308           if (!compare) compare = ascending;
6309
6310           function compareNode(a, b) {
6311             return a && b ? compare(a.__data__, b.__data__) : !a - !b;
6312           }
6313
6314           for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) {
6315             for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) {
6316               if (node = group[i]) {
6317                 sortgroup[i] = node;
6318               }
6319             }
6320             sortgroup.sort(compareNode);
6321           }
6322
6323           return new Selection(sortgroups, this._parents).order();
6324         }
6325
6326         function ascending(a, b) {
6327           return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
6328         }
6329
6330         function selection_call() {
6331           var callback = arguments[0];
6332           arguments[0] = this;
6333           callback.apply(null, arguments);
6334           return this;
6335         }
6336
6337         function selection_nodes() {
6338           var nodes = new Array(this.size()), i = -1;
6339           this.each(function() { nodes[++i] = this; });
6340           return nodes;
6341         }
6342
6343         function selection_node() {
6344
6345           for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {
6346             for (var group = groups[j], i = 0, n = group.length; i < n; ++i) {
6347               var node = group[i];
6348               if (node) return node;
6349             }
6350           }
6351
6352           return null;
6353         }
6354
6355         function selection_size() {
6356           var size = 0;
6357           this.each(function() { ++size; });
6358           return size;
6359         }
6360
6361         function selection_empty() {
6362           return !this.node();
6363         }
6364
6365         function selection_each(callback) {
6366
6367           for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {
6368             for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {
6369               if (node = group[i]) callback.call(node, node.__data__, i, group);
6370             }
6371           }
6372
6373           return this;
6374         }
6375
6376         function attrRemove(name) {
6377           return function() {
6378             this.removeAttribute(name);
6379           };
6380         }
6381
6382         function attrRemoveNS(fullname) {
6383           return function() {
6384             this.removeAttributeNS(fullname.space, fullname.local);
6385           };
6386         }
6387
6388         function attrConstant(name, value) {
6389           return function() {
6390             this.setAttribute(name, value);
6391           };
6392         }
6393
6394         function attrConstantNS(fullname, value) {
6395           return function() {
6396             this.setAttributeNS(fullname.space, fullname.local, value);
6397           };
6398         }
6399
6400         function attrFunction(name, value) {
6401           return function() {
6402             var v = value.apply(this, arguments);
6403             if (v == null) this.removeAttribute(name);
6404             else this.setAttribute(name, v);
6405           };
6406         }
6407
6408         function attrFunctionNS(fullname, value) {
6409           return function() {
6410             var v = value.apply(this, arguments);
6411             if (v == null) this.removeAttributeNS(fullname.space, fullname.local);
6412             else this.setAttributeNS(fullname.space, fullname.local, v);
6413           };
6414         }
6415
6416         function selection_attr(name, value) {
6417           var fullname = namespace(name);
6418
6419           if (arguments.length < 2) {
6420             var node = this.node();
6421             return fullname.local
6422                 ? node.getAttributeNS(fullname.space, fullname.local)
6423                 : node.getAttribute(fullname);
6424           }
6425
6426           return this.each((value == null
6427               ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === "function"
6428               ? (fullname.local ? attrFunctionNS : attrFunction)
6429               : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value));
6430         }
6431
6432         function defaultView(node) {
6433           return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node
6434               || (node.document && node) // node is a Window
6435               || node.defaultView; // node is a Document
6436         }
6437
6438         function styleRemove(name) {
6439           return function() {
6440             this.style.removeProperty(name);
6441           };
6442         }
6443
6444         function styleConstant(name, value, priority) {
6445           return function() {
6446             this.style.setProperty(name, value, priority);
6447           };
6448         }
6449
6450         function styleFunction(name, value, priority) {
6451           return function() {
6452             var v = value.apply(this, arguments);
6453             if (v == null) this.style.removeProperty(name);
6454             else this.style.setProperty(name, v, priority);
6455           };
6456         }
6457
6458         function selection_style(name, value, priority) {
6459           return arguments.length > 1
6460               ? this.each((value == null
6461                     ? styleRemove : typeof value === "function"
6462                     ? styleFunction
6463                     : styleConstant)(name, value, priority == null ? "" : priority))
6464               : styleValue(this.node(), name);
6465         }
6466
6467         function styleValue(node, name) {
6468           return node.style.getPropertyValue(name)
6469               || defaultView(node).getComputedStyle(node, null).getPropertyValue(name);
6470         }
6471
6472         function propertyRemove(name) {
6473           return function() {
6474             delete this[name];
6475           };
6476         }
6477
6478         function propertyConstant(name, value) {
6479           return function() {
6480             this[name] = value;
6481           };
6482         }
6483
6484         function propertyFunction(name, value) {
6485           return function() {
6486             var v = value.apply(this, arguments);
6487             if (v == null) delete this[name];
6488             else this[name] = v;
6489           };
6490         }
6491
6492         function selection_property(name, value) {
6493           return arguments.length > 1
6494               ? this.each((value == null
6495                   ? propertyRemove : typeof value === "function"
6496                   ? propertyFunction
6497                   : propertyConstant)(name, value))
6498               : this.node()[name];
6499         }
6500
6501         function classArray(string) {
6502           return string.trim().split(/^|\s+/);
6503         }
6504
6505         function classList(node) {
6506           return node.classList || new ClassList(node);
6507         }
6508
6509         function ClassList(node) {
6510           this._node = node;
6511           this._names = classArray(node.getAttribute("class") || "");
6512         }
6513
6514         ClassList.prototype = {
6515           add: function(name) {
6516             var i = this._names.indexOf(name);
6517             if (i < 0) {
6518               this._names.push(name);
6519               this._node.setAttribute("class", this._names.join(" "));
6520             }
6521           },
6522           remove: function(name) {
6523             var i = this._names.indexOf(name);
6524             if (i >= 0) {
6525               this._names.splice(i, 1);
6526               this._node.setAttribute("class", this._names.join(" "));
6527             }
6528           },
6529           contains: function(name) {
6530             return this._names.indexOf(name) >= 0;
6531           }
6532         };
6533
6534         function classedAdd(node, names) {
6535           var list = classList(node), i = -1, n = names.length;
6536           while (++i < n) list.add(names[i]);
6537         }
6538
6539         function classedRemove(node, names) {
6540           var list = classList(node), i = -1, n = names.length;
6541           while (++i < n) list.remove(names[i]);
6542         }
6543
6544         function classedTrue(names) {
6545           return function() {
6546             classedAdd(this, names);
6547           };
6548         }
6549
6550         function classedFalse(names) {
6551           return function() {
6552             classedRemove(this, names);
6553           };
6554         }
6555
6556         function classedFunction(names, value) {
6557           return function() {
6558             (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);
6559           };
6560         }
6561
6562         function selection_classed(name, value) {
6563           var names = classArray(name + "");
6564
6565           if (arguments.length < 2) {
6566             var list = classList(this.node()), i = -1, n = names.length;
6567             while (++i < n) if (!list.contains(names[i])) return false;
6568             return true;
6569           }
6570
6571           return this.each((typeof value === "function"
6572               ? classedFunction : value
6573               ? classedTrue
6574               : classedFalse)(names, value));
6575         }
6576
6577         function textRemove() {
6578           this.textContent = "";
6579         }
6580
6581         function textConstant(value) {
6582           return function() {
6583             this.textContent = value;
6584           };
6585         }
6586
6587         function textFunction(value) {
6588           return function() {
6589             var v = value.apply(this, arguments);
6590             this.textContent = v == null ? "" : v;
6591           };
6592         }
6593
6594         function selection_text(value) {
6595           return arguments.length
6596               ? this.each(value == null
6597                   ? textRemove : (typeof value === "function"
6598                   ? textFunction
6599                   : textConstant)(value))
6600               : this.node().textContent;
6601         }
6602
6603         function htmlRemove() {
6604           this.innerHTML = "";
6605         }
6606
6607         function htmlConstant(value) {
6608           return function() {
6609             this.innerHTML = value;
6610           };
6611         }
6612
6613         function htmlFunction(value) {
6614           return function() {
6615             var v = value.apply(this, arguments);
6616             this.innerHTML = v == null ? "" : v;
6617           };
6618         }
6619
6620         function selection_html(value) {
6621           return arguments.length
6622               ? this.each(value == null
6623                   ? htmlRemove : (typeof value === "function"
6624                   ? htmlFunction
6625                   : htmlConstant)(value))
6626               : this.node().innerHTML;
6627         }
6628
6629         function raise() {
6630           if (this.nextSibling) this.parentNode.appendChild(this);
6631         }
6632
6633         function selection_raise() {
6634           return this.each(raise);
6635         }
6636
6637         function lower() {
6638           if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild);
6639         }
6640
6641         function selection_lower() {
6642           return this.each(lower);
6643         }
6644
6645         function selection_append(name) {
6646           var create = typeof name === "function" ? name : creator(name);
6647           return this.select(function() {
6648             return this.appendChild(create.apply(this, arguments));
6649           });
6650         }
6651
6652         function constantNull() {
6653           return null;
6654         }
6655
6656         function selection_insert(name, before) {
6657           var create = typeof name === "function" ? name : creator(name),
6658               select = before == null ? constantNull : typeof before === "function" ? before : selector(before);
6659           return this.select(function() {
6660             return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);
6661           });
6662         }
6663
6664         function remove() {
6665           var parent = this.parentNode;
6666           if (parent) parent.removeChild(this);
6667         }
6668
6669         function selection_remove() {
6670           return this.each(remove);
6671         }
6672
6673         function selection_cloneShallow() {
6674           return this.parentNode.insertBefore(this.cloneNode(false), this.nextSibling);
6675         }
6676
6677         function selection_cloneDeep() {
6678           return this.parentNode.insertBefore(this.cloneNode(true), this.nextSibling);
6679         }
6680
6681         function selection_clone(deep) {
6682           return this.select(deep ? selection_cloneDeep : selection_cloneShallow);
6683         }
6684
6685         function selection_datum(value) {
6686           return arguments.length
6687               ? this.property("__data__", value)
6688               : this.node().__data__;
6689         }
6690
6691         var filterEvents = {};
6692
6693         var event = null;
6694
6695         if (typeof document !== "undefined") {
6696           var element = document.documentElement;
6697           if (!("onmouseenter" in element)) {
6698             filterEvents = {mouseenter: "mouseover", mouseleave: "mouseout"};
6699           }
6700         }
6701
6702         function filterContextListener(listener, index, group) {
6703           listener = contextListener(listener, index, group);
6704           return function(event) {
6705             var related = event.relatedTarget;
6706             if (!related || (related !== this && !(related.compareDocumentPosition(this) & 8))) {
6707               listener.call(this, event);
6708             }
6709           };
6710         }
6711
6712         function contextListener(listener, index, group) {
6713           return function(event1) {
6714             var event0 = event; // Events can be reentrant (e.g., focus).
6715             event = event1;
6716             try {
6717               listener.call(this, this.__data__, index, group);
6718             } finally {
6719               event = event0;
6720             }
6721           };
6722         }
6723
6724         function parseTypenames$1(typenames) {
6725           return typenames.trim().split(/^|\s+/).map(function(t) {
6726             var name = "", i = t.indexOf(".");
6727             if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);
6728             return {type: t, name: name};
6729           });
6730         }
6731
6732         function onRemove(typename) {
6733           return function() {
6734             var on = this.__on;
6735             if (!on) return;
6736             for (var j = 0, i = -1, m = on.length, o; j < m; ++j) {
6737               if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {
6738                 this.removeEventListener(o.type, o.listener, o.capture);
6739               } else {
6740                 on[++i] = o;
6741               }
6742             }
6743             if (++i) on.length = i;
6744             else delete this.__on;
6745           };
6746         }
6747
6748         function onAdd(typename, value, capture) {
6749           var wrap = filterEvents.hasOwnProperty(typename.type) ? filterContextListener : contextListener;
6750           return function(d, i, group) {
6751             var on = this.__on, o, listener = wrap(value, i, group);
6752             if (on) for (var j = 0, m = on.length; j < m; ++j) {
6753               if ((o = on[j]).type === typename.type && o.name === typename.name) {
6754                 this.removeEventListener(o.type, o.listener, o.capture);
6755                 this.addEventListener(o.type, o.listener = listener, o.capture = capture);
6756                 o.value = value;
6757                 return;
6758               }
6759             }
6760             this.addEventListener(typename.type, listener, capture);
6761             o = {type: typename.type, name: typename.name, value: value, listener: listener, capture: capture};
6762             if (!on) this.__on = [o];
6763             else on.push(o);
6764           };
6765         }
6766
6767         function selection_on(typename, value, capture) {
6768           var typenames = parseTypenames$1(typename + ""), i, n = typenames.length, t;
6769
6770           if (arguments.length < 2) {
6771             var on = this.node().__on;
6772             if (on) for (var j = 0, m = on.length, o; j < m; ++j) {
6773               for (i = 0, o = on[j]; i < n; ++i) {
6774                 if ((t = typenames[i]).type === o.type && t.name === o.name) {
6775                   return o.value;
6776                 }
6777               }
6778             }
6779             return;
6780           }
6781
6782           on = value ? onAdd : onRemove;
6783           if (capture == null) capture = false;
6784           for (i = 0; i < n; ++i) this.each(on(typenames[i], value, capture));
6785           return this;
6786         }
6787
6788         function customEvent(event1, listener, that, args) {
6789           var event0 = event;
6790           event1.sourceEvent = event;
6791           event = event1;
6792           try {
6793             return listener.apply(that, args);
6794           } finally {
6795             event = event0;
6796           }
6797         }
6798
6799         function dispatchEvent(node, type, params) {
6800           var window = defaultView(node),
6801               event = window.CustomEvent;
6802
6803           if (typeof event === "function") {
6804             event = new event(type, params);
6805           } else {
6806             event = window.document.createEvent("Event");
6807             if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail;
6808             else event.initEvent(type, false, false);
6809           }
6810
6811           node.dispatchEvent(event);
6812         }
6813
6814         function dispatchConstant(type, params) {
6815           return function() {
6816             return dispatchEvent(this, type, params);
6817           };
6818         }
6819
6820         function dispatchFunction(type, params) {
6821           return function() {
6822             return dispatchEvent(this, type, params.apply(this, arguments));
6823           };
6824         }
6825
6826         function selection_dispatch(type, params) {
6827           return this.each((typeof params === "function"
6828               ? dispatchFunction
6829               : dispatchConstant)(type, params));
6830         }
6831
6832         var root$1 = [null];
6833
6834         function Selection(groups, parents) {
6835           this._groups = groups;
6836           this._parents = parents;
6837         }
6838
6839         function selection() {
6840           return new Selection([[document.documentElement]], root$1);
6841         }
6842
6843         Selection.prototype = selection.prototype = {
6844           constructor: Selection,
6845           select: selection_select,
6846           selectAll: selection_selectAll,
6847           filter: selection_filter,
6848           data: selection_data,
6849           enter: selection_enter,
6850           exit: selection_exit,
6851           join: selection_join,
6852           merge: selection_merge,
6853           order: selection_order,
6854           sort: selection_sort,
6855           call: selection_call,
6856           nodes: selection_nodes,
6857           node: selection_node,
6858           size: selection_size,
6859           empty: selection_empty,
6860           each: selection_each,
6861           attr: selection_attr,
6862           style: selection_style,
6863           property: selection_property,
6864           classed: selection_classed,
6865           text: selection_text,
6866           html: selection_html,
6867           raise: selection_raise,
6868           lower: selection_lower,
6869           append: selection_append,
6870           insert: selection_insert,
6871           remove: selection_remove,
6872           clone: selection_clone,
6873           datum: selection_datum,
6874           on: selection_on,
6875           dispatch: selection_dispatch
6876         };
6877
6878         function d3_select(selector) {
6879           return typeof selector === "string"
6880               ? new Selection([[document.querySelector(selector)]], [document.documentElement])
6881               : new Selection([[selector]], root$1);
6882         }
6883
6884         function create$5(name) {
6885           return d3_select(creator(name).call(document.documentElement));
6886         }
6887
6888         var nextId = 0;
6889
6890         function local() {
6891           return new Local;
6892         }
6893
6894         function Local() {
6895           this._ = "@" + (++nextId).toString(36);
6896         }
6897
6898         Local.prototype = local.prototype = {
6899           constructor: Local,
6900           get: function(node) {
6901             var id = this._;
6902             while (!(id in node)) if (!(node = node.parentNode)) return;
6903             return node[id];
6904           },
6905           set: function(node, value) {
6906             return node[this._] = value;
6907           },
6908           remove: function(node) {
6909             return this._ in node && delete node[this._];
6910           },
6911           toString: function() {
6912             return this._;
6913           }
6914         };
6915
6916         function sourceEvent() {
6917           var current = event, source;
6918           while (source = current.sourceEvent) current = source;
6919           return current;
6920         }
6921
6922         function point(node, event) {
6923           var svg = node.ownerSVGElement || node;
6924
6925           if (svg.createSVGPoint) {
6926             var point = svg.createSVGPoint();
6927             point.x = event.clientX, point.y = event.clientY;
6928             point = point.matrixTransform(node.getScreenCTM().inverse());
6929             return [point.x, point.y];
6930           }
6931
6932           var rect = node.getBoundingClientRect();
6933           return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop];
6934         }
6935
6936         function d3_mouse(node) {
6937           var event = sourceEvent();
6938           if (event.changedTouches) event = event.changedTouches[0];
6939           return point(node, event);
6940         }
6941
6942         function d3_selectAll(selector) {
6943           return typeof selector === "string"
6944               ? new Selection([document.querySelectorAll(selector)], [document.documentElement])
6945               : new Selection([selector == null ? [] : selector], root$1);
6946         }
6947
6948         function touch(node, touches, identifier) {
6949           if (arguments.length < 3) identifier = touches, touches = sourceEvent().changedTouches;
6950
6951           for (var i = 0, n = touches ? touches.length : 0, touch; i < n; ++i) {
6952             if ((touch = touches[i]).identifier === identifier) {
6953               return point(node, touch);
6954             }
6955           }
6956
6957           return null;
6958         }
6959
6960         function d3_touches(node, touches) {
6961           if (touches == null) touches = sourceEvent().touches;
6962
6963           for (var i = 0, n = touches ? touches.length : 0, points = new Array(n); i < n; ++i) {
6964             points[i] = point(node, touches[i]);
6965           }
6966
6967           return points;
6968         }
6969
6970         function nopropagation() {
6971           event.stopImmediatePropagation();
6972         }
6973
6974         function noevent() {
6975           event.preventDefault();
6976           event.stopImmediatePropagation();
6977         }
6978
6979         function dragDisable(view) {
6980           var root = view.document.documentElement,
6981               selection = d3_select(view).on("dragstart.drag", noevent, true);
6982           if ("onselectstart" in root) {
6983             selection.on("selectstart.drag", noevent, true);
6984           } else {
6985             root.__noselect = root.style.MozUserSelect;
6986             root.style.MozUserSelect = "none";
6987           }
6988         }
6989
6990         function yesdrag(view, noclick) {
6991           var root = view.document.documentElement,
6992               selection = d3_select(view).on("dragstart.drag", null);
6993           if (noclick) {
6994             selection.on("click.drag", noevent, true);
6995             setTimeout(function() { selection.on("click.drag", null); }, 0);
6996           }
6997           if ("onselectstart" in root) {
6998             selection.on("selectstart.drag", null);
6999           } else {
7000             root.style.MozUserSelect = root.__noselect;
7001             delete root.__noselect;
7002           }
7003         }
7004
7005         function constant$2(x) {
7006           return function() {
7007             return x;
7008           };
7009         }
7010
7011         function DragEvent(target, type, subject, id, active, x, y, dx, dy, dispatch) {
7012           this.target = target;
7013           this.type = type;
7014           this.subject = subject;
7015           this.identifier = id;
7016           this.active = active;
7017           this.x = x;
7018           this.y = y;
7019           this.dx = dx;
7020           this.dy = dy;
7021           this._ = dispatch;
7022         }
7023
7024         DragEvent.prototype.on = function() {
7025           var value = this._.on.apply(this._, arguments);
7026           return value === this._ ? this : value;
7027         };
7028
7029         // Ignore right-click, since that should open the context menu.
7030         function defaultFilter() {
7031           return !event.button;
7032         }
7033
7034         function defaultContainer() {
7035           return this.parentNode;
7036         }
7037
7038         function defaultSubject(d) {
7039           return d == null ? {x: event.x, y: event.y} : d;
7040         }
7041
7042         function defaultTouchable() {
7043           return "ontouchstart" in this;
7044         }
7045
7046         function d3_drag() {
7047           var filter = defaultFilter,
7048               container = defaultContainer,
7049               subject = defaultSubject,
7050               touchable = defaultTouchable,
7051               gestures = {},
7052               listeners = dispatch("start", "drag", "end"),
7053               active = 0,
7054               mousedownx,
7055               mousedowny,
7056               mousemoving,
7057               touchending,
7058               clickDistance2 = 0;
7059
7060           function drag(selection) {
7061             selection
7062                 .on("mousedown.drag", mousedowned)
7063               .filter(touchable)
7064                 .on("touchstart.drag", touchstarted)
7065                 .on("touchmove.drag", touchmoved)
7066                 .on("touchend.drag touchcancel.drag", touchended)
7067                 .style("touch-action", "none")
7068                 .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
7069           }
7070
7071           function mousedowned() {
7072             if (touchending || !filter.apply(this, arguments)) return;
7073             var gesture = beforestart("mouse", container.apply(this, arguments), d3_mouse, this, arguments);
7074             if (!gesture) return;
7075             d3_select(event.view).on("mousemove.drag", mousemoved, true).on("mouseup.drag", mouseupped, true);
7076             dragDisable(event.view);
7077             nopropagation();
7078             mousemoving = false;
7079             mousedownx = event.clientX;
7080             mousedowny = event.clientY;
7081             gesture("start");
7082           }
7083
7084           function mousemoved() {
7085             noevent();
7086             if (!mousemoving) {
7087               var dx = event.clientX - mousedownx, dy = event.clientY - mousedowny;
7088               mousemoving = dx * dx + dy * dy > clickDistance2;
7089             }
7090             gestures.mouse("drag");
7091           }
7092
7093           function mouseupped() {
7094             d3_select(event.view).on("mousemove.drag mouseup.drag", null);
7095             yesdrag(event.view, mousemoving);
7096             noevent();
7097             gestures.mouse("end");
7098           }
7099
7100           function touchstarted() {
7101             if (!filter.apply(this, arguments)) return;
7102             var touches = event.changedTouches,
7103                 c = container.apply(this, arguments),
7104                 n = touches.length, i, gesture;
7105
7106             for (i = 0; i < n; ++i) {
7107               if (gesture = beforestart(touches[i].identifier, c, touch, this, arguments)) {
7108                 nopropagation();
7109                 gesture("start");
7110               }
7111             }
7112           }
7113
7114           function touchmoved() {
7115             var touches = event.changedTouches,
7116                 n = touches.length, i, gesture;
7117
7118             for (i = 0; i < n; ++i) {
7119               if (gesture = gestures[touches[i].identifier]) {
7120                 noevent();
7121                 gesture("drag");
7122               }
7123             }
7124           }
7125
7126           function touchended() {
7127             var touches = event.changedTouches,
7128                 n = touches.length, i, gesture;
7129
7130             if (touchending) clearTimeout(touchending);
7131             touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!
7132             for (i = 0; i < n; ++i) {
7133               if (gesture = gestures[touches[i].identifier]) {
7134                 nopropagation();
7135                 gesture("end");
7136               }
7137             }
7138           }
7139
7140           function beforestart(id, container, point, that, args) {
7141             var p = point(container, id), s, dx, dy,
7142                 sublisteners = listeners.copy();
7143
7144             if (!customEvent(new DragEvent(drag, "beforestart", s, id, active, p[0], p[1], 0, 0, sublisteners), function() {
7145               if ((event.subject = s = subject.apply(that, args)) == null) return false;
7146               dx = s.x - p[0] || 0;
7147               dy = s.y - p[1] || 0;
7148               return true;
7149             })) return;
7150
7151             return function gesture(type) {
7152               var p0 = p, n;
7153               switch (type) {
7154                 case "start": gestures[id] = gesture, n = active++; break;
7155                 case "end": delete gestures[id], --active; // nobreak
7156                 case "drag": p = point(container, id), n = active; break;
7157               }
7158               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]);
7159             };
7160           }
7161
7162           drag.filter = function(_) {
7163             return arguments.length ? (filter = typeof _ === "function" ? _ : constant$2(!!_), drag) : filter;
7164           };
7165
7166           drag.container = function(_) {
7167             return arguments.length ? (container = typeof _ === "function" ? _ : constant$2(_), drag) : container;
7168           };
7169
7170           drag.subject = function(_) {
7171             return arguments.length ? (subject = typeof _ === "function" ? _ : constant$2(_), drag) : subject;
7172           };
7173
7174           drag.touchable = function(_) {
7175             return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$2(!!_), drag) : touchable;
7176           };
7177
7178           drag.on = function() {
7179             var value = listeners.on.apply(listeners, arguments);
7180             return value === listeners ? drag : value;
7181           };
7182
7183           drag.clickDistance = function(_) {
7184             return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2);
7185           };
7186
7187           return drag;
7188         }
7189
7190         function define$1(constructor, factory, prototype) {
7191           constructor.prototype = factory.prototype = prototype;
7192           prototype.constructor = constructor;
7193         }
7194
7195         function extend(parent, definition) {
7196           var prototype = Object.create(parent.prototype);
7197           for (var key in definition) prototype[key] = definition[key];
7198           return prototype;
7199         }
7200
7201         function Color() {}
7202
7203         var darker = 0.7;
7204         var brighter = 1 / darker;
7205
7206         var reI = "\\s*([+-]?\\d+)\\s*",
7207             reN = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*",
7208             reP = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*",
7209             reHex3 = /^#([0-9a-f]{3})$/,
7210             reHex6 = /^#([0-9a-f]{6})$/,
7211             reRgbInteger = new RegExp("^rgb\\(" + [reI, reI, reI] + "\\)$"),
7212             reRgbPercent = new RegExp("^rgb\\(" + [reP, reP, reP] + "\\)$"),
7213             reRgbaInteger = new RegExp("^rgba\\(" + [reI, reI, reI, reN] + "\\)$"),
7214             reRgbaPercent = new RegExp("^rgba\\(" + [reP, reP, reP, reN] + "\\)$"),
7215             reHslPercent = new RegExp("^hsl\\(" + [reN, reP, reP] + "\\)$"),
7216             reHslaPercent = new RegExp("^hsla\\(" + [reN, reP, reP, reN] + "\\)$");
7217
7218         var named = {
7219           aliceblue: 0xf0f8ff,
7220           antiquewhite: 0xfaebd7,
7221           aqua: 0x00ffff,
7222           aquamarine: 0x7fffd4,
7223           azure: 0xf0ffff,
7224           beige: 0xf5f5dc,
7225           bisque: 0xffe4c4,
7226           black: 0x000000,
7227           blanchedalmond: 0xffebcd,
7228           blue: 0x0000ff,
7229           blueviolet: 0x8a2be2,
7230           brown: 0xa52a2a,
7231           burlywood: 0xdeb887,
7232           cadetblue: 0x5f9ea0,
7233           chartreuse: 0x7fff00,
7234           chocolate: 0xd2691e,
7235           coral: 0xff7f50,
7236           cornflowerblue: 0x6495ed,
7237           cornsilk: 0xfff8dc,
7238           crimson: 0xdc143c,
7239           cyan: 0x00ffff,
7240           darkblue: 0x00008b,
7241           darkcyan: 0x008b8b,
7242           darkgoldenrod: 0xb8860b,
7243           darkgray: 0xa9a9a9,
7244           darkgreen: 0x006400,
7245           darkgrey: 0xa9a9a9,
7246           darkkhaki: 0xbdb76b,
7247           darkmagenta: 0x8b008b,
7248           darkolivegreen: 0x556b2f,
7249           darkorange: 0xff8c00,
7250           darkorchid: 0x9932cc,
7251           darkred: 0x8b0000,
7252           darksalmon: 0xe9967a,
7253           darkseagreen: 0x8fbc8f,
7254           darkslateblue: 0x483d8b,
7255           darkslategray: 0x2f4f4f,
7256           darkslategrey: 0x2f4f4f,
7257           darkturquoise: 0x00ced1,
7258           darkviolet: 0x9400d3,
7259           deeppink: 0xff1493,
7260           deepskyblue: 0x00bfff,
7261           dimgray: 0x696969,
7262           dimgrey: 0x696969,
7263           dodgerblue: 0x1e90ff,
7264           firebrick: 0xb22222,
7265           floralwhite: 0xfffaf0,
7266           forestgreen: 0x228b22,
7267           fuchsia: 0xff00ff,
7268           gainsboro: 0xdcdcdc,
7269           ghostwhite: 0xf8f8ff,
7270           gold: 0xffd700,
7271           goldenrod: 0xdaa520,
7272           gray: 0x808080,
7273           green: 0x008000,
7274           greenyellow: 0xadff2f,
7275           grey: 0x808080,
7276           honeydew: 0xf0fff0,
7277           hotpink: 0xff69b4,
7278           indianred: 0xcd5c5c,
7279           indigo: 0x4b0082,
7280           ivory: 0xfffff0,
7281           khaki: 0xf0e68c,
7282           lavender: 0xe6e6fa,
7283           lavenderblush: 0xfff0f5,
7284           lawngreen: 0x7cfc00,
7285           lemonchiffon: 0xfffacd,
7286           lightblue: 0xadd8e6,
7287           lightcoral: 0xf08080,
7288           lightcyan: 0xe0ffff,
7289           lightgoldenrodyellow: 0xfafad2,
7290           lightgray: 0xd3d3d3,
7291           lightgreen: 0x90ee90,
7292           lightgrey: 0xd3d3d3,
7293           lightpink: 0xffb6c1,
7294           lightsalmon: 0xffa07a,
7295           lightseagreen: 0x20b2aa,
7296           lightskyblue: 0x87cefa,
7297           lightslategray: 0x778899,
7298           lightslategrey: 0x778899,
7299           lightsteelblue: 0xb0c4de,
7300           lightyellow: 0xffffe0,
7301           lime: 0x00ff00,
7302           limegreen: 0x32cd32,
7303           linen: 0xfaf0e6,
7304           magenta: 0xff00ff,
7305           maroon: 0x800000,
7306           mediumaquamarine: 0x66cdaa,
7307           mediumblue: 0x0000cd,
7308           mediumorchid: 0xba55d3,
7309           mediumpurple: 0x9370db,
7310           mediumseagreen: 0x3cb371,
7311           mediumslateblue: 0x7b68ee,
7312           mediumspringgreen: 0x00fa9a,
7313           mediumturquoise: 0x48d1cc,
7314           mediumvioletred: 0xc71585,
7315           midnightblue: 0x191970,
7316           mintcream: 0xf5fffa,
7317           mistyrose: 0xffe4e1,
7318           moccasin: 0xffe4b5,
7319           navajowhite: 0xffdead,
7320           navy: 0x000080,
7321           oldlace: 0xfdf5e6,
7322           olive: 0x808000,
7323           olivedrab: 0x6b8e23,
7324           orange: 0xffa500,
7325           orangered: 0xff4500,
7326           orchid: 0xda70d6,
7327           palegoldenrod: 0xeee8aa,
7328           palegreen: 0x98fb98,
7329           paleturquoise: 0xafeeee,
7330           palevioletred: 0xdb7093,
7331           papayawhip: 0xffefd5,
7332           peachpuff: 0xffdab9,
7333           peru: 0xcd853f,
7334           pink: 0xffc0cb,
7335           plum: 0xdda0dd,
7336           powderblue: 0xb0e0e6,
7337           purple: 0x800080,
7338           rebeccapurple: 0x663399,
7339           red: 0xff0000,
7340           rosybrown: 0xbc8f8f,
7341           royalblue: 0x4169e1,
7342           saddlebrown: 0x8b4513,
7343           salmon: 0xfa8072,
7344           sandybrown: 0xf4a460,
7345           seagreen: 0x2e8b57,
7346           seashell: 0xfff5ee,
7347           sienna: 0xa0522d,
7348           silver: 0xc0c0c0,
7349           skyblue: 0x87ceeb,
7350           slateblue: 0x6a5acd,
7351           slategray: 0x708090,
7352           slategrey: 0x708090,
7353           snow: 0xfffafa,
7354           springgreen: 0x00ff7f,
7355           steelblue: 0x4682b4,
7356           tan: 0xd2b48c,
7357           teal: 0x008080,
7358           thistle: 0xd8bfd8,
7359           tomato: 0xff6347,
7360           turquoise: 0x40e0d0,
7361           violet: 0xee82ee,
7362           wheat: 0xf5deb3,
7363           white: 0xffffff,
7364           whitesmoke: 0xf5f5f5,
7365           yellow: 0xffff00,
7366           yellowgreen: 0x9acd32
7367         };
7368
7369         define$1(Color, color, {
7370           displayable: function() {
7371             return this.rgb().displayable();
7372           },
7373           hex: function() {
7374             return this.rgb().hex();
7375           },
7376           toString: function() {
7377             return this.rgb() + "";
7378           }
7379         });
7380
7381         function color(format) {
7382           var m;
7383           format = (format + "").trim().toLowerCase();
7384           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
7385               : (m = reHex6.exec(format)) ? rgbn(parseInt(m[1], 16)) // #ff0000
7386               : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)
7387               : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)
7388               : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)
7389               : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)
7390               : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)
7391               : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)
7392               : named.hasOwnProperty(format) ? rgbn(named[format])
7393               : format === "transparent" ? new Rgb(NaN, NaN, NaN, 0)
7394               : null;
7395         }
7396
7397         function rgbn(n) {
7398           return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);
7399         }
7400
7401         function rgba(r, g, b, a) {
7402           if (a <= 0) r = g = b = NaN;
7403           return new Rgb(r, g, b, a);
7404         }
7405
7406         function rgbConvert(o) {
7407           if (!(o instanceof Color)) o = color(o);
7408           if (!o) return new Rgb;
7409           o = o.rgb();
7410           return new Rgb(o.r, o.g, o.b, o.opacity);
7411         }
7412
7413         function rgb(r, g, b, opacity) {
7414           return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);
7415         }
7416
7417         function Rgb(r, g, b, opacity) {
7418           this.r = +r;
7419           this.g = +g;
7420           this.b = +b;
7421           this.opacity = +opacity;
7422         }
7423
7424         define$1(Rgb, rgb, extend(Color, {
7425           brighter: function(k) {
7426             k = k == null ? brighter : Math.pow(brighter, k);
7427             return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
7428           },
7429           darker: function(k) {
7430             k = k == null ? darker : Math.pow(darker, k);
7431             return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
7432           },
7433           rgb: function() {
7434             return this;
7435           },
7436           displayable: function() {
7437             return (0 <= this.r && this.r <= 255)
7438                 && (0 <= this.g && this.g <= 255)
7439                 && (0 <= this.b && this.b <= 255)
7440                 && (0 <= this.opacity && this.opacity <= 1);
7441           },
7442           hex: function() {
7443             return "#" + hex$1(this.r) + hex$1(this.g) + hex$1(this.b);
7444           },
7445           toString: function() {
7446             var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));
7447             return (a === 1 ? "rgb(" : "rgba(")
7448                 + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + ", "
7449                 + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + ", "
7450                 + Math.max(0, Math.min(255, Math.round(this.b) || 0))
7451                 + (a === 1 ? ")" : ", " + a + ")");
7452           }
7453         }));
7454
7455         function hex$1(value) {
7456           value = Math.max(0, Math.min(255, Math.round(value) || 0));
7457           return (value < 16 ? "0" : "") + value.toString(16);
7458         }
7459
7460         function hsla(h, s, l, a) {
7461           if (a <= 0) h = s = l = NaN;
7462           else if (l <= 0 || l >= 1) h = s = NaN;
7463           else if (s <= 0) h = NaN;
7464           return new Hsl(h, s, l, a);
7465         }
7466
7467         function hslConvert(o) {
7468           if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);
7469           if (!(o instanceof Color)) o = color(o);
7470           if (!o) return new Hsl;
7471           if (o instanceof Hsl) return o;
7472           o = o.rgb();
7473           var r = o.r / 255,
7474               g = o.g / 255,
7475               b = o.b / 255,
7476               min = Math.min(r, g, b),
7477               max = Math.max(r, g, b),
7478               h = NaN,
7479               s = max - min,
7480               l = (max + min) / 2;
7481           if (s) {
7482             if (r === max) h = (g - b) / s + (g < b) * 6;
7483             else if (g === max) h = (b - r) / s + 2;
7484             else h = (r - g) / s + 4;
7485             s /= l < 0.5 ? max + min : 2 - max - min;
7486             h *= 60;
7487           } else {
7488             s = l > 0 && l < 1 ? 0 : h;
7489           }
7490           return new Hsl(h, s, l, o.opacity);
7491         }
7492
7493         function hsl(h, s, l, opacity) {
7494           return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);
7495         }
7496
7497         function Hsl(h, s, l, opacity) {
7498           this.h = +h;
7499           this.s = +s;
7500           this.l = +l;
7501           this.opacity = +opacity;
7502         }
7503
7504         define$1(Hsl, hsl, extend(Color, {
7505           brighter: function(k) {
7506             k = k == null ? brighter : Math.pow(brighter, k);
7507             return new Hsl(this.h, this.s, this.l * k, this.opacity);
7508           },
7509           darker: function(k) {
7510             k = k == null ? darker : Math.pow(darker, k);
7511             return new Hsl(this.h, this.s, this.l * k, this.opacity);
7512           },
7513           rgb: function() {
7514             var h = this.h % 360 + (this.h < 0) * 360,
7515                 s = isNaN(h) || isNaN(this.s) ? 0 : this.s,
7516                 l = this.l,
7517                 m2 = l + (l < 0.5 ? l : 1 - l) * s,
7518                 m1 = 2 * l - m2;
7519             return new Rgb(
7520               hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),
7521               hsl2rgb(h, m1, m2),
7522               hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),
7523               this.opacity
7524             );
7525           },
7526           displayable: function() {
7527             return (0 <= this.s && this.s <= 1 || isNaN(this.s))
7528                 && (0 <= this.l && this.l <= 1)
7529                 && (0 <= this.opacity && this.opacity <= 1);
7530           }
7531         }));
7532
7533         /* From FvD 13.37, CSS Color Module Level 3 */
7534         function hsl2rgb(h, m1, m2) {
7535           return (h < 60 ? m1 + (m2 - m1) * h / 60
7536               : h < 180 ? m2
7537               : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60
7538               : m1) * 255;
7539         }
7540
7541         var deg2rad = Math.PI / 180;
7542         var rad2deg = 180 / Math.PI;
7543
7544         // https://beta.observablehq.com/@mbostock/lab-and-rgb
7545         var K = 18,
7546             Xn = 0.96422,
7547             Yn = 1,
7548             Zn = 0.82521,
7549             t0 = 4 / 29,
7550             t1 = 6 / 29,
7551             t2 = 3 * t1 * t1,
7552             t3 = t1 * t1 * t1;
7553
7554         function labConvert(o) {
7555           if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity);
7556           if (o instanceof Hcl) {
7557             if (isNaN(o.h)) return new Lab(o.l, 0, 0, o.opacity);
7558             var h = o.h * deg2rad;
7559             return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity);
7560           }
7561           if (!(o instanceof Rgb)) o = rgbConvert(o);
7562           var r = rgb2lrgb(o.r),
7563               g = rgb2lrgb(o.g),
7564               b = rgb2lrgb(o.b),
7565               y = xyz2lab((0.2225045 * r + 0.7168786 * g + 0.0606169 * b) / Yn), x, z;
7566           if (r === g && g === b) x = z = y; else {
7567             x = xyz2lab((0.4360747 * r + 0.3850649 * g + 0.1430804 * b) / Xn);
7568             z = xyz2lab((0.0139322 * r + 0.0971045 * g + 0.7141733 * b) / Zn);
7569           }
7570           return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity);
7571         }
7572
7573         function gray(l, opacity) {
7574           return new Lab(l, 0, 0, opacity == null ? 1 : opacity);
7575         }
7576
7577         function lab(l, a, b, opacity) {
7578           return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity);
7579         }
7580
7581         function Lab(l, a, b, opacity) {
7582           this.l = +l;
7583           this.a = +a;
7584           this.b = +b;
7585           this.opacity = +opacity;
7586         }
7587
7588         define$1(Lab, lab, extend(Color, {
7589           brighter: function(k) {
7590             return new Lab(this.l + K * (k == null ? 1 : k), this.a, this.b, this.opacity);
7591           },
7592           darker: function(k) {
7593             return new Lab(this.l - K * (k == null ? 1 : k), this.a, this.b, this.opacity);
7594           },
7595           rgb: function() {
7596             var y = (this.l + 16) / 116,
7597                 x = isNaN(this.a) ? y : y + this.a / 500,
7598                 z = isNaN(this.b) ? y : y - this.b / 200;
7599             x = Xn * lab2xyz(x);
7600             y = Yn * lab2xyz(y);
7601             z = Zn * lab2xyz(z);
7602             return new Rgb(
7603               lrgb2rgb( 3.1338561 * x - 1.6168667 * y - 0.4906146 * z),
7604               lrgb2rgb(-0.9787684 * x + 1.9161415 * y + 0.0334540 * z),
7605               lrgb2rgb( 0.0719453 * x - 0.2289914 * y + 1.4052427 * z),
7606               this.opacity
7607             );
7608           }
7609         }));
7610
7611         function xyz2lab(t) {
7612           return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0;
7613         }
7614
7615         function lab2xyz(t) {
7616           return t > t1 ? t * t * t : t2 * (t - t0);
7617         }
7618
7619         function lrgb2rgb(x) {
7620           return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055);
7621         }
7622
7623         function rgb2lrgb(x) {
7624           return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);
7625         }
7626
7627         function hclConvert(o) {
7628           if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity);
7629           if (!(o instanceof Lab)) o = labConvert(o);
7630           if (o.a === 0 && o.b === 0) return new Hcl(NaN, 0, o.l, o.opacity);
7631           var h = Math.atan2(o.b, o.a) * rad2deg;
7632           return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity);
7633         }
7634
7635         function lch(l, c, h, opacity) {
7636           return arguments.length === 1 ? hclConvert(l) : new Hcl(h, c, l, opacity == null ? 1 : opacity);
7637         }
7638
7639         function hcl(h, c, l, opacity) {
7640           return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity);
7641         }
7642
7643         function Hcl(h, c, l, opacity) {
7644           this.h = +h;
7645           this.c = +c;
7646           this.l = +l;
7647           this.opacity = +opacity;
7648         }
7649
7650         define$1(Hcl, hcl, extend(Color, {
7651           brighter: function(k) {
7652             return new Hcl(this.h, this.c, this.l + K * (k == null ? 1 : k), this.opacity);
7653           },
7654           darker: function(k) {
7655             return new Hcl(this.h, this.c, this.l - K * (k == null ? 1 : k), this.opacity);
7656           },
7657           rgb: function() {
7658             return labConvert(this).rgb();
7659           }
7660         }));
7661
7662         var A = -0.14861,
7663             B = +1.78277,
7664             C = -0.29227,
7665             D = -0.90649,
7666             E = +1.97294,
7667             ED = E * D,
7668             EB = E * B,
7669             BC_DA = B * C - D * A;
7670
7671         function cubehelixConvert(o) {
7672           if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity);
7673           if (!(o instanceof Rgb)) o = rgbConvert(o);
7674           var r = o.r / 255,
7675               g = o.g / 255,
7676               b = o.b / 255,
7677               l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB),
7678               bl = b - l,
7679               k = (E * (g - l) - C * bl) / D,
7680               s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), // NaN if l=0 or l=1
7681               h = s ? Math.atan2(k, bl) * rad2deg - 120 : NaN;
7682           return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity);
7683         }
7684
7685         function cubehelix(h, s, l, opacity) {
7686           return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity);
7687         }
7688
7689         function Cubehelix(h, s, l, opacity) {
7690           this.h = +h;
7691           this.s = +s;
7692           this.l = +l;
7693           this.opacity = +opacity;
7694         }
7695
7696         define$1(Cubehelix, cubehelix, extend(Color, {
7697           brighter: function(k) {
7698             k = k == null ? brighter : Math.pow(brighter, k);
7699             return new Cubehelix(this.h, this.s, this.l * k, this.opacity);
7700           },
7701           darker: function(k) {
7702             k = k == null ? darker : Math.pow(darker, k);
7703             return new Cubehelix(this.h, this.s, this.l * k, this.opacity);
7704           },
7705           rgb: function() {
7706             var h = isNaN(this.h) ? 0 : (this.h + 120) * deg2rad,
7707                 l = +this.l,
7708                 a = isNaN(this.s) ? 0 : this.s * l * (1 - l),
7709                 cosh = Math.cos(h),
7710                 sinh = Math.sin(h);
7711             return new Rgb(
7712               255 * (l + a * (A * cosh + B * sinh)),
7713               255 * (l + a * (C * cosh + D * sinh)),
7714               255 * (l + a * (E * cosh)),
7715               this.opacity
7716             );
7717           }
7718         }));
7719
7720         function basis(t1, v0, v1, v2, v3) {
7721           var t2 = t1 * t1, t3 = t2 * t1;
7722           return ((1 - 3 * t1 + 3 * t2 - t3) * v0
7723               + (4 - 6 * t2 + 3 * t3) * v1
7724               + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2
7725               + t3 * v3) / 6;
7726         }
7727
7728         function basis$1(values) {
7729           var n = values.length - 1;
7730           return function(t) {
7731             var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n),
7732                 v1 = values[i],
7733                 v2 = values[i + 1],
7734                 v0 = i > 0 ? values[i - 1] : 2 * v1 - v2,
7735                 v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;
7736             return basis((t - i / n) * n, v0, v1, v2, v3);
7737           };
7738         }
7739
7740         function basisClosed(values) {
7741           var n = values.length;
7742           return function(t) {
7743             var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n),
7744                 v0 = values[(i + n - 1) % n],
7745                 v1 = values[i % n],
7746                 v2 = values[(i + 1) % n],
7747                 v3 = values[(i + 2) % n];
7748             return basis((t - i / n) * n, v0, v1, v2, v3);
7749           };
7750         }
7751
7752         function constant$3(x) {
7753           return function() {
7754             return x;
7755           };
7756         }
7757
7758         function linear(a, d) {
7759           return function(t) {
7760             return a + t * d;
7761           };
7762         }
7763
7764         function exponential(a, b, y) {
7765           return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {
7766             return Math.pow(a + t * b, y);
7767           };
7768         }
7769
7770         function hue(a, b) {
7771           var d = b - a;
7772           return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant$3(isNaN(a) ? b : a);
7773         }
7774
7775         function gamma(y) {
7776           return (y = +y) === 1 ? nogamma : function(a, b) {
7777             return b - a ? exponential(a, b, y) : constant$3(isNaN(a) ? b : a);
7778           };
7779         }
7780
7781         function nogamma(a, b) {
7782           var d = b - a;
7783           return d ? linear(a, d) : constant$3(isNaN(a) ? b : a);
7784         }
7785
7786         var d3_interpolateRgb = (function rgbGamma(y) {
7787           var color = gamma(y);
7788
7789           function rgb$1(start, end) {
7790             var r = color((start = rgb(start)).r, (end = rgb(end)).r),
7791                 g = color(start.g, end.g),
7792                 b = color(start.b, end.b),
7793                 opacity = nogamma(start.opacity, end.opacity);
7794             return function(t) {
7795               start.r = r(t);
7796               start.g = g(t);
7797               start.b = b(t);
7798               start.opacity = opacity(t);
7799               return start + "";
7800             };
7801           }
7802
7803           rgb$1.gamma = rgbGamma;
7804
7805           return rgb$1;
7806         })(1);
7807
7808         function rgbSpline(spline) {
7809           return function(colors) {
7810             var n = colors.length,
7811                 r = new Array(n),
7812                 g = new Array(n),
7813                 b = new Array(n),
7814                 i, color;
7815             for (i = 0; i < n; ++i) {
7816               color = rgb(colors[i]);
7817               r[i] = color.r || 0;
7818               g[i] = color.g || 0;
7819               b[i] = color.b || 0;
7820             }
7821             r = spline(r);
7822             g = spline(g);
7823             b = spline(b);
7824             color.opacity = 1;
7825             return function(t) {
7826               color.r = r(t);
7827               color.g = g(t);
7828               color.b = b(t);
7829               return color + "";
7830             };
7831           };
7832         }
7833
7834         var rgbBasis = rgbSpline(basis$1);
7835         var rgbBasisClosed = rgbSpline(basisClosed);
7836
7837         function array$2(a, b) {
7838           var nb = b ? b.length : 0,
7839               na = a ? Math.min(nb, a.length) : 0,
7840               x = new Array(na),
7841               c = new Array(nb),
7842               i;
7843
7844           for (i = 0; i < na; ++i) x[i] = d3_interpolate(a[i], b[i]);
7845           for (; i < nb; ++i) c[i] = b[i];
7846
7847           return function(t) {
7848             for (i = 0; i < na; ++i) c[i] = x[i](t);
7849             return c;
7850           };
7851         }
7852
7853         function date(a, b) {
7854           var d = new Date;
7855           return a = +a, b -= a, function(t) {
7856             return d.setTime(a + b * t), d;
7857           };
7858         }
7859
7860         function d3_interpolateNumber(a, b) {
7861           return a = +a, b -= a, function(t) {
7862             return a + b * t;
7863           };
7864         }
7865
7866         function object(a, b) {
7867           var i = {},
7868               c = {},
7869               k;
7870
7871           if (a === null || typeof a !== "object") a = {};
7872           if (b === null || typeof b !== "object") b = {};
7873
7874           for (k in b) {
7875             if (k in a) {
7876               i[k] = d3_interpolate(a[k], b[k]);
7877             } else {
7878               c[k] = b[k];
7879             }
7880           }
7881
7882           return function(t) {
7883             for (k in i) c[k] = i[k](t);
7884             return c;
7885           };
7886         }
7887
7888         var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,
7889             reB = new RegExp(reA.source, "g");
7890
7891         function zero(b) {
7892           return function() {
7893             return b;
7894           };
7895         }
7896
7897         function one(b) {
7898           return function(t) {
7899             return b(t) + "";
7900           };
7901         }
7902
7903         function interpolateString(a, b) {
7904           var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b
7905               am, // current match in a
7906               bm, // current match in b
7907               bs, // string preceding current number in b, if any
7908               i = -1, // index in s
7909               s = [], // string constants and placeholders
7910               q = []; // number interpolators
7911
7912           // Coerce inputs to strings.
7913           a = a + "", b = b + "";
7914
7915           // Interpolate pairs of numbers in a & b.
7916           while ((am = reA.exec(a))
7917               && (bm = reB.exec(b))) {
7918             if ((bs = bm.index) > bi) { // a string precedes the next number in b
7919               bs = b.slice(bi, bs);
7920               if (s[i]) s[i] += bs; // coalesce with previous string
7921               else s[++i] = bs;
7922             }
7923             if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match
7924               if (s[i]) s[i] += bm; // coalesce with previous string
7925               else s[++i] = bm;
7926             } else { // interpolate non-matching numbers
7927               s[++i] = null;
7928               q.push({i: i, x: d3_interpolateNumber(am, bm)});
7929             }
7930             bi = reB.lastIndex;
7931           }
7932
7933           // Add remains of b.
7934           if (bi < b.length) {
7935             bs = b.slice(bi);
7936             if (s[i]) s[i] += bs; // coalesce with previous string
7937             else s[++i] = bs;
7938           }
7939
7940           // Special optimization for only a single match.
7941           // Otherwise, interpolate each of the numbers and rejoin the string.
7942           return s.length < 2 ? (q[0]
7943               ? one(q[0].x)
7944               : zero(b))
7945               : (b = q.length, function(t) {
7946                   for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);
7947                   return s.join("");
7948                 });
7949         }
7950
7951         function d3_interpolate(a, b) {
7952           var t = typeof b, c;
7953           return b == null || t === "boolean" ? constant$3(b)
7954               : (t === "number" ? d3_interpolateNumber
7955               : t === "string" ? ((c = color(b)) ? (b = c, d3_interpolateRgb) : interpolateString)
7956               : b instanceof color ? d3_interpolateRgb
7957               : b instanceof Date ? date
7958               : Array.isArray(b) ? array$2
7959               : typeof b.valueOf !== "function" && typeof b.toString !== "function" || isNaN(b) ? object
7960               : d3_interpolateNumber)(a, b);
7961         }
7962
7963         function discrete(range) {
7964           var n = range.length;
7965           return function(t) {
7966             return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))];
7967           };
7968         }
7969
7970         function hue$1(a, b) {
7971           var i = hue(+a, +b);
7972           return function(t) {
7973             var x = i(t);
7974             return x - 360 * Math.floor(x / 360);
7975           };
7976         }
7977
7978         function interpolateRound(a, b) {
7979           return a = +a, b -= a, function(t) {
7980             return Math.round(a + b * t);
7981           };
7982         }
7983
7984         var degrees = 180 / Math.PI;
7985
7986         var identity$2 = {
7987           translateX: 0,
7988           translateY: 0,
7989           rotate: 0,
7990           skewX: 0,
7991           scaleX: 1,
7992           scaleY: 1
7993         };
7994
7995         function decompose(a, b, c, d, e, f) {
7996           var scaleX, scaleY, skewX;
7997           if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX;
7998           if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX;
7999           if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY;
8000           if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX;
8001           return {
8002             translateX: e,
8003             translateY: f,
8004             rotate: Math.atan2(b, a) * degrees,
8005             skewX: Math.atan(skewX) * degrees,
8006             scaleX: scaleX,
8007             scaleY: scaleY
8008           };
8009         }
8010
8011         var cssNode,
8012             cssRoot,
8013             cssView,
8014             svgNode;
8015
8016         function parseCss(value) {
8017           if (value === "none") return identity$2;
8018           if (!cssNode) cssNode = document.createElement("DIV"), cssRoot = document.documentElement, cssView = document.defaultView;
8019           cssNode.style.transform = value;
8020           value = cssView.getComputedStyle(cssRoot.appendChild(cssNode), null).getPropertyValue("transform");
8021           cssRoot.removeChild(cssNode);
8022           value = value.slice(7, -1).split(",");
8023           return decompose(+value[0], +value[1], +value[2], +value[3], +value[4], +value[5]);
8024         }
8025
8026         function parseSvg(value) {
8027           if (value == null) return identity$2;
8028           if (!svgNode) svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g");
8029           svgNode.setAttribute("transform", value);
8030           if (!(value = svgNode.transform.baseVal.consolidate())) return identity$2;
8031           value = value.matrix;
8032           return decompose(value.a, value.b, value.c, value.d, value.e, value.f);
8033         }
8034
8035         function interpolateTransform(parse, pxComma, pxParen, degParen) {
8036
8037           function pop(s) {
8038             return s.length ? s.pop() + " " : "";
8039           }
8040
8041           function translate(xa, ya, xb, yb, s, q) {
8042             if (xa !== xb || ya !== yb) {
8043               var i = s.push("translate(", null, pxComma, null, pxParen);
8044               q.push({i: i - 4, x: d3_interpolateNumber(xa, xb)}, {i: i - 2, x: d3_interpolateNumber(ya, yb)});
8045             } else if (xb || yb) {
8046               s.push("translate(" + xb + pxComma + yb + pxParen);
8047             }
8048           }
8049
8050           function rotate(a, b, s, q) {
8051             if (a !== b) {
8052               if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path
8053               q.push({i: s.push(pop(s) + "rotate(", null, degParen) - 2, x: d3_interpolateNumber(a, b)});
8054             } else if (b) {
8055               s.push(pop(s) + "rotate(" + b + degParen);
8056             }
8057           }
8058
8059           function skewX(a, b, s, q) {
8060             if (a !== b) {
8061               q.push({i: s.push(pop(s) + "skewX(", null, degParen) - 2, x: d3_interpolateNumber(a, b)});
8062             } else if (b) {
8063               s.push(pop(s) + "skewX(" + b + degParen);
8064             }
8065           }
8066
8067           function scale(xa, ya, xb, yb, s, q) {
8068             if (xa !== xb || ya !== yb) {
8069               var i = s.push(pop(s) + "scale(", null, ",", null, ")");
8070               q.push({i: i - 4, x: d3_interpolateNumber(xa, xb)}, {i: i - 2, x: d3_interpolateNumber(ya, yb)});
8071             } else if (xb !== 1 || yb !== 1) {
8072               s.push(pop(s) + "scale(" + xb + "," + yb + ")");
8073             }
8074           }
8075
8076           return function(a, b) {
8077             var s = [], // string constants and placeholders
8078                 q = []; // number interpolators
8079             a = parse(a), b = parse(b);
8080             translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q);
8081             rotate(a.rotate, b.rotate, s, q);
8082             skewX(a.skewX, b.skewX, s, q);
8083             scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q);
8084             a = b = null; // gc
8085             return function(t) {
8086               var i = -1, n = q.length, o;
8087               while (++i < n) s[(o = q[i]).i] = o.x(t);
8088               return s.join("");
8089             };
8090           };
8091         }
8092
8093         var interpolateTransformCss = interpolateTransform(parseCss, "px, ", "px)", "deg)");
8094         var interpolateTransformSvg = interpolateTransform(parseSvg, ", ", ")", ")");
8095
8096         var rho = Math.SQRT2,
8097             rho2 = 2,
8098             rho4 = 4,
8099             epsilon2 = 1e-12;
8100
8101         function cosh(x) {
8102           return ((x = Math.exp(x)) + 1 / x) / 2;
8103         }
8104
8105         function sinh(x) {
8106           return ((x = Math.exp(x)) - 1 / x) / 2;
8107         }
8108
8109         function tanh(x) {
8110           return ((x = Math.exp(2 * x)) - 1) / (x + 1);
8111         }
8112
8113         // p0 = [ux0, uy0, w0]
8114         // p1 = [ux1, uy1, w1]
8115         function interpolateZoom(p0, p1) {
8116           var ux0 = p0[0], uy0 = p0[1], w0 = p0[2],
8117               ux1 = p1[0], uy1 = p1[1], w1 = p1[2],
8118               dx = ux1 - ux0,
8119               dy = uy1 - uy0,
8120               d2 = dx * dx + dy * dy,
8121               i,
8122               S;
8123
8124           // Special case for u0 ≅ u1.
8125           if (d2 < epsilon2) {
8126             S = Math.log(w1 / w0) / rho;
8127             i = function(t) {
8128               return [
8129                 ux0 + t * dx,
8130                 uy0 + t * dy,
8131                 w0 * Math.exp(rho * t * S)
8132               ];
8133             };
8134           }
8135
8136           // General case.
8137           else {
8138             var d1 = Math.sqrt(d2),
8139                 b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1),
8140                 b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1),
8141                 r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0),
8142                 r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);
8143             S = (r1 - r0) / rho;
8144             i = function(t) {
8145               var s = t * S,
8146                   coshr0 = cosh(r0),
8147                   u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0));
8148               return [
8149                 ux0 + u * dx,
8150                 uy0 + u * dy,
8151                 w0 * coshr0 / cosh(rho * s + r0)
8152               ];
8153             };
8154           }
8155
8156           i.duration = S * 1000;
8157
8158           return i;
8159         }
8160
8161         function hsl$1(hue) {
8162           return function(start, end) {
8163             var h = hue((start = hsl(start)).h, (end = hsl(end)).h),
8164                 s = nogamma(start.s, end.s),
8165                 l = nogamma(start.l, end.l),
8166                 opacity = nogamma(start.opacity, end.opacity);
8167             return function(t) {
8168               start.h = h(t);
8169               start.s = s(t);
8170               start.l = l(t);
8171               start.opacity = opacity(t);
8172               return start + "";
8173             };
8174           }
8175         }
8176
8177         var hsl$2 = hsl$1(hue);
8178         var hslLong = hsl$1(nogamma);
8179
8180         function lab$1(start, end) {
8181           var l = nogamma((start = lab(start)).l, (end = lab(end)).l),
8182               a = nogamma(start.a, end.a),
8183               b = nogamma(start.b, end.b),
8184               opacity = nogamma(start.opacity, end.opacity);
8185           return function(t) {
8186             start.l = l(t);
8187             start.a = a(t);
8188             start.b = b(t);
8189             start.opacity = opacity(t);
8190             return start + "";
8191           };
8192         }
8193
8194         function hcl$1(hue) {
8195           return function(start, end) {
8196             var h = hue((start = hcl(start)).h, (end = hcl(end)).h),
8197                 c = nogamma(start.c, end.c),
8198                 l = nogamma(start.l, end.l),
8199                 opacity = nogamma(start.opacity, end.opacity);
8200             return function(t) {
8201               start.h = h(t);
8202               start.c = c(t);
8203               start.l = l(t);
8204               start.opacity = opacity(t);
8205               return start + "";
8206             };
8207           }
8208         }
8209
8210         var hcl$2 = hcl$1(hue);
8211         var hclLong = hcl$1(nogamma);
8212
8213         function cubehelix$1(hue) {
8214           return (function cubehelixGamma(y) {
8215             y = +y;
8216
8217             function cubehelix$1(start, end) {
8218               var h = hue((start = cubehelix(start)).h, (end = cubehelix(end)).h),
8219                   s = nogamma(start.s, end.s),
8220                   l = nogamma(start.l, end.l),
8221                   opacity = nogamma(start.opacity, end.opacity);
8222               return function(t) {
8223                 start.h = h(t);
8224                 start.s = s(t);
8225                 start.l = l(Math.pow(t, y));
8226                 start.opacity = opacity(t);
8227                 return start + "";
8228               };
8229             }
8230
8231             cubehelix$1.gamma = cubehelixGamma;
8232
8233             return cubehelix$1;
8234           })(1);
8235         }
8236
8237         var cubehelix$2 = cubehelix$1(hue);
8238         var cubehelixLong = cubehelix$1(nogamma);
8239
8240         function piecewise(interpolate, values) {
8241           var i = 0, n = values.length - 1, v = values[0], I = new Array(n < 0 ? 0 : n);
8242           while (i < n) I[i] = interpolate(v, v = values[++i]);
8243           return function(t) {
8244             var i = Math.max(0, Math.min(n - 1, Math.floor(t *= n)));
8245             return I[i](t - i);
8246           };
8247         }
8248
8249         function d3_quantize(interpolator, n) {
8250           var samples = new Array(n);
8251           for (var i = 0; i < n; ++i) samples[i] = interpolator(i / (n - 1));
8252           return samples;
8253         }
8254
8255         var frame = 0, // is an animation frame pending?
8256             timeout = 0, // is a timeout pending?
8257             interval = 0, // are any timers active?
8258             pokeDelay = 1000, // how frequently we check for clock skew
8259             taskHead,
8260             taskTail,
8261             clockLast = 0,
8262             clockNow = 0,
8263             clockSkew = 0,
8264             clock = typeof performance === "object" && performance.now ? performance : Date,
8265             setFrame = typeof window === "object" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); };
8266
8267         function now() {
8268           return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);
8269         }
8270
8271         function clearNow() {
8272           clockNow = 0;
8273         }
8274
8275         function Timer() {
8276           this._call =
8277           this._time =
8278           this._next = null;
8279         }
8280
8281         Timer.prototype = timer.prototype = {
8282           constructor: Timer,
8283           restart: function(callback, delay, time) {
8284             if (typeof callback !== "function") throw new TypeError("callback is not a function");
8285             time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);
8286             if (!this._next && taskTail !== this) {
8287               if (taskTail) taskTail._next = this;
8288               else taskHead = this;
8289               taskTail = this;
8290             }
8291             this._call = callback;
8292             this._time = time;
8293             sleep();
8294           },
8295           stop: function() {
8296             if (this._call) {
8297               this._call = null;
8298               this._time = Infinity;
8299               sleep();
8300             }
8301           }
8302         };
8303
8304         function timer(callback, delay, time) {
8305           var t = new Timer;
8306           t.restart(callback, delay, time);
8307           return t;
8308         }
8309
8310         function timerFlush() {
8311           now(); // Get the current time, if not already set.
8312           ++frame; // Pretend we’ve set an alarm, if we haven’t already.
8313           var t = taskHead, e;
8314           while (t) {
8315             if ((e = clockNow - t._time) >= 0) t._call.call(null, e);
8316             t = t._next;
8317           }
8318           --frame;
8319         }
8320
8321         function wake() {
8322           clockNow = (clockLast = clock.now()) + clockSkew;
8323           frame = timeout = 0;
8324           try {
8325             timerFlush();
8326           } finally {
8327             frame = 0;
8328             nap();
8329             clockNow = 0;
8330           }
8331         }
8332
8333         function poke() {
8334           var now = clock.now(), delay = now - clockLast;
8335           if (delay > pokeDelay) clockSkew -= delay, clockLast = now;
8336         }
8337
8338         function nap() {
8339           var t0, t1 = taskHead, t2, time = Infinity;
8340           while (t1) {
8341             if (t1._call) {
8342               if (time > t1._time) time = t1._time;
8343               t0 = t1, t1 = t1._next;
8344             } else {
8345               t2 = t1._next, t1._next = null;
8346               t1 = t0 ? t0._next = t2 : taskHead = t2;
8347             }
8348           }
8349           taskTail = t0;
8350           sleep(time);
8351         }
8352
8353         function sleep(time) {
8354           if (frame) return; // Soonest alarm already set, or will be.
8355           if (timeout) timeout = clearTimeout(timeout);
8356           var delay = time - clockNow; // Strictly less than if we recomputed clockNow.
8357           if (delay > 24) {
8358             if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew);
8359             if (interval) interval = clearInterval(interval);
8360           } else {
8361             if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay);
8362             frame = 1, setFrame(wake);
8363           }
8364         }
8365
8366         function d3_timeout(callback, delay, time) {
8367           var t = new Timer;
8368           delay = delay == null ? 0 : +delay;
8369           t.restart(function(elapsed) {
8370             t.stop();
8371             callback(elapsed + delay);
8372           }, delay, time);
8373           return t;
8374         }
8375
8376         function interval$1(callback, delay, time) {
8377           var t = new Timer, total = delay;
8378           if (delay == null) return t.restart(callback, delay, time), t;
8379           delay = +delay, time = time == null ? now() : +time;
8380           t.restart(function tick(elapsed) {
8381             elapsed += total;
8382             t.restart(tick, total += delay, time);
8383             callback(elapsed);
8384           }, delay, time);
8385           return t;
8386         }
8387
8388         var emptyOn = dispatch("start", "end", "cancel", "interrupt");
8389         var emptyTween = [];
8390
8391         var CREATED = 0;
8392         var SCHEDULED = 1;
8393         var STARTING = 2;
8394         var STARTED = 3;
8395         var RUNNING = 4;
8396         var ENDING = 5;
8397         var ENDED = 6;
8398
8399         function schedule(node, name, id, index, group, timing) {
8400           var schedules = node.__transition;
8401           if (!schedules) node.__transition = {};
8402           else if (id in schedules) return;
8403           create$6(node, id, {
8404             name: name,
8405             index: index, // For context during callback.
8406             group: group, // For context during callback.
8407             on: emptyOn,
8408             tween: emptyTween,
8409             time: timing.time,
8410             delay: timing.delay,
8411             duration: timing.duration,
8412             ease: timing.ease,
8413             timer: null,
8414             state: CREATED
8415           });
8416         }
8417
8418         function init(node, id) {
8419           var schedule = get$2(node, id);
8420           if (schedule.state > CREATED) throw new Error("too late; already scheduled");
8421           return schedule;
8422         }
8423
8424         function set$1(node, id) {
8425           var schedule = get$2(node, id);
8426           if (schedule.state > STARTED) throw new Error("too late; already running");
8427           return schedule;
8428         }
8429
8430         function get$2(node, id) {
8431           var schedule = node.__transition;
8432           if (!schedule || !(schedule = schedule[id])) throw new Error("transition not found");
8433           return schedule;
8434         }
8435
8436         function create$6(node, id, self) {
8437           var schedules = node.__transition,
8438               tween;
8439
8440           // Initialize the self timer when the transition is created.
8441           // Note the actual delay is not known until the first callback!
8442           schedules[id] = self;
8443           self.timer = timer(schedule, 0, self.time);
8444
8445           function schedule(elapsed) {
8446             self.state = SCHEDULED;
8447             self.timer.restart(start, self.delay, self.time);
8448
8449             // If the elapsed delay is less than our first sleep, start immediately.
8450             if (self.delay <= elapsed) start(elapsed - self.delay);
8451           }
8452
8453           function start(elapsed) {
8454             var i, j, n, o;
8455
8456             // If the state is not SCHEDULED, then we previously errored on start.
8457             if (self.state !== SCHEDULED) return stop();
8458
8459             for (i in schedules) {
8460               o = schedules[i];
8461               if (o.name !== self.name) continue;
8462
8463               // While this element already has a starting transition during this frame,
8464               // defer starting an interrupting transition until that transition has a
8465               // chance to tick (and possibly end); see d3/d3-transition#54!
8466               if (o.state === STARTED) return d3_timeout(start);
8467
8468               // Interrupt the active transition, if any.
8469               if (o.state === RUNNING) {
8470                 o.state = ENDED;
8471                 o.timer.stop();
8472                 o.on.call("interrupt", node, node.__data__, o.index, o.group);
8473                 delete schedules[i];
8474               }
8475
8476               // Cancel any pre-empted transitions.
8477               else if (+i < id) {
8478                 o.state = ENDED;
8479                 o.timer.stop();
8480                 o.on.call("cancel", node, node.__data__, o.index, o.group);
8481                 delete schedules[i];
8482               }
8483             }
8484
8485             // Defer the first tick to end of the current frame; see d3/d3#1576.
8486             // Note the transition may be canceled after start and before the first tick!
8487             // Note this must be scheduled before the start event; see d3/d3-transition#16!
8488             // Assuming this is successful, subsequent callbacks go straight to tick.
8489             d3_timeout(function() {
8490               if (self.state === STARTED) {
8491                 self.state = RUNNING;
8492                 self.timer.restart(tick, self.delay, self.time);
8493                 tick(elapsed);
8494               }
8495             });
8496
8497             // Dispatch the start event.
8498             // Note this must be done before the tween are initialized.
8499             self.state = STARTING;
8500             self.on.call("start", node, node.__data__, self.index, self.group);
8501             if (self.state !== STARTING) return; // interrupted
8502             self.state = STARTED;
8503
8504             // Initialize the tween, deleting null tween.
8505             tween = new Array(n = self.tween.length);
8506             for (i = 0, j = -1; i < n; ++i) {
8507               if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) {
8508                 tween[++j] = o;
8509               }
8510             }
8511             tween.length = j + 1;
8512           }
8513
8514           function tick(elapsed) {
8515             var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1),
8516                 i = -1,
8517                 n = tween.length;
8518
8519             while (++i < n) {
8520               tween[i].call(node, t);
8521             }
8522
8523             // Dispatch the end event.
8524             if (self.state === ENDING) {
8525               self.on.call("end", node, node.__data__, self.index, self.group);
8526               stop();
8527             }
8528           }
8529
8530           function stop() {
8531             self.state = ENDED;
8532             self.timer.stop();
8533             delete schedules[id];
8534             for (var i in schedules) return; // eslint-disable-line no-unused-vars
8535             delete node.__transition;
8536           }
8537         }
8538
8539         function interrupt(node, name) {
8540           var schedules = node.__transition,
8541               schedule,
8542               active,
8543               empty = true,
8544               i;
8545
8546           if (!schedules) return;
8547
8548           name = name == null ? null : name + "";
8549
8550           for (i in schedules) {
8551             if ((schedule = schedules[i]).name !== name) { empty = false; continue; }
8552             active = schedule.state > STARTING && schedule.state < ENDING;
8553             schedule.state = ENDED;
8554             schedule.timer.stop();
8555             schedule.on.call(active ? "interrupt" : "cancel", node, node.__data__, schedule.index, schedule.group);
8556             delete schedules[i];
8557           }
8558
8559           if (empty) delete node.__transition;
8560         }
8561
8562         function selection_interrupt(name) {
8563           return this.each(function() {
8564             interrupt(this, name);
8565           });
8566         }
8567
8568         function tweenRemove(id, name) {
8569           var tween0, tween1;
8570           return function() {
8571             var schedule = set$1(this, id),
8572                 tween = schedule.tween;
8573
8574             // If this node shared tween with the previous node,
8575             // just assign the updated shared tween and we’re done!
8576             // Otherwise, copy-on-write.
8577             if (tween !== tween0) {
8578               tween1 = tween0 = tween;
8579               for (var i = 0, n = tween1.length; i < n; ++i) {
8580                 if (tween1[i].name === name) {
8581                   tween1 = tween1.slice();
8582                   tween1.splice(i, 1);
8583                   break;
8584                 }
8585               }
8586             }
8587
8588             schedule.tween = tween1;
8589           };
8590         }
8591
8592         function tweenFunction(id, name, value) {
8593           var tween0, tween1;
8594           if (typeof value !== "function") throw new Error;
8595           return function() {
8596             var schedule = set$1(this, id),
8597                 tween = schedule.tween;
8598
8599             // If this node shared tween with the previous node,
8600             // just assign the updated shared tween and we’re done!
8601             // Otherwise, copy-on-write.
8602             if (tween !== tween0) {
8603               tween1 = (tween0 = tween).slice();
8604               for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) {
8605                 if (tween1[i].name === name) {
8606                   tween1[i] = t;
8607                   break;
8608                 }
8609               }
8610               if (i === n) tween1.push(t);
8611             }
8612
8613             schedule.tween = tween1;
8614           };
8615         }
8616
8617         function transition_tween(name, value) {
8618           var id = this._id;
8619
8620           name += "";
8621
8622           if (arguments.length < 2) {
8623             var tween = get$2(this.node(), id).tween;
8624             for (var i = 0, n = tween.length, t; i < n; ++i) {
8625               if ((t = tween[i]).name === name) {
8626                 return t.value;
8627               }
8628             }
8629             return null;
8630           }
8631
8632           return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value));
8633         }
8634
8635         function tweenValue(transition, name, value) {
8636           var id = transition._id;
8637
8638           transition.each(function() {
8639             var schedule = set$1(this, id);
8640             (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments);
8641           });
8642
8643           return function(node) {
8644             return get$2(node, id).value[name];
8645           };
8646         }
8647
8648         function interpolate(a, b) {
8649           var c;
8650           return (typeof b === "number" ? d3_interpolateNumber
8651               : b instanceof color ? d3_interpolateRgb
8652               : (c = color(b)) ? (b = c, d3_interpolateRgb)
8653               : interpolateString)(a, b);
8654         }
8655
8656         function attrRemove$1(name) {
8657           return function() {
8658             this.removeAttribute(name);
8659           };
8660         }
8661
8662         function attrRemoveNS$1(fullname) {
8663           return function() {
8664             this.removeAttributeNS(fullname.space, fullname.local);
8665           };
8666         }
8667
8668         function attrConstant$1(name, interpolate, value1) {
8669           var string00,
8670               string1 = value1 + "",
8671               interpolate0;
8672           return function() {
8673             var string0 = this.getAttribute(name);
8674             return string0 === string1 ? null
8675                 : string0 === string00 ? interpolate0
8676                 : interpolate0 = interpolate(string00 = string0, value1);
8677           };
8678         }
8679
8680         function attrConstantNS$1(fullname, interpolate, value1) {
8681           var string00,
8682               string1 = value1 + "",
8683               interpolate0;
8684           return function() {
8685             var string0 = this.getAttributeNS(fullname.space, fullname.local);
8686             return string0 === string1 ? null
8687                 : string0 === string00 ? interpolate0
8688                 : interpolate0 = interpolate(string00 = string0, value1);
8689           };
8690         }
8691
8692         function attrFunction$1(name, interpolate, value) {
8693           var string00,
8694               string10,
8695               interpolate0;
8696           return function() {
8697             var string0, value1 = value(this), string1;
8698             if (value1 == null) return void this.removeAttribute(name);
8699             string0 = this.getAttribute(name);
8700             string1 = value1 + "";
8701             return string0 === string1 ? null
8702                 : string0 === string00 && string1 === string10 ? interpolate0
8703                 : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));
8704           };
8705         }
8706
8707         function attrFunctionNS$1(fullname, interpolate, value) {
8708           var string00,
8709               string10,
8710               interpolate0;
8711           return function() {
8712             var string0, value1 = value(this), string1;
8713             if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local);
8714             string0 = this.getAttributeNS(fullname.space, fullname.local);
8715             string1 = value1 + "";
8716             return string0 === string1 ? null
8717                 : string0 === string00 && string1 === string10 ? interpolate0
8718                 : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));
8719           };
8720         }
8721
8722         function transition_attr(name, value) {
8723           var fullname = namespace(name), i = fullname === "transform" ? interpolateTransformSvg : interpolate;
8724           return this.attrTween(name, typeof value === "function"
8725               ? (fullname.local ? attrFunctionNS$1 : attrFunction$1)(fullname, i, tweenValue(this, "attr." + name, value))
8726               : value == null ? (fullname.local ? attrRemoveNS$1 : attrRemove$1)(fullname)
8727               : (fullname.local ? attrConstantNS$1 : attrConstant$1)(fullname, i, value));
8728         }
8729
8730         function attrInterpolate(name, i) {
8731           return function(t) {
8732             this.setAttribute(name, i(t));
8733           };
8734         }
8735
8736         function attrInterpolateNS(fullname, i) {
8737           return function(t) {
8738             this.setAttributeNS(fullname.space, fullname.local, i(t));
8739           };
8740         }
8741
8742         function attrTweenNS(fullname, value) {
8743           var t0, i0;
8744           function tween() {
8745             var i = value.apply(this, arguments);
8746             if (i !== i0) t0 = (i0 = i) && attrInterpolateNS(fullname, i);
8747             return t0;
8748           }
8749           tween._value = value;
8750           return tween;
8751         }
8752
8753         function attrTween(name, value) {
8754           var t0, i0;
8755           function tween() {
8756             var i = value.apply(this, arguments);
8757             if (i !== i0) t0 = (i0 = i) && attrInterpolate(name, i);
8758             return t0;
8759           }
8760           tween._value = value;
8761           return tween;
8762         }
8763
8764         function transition_attrTween(name, value) {
8765           var key = "attr." + name;
8766           if (arguments.length < 2) return (key = this.tween(key)) && key._value;
8767           if (value == null) return this.tween(key, null);
8768           if (typeof value !== "function") throw new Error;
8769           var fullname = namespace(name);
8770           return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value));
8771         }
8772
8773         function delayFunction(id, value) {
8774           return function() {
8775             init(this, id).delay = +value.apply(this, arguments);
8776           };
8777         }
8778
8779         function delayConstant(id, value) {
8780           return value = +value, function() {
8781             init(this, id).delay = value;
8782           };
8783         }
8784
8785         function transition_delay(value) {
8786           var id = this._id;
8787
8788           return arguments.length
8789               ? this.each((typeof value === "function"
8790                   ? delayFunction
8791                   : delayConstant)(id, value))
8792               : get$2(this.node(), id).delay;
8793         }
8794
8795         function durationFunction(id, value) {
8796           return function() {
8797             set$1(this, id).duration = +value.apply(this, arguments);
8798           };
8799         }
8800
8801         function durationConstant(id, value) {
8802           return value = +value, function() {
8803             set$1(this, id).duration = value;
8804           };
8805         }
8806
8807         function transition_duration(value) {
8808           var id = this._id;
8809
8810           return arguments.length
8811               ? this.each((typeof value === "function"
8812                   ? durationFunction
8813                   : durationConstant)(id, value))
8814               : get$2(this.node(), id).duration;
8815         }
8816
8817         function easeConstant(id, value) {
8818           if (typeof value !== "function") throw new Error;
8819           return function() {
8820             set$1(this, id).ease = value;
8821           };
8822         }
8823
8824         function transition_ease(value) {
8825           var id = this._id;
8826
8827           return arguments.length
8828               ? this.each(easeConstant(id, value))
8829               : get$2(this.node(), id).ease;
8830         }
8831
8832         function transition_filter(match) {
8833           if (typeof match !== "function") match = matcher(match);
8834
8835           for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
8836             for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {
8837               if ((node = group[i]) && match.call(node, node.__data__, i, group)) {
8838                 subgroup.push(node);
8839               }
8840             }
8841           }
8842
8843           return new Transition(subgroups, this._parents, this._name, this._id);
8844         }
8845
8846         function transition_merge(transition) {
8847           if (transition._id !== this._id) throw new Error;
8848
8849           for (var groups0 = this._groups, groups1 = transition._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {
8850             for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {
8851               if (node = group0[i] || group1[i]) {
8852                 merge[i] = node;
8853               }
8854             }
8855           }
8856
8857           for (; j < m0; ++j) {
8858             merges[j] = groups0[j];
8859           }
8860
8861           return new Transition(merges, this._parents, this._name, this._id);
8862         }
8863
8864         function start(name) {
8865           return (name + "").trim().split(/^|\s+/).every(function(t) {
8866             var i = t.indexOf(".");
8867             if (i >= 0) t = t.slice(0, i);
8868             return !t || t === "start";
8869           });
8870         }
8871
8872         function onFunction(id, name, listener) {
8873           var on0, on1, sit = start(name) ? init : set$1;
8874           return function() {
8875             var schedule = sit(this, id),
8876                 on = schedule.on;
8877
8878             // If this node shared a dispatch with the previous node,
8879             // just assign the updated shared dispatch and we’re done!
8880             // Otherwise, copy-on-write.
8881             if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener);
8882
8883             schedule.on = on1;
8884           };
8885         }
8886
8887         function transition_on(name, listener) {
8888           var id = this._id;
8889
8890           return arguments.length < 2
8891               ? get$2(this.node(), id).on.on(name)
8892               : this.each(onFunction(id, name, listener));
8893         }
8894
8895         function removeFunction(id) {
8896           return function() {
8897             var parent = this.parentNode;
8898             for (var i in this.__transition) if (+i !== id) return;
8899             if (parent) parent.removeChild(this);
8900           };
8901         }
8902
8903         function transition_remove() {
8904           return this.on("end.remove", removeFunction(this._id));
8905         }
8906
8907         function transition_select(select) {
8908           var name = this._name,
8909               id = this._id;
8910
8911           if (typeof select !== "function") select = selector(select);
8912
8913           for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
8914             for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {
8915               if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {
8916                 if ("__data__" in node) subnode.__data__ = node.__data__;
8917                 subgroup[i] = subnode;
8918                 schedule(subgroup[i], name, id, i, subgroup, get$2(node, id));
8919               }
8920             }
8921           }
8922
8923           return new Transition(subgroups, this._parents, name, id);
8924         }
8925
8926         function transition_selectAll(select) {
8927           var name = this._name,
8928               id = this._id;
8929
8930           if (typeof select !== "function") select = selectorAll(select);
8931
8932           for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {
8933             for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
8934               if (node = group[i]) {
8935                 for (var children = select.call(node, node.__data__, i, group), child, inherit = get$2(node, id), k = 0, l = children.length; k < l; ++k) {
8936                   if (child = children[k]) {
8937                     schedule(child, name, id, k, children, inherit);
8938                   }
8939                 }
8940                 subgroups.push(children);
8941                 parents.push(node);
8942               }
8943             }
8944           }
8945
8946           return new Transition(subgroups, parents, name, id);
8947         }
8948
8949         var Selection$1 = selection.prototype.constructor;
8950
8951         function transition_selection() {
8952           return new Selection$1(this._groups, this._parents);
8953         }
8954
8955         function styleNull(name, interpolate) {
8956           var string00,
8957               string10,
8958               interpolate0;
8959           return function() {
8960             var string0 = styleValue(this, name),
8961                 string1 = (this.style.removeProperty(name), styleValue(this, name));
8962             return string0 === string1 ? null
8963                 : string0 === string00 && string1 === string10 ? interpolate0
8964                 : interpolate0 = interpolate(string00 = string0, string10 = string1);
8965           };
8966         }
8967
8968         function styleRemove$1(name) {
8969           return function() {
8970             this.style.removeProperty(name);
8971           };
8972         }
8973
8974         function styleConstant$1(name, interpolate, value1) {
8975           var string00,
8976               string1 = value1 + "",
8977               interpolate0;
8978           return function() {
8979             var string0 = styleValue(this, name);
8980             return string0 === string1 ? null
8981                 : string0 === string00 ? interpolate0
8982                 : interpolate0 = interpolate(string00 = string0, value1);
8983           };
8984         }
8985
8986         function styleFunction$1(name, interpolate, value) {
8987           var string00,
8988               string10,
8989               interpolate0;
8990           return function() {
8991             var string0 = styleValue(this, name),
8992                 value1 = value(this),
8993                 string1 = value1 + "";
8994             if (value1 == null) string1 = value1 = (this.style.removeProperty(name), styleValue(this, name));
8995             return string0 === string1 ? null
8996                 : string0 === string00 && string1 === string10 ? interpolate0
8997                 : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));
8998           };
8999         }
9000
9001         function styleMaybeRemove(id, name) {
9002           var on0, on1, listener0, key = "style." + name, event = "end." + key, remove;
9003           return function() {
9004             var schedule = set$1(this, id),
9005                 on = schedule.on,
9006                 listener = schedule.value[key] == null ? remove || (remove = styleRemove$1(name)) : undefined;
9007
9008             // If this node shared a dispatch with the previous node,
9009             // just assign the updated shared dispatch and we’re done!
9010             // Otherwise, copy-on-write.
9011             if (on !== on0 || listener0 !== listener) (on1 = (on0 = on).copy()).on(event, listener0 = listener);
9012
9013             schedule.on = on1;
9014           };
9015         }
9016
9017         function transition_style(name, value, priority) {
9018           var i = (name += "") === "transform" ? interpolateTransformCss : interpolate;
9019           return value == null ? this
9020               .styleTween(name, styleNull(name, i))
9021               .on("end.style." + name, styleRemove$1(name))
9022             : typeof value === "function" ? this
9023               .styleTween(name, styleFunction$1(name, i, tweenValue(this, "style." + name, value)))
9024               .each(styleMaybeRemove(this._id, name))
9025             : this
9026               .styleTween(name, styleConstant$1(name, i, value), priority)
9027               .on("end.style." + name, null);
9028         }
9029
9030         function styleInterpolate(name, i, priority) {
9031           return function(t) {
9032             this.style.setProperty(name, i(t), priority);
9033           };
9034         }
9035
9036         function styleTween(name, value, priority) {
9037           var t, i0;
9038           function tween() {
9039             var i = value.apply(this, arguments);
9040             if (i !== i0) t = (i0 = i) && styleInterpolate(name, i, priority);
9041             return t;
9042           }
9043           tween._value = value;
9044           return tween;
9045         }
9046
9047         function transition_styleTween(name, value, priority) {
9048           var key = "style." + (name += "");
9049           if (arguments.length < 2) return (key = this.tween(key)) && key._value;
9050           if (value == null) return this.tween(key, null);
9051           if (typeof value !== "function") throw new Error;
9052           return this.tween(key, styleTween(name, value, priority == null ? "" : priority));
9053         }
9054
9055         function textConstant$1(value) {
9056           return function() {
9057             this.textContent = value;
9058           };
9059         }
9060
9061         function textFunction$1(value) {
9062           return function() {
9063             var value1 = value(this);
9064             this.textContent = value1 == null ? "" : value1;
9065           };
9066         }
9067
9068         function transition_text(value) {
9069           return this.tween("text", typeof value === "function"
9070               ? textFunction$1(tweenValue(this, "text", value))
9071               : textConstant$1(value == null ? "" : value + ""));
9072         }
9073
9074         function transition_transition() {
9075           var name = this._name,
9076               id0 = this._id,
9077               id1 = newId();
9078
9079           for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {
9080             for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
9081               if (node = group[i]) {
9082                 var inherit = get$2(node, id0);
9083                 schedule(node, name, id1, i, group, {
9084                   time: inherit.time + inherit.delay + inherit.duration,
9085                   delay: 0,
9086                   duration: inherit.duration,
9087                   ease: inherit.ease
9088                 });
9089               }
9090             }
9091           }
9092
9093           return new Transition(groups, this._parents, name, id1);
9094         }
9095
9096         function transition_end() {
9097           var on0, on1, that = this, id = that._id, size = that.size();
9098           return new Promise(function(resolve, reject) {
9099             var cancel = {value: reject},
9100                 end = {value: function() { if (--size === 0) resolve(); }};
9101
9102             that.each(function() {
9103               var schedule = set$1(this, id),
9104                   on = schedule.on;
9105
9106               // If this node shared a dispatch with the previous node,
9107               // just assign the updated shared dispatch and we’re done!
9108               // Otherwise, copy-on-write.
9109               if (on !== on0) {
9110                 on1 = (on0 = on).copy();
9111                 on1._.cancel.push(cancel);
9112                 on1._.interrupt.push(cancel);
9113                 on1._.end.push(end);
9114               }
9115
9116               schedule.on = on1;
9117             });
9118           });
9119         }
9120
9121         var id$4 = 0;
9122
9123         function Transition(groups, parents, name, id) {
9124           this._groups = groups;
9125           this._parents = parents;
9126           this._name = name;
9127           this._id = id;
9128         }
9129
9130         function transition(name) {
9131           return selection().transition(name);
9132         }
9133
9134         function newId() {
9135           return ++id$4;
9136         }
9137
9138         var selection_prototype = selection.prototype;
9139
9140         Transition.prototype = transition.prototype = {
9141           constructor: Transition,
9142           select: transition_select,
9143           selectAll: transition_selectAll,
9144           filter: transition_filter,
9145           merge: transition_merge,
9146           selection: transition_selection,
9147           transition: transition_transition,
9148           call: selection_prototype.call,
9149           nodes: selection_prototype.nodes,
9150           node: selection_prototype.node,
9151           size: selection_prototype.size,
9152           empty: selection_prototype.empty,
9153           each: selection_prototype.each,
9154           on: transition_on,
9155           attr: transition_attr,
9156           attrTween: transition_attrTween,
9157           style: transition_style,
9158           styleTween: transition_styleTween,
9159           text: transition_text,
9160           remove: transition_remove,
9161           tween: transition_tween,
9162           delay: transition_delay,
9163           duration: transition_duration,
9164           ease: transition_ease,
9165           end: transition_end
9166         };
9167
9168         function linear$1(t) {
9169           return +t;
9170         }
9171
9172         function quadIn(t) {
9173           return t * t;
9174         }
9175
9176         function quadOut(t) {
9177           return t * (2 - t);
9178         }
9179
9180         function quadInOut(t) {
9181           return ((t *= 2) <= 1 ? t * t : --t * (2 - t) + 1) / 2;
9182         }
9183
9184         function cubicIn(t) {
9185           return t * t * t;
9186         }
9187
9188         function cubicOut(t) {
9189           return --t * t * t + 1;
9190         }
9191
9192         function cubicInOut(t) {
9193           return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;
9194         }
9195
9196         var exponent = 3;
9197
9198         var polyIn = (function custom(e) {
9199           e = +e;
9200
9201           function polyIn(t) {
9202             return Math.pow(t, e);
9203           }
9204
9205           polyIn.exponent = custom;
9206
9207           return polyIn;
9208         })(exponent);
9209
9210         var polyOut = (function custom(e) {
9211           e = +e;
9212
9213           function polyOut(t) {
9214             return 1 - Math.pow(1 - t, e);
9215           }
9216
9217           polyOut.exponent = custom;
9218
9219           return polyOut;
9220         })(exponent);
9221
9222         var polyInOut = (function custom(e) {
9223           e = +e;
9224
9225           function polyInOut(t) {
9226             return ((t *= 2) <= 1 ? Math.pow(t, e) : 2 - Math.pow(2 - t, e)) / 2;
9227           }
9228
9229           polyInOut.exponent = custom;
9230
9231           return polyInOut;
9232         })(exponent);
9233
9234         var pi = Math.PI,
9235             halfPi = pi / 2;
9236
9237         function sinIn(t) {
9238           return 1 - Math.cos(t * halfPi);
9239         }
9240
9241         function sinOut(t) {
9242           return Math.sin(t * halfPi);
9243         }
9244
9245         function sinInOut(t) {
9246           return (1 - Math.cos(pi * t)) / 2;
9247         }
9248
9249         function expIn(t) {
9250           return Math.pow(2, 10 * t - 10);
9251         }
9252
9253         function expOut(t) {
9254           return 1 - Math.pow(2, -10 * t);
9255         }
9256
9257         function expInOut(t) {
9258           return ((t *= 2) <= 1 ? Math.pow(2, 10 * t - 10) : 2 - Math.pow(2, 10 - 10 * t)) / 2;
9259         }
9260
9261         function circleIn(t) {
9262           return 1 - Math.sqrt(1 - t * t);
9263         }
9264
9265         function circleOut(t) {
9266           return Math.sqrt(1 - --t * t);
9267         }
9268
9269         function circleInOut(t) {
9270           return ((t *= 2) <= 1 ? 1 - Math.sqrt(1 - t * t) : Math.sqrt(1 - (t -= 2) * t) + 1) / 2;
9271         }
9272
9273         var b1 = 4 / 11,
9274             b2 = 6 / 11,
9275             b3 = 8 / 11,
9276             b4 = 3 / 4,
9277             b5 = 9 / 11,
9278             b6 = 10 / 11,
9279             b7 = 15 / 16,
9280             b8 = 21 / 22,
9281             b9 = 63 / 64,
9282             b0 = 1 / b1 / b1;
9283
9284         function bounceIn(t) {
9285           return 1 - bounceOut(1 - t);
9286         }
9287
9288         function bounceOut(t) {
9289           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;
9290         }
9291
9292         function bounceInOut(t) {
9293           return ((t *= 2) <= 1 ? 1 - bounceOut(1 - t) : bounceOut(t - 1) + 1) / 2;
9294         }
9295
9296         var overshoot = 1.70158;
9297
9298         var backIn = (function custom(s) {
9299           s = +s;
9300
9301           function backIn(t) {
9302             return t * t * ((s + 1) * t - s);
9303           }
9304
9305           backIn.overshoot = custom;
9306
9307           return backIn;
9308         })(overshoot);
9309
9310         var backOut = (function custom(s) {
9311           s = +s;
9312
9313           function backOut(t) {
9314             return --t * t * ((s + 1) * t + s) + 1;
9315           }
9316
9317           backOut.overshoot = custom;
9318
9319           return backOut;
9320         })(overshoot);
9321
9322         var backInOut = (function custom(s) {
9323           s = +s;
9324
9325           function backInOut(t) {
9326             return ((t *= 2) < 1 ? t * t * ((s + 1) * t - s) : (t -= 2) * t * ((s + 1) * t + s) + 2) / 2;
9327           }
9328
9329           backInOut.overshoot = custom;
9330
9331           return backInOut;
9332         })(overshoot);
9333
9334         var tau = 2 * Math.PI,
9335             amplitude = 1,
9336             period = 0.3;
9337
9338         var elasticIn = (function custom(a, p) {
9339           var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
9340
9341           function elasticIn(t) {
9342             return a * Math.pow(2, 10 * --t) * Math.sin((s - t) / p);
9343           }
9344
9345           elasticIn.amplitude = function(a) { return custom(a, p * tau); };
9346           elasticIn.period = function(p) { return custom(a, p); };
9347
9348           return elasticIn;
9349         })(amplitude, period);
9350
9351         var elasticOut = (function custom(a, p) {
9352           var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
9353
9354           function elasticOut(t) {
9355             return 1 - a * Math.pow(2, -10 * (t = +t)) * Math.sin((t + s) / p);
9356           }
9357
9358           elasticOut.amplitude = function(a) { return custom(a, p * tau); };
9359           elasticOut.period = function(p) { return custom(a, p); };
9360
9361           return elasticOut;
9362         })(amplitude, period);
9363
9364         var elasticInOut = (function custom(a, p) {
9365           var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
9366
9367           function elasticInOut(t) {
9368             return ((t = t * 2 - 1) < 0
9369                 ? a * Math.pow(2, 10 * t) * Math.sin((s - t) / p)
9370                 : 2 - a * Math.pow(2, -10 * t) * Math.sin((s + t) / p)) / 2;
9371           }
9372
9373           elasticInOut.amplitude = function(a) { return custom(a, p * tau); };
9374           elasticInOut.period = function(p) { return custom(a, p); };
9375
9376           return elasticInOut;
9377         })(amplitude, period);
9378
9379         var defaultTiming = {
9380           time: null, // Set on use.
9381           delay: 0,
9382           duration: 250,
9383           ease: cubicInOut
9384         };
9385
9386         function inherit(node, id) {
9387           var timing;
9388           while (!(timing = node.__transition) || !(timing = timing[id])) {
9389             if (!(node = node.parentNode)) {
9390               return defaultTiming.time = now(), defaultTiming;
9391             }
9392           }
9393           return timing;
9394         }
9395
9396         function selection_transition(name) {
9397           var id,
9398               timing;
9399
9400           if (name instanceof Transition) {
9401             id = name._id, name = name._name;
9402           } else {
9403             id = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + "";
9404           }
9405
9406           for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {
9407             for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
9408               if (node = group[i]) {
9409                 schedule(node, name, id, i, group, timing || inherit(node, id));
9410               }
9411             }
9412           }
9413
9414           return new Transition(groups, this._parents, name, id);
9415         }
9416
9417         selection.prototype.interrupt = selection_interrupt;
9418         selection.prototype.transition = selection_transition;
9419
9420         var root$2 = [null];
9421
9422         function active(node, name) {
9423           var schedules = node.__transition,
9424               schedule,
9425               i;
9426
9427           if (schedules) {
9428             name = name == null ? null : name + "";
9429             for (i in schedules) {
9430               if ((schedule = schedules[i]).state > SCHEDULED && schedule.name === name) {
9431                 return new Transition([[node]], root$2, name, +i);
9432               }
9433             }
9434           }
9435
9436           return null;
9437         }
9438
9439         function constant$4(x) {
9440           return function() {
9441             return x;
9442           };
9443         }
9444
9445         function BrushEvent(target, type, selection) {
9446           this.target = target;
9447           this.type = type;
9448           this.selection = selection;
9449         }
9450
9451         function nopropagation$1() {
9452           event.stopImmediatePropagation();
9453         }
9454
9455         function noevent$1() {
9456           event.preventDefault();
9457           event.stopImmediatePropagation();
9458         }
9459
9460         var MODE_DRAG = {name: "drag"},
9461             MODE_SPACE = {name: "space"},
9462             MODE_HANDLE = {name: "handle"},
9463             MODE_CENTER = {name: "center"};
9464
9465         var X = {
9466           name: "x",
9467           handles: ["e", "w"].map(type),
9468           input: function(x, e) { return x && [[x[0], e[0][1]], [x[1], e[1][1]]]; },
9469           output: function(xy) { return xy && [xy[0][0], xy[1][0]]; }
9470         };
9471
9472         var Y = {
9473           name: "y",
9474           handles: ["n", "s"].map(type),
9475           input: function(y, e) { return y && [[e[0][0], y[0]], [e[1][0], y[1]]]; },
9476           output: function(xy) { return xy && [xy[0][1], xy[1][1]]; }
9477         };
9478
9479         var XY = {
9480           name: "xy",
9481           handles: ["n", "e", "s", "w", "nw", "ne", "se", "sw"].map(type),
9482           input: function(xy) { return xy; },
9483           output: function(xy) { return xy; }
9484         };
9485
9486         var cursors = {
9487           overlay: "crosshair",
9488           selection: "move",
9489           n: "ns-resize",
9490           e: "ew-resize",
9491           s: "ns-resize",
9492           w: "ew-resize",
9493           nw: "nwse-resize",
9494           ne: "nesw-resize",
9495           se: "nwse-resize",
9496           sw: "nesw-resize"
9497         };
9498
9499         var flipX = {
9500           e: "w",
9501           w: "e",
9502           nw: "ne",
9503           ne: "nw",
9504           se: "sw",
9505           sw: "se"
9506         };
9507
9508         var flipY = {
9509           n: "s",
9510           s: "n",
9511           nw: "sw",
9512           ne: "se",
9513           se: "ne",
9514           sw: "nw"
9515         };
9516
9517         var signsX = {
9518           overlay: +1,
9519           selection: +1,
9520           n: null,
9521           e: +1,
9522           s: null,
9523           w: -1,
9524           nw: -1,
9525           ne: +1,
9526           se: +1,
9527           sw: -1
9528         };
9529
9530         var signsY = {
9531           overlay: +1,
9532           selection: +1,
9533           n: -1,
9534           e: null,
9535           s: +1,
9536           w: null,
9537           nw: -1,
9538           ne: -1,
9539           se: +1,
9540           sw: +1
9541         };
9542
9543         function type(t) {
9544           return {type: t};
9545         }
9546
9547         // Ignore right-click, since that should open the context menu.
9548         function defaultFilter$1() {
9549           return !event.button;
9550         }
9551
9552         function defaultExtent() {
9553           var svg = this.ownerSVGElement || this;
9554           return [[0, 0], [svg.width.baseVal.value, svg.height.baseVal.value]];
9555         }
9556
9557         // Like d3.local, but with the name “__brush” rather than auto-generated.
9558         function local$1(node) {
9559           while (!node.__brush) if (!(node = node.parentNode)) return;
9560           return node.__brush;
9561         }
9562
9563         function empty$1(extent) {
9564           return extent[0][0] === extent[1][0]
9565               || extent[0][1] === extent[1][1];
9566         }
9567
9568         function brushSelection(node) {
9569           var state = node.__brush;
9570           return state ? state.dim.output(state.selection) : null;
9571         }
9572
9573         function brushX() {
9574           return brush$1(X);
9575         }
9576
9577         function brushY() {
9578           return brush$1(Y);
9579         }
9580
9581         function brush() {
9582           return brush$1(XY);
9583         }
9584
9585         function brush$1(dim) {
9586           var extent = defaultExtent,
9587               filter = defaultFilter$1,
9588               listeners = dispatch(brush, "start", "brush", "end"),
9589               handleSize = 6,
9590               touchending;
9591
9592           function brush(group) {
9593             var overlay = group
9594                 .property("__brush", initialize)
9595               .selectAll(".overlay")
9596               .data([type("overlay")]);
9597
9598             overlay.enter().append("rect")
9599                 .attr("class", "overlay")
9600                 .attr("pointer-events", "all")
9601                 .attr("cursor", cursors.overlay)
9602               .merge(overlay)
9603                 .each(function() {
9604                   var extent = local$1(this).extent;
9605                   d3_select(this)
9606                       .attr("x", extent[0][0])
9607                       .attr("y", extent[0][1])
9608                       .attr("width", extent[1][0] - extent[0][0])
9609                       .attr("height", extent[1][1] - extent[0][1]);
9610                 });
9611
9612             group.selectAll(".selection")
9613               .data([type("selection")])
9614               .enter().append("rect")
9615                 .attr("class", "selection")
9616                 .attr("cursor", cursors.selection)
9617                 .attr("fill", "#777")
9618                 .attr("fill-opacity", 0.3)
9619                 .attr("stroke", "#fff")
9620                 .attr("shape-rendering", "crispEdges");
9621
9622             var handle = group.selectAll(".handle")
9623               .data(dim.handles, function(d) { return d.type; });
9624
9625             handle.exit().remove();
9626
9627             handle.enter().append("rect")
9628                 .attr("class", function(d) { return "handle handle--" + d.type; })
9629                 .attr("cursor", function(d) { return cursors[d.type]; });
9630
9631             group
9632                 .each(redraw)
9633                 .attr("fill", "none")
9634                 .attr("pointer-events", "all")
9635                 .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)")
9636                 .on("mousedown.brush touchstart.brush", started);
9637           }
9638
9639           brush.move = function(group, selection) {
9640             if (group.selection) {
9641               group
9642                   .on("start.brush", function() { emitter(this, arguments).beforestart().start(); })
9643                   .on("interrupt.brush end.brush", function() { emitter(this, arguments).end(); })
9644                   .tween("brush", function() {
9645                     var that = this,
9646                         state = that.__brush,
9647                         emit = emitter(that, arguments),
9648                         selection0 = state.selection,
9649                         selection1 = dim.input(typeof selection === "function" ? selection.apply(this, arguments) : selection, state.extent),
9650                         i = d3_interpolate(selection0, selection1);
9651
9652                     function tween(t) {
9653                       state.selection = t === 1 && empty$1(selection1) ? null : i(t);
9654                       redraw.call(that);
9655                       emit.brush();
9656                     }
9657
9658                     return selection0 && selection1 ? tween : tween(1);
9659                   });
9660             } else {
9661               group
9662                   .each(function() {
9663                     var that = this,
9664                         args = arguments,
9665                         state = that.__brush,
9666                         selection1 = dim.input(typeof selection === "function" ? selection.apply(that, args) : selection, state.extent),
9667                         emit = emitter(that, args).beforestart();
9668
9669                     interrupt(that);
9670                     state.selection = selection1 == null || empty$1(selection1) ? null : selection1;
9671                     redraw.call(that);
9672                     emit.start().brush().end();
9673                   });
9674             }
9675           };
9676
9677           function redraw() {
9678             var group = d3_select(this),
9679                 selection = local$1(this).selection;
9680
9681             if (selection) {
9682               group.selectAll(".selection")
9683                   .style("display", null)
9684                   .attr("x", selection[0][0])
9685                   .attr("y", selection[0][1])
9686                   .attr("width", selection[1][0] - selection[0][0])
9687                   .attr("height", selection[1][1] - selection[0][1]);
9688
9689               group.selectAll(".handle")
9690                   .style("display", null)
9691                   .attr("x", function(d) { return d.type[d.type.length - 1] === "e" ? selection[1][0] - handleSize / 2 : selection[0][0] - handleSize / 2; })
9692                   .attr("y", function(d) { return d.type[0] === "s" ? selection[1][1] - handleSize / 2 : selection[0][1] - handleSize / 2; })
9693                   .attr("width", function(d) { return d.type === "n" || d.type === "s" ? selection[1][0] - selection[0][0] + handleSize : handleSize; })
9694                   .attr("height", function(d) { return d.type === "e" || d.type === "w" ? selection[1][1] - selection[0][1] + handleSize : handleSize; });
9695             }
9696
9697             else {
9698               group.selectAll(".selection,.handle")
9699                   .style("display", "none")
9700                   .attr("x", null)
9701                   .attr("y", null)
9702                   .attr("width", null)
9703                   .attr("height", null);
9704             }
9705           }
9706
9707           function emitter(that, args) {
9708             return that.__brush.emitter || new Emitter(that, args);
9709           }
9710
9711           function Emitter(that, args) {
9712             this.that = that;
9713             this.args = args;
9714             this.state = that.__brush;
9715             this.active = 0;
9716           }
9717
9718           Emitter.prototype = {
9719             beforestart: function() {
9720               if (++this.active === 1) this.state.emitter = this, this.starting = true;
9721               return this;
9722             },
9723             start: function() {
9724               if (this.starting) this.starting = false, this.emit("start");
9725               return this;
9726             },
9727             brush: function() {
9728               this.emit("brush");
9729               return this;
9730             },
9731             end: function() {
9732               if (--this.active === 0) delete this.state.emitter, this.emit("end");
9733               return this;
9734             },
9735             emit: function(type) {
9736               customEvent(new BrushEvent(brush, type, dim.output(this.state.selection)), listeners.apply, listeners, [type, this.that, this.args]);
9737             }
9738           };
9739
9740           function started() {
9741             if (event.touches) { if (event.changedTouches.length < event.touches.length) return noevent$1(); }
9742             else if (touchending) return;
9743             if (!filter.apply(this, arguments)) return;
9744
9745             var that = this,
9746                 type = event.target.__data__.type,
9747                 mode = (event.metaKey ? type = "overlay" : type) === "selection" ? MODE_DRAG : (event.altKey ? MODE_CENTER : MODE_HANDLE),
9748                 signX = dim === Y ? null : signsX[type],
9749                 signY = dim === X ? null : signsY[type],
9750                 state = local$1(that),
9751                 extent = state.extent,
9752                 selection = state.selection,
9753                 W = extent[0][0], w0, w1,
9754                 N = extent[0][1], n0, n1,
9755                 E = extent[1][0], e0, e1,
9756                 S = extent[1][1], s0, s1,
9757                 dx,
9758                 dy,
9759                 moving,
9760                 shifting = signX && signY && event.shiftKey,
9761                 lockX,
9762                 lockY,
9763                 point0 = d3_mouse(that),
9764                 point = point0,
9765                 emit = emitter(that, arguments).beforestart();
9766
9767             if (type === "overlay") {
9768               state.selection = selection = [
9769                 [w0 = dim === Y ? W : point0[0], n0 = dim === X ? N : point0[1]],
9770                 [e0 = dim === Y ? E : w0, s0 = dim === X ? S : n0]
9771               ];
9772             } else {
9773               w0 = selection[0][0];
9774               n0 = selection[0][1];
9775               e0 = selection[1][0];
9776               s0 = selection[1][1];
9777             }
9778
9779             w1 = w0;
9780             n1 = n0;
9781             e1 = e0;
9782             s1 = s0;
9783
9784             var group = d3_select(that)
9785                 .attr("pointer-events", "none");
9786
9787             var overlay = group.selectAll(".overlay")
9788                 .attr("cursor", cursors[type]);
9789
9790             if (event.touches) {
9791               group
9792                   .on("touchmove.brush", moved, true)
9793                   .on("touchend.brush touchcancel.brush", ended, true);
9794             } else {
9795               var view = d3_select(event.view)
9796                   .on("keydown.brush", keydowned, true)
9797                   .on("keyup.brush", keyupped, true)
9798                   .on("mousemove.brush", moved, true)
9799                   .on("mouseup.brush", ended, true);
9800
9801               dragDisable(event.view);
9802             }
9803
9804             nopropagation$1();
9805             interrupt(that);
9806             redraw.call(that);
9807             emit.start();
9808
9809             function moved() {
9810               var point1 = d3_mouse(that);
9811               if (shifting && !lockX && !lockY) {
9812                 if (Math.abs(point1[0] - point[0]) > Math.abs(point1[1] - point[1])) lockY = true;
9813                 else lockX = true;
9814               }
9815               point = point1;
9816               moving = true;
9817               noevent$1();
9818               move();
9819             }
9820
9821             function move() {
9822               var t;
9823
9824               dx = point[0] - point0[0];
9825               dy = point[1] - point0[1];
9826
9827               switch (mode) {
9828                 case MODE_SPACE:
9829                 case MODE_DRAG: {
9830                   if (signX) dx = Math.max(W - w0, Math.min(E - e0, dx)), w1 = w0 + dx, e1 = e0 + dx;
9831                   if (signY) dy = Math.max(N - n0, Math.min(S - s0, dy)), n1 = n0 + dy, s1 = s0 + dy;
9832                   break;
9833                 }
9834                 case MODE_HANDLE: {
9835                   if (signX < 0) dx = Math.max(W - w0, Math.min(E - w0, dx)), w1 = w0 + dx, e1 = e0;
9836                   else if (signX > 0) dx = Math.max(W - e0, Math.min(E - e0, dx)), w1 = w0, e1 = e0 + dx;
9837                   if (signY < 0) dy = Math.max(N - n0, Math.min(S - n0, dy)), n1 = n0 + dy, s1 = s0;
9838                   else if (signY > 0) dy = Math.max(N - s0, Math.min(S - s0, dy)), n1 = n0, s1 = s0 + dy;
9839                   break;
9840                 }
9841                 case MODE_CENTER: {
9842                   if (signX) w1 = Math.max(W, Math.min(E, w0 - dx * signX)), e1 = Math.max(W, Math.min(E, e0 + dx * signX));
9843                   if (signY) n1 = Math.max(N, Math.min(S, n0 - dy * signY)), s1 = Math.max(N, Math.min(S, s0 + dy * signY));
9844                   break;
9845                 }
9846               }
9847
9848               if (e1 < w1) {
9849                 signX *= -1;
9850                 t = w0, w0 = e0, e0 = t;
9851                 t = w1, w1 = e1, e1 = t;
9852                 if (type in flipX) overlay.attr("cursor", cursors[type = flipX[type]]);
9853               }
9854
9855               if (s1 < n1) {
9856                 signY *= -1;
9857                 t = n0, n0 = s0, s0 = t;
9858                 t = n1, n1 = s1, s1 = t;
9859                 if (type in flipY) overlay.attr("cursor", cursors[type = flipY[type]]);
9860               }
9861
9862               if (state.selection) selection = state.selection; // May be set by brush.move!
9863               if (lockX) w1 = selection[0][0], e1 = selection[1][0];
9864               if (lockY) n1 = selection[0][1], s1 = selection[1][1];
9865
9866               if (selection[0][0] !== w1
9867                   || selection[0][1] !== n1
9868                   || selection[1][0] !== e1
9869                   || selection[1][1] !== s1) {
9870                 state.selection = [[w1, n1], [e1, s1]];
9871                 redraw.call(that);
9872                 emit.brush();
9873               }
9874             }
9875
9876             function ended() {
9877               nopropagation$1();
9878               if (event.touches) {
9879                 if (event.touches.length) return;
9880                 if (touchending) clearTimeout(touchending);
9881                 touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!
9882                 group.on("touchmove.brush touchend.brush touchcancel.brush", null);
9883               } else {
9884                 yesdrag(event.view, moving);
9885                 view.on("keydown.brush keyup.brush mousemove.brush mouseup.brush", null);
9886               }
9887               group.attr("pointer-events", "all");
9888               overlay.attr("cursor", cursors.overlay);
9889               if (state.selection) selection = state.selection; // May be set by brush.move (on start)!
9890               if (empty$1(selection)) state.selection = null, redraw.call(that);
9891               emit.end();
9892             }
9893
9894             function keydowned() {
9895               switch (event.keyCode) {
9896                 case 16: { // SHIFT
9897                   shifting = signX && signY;
9898                   break;
9899                 }
9900                 case 18: { // ALT
9901                   if (mode === MODE_HANDLE) {
9902                     if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;
9903                     if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;
9904                     mode = MODE_CENTER;
9905                     move();
9906                   }
9907                   break;
9908                 }
9909                 case 32: { // SPACE; takes priority over ALT
9910                   if (mode === MODE_HANDLE || mode === MODE_CENTER) {
9911                     if (signX < 0) e0 = e1 - dx; else if (signX > 0) w0 = w1 - dx;
9912                     if (signY < 0) s0 = s1 - dy; else if (signY > 0) n0 = n1 - dy;
9913                     mode = MODE_SPACE;
9914                     overlay.attr("cursor", cursors.selection);
9915                     move();
9916                   }
9917                   break;
9918                 }
9919                 default: return;
9920               }
9921               noevent$1();
9922             }
9923
9924             function keyupped() {
9925               switch (event.keyCode) {
9926                 case 16: { // SHIFT
9927                   if (shifting) {
9928                     lockX = lockY = shifting = false;
9929                     move();
9930                   }
9931                   break;
9932                 }
9933                 case 18: { // ALT
9934                   if (mode === MODE_CENTER) {
9935                     if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;
9936                     if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;
9937                     mode = MODE_HANDLE;
9938                     move();
9939                   }
9940                   break;
9941                 }
9942                 case 32: { // SPACE
9943                   if (mode === MODE_SPACE) {
9944                     if (event.altKey) {
9945                       if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;
9946                       if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;
9947                       mode = MODE_CENTER;
9948                     } else {
9949                       if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;
9950                       if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;
9951                       mode = MODE_HANDLE;
9952                     }
9953                     overlay.attr("cursor", cursors[type]);
9954                     move();
9955                   }
9956                   break;
9957                 }
9958                 default: return;
9959               }
9960               noevent$1();
9961             }
9962           }
9963
9964           function initialize() {
9965             var state = this.__brush || {selection: null};
9966             state.extent = extent.apply(this, arguments);
9967             state.dim = dim;
9968             return state;
9969           }
9970
9971           brush.extent = function(_) {
9972             return arguments.length ? (extent = typeof _ === "function" ? _ : constant$4([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), brush) : extent;
9973           };
9974
9975           brush.filter = function(_) {
9976             return arguments.length ? (filter = typeof _ === "function" ? _ : constant$4(!!_), brush) : filter;
9977           };
9978
9979           brush.handleSize = function(_) {
9980             return arguments.length ? (handleSize = +_, brush) : handleSize;
9981           };
9982
9983           brush.on = function() {
9984             var value = listeners.on.apply(listeners, arguments);
9985             return value === listeners ? brush : value;
9986           };
9987
9988           return brush;
9989         }
9990
9991         var cos = Math.cos;
9992         var sin = Math.sin;
9993         var pi$1 = Math.PI;
9994         var halfPi$1 = pi$1 / 2;
9995         var tau$1 = pi$1 * 2;
9996         var max$3 = Math.max;
9997
9998         function compareValue(compare) {
9999           return function(a, b) {
10000             return compare(
10001               a.source.value + a.target.value,
10002               b.source.value + b.target.value
10003             );
10004           };
10005         }
10006
10007         function chord() {
10008           var padAngle = 0,
10009               sortGroups = null,
10010               sortSubgroups = null,
10011               sortChords = null;
10012
10013           function chord(matrix) {
10014             var n = matrix.length,
10015                 groupSums = [],
10016                 groupIndex = d3_range(n),
10017                 subgroupIndex = [],
10018                 chords = [],
10019                 groups = chords.groups = new Array(n),
10020                 subgroups = new Array(n * n),
10021                 k,
10022                 x,
10023                 x0,
10024                 dx,
10025                 i,
10026                 j;
10027
10028             // Compute the sum.
10029             k = 0, i = -1; while (++i < n) {
10030               x = 0, j = -1; while (++j < n) {
10031                 x += matrix[i][j];
10032               }
10033               groupSums.push(x);
10034               subgroupIndex.push(d3_range(n));
10035               k += x;
10036             }
10037
10038             // Sort groups…
10039             if (sortGroups) groupIndex.sort(function(a, b) {
10040               return sortGroups(groupSums[a], groupSums[b]);
10041             });
10042
10043             // Sort subgroups…
10044             if (sortSubgroups) subgroupIndex.forEach(function(d, i) {
10045               d.sort(function(a, b) {
10046                 return sortSubgroups(matrix[i][a], matrix[i][b]);
10047               });
10048             });
10049
10050             // Convert the sum to scaling factor for [0, 2pi].
10051             // TODO Allow start and end angle to be specified?
10052             // TODO Allow padding to be specified as percentage?
10053             k = max$3(0, tau$1 - padAngle * n) / k;
10054             dx = k ? padAngle : tau$1 / n;
10055
10056             // Compute the start and end angle for each group and subgroup.
10057             // Note: Opera has a bug reordering object literal properties!
10058             x = 0, i = -1; while (++i < n) {
10059               x0 = x, j = -1; while (++j < n) {
10060                 var di = groupIndex[i],
10061                     dj = subgroupIndex[di][j],
10062                     v = matrix[di][dj],
10063                     a0 = x,
10064                     a1 = x += v * k;
10065                 subgroups[dj * n + di] = {
10066                   index: di,
10067                   subindex: dj,
10068                   startAngle: a0,
10069                   endAngle: a1,
10070                   value: v
10071                 };
10072               }
10073               groups[di] = {
10074                 index: di,
10075                 startAngle: x0,
10076                 endAngle: x,
10077                 value: groupSums[di]
10078               };
10079               x += dx;
10080             }
10081
10082             // Generate chords for each (non-empty) subgroup-subgroup link.
10083             i = -1; while (++i < n) {
10084               j = i - 1; while (++j < n) {
10085                 var source = subgroups[j * n + i],
10086                     target = subgroups[i * n + j];
10087                 if (source.value || target.value) {
10088                   chords.push(source.value < target.value
10089                       ? {source: target, target: source}
10090                       : {source: source, target: target});
10091                 }
10092               }
10093             }
10094
10095             return sortChords ? chords.sort(sortChords) : chords;
10096           }
10097
10098           chord.padAngle = function(_) {
10099             return arguments.length ? (padAngle = max$3(0, _), chord) : padAngle;
10100           };
10101
10102           chord.sortGroups = function(_) {
10103             return arguments.length ? (sortGroups = _, chord) : sortGroups;
10104           };
10105
10106           chord.sortSubgroups = function(_) {
10107             return arguments.length ? (sortSubgroups = _, chord) : sortSubgroups;
10108           };
10109
10110           chord.sortChords = function(_) {
10111             return arguments.length ? (_ == null ? sortChords = null : (sortChords = compareValue(_))._ = _, chord) : sortChords && sortChords._;
10112           };
10113
10114           return chord;
10115         }
10116
10117         var slice$6 = Array.prototype.slice;
10118
10119         function constant$5(x) {
10120           return function() {
10121             return x;
10122           };
10123         }
10124
10125         var pi$2 = Math.PI,
10126             tau$2 = 2 * pi$2,
10127             epsilon$1 = 1e-6,
10128             tauEpsilon = tau$2 - epsilon$1;
10129
10130         function Path() {
10131           this._x0 = this._y0 = // start of current subpath
10132           this._x1 = this._y1 = null; // end of current subpath
10133           this._ = "";
10134         }
10135
10136         function path() {
10137           return new Path;
10138         }
10139
10140         Path.prototype = path.prototype = {
10141           constructor: Path,
10142           moveTo: function(x, y) {
10143             this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y);
10144           },
10145           closePath: function() {
10146             if (this._x1 !== null) {
10147               this._x1 = this._x0, this._y1 = this._y0;
10148               this._ += "Z";
10149             }
10150           },
10151           lineTo: function(x, y) {
10152             this._ += "L" + (this._x1 = +x) + "," + (this._y1 = +y);
10153           },
10154           quadraticCurveTo: function(x1, y1, x, y) {
10155             this._ += "Q" + (+x1) + "," + (+y1) + "," + (this._x1 = +x) + "," + (this._y1 = +y);
10156           },
10157           bezierCurveTo: function(x1, y1, x2, y2, x, y) {
10158             this._ += "C" + (+x1) + "," + (+y1) + "," + (+x2) + "," + (+y2) + "," + (this._x1 = +x) + "," + (this._y1 = +y);
10159           },
10160           arcTo: function(x1, y1, x2, y2, r) {
10161             x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;
10162             var x0 = this._x1,
10163                 y0 = this._y1,
10164                 x21 = x2 - x1,
10165                 y21 = y2 - y1,
10166                 x01 = x0 - x1,
10167                 y01 = y0 - y1,
10168                 l01_2 = x01 * x01 + y01 * y01;
10169
10170             // Is the radius negative? Error.
10171             if (r < 0) throw new Error("negative radius: " + r);
10172
10173             // Is this path empty? Move to (x1,y1).
10174             if (this._x1 === null) {
10175               this._ += "M" + (this._x1 = x1) + "," + (this._y1 = y1);
10176             }
10177
10178             // Or, is (x1,y1) coincident with (x0,y0)? Do nothing.
10179             else if (!(l01_2 > epsilon$1));
10180
10181             // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear?
10182             // Equivalently, is (x1,y1) coincident with (x2,y2)?
10183             // Or, is the radius zero? Line to (x1,y1).
10184             else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon$1) || !r) {
10185               this._ += "L" + (this._x1 = x1) + "," + (this._y1 = y1);
10186             }
10187
10188             // Otherwise, draw an arc!
10189             else {
10190               var x20 = x2 - x0,
10191                   y20 = y2 - y0,
10192                   l21_2 = x21 * x21 + y21 * y21,
10193                   l20_2 = x20 * x20 + y20 * y20,
10194                   l21 = Math.sqrt(l21_2),
10195                   l01 = Math.sqrt(l01_2),
10196                   l = r * Math.tan((pi$2 - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2),
10197                   t01 = l / l01,
10198                   t21 = l / l21;
10199
10200               // If the start tangent is not coincident with (x0,y0), line to.
10201               if (Math.abs(t01 - 1) > epsilon$1) {
10202                 this._ += "L" + (x1 + t01 * x01) + "," + (y1 + t01 * y01);
10203               }
10204
10205               this._ += "A" + r + "," + r + ",0,0," + (+(y01 * x20 > x01 * y20)) + "," + (this._x1 = x1 + t21 * x21) + "," + (this._y1 = y1 + t21 * y21);
10206             }
10207           },
10208           arc: function(x, y, r, a0, a1, ccw) {
10209             x = +x, y = +y, r = +r;
10210             var dx = r * Math.cos(a0),
10211                 dy = r * Math.sin(a0),
10212                 x0 = x + dx,
10213                 y0 = y + dy,
10214                 cw = 1 ^ ccw,
10215                 da = ccw ? a0 - a1 : a1 - a0;
10216
10217             // Is the radius negative? Error.
10218             if (r < 0) throw new Error("negative radius: " + r);
10219
10220             // Is this path empty? Move to (x0,y0).
10221             if (this._x1 === null) {
10222               this._ += "M" + x0 + "," + y0;
10223             }
10224
10225             // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0).
10226             else if (Math.abs(this._x1 - x0) > epsilon$1 || Math.abs(this._y1 - y0) > epsilon$1) {
10227               this._ += "L" + x0 + "," + y0;
10228             }
10229
10230             // Is this arc empty? We’re done.
10231             if (!r) return;
10232
10233             // Does the angle go the wrong way? Flip the direction.
10234             if (da < 0) da = da % tau$2 + tau$2;
10235
10236             // Is this a complete circle? Draw two arcs to complete the circle.
10237             if (da > tauEpsilon) {
10238               this._ += "A" + r + "," + r + ",0,1," + cw + "," + (x - dx) + "," + (y - dy) + "A" + r + "," + r + ",0,1," + cw + "," + (this._x1 = x0) + "," + (this._y1 = y0);
10239             }
10240
10241             // Is this arc non-empty? Draw an arc!
10242             else if (da > epsilon$1) {
10243               this._ += "A" + r + "," + r + ",0," + (+(da >= pi$2)) + "," + cw + "," + (this._x1 = x + r * Math.cos(a1)) + "," + (this._y1 = y + r * Math.sin(a1));
10244             }
10245           },
10246           rect: function(x, y, w, h) {
10247             this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y) + "h" + (+w) + "v" + (+h) + "h" + (-w) + "Z";
10248           },
10249           toString: function() {
10250             return this._;
10251           }
10252         };
10253
10254         function defaultSource(d) {
10255           return d.source;
10256         }
10257
10258         function defaultTarget(d) {
10259           return d.target;
10260         }
10261
10262         function defaultRadius(d) {
10263           return d.radius;
10264         }
10265
10266         function defaultStartAngle(d) {
10267           return d.startAngle;
10268         }
10269
10270         function defaultEndAngle(d) {
10271           return d.endAngle;
10272         }
10273
10274         function ribbon() {
10275           var source = defaultSource,
10276               target = defaultTarget,
10277               radius = defaultRadius,
10278               startAngle = defaultStartAngle,
10279               endAngle = defaultEndAngle,
10280               context = null;
10281
10282           function ribbon() {
10283             var buffer,
10284                 argv = slice$6.call(arguments),
10285                 s = source.apply(this, argv),
10286                 t = target.apply(this, argv),
10287                 sr = +radius.apply(this, (argv[0] = s, argv)),
10288                 sa0 = startAngle.apply(this, argv) - halfPi$1,
10289                 sa1 = endAngle.apply(this, argv) - halfPi$1,
10290                 sx0 = sr * cos(sa0),
10291                 sy0 = sr * sin(sa0),
10292                 tr = +radius.apply(this, (argv[0] = t, argv)),
10293                 ta0 = startAngle.apply(this, argv) - halfPi$1,
10294                 ta1 = endAngle.apply(this, argv) - halfPi$1;
10295
10296             if (!context) context = buffer = path();
10297
10298             context.moveTo(sx0, sy0);
10299             context.arc(0, 0, sr, sa0, sa1);
10300             if (sa0 !== ta0 || sa1 !== ta1) { // TODO sr !== tr?
10301               context.quadraticCurveTo(0, 0, tr * cos(ta0), tr * sin(ta0));
10302               context.arc(0, 0, tr, ta0, ta1);
10303             }
10304             context.quadraticCurveTo(0, 0, sx0, sy0);
10305             context.closePath();
10306
10307             if (buffer) return context = null, buffer + "" || null;
10308           }
10309
10310           ribbon.radius = function(_) {
10311             return arguments.length ? (radius = typeof _ === "function" ? _ : constant$5(+_), ribbon) : radius;
10312           };
10313
10314           ribbon.startAngle = function(_) {
10315             return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$5(+_), ribbon) : startAngle;
10316           };
10317
10318           ribbon.endAngle = function(_) {
10319             return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$5(+_), ribbon) : endAngle;
10320           };
10321
10322           ribbon.source = function(_) {
10323             return arguments.length ? (source = _, ribbon) : source;
10324           };
10325
10326           ribbon.target = function(_) {
10327             return arguments.length ? (target = _, ribbon) : target;
10328           };
10329
10330           ribbon.context = function(_) {
10331             return arguments.length ? ((context = _ == null ? null : _), ribbon) : context;
10332           };
10333
10334           return ribbon;
10335         }
10336
10337         var prefix = "$";
10338
10339         function Map$1() {}
10340
10341         Map$1.prototype = map$3.prototype = {
10342           constructor: Map$1,
10343           has: function(key) {
10344             return (prefix + key) in this;
10345           },
10346           get: function(key) {
10347             return this[prefix + key];
10348           },
10349           set: function(key, value) {
10350             this[prefix + key] = value;
10351             return this;
10352           },
10353           remove: function(key) {
10354             var property = prefix + key;
10355             return property in this && delete this[property];
10356           },
10357           clear: function() {
10358             for (var property in this) if (property[0] === prefix) delete this[property];
10359           },
10360           keys: function() {
10361             var keys = [];
10362             for (var property in this) if (property[0] === prefix) keys.push(property.slice(1));
10363             return keys;
10364           },
10365           values: function() {
10366             var values = [];
10367             for (var property in this) if (property[0] === prefix) values.push(this[property]);
10368             return values;
10369           },
10370           entries: function() {
10371             var entries = [];
10372             for (var property in this) if (property[0] === prefix) entries.push({key: property.slice(1), value: this[property]});
10373             return entries;
10374           },
10375           size: function() {
10376             var size = 0;
10377             for (var property in this) if (property[0] === prefix) ++size;
10378             return size;
10379           },
10380           empty: function() {
10381             for (var property in this) if (property[0] === prefix) return false;
10382             return true;
10383           },
10384           each: function(f) {
10385             for (var property in this) if (property[0] === prefix) f(this[property], property.slice(1), this);
10386           }
10387         };
10388
10389         function map$3(object, f) {
10390           var map = new Map$1;
10391
10392           // Copy constructor.
10393           if (object instanceof Map$1) object.each(function(value, key) { map.set(key, value); });
10394
10395           // Index array by numeric index or specified key function.
10396           else if (Array.isArray(object)) {
10397             var i = -1,
10398                 n = object.length,
10399                 o;
10400
10401             if (f == null) while (++i < n) map.set(i, object[i]);
10402             else while (++i < n) map.set(f(o = object[i], i, object), o);
10403           }
10404
10405           // Convert object to map.
10406           else if (object) for (var key in object) map.set(key, object[key]);
10407
10408           return map;
10409         }
10410
10411         function nest() {
10412           var keys = [],
10413               sortKeys = [],
10414               sortValues,
10415               rollup,
10416               nest;
10417
10418           function apply(array, depth, createResult, setResult) {
10419             if (depth >= keys.length) {
10420               if (sortValues != null) array.sort(sortValues);
10421               return rollup != null ? rollup(array) : array;
10422             }
10423
10424             var i = -1,
10425                 n = array.length,
10426                 key = keys[depth++],
10427                 keyValue,
10428                 value,
10429                 valuesByKey = map$3(),
10430                 values,
10431                 result = createResult();
10432
10433             while (++i < n) {
10434               if (values = valuesByKey.get(keyValue = key(value = array[i]) + "")) {
10435                 values.push(value);
10436               } else {
10437                 valuesByKey.set(keyValue, [value]);
10438               }
10439             }
10440
10441             valuesByKey.each(function(values, key) {
10442               setResult(result, key, apply(values, depth, createResult, setResult));
10443             });
10444
10445             return result;
10446           }
10447
10448           function entries(map, depth) {
10449             if (++depth > keys.length) return map;
10450             var array, sortKey = sortKeys[depth - 1];
10451             if (rollup != null && depth >= keys.length) array = map.entries();
10452             else array = [], map.each(function(v, k) { array.push({key: k, values: entries(v, depth)}); });
10453             return sortKey != null ? array.sort(function(a, b) { return sortKey(a.key, b.key); }) : array;
10454           }
10455
10456           return nest = {
10457             object: function(array) { return apply(array, 0, createObject, setObject); },
10458             map: function(array) { return apply(array, 0, createMap, setMap); },
10459             entries: function(array) { return entries(apply(array, 0, createMap, setMap), 0); },
10460             key: function(d) { keys.push(d); return nest; },
10461             sortKeys: function(order) { sortKeys[keys.length - 1] = order; return nest; },
10462             sortValues: function(order) { sortValues = order; return nest; },
10463             rollup: function(f) { rollup = f; return nest; }
10464           };
10465         }
10466
10467         function createObject() {
10468           return {};
10469         }
10470
10471         function setObject(object, key, value) {
10472           object[key] = value;
10473         }
10474
10475         function createMap() {
10476           return map$3();
10477         }
10478
10479         function setMap(map, key, value) {
10480           map.set(key, value);
10481         }
10482
10483         function Set$1() {}
10484
10485         var proto = map$3.prototype;
10486
10487         Set$1.prototype = set$2.prototype = {
10488           constructor: Set$1,
10489           has: proto.has,
10490           add: function(value) {
10491             value += "";
10492             this[prefix + value] = value;
10493             return this;
10494           },
10495           remove: proto.remove,
10496           clear: proto.clear,
10497           values: proto.keys,
10498           size: proto.size,
10499           empty: proto.empty,
10500           each: proto.each
10501         };
10502
10503         function set$2(object, f) {
10504           var set = new Set$1;
10505
10506           // Copy constructor.
10507           if (object instanceof Set$1) object.each(function(value) { set.add(value); });
10508
10509           // Otherwise, assume it’s an array.
10510           else if (object) {
10511             var i = -1, n = object.length;
10512             if (f == null) while (++i < n) set.add(object[i]);
10513             else while (++i < n) set.add(f(object[i], i, object));
10514           }
10515
10516           return set;
10517         }
10518
10519         function keys$3(map) {
10520           var keys = [];
10521           for (var key in map) keys.push(key);
10522           return keys;
10523         }
10524
10525         function values(map) {
10526           var values = [];
10527           for (var key in map) values.push(map[key]);
10528           return values;
10529         }
10530
10531         function entries(map) {
10532           var entries = [];
10533           for (var key in map) entries.push({key: key, value: map[key]});
10534           return entries;
10535         }
10536
10537         var array$3 = Array.prototype;
10538
10539         var slice$7 = array$3.slice;
10540
10541         function ascending$1(a, b) {
10542           return a - b;
10543         }
10544
10545         function area(ring) {
10546           var i = 0, n = ring.length, area = ring[n - 1][1] * ring[0][0] - ring[n - 1][0] * ring[0][1];
10547           while (++i < n) area += ring[i - 1][1] * ring[i][0] - ring[i - 1][0] * ring[i][1];
10548           return area;
10549         }
10550
10551         function constant$6(x) {
10552           return function() {
10553             return x;
10554           };
10555         }
10556
10557         function contains$1(ring, hole) {
10558           var i = -1, n = hole.length, c;
10559           while (++i < n) if (c = ringContains(ring, hole[i])) return c;
10560           return 0;
10561         }
10562
10563         function ringContains(ring, point) {
10564           var x = point[0], y = point[1], contains = -1;
10565           for (var i = 0, n = ring.length, j = n - 1; i < n; j = i++) {
10566             var pi = ring[i], xi = pi[0], yi = pi[1], pj = ring[j], xj = pj[0], yj = pj[1];
10567             if (segmentContains(pi, pj, point)) return 0;
10568             if (((yi > y) !== (yj > y)) && ((x < (xj - xi) * (y - yi) / (yj - yi) + xi))) contains = -contains;
10569           }
10570           return contains;
10571         }
10572
10573         function segmentContains(a, b, c) {
10574           var i; return collinear(a, b, c) && within(a[i = +(a[0] === b[0])], c[i], b[i]);
10575         }
10576
10577         function collinear(a, b, c) {
10578           return (b[0] - a[0]) * (c[1] - a[1]) === (c[0] - a[0]) * (b[1] - a[1]);
10579         }
10580
10581         function within(p, q, r) {
10582           return p <= q && q <= r || r <= q && q <= p;
10583         }
10584
10585         function noop$3() {}
10586
10587         var cases = [
10588           [],
10589           [[[1.0, 1.5], [0.5, 1.0]]],
10590           [[[1.5, 1.0], [1.0, 1.5]]],
10591           [[[1.5, 1.0], [0.5, 1.0]]],
10592           [[[1.0, 0.5], [1.5, 1.0]]],
10593           [[[1.0, 1.5], [0.5, 1.0]], [[1.0, 0.5], [1.5, 1.0]]],
10594           [[[1.0, 0.5], [1.0, 1.5]]],
10595           [[[1.0, 0.5], [0.5, 1.0]]],
10596           [[[0.5, 1.0], [1.0, 0.5]]],
10597           [[[1.0, 1.5], [1.0, 0.5]]],
10598           [[[0.5, 1.0], [1.0, 0.5]], [[1.5, 1.0], [1.0, 1.5]]],
10599           [[[1.5, 1.0], [1.0, 0.5]]],
10600           [[[0.5, 1.0], [1.5, 1.0]]],
10601           [[[1.0, 1.5], [1.5, 1.0]]],
10602           [[[0.5, 1.0], [1.0, 1.5]]],
10603           []
10604         ];
10605
10606         function contours() {
10607           var dx = 1,
10608               dy = 1,
10609               threshold = thresholdSturges,
10610               smooth = smoothLinear;
10611
10612           function contours(values) {
10613             var tz = threshold(values);
10614
10615             // Convert number of thresholds into uniform thresholds.
10616             if (!Array.isArray(tz)) {
10617               var domain = extent(values), start = domain[0], stop = domain[1];
10618               tz = tickStep(start, stop, tz);
10619               tz = d3_range(Math.floor(start / tz) * tz, Math.floor(stop / tz) * tz, tz);
10620             } else {
10621               tz = tz.slice().sort(ascending$1);
10622             }
10623
10624             return tz.map(function(value) {
10625               return contour(values, value);
10626             });
10627           }
10628
10629           // Accumulate, smooth contour rings, assign holes to exterior rings.
10630           // Based on https://github.com/mbostock/shapefile/blob/v0.6.2/shp/polygon.js
10631           function contour(values, value) {
10632             var polygons = [],
10633                 holes = [];
10634
10635             isorings(values, value, function(ring) {
10636               smooth(ring, values, value);
10637               if (area(ring) > 0) polygons.push([ring]);
10638               else holes.push(ring);
10639             });
10640
10641             holes.forEach(function(hole) {
10642               for (var i = 0, n = polygons.length, polygon; i < n; ++i) {
10643                 if (contains$1((polygon = polygons[i])[0], hole) !== -1) {
10644                   polygon.push(hole);
10645                   return;
10646                 }
10647               }
10648             });
10649
10650             return {
10651               type: "MultiPolygon",
10652               value: value,
10653               coordinates: polygons
10654             };
10655           }
10656
10657           // Marching squares with isolines stitched into rings.
10658           // Based on https://github.com/topojson/topojson-client/blob/v3.0.0/src/stitch.js
10659           function isorings(values, value, callback) {
10660             var fragmentByStart = new Array,
10661                 fragmentByEnd = new Array,
10662                 x, y, t0, t1, t2, t3;
10663
10664             // Special case for the first row (y = -1, t2 = t3 = 0).
10665             x = y = -1;
10666             t1 = values[0] >= value;
10667             cases[t1 << 1].forEach(stitch);
10668             while (++x < dx - 1) {
10669               t0 = t1, t1 = values[x + 1] >= value;
10670               cases[t0 | t1 << 1].forEach(stitch);
10671             }
10672             cases[t1 << 0].forEach(stitch);
10673
10674             // General case for the intermediate rows.
10675             while (++y < dy - 1) {
10676               x = -1;
10677               t1 = values[y * dx + dx] >= value;
10678               t2 = values[y * dx] >= value;
10679               cases[t1 << 1 | t2 << 2].forEach(stitch);
10680               while (++x < dx - 1) {
10681                 t0 = t1, t1 = values[y * dx + dx + x + 1] >= value;
10682                 t3 = t2, t2 = values[y * dx + x + 1] >= value;
10683                 cases[t0 | t1 << 1 | t2 << 2 | t3 << 3].forEach(stitch);
10684               }
10685               cases[t1 | t2 << 3].forEach(stitch);
10686             }
10687
10688             // Special case for the last row (y = dy - 1, t0 = t1 = 0).
10689             x = -1;
10690             t2 = values[y * dx] >= value;
10691             cases[t2 << 2].forEach(stitch);
10692             while (++x < dx - 1) {
10693               t3 = t2, t2 = values[y * dx + x + 1] >= value;
10694               cases[t2 << 2 | t3 << 3].forEach(stitch);
10695             }
10696             cases[t2 << 3].forEach(stitch);
10697
10698             function stitch(line) {
10699               var start = [line[0][0] + x, line[0][1] + y],
10700                   end = [line[1][0] + x, line[1][1] + y],
10701                   startIndex = index(start),
10702                   endIndex = index(end),
10703                   f, g;
10704               if (f = fragmentByEnd[startIndex]) {
10705                 if (g = fragmentByStart[endIndex]) {
10706                   delete fragmentByEnd[f.end];
10707                   delete fragmentByStart[g.start];
10708                   if (f === g) {
10709                     f.ring.push(end);
10710                     callback(f.ring);
10711                   } else {
10712                     fragmentByStart[f.start] = fragmentByEnd[g.end] = {start: f.start, end: g.end, ring: f.ring.concat(g.ring)};
10713                   }
10714                 } else {
10715                   delete fragmentByEnd[f.end];
10716                   f.ring.push(end);
10717                   fragmentByEnd[f.end = endIndex] = f;
10718                 }
10719               } else if (f = fragmentByStart[endIndex]) {
10720                 if (g = fragmentByEnd[startIndex]) {
10721                   delete fragmentByStart[f.start];
10722                   delete fragmentByEnd[g.end];
10723                   if (f === g) {
10724                     f.ring.push(end);
10725                     callback(f.ring);
10726                   } else {
10727                     fragmentByStart[g.start] = fragmentByEnd[f.end] = {start: g.start, end: f.end, ring: g.ring.concat(f.ring)};
10728                   }
10729                 } else {
10730                   delete fragmentByStart[f.start];
10731                   f.ring.unshift(start);
10732                   fragmentByStart[f.start = startIndex] = f;
10733                 }
10734               } else {
10735                 fragmentByStart[startIndex] = fragmentByEnd[endIndex] = {start: startIndex, end: endIndex, ring: [start, end]};
10736               }
10737             }
10738           }
10739
10740           function index(point) {
10741             return point[0] * 2 + point[1] * (dx + 1) * 4;
10742           }
10743
10744           function smoothLinear(ring, values, value) {
10745             ring.forEach(function(point) {
10746               var x = point[0],
10747                   y = point[1],
10748                   xt = x | 0,
10749                   yt = y | 0,
10750                   v0,
10751                   v1 = values[yt * dx + xt];
10752               if (x > 0 && x < dx && xt === x) {
10753                 v0 = values[yt * dx + xt - 1];
10754                 point[0] = x + (value - v0) / (v1 - v0) - 0.5;
10755               }
10756               if (y > 0 && y < dy && yt === y) {
10757                 v0 = values[(yt - 1) * dx + xt];
10758                 point[1] = y + (value - v0) / (v1 - v0) - 0.5;
10759               }
10760             });
10761           }
10762
10763           contours.contour = contour;
10764
10765           contours.size = function(_) {
10766             if (!arguments.length) return [dx, dy];
10767             var _0 = Math.ceil(_[0]), _1 = Math.ceil(_[1]);
10768             if (!(_0 > 0) || !(_1 > 0)) throw new Error("invalid size");
10769             return dx = _0, dy = _1, contours;
10770           };
10771
10772           contours.thresholds = function(_) {
10773             return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant$6(slice$7.call(_)) : constant$6(_), contours) : threshold;
10774           };
10775
10776           contours.smooth = function(_) {
10777             return arguments.length ? (smooth = _ ? smoothLinear : noop$3, contours) : smooth === smoothLinear;
10778           };
10779
10780           return contours;
10781         }
10782
10783         // TODO Optimize edge cases.
10784         // TODO Optimize index calculation.
10785         // TODO Optimize arguments.
10786         function blurX(source, target, r) {
10787           var n = source.width,
10788               m = source.height,
10789               w = (r << 1) + 1;
10790           for (var j = 0; j < m; ++j) {
10791             for (var i = 0, sr = 0; i < n + r; ++i) {
10792               if (i < n) {
10793                 sr += source.data[i + j * n];
10794               }
10795               if (i >= r) {
10796                 if (i >= w) {
10797                   sr -= source.data[i - w + j * n];
10798                 }
10799                 target.data[i - r + j * n] = sr / Math.min(i + 1, n - 1 + w - i, w);
10800               }
10801             }
10802           }
10803         }
10804
10805         // TODO Optimize edge cases.
10806         // TODO Optimize index calculation.
10807         // TODO Optimize arguments.
10808         function blurY(source, target, r) {
10809           var n = source.width,
10810               m = source.height,
10811               w = (r << 1) + 1;
10812           for (var i = 0; i < n; ++i) {
10813             for (var j = 0, sr = 0; j < m + r; ++j) {
10814               if (j < m) {
10815                 sr += source.data[i + j * n];
10816               }
10817               if (j >= r) {
10818                 if (j >= w) {
10819                   sr -= source.data[i + (j - w) * n];
10820                 }
10821                 target.data[i + (j - r) * n] = sr / Math.min(j + 1, m - 1 + w - j, w);
10822               }
10823             }
10824           }
10825         }
10826
10827         function defaultX(d) {
10828           return d[0];
10829         }
10830
10831         function defaultY(d) {
10832           return d[1];
10833         }
10834
10835         function defaultWeight() {
10836           return 1;
10837         }
10838
10839         function density() {
10840           var x = defaultX,
10841               y = defaultY,
10842               weight = defaultWeight,
10843               dx = 960,
10844               dy = 500,
10845               r = 20, // blur radius
10846               k = 2, // log2(grid cell size)
10847               o = r * 3, // grid offset, to pad for blur
10848               n = (dx + o * 2) >> k, // grid width
10849               m = (dy + o * 2) >> k, // grid height
10850               threshold = constant$6(20);
10851
10852           function density(data) {
10853             var values0 = new Float32Array(n * m),
10854                 values1 = new Float32Array(n * m);
10855
10856             data.forEach(function(d, i, data) {
10857               var xi = (+x(d, i, data) + o) >> k,
10858                   yi = (+y(d, i, data) + o) >> k,
10859                   wi = +weight(d, i, data);
10860               if (xi >= 0 && xi < n && yi >= 0 && yi < m) {
10861                 values0[xi + yi * n] += wi;
10862               }
10863             });
10864
10865             // TODO Optimize.
10866             blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k);
10867             blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k);
10868             blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k);
10869             blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k);
10870             blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k);
10871             blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k);
10872
10873             var tz = threshold(values0);
10874
10875             // Convert number of thresholds into uniform thresholds.
10876             if (!Array.isArray(tz)) {
10877               var stop = max$2(values0);
10878               tz = tickStep(0, stop, tz);
10879               tz = d3_range(0, Math.floor(stop / tz) * tz, tz);
10880               tz.shift();
10881             }
10882
10883             return contours()
10884                 .thresholds(tz)
10885                 .size([n, m])
10886               (values0)
10887                 .map(transform);
10888           }
10889
10890           function transform(geometry) {
10891             geometry.value *= Math.pow(2, -2 * k); // Density in points per square pixel.
10892             geometry.coordinates.forEach(transformPolygon);
10893             return geometry;
10894           }
10895
10896           function transformPolygon(coordinates) {
10897             coordinates.forEach(transformRing);
10898           }
10899
10900           function transformRing(coordinates) {
10901             coordinates.forEach(transformPoint);
10902           }
10903
10904           // TODO Optimize.
10905           function transformPoint(coordinates) {
10906             coordinates[0] = coordinates[0] * Math.pow(2, k) - o;
10907             coordinates[1] = coordinates[1] * Math.pow(2, k) - o;
10908           }
10909
10910           function resize() {
10911             o = r * 3;
10912             n = (dx + o * 2) >> k;
10913             m = (dy + o * 2) >> k;
10914             return density;
10915           }
10916
10917           density.x = function(_) {
10918             return arguments.length ? (x = typeof _ === "function" ? _ : constant$6(+_), density) : x;
10919           };
10920
10921           density.y = function(_) {
10922             return arguments.length ? (y = typeof _ === "function" ? _ : constant$6(+_), density) : y;
10923           };
10924
10925           density.weight = function(_) {
10926             return arguments.length ? (weight = typeof _ === "function" ? _ : constant$6(+_), density) : weight;
10927           };
10928
10929           density.size = function(_) {
10930             if (!arguments.length) return [dx, dy];
10931             var _0 = Math.ceil(_[0]), _1 = Math.ceil(_[1]);
10932             if (!(_0 >= 0) && !(_0 >= 0)) throw new Error("invalid size");
10933             return dx = _0, dy = _1, resize();
10934           };
10935
10936           density.cellSize = function(_) {
10937             if (!arguments.length) return 1 << k;
10938             if (!((_ = +_) >= 1)) throw new Error("invalid cell size");
10939             return k = Math.floor(Math.log(_) / Math.LN2), resize();
10940           };
10941
10942           density.thresholds = function(_) {
10943             return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant$6(slice$7.call(_)) : constant$6(_), density) : threshold;
10944           };
10945
10946           density.bandwidth = function(_) {
10947             if (!arguments.length) return Math.sqrt(r * (r + 1));
10948             if (!((_ = +_) >= 0)) throw new Error("invalid bandwidth");
10949             return r = Math.round((Math.sqrt(4 * _ * _ + 1) - 1) / 2), resize();
10950           };
10951
10952           return density;
10953         }
10954
10955         var EOL = {},
10956             EOF = {},
10957             QUOTE = 34,
10958             NEWLINE = 10,
10959             RETURN = 13;
10960
10961         function objectConverter(columns) {
10962           return new Function("d", "return {" + columns.map(function(name, i) {
10963             return JSON.stringify(name) + ": d[" + i + "]";
10964           }).join(",") + "}");
10965         }
10966
10967         function customConverter(columns, f) {
10968           var object = objectConverter(columns);
10969           return function(row, i) {
10970             return f(object(row), i, columns);
10971           };
10972         }
10973
10974         // Compute unique columns in order of discovery.
10975         function inferColumns(rows) {
10976           var columnSet = Object.create(null),
10977               columns = [];
10978
10979           rows.forEach(function(row) {
10980             for (var column in row) {
10981               if (!(column in columnSet)) {
10982                 columns.push(columnSet[column] = column);
10983               }
10984             }
10985           });
10986
10987           return columns;
10988         }
10989
10990         function pad(value, width) {
10991           var s = value + "", length = s.length;
10992           return length < width ? new Array(width - length + 1).join(0) + s : s;
10993         }
10994
10995         function formatYear(year) {
10996           return year < 0 ? "-" + pad(-year, 6)
10997             : year > 9999 ? "+" + pad(year, 6)
10998             : pad(year, 4);
10999         }
11000
11001         function formatDate(date) {
11002           var hours = date.getUTCHours(),
11003               minutes = date.getUTCMinutes(),
11004               seconds = date.getUTCSeconds(),
11005               milliseconds = date.getUTCMilliseconds();
11006           return isNaN(date) ? "Invalid Date"
11007               : formatYear(date.getUTCFullYear()) + "-" + pad(date.getUTCMonth() + 1, 2) + "-" + pad(date.getUTCDate(), 2)
11008               + (milliseconds ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + ":" + pad(seconds, 2) + "." + pad(milliseconds, 3) + "Z"
11009               : seconds ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + ":" + pad(seconds, 2) + "Z"
11010               : minutes || hours ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + "Z"
11011               : "");
11012         }
11013
11014         function dsvFormat(delimiter) {
11015           var reFormat = new RegExp("[\"" + delimiter + "\n\r]"),
11016               DELIMITER = delimiter.charCodeAt(0);
11017
11018           function parse(text, f) {
11019             var convert, columns, rows = parseRows(text, function(row, i) {
11020               if (convert) return convert(row, i - 1);
11021               columns = row, convert = f ? customConverter(row, f) : objectConverter(row);
11022             });
11023             rows.columns = columns || [];
11024             return rows;
11025           }
11026
11027           function parseRows(text, f) {
11028             var rows = [], // output rows
11029                 N = text.length,
11030                 I = 0, // current character index
11031                 n = 0, // current line number
11032                 t, // current token
11033                 eof = N <= 0, // current token followed by EOF?
11034                 eol = false; // current token followed by EOL?
11035
11036             // Strip the trailing newline.
11037             if (text.charCodeAt(N - 1) === NEWLINE) --N;
11038             if (text.charCodeAt(N - 1) === RETURN) --N;
11039
11040             function token() {
11041               if (eof) return EOF;
11042               if (eol) return eol = false, EOL;
11043
11044               // Unescape quotes.
11045               var i, j = I, c;
11046               if (text.charCodeAt(j) === QUOTE) {
11047                 while (I++ < N && text.charCodeAt(I) !== QUOTE || text.charCodeAt(++I) === QUOTE);
11048                 if ((i = I) >= N) eof = true;
11049                 else if ((c = text.charCodeAt(I++)) === NEWLINE) eol = true;
11050                 else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; }
11051                 return text.slice(j + 1, i - 1).replace(/""/g, "\"");
11052               }
11053
11054               // Find next delimiter or newline.
11055               while (I < N) {
11056                 if ((c = text.charCodeAt(i = I++)) === NEWLINE) eol = true;
11057                 else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; }
11058                 else if (c !== DELIMITER) continue;
11059                 return text.slice(j, i);
11060               }
11061
11062               // Return last token before EOF.
11063               return eof = true, text.slice(j, N);
11064             }
11065
11066             while ((t = token()) !== EOF) {
11067               var row = [];
11068               while (t !== EOL && t !== EOF) row.push(t), t = token();
11069               if (f && (row = f(row, n++)) == null) continue;
11070               rows.push(row);
11071             }
11072
11073             return rows;
11074           }
11075
11076           function preformatBody(rows, columns) {
11077             return rows.map(function(row) {
11078               return columns.map(function(column) {
11079                 return formatValue(row[column]);
11080               }).join(delimiter);
11081             });
11082           }
11083
11084           function format(rows, columns) {
11085             if (columns == null) columns = inferColumns(rows);
11086             return [columns.map(formatValue).join(delimiter)].concat(preformatBody(rows, columns)).join("\n");
11087           }
11088
11089           function formatBody(rows, columns) {
11090             if (columns == null) columns = inferColumns(rows);
11091             return preformatBody(rows, columns).join("\n");
11092           }
11093
11094           function formatRows(rows) {
11095             return rows.map(formatRow).join("\n");
11096           }
11097
11098           function formatRow(row) {
11099             return row.map(formatValue).join(delimiter);
11100           }
11101
11102           function formatValue(value) {
11103             return value == null ? ""
11104                 : value instanceof Date ? formatDate(value)
11105                 : reFormat.test(value += "") ? "\"" + value.replace(/"/g, "\"\"") + "\""
11106                 : value;
11107           }
11108
11109           return {
11110             parse: parse,
11111             parseRows: parseRows,
11112             format: format,
11113             formatBody: formatBody,
11114             formatRows: formatRows
11115           };
11116         }
11117
11118         var csv = dsvFormat(",");
11119
11120         var csvParse = csv.parse;
11121         var csvParseRows = csv.parseRows;
11122         var csvFormat = csv.format;
11123         var csvFormatBody = csv.formatBody;
11124         var csvFormatRows = csv.formatRows;
11125
11126         var tsv = dsvFormat("\t");
11127
11128         var tsvParse = tsv.parse;
11129         var tsvParseRows = tsv.parseRows;
11130         var tsvFormat = tsv.format;
11131         var tsvFormatBody = tsv.formatBody;
11132         var tsvFormatRows = tsv.formatRows;
11133
11134         function autoType(object) {
11135           for (var key in object) {
11136             var value = object[key].trim(), number;
11137             if (!value) value = null;
11138             else if (value === "true") value = true;
11139             else if (value === "false") value = false;
11140             else if (value === "NaN") value = NaN;
11141             else if (!isNaN(number = +value)) value = number;
11142             else if (/^([-+]\d{2})?\d{4}(-\d{2}(-\d{2})?)?(T\d{2}:\d{2}(:\d{2}(\.\d{3})?)?(Z|[-+]\d{2}:\d{2})?)?$/.test(value)) value = new Date(value);
11143             else continue;
11144             object[key] = value;
11145           }
11146           return object;
11147         }
11148
11149         function responseBlob(response) {
11150           if (!response.ok) throw new Error(response.status + " " + response.statusText);
11151           return response.blob();
11152         }
11153
11154         function blob(input, init) {
11155           return fetch(input, init).then(responseBlob);
11156         }
11157
11158         function responseArrayBuffer(response) {
11159           if (!response.ok) throw new Error(response.status + " " + response.statusText);
11160           return response.arrayBuffer();
11161         }
11162
11163         function buffer(input, init) {
11164           return fetch(input, init).then(responseArrayBuffer);
11165         }
11166
11167         function responseText(response) {
11168           if (!response.ok) throw new Error(response.status + " " + response.statusText);
11169           return response.text();
11170         }
11171
11172         function d3_text(input, init) {
11173           return fetch(input, init).then(responseText);
11174         }
11175
11176         function dsvParse(parse) {
11177           return function(input, init, row) {
11178             if (arguments.length === 2 && typeof init === "function") row = init, init = undefined;
11179             return d3_text(input, init).then(function(response) {
11180               return parse(response, row);
11181             });
11182           };
11183         }
11184
11185         function dsv(delimiter, input, init, row) {
11186           if (arguments.length === 3 && typeof init === "function") row = init, init = undefined;
11187           var format = dsvFormat(delimiter);
11188           return d3_text(input, init).then(function(response) {
11189             return format.parse(response, row);
11190           });
11191         }
11192
11193         var csv$1 = dsvParse(csvParse);
11194         var tsv$1 = dsvParse(tsvParse);
11195
11196         function image(input, init) {
11197           return new Promise(function(resolve, reject) {
11198             var image = new Image;
11199             for (var key in init) image[key] = init[key];
11200             image.onerror = reject;
11201             image.onload = function() { resolve(image); };
11202             image.src = input;
11203           });
11204         }
11205
11206         function responseJson(response) {
11207           if (!response.ok) throw new Error(response.status + " " + response.statusText);
11208           return response.json();
11209         }
11210
11211         function d3_json(input, init) {
11212           return fetch(input, init).then(responseJson);
11213         }
11214
11215         function parser(type) {
11216           return function(input, init)  {
11217             return d3_text(input, init).then(function(text) {
11218               return (new DOMParser).parseFromString(text, type);
11219             });
11220           };
11221         }
11222
11223         var d3_xml = parser("application/xml");
11224
11225         var html = parser("text/html");
11226
11227         var svg = parser("image/svg+xml");
11228
11229         function center$1(x, y) {
11230           var nodes;
11231
11232           if (x == null) x = 0;
11233           if (y == null) y = 0;
11234
11235           function force() {
11236             var i,
11237                 n = nodes.length,
11238                 node,
11239                 sx = 0,
11240                 sy = 0;
11241
11242             for (i = 0; i < n; ++i) {
11243               node = nodes[i], sx += node.x, sy += node.y;
11244             }
11245
11246             for (sx = sx / n - x, sy = sy / n - y, i = 0; i < n; ++i) {
11247               node = nodes[i], node.x -= sx, node.y -= sy;
11248             }
11249           }
11250
11251           force.initialize = function(_) {
11252             nodes = _;
11253           };
11254
11255           force.x = function(_) {
11256             return arguments.length ? (x = +_, force) : x;
11257           };
11258
11259           force.y = function(_) {
11260             return arguments.length ? (y = +_, force) : y;
11261           };
11262
11263           return force;
11264         }
11265
11266         function constant$7(x) {
11267           return function() {
11268             return x;
11269           };
11270         }
11271
11272         function jiggle() {
11273           return (Math.random() - 0.5) * 1e-6;
11274         }
11275
11276         function tree_add(d) {
11277           var x = +this._x.call(null, d),
11278               y = +this._y.call(null, d);
11279           return add(this.cover(x, y), x, y, d);
11280         }
11281
11282         function add(tree, x, y, d) {
11283           if (isNaN(x) || isNaN(y)) return tree; // ignore invalid points
11284
11285           var parent,
11286               node = tree._root,
11287               leaf = {data: d},
11288               x0 = tree._x0,
11289               y0 = tree._y0,
11290               x1 = tree._x1,
11291               y1 = tree._y1,
11292               xm,
11293               ym,
11294               xp,
11295               yp,
11296               right,
11297               bottom,
11298               i,
11299               j;
11300
11301           // If the tree is empty, initialize the root as a leaf.
11302           if (!node) return tree._root = leaf, tree;
11303
11304           // Find the existing leaf for the new point, or add it.
11305           while (node.length) {
11306             if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;
11307             if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;
11308             if (parent = node, !(node = node[i = bottom << 1 | right])) return parent[i] = leaf, tree;
11309           }
11310
11311           // Is the new point is exactly coincident with the existing point?
11312           xp = +tree._x.call(null, node.data);
11313           yp = +tree._y.call(null, node.data);
11314           if (x === xp && y === yp) return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree;
11315
11316           // Otherwise, split the leaf node until the old and new point are separated.
11317           do {
11318             parent = parent ? parent[i] = new Array(4) : tree._root = new Array(4);
11319             if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;
11320             if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;
11321           } while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | (xp >= xm)));
11322           return parent[j] = node, parent[i] = leaf, tree;
11323         }
11324
11325         function addAll(data) {
11326           var d, i, n = data.length,
11327               x,
11328               y,
11329               xz = new Array(n),
11330               yz = new Array(n),
11331               x0 = Infinity,
11332               y0 = Infinity,
11333               x1 = -Infinity,
11334               y1 = -Infinity;
11335
11336           // Compute the points and their extent.
11337           for (i = 0; i < n; ++i) {
11338             if (isNaN(x = +this._x.call(null, d = data[i])) || isNaN(y = +this._y.call(null, d))) continue;
11339             xz[i] = x;
11340             yz[i] = y;
11341             if (x < x0) x0 = x;
11342             if (x > x1) x1 = x;
11343             if (y < y0) y0 = y;
11344             if (y > y1) y1 = y;
11345           }
11346
11347           // If there were no (valid) points, abort.
11348           if (x0 > x1 || y0 > y1) return this;
11349
11350           // Expand the tree to cover the new points.
11351           this.cover(x0, y0).cover(x1, y1);
11352
11353           // Add the new points.
11354           for (i = 0; i < n; ++i) {
11355             add(this, xz[i], yz[i], data[i]);
11356           }
11357
11358           return this;
11359         }
11360
11361         function tree_cover(x, y) {
11362           if (isNaN(x = +x) || isNaN(y = +y)) return this; // ignore invalid points
11363
11364           var x0 = this._x0,
11365               y0 = this._y0,
11366               x1 = this._x1,
11367               y1 = this._y1;
11368
11369           // If the quadtree has no extent, initialize them.
11370           // Integer extent are necessary so that if we later double the extent,
11371           // the existing quadrant boundaries don’t change due to floating point error!
11372           if (isNaN(x0)) {
11373             x1 = (x0 = Math.floor(x)) + 1;
11374             y1 = (y0 = Math.floor(y)) + 1;
11375           }
11376
11377           // Otherwise, double repeatedly to cover.
11378           else {
11379             var z = x1 - x0,
11380                 node = this._root,
11381                 parent,
11382                 i;
11383
11384             while (x0 > x || x >= x1 || y0 > y || y >= y1) {
11385               i = (y < y0) << 1 | (x < x0);
11386               parent = new Array(4), parent[i] = node, node = parent, z *= 2;
11387               switch (i) {
11388                 case 0: x1 = x0 + z, y1 = y0 + z; break;
11389                 case 1: x0 = x1 - z, y1 = y0 + z; break;
11390                 case 2: x1 = x0 + z, y0 = y1 - z; break;
11391                 case 3: x0 = x1 - z, y0 = y1 - z; break;
11392               }
11393             }
11394
11395             if (this._root && this._root.length) this._root = node;
11396           }
11397
11398           this._x0 = x0;
11399           this._y0 = y0;
11400           this._x1 = x1;
11401           this._y1 = y1;
11402           return this;
11403         }
11404
11405         function tree_data() {
11406           var data = [];
11407           this.visit(function(node) {
11408             if (!node.length) do data.push(node.data); while (node = node.next)
11409           });
11410           return data;
11411         }
11412
11413         function tree_extent(_) {
11414           return arguments.length
11415               ? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1])
11416               : isNaN(this._x0) ? undefined : [[this._x0, this._y0], [this._x1, this._y1]];
11417         }
11418
11419         function Quad(node, x0, y0, x1, y1) {
11420           this.node = node;
11421           this.x0 = x0;
11422           this.y0 = y0;
11423           this.x1 = x1;
11424           this.y1 = y1;
11425         }
11426
11427         function tree_find(x, y, radius) {
11428           var data,
11429               x0 = this._x0,
11430               y0 = this._y0,
11431               x1,
11432               y1,
11433               x2,
11434               y2,
11435               x3 = this._x1,
11436               y3 = this._y1,
11437               quads = [],
11438               node = this._root,
11439               q,
11440               i;
11441
11442           if (node) quads.push(new Quad(node, x0, y0, x3, y3));
11443           if (radius == null) radius = Infinity;
11444           else {
11445             x0 = x - radius, y0 = y - radius;
11446             x3 = x + radius, y3 = y + radius;
11447             radius *= radius;
11448           }
11449
11450           while (q = quads.pop()) {
11451
11452             // Stop searching if this quadrant can’t contain a closer node.
11453             if (!(node = q.node)
11454                 || (x1 = q.x0) > x3
11455                 || (y1 = q.y0) > y3
11456                 || (x2 = q.x1) < x0
11457                 || (y2 = q.y1) < y0) continue;
11458
11459             // Bisect the current quadrant.
11460             if (node.length) {
11461               var xm = (x1 + x2) / 2,
11462                   ym = (y1 + y2) / 2;
11463
11464               quads.push(
11465                 new Quad(node[3], xm, ym, x2, y2),
11466                 new Quad(node[2], x1, ym, xm, y2),
11467                 new Quad(node[1], xm, y1, x2, ym),
11468                 new Quad(node[0], x1, y1, xm, ym)
11469               );
11470
11471               // Visit the closest quadrant first.
11472               if (i = (y >= ym) << 1 | (x >= xm)) {
11473                 q = quads[quads.length - 1];
11474                 quads[quads.length - 1] = quads[quads.length - 1 - i];
11475                 quads[quads.length - 1 - i] = q;
11476               }
11477             }
11478
11479             // Visit this point. (Visiting coincident points isn’t necessary!)
11480             else {
11481               var dx = x - +this._x.call(null, node.data),
11482                   dy = y - +this._y.call(null, node.data),
11483                   d2 = dx * dx + dy * dy;
11484               if (d2 < radius) {
11485                 var d = Math.sqrt(radius = d2);
11486                 x0 = x - d, y0 = y - d;
11487                 x3 = x + d, y3 = y + d;
11488                 data = node.data;
11489               }
11490             }
11491           }
11492
11493           return data;
11494         }
11495
11496         function tree_remove(d) {
11497           if (isNaN(x = +this._x.call(null, d)) || isNaN(y = +this._y.call(null, d))) return this; // ignore invalid points
11498
11499           var parent,
11500               node = this._root,
11501               retainer,
11502               previous,
11503               next,
11504               x0 = this._x0,
11505               y0 = this._y0,
11506               x1 = this._x1,
11507               y1 = this._y1,
11508               x,
11509               y,
11510               xm,
11511               ym,
11512               right,
11513               bottom,
11514               i,
11515               j;
11516
11517           // If the tree is empty, initialize the root as a leaf.
11518           if (!node) return this;
11519
11520           // Find the leaf node for the point.
11521           // While descending, also retain the deepest parent with a non-removed sibling.
11522           if (node.length) while (true) {
11523             if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;
11524             if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;
11525             if (!(parent = node, node = node[i = bottom << 1 | right])) return this;
11526             if (!node.length) break;
11527             if (parent[(i + 1) & 3] || parent[(i + 2) & 3] || parent[(i + 3) & 3]) retainer = parent, j = i;
11528           }
11529
11530           // Find the point to remove.
11531           while (node.data !== d) if (!(previous = node, node = node.next)) return this;
11532           if (next = node.next) delete node.next;
11533
11534           // If there are multiple coincident points, remove just the point.
11535           if (previous) return (next ? previous.next = next : delete previous.next), this;
11536
11537           // If this is the root point, remove it.
11538           if (!parent) return this._root = next, this;
11539
11540           // Remove this leaf.
11541           next ? parent[i] = next : delete parent[i];
11542
11543           // If the parent now contains exactly one leaf, collapse superfluous parents.
11544           if ((node = parent[0] || parent[1] || parent[2] || parent[3])
11545               && node === (parent[3] || parent[2] || parent[1] || parent[0])
11546               && !node.length) {
11547             if (retainer) retainer[j] = node;
11548             else this._root = node;
11549           }
11550
11551           return this;
11552         }
11553
11554         function removeAll(data) {
11555           for (var i = 0, n = data.length; i < n; ++i) this.remove(data[i]);
11556           return this;
11557         }
11558
11559         function tree_root() {
11560           return this._root;
11561         }
11562
11563         function tree_size() {
11564           var size = 0;
11565           this.visit(function(node) {
11566             if (!node.length) do ++size; while (node = node.next)
11567           });
11568           return size;
11569         }
11570
11571         function tree_visit(callback) {
11572           var quads = [], q, node = this._root, child, x0, y0, x1, y1;
11573           if (node) quads.push(new Quad(node, this._x0, this._y0, this._x1, this._y1));
11574           while (q = quads.pop()) {
11575             if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1) && node.length) {
11576               var xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;
11577               if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1));
11578               if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1));
11579               if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym));
11580               if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym));
11581             }
11582           }
11583           return this;
11584         }
11585
11586         function tree_visitAfter(callback) {
11587           var quads = [], next = [], q;
11588           if (this._root) quads.push(new Quad(this._root, this._x0, this._y0, this._x1, this._y1));
11589           while (q = quads.pop()) {
11590             var node = q.node;
11591             if (node.length) {
11592               var child, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1, xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;
11593               if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym));
11594               if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym));
11595               if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1));
11596               if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1));
11597             }
11598             next.push(q);
11599           }
11600           while (q = next.pop()) {
11601             callback(q.node, q.x0, q.y0, q.x1, q.y1);
11602           }
11603           return this;
11604         }
11605
11606         function defaultX$1(d) {
11607           return d[0];
11608         }
11609
11610         function tree_x(_) {
11611           return arguments.length ? (this._x = _, this) : this._x;
11612         }
11613
11614         function defaultY$1(d) {
11615           return d[1];
11616         }
11617
11618         function tree_y(_) {
11619           return arguments.length ? (this._y = _, this) : this._y;
11620         }
11621
11622         function quadtree(nodes, x, y) {
11623           var tree = new Quadtree(x == null ? defaultX$1 : x, y == null ? defaultY$1 : y, NaN, NaN, NaN, NaN);
11624           return nodes == null ? tree : tree.addAll(nodes);
11625         }
11626
11627         function Quadtree(x, y, x0, y0, x1, y1) {
11628           this._x = x;
11629           this._y = y;
11630           this._x0 = x0;
11631           this._y0 = y0;
11632           this._x1 = x1;
11633           this._y1 = y1;
11634           this._root = undefined;
11635         }
11636
11637         function leaf_copy(leaf) {
11638           var copy = {data: leaf.data}, next = copy;
11639           while (leaf = leaf.next) next = next.next = {data: leaf.data};
11640           return copy;
11641         }
11642
11643         var treeProto = quadtree.prototype = Quadtree.prototype;
11644
11645         treeProto.copy = function() {
11646           var copy = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1),
11647               node = this._root,
11648               nodes,
11649               child;
11650
11651           if (!node) return copy;
11652
11653           if (!node.length) return copy._root = leaf_copy(node), copy;
11654
11655           nodes = [{source: node, target: copy._root = new Array(4)}];
11656           while (node = nodes.pop()) {
11657             for (var i = 0; i < 4; ++i) {
11658               if (child = node.source[i]) {
11659                 if (child.length) nodes.push({source: child, target: node.target[i] = new Array(4)});
11660                 else node.target[i] = leaf_copy(child);
11661               }
11662             }
11663           }
11664
11665           return copy;
11666         };
11667
11668         treeProto.add = tree_add;
11669         treeProto.addAll = addAll;
11670         treeProto.cover = tree_cover;
11671         treeProto.data = tree_data;
11672         treeProto.extent = tree_extent;
11673         treeProto.find = tree_find;
11674         treeProto.remove = tree_remove;
11675         treeProto.removeAll = removeAll;
11676         treeProto.root = tree_root;
11677         treeProto.size = tree_size;
11678         treeProto.visit = tree_visit;
11679         treeProto.visitAfter = tree_visitAfter;
11680         treeProto.x = tree_x;
11681         treeProto.y = tree_y;
11682
11683         function x(d) {
11684           return d.x + d.vx;
11685         }
11686
11687         function y(d) {
11688           return d.y + d.vy;
11689         }
11690
11691         function collide(radius) {
11692           var nodes,
11693               radii,
11694               strength = 1,
11695               iterations = 1;
11696
11697           if (typeof radius !== "function") radius = constant$7(radius == null ? 1 : +radius);
11698
11699           function force() {
11700             var i, n = nodes.length,
11701                 tree,
11702                 node,
11703                 xi,
11704                 yi,
11705                 ri,
11706                 ri2;
11707
11708             for (var k = 0; k < iterations; ++k) {
11709               tree = quadtree(nodes, x, y).visitAfter(prepare);
11710               for (i = 0; i < n; ++i) {
11711                 node = nodes[i];
11712                 ri = radii[node.index], ri2 = ri * ri;
11713                 xi = node.x + node.vx;
11714                 yi = node.y + node.vy;
11715                 tree.visit(apply);
11716               }
11717             }
11718
11719             function apply(quad, x0, y0, x1, y1) {
11720               var data = quad.data, rj = quad.r, r = ri + rj;
11721               if (data) {
11722                 if (data.index > node.index) {
11723                   var x = xi - data.x - data.vx,
11724                       y = yi - data.y - data.vy,
11725                       l = x * x + y * y;
11726                   if (l < r * r) {
11727                     if (x === 0) x = jiggle(), l += x * x;
11728                     if (y === 0) y = jiggle(), l += y * y;
11729                     l = (r - (l = Math.sqrt(l))) / l * strength;
11730                     node.vx += (x *= l) * (r = (rj *= rj) / (ri2 + rj));
11731                     node.vy += (y *= l) * r;
11732                     data.vx -= x * (r = 1 - r);
11733                     data.vy -= y * r;
11734                   }
11735                 }
11736                 return;
11737               }
11738               return x0 > xi + r || x1 < xi - r || y0 > yi + r || y1 < yi - r;
11739             }
11740           }
11741
11742           function prepare(quad) {
11743             if (quad.data) return quad.r = radii[quad.data.index];
11744             for (var i = quad.r = 0; i < 4; ++i) {
11745               if (quad[i] && quad[i].r > quad.r) {
11746                 quad.r = quad[i].r;
11747               }
11748             }
11749           }
11750
11751           function initialize() {
11752             if (!nodes) return;
11753             var i, n = nodes.length, node;
11754             radii = new Array(n);
11755             for (i = 0; i < n; ++i) node = nodes[i], radii[node.index] = +radius(node, i, nodes);
11756           }
11757
11758           force.initialize = function(_) {
11759             nodes = _;
11760             initialize();
11761           };
11762
11763           force.iterations = function(_) {
11764             return arguments.length ? (iterations = +_, force) : iterations;
11765           };
11766
11767           force.strength = function(_) {
11768             return arguments.length ? (strength = +_, force) : strength;
11769           };
11770
11771           force.radius = function(_) {
11772             return arguments.length ? (radius = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : radius;
11773           };
11774
11775           return force;
11776         }
11777
11778         function index(d) {
11779           return d.index;
11780         }
11781
11782         function find(nodeById, nodeId) {
11783           var node = nodeById.get(nodeId);
11784           if (!node) throw new Error("missing: " + nodeId);
11785           return node;
11786         }
11787
11788         function link(links) {
11789           var id = index,
11790               strength = defaultStrength,
11791               strengths,
11792               distance = constant$7(30),
11793               distances,
11794               nodes,
11795               count,
11796               bias,
11797               iterations = 1;
11798
11799           if (links == null) links = [];
11800
11801           function defaultStrength(link) {
11802             return 1 / Math.min(count[link.source.index], count[link.target.index]);
11803           }
11804
11805           function force(alpha) {
11806             for (var k = 0, n = links.length; k < iterations; ++k) {
11807               for (var i = 0, link, source, target, x, y, l, b; i < n; ++i) {
11808                 link = links[i], source = link.source, target = link.target;
11809                 x = target.x + target.vx - source.x - source.vx || jiggle();
11810                 y = target.y + target.vy - source.y - source.vy || jiggle();
11811                 l = Math.sqrt(x * x + y * y);
11812                 l = (l - distances[i]) / l * alpha * strengths[i];
11813                 x *= l, y *= l;
11814                 target.vx -= x * (b = bias[i]);
11815                 target.vy -= y * b;
11816                 source.vx += x * (b = 1 - b);
11817                 source.vy += y * b;
11818               }
11819             }
11820           }
11821
11822           function initialize() {
11823             if (!nodes) return;
11824
11825             var i,
11826                 n = nodes.length,
11827                 m = links.length,
11828                 nodeById = map$3(nodes, id),
11829                 link;
11830
11831             for (i = 0, count = new Array(n); i < m; ++i) {
11832               link = links[i], link.index = i;
11833               if (typeof link.source !== "object") link.source = find(nodeById, link.source);
11834               if (typeof link.target !== "object") link.target = find(nodeById, link.target);
11835               count[link.source.index] = (count[link.source.index] || 0) + 1;
11836               count[link.target.index] = (count[link.target.index] || 0) + 1;
11837             }
11838
11839             for (i = 0, bias = new Array(m); i < m; ++i) {
11840               link = links[i], bias[i] = count[link.source.index] / (count[link.source.index] + count[link.target.index]);
11841             }
11842
11843             strengths = new Array(m), initializeStrength();
11844             distances = new Array(m), initializeDistance();
11845           }
11846
11847           function initializeStrength() {
11848             if (!nodes) return;
11849
11850             for (var i = 0, n = links.length; i < n; ++i) {
11851               strengths[i] = +strength(links[i], i, links);
11852             }
11853           }
11854
11855           function initializeDistance() {
11856             if (!nodes) return;
11857
11858             for (var i = 0, n = links.length; i < n; ++i) {
11859               distances[i] = +distance(links[i], i, links);
11860             }
11861           }
11862
11863           force.initialize = function(_) {
11864             nodes = _;
11865             initialize();
11866           };
11867
11868           force.links = function(_) {
11869             return arguments.length ? (links = _, initialize(), force) : links;
11870           };
11871
11872           force.id = function(_) {
11873             return arguments.length ? (id = _, force) : id;
11874           };
11875
11876           force.iterations = function(_) {
11877             return arguments.length ? (iterations = +_, force) : iterations;
11878           };
11879
11880           force.strength = function(_) {
11881             return arguments.length ? (strength = typeof _ === "function" ? _ : constant$7(+_), initializeStrength(), force) : strength;
11882           };
11883
11884           force.distance = function(_) {
11885             return arguments.length ? (distance = typeof _ === "function" ? _ : constant$7(+_), initializeDistance(), force) : distance;
11886           };
11887
11888           return force;
11889         }
11890
11891         function x$1(d) {
11892           return d.x;
11893         }
11894
11895         function y$1(d) {
11896           return d.y;
11897         }
11898
11899         var initialRadius = 10,
11900             initialAngle = Math.PI * (3 - Math.sqrt(5));
11901
11902         function simulation(nodes) {
11903           var simulation,
11904               alpha = 1,
11905               alphaMin = 0.001,
11906               alphaDecay = 1 - Math.pow(alphaMin, 1 / 300),
11907               alphaTarget = 0,
11908               velocityDecay = 0.6,
11909               forces = map$3(),
11910               stepper = timer(step),
11911               event = dispatch("tick", "end");
11912
11913           if (nodes == null) nodes = [];
11914
11915           function step() {
11916             tick();
11917             event.call("tick", simulation);
11918             if (alpha < alphaMin) {
11919               stepper.stop();
11920               event.call("end", simulation);
11921             }
11922           }
11923
11924           function tick(iterations) {
11925             var i, n = nodes.length, node;
11926
11927             if (iterations === undefined) iterations = 1;
11928
11929             for (var k = 0; k < iterations; ++k) {
11930               alpha += (alphaTarget - alpha) * alphaDecay;
11931
11932               forces.each(function (force) {
11933                 force(alpha);
11934               });
11935
11936               for (i = 0; i < n; ++i) {
11937                 node = nodes[i];
11938                 if (node.fx == null) node.x += node.vx *= velocityDecay;
11939                 else node.x = node.fx, node.vx = 0;
11940                 if (node.fy == null) node.y += node.vy *= velocityDecay;
11941                 else node.y = node.fy, node.vy = 0;
11942               }
11943             }
11944
11945             return simulation;
11946           }
11947
11948           function initializeNodes() {
11949             for (var i = 0, n = nodes.length, node; i < n; ++i) {
11950               node = nodes[i], node.index = i;
11951               if (node.fx != null) node.x = node.fx;
11952               if (node.fy != null) node.y = node.fy;
11953               if (isNaN(node.x) || isNaN(node.y)) {
11954                 var radius = initialRadius * Math.sqrt(i), angle = i * initialAngle;
11955                 node.x = radius * Math.cos(angle);
11956                 node.y = radius * Math.sin(angle);
11957               }
11958               if (isNaN(node.vx) || isNaN(node.vy)) {
11959                 node.vx = node.vy = 0;
11960               }
11961             }
11962           }
11963
11964           function initializeForce(force) {
11965             if (force.initialize) force.initialize(nodes);
11966             return force;
11967           }
11968
11969           initializeNodes();
11970
11971           return simulation = {
11972             tick: tick,
11973
11974             restart: function() {
11975               return stepper.restart(step), simulation;
11976             },
11977
11978             stop: function() {
11979               return stepper.stop(), simulation;
11980             },
11981
11982             nodes: function(_) {
11983               return arguments.length ? (nodes = _, initializeNodes(), forces.each(initializeForce), simulation) : nodes;
11984             },
11985
11986             alpha: function(_) {
11987               return arguments.length ? (alpha = +_, simulation) : alpha;
11988             },
11989
11990             alphaMin: function(_) {
11991               return arguments.length ? (alphaMin = +_, simulation) : alphaMin;
11992             },
11993
11994             alphaDecay: function(_) {
11995               return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay;
11996             },
11997
11998             alphaTarget: function(_) {
11999               return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget;
12000             },
12001
12002             velocityDecay: function(_) {
12003               return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay;
12004             },
12005
12006             force: function(name, _) {
12007               return arguments.length > 1 ? ((_ == null ? forces.remove(name) : forces.set(name, initializeForce(_))), simulation) : forces.get(name);
12008             },
12009
12010             find: function(x, y, radius) {
12011               var i = 0,
12012                   n = nodes.length,
12013                   dx,
12014                   dy,
12015                   d2,
12016                   node,
12017                   closest;
12018
12019               if (radius == null) radius = Infinity;
12020               else radius *= radius;
12021
12022               for (i = 0; i < n; ++i) {
12023                 node = nodes[i];
12024                 dx = x - node.x;
12025                 dy = y - node.y;
12026                 d2 = dx * dx + dy * dy;
12027                 if (d2 < radius) closest = node, radius = d2;
12028               }
12029
12030               return closest;
12031             },
12032
12033             on: function(name, _) {
12034               return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name);
12035             }
12036           };
12037         }
12038
12039         function manyBody() {
12040           var nodes,
12041               node,
12042               alpha,
12043               strength = constant$7(-30),
12044               strengths,
12045               distanceMin2 = 1,
12046               distanceMax2 = Infinity,
12047               theta2 = 0.81;
12048
12049           function force(_) {
12050             var i, n = nodes.length, tree = quadtree(nodes, x$1, y$1).visitAfter(accumulate);
12051             for (alpha = _, i = 0; i < n; ++i) node = nodes[i], tree.visit(apply);
12052           }
12053
12054           function initialize() {
12055             if (!nodes) return;
12056             var i, n = nodes.length, node;
12057             strengths = new Array(n);
12058             for (i = 0; i < n; ++i) node = nodes[i], strengths[node.index] = +strength(node, i, nodes);
12059           }
12060
12061           function accumulate(quad) {
12062             var strength = 0, q, c, weight = 0, x, y, i;
12063
12064             // For internal nodes, accumulate forces from child quadrants.
12065             if (quad.length) {
12066               for (x = y = i = 0; i < 4; ++i) {
12067                 if ((q = quad[i]) && (c = Math.abs(q.value))) {
12068                   strength += q.value, weight += c, x += c * q.x, y += c * q.y;
12069                 }
12070               }
12071               quad.x = x / weight;
12072               quad.y = y / weight;
12073             }
12074
12075             // For leaf nodes, accumulate forces from coincident quadrants.
12076             else {
12077               q = quad;
12078               q.x = q.data.x;
12079               q.y = q.data.y;
12080               do strength += strengths[q.data.index];
12081               while (q = q.next);
12082             }
12083
12084             quad.value = strength;
12085           }
12086
12087           function apply(quad, x1, _, x2) {
12088             if (!quad.value) return true;
12089
12090             var x = quad.x - node.x,
12091                 y = quad.y - node.y,
12092                 w = x2 - x1,
12093                 l = x * x + y * y;
12094
12095             // Apply the Barnes-Hut approximation if possible.
12096             // Limit forces for very close nodes; randomize direction if coincident.
12097             if (w * w / theta2 < l) {
12098               if (l < distanceMax2) {
12099                 if (x === 0) x = jiggle(), l += x * x;
12100                 if (y === 0) y = jiggle(), l += y * y;
12101                 if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);
12102                 node.vx += x * quad.value * alpha / l;
12103                 node.vy += y * quad.value * alpha / l;
12104               }
12105               return true;
12106             }
12107
12108             // Otherwise, process points directly.
12109             else if (quad.length || l >= distanceMax2) return;
12110
12111             // Limit forces for very close nodes; randomize direction if coincident.
12112             if (quad.data !== node || quad.next) {
12113               if (x === 0) x = jiggle(), l += x * x;
12114               if (y === 0) y = jiggle(), l += y * y;
12115               if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);
12116             }
12117
12118             do if (quad.data !== node) {
12119               w = strengths[quad.data.index] * alpha / l;
12120               node.vx += x * w;
12121               node.vy += y * w;
12122             } while (quad = quad.next);
12123           }
12124
12125           force.initialize = function(_) {
12126             nodes = _;
12127             initialize();
12128           };
12129
12130           force.strength = function(_) {
12131             return arguments.length ? (strength = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : strength;
12132           };
12133
12134           force.distanceMin = function(_) {
12135             return arguments.length ? (distanceMin2 = _ * _, force) : Math.sqrt(distanceMin2);
12136           };
12137
12138           force.distanceMax = function(_) {
12139             return arguments.length ? (distanceMax2 = _ * _, force) : Math.sqrt(distanceMax2);
12140           };
12141
12142           force.theta = function(_) {
12143             return arguments.length ? (theta2 = _ * _, force) : Math.sqrt(theta2);
12144           };
12145
12146           return force;
12147         }
12148
12149         function radial(radius, x, y) {
12150           var nodes,
12151               strength = constant$7(0.1),
12152               strengths,
12153               radiuses;
12154
12155           if (typeof radius !== "function") radius = constant$7(+radius);
12156           if (x == null) x = 0;
12157           if (y == null) y = 0;
12158
12159           function force(alpha) {
12160             for (var i = 0, n = nodes.length; i < n; ++i) {
12161               var node = nodes[i],
12162                   dx = node.x - x || 1e-6,
12163                   dy = node.y - y || 1e-6,
12164                   r = Math.sqrt(dx * dx + dy * dy),
12165                   k = (radiuses[i] - r) * strengths[i] * alpha / r;
12166               node.vx += dx * k;
12167               node.vy += dy * k;
12168             }
12169           }
12170
12171           function initialize() {
12172             if (!nodes) return;
12173             var i, n = nodes.length;
12174             strengths = new Array(n);
12175             radiuses = new Array(n);
12176             for (i = 0; i < n; ++i) {
12177               radiuses[i] = +radius(nodes[i], i, nodes);
12178               strengths[i] = isNaN(radiuses[i]) ? 0 : +strength(nodes[i], i, nodes);
12179             }
12180           }
12181
12182           force.initialize = function(_) {
12183             nodes = _, initialize();
12184           };
12185
12186           force.strength = function(_) {
12187             return arguments.length ? (strength = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : strength;
12188           };
12189
12190           force.radius = function(_) {
12191             return arguments.length ? (radius = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : radius;
12192           };
12193
12194           force.x = function(_) {
12195             return arguments.length ? (x = +_, force) : x;
12196           };
12197
12198           force.y = function(_) {
12199             return arguments.length ? (y = +_, force) : y;
12200           };
12201
12202           return force;
12203         }
12204
12205         function x$2(x) {
12206           var strength = constant$7(0.1),
12207               nodes,
12208               strengths,
12209               xz;
12210
12211           if (typeof x !== "function") x = constant$7(x == null ? 0 : +x);
12212
12213           function force(alpha) {
12214             for (var i = 0, n = nodes.length, node; i < n; ++i) {
12215               node = nodes[i], node.vx += (xz[i] - node.x) * strengths[i] * alpha;
12216             }
12217           }
12218
12219           function initialize() {
12220             if (!nodes) return;
12221             var i, n = nodes.length;
12222             strengths = new Array(n);
12223             xz = new Array(n);
12224             for (i = 0; i < n; ++i) {
12225               strengths[i] = isNaN(xz[i] = +x(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);
12226             }
12227           }
12228
12229           force.initialize = function(_) {
12230             nodes = _;
12231             initialize();
12232           };
12233
12234           force.strength = function(_) {
12235             return arguments.length ? (strength = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : strength;
12236           };
12237
12238           force.x = function(_) {
12239             return arguments.length ? (x = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : x;
12240           };
12241
12242           return force;
12243         }
12244
12245         function y$2(y) {
12246           var strength = constant$7(0.1),
12247               nodes,
12248               strengths,
12249               yz;
12250
12251           if (typeof y !== "function") y = constant$7(y == null ? 0 : +y);
12252
12253           function force(alpha) {
12254             for (var i = 0, n = nodes.length, node; i < n; ++i) {
12255               node = nodes[i], node.vy += (yz[i] - node.y) * strengths[i] * alpha;
12256             }
12257           }
12258
12259           function initialize() {
12260             if (!nodes) return;
12261             var i, n = nodes.length;
12262             strengths = new Array(n);
12263             yz = new Array(n);
12264             for (i = 0; i < n; ++i) {
12265               strengths[i] = isNaN(yz[i] = +y(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);
12266             }
12267           }
12268
12269           force.initialize = function(_) {
12270             nodes = _;
12271             initialize();
12272           };
12273
12274           force.strength = function(_) {
12275             return arguments.length ? (strength = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : strength;
12276           };
12277
12278           force.y = function(_) {
12279             return arguments.length ? (y = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : y;
12280           };
12281
12282           return force;
12283         }
12284
12285         // Computes the decimal coefficient and exponent of the specified number x with
12286         // significant digits p, where x is positive and p is in [1, 21] or undefined.
12287         // For example, formatDecimal(1.23) returns ["123", 0].
12288         function formatDecimal(x, p) {
12289           if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf("e")) < 0) return null; // NaN, ±Infinity
12290           var i, coefficient = x.slice(0, i);
12291
12292           // The string returned by toExponential either has the form \d\.\d+e[-+]\d+
12293           // (e.g., 1.2e+3) or the form \de[-+]\d+ (e.g., 1e+3).
12294           return [
12295             coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,
12296             +x.slice(i + 1)
12297           ];
12298         }
12299
12300         function exponent$1(x) {
12301           return x = formatDecimal(Math.abs(x)), x ? x[1] : NaN;
12302         }
12303
12304         function formatGroup(grouping, thousands) {
12305           return function(value, width) {
12306             var i = value.length,
12307                 t = [],
12308                 j = 0,
12309                 g = grouping[0],
12310                 length = 0;
12311
12312             while (i > 0 && g > 0) {
12313               if (length + g + 1 > width) g = Math.max(1, width - length);
12314               t.push(value.substring(i -= g, i + g));
12315               if ((length += g + 1) > width) break;
12316               g = grouping[j = (j + 1) % grouping.length];
12317             }
12318
12319             return t.reverse().join(thousands);
12320           };
12321         }
12322
12323         function formatNumerals(numerals) {
12324           return function(value) {
12325             return value.replace(/[0-9]/g, function(i) {
12326               return numerals[+i];
12327             });
12328           };
12329         }
12330
12331         // [[fill]align][sign][symbol][0][width][,][.precision][~][type]
12332         var re = /^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;
12333
12334         function formatSpecifier(specifier) {
12335           return new FormatSpecifier(specifier);
12336         }
12337
12338         formatSpecifier.prototype = FormatSpecifier.prototype; // instanceof
12339
12340         function FormatSpecifier(specifier) {
12341           if (!(match = re.exec(specifier))) throw new Error("invalid format: " + specifier);
12342           var match;
12343           this.fill = match[1] || " ";
12344           this.align = match[2] || ">";
12345           this.sign = match[3] || "-";
12346           this.symbol = match[4] || "";
12347           this.zero = !!match[5];
12348           this.width = match[6] && +match[6];
12349           this.comma = !!match[7];
12350           this.precision = match[8] && +match[8].slice(1);
12351           this.trim = !!match[9];
12352           this.type = match[10] || "";
12353         }
12354
12355         FormatSpecifier.prototype.toString = function() {
12356           return this.fill
12357               + this.align
12358               + this.sign
12359               + this.symbol
12360               + (this.zero ? "0" : "")
12361               + (this.width == null ? "" : Math.max(1, this.width | 0))
12362               + (this.comma ? "," : "")
12363               + (this.precision == null ? "" : "." + Math.max(0, this.precision | 0))
12364               + (this.trim ? "~" : "")
12365               + this.type;
12366         };
12367
12368         // Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k.
12369         function formatTrim(s) {
12370           out: for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) {
12371             switch (s[i]) {
12372               case ".": i0 = i1 = i; break;
12373               case "0": if (i0 === 0) i0 = i; i1 = i; break;
12374               default: if (i0 > 0) { if (!+s[i]) break out; i0 = 0; } break;
12375             }
12376           }
12377           return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s;
12378         }
12379
12380         var prefixExponent;
12381
12382         function formatPrefixAuto(x, p) {
12383           var d = formatDecimal(x, p);
12384           if (!d) return x + "";
12385           var coefficient = d[0],
12386               exponent = d[1],
12387               i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1,
12388               n = coefficient.length;
12389           return i === n ? coefficient
12390               : i > n ? coefficient + new Array(i - n + 1).join("0")
12391               : i > 0 ? coefficient.slice(0, i) + "." + coefficient.slice(i)
12392               : "0." + new Array(1 - i).join("0") + formatDecimal(x, Math.max(0, p + i - 1))[0]; // less than 1y!
12393         }
12394
12395         function formatRounded(x, p) {
12396           var d = formatDecimal(x, p);
12397           if (!d) return x + "";
12398           var coefficient = d[0],
12399               exponent = d[1];
12400           return exponent < 0 ? "0." + new Array(-exponent).join("0") + coefficient
12401               : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + "." + coefficient.slice(exponent + 1)
12402               : coefficient + new Array(exponent - coefficient.length + 2).join("0");
12403         }
12404
12405         var formatTypes = {
12406           "%": function(x, p) { return (x * 100).toFixed(p); },
12407           "b": function(x) { return Math.round(x).toString(2); },
12408           "c": function(x) { return x + ""; },
12409           "d": function(x) { return Math.round(x).toString(10); },
12410           "e": function(x, p) { return x.toExponential(p); },
12411           "f": function(x, p) { return x.toFixed(p); },
12412           "g": function(x, p) { return x.toPrecision(p); },
12413           "o": function(x) { return Math.round(x).toString(8); },
12414           "p": function(x, p) { return formatRounded(x * 100, p); },
12415           "r": formatRounded,
12416           "s": formatPrefixAuto,
12417           "X": function(x) { return Math.round(x).toString(16).toUpperCase(); },
12418           "x": function(x) { return Math.round(x).toString(16); }
12419         };
12420
12421         function identity$3(x) {
12422           return x;
12423         }
12424
12425         var prefixes = ["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];
12426
12427         function formatLocale(locale) {
12428           var group = locale.grouping && locale.thousands ? formatGroup(locale.grouping, locale.thousands) : identity$3,
12429               currency = locale.currency,
12430               decimal = locale.decimal,
12431               numerals = locale.numerals ? formatNumerals(locale.numerals) : identity$3,
12432               percent = locale.percent || "%";
12433
12434           function newFormat(specifier) {
12435             specifier = formatSpecifier(specifier);
12436
12437             var fill = specifier.fill,
12438                 align = specifier.align,
12439                 sign = specifier.sign,
12440                 symbol = specifier.symbol,
12441                 zero = specifier.zero,
12442                 width = specifier.width,
12443                 comma = specifier.comma,
12444                 precision = specifier.precision,
12445                 trim = specifier.trim,
12446                 type = specifier.type;
12447
12448             // The "n" type is an alias for ",g".
12449             if (type === "n") comma = true, type = "g";
12450
12451             // The "" type, and any invalid type, is an alias for ".12~g".
12452             else if (!formatTypes[type]) precision == null && (precision = 12), trim = true, type = "g";
12453
12454             // If zero fill is specified, padding goes after sign and before digits.
12455             if (zero || (fill === "0" && align === "=")) zero = true, fill = "0", align = "=";
12456
12457             // Compute the prefix and suffix.
12458             // For SI-prefix, the suffix is lazily computed.
12459             var prefix = symbol === "$" ? currency[0] : symbol === "#" && /[boxX]/.test(type) ? "0" + type.toLowerCase() : "",
12460                 suffix = symbol === "$" ? currency[1] : /[%p]/.test(type) ? percent : "";
12461
12462             // What format function should we use?
12463             // Is this an integer type?
12464             // Can this type generate exponential notation?
12465             var formatType = formatTypes[type],
12466                 maybeSuffix = /[defgprs%]/.test(type);
12467
12468             // Set the default precision if not specified,
12469             // or clamp the specified precision to the supported range.
12470             // For significant precision, it must be in [1, 21].
12471             // For fixed precision, it must be in [0, 20].
12472             precision = precision == null ? 6
12473                 : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision))
12474                 : Math.max(0, Math.min(20, precision));
12475
12476             function format(value) {
12477               var valuePrefix = prefix,
12478                   valueSuffix = suffix,
12479                   i, n, c;
12480
12481               if (type === "c") {
12482                 valueSuffix = formatType(value) + valueSuffix;
12483                 value = "";
12484               } else {
12485                 value = +value;
12486
12487                 // Perform the initial formatting.
12488                 var valueNegative = value < 0;
12489                 value = formatType(Math.abs(value), precision);
12490
12491                 // Trim insignificant zeros.
12492                 if (trim) value = formatTrim(value);
12493
12494                 // If a negative value rounds to zero during formatting, treat as positive.
12495                 if (valueNegative && +value === 0) valueNegative = false;
12496
12497                 // Compute the prefix and suffix.
12498                 valuePrefix = (valueNegative ? (sign === "(" ? sign : "-") : sign === "-" || sign === "(" ? "" : sign) + valuePrefix;
12499                 valueSuffix = (type === "s" ? prefixes[8 + prefixExponent / 3] : "") + valueSuffix + (valueNegative && sign === "(" ? ")" : "");
12500
12501                 // Break the formatted value into the integer “value” part that can be
12502                 // grouped, and fractional or exponential “suffix” part that is not.
12503                 if (maybeSuffix) {
12504                   i = -1, n = value.length;
12505                   while (++i < n) {
12506                     if (c = value.charCodeAt(i), 48 > c || c > 57) {
12507                       valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;
12508                       value = value.slice(0, i);
12509                       break;
12510                     }
12511                   }
12512                 }
12513               }
12514
12515               // If the fill character is not "0", grouping is applied before padding.
12516               if (comma && !zero) value = group(value, Infinity);
12517
12518               // Compute the padding.
12519               var length = valuePrefix.length + value.length + valueSuffix.length,
12520                   padding = length < width ? new Array(width - length + 1).join(fill) : "";
12521
12522               // If the fill character is "0", grouping is applied after padding.
12523               if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = "";
12524
12525               // Reconstruct the final output based on the desired alignment.
12526               switch (align) {
12527                 case "<": value = valuePrefix + value + valueSuffix + padding; break;
12528                 case "=": value = valuePrefix + padding + value + valueSuffix; break;
12529                 case "^": value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); break;
12530                 default: value = padding + valuePrefix + value + valueSuffix; break;
12531               }
12532
12533               return numerals(value);
12534             }
12535
12536             format.toString = function() {
12537               return specifier + "";
12538             };
12539
12540             return format;
12541           }
12542
12543           function formatPrefix(specifier, value) {
12544             var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = "f", specifier)),
12545                 e = Math.max(-8, Math.min(8, Math.floor(exponent$1(value) / 3))) * 3,
12546                 k = Math.pow(10, -e),
12547                 prefix = prefixes[8 + e / 3];
12548             return function(value) {
12549               return f(k * value) + prefix;
12550             };
12551           }
12552
12553           return {
12554             format: newFormat,
12555             formatPrefix: formatPrefix
12556           };
12557         }
12558
12559         var locale;
12560         var format;
12561         var formatPrefix;
12562
12563         defaultLocale({
12564           decimal: ".",
12565           thousands: ",",
12566           grouping: [3],
12567           currency: ["$", ""]
12568         });
12569
12570         function defaultLocale(definition) {
12571           locale = formatLocale(definition);
12572           format = locale.format;
12573           formatPrefix = locale.formatPrefix;
12574           return locale;
12575         }
12576
12577         function precisionFixed(step) {
12578           return Math.max(0, -exponent$1(Math.abs(step)));
12579         }
12580
12581         function precisionPrefix(step, value) {
12582           return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent$1(value) / 3))) * 3 - exponent$1(Math.abs(step)));
12583         }
12584
12585         function precisionRound(step, max) {
12586           step = Math.abs(step), max = Math.abs(max) - step;
12587           return Math.max(0, exponent$1(max) - exponent$1(step)) + 1;
12588         }
12589
12590         // Adds floating point numbers with twice the normal precision.
12591         // Reference: J. R. Shewchuk, Adaptive Precision Floating-Point Arithmetic and
12592         // Fast Robust Geometric Predicates, Discrete & Computational Geometry 18(3)
12593         // 305–363 (1997).
12594         // Code adapted from GeographicLib by Charles F. F. Karney,
12595         // http://geographiclib.sourceforge.net/
12596
12597         function adder() {
12598           return new Adder;
12599         }
12600
12601         function Adder() {
12602           this.reset();
12603         }
12604
12605         Adder.prototype = {
12606           constructor: Adder,
12607           reset: function() {
12608             this.s = // rounded value
12609             this.t = 0; // exact error
12610           },
12611           add: function(y) {
12612             add$1(temp, y, this.t);
12613             add$1(this, temp.s, this.s);
12614             if (this.s) this.t += temp.t;
12615             else this.s = temp.t;
12616           },
12617           valueOf: function() {
12618             return this.s;
12619           }
12620         };
12621
12622         var temp = new Adder;
12623
12624         function add$1(adder, a, b) {
12625           var x = adder.s = a + b,
12626               bv = x - a,
12627               av = x - bv;
12628           adder.t = (a - av) + (b - bv);
12629         }
12630
12631         var epsilon$2 = 1e-6;
12632         var epsilon2$1 = 1e-12;
12633         var pi$3 = Math.PI;
12634         var halfPi$2 = pi$3 / 2;
12635         var quarterPi = pi$3 / 4;
12636         var tau$3 = pi$3 * 2;
12637
12638         var degrees$1 = 180 / pi$3;
12639         var radians = pi$3 / 180;
12640
12641         var abs$2 = Math.abs;
12642         var atan = Math.atan;
12643         var atan2 = Math.atan2;
12644         var cos$1 = Math.cos;
12645         var ceil = Math.ceil;
12646         var exp = Math.exp;
12647         var log = Math.log;
12648         var pow = Math.pow;
12649         var sin$1 = Math.sin;
12650         var sign$2 = Math.sign || function(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; };
12651         var sqrt = Math.sqrt;
12652         var tan = Math.tan;
12653
12654         function acos(x) {
12655           return x > 1 ? 0 : x < -1 ? pi$3 : Math.acos(x);
12656         }
12657
12658         function asin(x) {
12659           return x > 1 ? halfPi$2 : x < -1 ? -halfPi$2 : Math.asin(x);
12660         }
12661
12662         function haversin(x) {
12663           return (x = sin$1(x / 2)) * x;
12664         }
12665
12666         function noop$4() {}
12667
12668         function streamGeometry(geometry, stream) {
12669           if (geometry && streamGeometryType.hasOwnProperty(geometry.type)) {
12670             streamGeometryType[geometry.type](geometry, stream);
12671           }
12672         }
12673
12674         var streamObjectType = {
12675           Feature: function(object, stream) {
12676             streamGeometry(object.geometry, stream);
12677           },
12678           FeatureCollection: function(object, stream) {
12679             var features = object.features, i = -1, n = features.length;
12680             while (++i < n) streamGeometry(features[i].geometry, stream);
12681           }
12682         };
12683
12684         var streamGeometryType = {
12685           Sphere: function(object, stream) {
12686             stream.sphere();
12687           },
12688           Point: function(object, stream) {
12689             object = object.coordinates;
12690             stream.point(object[0], object[1], object[2]);
12691           },
12692           MultiPoint: function(object, stream) {
12693             var coordinates = object.coordinates, i = -1, n = coordinates.length;
12694             while (++i < n) object = coordinates[i], stream.point(object[0], object[1], object[2]);
12695           },
12696           LineString: function(object, stream) {
12697             streamLine(object.coordinates, stream, 0);
12698           },
12699           MultiLineString: function(object, stream) {
12700             var coordinates = object.coordinates, i = -1, n = coordinates.length;
12701             while (++i < n) streamLine(coordinates[i], stream, 0);
12702           },
12703           Polygon: function(object, stream) {
12704             streamPolygon(object.coordinates, stream);
12705           },
12706           MultiPolygon: function(object, stream) {
12707             var coordinates = object.coordinates, i = -1, n = coordinates.length;
12708             while (++i < n) streamPolygon(coordinates[i], stream);
12709           },
12710           GeometryCollection: function(object, stream) {
12711             var geometries = object.geometries, i = -1, n = geometries.length;
12712             while (++i < n) streamGeometry(geometries[i], stream);
12713           }
12714         };
12715
12716         function streamLine(coordinates, stream, closed) {
12717           var i = -1, n = coordinates.length - closed, coordinate;
12718           stream.lineStart();
12719           while (++i < n) coordinate = coordinates[i], stream.point(coordinate[0], coordinate[1], coordinate[2]);
12720           stream.lineEnd();
12721         }
12722
12723         function streamPolygon(coordinates, stream) {
12724           var i = -1, n = coordinates.length;
12725           stream.polygonStart();
12726           while (++i < n) streamLine(coordinates[i], stream, 1);
12727           stream.polygonEnd();
12728         }
12729
12730         function d3_geoStream(object, stream) {
12731           if (object && streamObjectType.hasOwnProperty(object.type)) {
12732             streamObjectType[object.type](object, stream);
12733           } else {
12734             streamGeometry(object, stream);
12735           }
12736         }
12737
12738         var areaRingSum = adder();
12739
12740         var areaSum = adder(),
12741             lambda00,
12742             phi00,
12743             lambda0,
12744             cosPhi0,
12745             sinPhi0;
12746
12747         var areaStream = {
12748           point: noop$4,
12749           lineStart: noop$4,
12750           lineEnd: noop$4,
12751           polygonStart: function() {
12752             areaRingSum.reset();
12753             areaStream.lineStart = areaRingStart;
12754             areaStream.lineEnd = areaRingEnd;
12755           },
12756           polygonEnd: function() {
12757             var areaRing = +areaRingSum;
12758             areaSum.add(areaRing < 0 ? tau$3 + areaRing : areaRing);
12759             this.lineStart = this.lineEnd = this.point = noop$4;
12760           },
12761           sphere: function() {
12762             areaSum.add(tau$3);
12763           }
12764         };
12765
12766         function areaRingStart() {
12767           areaStream.point = areaPointFirst;
12768         }
12769
12770         function areaRingEnd() {
12771           areaPoint(lambda00, phi00);
12772         }
12773
12774         function areaPointFirst(lambda, phi) {
12775           areaStream.point = areaPoint;
12776           lambda00 = lambda, phi00 = phi;
12777           lambda *= radians, phi *= radians;
12778           lambda0 = lambda, cosPhi0 = cos$1(phi = phi / 2 + quarterPi), sinPhi0 = sin$1(phi);
12779         }
12780
12781         function areaPoint(lambda, phi) {
12782           lambda *= radians, phi *= radians;
12783           phi = phi / 2 + quarterPi; // half the angular distance from south pole
12784
12785           // Spherical excess E for a spherical triangle with vertices: south pole,
12786           // previous point, current point.  Uses a formula derived from Cagnoli’s
12787           // theorem.  See Todhunter, Spherical Trig. (1871), Sec. 103, Eq. (2).
12788           var dLambda = lambda - lambda0,
12789               sdLambda = dLambda >= 0 ? 1 : -1,
12790               adLambda = sdLambda * dLambda,
12791               cosPhi = cos$1(phi),
12792               sinPhi = sin$1(phi),
12793               k = sinPhi0 * sinPhi,
12794               u = cosPhi0 * cosPhi + k * cos$1(adLambda),
12795               v = k * sdLambda * sin$1(adLambda);
12796           areaRingSum.add(atan2(v, u));
12797
12798           // Advance the previous points.
12799           lambda0 = lambda, cosPhi0 = cosPhi, sinPhi0 = sinPhi;
12800         }
12801
12802         function d3_geoArea(object) {
12803           areaSum.reset();
12804           d3_geoStream(object, areaStream);
12805           return areaSum * 2;
12806         }
12807
12808         function spherical(cartesian) {
12809           return [atan2(cartesian[1], cartesian[0]), asin(cartesian[2])];
12810         }
12811
12812         function cartesian(spherical) {
12813           var lambda = spherical[0], phi = spherical[1], cosPhi = cos$1(phi);
12814           return [cosPhi * cos$1(lambda), cosPhi * sin$1(lambda), sin$1(phi)];
12815         }
12816
12817         function cartesianDot(a, b) {
12818           return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
12819         }
12820
12821         function cartesianCross(a, b) {
12822           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]];
12823         }
12824
12825         // TODO return a
12826         function cartesianAddInPlace(a, b) {
12827           a[0] += b[0], a[1] += b[1], a[2] += b[2];
12828         }
12829
12830         function cartesianScale(vector, k) {
12831           return [vector[0] * k, vector[1] * k, vector[2] * k];
12832         }
12833
12834         // TODO return d
12835         function cartesianNormalizeInPlace(d) {
12836           var l = sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);
12837           d[0] /= l, d[1] /= l, d[2] /= l;
12838         }
12839
12840         var lambda0$1, phi0, lambda1, phi1, // bounds
12841             lambda2, // previous lambda-coordinate
12842             lambda00$1, phi00$1, // first point
12843             p0, // previous 3D point
12844             deltaSum = adder(),
12845             ranges,
12846             range;
12847
12848         var boundsStream = {
12849           point: boundsPoint,
12850           lineStart: boundsLineStart,
12851           lineEnd: boundsLineEnd,
12852           polygonStart: function() {
12853             boundsStream.point = boundsRingPoint;
12854             boundsStream.lineStart = boundsRingStart;
12855             boundsStream.lineEnd = boundsRingEnd;
12856             deltaSum.reset();
12857             areaStream.polygonStart();
12858           },
12859           polygonEnd: function() {
12860             areaStream.polygonEnd();
12861             boundsStream.point = boundsPoint;
12862             boundsStream.lineStart = boundsLineStart;
12863             boundsStream.lineEnd = boundsLineEnd;
12864             if (areaRingSum < 0) lambda0$1 = -(lambda1 = 180), phi0 = -(phi1 = 90);
12865             else if (deltaSum > epsilon$2) phi1 = 90;
12866             else if (deltaSum < -epsilon$2) phi0 = -90;
12867             range[0] = lambda0$1, range[1] = lambda1;
12868           }
12869         };
12870
12871         function boundsPoint(lambda, phi) {
12872           ranges.push(range = [lambda0$1 = lambda, lambda1 = lambda]);
12873           if (phi < phi0) phi0 = phi;
12874           if (phi > phi1) phi1 = phi;
12875         }
12876
12877         function linePoint(lambda, phi) {
12878           var p = cartesian([lambda * radians, phi * radians]);
12879           if (p0) {
12880             var normal = cartesianCross(p0, p),
12881                 equatorial = [normal[1], -normal[0], 0],
12882                 inflection = cartesianCross(equatorial, normal);
12883             cartesianNormalizeInPlace(inflection);
12884             inflection = spherical(inflection);
12885             var delta = lambda - lambda2,
12886                 sign = delta > 0 ? 1 : -1,
12887                 lambdai = inflection[0] * degrees$1 * sign,
12888                 phii,
12889                 antimeridian = abs$2(delta) > 180;
12890             if (antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) {
12891               phii = inflection[1] * degrees$1;
12892               if (phii > phi1) phi1 = phii;
12893             } else if (lambdai = (lambdai + 360) % 360 - 180, antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) {
12894               phii = -inflection[1] * degrees$1;
12895               if (phii < phi0) phi0 = phii;
12896             } else {
12897               if (phi < phi0) phi0 = phi;
12898               if (phi > phi1) phi1 = phi;
12899             }
12900             if (antimeridian) {
12901               if (lambda < lambda2) {
12902                 if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda;
12903               } else {
12904                 if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda;
12905               }
12906             } else {
12907               if (lambda1 >= lambda0$1) {
12908                 if (lambda < lambda0$1) lambda0$1 = lambda;
12909                 if (lambda > lambda1) lambda1 = lambda;
12910               } else {
12911                 if (lambda > lambda2) {
12912                   if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda;
12913                 } else {
12914                   if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda;
12915                 }
12916               }
12917             }
12918           } else {
12919             ranges.push(range = [lambda0$1 = lambda, lambda1 = lambda]);
12920           }
12921           if (phi < phi0) phi0 = phi;
12922           if (phi > phi1) phi1 = phi;
12923           p0 = p, lambda2 = lambda;
12924         }
12925
12926         function boundsLineStart() {
12927           boundsStream.point = linePoint;
12928         }
12929
12930         function boundsLineEnd() {
12931           range[0] = lambda0$1, range[1] = lambda1;
12932           boundsStream.point = boundsPoint;
12933           p0 = null;
12934         }
12935
12936         function boundsRingPoint(lambda, phi) {
12937           if (p0) {
12938             var delta = lambda - lambda2;
12939             deltaSum.add(abs$2(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delta);
12940           } else {
12941             lambda00$1 = lambda, phi00$1 = phi;
12942           }
12943           areaStream.point(lambda, phi);
12944           linePoint(lambda, phi);
12945         }
12946
12947         function boundsRingStart() {
12948           areaStream.lineStart();
12949         }
12950
12951         function boundsRingEnd() {
12952           boundsRingPoint(lambda00$1, phi00$1);
12953           areaStream.lineEnd();
12954           if (abs$2(deltaSum) > epsilon$2) lambda0$1 = -(lambda1 = 180);
12955           range[0] = lambda0$1, range[1] = lambda1;
12956           p0 = null;
12957         }
12958
12959         // Finds the left-right distance between two longitudes.
12960         // This is almost the same as (lambda1 - lambda0 + 360°) % 360°, except that we want
12961         // the distance between ±180° to be 360°.
12962         function angle(lambda0, lambda1) {
12963           return (lambda1 -= lambda0) < 0 ? lambda1 + 360 : lambda1;
12964         }
12965
12966         function rangeCompare(a, b) {
12967           return a[0] - b[0];
12968         }
12969
12970         function rangeContains(range, x) {
12971           return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x;
12972         }
12973
12974         function d3_geoBounds(feature) {
12975           var i, n, a, b, merged, deltaMax, delta;
12976
12977           phi1 = lambda1 = -(lambda0$1 = phi0 = Infinity);
12978           ranges = [];
12979           d3_geoStream(feature, boundsStream);
12980
12981           // First, sort ranges by their minimum longitudes.
12982           if (n = ranges.length) {
12983             ranges.sort(rangeCompare);
12984
12985             // Then, merge any ranges that overlap.
12986             for (i = 1, a = ranges[0], merged = [a]; i < n; ++i) {
12987               b = ranges[i];
12988               if (rangeContains(a, b[0]) || rangeContains(a, b[1])) {
12989                 if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1];
12990                 if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0];
12991               } else {
12992                 merged.push(a = b);
12993               }
12994             }
12995
12996             // Finally, find the largest gap between the merged ranges.
12997             // The final bounding box will be the inverse of this gap.
12998             for (deltaMax = -Infinity, n = merged.length - 1, i = 0, a = merged[n]; i <= n; a = b, ++i) {
12999               b = merged[i];
13000               if ((delta = angle(a[1], b[0])) > deltaMax) deltaMax = delta, lambda0$1 = b[0], lambda1 = a[1];
13001             }
13002           }
13003
13004           ranges = range = null;
13005
13006           return lambda0$1 === Infinity || phi0 === Infinity
13007               ? [[NaN, NaN], [NaN, NaN]]
13008               : [[lambda0$1, phi0], [lambda1, phi1]];
13009         }
13010
13011         var W0, W1,
13012             X0, Y0, Z0,
13013             X1, Y1, Z1,
13014             X2, Y2, Z2,
13015             lambda00$2, phi00$2, // first point
13016             x0, y0, z0; // previous point
13017
13018         var centroidStream = {
13019           sphere: noop$4,
13020           point: centroidPoint,
13021           lineStart: centroidLineStart,
13022           lineEnd: centroidLineEnd,
13023           polygonStart: function() {
13024             centroidStream.lineStart = centroidRingStart;
13025             centroidStream.lineEnd = centroidRingEnd;
13026           },
13027           polygonEnd: function() {
13028             centroidStream.lineStart = centroidLineStart;
13029             centroidStream.lineEnd = centroidLineEnd;
13030           }
13031         };
13032
13033         // Arithmetic mean of Cartesian vectors.
13034         function centroidPoint(lambda, phi) {
13035           lambda *= radians, phi *= radians;
13036           var cosPhi = cos$1(phi);
13037           centroidPointCartesian(cosPhi * cos$1(lambda), cosPhi * sin$1(lambda), sin$1(phi));
13038         }
13039
13040         function centroidPointCartesian(x, y, z) {
13041           ++W0;
13042           X0 += (x - X0) / W0;
13043           Y0 += (y - Y0) / W0;
13044           Z0 += (z - Z0) / W0;
13045         }
13046
13047         function centroidLineStart() {
13048           centroidStream.point = centroidLinePointFirst;
13049         }
13050
13051         function centroidLinePointFirst(lambda, phi) {
13052           lambda *= radians, phi *= radians;
13053           var cosPhi = cos$1(phi);
13054           x0 = cosPhi * cos$1(lambda);
13055           y0 = cosPhi * sin$1(lambda);
13056           z0 = sin$1(phi);
13057           centroidStream.point = centroidLinePoint;
13058           centroidPointCartesian(x0, y0, z0);
13059         }
13060
13061         function centroidLinePoint(lambda, phi) {
13062           lambda *= radians, phi *= radians;
13063           var cosPhi = cos$1(phi),
13064               x = cosPhi * cos$1(lambda),
13065               y = cosPhi * sin$1(lambda),
13066               z = sin$1(phi),
13067               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);
13068           W1 += w;
13069           X1 += w * (x0 + (x0 = x));
13070           Y1 += w * (y0 + (y0 = y));
13071           Z1 += w * (z0 + (z0 = z));
13072           centroidPointCartesian(x0, y0, z0);
13073         }
13074
13075         function centroidLineEnd() {
13076           centroidStream.point = centroidPoint;
13077         }
13078
13079         // See J. E. Brock, The Inertia Tensor for a Spherical Triangle,
13080         // J. Applied Mechanics 42, 239 (1975).
13081         function centroidRingStart() {
13082           centroidStream.point = centroidRingPointFirst;
13083         }
13084
13085         function centroidRingEnd() {
13086           centroidRingPoint(lambda00$2, phi00$2);
13087           centroidStream.point = centroidPoint;
13088         }
13089
13090         function centroidRingPointFirst(lambda, phi) {
13091           lambda00$2 = lambda, phi00$2 = phi;
13092           lambda *= radians, phi *= radians;
13093           centroidStream.point = centroidRingPoint;
13094           var cosPhi = cos$1(phi);
13095           x0 = cosPhi * cos$1(lambda);
13096           y0 = cosPhi * sin$1(lambda);
13097           z0 = sin$1(phi);
13098           centroidPointCartesian(x0, y0, z0);
13099         }
13100
13101         function centroidRingPoint(lambda, phi) {
13102           lambda *= radians, phi *= radians;
13103           var cosPhi = cos$1(phi),
13104               x = cosPhi * cos$1(lambda),
13105               y = cosPhi * sin$1(lambda),
13106               z = sin$1(phi),
13107               cx = y0 * z - z0 * y,
13108               cy = z0 * x - x0 * z,
13109               cz = x0 * y - y0 * x,
13110               m = sqrt(cx * cx + cy * cy + cz * cz),
13111               w = asin(m), // line weight = angle
13112               v = m && -w / m; // area weight multiplier
13113           X2 += v * cx;
13114           Y2 += v * cy;
13115           Z2 += v * cz;
13116           W1 += w;
13117           X1 += w * (x0 + (x0 = x));
13118           Y1 += w * (y0 + (y0 = y));
13119           Z1 += w * (z0 + (z0 = z));
13120           centroidPointCartesian(x0, y0, z0);
13121         }
13122
13123         function d3_geoCentroid(object) {
13124           W0 = W1 =
13125           X0 = Y0 = Z0 =
13126           X1 = Y1 = Z1 =
13127           X2 = Y2 = Z2 = 0;
13128           d3_geoStream(object, centroidStream);
13129
13130           var x = X2,
13131               y = Y2,
13132               z = Z2,
13133               m = x * x + y * y + z * z;
13134
13135           // If the area-weighted ccentroid is undefined, fall back to length-weighted ccentroid.
13136           if (m < epsilon2$1) {
13137             x = X1, y = Y1, z = Z1;
13138             // If the feature has zero length, fall back to arithmetic mean of point vectors.
13139             if (W1 < epsilon$2) x = X0, y = Y0, z = Z0;
13140             m = x * x + y * y + z * z;
13141             // If the feature still has an undefined ccentroid, then return.
13142             if (m < epsilon2$1) return [NaN, NaN];
13143           }
13144
13145           return [atan2(y, x) * degrees$1, asin(z / sqrt(m)) * degrees$1];
13146         }
13147
13148         function constant$8(x) {
13149           return function() {
13150             return x;
13151           };
13152         }
13153
13154         function compose(a, b) {
13155
13156           function compose(x, y) {
13157             return x = a(x, y), b(x[0], x[1]);
13158           }
13159
13160           if (a.invert && b.invert) compose.invert = function(x, y) {
13161             return x = b.invert(x, y), x && a.invert(x[0], x[1]);
13162           };
13163
13164           return compose;
13165         }
13166
13167         function rotationIdentity(lambda, phi) {
13168           return [abs$2(lambda) > pi$3 ? lambda + Math.round(-lambda / tau$3) * tau$3 : lambda, phi];
13169         }
13170
13171         rotationIdentity.invert = rotationIdentity;
13172
13173         function rotateRadians(deltaLambda, deltaPhi, deltaGamma) {
13174           return (deltaLambda %= tau$3) ? (deltaPhi || deltaGamma ? compose(rotationLambda(deltaLambda), rotationPhiGamma(deltaPhi, deltaGamma))
13175             : rotationLambda(deltaLambda))
13176             : (deltaPhi || deltaGamma ? rotationPhiGamma(deltaPhi, deltaGamma)
13177             : rotationIdentity);
13178         }
13179
13180         function forwardRotationLambda(deltaLambda) {
13181           return function(lambda, phi) {
13182             return lambda += deltaLambda, [lambda > pi$3 ? lambda - tau$3 : lambda < -pi$3 ? lambda + tau$3 : lambda, phi];
13183           };
13184         }
13185
13186         function rotationLambda(deltaLambda) {
13187           var rotation = forwardRotationLambda(deltaLambda);
13188           rotation.invert = forwardRotationLambda(-deltaLambda);
13189           return rotation;
13190         }
13191
13192         function rotationPhiGamma(deltaPhi, deltaGamma) {
13193           var cosDeltaPhi = cos$1(deltaPhi),
13194               sinDeltaPhi = sin$1(deltaPhi),
13195               cosDeltaGamma = cos$1(deltaGamma),
13196               sinDeltaGamma = sin$1(deltaGamma);
13197
13198           function rotation(lambda, phi) {
13199             var cosPhi = cos$1(phi),
13200                 x = cos$1(lambda) * cosPhi,
13201                 y = sin$1(lambda) * cosPhi,
13202                 z = sin$1(phi),
13203                 k = z * cosDeltaPhi + x * sinDeltaPhi;
13204             return [
13205               atan2(y * cosDeltaGamma - k * sinDeltaGamma, x * cosDeltaPhi - z * sinDeltaPhi),
13206               asin(k * cosDeltaGamma + y * sinDeltaGamma)
13207             ];
13208           }
13209
13210           rotation.invert = function(lambda, phi) {
13211             var cosPhi = cos$1(phi),
13212                 x = cos$1(lambda) * cosPhi,
13213                 y = sin$1(lambda) * cosPhi,
13214                 z = sin$1(phi),
13215                 k = z * cosDeltaGamma - y * sinDeltaGamma;
13216             return [
13217               atan2(y * cosDeltaGamma + z * sinDeltaGamma, x * cosDeltaPhi + k * sinDeltaPhi),
13218               asin(k * cosDeltaPhi - x * sinDeltaPhi)
13219             ];
13220           };
13221
13222           return rotation;
13223         }
13224
13225         function rotation(rotate) {
13226           rotate = rotateRadians(rotate[0] * radians, rotate[1] * radians, rotate.length > 2 ? rotate[2] * radians : 0);
13227
13228           function forward(coordinates) {
13229             coordinates = rotate(coordinates[0] * radians, coordinates[1] * radians);
13230             return coordinates[0] *= degrees$1, coordinates[1] *= degrees$1, coordinates;
13231           }
13232
13233           forward.invert = function(coordinates) {
13234             coordinates = rotate.invert(coordinates[0] * radians, coordinates[1] * radians);
13235             return coordinates[0] *= degrees$1, coordinates[1] *= degrees$1, coordinates;
13236           };
13237
13238           return forward;
13239         }
13240
13241         // Generates a circle centered at [0°, 0°], with a given radius and precision.
13242         function circleStream(stream, radius, delta, direction, t0, t1) {
13243           if (!delta) return;
13244           var cosRadius = cos$1(radius),
13245               sinRadius = sin$1(radius),
13246               step = direction * delta;
13247           if (t0 == null) {
13248             t0 = radius + direction * tau$3;
13249             t1 = radius - step / 2;
13250           } else {
13251             t0 = circleRadius(cosRadius, t0);
13252             t1 = circleRadius(cosRadius, t1);
13253             if (direction > 0 ? t0 < t1 : t0 > t1) t0 += direction * tau$3;
13254           }
13255           for (var point, t = t0; direction > 0 ? t > t1 : t < t1; t -= step) {
13256             point = spherical([cosRadius, -sinRadius * cos$1(t), -sinRadius * sin$1(t)]);
13257             stream.point(point[0], point[1]);
13258           }
13259         }
13260
13261         // Returns the signed angle of a cartesian point relative to [cosRadius, 0, 0].
13262         function circleRadius(cosRadius, point) {
13263           point = cartesian(point), point[0] -= cosRadius;
13264           cartesianNormalizeInPlace(point);
13265           var radius = acos(-point[1]);
13266           return ((-point[2] < 0 ? -radius : radius) + tau$3 - epsilon$2) % tau$3;
13267         }
13268
13269         function circle() {
13270           var center = constant$8([0, 0]),
13271               radius = constant$8(90),
13272               precision = constant$8(6),
13273               ring,
13274               rotate,
13275               stream = {point: point};
13276
13277           function point(x, y) {
13278             ring.push(x = rotate(x, y));
13279             x[0] *= degrees$1, x[1] *= degrees$1;
13280           }
13281
13282           function circle() {
13283             var c = center.apply(this, arguments),
13284                 r = radius.apply(this, arguments) * radians,
13285                 p = precision.apply(this, arguments) * radians;
13286             ring = [];
13287             rotate = rotateRadians(-c[0] * radians, -c[1] * radians, 0).invert;
13288             circleStream(stream, r, p, 1);
13289             c = {type: "Polygon", coordinates: [ring]};
13290             ring = rotate = null;
13291             return c;
13292           }
13293
13294           circle.center = function(_) {
13295             return arguments.length ? (center = typeof _ === "function" ? _ : constant$8([+_[0], +_[1]]), circle) : center;
13296           };
13297
13298           circle.radius = function(_) {
13299             return arguments.length ? (radius = typeof _ === "function" ? _ : constant$8(+_), circle) : radius;
13300           };
13301
13302           circle.precision = function(_) {
13303             return arguments.length ? (precision = typeof _ === "function" ? _ : constant$8(+_), circle) : precision;
13304           };
13305
13306           return circle;
13307         }
13308
13309         function clipBuffer() {
13310           var lines = [],
13311               line;
13312           return {
13313             point: function(x, y) {
13314               line.push([x, y]);
13315             },
13316             lineStart: function() {
13317               lines.push(line = []);
13318             },
13319             lineEnd: noop$4,
13320             rejoin: function() {
13321               if (lines.length > 1) lines.push(lines.pop().concat(lines.shift()));
13322             },
13323             result: function() {
13324               var result = lines;
13325               lines = [];
13326               line = null;
13327               return result;
13328             }
13329           };
13330         }
13331
13332         function pointEqual(a, b) {
13333           return abs$2(a[0] - b[0]) < epsilon$2 && abs$2(a[1] - b[1]) < epsilon$2;
13334         }
13335
13336         function Intersection(point, points, other, entry) {
13337           this.x = point;
13338           this.z = points;
13339           this.o = other; // another intersection
13340           this.e = entry; // is an entry?
13341           this.v = false; // visited
13342           this.n = this.p = null; // next & previous
13343         }
13344
13345         // A generalized polygon clipping algorithm: given a polygon that has been cut
13346         // into its visible line segments, and rejoins the segments by interpolating
13347         // along the clip edge.
13348         function clipRejoin(segments, compareIntersection, startInside, interpolate, stream) {
13349           var subject = [],
13350               clip = [],
13351               i,
13352               n;
13353
13354           segments.forEach(function(segment) {
13355             if ((n = segment.length - 1) <= 0) return;
13356             var n, p0 = segment[0], p1 = segment[n], x;
13357
13358             // If the first and last points of a segment are coincident, then treat as a
13359             // closed ring. TODO if all rings are closed, then the winding order of the
13360             // exterior ring should be checked.
13361             if (pointEqual(p0, p1)) {
13362               stream.lineStart();
13363               for (i = 0; i < n; ++i) stream.point((p0 = segment[i])[0], p0[1]);
13364               stream.lineEnd();
13365               return;
13366             }
13367
13368             subject.push(x = new Intersection(p0, segment, null, true));
13369             clip.push(x.o = new Intersection(p0, null, x, false));
13370             subject.push(x = new Intersection(p1, segment, null, false));
13371             clip.push(x.o = new Intersection(p1, null, x, true));
13372           });
13373
13374           if (!subject.length) return;
13375
13376           clip.sort(compareIntersection);
13377           link$1(subject);
13378           link$1(clip);
13379
13380           for (i = 0, n = clip.length; i < n; ++i) {
13381             clip[i].e = startInside = !startInside;
13382           }
13383
13384           var start = subject[0],
13385               points,
13386               point;
13387
13388           while (1) {
13389             // Find first unvisited intersection.
13390             var current = start,
13391                 isSubject = true;
13392             while (current.v) if ((current = current.n) === start) return;
13393             points = current.z;
13394             stream.lineStart();
13395             do {
13396               current.v = current.o.v = true;
13397               if (current.e) {
13398                 if (isSubject) {
13399                   for (i = 0, n = points.length; i < n; ++i) stream.point((point = points[i])[0], point[1]);
13400                 } else {
13401                   interpolate(current.x, current.n.x, 1, stream);
13402                 }
13403                 current = current.n;
13404               } else {
13405                 if (isSubject) {
13406                   points = current.p.z;
13407                   for (i = points.length - 1; i >= 0; --i) stream.point((point = points[i])[0], point[1]);
13408                 } else {
13409                   interpolate(current.x, current.p.x, -1, stream);
13410                 }
13411                 current = current.p;
13412               }
13413               current = current.o;
13414               points = current.z;
13415               isSubject = !isSubject;
13416             } while (!current.v);
13417             stream.lineEnd();
13418           }
13419         }
13420
13421         function link$1(array) {
13422           if (!(n = array.length)) return;
13423           var n,
13424               i = 0,
13425               a = array[0],
13426               b;
13427           while (++i < n) {
13428             a.n = b = array[i];
13429             b.p = a;
13430             a = b;
13431           }
13432           a.n = b = array[0];
13433           b.p = a;
13434         }
13435
13436         var sum$1 = adder();
13437
13438         function polygonContains(polygon, point) {
13439           var lambda = point[0],
13440               phi = point[1],
13441               sinPhi = sin$1(phi),
13442               normal = [sin$1(lambda), -cos$1(lambda), 0],
13443               angle = 0,
13444               winding = 0;
13445
13446           sum$1.reset();
13447
13448           if (sinPhi === 1) phi = halfPi$2 + epsilon$2;
13449           else if (sinPhi === -1) phi = -halfPi$2 - epsilon$2;
13450
13451           for (var i = 0, n = polygon.length; i < n; ++i) {
13452             if (!(m = (ring = polygon[i]).length)) continue;
13453             var ring,
13454                 m,
13455                 point0 = ring[m - 1],
13456                 lambda0 = point0[0],
13457                 phi0 = point0[1] / 2 + quarterPi,
13458                 sinPhi0 = sin$1(phi0),
13459                 cosPhi0 = cos$1(phi0);
13460
13461             for (var j = 0; j < m; ++j, lambda0 = lambda1, sinPhi0 = sinPhi1, cosPhi0 = cosPhi1, point0 = point1) {
13462               var point1 = ring[j],
13463                   lambda1 = point1[0],
13464                   phi1 = point1[1] / 2 + quarterPi,
13465                   sinPhi1 = sin$1(phi1),
13466                   cosPhi1 = cos$1(phi1),
13467                   delta = lambda1 - lambda0,
13468                   sign = delta >= 0 ? 1 : -1,
13469                   absDelta = sign * delta,
13470                   antimeridian = absDelta > pi$3,
13471                   k = sinPhi0 * sinPhi1;
13472
13473               sum$1.add(atan2(k * sign * sin$1(absDelta), cosPhi0 * cosPhi1 + k * cos$1(absDelta)));
13474               angle += antimeridian ? delta + sign * tau$3 : delta;
13475
13476               // Are the longitudes either side of the point’s meridian (lambda),
13477               // and are the latitudes smaller than the parallel (phi)?
13478               if (antimeridian ^ lambda0 >= lambda ^ lambda1 >= lambda) {
13479                 var arc = cartesianCross(cartesian(point0), cartesian(point1));
13480                 cartesianNormalizeInPlace(arc);
13481                 var intersection = cartesianCross(normal, arc);
13482                 cartesianNormalizeInPlace(intersection);
13483                 var phiArc = (antimeridian ^ delta >= 0 ? -1 : 1) * asin(intersection[2]);
13484                 if (phi > phiArc || phi === phiArc && (arc[0] || arc[1])) {
13485                   winding += antimeridian ^ delta >= 0 ? 1 : -1;
13486                 }
13487               }
13488             }
13489           }
13490
13491           // First, determine whether the South pole is inside or outside:
13492           //
13493           // It is inside if:
13494           // * the polygon winds around it in a clockwise direction.
13495           // * the polygon does not (cumulatively) wind around it, but has a negative
13496           //   (counter-clockwise) area.
13497           //
13498           // Second, count the (signed) number of times a segment crosses a lambda
13499           // from the point to the South pole.  If it is zero, then the point is the
13500           // same side as the South pole.
13501
13502           return (angle < -epsilon$2 || angle < epsilon$2 && sum$1 < -epsilon$2) ^ (winding & 1);
13503         }
13504
13505         function clip(pointVisible, clipLine, interpolate, start) {
13506           return function(sink) {
13507             var line = clipLine(sink),
13508                 ringBuffer = clipBuffer(),
13509                 ringSink = clipLine(ringBuffer),
13510                 polygonStarted = false,
13511                 polygon,
13512                 segments,
13513                 ring;
13514
13515             var clip = {
13516               point: point,
13517               lineStart: lineStart,
13518               lineEnd: lineEnd,
13519               polygonStart: function() {
13520                 clip.point = pointRing;
13521                 clip.lineStart = ringStart;
13522                 clip.lineEnd = ringEnd;
13523                 segments = [];
13524                 polygon = [];
13525               },
13526               polygonEnd: function() {
13527                 clip.point = point;
13528                 clip.lineStart = lineStart;
13529                 clip.lineEnd = lineEnd;
13530                 segments = merge(segments);
13531                 var startInside = polygonContains(polygon, start);
13532                 if (segments.length) {
13533                   if (!polygonStarted) sink.polygonStart(), polygonStarted = true;
13534                   clipRejoin(segments, compareIntersection, startInside, interpolate, sink);
13535                 } else if (startInside) {
13536                   if (!polygonStarted) sink.polygonStart(), polygonStarted = true;
13537                   sink.lineStart();
13538                   interpolate(null, null, 1, sink);
13539                   sink.lineEnd();
13540                 }
13541                 if (polygonStarted) sink.polygonEnd(), polygonStarted = false;
13542                 segments = polygon = null;
13543               },
13544               sphere: function() {
13545                 sink.polygonStart();
13546                 sink.lineStart();
13547                 interpolate(null, null, 1, sink);
13548                 sink.lineEnd();
13549                 sink.polygonEnd();
13550               }
13551             };
13552
13553             function point(lambda, phi) {
13554               if (pointVisible(lambda, phi)) sink.point(lambda, phi);
13555             }
13556
13557             function pointLine(lambda, phi) {
13558               line.point(lambda, phi);
13559             }
13560
13561             function lineStart() {
13562               clip.point = pointLine;
13563               line.lineStart();
13564             }
13565
13566             function lineEnd() {
13567               clip.point = point;
13568               line.lineEnd();
13569             }
13570
13571             function pointRing(lambda, phi) {
13572               ring.push([lambda, phi]);
13573               ringSink.point(lambda, phi);
13574             }
13575
13576             function ringStart() {
13577               ringSink.lineStart();
13578               ring = [];
13579             }
13580
13581             function ringEnd() {
13582               pointRing(ring[0][0], ring[0][1]);
13583               ringSink.lineEnd();
13584
13585               var clean = ringSink.clean(),
13586                   ringSegments = ringBuffer.result(),
13587                   i, n = ringSegments.length, m,
13588                   segment,
13589                   point;
13590
13591               ring.pop();
13592               polygon.push(ring);
13593               ring = null;
13594
13595               if (!n) return;
13596
13597               // No intersections.
13598               if (clean & 1) {
13599                 segment = ringSegments[0];
13600                 if ((m = segment.length - 1) > 0) {
13601                   if (!polygonStarted) sink.polygonStart(), polygonStarted = true;
13602                   sink.lineStart();
13603                   for (i = 0; i < m; ++i) sink.point((point = segment[i])[0], point[1]);
13604                   sink.lineEnd();
13605                 }
13606                 return;
13607               }
13608
13609               // Rejoin connected segments.
13610               // TODO reuse ringBuffer.rejoin()?
13611               if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));
13612
13613               segments.push(ringSegments.filter(validSegment));
13614             }
13615
13616             return clip;
13617           };
13618         }
13619
13620         function validSegment(segment) {
13621           return segment.length > 1;
13622         }
13623
13624         // Intersections are sorted along the clip edge. For both antimeridian cutting
13625         // and circle clipping, the same comparison is used.
13626         function compareIntersection(a, b) {
13627           return ((a = a.x)[0] < 0 ? a[1] - halfPi$2 - epsilon$2 : halfPi$2 - a[1])
13628                - ((b = b.x)[0] < 0 ? b[1] - halfPi$2 - epsilon$2 : halfPi$2 - b[1]);
13629         }
13630
13631         var clipAntimeridian = clip(
13632           function() { return true; },
13633           clipAntimeridianLine,
13634           clipAntimeridianInterpolate,
13635           [-pi$3, -halfPi$2]
13636         );
13637
13638         // Takes a line and cuts into visible segments. Return values: 0 - there were
13639         // intersections or the line was empty; 1 - no intersections; 2 - there were
13640         // intersections, and the first and last segments should be rejoined.
13641         function clipAntimeridianLine(stream) {
13642           var lambda0 = NaN,
13643               phi0 = NaN,
13644               sign0 = NaN,
13645               clean; // no intersections
13646
13647           return {
13648             lineStart: function() {
13649               stream.lineStart();
13650               clean = 1;
13651             },
13652             point: function(lambda1, phi1) {
13653               var sign1 = lambda1 > 0 ? pi$3 : -pi$3,
13654                   delta = abs$2(lambda1 - lambda0);
13655               if (abs$2(delta - pi$3) < epsilon$2) { // line crosses a pole
13656                 stream.point(lambda0, phi0 = (phi0 + phi1) / 2 > 0 ? halfPi$2 : -halfPi$2);
13657                 stream.point(sign0, phi0);
13658                 stream.lineEnd();
13659                 stream.lineStart();
13660                 stream.point(sign1, phi0);
13661                 stream.point(lambda1, phi0);
13662                 clean = 0;
13663               } else if (sign0 !== sign1 && delta >= pi$3) { // line crosses antimeridian
13664                 if (abs$2(lambda0 - sign0) < epsilon$2) lambda0 -= sign0 * epsilon$2; // handle degeneracies
13665                 if (abs$2(lambda1 - sign1) < epsilon$2) lambda1 -= sign1 * epsilon$2;
13666                 phi0 = clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1);
13667                 stream.point(sign0, phi0);
13668                 stream.lineEnd();
13669                 stream.lineStart();
13670                 stream.point(sign1, phi0);
13671                 clean = 0;
13672               }
13673               stream.point(lambda0 = lambda1, phi0 = phi1);
13674               sign0 = sign1;
13675             },
13676             lineEnd: function() {
13677               stream.lineEnd();
13678               lambda0 = phi0 = NaN;
13679             },
13680             clean: function() {
13681               return 2 - clean; // if intersections, rejoin first and last segments
13682             }
13683           };
13684         }
13685
13686         function clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1) {
13687           var cosPhi0,
13688               cosPhi1,
13689               sinLambda0Lambda1 = sin$1(lambda0 - lambda1);
13690           return abs$2(sinLambda0Lambda1) > epsilon$2
13691               ? atan((sin$1(phi0) * (cosPhi1 = cos$1(phi1)) * sin$1(lambda1)
13692                   - sin$1(phi1) * (cosPhi0 = cos$1(phi0)) * sin$1(lambda0))
13693                   / (cosPhi0 * cosPhi1 * sinLambda0Lambda1))
13694               : (phi0 + phi1) / 2;
13695         }
13696
13697         function clipAntimeridianInterpolate(from, to, direction, stream) {
13698           var phi;
13699           if (from == null) {
13700             phi = direction * halfPi$2;
13701             stream.point(-pi$3, phi);
13702             stream.point(0, phi);
13703             stream.point(pi$3, phi);
13704             stream.point(pi$3, 0);
13705             stream.point(pi$3, -phi);
13706             stream.point(0, -phi);
13707             stream.point(-pi$3, -phi);
13708             stream.point(-pi$3, 0);
13709             stream.point(-pi$3, phi);
13710           } else if (abs$2(from[0] - to[0]) > epsilon$2) {
13711             var lambda = from[0] < to[0] ? pi$3 : -pi$3;
13712             phi = direction * lambda / 2;
13713             stream.point(-lambda, phi);
13714             stream.point(0, phi);
13715             stream.point(lambda, phi);
13716           } else {
13717             stream.point(to[0], to[1]);
13718           }
13719         }
13720
13721         function clipCircle(radius) {
13722           var cr = cos$1(radius),
13723               delta = 6 * radians,
13724               smallRadius = cr > 0,
13725               notHemisphere = abs$2(cr) > epsilon$2; // TODO optimise for this common case
13726
13727           function interpolate(from, to, direction, stream) {
13728             circleStream(stream, radius, delta, direction, from, to);
13729           }
13730
13731           function visible(lambda, phi) {
13732             return cos$1(lambda) * cos$1(phi) > cr;
13733           }
13734
13735           // Takes a line and cuts into visible segments. Return values used for polygon
13736           // clipping: 0 - there were intersections or the line was empty; 1 - no
13737           // intersections 2 - there were intersections, and the first and last segments
13738           // should be rejoined.
13739           function clipLine(stream) {
13740             var point0, // previous point
13741                 c0, // code for previous point
13742                 v0, // visibility of previous point
13743                 v00, // visibility of first point
13744                 clean; // no intersections
13745             return {
13746               lineStart: function() {
13747                 v00 = v0 = false;
13748                 clean = 1;
13749               },
13750               point: function(lambda, phi) {
13751                 var point1 = [lambda, phi],
13752                     point2,
13753                     v = visible(lambda, phi),
13754                     c = smallRadius
13755                       ? v ? 0 : code(lambda, phi)
13756                       : v ? code(lambda + (lambda < 0 ? pi$3 : -pi$3), phi) : 0;
13757                 if (!point0 && (v00 = v0 = v)) stream.lineStart();
13758                 // Handle degeneracies.
13759                 // TODO ignore if not clipping polygons.
13760                 if (v !== v0) {
13761                   point2 = intersect(point0, point1);
13762                   if (!point2 || pointEqual(point0, point2) || pointEqual(point1, point2)) {
13763                     point1[0] += epsilon$2;
13764                     point1[1] += epsilon$2;
13765                     v = visible(point1[0], point1[1]);
13766                   }
13767                 }
13768                 if (v !== v0) {
13769                   clean = 0;
13770                   if (v) {
13771                     // outside going in
13772                     stream.lineStart();
13773                     point2 = intersect(point1, point0);
13774                     stream.point(point2[0], point2[1]);
13775                   } else {
13776                     // inside going out
13777                     point2 = intersect(point0, point1);
13778                     stream.point(point2[0], point2[1]);
13779                     stream.lineEnd();
13780                   }
13781                   point0 = point2;
13782                 } else if (notHemisphere && point0 && smallRadius ^ v) {
13783                   var t;
13784                   // If the codes for two points are different, or are both zero,
13785                   // and there this segment intersects with the small circle.
13786                   if (!(c & c0) && (t = intersect(point1, point0, true))) {
13787                     clean = 0;
13788                     if (smallRadius) {
13789                       stream.lineStart();
13790                       stream.point(t[0][0], t[0][1]);
13791                       stream.point(t[1][0], t[1][1]);
13792                       stream.lineEnd();
13793                     } else {
13794                       stream.point(t[1][0], t[1][1]);
13795                       stream.lineEnd();
13796                       stream.lineStart();
13797                       stream.point(t[0][0], t[0][1]);
13798                     }
13799                   }
13800                 }
13801                 if (v && (!point0 || !pointEqual(point0, point1))) {
13802                   stream.point(point1[0], point1[1]);
13803                 }
13804                 point0 = point1, v0 = v, c0 = c;
13805               },
13806               lineEnd: function() {
13807                 if (v0) stream.lineEnd();
13808                 point0 = null;
13809               },
13810               // Rejoin first and last segments if there were intersections and the first
13811               // and last points were visible.
13812               clean: function() {
13813                 return clean | ((v00 && v0) << 1);
13814               }
13815             };
13816           }
13817
13818           // Intersects the great circle between a and b with the clip circle.
13819           function intersect(a, b, two) {
13820             var pa = cartesian(a),
13821                 pb = cartesian(b);
13822
13823             // We have two planes, n1.p = d1 and n2.p = d2.
13824             // Find intersection line p(t) = c1 n1 + c2 n2 + t (n1 ⨯ n2).
13825             var n1 = [1, 0, 0], // normal
13826                 n2 = cartesianCross(pa, pb),
13827                 n2n2 = cartesianDot(n2, n2),
13828                 n1n2 = n2[0], // cartesianDot(n1, n2),
13829                 determinant = n2n2 - n1n2 * n1n2;
13830
13831             // Two polar points.
13832             if (!determinant) return !two && a;
13833
13834             var c1 =  cr * n2n2 / determinant,
13835                 c2 = -cr * n1n2 / determinant,
13836                 n1xn2 = cartesianCross(n1, n2),
13837                 A = cartesianScale(n1, c1),
13838                 B = cartesianScale(n2, c2);
13839             cartesianAddInPlace(A, B);
13840
13841             // Solve |p(t)|^2 = 1.
13842             var u = n1xn2,
13843                 w = cartesianDot(A, u),
13844                 uu = cartesianDot(u, u),
13845                 t2 = w * w - uu * (cartesianDot(A, A) - 1);
13846
13847             if (t2 < 0) return;
13848
13849             var t = sqrt(t2),
13850                 q = cartesianScale(u, (-w - t) / uu);
13851             cartesianAddInPlace(q, A);
13852             q = spherical(q);
13853
13854             if (!two) return q;
13855
13856             // Two intersection points.
13857             var lambda0 = a[0],
13858                 lambda1 = b[0],
13859                 phi0 = a[1],
13860                 phi1 = b[1],
13861                 z;
13862
13863             if (lambda1 < lambda0) z = lambda0, lambda0 = lambda1, lambda1 = z;
13864
13865             var delta = lambda1 - lambda0,
13866                 polar = abs$2(delta - pi$3) < epsilon$2,
13867                 meridian = polar || delta < epsilon$2;
13868
13869             if (!polar && phi1 < phi0) z = phi0, phi0 = phi1, phi1 = z;
13870
13871             // Check that the first point is between a and b.
13872             if (meridian
13873                 ? polar
13874                   ? phi0 + phi1 > 0 ^ q[1] < (abs$2(q[0] - lambda0) < epsilon$2 ? phi0 : phi1)
13875                   : phi0 <= q[1] && q[1] <= phi1
13876                 : delta > pi$3 ^ (lambda0 <= q[0] && q[0] <= lambda1)) {
13877               var q1 = cartesianScale(u, (-w + t) / uu);
13878               cartesianAddInPlace(q1, A);
13879               return [q, spherical(q1)];
13880             }
13881           }
13882
13883           // Generates a 4-bit vector representing the location of a point relative to
13884           // the small circle's bounding box.
13885           function code(lambda, phi) {
13886             var r = smallRadius ? radius : pi$3 - radius,
13887                 code = 0;
13888             if (lambda < -r) code |= 1; // left
13889             else if (lambda > r) code |= 2; // right
13890             if (phi < -r) code |= 4; // below
13891             else if (phi > r) code |= 8; // above
13892             return code;
13893           }
13894
13895           return clip(visible, clipLine, interpolate, smallRadius ? [0, -radius] : [-pi$3, radius - pi$3]);
13896         }
13897
13898         function clipLine(a, b, x0, y0, x1, y1) {
13899           var ax = a[0],
13900               ay = a[1],
13901               bx = b[0],
13902               by = b[1],
13903               t0 = 0,
13904               t1 = 1,
13905               dx = bx - ax,
13906               dy = by - ay,
13907               r;
13908
13909           r = x0 - ax;
13910           if (!dx && r > 0) return;
13911           r /= dx;
13912           if (dx < 0) {
13913             if (r < t0) return;
13914             if (r < t1) t1 = r;
13915           } else if (dx > 0) {
13916             if (r > t1) return;
13917             if (r > t0) t0 = r;
13918           }
13919
13920           r = x1 - ax;
13921           if (!dx && r < 0) return;
13922           r /= dx;
13923           if (dx < 0) {
13924             if (r > t1) return;
13925             if (r > t0) t0 = r;
13926           } else if (dx > 0) {
13927             if (r < t0) return;
13928             if (r < t1) t1 = r;
13929           }
13930
13931           r = y0 - ay;
13932           if (!dy && r > 0) return;
13933           r /= dy;
13934           if (dy < 0) {
13935             if (r < t0) return;
13936             if (r < t1) t1 = r;
13937           } else if (dy > 0) {
13938             if (r > t1) return;
13939             if (r > t0) t0 = r;
13940           }
13941
13942           r = y1 - ay;
13943           if (!dy && r < 0) return;
13944           r /= dy;
13945           if (dy < 0) {
13946             if (r > t1) return;
13947             if (r > t0) t0 = r;
13948           } else if (dy > 0) {
13949             if (r < t0) return;
13950             if (r < t1) t1 = r;
13951           }
13952
13953           if (t0 > 0) a[0] = ax + t0 * dx, a[1] = ay + t0 * dy;
13954           if (t1 < 1) b[0] = ax + t1 * dx, b[1] = ay + t1 * dy;
13955           return true;
13956         }
13957
13958         var clipMax = 1e9, clipMin = -clipMax;
13959
13960         // TODO Use d3-polygon’s polygonContains here for the ring check?
13961         // TODO Eliminate duplicate buffering in clipBuffer and polygon.push?
13962
13963         function clipRectangle(x0, y0, x1, y1) {
13964
13965           function visible(x, y) {
13966             return x0 <= x && x <= x1 && y0 <= y && y <= y1;
13967           }
13968
13969           function interpolate(from, to, direction, stream) {
13970             var a = 0, a1 = 0;
13971             if (from == null
13972                 || (a = corner(from, direction)) !== (a1 = corner(to, direction))
13973                 || comparePoint(from, to) < 0 ^ direction > 0) {
13974               do stream.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0);
13975               while ((a = (a + direction + 4) % 4) !== a1);
13976             } else {
13977               stream.point(to[0], to[1]);
13978             }
13979           }
13980
13981           function corner(p, direction) {
13982             return abs$2(p[0] - x0) < epsilon$2 ? direction > 0 ? 0 : 3
13983                 : abs$2(p[0] - x1) < epsilon$2 ? direction > 0 ? 2 : 1
13984                 : abs$2(p[1] - y0) < epsilon$2 ? direction > 0 ? 1 : 0
13985                 : direction > 0 ? 3 : 2; // abs(p[1] - y1) < epsilon
13986           }
13987
13988           function compareIntersection(a, b) {
13989             return comparePoint(a.x, b.x);
13990           }
13991
13992           function comparePoint(a, b) {
13993             var ca = corner(a, 1),
13994                 cb = corner(b, 1);
13995             return ca !== cb ? ca - cb
13996                 : ca === 0 ? b[1] - a[1]
13997                 : ca === 1 ? a[0] - b[0]
13998                 : ca === 2 ? a[1] - b[1]
13999                 : b[0] - a[0];
14000           }
14001
14002           return function(stream) {
14003             var activeStream = stream,
14004                 bufferStream = clipBuffer(),
14005                 segments,
14006                 polygon,
14007                 ring,
14008                 x__, y__, v__, // first point
14009                 x_, y_, v_, // previous point
14010                 first,
14011                 clean;
14012
14013             var clipStream = {
14014               point: point,
14015               lineStart: lineStart,
14016               lineEnd: lineEnd,
14017               polygonStart: polygonStart,
14018               polygonEnd: polygonEnd
14019             };
14020
14021             function point(x, y) {
14022               if (visible(x, y)) activeStream.point(x, y);
14023             }
14024
14025             function polygonInside() {
14026               var winding = 0;
14027
14028               for (var i = 0, n = polygon.length; i < n; ++i) {
14029                 for (var ring = polygon[i], j = 1, m = ring.length, point = ring[0], a0, a1, b0 = point[0], b1 = point[1]; j < m; ++j) {
14030                   a0 = b0, a1 = b1, point = ring[j], b0 = point[0], b1 = point[1];
14031                   if (a1 <= y1) { if (b1 > y1 && (b0 - a0) * (y1 - a1) > (b1 - a1) * (x0 - a0)) ++winding; }
14032                   else { if (b1 <= y1 && (b0 - a0) * (y1 - a1) < (b1 - a1) * (x0 - a0)) --winding; }
14033                 }
14034               }
14035
14036               return winding;
14037             }
14038
14039             // Buffer geometry within a polygon and then clip it en masse.
14040             function polygonStart() {
14041               activeStream = bufferStream, segments = [], polygon = [], clean = true;
14042             }
14043
14044             function polygonEnd() {
14045               var startInside = polygonInside(),
14046                   cleanInside = clean && startInside,
14047                   visible = (segments = merge(segments)).length;
14048               if (cleanInside || visible) {
14049                 stream.polygonStart();
14050                 if (cleanInside) {
14051                   stream.lineStart();
14052                   interpolate(null, null, 1, stream);
14053                   stream.lineEnd();
14054                 }
14055                 if (visible) {
14056                   clipRejoin(segments, compareIntersection, startInside, interpolate, stream);
14057                 }
14058                 stream.polygonEnd();
14059               }
14060               activeStream = stream, segments = polygon = ring = null;
14061             }
14062
14063             function lineStart() {
14064               clipStream.point = linePoint;
14065               if (polygon) polygon.push(ring = []);
14066               first = true;
14067               v_ = false;
14068               x_ = y_ = NaN;
14069             }
14070
14071             // TODO rather than special-case polygons, simply handle them separately.
14072             // Ideally, coincident intersection points should be jittered to avoid
14073             // clipping issues.
14074             function lineEnd() {
14075               if (segments) {
14076                 linePoint(x__, y__);
14077                 if (v__ && v_) bufferStream.rejoin();
14078                 segments.push(bufferStream.result());
14079               }
14080               clipStream.point = point;
14081               if (v_) activeStream.lineEnd();
14082             }
14083
14084             function linePoint(x, y) {
14085               var v = visible(x, y);
14086               if (polygon) ring.push([x, y]);
14087               if (first) {
14088                 x__ = x, y__ = y, v__ = v;
14089                 first = false;
14090                 if (v) {
14091                   activeStream.lineStart();
14092                   activeStream.point(x, y);
14093                 }
14094               } else {
14095                 if (v && v_) activeStream.point(x, y);
14096                 else {
14097                   var a = [x_ = Math.max(clipMin, Math.min(clipMax, x_)), y_ = Math.max(clipMin, Math.min(clipMax, y_))],
14098                       b = [x = Math.max(clipMin, Math.min(clipMax, x)), y = Math.max(clipMin, Math.min(clipMax, y))];
14099                   if (clipLine(a, b, x0, y0, x1, y1)) {
14100                     if (!v_) {
14101                       activeStream.lineStart();
14102                       activeStream.point(a[0], a[1]);
14103                     }
14104                     activeStream.point(b[0], b[1]);
14105                     if (!v) activeStream.lineEnd();
14106                     clean = false;
14107                   } else if (v) {
14108                     activeStream.lineStart();
14109                     activeStream.point(x, y);
14110                     clean = false;
14111                   }
14112                 }
14113               }
14114               x_ = x, y_ = y, v_ = v;
14115             }
14116
14117             return clipStream;
14118           };
14119         }
14120
14121         function extent$1() {
14122           var x0 = 0,
14123               y0 = 0,
14124               x1 = 960,
14125               y1 = 500,
14126               cache,
14127               cacheStream,
14128               clip;
14129
14130           return clip = {
14131             stream: function(stream) {
14132               return cache && cacheStream === stream ? cache : cache = clipRectangle(x0, y0, x1, y1)(cacheStream = stream);
14133             },
14134             extent: function(_) {
14135               return arguments.length ? (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1], cache = cacheStream = null, clip) : [[x0, y0], [x1, y1]];
14136             }
14137           };
14138         }
14139
14140         var lengthSum = adder(),
14141             lambda0$2,
14142             sinPhi0$1,
14143             cosPhi0$1;
14144
14145         var lengthStream = {
14146           sphere: noop$4,
14147           point: noop$4,
14148           lineStart: lengthLineStart,
14149           lineEnd: noop$4,
14150           polygonStart: noop$4,
14151           polygonEnd: noop$4
14152         };
14153
14154         function lengthLineStart() {
14155           lengthStream.point = lengthPointFirst;
14156           lengthStream.lineEnd = lengthLineEnd;
14157         }
14158
14159         function lengthLineEnd() {
14160           lengthStream.point = lengthStream.lineEnd = noop$4;
14161         }
14162
14163         function lengthPointFirst(lambda, phi) {
14164           lambda *= radians, phi *= radians;
14165           lambda0$2 = lambda, sinPhi0$1 = sin$1(phi), cosPhi0$1 = cos$1(phi);
14166           lengthStream.point = lengthPoint;
14167         }
14168
14169         function lengthPoint(lambda, phi) {
14170           lambda *= radians, phi *= radians;
14171           var sinPhi = sin$1(phi),
14172               cosPhi = cos$1(phi),
14173               delta = abs$2(lambda - lambda0$2),
14174               cosDelta = cos$1(delta),
14175               sinDelta = sin$1(delta),
14176               x = cosPhi * sinDelta,
14177               y = cosPhi0$1 * sinPhi - sinPhi0$1 * cosPhi * cosDelta,
14178               z = sinPhi0$1 * sinPhi + cosPhi0$1 * cosPhi * cosDelta;
14179           lengthSum.add(atan2(sqrt(x * x + y * y), z));
14180           lambda0$2 = lambda, sinPhi0$1 = sinPhi, cosPhi0$1 = cosPhi;
14181         }
14182
14183         function d3_geoLength(object) {
14184           lengthSum.reset();
14185           d3_geoStream(object, lengthStream);
14186           return +lengthSum;
14187         }
14188
14189         var coordinates = [null, null],
14190             object$1 = {type: "LineString", coordinates: coordinates};
14191
14192         function distance(a, b) {
14193           coordinates[0] = a;
14194           coordinates[1] = b;
14195           return d3_geoLength(object$1);
14196         }
14197
14198         var containsObjectType = {
14199           Feature: function(object, point) {
14200             return containsGeometry(object.geometry, point);
14201           },
14202           FeatureCollection: function(object, point) {
14203             var features = object.features, i = -1, n = features.length;
14204             while (++i < n) if (containsGeometry(features[i].geometry, point)) return true;
14205             return false;
14206           }
14207         };
14208
14209         var containsGeometryType = {
14210           Sphere: function() {
14211             return true;
14212           },
14213           Point: function(object, point) {
14214             return containsPoint(object.coordinates, point);
14215           },
14216           MultiPoint: function(object, point) {
14217             var coordinates = object.coordinates, i = -1, n = coordinates.length;
14218             while (++i < n) if (containsPoint(coordinates[i], point)) return true;
14219             return false;
14220           },
14221           LineString: function(object, point) {
14222             return containsLine(object.coordinates, point);
14223           },
14224           MultiLineString: function(object, point) {
14225             var coordinates = object.coordinates, i = -1, n = coordinates.length;
14226             while (++i < n) if (containsLine(coordinates[i], point)) return true;
14227             return false;
14228           },
14229           Polygon: function(object, point) {
14230             return containsPolygon(object.coordinates, point);
14231           },
14232           MultiPolygon: function(object, point) {
14233             var coordinates = object.coordinates, i = -1, n = coordinates.length;
14234             while (++i < n) if (containsPolygon(coordinates[i], point)) return true;
14235             return false;
14236           },
14237           GeometryCollection: function(object, point) {
14238             var geometries = object.geometries, i = -1, n = geometries.length;
14239             while (++i < n) if (containsGeometry(geometries[i], point)) return true;
14240             return false;
14241           }
14242         };
14243
14244         function containsGeometry(geometry, point) {
14245           return geometry && containsGeometryType.hasOwnProperty(geometry.type)
14246               ? containsGeometryType[geometry.type](geometry, point)
14247               : false;
14248         }
14249
14250         function containsPoint(coordinates, point) {
14251           return distance(coordinates, point) === 0;
14252         }
14253
14254         function containsLine(coordinates, point) {
14255           var ab = distance(coordinates[0], coordinates[1]),
14256               ao = distance(coordinates[0], point),
14257               ob = distance(point, coordinates[1]);
14258           return ao + ob <= ab + epsilon$2;
14259         }
14260
14261         function containsPolygon(coordinates, point) {
14262           return !!polygonContains(coordinates.map(ringRadians), pointRadians(point));
14263         }
14264
14265         function ringRadians(ring) {
14266           return ring = ring.map(pointRadians), ring.pop(), ring;
14267         }
14268
14269         function pointRadians(point) {
14270           return [point[0] * radians, point[1] * radians];
14271         }
14272
14273         function contains$2(object, point) {
14274           return (object && containsObjectType.hasOwnProperty(object.type)
14275               ? containsObjectType[object.type]
14276               : containsGeometry)(object, point);
14277         }
14278
14279         function graticuleX(y0, y1, dy) {
14280           var y = d3_range(y0, y1 - epsilon$2, dy).concat(y1);
14281           return function(x) { return y.map(function(y) { return [x, y]; }); };
14282         }
14283
14284         function graticuleY(x0, x1, dx) {
14285           var x = d3_range(x0, x1 - epsilon$2, dx).concat(x1);
14286           return function(y) { return x.map(function(x) { return [x, y]; }); };
14287         }
14288
14289         function graticule() {
14290           var x1, x0, X1, X0,
14291               y1, y0, Y1, Y0,
14292               dx = 10, dy = dx, DX = 90, DY = 360,
14293               x, y, X, Y,
14294               precision = 2.5;
14295
14296           function graticule() {
14297             return {type: "MultiLineString", coordinates: lines()};
14298           }
14299
14300           function lines() {
14301             return d3_range(ceil(X0 / DX) * DX, X1, DX).map(X)
14302                 .concat(d3_range(ceil(Y0 / DY) * DY, Y1, DY).map(Y))
14303                 .concat(d3_range(ceil(x0 / dx) * dx, x1, dx).filter(function(x) { return abs$2(x % DX) > epsilon$2; }).map(x))
14304                 .concat(d3_range(ceil(y0 / dy) * dy, y1, dy).filter(function(y) { return abs$2(y % DY) > epsilon$2; }).map(y));
14305           }
14306
14307           graticule.lines = function() {
14308             return lines().map(function(coordinates) { return {type: "LineString", coordinates: coordinates}; });
14309           };
14310
14311           graticule.outline = function() {
14312             return {
14313               type: "Polygon",
14314               coordinates: [
14315                 X(X0).concat(
14316                 Y(Y1).slice(1),
14317                 X(X1).reverse().slice(1),
14318                 Y(Y0).reverse().slice(1))
14319               ]
14320             };
14321           };
14322
14323           graticule.extent = function(_) {
14324             if (!arguments.length) return graticule.extentMinor();
14325             return graticule.extentMajor(_).extentMinor(_);
14326           };
14327
14328           graticule.extentMajor = function(_) {
14329             if (!arguments.length) return [[X0, Y0], [X1, Y1]];
14330             X0 = +_[0][0], X1 = +_[1][0];
14331             Y0 = +_[0][1], Y1 = +_[1][1];
14332             if (X0 > X1) _ = X0, X0 = X1, X1 = _;
14333             if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _;
14334             return graticule.precision(precision);
14335           };
14336
14337           graticule.extentMinor = function(_) {
14338             if (!arguments.length) return [[x0, y0], [x1, y1]];
14339             x0 = +_[0][0], x1 = +_[1][0];
14340             y0 = +_[0][1], y1 = +_[1][1];
14341             if (x0 > x1) _ = x0, x0 = x1, x1 = _;
14342             if (y0 > y1) _ = y0, y0 = y1, y1 = _;
14343             return graticule.precision(precision);
14344           };
14345
14346           graticule.step = function(_) {
14347             if (!arguments.length) return graticule.stepMinor();
14348             return graticule.stepMajor(_).stepMinor(_);
14349           };
14350
14351           graticule.stepMajor = function(_) {
14352             if (!arguments.length) return [DX, DY];
14353             DX = +_[0], DY = +_[1];
14354             return graticule;
14355           };
14356
14357           graticule.stepMinor = function(_) {
14358             if (!arguments.length) return [dx, dy];
14359             dx = +_[0], dy = +_[1];
14360             return graticule;
14361           };
14362
14363           graticule.precision = function(_) {
14364             if (!arguments.length) return precision;
14365             precision = +_;
14366             x = graticuleX(y0, y1, 90);
14367             y = graticuleY(x0, x1, precision);
14368             X = graticuleX(Y0, Y1, 90);
14369             Y = graticuleY(X0, X1, precision);
14370             return graticule;
14371           };
14372
14373           return graticule
14374               .extentMajor([[-180, -90 + epsilon$2], [180, 90 - epsilon$2]])
14375               .extentMinor([[-180, -80 - epsilon$2], [180, 80 + epsilon$2]]);
14376         }
14377
14378         function graticule10() {
14379           return graticule()();
14380         }
14381
14382         function interpolate$1(a, b) {
14383           var x0 = a[0] * radians,
14384               y0 = a[1] * radians,
14385               x1 = b[0] * radians,
14386               y1 = b[1] * radians,
14387               cy0 = cos$1(y0),
14388               sy0 = sin$1(y0),
14389               cy1 = cos$1(y1),
14390               sy1 = sin$1(y1),
14391               kx0 = cy0 * cos$1(x0),
14392               ky0 = cy0 * sin$1(x0),
14393               kx1 = cy1 * cos$1(x1),
14394               ky1 = cy1 * sin$1(x1),
14395               d = 2 * asin(sqrt(haversin(y1 - y0) + cy0 * cy1 * haversin(x1 - x0))),
14396               k = sin$1(d);
14397
14398           var interpolate = d ? function(t) {
14399             var B = sin$1(t *= d) / k,
14400                 A = sin$1(d - t) / k,
14401                 x = A * kx0 + B * kx1,
14402                 y = A * ky0 + B * ky1,
14403                 z = A * sy0 + B * sy1;
14404             return [
14405               atan2(y, x) * degrees$1,
14406               atan2(z, sqrt(x * x + y * y)) * degrees$1
14407             ];
14408           } : function() {
14409             return [x0 * degrees$1, y0 * degrees$1];
14410           };
14411
14412           interpolate.distance = d;
14413
14414           return interpolate;
14415         }
14416
14417         function identity$4(x) {
14418           return x;
14419         }
14420
14421         var areaSum$1 = adder(),
14422             areaRingSum$1 = adder(),
14423             x00,
14424             y00,
14425             x0$1,
14426             y0$1;
14427
14428         var areaStream$1 = {
14429           point: noop$4,
14430           lineStart: noop$4,
14431           lineEnd: noop$4,
14432           polygonStart: function() {
14433             areaStream$1.lineStart = areaRingStart$1;
14434             areaStream$1.lineEnd = areaRingEnd$1;
14435           },
14436           polygonEnd: function() {
14437             areaStream$1.lineStart = areaStream$1.lineEnd = areaStream$1.point = noop$4;
14438             areaSum$1.add(abs$2(areaRingSum$1));
14439             areaRingSum$1.reset();
14440           },
14441           result: function() {
14442             var area = areaSum$1 / 2;
14443             areaSum$1.reset();
14444             return area;
14445           }
14446         };
14447
14448         function areaRingStart$1() {
14449           areaStream$1.point = areaPointFirst$1;
14450         }
14451
14452         function areaPointFirst$1(x, y) {
14453           areaStream$1.point = areaPoint$1;
14454           x00 = x0$1 = x, y00 = y0$1 = y;
14455         }
14456
14457         function areaPoint$1(x, y) {
14458           areaRingSum$1.add(y0$1 * x - x0$1 * y);
14459           x0$1 = x, y0$1 = y;
14460         }
14461
14462         function areaRingEnd$1() {
14463           areaPoint$1(x00, y00);
14464         }
14465
14466         var x0$2 = Infinity,
14467             y0$2 = x0$2,
14468             x1 = -x0$2,
14469             y1 = x1;
14470
14471         var boundsStream$1 = {
14472           point: boundsPoint$1,
14473           lineStart: noop$4,
14474           lineEnd: noop$4,
14475           polygonStart: noop$4,
14476           polygonEnd: noop$4,
14477           result: function() {
14478             var bounds = [[x0$2, y0$2], [x1, y1]];
14479             x1 = y1 = -(y0$2 = x0$2 = Infinity);
14480             return bounds;
14481           }
14482         };
14483
14484         function boundsPoint$1(x, y) {
14485           if (x < x0$2) x0$2 = x;
14486           if (x > x1) x1 = x;
14487           if (y < y0$2) y0$2 = y;
14488           if (y > y1) y1 = y;
14489         }
14490
14491         // TODO Enforce positive area for exterior, negative area for interior?
14492
14493         var X0$1 = 0,
14494             Y0$1 = 0,
14495             Z0$1 = 0,
14496             X1$1 = 0,
14497             Y1$1 = 0,
14498             Z1$1 = 0,
14499             X2$1 = 0,
14500             Y2$1 = 0,
14501             Z2$1 = 0,
14502             x00$1,
14503             y00$1,
14504             x0$3,
14505             y0$3;
14506
14507         var centroidStream$1 = {
14508           point: centroidPoint$1,
14509           lineStart: centroidLineStart$1,
14510           lineEnd: centroidLineEnd$1,
14511           polygonStart: function() {
14512             centroidStream$1.lineStart = centroidRingStart$1;
14513             centroidStream$1.lineEnd = centroidRingEnd$1;
14514           },
14515           polygonEnd: function() {
14516             centroidStream$1.point = centroidPoint$1;
14517             centroidStream$1.lineStart = centroidLineStart$1;
14518             centroidStream$1.lineEnd = centroidLineEnd$1;
14519           },
14520           result: function() {
14521             var centroid = Z2$1 ? [X2$1 / Z2$1, Y2$1 / Z2$1]
14522                 : Z1$1 ? [X1$1 / Z1$1, Y1$1 / Z1$1]
14523                 : Z0$1 ? [X0$1 / Z0$1, Y0$1 / Z0$1]
14524                 : [NaN, NaN];
14525             X0$1 = Y0$1 = Z0$1 =
14526             X1$1 = Y1$1 = Z1$1 =
14527             X2$1 = Y2$1 = Z2$1 = 0;
14528             return centroid;
14529           }
14530         };
14531
14532         function centroidPoint$1(x, y) {
14533           X0$1 += x;
14534           Y0$1 += y;
14535           ++Z0$1;
14536         }
14537
14538         function centroidLineStart$1() {
14539           centroidStream$1.point = centroidPointFirstLine;
14540         }
14541
14542         function centroidPointFirstLine(x, y) {
14543           centroidStream$1.point = centroidPointLine;
14544           centroidPoint$1(x0$3 = x, y0$3 = y);
14545         }
14546
14547         function centroidPointLine(x, y) {
14548           var dx = x - x0$3, dy = y - y0$3, z = sqrt(dx * dx + dy * dy);
14549           X1$1 += z * (x0$3 + x) / 2;
14550           Y1$1 += z * (y0$3 + y) / 2;
14551           Z1$1 += z;
14552           centroidPoint$1(x0$3 = x, y0$3 = y);
14553         }
14554
14555         function centroidLineEnd$1() {
14556           centroidStream$1.point = centroidPoint$1;
14557         }
14558
14559         function centroidRingStart$1() {
14560           centroidStream$1.point = centroidPointFirstRing;
14561         }
14562
14563         function centroidRingEnd$1() {
14564           centroidPointRing(x00$1, y00$1);
14565         }
14566
14567         function centroidPointFirstRing(x, y) {
14568           centroidStream$1.point = centroidPointRing;
14569           centroidPoint$1(x00$1 = x0$3 = x, y00$1 = y0$3 = y);
14570         }
14571
14572         function centroidPointRing(x, y) {
14573           var dx = x - x0$3,
14574               dy = y - y0$3,
14575               z = sqrt(dx * dx + dy * dy);
14576
14577           X1$1 += z * (x0$3 + x) / 2;
14578           Y1$1 += z * (y0$3 + y) / 2;
14579           Z1$1 += z;
14580
14581           z = y0$3 * x - x0$3 * y;
14582           X2$1 += z * (x0$3 + x);
14583           Y2$1 += z * (y0$3 + y);
14584           Z2$1 += z * 3;
14585           centroidPoint$1(x0$3 = x, y0$3 = y);
14586         }
14587
14588         function PathContext(context) {
14589           this._context = context;
14590         }
14591
14592         PathContext.prototype = {
14593           _radius: 4.5,
14594           pointRadius: function(_) {
14595             return this._radius = _, this;
14596           },
14597           polygonStart: function() {
14598             this._line = 0;
14599           },
14600           polygonEnd: function() {
14601             this._line = NaN;
14602           },
14603           lineStart: function() {
14604             this._point = 0;
14605           },
14606           lineEnd: function() {
14607             if (this._line === 0) this._context.closePath();
14608             this._point = NaN;
14609           },
14610           point: function(x, y) {
14611             switch (this._point) {
14612               case 0: {
14613                 this._context.moveTo(x, y);
14614                 this._point = 1;
14615                 break;
14616               }
14617               case 1: {
14618                 this._context.lineTo(x, y);
14619                 break;
14620               }
14621               default: {
14622                 this._context.moveTo(x + this._radius, y);
14623                 this._context.arc(x, y, this._radius, 0, tau$3);
14624                 break;
14625               }
14626             }
14627           },
14628           result: noop$4
14629         };
14630
14631         var lengthSum$1 = adder(),
14632             lengthRing,
14633             x00$2,
14634             y00$2,
14635             x0$4,
14636             y0$4;
14637
14638         var lengthStream$1 = {
14639           point: noop$4,
14640           lineStart: function() {
14641             lengthStream$1.point = lengthPointFirst$1;
14642           },
14643           lineEnd: function() {
14644             if (lengthRing) lengthPoint$1(x00$2, y00$2);
14645             lengthStream$1.point = noop$4;
14646           },
14647           polygonStart: function() {
14648             lengthRing = true;
14649           },
14650           polygonEnd: function() {
14651             lengthRing = null;
14652           },
14653           result: function() {
14654             var length = +lengthSum$1;
14655             lengthSum$1.reset();
14656             return length;
14657           }
14658         };
14659
14660         function lengthPointFirst$1(x, y) {
14661           lengthStream$1.point = lengthPoint$1;
14662           x00$2 = x0$4 = x, y00$2 = y0$4 = y;
14663         }
14664
14665         function lengthPoint$1(x, y) {
14666           x0$4 -= x, y0$4 -= y;
14667           lengthSum$1.add(sqrt(x0$4 * x0$4 + y0$4 * y0$4));
14668           x0$4 = x, y0$4 = y;
14669         }
14670
14671         function PathString() {
14672           this._string = [];
14673         }
14674
14675         PathString.prototype = {
14676           _radius: 4.5,
14677           _circle: circle$1(4.5),
14678           pointRadius: function(_) {
14679             if ((_ = +_) !== this._radius) this._radius = _, this._circle = null;
14680             return this;
14681           },
14682           polygonStart: function() {
14683             this._line = 0;
14684           },
14685           polygonEnd: function() {
14686             this._line = NaN;
14687           },
14688           lineStart: function() {
14689             this._point = 0;
14690           },
14691           lineEnd: function() {
14692             if (this._line === 0) this._string.push("Z");
14693             this._point = NaN;
14694           },
14695           point: function(x, y) {
14696             switch (this._point) {
14697               case 0: {
14698                 this._string.push("M", x, ",", y);
14699                 this._point = 1;
14700                 break;
14701               }
14702               case 1: {
14703                 this._string.push("L", x, ",", y);
14704                 break;
14705               }
14706               default: {
14707                 if (this._circle == null) this._circle = circle$1(this._radius);
14708                 this._string.push("M", x, ",", y, this._circle);
14709                 break;
14710               }
14711             }
14712           },
14713           result: function() {
14714             if (this._string.length) {
14715               var result = this._string.join("");
14716               this._string = [];
14717               return result;
14718             } else {
14719               return null;
14720             }
14721           }
14722         };
14723
14724         function circle$1(radius) {
14725           return "m0," + radius
14726               + "a" + radius + "," + radius + " 0 1,1 0," + -2 * radius
14727               + "a" + radius + "," + radius + " 0 1,1 0," + 2 * radius
14728               + "z";
14729         }
14730
14731         function d3_geoPath(projection, context) {
14732           var pointRadius = 4.5,
14733               projectionStream,
14734               contextStream;
14735
14736           function path(object) {
14737             if (object) {
14738               if (typeof pointRadius === "function") contextStream.pointRadius(+pointRadius.apply(this, arguments));
14739               d3_geoStream(object, projectionStream(contextStream));
14740             }
14741             return contextStream.result();
14742           }
14743
14744           path.area = function(object) {
14745             d3_geoStream(object, projectionStream(areaStream$1));
14746             return areaStream$1.result();
14747           };
14748
14749           path.measure = function(object) {
14750             d3_geoStream(object, projectionStream(lengthStream$1));
14751             return lengthStream$1.result();
14752           };
14753
14754           path.bounds = function(object) {
14755             d3_geoStream(object, projectionStream(boundsStream$1));
14756             return boundsStream$1.result();
14757           };
14758
14759           path.centroid = function(object) {
14760             d3_geoStream(object, projectionStream(centroidStream$1));
14761             return centroidStream$1.result();
14762           };
14763
14764           path.projection = function(_) {
14765             return arguments.length ? (projectionStream = _ == null ? (projection = null, identity$4) : (projection = _).stream, path) : projection;
14766           };
14767
14768           path.context = function(_) {
14769             if (!arguments.length) return context;
14770             contextStream = _ == null ? (context = null, new PathString) : new PathContext(context = _);
14771             if (typeof pointRadius !== "function") contextStream.pointRadius(pointRadius);
14772             return path;
14773           };
14774
14775           path.pointRadius = function(_) {
14776             if (!arguments.length) return pointRadius;
14777             pointRadius = typeof _ === "function" ? _ : (contextStream.pointRadius(+_), +_);
14778             return path;
14779           };
14780
14781           return path.projection(projection).context(context);
14782         }
14783
14784         function d3_geoTransform(methods) {
14785           return {
14786             stream: transformer(methods)
14787           };
14788         }
14789
14790         function transformer(methods) {
14791           return function(stream) {
14792             var s = new TransformStream;
14793             for (var key in methods) s[key] = methods[key];
14794             s.stream = stream;
14795             return s;
14796           };
14797         }
14798
14799         function TransformStream() {}
14800
14801         TransformStream.prototype = {
14802           constructor: TransformStream,
14803           point: function(x, y) { this.stream.point(x, y); },
14804           sphere: function() { this.stream.sphere(); },
14805           lineStart: function() { this.stream.lineStart(); },
14806           lineEnd: function() { this.stream.lineEnd(); },
14807           polygonStart: function() { this.stream.polygonStart(); },
14808           polygonEnd: function() { this.stream.polygonEnd(); }
14809         };
14810
14811         function fit(projection, fitBounds, object) {
14812           var clip = projection.clipExtent && projection.clipExtent();
14813           projection.scale(150).translate([0, 0]);
14814           if (clip != null) projection.clipExtent(null);
14815           d3_geoStream(object, projection.stream(boundsStream$1));
14816           fitBounds(boundsStream$1.result());
14817           if (clip != null) projection.clipExtent(clip);
14818           return projection;
14819         }
14820
14821         function fitExtent(projection, extent, object) {
14822           return fit(projection, function(b) {
14823             var w = extent[1][0] - extent[0][0],
14824                 h = extent[1][1] - extent[0][1],
14825                 k = Math.min(w / (b[1][0] - b[0][0]), h / (b[1][1] - b[0][1])),
14826                 x = +extent[0][0] + (w - k * (b[1][0] + b[0][0])) / 2,
14827                 y = +extent[0][1] + (h - k * (b[1][1] + b[0][1])) / 2;
14828             projection.scale(150 * k).translate([x, y]);
14829           }, object);
14830         }
14831
14832         function fitSize(projection, size, object) {
14833           return fitExtent(projection, [[0, 0], size], object);
14834         }
14835
14836         function fitWidth(projection, width, object) {
14837           return fit(projection, function(b) {
14838             var w = +width,
14839                 k = w / (b[1][0] - b[0][0]),
14840                 x = (w - k * (b[1][0] + b[0][0])) / 2,
14841                 y = -k * b[0][1];
14842             projection.scale(150 * k).translate([x, y]);
14843           }, object);
14844         }
14845
14846         function fitHeight(projection, height, object) {
14847           return fit(projection, function(b) {
14848             var h = +height,
14849                 k = h / (b[1][1] - b[0][1]),
14850                 x = -k * b[0][0],
14851                 y = (h - k * (b[1][1] + b[0][1])) / 2;
14852             projection.scale(150 * k).translate([x, y]);
14853           }, object);
14854         }
14855
14856         var maxDepth = 16, // maximum depth of subdivision
14857             cosMinDistance = cos$1(30 * radians); // cos(minimum angular distance)
14858
14859         function resample(project, delta2) {
14860           return +delta2 ? resample$1(project, delta2) : resampleNone(project);
14861         }
14862
14863         function resampleNone(project) {
14864           return transformer({
14865             point: function(x, y) {
14866               x = project(x, y);
14867               this.stream.point(x[0], x[1]);
14868             }
14869           });
14870         }
14871
14872         function resample$1(project, delta2) {
14873
14874           function resampleLineTo(x0, y0, lambda0, a0, b0, c0, x1, y1, lambda1, a1, b1, c1, depth, stream) {
14875             var dx = x1 - x0,
14876                 dy = y1 - y0,
14877                 d2 = dx * dx + dy * dy;
14878             if (d2 > 4 * delta2 && depth--) {
14879               var a = a0 + a1,
14880                   b = b0 + b1,
14881                   c = c0 + c1,
14882                   m = sqrt(a * a + b * b + c * c),
14883                   phi2 = asin(c /= m),
14884                   lambda2 = abs$2(abs$2(c) - 1) < epsilon$2 || abs$2(lambda0 - lambda1) < epsilon$2 ? (lambda0 + lambda1) / 2 : atan2(b, a),
14885                   p = project(lambda2, phi2),
14886                   x2 = p[0],
14887                   y2 = p[1],
14888                   dx2 = x2 - x0,
14889                   dy2 = y2 - y0,
14890                   dz = dy * dx2 - dx * dy2;
14891               if (dz * dz / d2 > delta2 // perpendicular projected distance
14892                   || abs$2((dx * dx2 + dy * dy2) / d2 - 0.5) > 0.3 // midpoint close to an end
14893                   || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) { // angular distance
14894                 resampleLineTo(x0, y0, lambda0, a0, b0, c0, x2, y2, lambda2, a /= m, b /= m, c, depth, stream);
14895                 stream.point(x2, y2);
14896                 resampleLineTo(x2, y2, lambda2, a, b, c, x1, y1, lambda1, a1, b1, c1, depth, stream);
14897               }
14898             }
14899           }
14900           return function(stream) {
14901             var lambda00, x00, y00, a00, b00, c00, // first point
14902                 lambda0, x0, y0, a0, b0, c0; // previous point
14903
14904             var resampleStream = {
14905               point: point,
14906               lineStart: lineStart,
14907               lineEnd: lineEnd,
14908               polygonStart: function() { stream.polygonStart(); resampleStream.lineStart = ringStart; },
14909               polygonEnd: function() { stream.polygonEnd(); resampleStream.lineStart = lineStart; }
14910             };
14911
14912             function point(x, y) {
14913               x = project(x, y);
14914               stream.point(x[0], x[1]);
14915             }
14916
14917             function lineStart() {
14918               x0 = NaN;
14919               resampleStream.point = linePoint;
14920               stream.lineStart();
14921             }
14922
14923             function linePoint(lambda, phi) {
14924               var c = cartesian([lambda, phi]), p = project(lambda, phi);
14925               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);
14926               stream.point(x0, y0);
14927             }
14928
14929             function lineEnd() {
14930               resampleStream.point = point;
14931               stream.lineEnd();
14932             }
14933
14934             function ringStart() {
14935               lineStart();
14936               resampleStream.point = ringPoint;
14937               resampleStream.lineEnd = ringEnd;
14938             }
14939
14940             function ringPoint(lambda, phi) {
14941               linePoint(lambda00 = lambda, phi), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0;
14942               resampleStream.point = linePoint;
14943             }
14944
14945             function ringEnd() {
14946               resampleLineTo(x0, y0, lambda0, a0, b0, c0, x00, y00, lambda00, a00, b00, c00, maxDepth, stream);
14947               resampleStream.lineEnd = lineEnd;
14948               lineEnd();
14949             }
14950
14951             return resampleStream;
14952           };
14953         }
14954
14955         var transformRadians = transformer({
14956           point: function(x, y) {
14957             this.stream.point(x * radians, y * radians);
14958           }
14959         });
14960
14961         function transformRotate(rotate) {
14962           return transformer({
14963             point: function(x, y) {
14964               var r = rotate(x, y);
14965               return this.stream.point(r[0], r[1]);
14966             }
14967           });
14968         }
14969
14970         function scaleTranslate(k, dx, dy) {
14971           function transform(x, y) {
14972             return [dx + k * x, dy - k * y];
14973           }
14974           transform.invert = function(x, y) {
14975             return [(x - dx) / k, (dy - y) / k];
14976           };
14977           return transform;
14978         }
14979
14980         function scaleTranslateRotate(k, dx, dy, alpha) {
14981           var cosAlpha = cos$1(alpha),
14982               sinAlpha = sin$1(alpha),
14983               a = cosAlpha * k,
14984               b = sinAlpha * k,
14985               ai = cosAlpha / k,
14986               bi = sinAlpha / k,
14987               ci = (sinAlpha * dy - cosAlpha * dx) / k,
14988               fi = (sinAlpha * dx + cosAlpha * dy) / k;
14989           function transform(x, y) {
14990             return [a * x - b * y + dx, dy - b * x - a * y];
14991           }
14992           transform.invert = function(x, y) {
14993             return [ai * x - bi * y + ci, fi - bi * x - ai * y];
14994           };
14995           return transform;
14996         }
14997
14998         function projection(project) {
14999           return projectionMutator(function() { return project; })();
15000         }
15001
15002         function projectionMutator(projectAt) {
15003           var project,
15004               k = 150, // scale
15005               x = 480, y = 250, // translate
15006               lambda = 0, phi = 0, // center
15007               deltaLambda = 0, deltaPhi = 0, deltaGamma = 0, rotate, // pre-rotate
15008               alpha = 0, // post-rotate
15009               theta = null, preclip = clipAntimeridian, // pre-clip angle
15010               x0 = null, y0, x1, y1, postclip = identity$4, // post-clip extent
15011               delta2 = 0.5, // precision
15012               projectResample,
15013               projectTransform,
15014               projectRotateTransform,
15015               cache,
15016               cacheStream;
15017
15018           function projection(point) {
15019             return projectRotateTransform(point[0] * radians, point[1] * radians);
15020           }
15021
15022           function invert(point) {
15023             point = projectRotateTransform.invert(point[0], point[1]);
15024             return point && [point[0] * degrees$1, point[1] * degrees$1];
15025           }
15026
15027           projection.stream = function(stream) {
15028             return cache && cacheStream === stream ? cache : cache = transformRadians(transformRotate(rotate)(preclip(projectResample(postclip(cacheStream = stream)))));
15029           };
15030
15031           projection.preclip = function(_) {
15032             return arguments.length ? (preclip = _, theta = undefined, reset()) : preclip;
15033           };
15034
15035           projection.postclip = function(_) {
15036             return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;
15037           };
15038
15039           projection.clipAngle = function(_) {
15040             return arguments.length ? (preclip = +_ ? clipCircle(theta = _ * radians) : (theta = null, clipAntimeridian), reset()) : theta * degrees$1;
15041           };
15042
15043           projection.clipExtent = function(_) {
15044             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]];
15045           };
15046
15047           projection.scale = function(_) {
15048             return arguments.length ? (k = +_, recenter()) : k;
15049           };
15050
15051           projection.translate = function(_) {
15052             return arguments.length ? (x = +_[0], y = +_[1], recenter()) : [x, y];
15053           };
15054
15055           projection.center = function(_) {
15056             return arguments.length ? (lambda = _[0] % 360 * radians, phi = _[1] % 360 * radians, recenter()) : [lambda * degrees$1, phi * degrees$1];
15057           };
15058
15059           projection.rotate = function(_) {
15060             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];
15061           };
15062
15063           projection.angle = function(_) {
15064             return arguments.length ? (alpha = _ % 360 * radians, recenter()) : alpha * degrees$1;
15065           };
15066
15067           projection.precision = function(_) {
15068             return arguments.length ? (projectResample = resample(projectTransform, delta2 = _ * _), reset()) : sqrt(delta2);
15069           };
15070
15071           projection.fitExtent = function(extent, object) {
15072             return fitExtent(projection, extent, object);
15073           };
15074
15075           projection.fitSize = function(size, object) {
15076             return fitSize(projection, size, object);
15077           };
15078
15079           projection.fitWidth = function(width, object) {
15080             return fitWidth(projection, width, object);
15081           };
15082
15083           projection.fitHeight = function(height, object) {
15084             return fitHeight(projection, height, object);
15085           };
15086
15087           function recenter() {
15088             var center = scaleTranslateRotate(k, 0, 0, alpha).apply(null, project(lambda, phi)),
15089                 transform = (alpha ? scaleTranslateRotate : scaleTranslate)(k, x - center[0], y - center[1], alpha);
15090             rotate = rotateRadians(deltaLambda, deltaPhi, deltaGamma);
15091             projectTransform = compose(project, transform);
15092             projectRotateTransform = compose(rotate, projectTransform);
15093             projectResample = resample(projectTransform, delta2);
15094             return reset();
15095           }
15096
15097           function reset() {
15098             cache = cacheStream = null;
15099             return projection;
15100           }
15101
15102           return function() {
15103             project = projectAt.apply(this, arguments);
15104             projection.invert = project.invert && invert;
15105             return recenter();
15106           };
15107         }
15108
15109         function conicProjection(projectAt) {
15110           var phi0 = 0,
15111               phi1 = pi$3 / 3,
15112               m = projectionMutator(projectAt),
15113               p = m(phi0, phi1);
15114
15115           p.parallels = function(_) {
15116             return arguments.length ? m(phi0 = _[0] * radians, phi1 = _[1] * radians) : [phi0 * degrees$1, phi1 * degrees$1];
15117           };
15118
15119           return p;
15120         }
15121
15122         function cylindricalEqualAreaRaw(phi0) {
15123           var cosPhi0 = cos$1(phi0);
15124
15125           function forward(lambda, phi) {
15126             return [lambda * cosPhi0, sin$1(phi) / cosPhi0];
15127           }
15128
15129           forward.invert = function(x, y) {
15130             return [x / cosPhi0, asin(y * cosPhi0)];
15131           };
15132
15133           return forward;
15134         }
15135
15136         function conicEqualAreaRaw(y0, y1) {
15137           var sy0 = sin$1(y0), n = (sy0 + sin$1(y1)) / 2;
15138
15139           // Are the parallels symmetrical around the Equator?
15140           if (abs$2(n) < epsilon$2) return cylindricalEqualAreaRaw(y0);
15141
15142           var c = 1 + sy0 * (2 * n - sy0), r0 = sqrt(c) / n;
15143
15144           function project(x, y) {
15145             var r = sqrt(c - 2 * n * sin$1(y)) / n;
15146             return [r * sin$1(x *= n), r0 - r * cos$1(x)];
15147           }
15148
15149           project.invert = function(x, y) {
15150             var r0y = r0 - y;
15151             return [atan2(x, abs$2(r0y)) / n * sign$2(r0y), asin((c - (x * x + r0y * r0y) * n * n) / (2 * n))];
15152           };
15153
15154           return project;
15155         }
15156
15157         function conicEqualArea() {
15158           return conicProjection(conicEqualAreaRaw)
15159               .scale(155.424)
15160               .center([0, 33.6442]);
15161         }
15162
15163         function albers() {
15164           return conicEqualArea()
15165               .parallels([29.5, 45.5])
15166               .scale(1070)
15167               .translate([480, 250])
15168               .rotate([96, 0])
15169               .center([-0.6, 38.7]);
15170         }
15171
15172         // The projections must have mutually exclusive clip regions on the sphere,
15173         // as this will avoid emitting interleaving lines and polygons.
15174         function multiplex(streams) {
15175           var n = streams.length;
15176           return {
15177             point: function(x, y) { var i = -1; while (++i < n) streams[i].point(x, y); },
15178             sphere: function() { var i = -1; while (++i < n) streams[i].sphere(); },
15179             lineStart: function() { var i = -1; while (++i < n) streams[i].lineStart(); },
15180             lineEnd: function() { var i = -1; while (++i < n) streams[i].lineEnd(); },
15181             polygonStart: function() { var i = -1; while (++i < n) streams[i].polygonStart(); },
15182             polygonEnd: function() { var i = -1; while (++i < n) streams[i].polygonEnd(); }
15183           };
15184         }
15185
15186         // A composite projection for the United States, configured by default for
15187         // 960×500. The projection also works quite well at 960×600 if you change the
15188         // scale to 1285 and adjust the translate accordingly. The set of standard
15189         // parallels for each region comes from USGS, which is published here:
15190         // http://egsc.usgs.gov/isb/pubs/MapProjections/projections.html#albers
15191         function albersUsa() {
15192           var cache,
15193               cacheStream,
15194               lower48 = albers(), lower48Point,
15195               alaska = conicEqualArea().rotate([154, 0]).center([-2, 58.5]).parallels([55, 65]), alaskaPoint, // EPSG:3338
15196               hawaii = conicEqualArea().rotate([157, 0]).center([-3, 19.9]).parallels([8, 18]), hawaiiPoint, // ESRI:102007
15197               point, pointStream = {point: function(x, y) { point = [x, y]; }};
15198
15199           function albersUsa(coordinates) {
15200             var x = coordinates[0], y = coordinates[1];
15201             return point = null,
15202                 (lower48Point.point(x, y), point)
15203                 || (alaskaPoint.point(x, y), point)
15204                 || (hawaiiPoint.point(x, y), point);
15205           }
15206
15207           albersUsa.invert = function(coordinates) {
15208             var k = lower48.scale(),
15209                 t = lower48.translate(),
15210                 x = (coordinates[0] - t[0]) / k,
15211                 y = (coordinates[1] - t[1]) / k;
15212             return (y >= 0.120 && y < 0.234 && x >= -0.425 && x < -0.214 ? alaska
15213                 : y >= 0.166 && y < 0.234 && x >= -0.214 && x < -0.115 ? hawaii
15214                 : lower48).invert(coordinates);
15215           };
15216
15217           albersUsa.stream = function(stream) {
15218             return cache && cacheStream === stream ? cache : cache = multiplex([lower48.stream(cacheStream = stream), alaska.stream(stream), hawaii.stream(stream)]);
15219           };
15220
15221           albersUsa.precision = function(_) {
15222             if (!arguments.length) return lower48.precision();
15223             lower48.precision(_), alaska.precision(_), hawaii.precision(_);
15224             return reset();
15225           };
15226
15227           albersUsa.scale = function(_) {
15228             if (!arguments.length) return lower48.scale();
15229             lower48.scale(_), alaska.scale(_ * 0.35), hawaii.scale(_);
15230             return albersUsa.translate(lower48.translate());
15231           };
15232
15233           albersUsa.translate = function(_) {
15234             if (!arguments.length) return lower48.translate();
15235             var k = lower48.scale(), x = +_[0], y = +_[1];
15236
15237             lower48Point = lower48
15238                 .translate(_)
15239                 .clipExtent([[x - 0.455 * k, y - 0.238 * k], [x + 0.455 * k, y + 0.238 * k]])
15240                 .stream(pointStream);
15241
15242             alaskaPoint = alaska
15243                 .translate([x - 0.307 * k, y + 0.201 * k])
15244                 .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]])
15245                 .stream(pointStream);
15246
15247             hawaiiPoint = hawaii
15248                 .translate([x - 0.205 * k, y + 0.212 * k])
15249                 .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]])
15250                 .stream(pointStream);
15251
15252             return reset();
15253           };
15254
15255           albersUsa.fitExtent = function(extent, object) {
15256             return fitExtent(albersUsa, extent, object);
15257           };
15258
15259           albersUsa.fitSize = function(size, object) {
15260             return fitSize(albersUsa, size, object);
15261           };
15262
15263           albersUsa.fitWidth = function(width, object) {
15264             return fitWidth(albersUsa, width, object);
15265           };
15266
15267           albersUsa.fitHeight = function(height, object) {
15268             return fitHeight(albersUsa, height, object);
15269           };
15270
15271           function reset() {
15272             cache = cacheStream = null;
15273             return albersUsa;
15274           }
15275
15276           return albersUsa.scale(1070);
15277         }
15278
15279         function azimuthalRaw(scale) {
15280           return function(x, y) {
15281             var cx = cos$1(x),
15282                 cy = cos$1(y),
15283                 k = scale(cx * cy);
15284             return [
15285               k * cy * sin$1(x),
15286               k * sin$1(y)
15287             ];
15288           }
15289         }
15290
15291         function azimuthalInvert(angle) {
15292           return function(x, y) {
15293             var z = sqrt(x * x + y * y),
15294                 c = angle(z),
15295                 sc = sin$1(c),
15296                 cc = cos$1(c);
15297             return [
15298               atan2(x * sc, z * cc),
15299               asin(z && y * sc / z)
15300             ];
15301           }
15302         }
15303
15304         var azimuthalEqualAreaRaw = azimuthalRaw(function(cxcy) {
15305           return sqrt(2 / (1 + cxcy));
15306         });
15307
15308         azimuthalEqualAreaRaw.invert = azimuthalInvert(function(z) {
15309           return 2 * asin(z / 2);
15310         });
15311
15312         function azimuthalEqualArea() {
15313           return projection(azimuthalEqualAreaRaw)
15314               .scale(124.75)
15315               .clipAngle(180 - 1e-3);
15316         }
15317
15318         var azimuthalEquidistantRaw = azimuthalRaw(function(c) {
15319           return (c = acos(c)) && c / sin$1(c);
15320         });
15321
15322         azimuthalEquidistantRaw.invert = azimuthalInvert(function(z) {
15323           return z;
15324         });
15325
15326         function azimuthalEquidistant() {
15327           return projection(azimuthalEquidistantRaw)
15328               .scale(79.4188)
15329               .clipAngle(180 - 1e-3);
15330         }
15331
15332         function mercatorRaw(lambda, phi) {
15333           return [lambda, log(tan((halfPi$2 + phi) / 2))];
15334         }
15335
15336         mercatorRaw.invert = function(x, y) {
15337           return [x, 2 * atan(exp(y)) - halfPi$2];
15338         };
15339
15340         function mercator() {
15341           return mercatorProjection(mercatorRaw)
15342               .scale(961 / tau$3);
15343         }
15344
15345         function mercatorProjection(project) {
15346           var m = projection(project),
15347               center = m.center,
15348               scale = m.scale,
15349               translate = m.translate,
15350               clipExtent = m.clipExtent,
15351               x0 = null, y0, x1, y1; // clip extent
15352
15353           m.scale = function(_) {
15354             return arguments.length ? (scale(_), reclip()) : scale();
15355           };
15356
15357           m.translate = function(_) {
15358             return arguments.length ? (translate(_), reclip()) : translate();
15359           };
15360
15361           m.center = function(_) {
15362             return arguments.length ? (center(_), reclip()) : center();
15363           };
15364
15365           m.clipExtent = function(_) {
15366             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]];
15367           };
15368
15369           function reclip() {
15370             var k = pi$3 * scale(),
15371                 t = m(rotation(m.rotate()).invert([0, 0]));
15372             return clipExtent(x0 == null
15373                 ? [[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]] : project === mercatorRaw
15374                 ? [[Math.max(t[0] - k, x0), y0], [Math.min(t[0] + k, x1), y1]]
15375                 : [[x0, Math.max(t[1] - k, y0)], [x1, Math.min(t[1] + k, y1)]]);
15376           }
15377
15378           return reclip();
15379         }
15380
15381         function tany(y) {
15382           return tan((halfPi$2 + y) / 2);
15383         }
15384
15385         function conicConformalRaw(y0, y1) {
15386           var cy0 = cos$1(y0),
15387               n = y0 === y1 ? sin$1(y0) : log(cy0 / cos$1(y1)) / log(tany(y1) / tany(y0)),
15388               f = cy0 * pow(tany(y0), n) / n;
15389
15390           if (!n) return mercatorRaw;
15391
15392           function project(x, y) {
15393             if (f > 0) { if (y < -halfPi$2 + epsilon$2) y = -halfPi$2 + epsilon$2; }
15394             else { if (y > halfPi$2 - epsilon$2) y = halfPi$2 - epsilon$2; }
15395             var r = f / pow(tany(y), n);
15396             return [r * sin$1(n * x), f - r * cos$1(n * x)];
15397           }
15398
15399           project.invert = function(x, y) {
15400             var fy = f - y, r = sign$2(n) * sqrt(x * x + fy * fy);
15401             return [atan2(x, abs$2(fy)) / n * sign$2(fy), 2 * atan(pow(f / r, 1 / n)) - halfPi$2];
15402           };
15403
15404           return project;
15405         }
15406
15407         function conicConformal() {
15408           return conicProjection(conicConformalRaw)
15409               .scale(109.5)
15410               .parallels([30, 30]);
15411         }
15412
15413         function equirectangularRaw(lambda, phi) {
15414           return [lambda, phi];
15415         }
15416
15417         equirectangularRaw.invert = equirectangularRaw;
15418
15419         function equirectangular() {
15420           return projection(equirectangularRaw)
15421               .scale(152.63);
15422         }
15423
15424         function conicEquidistantRaw(y0, y1) {
15425           var cy0 = cos$1(y0),
15426               n = y0 === y1 ? sin$1(y0) : (cy0 - cos$1(y1)) / (y1 - y0),
15427               g = cy0 / n + y0;
15428
15429           if (abs$2(n) < epsilon$2) return equirectangularRaw;
15430
15431           function project(x, y) {
15432             var gy = g - y, nx = n * x;
15433             return [gy * sin$1(nx), g - gy * cos$1(nx)];
15434           }
15435
15436           project.invert = function(x, y) {
15437             var gy = g - y;
15438             return [atan2(x, abs$2(gy)) / n * sign$2(gy), g - sign$2(n) * sqrt(x * x + gy * gy)];
15439           };
15440
15441           return project;
15442         }
15443
15444         function conicEquidistant() {
15445           return conicProjection(conicEquidistantRaw)
15446               .scale(131.154)
15447               .center([0, 13.9389]);
15448         }
15449
15450         var A1 = 1.340264,
15451             A2 = -0.081106,
15452             A3 = 0.000893,
15453             A4 = 0.003796,
15454             M = sqrt(3) / 2,
15455             iterations = 12;
15456
15457         function equalEarthRaw(lambda, phi) {
15458           var l = asin(M * sin$1(phi)), l2 = l * l, l6 = l2 * l2 * l2;
15459           return [
15460             lambda * cos$1(l) / (M * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2))),
15461             l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2))
15462           ];
15463         }
15464
15465         equalEarthRaw.invert = function(x, y) {
15466           var l = y, l2 = l * l, l6 = l2 * l2 * l2;
15467           for (var i = 0, delta, fy, fpy; i < iterations; ++i) {
15468             fy = l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2)) - y;
15469             fpy = A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2);
15470             l -= delta = fy / fpy, l2 = l * l, l6 = l2 * l2 * l2;
15471             if (abs$2(delta) < epsilon2$1) break;
15472           }
15473           return [
15474             M * x * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2)) / cos$1(l),
15475             asin(sin$1(l) / M)
15476           ];
15477         };
15478
15479         function equalEarth() {
15480           return projection(equalEarthRaw)
15481               .scale(177.158);
15482         }
15483
15484         function gnomonicRaw(x, y) {
15485           var cy = cos$1(y), k = cos$1(x) * cy;
15486           return [cy * sin$1(x) / k, sin$1(y) / k];
15487         }
15488
15489         gnomonicRaw.invert = azimuthalInvert(atan);
15490
15491         function gnomonic() {
15492           return projection(gnomonicRaw)
15493               .scale(144.049)
15494               .clipAngle(60);
15495         }
15496
15497         function scaleTranslate$1(kx, ky, tx, ty) {
15498           return kx === 1 && ky === 1 && tx === 0 && ty === 0 ? identity$4 : transformer({
15499             point: function(x, y) {
15500               this.stream.point(x * kx + tx, y * ky + ty);
15501             }
15502           });
15503         }
15504
15505         function d3_geoIdentity() {
15506           var k = 1, tx = 0, ty = 0, sx = 1, sy = 1, transform = identity$4, // scale, translate and reflect
15507               x0 = null, y0, x1, y1, // clip extent
15508               postclip = identity$4,
15509               cache,
15510               cacheStream,
15511               projection;
15512
15513           function reset() {
15514             cache = cacheStream = null;
15515             return projection;
15516           }
15517
15518           return projection = {
15519             stream: function(stream) {
15520               return cache && cacheStream === stream ? cache : cache = transform(postclip(cacheStream = stream));
15521             },
15522             postclip: function(_) {
15523               return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;
15524             },
15525             clipExtent: function(_) {
15526               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]];
15527             },
15528             scale: function(_) {
15529               return arguments.length ? (transform = scaleTranslate$1((k = +_) * sx, k * sy, tx, ty), reset()) : k;
15530             },
15531             translate: function(_) {
15532               return arguments.length ? (transform = scaleTranslate$1(k * sx, k * sy, tx = +_[0], ty = +_[1]), reset()) : [tx, ty];
15533             },
15534             reflectX: function(_) {
15535               return arguments.length ? (transform = scaleTranslate$1(k * (sx = _ ? -1 : 1), k * sy, tx, ty), reset()) : sx < 0;
15536             },
15537             reflectY: function(_) {
15538               return arguments.length ? (transform = scaleTranslate$1(k * sx, k * (sy = _ ? -1 : 1), tx, ty), reset()) : sy < 0;
15539             },
15540             fitExtent: function(extent, object) {
15541               return fitExtent(projection, extent, object);
15542             },
15543             fitSize: function(size, object) {
15544               return fitSize(projection, size, object);
15545             },
15546             fitWidth: function(width, object) {
15547               return fitWidth(projection, width, object);
15548             },
15549             fitHeight: function(height, object) {
15550               return fitHeight(projection, height, object);
15551             }
15552           };
15553         }
15554
15555         function naturalEarth1Raw(lambda, phi) {
15556           var phi2 = phi * phi, phi4 = phi2 * phi2;
15557           return [
15558             lambda * (0.8707 - 0.131979 * phi2 + phi4 * (-0.013791 + phi4 * (0.003971 * phi2 - 0.001529 * phi4))),
15559             phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4)))
15560           ];
15561         }
15562
15563         naturalEarth1Raw.invert = function(x, y) {
15564           var phi = y, i = 25, delta;
15565           do {
15566             var phi2 = phi * phi, phi4 = phi2 * phi2;
15567             phi -= delta = (phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4))) - y) /
15568                 (1.007226 + phi2 * (0.015085 * 3 + phi4 * (-0.044475 * 7 + 0.028874 * 9 * phi2 - 0.005916 * 11 * phi4)));
15569           } while (abs$2(delta) > epsilon$2 && --i > 0);
15570           return [
15571             x / (0.8707 + (phi2 = phi * phi) * (-0.131979 + phi2 * (-0.013791 + phi2 * phi2 * phi2 * (0.003971 - 0.001529 * phi2)))),
15572             phi
15573           ];
15574         };
15575
15576         function naturalEarth1() {
15577           return projection(naturalEarth1Raw)
15578               .scale(175.295);
15579         }
15580
15581         function orthographicRaw(x, y) {
15582           return [cos$1(y) * sin$1(x), sin$1(y)];
15583         }
15584
15585         orthographicRaw.invert = azimuthalInvert(asin);
15586
15587         function orthographic() {
15588           return projection(orthographicRaw)
15589               .scale(249.5)
15590               .clipAngle(90 + epsilon$2);
15591         }
15592
15593         function stereographicRaw(x, y) {
15594           var cy = cos$1(y), k = 1 + cos$1(x) * cy;
15595           return [cy * sin$1(x) / k, sin$1(y) / k];
15596         }
15597
15598         stereographicRaw.invert = azimuthalInvert(function(z) {
15599           return 2 * atan(z);
15600         });
15601
15602         function stereographic() {
15603           return projection(stereographicRaw)
15604               .scale(250)
15605               .clipAngle(142);
15606         }
15607
15608         function transverseMercatorRaw(lambda, phi) {
15609           return [log(tan((halfPi$2 + phi) / 2)), -lambda];
15610         }
15611
15612         transverseMercatorRaw.invert = function(x, y) {
15613           return [-y, 2 * atan(exp(x)) - halfPi$2];
15614         };
15615
15616         function transverseMercator() {
15617           var m = mercatorProjection(transverseMercatorRaw),
15618               center = m.center,
15619               rotate = m.rotate;
15620
15621           m.center = function(_) {
15622             return arguments.length ? center([-_[1], _[0]]) : (_ = center(), [_[1], -_[0]]);
15623           };
15624
15625           m.rotate = function(_) {
15626             return arguments.length ? rotate([_[0], _[1], _.length > 2 ? _[2] + 90 : 90]) : (_ = rotate(), [_[0], _[1], _[2] - 90]);
15627           };
15628
15629           return rotate([0, 0, 90])
15630               .scale(159.155);
15631         }
15632
15633         function defaultSeparation(a, b) {
15634           return a.parent === b.parent ? 1 : 2;
15635         }
15636
15637         function meanX(children) {
15638           return children.reduce(meanXReduce, 0) / children.length;
15639         }
15640
15641         function meanXReduce(x, c) {
15642           return x + c.x;
15643         }
15644
15645         function maxY(children) {
15646           return 1 + children.reduce(maxYReduce, 0);
15647         }
15648
15649         function maxYReduce(y, c) {
15650           return Math.max(y, c.y);
15651         }
15652
15653         function leafLeft(node) {
15654           var children;
15655           while (children = node.children) node = children[0];
15656           return node;
15657         }
15658
15659         function leafRight(node) {
15660           var children;
15661           while (children = node.children) node = children[children.length - 1];
15662           return node;
15663         }
15664
15665         function cluster() {
15666           var separation = defaultSeparation,
15667               dx = 1,
15668               dy = 1,
15669               nodeSize = false;
15670
15671           function cluster(root) {
15672             var previousNode,
15673                 x = 0;
15674
15675             // First walk, computing the initial x & y values.
15676             root.eachAfter(function(node) {
15677               var children = node.children;
15678               if (children) {
15679                 node.x = meanX(children);
15680                 node.y = maxY(children);
15681               } else {
15682                 node.x = previousNode ? x += separation(node, previousNode) : 0;
15683                 node.y = 0;
15684                 previousNode = node;
15685               }
15686             });
15687
15688             var left = leafLeft(root),
15689                 right = leafRight(root),
15690                 x0 = left.x - separation(left, right) / 2,
15691                 x1 = right.x + separation(right, left) / 2;
15692
15693             // Second walk, normalizing x & y to the desired size.
15694             return root.eachAfter(nodeSize ? function(node) {
15695               node.x = (node.x - root.x) * dx;
15696               node.y = (root.y - node.y) * dy;
15697             } : function(node) {
15698               node.x = (node.x - x0) / (x1 - x0) * dx;
15699               node.y = (1 - (root.y ? node.y / root.y : 1)) * dy;
15700             });
15701           }
15702
15703           cluster.separation = function(x) {
15704             return arguments.length ? (separation = x, cluster) : separation;
15705           };
15706
15707           cluster.size = function(x) {
15708             return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? null : [dx, dy]);
15709           };
15710
15711           cluster.nodeSize = function(x) {
15712             return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? [dx, dy] : null);
15713           };
15714
15715           return cluster;
15716         }
15717
15718         function count(node) {
15719           var sum = 0,
15720               children = node.children,
15721               i = children && children.length;
15722           if (!i) sum = 1;
15723           else while (--i >= 0) sum += children[i].value;
15724           node.value = sum;
15725         }
15726
15727         function node_count() {
15728           return this.eachAfter(count);
15729         }
15730
15731         function node_each(callback) {
15732           var node = this, current, next = [node], children, i, n;
15733           do {
15734             current = next.reverse(), next = [];
15735             while (node = current.pop()) {
15736               callback(node), children = node.children;
15737               if (children) for (i = 0, n = children.length; i < n; ++i) {
15738                 next.push(children[i]);
15739               }
15740             }
15741           } while (next.length);
15742           return this;
15743         }
15744
15745         function node_eachBefore(callback) {
15746           var node = this, nodes = [node], children, i;
15747           while (node = nodes.pop()) {
15748             callback(node), children = node.children;
15749             if (children) for (i = children.length - 1; i >= 0; --i) {
15750               nodes.push(children[i]);
15751             }
15752           }
15753           return this;
15754         }
15755
15756         function node_eachAfter(callback) {
15757           var node = this, nodes = [node], next = [], children, i, n;
15758           while (node = nodes.pop()) {
15759             next.push(node), children = node.children;
15760             if (children) for (i = 0, n = children.length; i < n; ++i) {
15761               nodes.push(children[i]);
15762             }
15763           }
15764           while (node = next.pop()) {
15765             callback(node);
15766           }
15767           return this;
15768         }
15769
15770         function node_sum(value) {
15771           return this.eachAfter(function(node) {
15772             var sum = +value(node.data) || 0,
15773                 children = node.children,
15774                 i = children && children.length;
15775             while (--i >= 0) sum += children[i].value;
15776             node.value = sum;
15777           });
15778         }
15779
15780         function node_sort(compare) {
15781           return this.eachBefore(function(node) {
15782             if (node.children) {
15783               node.children.sort(compare);
15784             }
15785           });
15786         }
15787
15788         function node_path(end) {
15789           var start = this,
15790               ancestor = leastCommonAncestor(start, end),
15791               nodes = [start];
15792           while (start !== ancestor) {
15793             start = start.parent;
15794             nodes.push(start);
15795           }
15796           var k = nodes.length;
15797           while (end !== ancestor) {
15798             nodes.splice(k, 0, end);
15799             end = end.parent;
15800           }
15801           return nodes;
15802         }
15803
15804         function leastCommonAncestor(a, b) {
15805           if (a === b) return a;
15806           var aNodes = a.ancestors(),
15807               bNodes = b.ancestors(),
15808               c = null;
15809           a = aNodes.pop();
15810           b = bNodes.pop();
15811           while (a === b) {
15812             c = a;
15813             a = aNodes.pop();
15814             b = bNodes.pop();
15815           }
15816           return c;
15817         }
15818
15819         function node_ancestors() {
15820           var node = this, nodes = [node];
15821           while (node = node.parent) {
15822             nodes.push(node);
15823           }
15824           return nodes;
15825         }
15826
15827         function node_descendants() {
15828           var nodes = [];
15829           this.each(function(node) {
15830             nodes.push(node);
15831           });
15832           return nodes;
15833         }
15834
15835         function node_leaves() {
15836           var leaves = [];
15837           this.eachBefore(function(node) {
15838             if (!node.children) {
15839               leaves.push(node);
15840             }
15841           });
15842           return leaves;
15843         }
15844
15845         function node_links() {
15846           var root = this, links = [];
15847           root.each(function(node) {
15848             if (node !== root) { // Don’t include the root’s parent, if any.
15849               links.push({source: node.parent, target: node});
15850             }
15851           });
15852           return links;
15853         }
15854
15855         function hierarchy(data, children) {
15856           var root = new Node(data),
15857               valued = +data.value && (root.value = data.value),
15858               node,
15859               nodes = [root],
15860               child,
15861               childs,
15862               i,
15863               n;
15864
15865           if (children == null) children = defaultChildren;
15866
15867           while (node = nodes.pop()) {
15868             if (valued) node.value = +node.data.value;
15869             if ((childs = children(node.data)) && (n = childs.length)) {
15870               node.children = new Array(n);
15871               for (i = n - 1; i >= 0; --i) {
15872                 nodes.push(child = node.children[i] = new Node(childs[i]));
15873                 child.parent = node;
15874                 child.depth = node.depth + 1;
15875               }
15876             }
15877           }
15878
15879           return root.eachBefore(computeHeight);
15880         }
15881
15882         function node_copy() {
15883           return hierarchy(this).eachBefore(copyData);
15884         }
15885
15886         function defaultChildren(d) {
15887           return d.children;
15888         }
15889
15890         function copyData(node) {
15891           node.data = node.data.data;
15892         }
15893
15894         function computeHeight(node) {
15895           var height = 0;
15896           do node.height = height;
15897           while ((node = node.parent) && (node.height < ++height));
15898         }
15899
15900         function Node(data) {
15901           this.data = data;
15902           this.depth =
15903           this.height = 0;
15904           this.parent = null;
15905         }
15906
15907         Node.prototype = hierarchy.prototype = {
15908           constructor: Node,
15909           count: node_count,
15910           each: node_each,
15911           eachAfter: node_eachAfter,
15912           eachBefore: node_eachBefore,
15913           sum: node_sum,
15914           sort: node_sort,
15915           path: node_path,
15916           ancestors: node_ancestors,
15917           descendants: node_descendants,
15918           leaves: node_leaves,
15919           links: node_links,
15920           copy: node_copy
15921         };
15922
15923         var slice$8 = Array.prototype.slice;
15924
15925         function shuffle$1(array) {
15926           var m = array.length,
15927               t,
15928               i;
15929
15930           while (m) {
15931             i = Math.random() * m-- | 0;
15932             t = array[m];
15933             array[m] = array[i];
15934             array[i] = t;
15935           }
15936
15937           return array;
15938         }
15939
15940         function enclose(circles) {
15941           var i = 0, n = (circles = shuffle$1(slice$8.call(circles))).length, B = [], p, e;
15942
15943           while (i < n) {
15944             p = circles[i];
15945             if (e && enclosesWeak(e, p)) ++i;
15946             else e = encloseBasis(B = extendBasis(B, p)), i = 0;
15947           }
15948
15949           return e;
15950         }
15951
15952         function extendBasis(B, p) {
15953           var i, j;
15954
15955           if (enclosesWeakAll(p, B)) return [p];
15956
15957           // If we get here then B must have at least one element.
15958           for (i = 0; i < B.length; ++i) {
15959             if (enclosesNot(p, B[i])
15960                 && enclosesWeakAll(encloseBasis2(B[i], p), B)) {
15961               return [B[i], p];
15962             }
15963           }
15964
15965           // If we get here then B must have at least two elements.
15966           for (i = 0; i < B.length - 1; ++i) {
15967             for (j = i + 1; j < B.length; ++j) {
15968               if (enclosesNot(encloseBasis2(B[i], B[j]), p)
15969                   && enclosesNot(encloseBasis2(B[i], p), B[j])
15970                   && enclosesNot(encloseBasis2(B[j], p), B[i])
15971                   && enclosesWeakAll(encloseBasis3(B[i], B[j], p), B)) {
15972                 return [B[i], B[j], p];
15973               }
15974             }
15975           }
15976
15977           // If we get here then something is very wrong.
15978           throw new Error;
15979         }
15980
15981         function enclosesNot(a, b) {
15982           var dr = a.r - b.r, dx = b.x - a.x, dy = b.y - a.y;
15983           return dr < 0 || dr * dr < dx * dx + dy * dy;
15984         }
15985
15986         function enclosesWeak(a, b) {
15987           var dr = a.r - b.r + 1e-6, dx = b.x - a.x, dy = b.y - a.y;
15988           return dr > 0 && dr * dr > dx * dx + dy * dy;
15989         }
15990
15991         function enclosesWeakAll(a, B) {
15992           for (var i = 0; i < B.length; ++i) {
15993             if (!enclosesWeak(a, B[i])) {
15994               return false;
15995             }
15996           }
15997           return true;
15998         }
15999
16000         function encloseBasis(B) {
16001           switch (B.length) {
16002             case 1: return encloseBasis1(B[0]);
16003             case 2: return encloseBasis2(B[0], B[1]);
16004             case 3: return encloseBasis3(B[0], B[1], B[2]);
16005           }
16006         }
16007
16008         function encloseBasis1(a) {
16009           return {
16010             x: a.x,
16011             y: a.y,
16012             r: a.r
16013           };
16014         }
16015
16016         function encloseBasis2(a, b) {
16017           var x1 = a.x, y1 = a.y, r1 = a.r,
16018               x2 = b.x, y2 = b.y, r2 = b.r,
16019               x21 = x2 - x1, y21 = y2 - y1, r21 = r2 - r1,
16020               l = Math.sqrt(x21 * x21 + y21 * y21);
16021           return {
16022             x: (x1 + x2 + x21 / l * r21) / 2,
16023             y: (y1 + y2 + y21 / l * r21) / 2,
16024             r: (l + r1 + r2) / 2
16025           };
16026         }
16027
16028         function encloseBasis3(a, b, c) {
16029           var x1 = a.x, y1 = a.y, r1 = a.r,
16030               x2 = b.x, y2 = b.y, r2 = b.r,
16031               x3 = c.x, y3 = c.y, r3 = c.r,
16032               a2 = x1 - x2,
16033               a3 = x1 - x3,
16034               b2 = y1 - y2,
16035               b3 = y1 - y3,
16036               c2 = r2 - r1,
16037               c3 = r3 - r1,
16038               d1 = x1 * x1 + y1 * y1 - r1 * r1,
16039               d2 = d1 - x2 * x2 - y2 * y2 + r2 * r2,
16040               d3 = d1 - x3 * x3 - y3 * y3 + r3 * r3,
16041               ab = a3 * b2 - a2 * b3,
16042               xa = (b2 * d3 - b3 * d2) / (ab * 2) - x1,
16043               xb = (b3 * c2 - b2 * c3) / ab,
16044               ya = (a3 * d2 - a2 * d3) / (ab * 2) - y1,
16045               yb = (a2 * c3 - a3 * c2) / ab,
16046               A = xb * xb + yb * yb - 1,
16047               B = 2 * (r1 + xa * xb + ya * yb),
16048               C = xa * xa + ya * ya - r1 * r1,
16049               r = -(A ? (B + Math.sqrt(B * B - 4 * A * C)) / (2 * A) : C / B);
16050           return {
16051             x: x1 + xa + xb * r,
16052             y: y1 + ya + yb * r,
16053             r: r
16054           };
16055         }
16056
16057         function place(b, a, c) {
16058           var dx = b.x - a.x, x, a2,
16059               dy = b.y - a.y, y, b2,
16060               d2 = dx * dx + dy * dy;
16061           if (d2) {
16062             a2 = a.r + c.r, a2 *= a2;
16063             b2 = b.r + c.r, b2 *= b2;
16064             if (a2 > b2) {
16065               x = (d2 + b2 - a2) / (2 * d2);
16066               y = Math.sqrt(Math.max(0, b2 / d2 - x * x));
16067               c.x = b.x - x * dx - y * dy;
16068               c.y = b.y - x * dy + y * dx;
16069             } else {
16070               x = (d2 + a2 - b2) / (2 * d2);
16071               y = Math.sqrt(Math.max(0, a2 / d2 - x * x));
16072               c.x = a.x + x * dx - y * dy;
16073               c.y = a.y + x * dy + y * dx;
16074             }
16075           } else {
16076             c.x = a.x + c.r;
16077             c.y = a.y;
16078           }
16079         }
16080
16081         function intersects(a, b) {
16082           var dr = a.r + b.r - 1e-6, dx = b.x - a.x, dy = b.y - a.y;
16083           return dr > 0 && dr * dr > dx * dx + dy * dy;
16084         }
16085
16086         function score(node) {
16087           var a = node._,
16088               b = node.next._,
16089               ab = a.r + b.r,
16090               dx = (a.x * b.r + b.x * a.r) / ab,
16091               dy = (a.y * b.r + b.y * a.r) / ab;
16092           return dx * dx + dy * dy;
16093         }
16094
16095         function Node$1(circle) {
16096           this._ = circle;
16097           this.next = null;
16098           this.previous = null;
16099         }
16100
16101         function packEnclose(circles) {
16102           if (!(n = circles.length)) return 0;
16103
16104           var a, b, c, n, aa, ca, i, j, k, sj, sk;
16105
16106           // Place the first circle.
16107           a = circles[0], a.x = 0, a.y = 0;
16108           if (!(n > 1)) return a.r;
16109
16110           // Place the second circle.
16111           b = circles[1], a.x = -b.r, b.x = a.r, b.y = 0;
16112           if (!(n > 2)) return a.r + b.r;
16113
16114           // Place the third circle.
16115           place(b, a, c = circles[2]);
16116
16117           // Initialize the front-chain using the first three circles a, b and c.
16118           a = new Node$1(a), b = new Node$1(b), c = new Node$1(c);
16119           a.next = c.previous = b;
16120           b.next = a.previous = c;
16121           c.next = b.previous = a;
16122
16123           // Attempt to place each remaining circle…
16124           pack: for (i = 3; i < n; ++i) {
16125             place(a._, b._, c = circles[i]), c = new Node$1(c);
16126
16127             // Find the closest intersecting circle on the front-chain, if any.
16128             // “Closeness” is determined by linear distance along the front-chain.
16129             // “Ahead” or “behind” is likewise determined by linear distance.
16130             j = b.next, k = a.previous, sj = b._.r, sk = a._.r;
16131             do {
16132               if (sj <= sk) {
16133                 if (intersects(j._, c._)) {
16134                   b = j, a.next = b, b.previous = a, --i;
16135                   continue pack;
16136                 }
16137                 sj += j._.r, j = j.next;
16138               } else {
16139                 if (intersects(k._, c._)) {
16140                   a = k, a.next = b, b.previous = a, --i;
16141                   continue pack;
16142                 }
16143                 sk += k._.r, k = k.previous;
16144               }
16145             } while (j !== k.next);
16146
16147             // Success! Insert the new circle c between a and b.
16148             c.previous = a, c.next = b, a.next = b.previous = b = c;
16149
16150             // Compute the new closest circle pair to the centroid.
16151             aa = score(a);
16152             while ((c = c.next) !== b) {
16153               if ((ca = score(c)) < aa) {
16154                 a = c, aa = ca;
16155               }
16156             }
16157             b = a.next;
16158           }
16159
16160           // Compute the enclosing circle of the front chain.
16161           a = [b._], c = b; while ((c = c.next) !== b) a.push(c._); c = enclose(a);
16162
16163           // Translate the circles to put the enclosing circle around the origin.
16164           for (i = 0; i < n; ++i) a = circles[i], a.x -= c.x, a.y -= c.y;
16165
16166           return c.r;
16167         }
16168
16169         function siblings(circles) {
16170           packEnclose(circles);
16171           return circles;
16172         }
16173
16174         function optional(f) {
16175           return f == null ? null : required(f);
16176         }
16177
16178         function required(f) {
16179           if (typeof f !== "function") throw new Error;
16180           return f;
16181         }
16182
16183         function constantZero() {
16184           return 0;
16185         }
16186
16187         function constant$9(x) {
16188           return function() {
16189             return x;
16190           };
16191         }
16192
16193         function defaultRadius$1(d) {
16194           return Math.sqrt(d.value);
16195         }
16196
16197         function index$1() {
16198           var radius = null,
16199               dx = 1,
16200               dy = 1,
16201               padding = constantZero;
16202
16203           function pack(root) {
16204             root.x = dx / 2, root.y = dy / 2;
16205             if (radius) {
16206               root.eachBefore(radiusLeaf(radius))
16207                   .eachAfter(packChildren(padding, 0.5))
16208                   .eachBefore(translateChild(1));
16209             } else {
16210               root.eachBefore(radiusLeaf(defaultRadius$1))
16211                   .eachAfter(packChildren(constantZero, 1))
16212                   .eachAfter(packChildren(padding, root.r / Math.min(dx, dy)))
16213                   .eachBefore(translateChild(Math.min(dx, dy) / (2 * root.r)));
16214             }
16215             return root;
16216           }
16217
16218           pack.radius = function(x) {
16219             return arguments.length ? (radius = optional(x), pack) : radius;
16220           };
16221
16222           pack.size = function(x) {
16223             return arguments.length ? (dx = +x[0], dy = +x[1], pack) : [dx, dy];
16224           };
16225
16226           pack.padding = function(x) {
16227             return arguments.length ? (padding = typeof x === "function" ? x : constant$9(+x), pack) : padding;
16228           };
16229
16230           return pack;
16231         }
16232
16233         function radiusLeaf(radius) {
16234           return function(node) {
16235             if (!node.children) {
16236               node.r = Math.max(0, +radius(node) || 0);
16237             }
16238           };
16239         }
16240
16241         function packChildren(padding, k) {
16242           return function(node) {
16243             if (children = node.children) {
16244               var children,
16245                   i,
16246                   n = children.length,
16247                   r = padding(node) * k || 0,
16248                   e;
16249
16250               if (r) for (i = 0; i < n; ++i) children[i].r += r;
16251               e = packEnclose(children);
16252               if (r) for (i = 0; i < n; ++i) children[i].r -= r;
16253               node.r = e + r;
16254             }
16255           };
16256         }
16257
16258         function translateChild(k) {
16259           return function(node) {
16260             var parent = node.parent;
16261             node.r *= k;
16262             if (parent) {
16263               node.x = parent.x + k * node.x;
16264               node.y = parent.y + k * node.y;
16265             }
16266           };
16267         }
16268
16269         function roundNode(node) {
16270           node.x0 = Math.round(node.x0);
16271           node.y0 = Math.round(node.y0);
16272           node.x1 = Math.round(node.x1);
16273           node.y1 = Math.round(node.y1);
16274         }
16275
16276         function treemapDice(parent, x0, y0, x1, y1) {
16277           var nodes = parent.children,
16278               node,
16279               i = -1,
16280               n = nodes.length,
16281               k = parent.value && (x1 - x0) / parent.value;
16282
16283           while (++i < n) {
16284             node = nodes[i], node.y0 = y0, node.y1 = y1;
16285             node.x0 = x0, node.x1 = x0 += node.value * k;
16286           }
16287         }
16288
16289         function partition() {
16290           var dx = 1,
16291               dy = 1,
16292               padding = 0,
16293               round = false;
16294
16295           function partition(root) {
16296             var n = root.height + 1;
16297             root.x0 =
16298             root.y0 = padding;
16299             root.x1 = dx;
16300             root.y1 = dy / n;
16301             root.eachBefore(positionNode(dy, n));
16302             if (round) root.eachBefore(roundNode);
16303             return root;
16304           }
16305
16306           function positionNode(dy, n) {
16307             return function(node) {
16308               if (node.children) {
16309                 treemapDice(node, node.x0, dy * (node.depth + 1) / n, node.x1, dy * (node.depth + 2) / n);
16310               }
16311               var x0 = node.x0,
16312                   y0 = node.y0,
16313                   x1 = node.x1 - padding,
16314                   y1 = node.y1 - padding;
16315               if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
16316               if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
16317               node.x0 = x0;
16318               node.y0 = y0;
16319               node.x1 = x1;
16320               node.y1 = y1;
16321             };
16322           }
16323
16324           partition.round = function(x) {
16325             return arguments.length ? (round = !!x, partition) : round;
16326           };
16327
16328           partition.size = function(x) {
16329             return arguments.length ? (dx = +x[0], dy = +x[1], partition) : [dx, dy];
16330           };
16331
16332           partition.padding = function(x) {
16333             return arguments.length ? (padding = +x, partition) : padding;
16334           };
16335
16336           return partition;
16337         }
16338
16339         var keyPrefix$1 = "$", // Protect against keys like “__proto__”.
16340             preroot = {depth: -1},
16341             ambiguous = {};
16342
16343         function defaultId(d) {
16344           return d.id;
16345         }
16346
16347         function defaultParentId(d) {
16348           return d.parentId;
16349         }
16350
16351         function stratify() {
16352           var id = defaultId,
16353               parentId = defaultParentId;
16354
16355           function stratify(data) {
16356             var d,
16357                 i,
16358                 n = data.length,
16359                 root,
16360                 parent,
16361                 node,
16362                 nodes = new Array(n),
16363                 nodeId,
16364                 nodeKey,
16365                 nodeByKey = {};
16366
16367             for (i = 0; i < n; ++i) {
16368               d = data[i], node = nodes[i] = new Node(d);
16369               if ((nodeId = id(d, i, data)) != null && (nodeId += "")) {
16370                 nodeKey = keyPrefix$1 + (node.id = nodeId);
16371                 nodeByKey[nodeKey] = nodeKey in nodeByKey ? ambiguous : node;
16372               }
16373             }
16374
16375             for (i = 0; i < n; ++i) {
16376               node = nodes[i], nodeId = parentId(data[i], i, data);
16377               if (nodeId == null || !(nodeId += "")) {
16378                 if (root) throw new Error("multiple roots");
16379                 root = node;
16380               } else {
16381                 parent = nodeByKey[keyPrefix$1 + nodeId];
16382                 if (!parent) throw new Error("missing: " + nodeId);
16383                 if (parent === ambiguous) throw new Error("ambiguous: " + nodeId);
16384                 if (parent.children) parent.children.push(node);
16385                 else parent.children = [node];
16386                 node.parent = parent;
16387               }
16388             }
16389
16390             if (!root) throw new Error("no root");
16391             root.parent = preroot;
16392             root.eachBefore(function(node) { node.depth = node.parent.depth + 1; --n; }).eachBefore(computeHeight);
16393             root.parent = null;
16394             if (n > 0) throw new Error("cycle");
16395
16396             return root;
16397           }
16398
16399           stratify.id = function(x) {
16400             return arguments.length ? (id = required(x), stratify) : id;
16401           };
16402
16403           stratify.parentId = function(x) {
16404             return arguments.length ? (parentId = required(x), stratify) : parentId;
16405           };
16406
16407           return stratify;
16408         }
16409
16410         function defaultSeparation$1(a, b) {
16411           return a.parent === b.parent ? 1 : 2;
16412         }
16413
16414         // function radialSeparation(a, b) {
16415         //   return (a.parent === b.parent ? 1 : 2) / a.depth;
16416         // }
16417
16418         // This function is used to traverse the left contour of a subtree (or
16419         // subforest). It returns the successor of v on this contour. This successor is
16420         // either given by the leftmost child of v or by the thread of v. The function
16421         // returns null if and only if v is on the highest level of its subtree.
16422         function nextLeft(v) {
16423           var children = v.children;
16424           return children ? children[0] : v.t;
16425         }
16426
16427         // This function works analogously to nextLeft.
16428         function nextRight(v) {
16429           var children = v.children;
16430           return children ? children[children.length - 1] : v.t;
16431         }
16432
16433         // Shifts the current subtree rooted at w+. This is done by increasing
16434         // prelim(w+) and mod(w+) by shift.
16435         function moveSubtree(wm, wp, shift) {
16436           var change = shift / (wp.i - wm.i);
16437           wp.c -= change;
16438           wp.s += shift;
16439           wm.c += change;
16440           wp.z += shift;
16441           wp.m += shift;
16442         }
16443
16444         // All other shifts, applied to the smaller subtrees between w- and w+, are
16445         // performed by this function. To prepare the shifts, we have to adjust
16446         // change(w+), shift(w+), and change(w-).
16447         function executeShifts(v) {
16448           var shift = 0,
16449               change = 0,
16450               children = v.children,
16451               i = children.length,
16452               w;
16453           while (--i >= 0) {
16454             w = children[i];
16455             w.z += shift;
16456             w.m += shift;
16457             shift += w.s + (change += w.c);
16458           }
16459         }
16460
16461         // If vi-’s ancestor is a sibling of v, returns vi-’s ancestor. Otherwise,
16462         // returns the specified (default) ancestor.
16463         function nextAncestor(vim, v, ancestor) {
16464           return vim.a.parent === v.parent ? vim.a : ancestor;
16465         }
16466
16467         function TreeNode(node, i) {
16468           this._ = node;
16469           this.parent = null;
16470           this.children = null;
16471           this.A = null; // default ancestor
16472           this.a = this; // ancestor
16473           this.z = 0; // prelim
16474           this.m = 0; // mod
16475           this.c = 0; // change
16476           this.s = 0; // shift
16477           this.t = null; // thread
16478           this.i = i; // number
16479         }
16480
16481         TreeNode.prototype = Object.create(Node.prototype);
16482
16483         function treeRoot(root) {
16484           var tree = new TreeNode(root, 0),
16485               node,
16486               nodes = [tree],
16487               child,
16488               children,
16489               i,
16490               n;
16491
16492           while (node = nodes.pop()) {
16493             if (children = node._.children) {
16494               node.children = new Array(n = children.length);
16495               for (i = n - 1; i >= 0; --i) {
16496                 nodes.push(child = node.children[i] = new TreeNode(children[i], i));
16497                 child.parent = node;
16498               }
16499             }
16500           }
16501
16502           (tree.parent = new TreeNode(null, 0)).children = [tree];
16503           return tree;
16504         }
16505
16506         // Node-link tree diagram using the Reingold-Tilford "tidy" algorithm
16507         function tree() {
16508           var separation = defaultSeparation$1,
16509               dx = 1,
16510               dy = 1,
16511               nodeSize = null;
16512
16513           function tree(root) {
16514             var t = treeRoot(root);
16515
16516             // Compute the layout using Buchheim et al.’s algorithm.
16517             t.eachAfter(firstWalk), t.parent.m = -t.z;
16518             t.eachBefore(secondWalk);
16519
16520             // If a fixed node size is specified, scale x and y.
16521             if (nodeSize) root.eachBefore(sizeNode);
16522
16523             // If a fixed tree size is specified, scale x and y based on the extent.
16524             // Compute the left-most, right-most, and depth-most nodes for extents.
16525             else {
16526               var left = root,
16527                   right = root,
16528                   bottom = root;
16529               root.eachBefore(function(node) {
16530                 if (node.x < left.x) left = node;
16531                 if (node.x > right.x) right = node;
16532                 if (node.depth > bottom.depth) bottom = node;
16533               });
16534               var s = left === right ? 1 : separation(left, right) / 2,
16535                   tx = s - left.x,
16536                   kx = dx / (right.x + s + tx),
16537                   ky = dy / (bottom.depth || 1);
16538               root.eachBefore(function(node) {
16539                 node.x = (node.x + tx) * kx;
16540                 node.y = node.depth * ky;
16541               });
16542             }
16543
16544             return root;
16545           }
16546
16547           // Computes a preliminary x-coordinate for v. Before that, FIRST WALK is
16548           // applied recursively to the children of v, as well as the function
16549           // APPORTION. After spacing out the children by calling EXECUTE SHIFTS, the
16550           // node v is placed to the midpoint of its outermost children.
16551           function firstWalk(v) {
16552             var children = v.children,
16553                 siblings = v.parent.children,
16554                 w = v.i ? siblings[v.i - 1] : null;
16555             if (children) {
16556               executeShifts(v);
16557               var midpoint = (children[0].z + children[children.length - 1].z) / 2;
16558               if (w) {
16559                 v.z = w.z + separation(v._, w._);
16560                 v.m = v.z - midpoint;
16561               } else {
16562                 v.z = midpoint;
16563               }
16564             } else if (w) {
16565               v.z = w.z + separation(v._, w._);
16566             }
16567             v.parent.A = apportion(v, w, v.parent.A || siblings[0]);
16568           }
16569
16570           // Computes all real x-coordinates by summing up the modifiers recursively.
16571           function secondWalk(v) {
16572             v._.x = v.z + v.parent.m;
16573             v.m += v.parent.m;
16574           }
16575
16576           // The core of the algorithm. Here, a new subtree is combined with the
16577           // previous subtrees. Threads are used to traverse the inside and outside
16578           // contours of the left and right subtree up to the highest common level. The
16579           // vertices used for the traversals are vi+, vi-, vo-, and vo+, where the
16580           // superscript o means outside and i means inside, the subscript - means left
16581           // subtree and + means right subtree. For summing up the modifiers along the
16582           // contour, we use respective variables si+, si-, so-, and so+. Whenever two
16583           // nodes of the inside contours conflict, we compute the left one of the
16584           // greatest uncommon ancestors using the function ANCESTOR and call MOVE
16585           // SUBTREE to shift the subtree and prepare the shifts of smaller subtrees.
16586           // Finally, we add a new thread (if necessary).
16587           function apportion(v, w, ancestor) {
16588             if (w) {
16589               var vip = v,
16590                   vop = v,
16591                   vim = w,
16592                   vom = vip.parent.children[0],
16593                   sip = vip.m,
16594                   sop = vop.m,
16595                   sim = vim.m,
16596                   som = vom.m,
16597                   shift;
16598               while (vim = nextRight(vim), vip = nextLeft(vip), vim && vip) {
16599                 vom = nextLeft(vom);
16600                 vop = nextRight(vop);
16601                 vop.a = v;
16602                 shift = vim.z + sim - vip.z - sip + separation(vim._, vip._);
16603                 if (shift > 0) {
16604                   moveSubtree(nextAncestor(vim, v, ancestor), v, shift);
16605                   sip += shift;
16606                   sop += shift;
16607                 }
16608                 sim += vim.m;
16609                 sip += vip.m;
16610                 som += vom.m;
16611                 sop += vop.m;
16612               }
16613               if (vim && !nextRight(vop)) {
16614                 vop.t = vim;
16615                 vop.m += sim - sop;
16616               }
16617               if (vip && !nextLeft(vom)) {
16618                 vom.t = vip;
16619                 vom.m += sip - som;
16620                 ancestor = v;
16621               }
16622             }
16623             return ancestor;
16624           }
16625
16626           function sizeNode(node) {
16627             node.x *= dx;
16628             node.y = node.depth * dy;
16629           }
16630
16631           tree.separation = function(x) {
16632             return arguments.length ? (separation = x, tree) : separation;
16633           };
16634
16635           tree.size = function(x) {
16636             return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], tree) : (nodeSize ? null : [dx, dy]);
16637           };
16638
16639           tree.nodeSize = function(x) {
16640             return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], tree) : (nodeSize ? [dx, dy] : null);
16641           };
16642
16643           return tree;
16644         }
16645
16646         function treemapSlice(parent, x0, y0, x1, y1) {
16647           var nodes = parent.children,
16648               node,
16649               i = -1,
16650               n = nodes.length,
16651               k = parent.value && (y1 - y0) / parent.value;
16652
16653           while (++i < n) {
16654             node = nodes[i], node.x0 = x0, node.x1 = x1;
16655             node.y0 = y0, node.y1 = y0 += node.value * k;
16656           }
16657         }
16658
16659         var phi = (1 + Math.sqrt(5)) / 2;
16660
16661         function squarifyRatio(ratio, parent, x0, y0, x1, y1) {
16662           var rows = [],
16663               nodes = parent.children,
16664               row,
16665               nodeValue,
16666               i0 = 0,
16667               i1 = 0,
16668               n = nodes.length,
16669               dx, dy,
16670               value = parent.value,
16671               sumValue,
16672               minValue,
16673               maxValue,
16674               newRatio,
16675               minRatio,
16676               alpha,
16677               beta;
16678
16679           while (i0 < n) {
16680             dx = x1 - x0, dy = y1 - y0;
16681
16682             // Find the next non-empty node.
16683             do sumValue = nodes[i1++].value; while (!sumValue && i1 < n);
16684             minValue = maxValue = sumValue;
16685             alpha = Math.max(dy / dx, dx / dy) / (value * ratio);
16686             beta = sumValue * sumValue * alpha;
16687             minRatio = Math.max(maxValue / beta, beta / minValue);
16688
16689             // Keep adding nodes while the aspect ratio maintains or improves.
16690             for (; i1 < n; ++i1) {
16691               sumValue += nodeValue = nodes[i1].value;
16692               if (nodeValue < minValue) minValue = nodeValue;
16693               if (nodeValue > maxValue) maxValue = nodeValue;
16694               beta = sumValue * sumValue * alpha;
16695               newRatio = Math.max(maxValue / beta, beta / minValue);
16696               if (newRatio > minRatio) { sumValue -= nodeValue; break; }
16697               minRatio = newRatio;
16698             }
16699
16700             // Position and record the row orientation.
16701             rows.push(row = {value: sumValue, dice: dx < dy, children: nodes.slice(i0, i1)});
16702             if (row.dice) treemapDice(row, x0, y0, x1, value ? y0 += dy * sumValue / value : y1);
16703             else treemapSlice(row, x0, y0, value ? x0 += dx * sumValue / value : x1, y1);
16704             value -= sumValue, i0 = i1;
16705           }
16706
16707           return rows;
16708         }
16709
16710         var squarify = (function custom(ratio) {
16711
16712           function squarify(parent, x0, y0, x1, y1) {
16713             squarifyRatio(ratio, parent, x0, y0, x1, y1);
16714           }
16715
16716           squarify.ratio = function(x) {
16717             return custom((x = +x) > 1 ? x : 1);
16718           };
16719
16720           return squarify;
16721         })(phi);
16722
16723         function index$2() {
16724           var tile = squarify,
16725               round = false,
16726               dx = 1,
16727               dy = 1,
16728               paddingStack = [0],
16729               paddingInner = constantZero,
16730               paddingTop = constantZero,
16731               paddingRight = constantZero,
16732               paddingBottom = constantZero,
16733               paddingLeft = constantZero;
16734
16735           function treemap(root) {
16736             root.x0 =
16737             root.y0 = 0;
16738             root.x1 = dx;
16739             root.y1 = dy;
16740             root.eachBefore(positionNode);
16741             paddingStack = [0];
16742             if (round) root.eachBefore(roundNode);
16743             return root;
16744           }
16745
16746           function positionNode(node) {
16747             var p = paddingStack[node.depth],
16748                 x0 = node.x0 + p,
16749                 y0 = node.y0 + p,
16750                 x1 = node.x1 - p,
16751                 y1 = node.y1 - p;
16752             if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
16753             if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
16754             node.x0 = x0;
16755             node.y0 = y0;
16756             node.x1 = x1;
16757             node.y1 = y1;
16758             if (node.children) {
16759               p = paddingStack[node.depth + 1] = paddingInner(node) / 2;
16760               x0 += paddingLeft(node) - p;
16761               y0 += paddingTop(node) - p;
16762               x1 -= paddingRight(node) - p;
16763               y1 -= paddingBottom(node) - p;
16764               if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
16765               if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
16766               tile(node, x0, y0, x1, y1);
16767             }
16768           }
16769
16770           treemap.round = function(x) {
16771             return arguments.length ? (round = !!x, treemap) : round;
16772           };
16773
16774           treemap.size = function(x) {
16775             return arguments.length ? (dx = +x[0], dy = +x[1], treemap) : [dx, dy];
16776           };
16777
16778           treemap.tile = function(x) {
16779             return arguments.length ? (tile = required(x), treemap) : tile;
16780           };
16781
16782           treemap.padding = function(x) {
16783             return arguments.length ? treemap.paddingInner(x).paddingOuter(x) : treemap.paddingInner();
16784           };
16785
16786           treemap.paddingInner = function(x) {
16787             return arguments.length ? (paddingInner = typeof x === "function" ? x : constant$9(+x), treemap) : paddingInner;
16788           };
16789
16790           treemap.paddingOuter = function(x) {
16791             return arguments.length ? treemap.paddingTop(x).paddingRight(x).paddingBottom(x).paddingLeft(x) : treemap.paddingTop();
16792           };
16793
16794           treemap.paddingTop = function(x) {
16795             return arguments.length ? (paddingTop = typeof x === "function" ? x : constant$9(+x), treemap) : paddingTop;
16796           };
16797
16798           treemap.paddingRight = function(x) {
16799             return arguments.length ? (paddingRight = typeof x === "function" ? x : constant$9(+x), treemap) : paddingRight;
16800           };
16801
16802           treemap.paddingBottom = function(x) {
16803             return arguments.length ? (paddingBottom = typeof x === "function" ? x : constant$9(+x), treemap) : paddingBottom;
16804           };
16805
16806           treemap.paddingLeft = function(x) {
16807             return arguments.length ? (paddingLeft = typeof x === "function" ? x : constant$9(+x), treemap) : paddingLeft;
16808           };
16809
16810           return treemap;
16811         }
16812
16813         function binary(parent, x0, y0, x1, y1) {
16814           var nodes = parent.children,
16815               i, n = nodes.length,
16816               sum, sums = new Array(n + 1);
16817
16818           for (sums[0] = sum = i = 0; i < n; ++i) {
16819             sums[i + 1] = sum += nodes[i].value;
16820           }
16821
16822           partition(0, n, parent.value, x0, y0, x1, y1);
16823
16824           function partition(i, j, value, x0, y0, x1, y1) {
16825             if (i >= j - 1) {
16826               var node = nodes[i];
16827               node.x0 = x0, node.y0 = y0;
16828               node.x1 = x1, node.y1 = y1;
16829               return;
16830             }
16831
16832             var valueOffset = sums[i],
16833                 valueTarget = (value / 2) + valueOffset,
16834                 k = i + 1,
16835                 hi = j - 1;
16836
16837             while (k < hi) {
16838               var mid = k + hi >>> 1;
16839               if (sums[mid] < valueTarget) k = mid + 1;
16840               else hi = mid;
16841             }
16842
16843             if ((valueTarget - sums[k - 1]) < (sums[k] - valueTarget) && i + 1 < k) --k;
16844
16845             var valueLeft = sums[k] - valueOffset,
16846                 valueRight = value - valueLeft;
16847
16848             if ((x1 - x0) > (y1 - y0)) {
16849               var xk = (x0 * valueRight + x1 * valueLeft) / value;
16850               partition(i, k, valueLeft, x0, y0, xk, y1);
16851               partition(k, j, valueRight, xk, y0, x1, y1);
16852             } else {
16853               var yk = (y0 * valueRight + y1 * valueLeft) / value;
16854               partition(i, k, valueLeft, x0, y0, x1, yk);
16855               partition(k, j, valueRight, x0, yk, x1, y1);
16856             }
16857           }
16858         }
16859
16860         function sliceDice(parent, x0, y0, x1, y1) {
16861           (parent.depth & 1 ? treemapSlice : treemapDice)(parent, x0, y0, x1, y1);
16862         }
16863
16864         var resquarify = (function custom(ratio) {
16865
16866           function resquarify(parent, x0, y0, x1, y1) {
16867             if ((rows = parent._squarify) && (rows.ratio === ratio)) {
16868               var rows,
16869                   row,
16870                   nodes,
16871                   i,
16872                   j = -1,
16873                   n,
16874                   m = rows.length,
16875                   value = parent.value;
16876
16877               while (++j < m) {
16878                 row = rows[j], nodes = row.children;
16879                 for (i = row.value = 0, n = nodes.length; i < n; ++i) row.value += nodes[i].value;
16880                 if (row.dice) treemapDice(row, x0, y0, x1, y0 += (y1 - y0) * row.value / value);
16881                 else treemapSlice(row, x0, y0, x0 += (x1 - x0) * row.value / value, y1);
16882                 value -= row.value;
16883               }
16884             } else {
16885               parent._squarify = rows = squarifyRatio(ratio, parent, x0, y0, x1, y1);
16886               rows.ratio = ratio;
16887             }
16888           }
16889
16890           resquarify.ratio = function(x) {
16891             return custom((x = +x) > 1 ? x : 1);
16892           };
16893
16894           return resquarify;
16895         })(phi);
16896
16897         function d3_polygonArea(polygon) {
16898           var i = -1,
16899               n = polygon.length,
16900               a,
16901               b = polygon[n - 1],
16902               area = 0;
16903
16904           while (++i < n) {
16905             a = b;
16906             b = polygon[i];
16907             area += a[1] * b[0] - a[0] * b[1];
16908           }
16909
16910           return area / 2;
16911         }
16912
16913         function d3_polygonCentroid(polygon) {
16914           var i = -1,
16915               n = polygon.length,
16916               x = 0,
16917               y = 0,
16918               a,
16919               b = polygon[n - 1],
16920               c,
16921               k = 0;
16922
16923           while (++i < n) {
16924             a = b;
16925             b = polygon[i];
16926             k += c = a[0] * b[1] - b[0] * a[1];
16927             x += (a[0] + b[0]) * c;
16928             y += (a[1] + b[1]) * c;
16929           }
16930
16931           return k *= 3, [x / k, y / k];
16932         }
16933
16934         // Returns the 2D cross product of AB and AC vectors, i.e., the z-component of
16935         // the 3D cross product in a quadrant I Cartesian coordinate system (+x is
16936         // right, +y is up). Returns a positive value if ABC is counter-clockwise,
16937         // negative if clockwise, and zero if the points are collinear.
16938         function cross$1(a, b, c) {
16939           return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);
16940         }
16941
16942         function lexicographicOrder(a, b) {
16943           return a[0] - b[0] || a[1] - b[1];
16944         }
16945
16946         // Computes the upper convex hull per the monotone chain algorithm.
16947         // Assumes points.length >= 3, is sorted by x, unique in y.
16948         // Returns an array of indices into points in left-to-right order.
16949         function computeUpperHullIndexes(points) {
16950           var n = points.length,
16951               indexes = [0, 1],
16952               size = 2;
16953
16954           for (var i = 2; i < n; ++i) {
16955             while (size > 1 && cross$1(points[indexes[size - 2]], points[indexes[size - 1]], points[i]) <= 0) --size;
16956             indexes[size++] = i;
16957           }
16958
16959           return indexes.slice(0, size); // remove popped points
16960         }
16961
16962         function d3_polygonHull(points) {
16963           if ((n = points.length) < 3) return null;
16964
16965           var i,
16966               n,
16967               sortedPoints = new Array(n),
16968               flippedPoints = new Array(n);
16969
16970           for (i = 0; i < n; ++i) sortedPoints[i] = [+points[i][0], +points[i][1], i];
16971           sortedPoints.sort(lexicographicOrder);
16972           for (i = 0; i < n; ++i) flippedPoints[i] = [sortedPoints[i][0], -sortedPoints[i][1]];
16973
16974           var upperIndexes = computeUpperHullIndexes(sortedPoints),
16975               lowerIndexes = computeUpperHullIndexes(flippedPoints);
16976
16977           // Construct the hull polygon, removing possible duplicate endpoints.
16978           var skipLeft = lowerIndexes[0] === upperIndexes[0],
16979               skipRight = lowerIndexes[lowerIndexes.length - 1] === upperIndexes[upperIndexes.length - 1],
16980               hull = [];
16981
16982           // Add upper hull in right-to-l order.
16983           // Then add lower hull in left-to-right order.
16984           for (i = upperIndexes.length - 1; i >= 0; --i) hull.push(points[sortedPoints[upperIndexes[i]][2]]);
16985           for (i = +skipLeft; i < lowerIndexes.length - skipRight; ++i) hull.push(points[sortedPoints[lowerIndexes[i]][2]]);
16986
16987           return hull;
16988         }
16989
16990         function contains$3(polygon, point) {
16991           var n = polygon.length,
16992               p = polygon[n - 1],
16993               x = point[0], y = point[1],
16994               x0 = p[0], y0 = p[1],
16995               x1, y1,
16996               inside = false;
16997
16998           for (var i = 0; i < n; ++i) {
16999             p = polygon[i], x1 = p[0], y1 = p[1];
17000             if (((y1 > y) !== (y0 > y)) && (x < (x0 - x1) * (y - y1) / (y0 - y1) + x1)) inside = !inside;
17001             x0 = x1, y0 = y1;
17002           }
17003
17004           return inside;
17005         }
17006
17007         function length$1(polygon) {
17008           var i = -1,
17009               n = polygon.length,
17010               b = polygon[n - 1],
17011               xa,
17012               ya,
17013               xb = b[0],
17014               yb = b[1],
17015               perimeter = 0;
17016
17017           while (++i < n) {
17018             xa = xb;
17019             ya = yb;
17020             b = polygon[i];
17021             xb = b[0];
17022             yb = b[1];
17023             xa -= xb;
17024             ya -= yb;
17025             perimeter += Math.sqrt(xa * xa + ya * ya);
17026           }
17027
17028           return perimeter;
17029         }
17030
17031         function defaultSource$1() {
17032           return Math.random();
17033         }
17034
17035         var uniform = (function sourceRandomUniform(source) {
17036           function randomUniform(min, max) {
17037             min = min == null ? 0 : +min;
17038             max = max == null ? 1 : +max;
17039             if (arguments.length === 1) max = min, min = 0;
17040             else max -= min;
17041             return function() {
17042               return source() * max + min;
17043             };
17044           }
17045
17046           randomUniform.source = sourceRandomUniform;
17047
17048           return randomUniform;
17049         })(defaultSource$1);
17050
17051         var normal = (function sourceRandomNormal(source) {
17052           function randomNormal(mu, sigma) {
17053             var x, r;
17054             mu = mu == null ? 0 : +mu;
17055             sigma = sigma == null ? 1 : +sigma;
17056             return function() {
17057               var y;
17058
17059               // If available, use the second previously-generated uniform random.
17060               if (x != null) y = x, x = null;
17061
17062               // Otherwise, generate a new x and y.
17063               else do {
17064                 x = source() * 2 - 1;
17065                 y = source() * 2 - 1;
17066                 r = x * x + y * y;
17067               } while (!r || r > 1);
17068
17069               return mu + sigma * y * Math.sqrt(-2 * Math.log(r) / r);
17070             };
17071           }
17072
17073           randomNormal.source = sourceRandomNormal;
17074
17075           return randomNormal;
17076         })(defaultSource$1);
17077
17078         var logNormal = (function sourceRandomLogNormal(source) {
17079           function randomLogNormal() {
17080             var randomNormal = normal.source(source).apply(this, arguments);
17081             return function() {
17082               return Math.exp(randomNormal());
17083             };
17084           }
17085
17086           randomLogNormal.source = sourceRandomLogNormal;
17087
17088           return randomLogNormal;
17089         })(defaultSource$1);
17090
17091         var irwinHall = (function sourceRandomIrwinHall(source) {
17092           function randomIrwinHall(n) {
17093             return function() {
17094               for (var sum = 0, i = 0; i < n; ++i) sum += source();
17095               return sum;
17096             };
17097           }
17098
17099           randomIrwinHall.source = sourceRandomIrwinHall;
17100
17101           return randomIrwinHall;
17102         })(defaultSource$1);
17103
17104         var bates = (function sourceRandomBates(source) {
17105           function randomBates(n) {
17106             var randomIrwinHall = irwinHall.source(source)(n);
17107             return function() {
17108               return randomIrwinHall() / n;
17109             };
17110           }
17111
17112           randomBates.source = sourceRandomBates;
17113
17114           return randomBates;
17115         })(defaultSource$1);
17116
17117         var exponential$1 = (function sourceRandomExponential(source) {
17118           function randomExponential(lambda) {
17119             return function() {
17120               return -Math.log(1 - source()) / lambda;
17121             };
17122           }
17123
17124           randomExponential.source = sourceRandomExponential;
17125
17126           return randomExponential;
17127         })(defaultSource$1);
17128
17129         function initRange(domain, range) {
17130           switch (arguments.length) {
17131             case 0: break;
17132             case 1: this.range(domain); break;
17133             default: this.range(range).domain(domain); break;
17134           }
17135           return this;
17136         }
17137
17138         function initInterpolator(domain, interpolator) {
17139           switch (arguments.length) {
17140             case 0: break;
17141             case 1: this.interpolator(domain); break;
17142             default: this.interpolator(interpolator).domain(domain); break;
17143           }
17144           return this;
17145         }
17146
17147         var array$4 = Array.prototype;
17148
17149         var map$4 = array$4.map;
17150         var slice$9 = array$4.slice;
17151
17152         var implicit = {name: "implicit"};
17153
17154         function ordinal() {
17155           var index = map$3(),
17156               domain = [],
17157               range = [],
17158               unknown = implicit;
17159
17160           function scale(d) {
17161             var key = d + "", i = index.get(key);
17162             if (!i) {
17163               if (unknown !== implicit) return unknown;
17164               index.set(key, i = domain.push(d));
17165             }
17166             return range[(i - 1) % range.length];
17167           }
17168
17169           scale.domain = function(_) {
17170             if (!arguments.length) return domain.slice();
17171             domain = [], index = map$3();
17172             var i = -1, n = _.length, d, key;
17173             while (++i < n) if (!index.has(key = (d = _[i]) + "")) index.set(key, domain.push(d));
17174             return scale;
17175           };
17176
17177           scale.range = function(_) {
17178             return arguments.length ? (range = slice$9.call(_), scale) : range.slice();
17179           };
17180
17181           scale.unknown = function(_) {
17182             return arguments.length ? (unknown = _, scale) : unknown;
17183           };
17184
17185           scale.copy = function() {
17186             return ordinal(domain, range).unknown(unknown);
17187           };
17188
17189           initRange.apply(scale, arguments);
17190
17191           return scale;
17192         }
17193
17194         function band() {
17195           var scale = ordinal().unknown(undefined),
17196               domain = scale.domain,
17197               ordinalRange = scale.range,
17198               range = [0, 1],
17199               step,
17200               bandwidth,
17201               round = false,
17202               paddingInner = 0,
17203               paddingOuter = 0,
17204               align = 0.5;
17205
17206           delete scale.unknown;
17207
17208           function rescale() {
17209             var n = domain().length,
17210                 reverse = range[1] < range[0],
17211                 start = range[reverse - 0],
17212                 stop = range[1 - reverse];
17213             step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2);
17214             if (round) step = Math.floor(step);
17215             start += (stop - start - step * (n - paddingInner)) * align;
17216             bandwidth = step * (1 - paddingInner);
17217             if (round) start = Math.round(start), bandwidth = Math.round(bandwidth);
17218             var values = d3_range(n).map(function(i) { return start + step * i; });
17219             return ordinalRange(reverse ? values.reverse() : values);
17220           }
17221
17222           scale.domain = function(_) {
17223             return arguments.length ? (domain(_), rescale()) : domain();
17224           };
17225
17226           scale.range = function(_) {
17227             return arguments.length ? (range = [+_[0], +_[1]], rescale()) : range.slice();
17228           };
17229
17230           scale.rangeRound = function(_) {
17231             return range = [+_[0], +_[1]], round = true, rescale();
17232           };
17233
17234           scale.bandwidth = function() {
17235             return bandwidth;
17236           };
17237
17238           scale.step = function() {
17239             return step;
17240           };
17241
17242           scale.round = function(_) {
17243             return arguments.length ? (round = !!_, rescale()) : round;
17244           };
17245
17246           scale.padding = function(_) {
17247             return arguments.length ? (paddingInner = Math.min(1, paddingOuter = +_), rescale()) : paddingInner;
17248           };
17249
17250           scale.paddingInner = function(_) {
17251             return arguments.length ? (paddingInner = Math.min(1, _), rescale()) : paddingInner;
17252           };
17253
17254           scale.paddingOuter = function(_) {
17255             return arguments.length ? (paddingOuter = +_, rescale()) : paddingOuter;
17256           };
17257
17258           scale.align = function(_) {
17259             return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align;
17260           };
17261
17262           scale.copy = function() {
17263             return band(domain(), range)
17264                 .round(round)
17265                 .paddingInner(paddingInner)
17266                 .paddingOuter(paddingOuter)
17267                 .align(align);
17268           };
17269
17270           return initRange.apply(rescale(), arguments);
17271         }
17272
17273         function pointish(scale) {
17274           var copy = scale.copy;
17275
17276           scale.padding = scale.paddingOuter;
17277           delete scale.paddingInner;
17278           delete scale.paddingOuter;
17279
17280           scale.copy = function() {
17281             return pointish(copy());
17282           };
17283
17284           return scale;
17285         }
17286
17287         function point$1() {
17288           return pointish(band.apply(null, arguments).paddingInner(1));
17289         }
17290
17291         function constant$a(x) {
17292           return function() {
17293             return x;
17294           };
17295         }
17296
17297         function number$2(x) {
17298           return +x;
17299         }
17300
17301         var unit = [0, 1];
17302
17303         function identity$5(x) {
17304           return x;
17305         }
17306
17307         function normalize(a, b) {
17308           return (b -= (a = +a))
17309               ? function(x) { return (x - a) / b; }
17310               : constant$a(isNaN(b) ? NaN : 0.5);
17311         }
17312
17313         function clamper(domain) {
17314           var a = domain[0], b = domain[domain.length - 1], t;
17315           if (a > b) t = a, a = b, b = t;
17316           return function(x) { return Math.max(a, Math.min(b, x)); };
17317         }
17318
17319         // normalize(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].
17320         // interpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding range value x in [a,b].
17321         function bimap(domain, range, interpolate) {
17322           var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1];
17323           if (d1 < d0) d0 = normalize(d1, d0), r0 = interpolate(r1, r0);
17324           else d0 = normalize(d0, d1), r0 = interpolate(r0, r1);
17325           return function(x) { return r0(d0(x)); };
17326         }
17327
17328         function polymap(domain, range, interpolate) {
17329           var j = Math.min(domain.length, range.length) - 1,
17330               d = new Array(j),
17331               r = new Array(j),
17332               i = -1;
17333
17334           // Reverse descending domains.
17335           if (domain[j] < domain[0]) {
17336             domain = domain.slice().reverse();
17337             range = range.slice().reverse();
17338           }
17339
17340           while (++i < j) {
17341             d[i] = normalize(domain[i], domain[i + 1]);
17342             r[i] = interpolate(range[i], range[i + 1]);
17343           }
17344
17345           return function(x) {
17346             var i = bisectRight(domain, x, 1, j) - 1;
17347             return r[i](d[i](x));
17348           };
17349         }
17350
17351         function copy$1(source, target) {
17352           return target
17353               .domain(source.domain())
17354               .range(source.range())
17355               .interpolate(source.interpolate())
17356               .clamp(source.clamp())
17357               .unknown(source.unknown());
17358         }
17359
17360         function transformer$1() {
17361           var domain = unit,
17362               range = unit,
17363               interpolate = d3_interpolate,
17364               transform,
17365               untransform,
17366               unknown,
17367               clamp = identity$5,
17368               piecewise,
17369               output,
17370               input;
17371
17372           function rescale() {
17373             piecewise = Math.min(domain.length, range.length) > 2 ? polymap : bimap;
17374             output = input = null;
17375             return scale;
17376           }
17377
17378           function scale(x) {
17379             return isNaN(x = +x) ? unknown : (output || (output = piecewise(domain.map(transform), range, interpolate)))(transform(clamp(x)));
17380           }
17381
17382           scale.invert = function(y) {
17383             return clamp(untransform((input || (input = piecewise(range, domain.map(transform), d3_interpolateNumber)))(y)));
17384           };
17385
17386           scale.domain = function(_) {
17387             return arguments.length ? (domain = map$4.call(_, number$2), clamp === identity$5 || (clamp = clamper(domain)), rescale()) : domain.slice();
17388           };
17389
17390           scale.range = function(_) {
17391             return arguments.length ? (range = slice$9.call(_), rescale()) : range.slice();
17392           };
17393
17394           scale.rangeRound = function(_) {
17395             return range = slice$9.call(_), interpolate = interpolateRound, rescale();
17396           };
17397
17398           scale.clamp = function(_) {
17399             return arguments.length ? (clamp = _ ? clamper(domain) : identity$5, scale) : clamp !== identity$5;
17400           };
17401
17402           scale.interpolate = function(_) {
17403             return arguments.length ? (interpolate = _, rescale()) : interpolate;
17404           };
17405
17406           scale.unknown = function(_) {
17407             return arguments.length ? (unknown = _, scale) : unknown;
17408           };
17409
17410           return function(t, u) {
17411             transform = t, untransform = u;
17412             return rescale();
17413           };
17414         }
17415
17416         function continuous(transform, untransform) {
17417           return transformer$1()(transform, untransform);
17418         }
17419
17420         function tickFormat(start, stop, count, specifier) {
17421           var step = tickStep(start, stop, count),
17422               precision;
17423           specifier = formatSpecifier(specifier == null ? ",f" : specifier);
17424           switch (specifier.type) {
17425             case "s": {
17426               var value = Math.max(Math.abs(start), Math.abs(stop));
17427               if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value))) specifier.precision = precision;
17428               return formatPrefix(specifier, value);
17429             }
17430             case "":
17431             case "e":
17432             case "g":
17433             case "p":
17434             case "r": {
17435               if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === "e");
17436               break;
17437             }
17438             case "f":
17439             case "%": {
17440               if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === "%") * 2;
17441               break;
17442             }
17443           }
17444           return format(specifier);
17445         }
17446
17447         function linearish(scale) {
17448           var domain = scale.domain;
17449
17450           scale.ticks = function(count) {
17451             var d = domain();
17452             return ticks(d[0], d[d.length - 1], count == null ? 10 : count);
17453           };
17454
17455           scale.tickFormat = function(count, specifier) {
17456             var d = domain();
17457             return tickFormat(d[0], d[d.length - 1], count == null ? 10 : count, specifier);
17458           };
17459
17460           scale.nice = function(count) {
17461             if (count == null) count = 10;
17462
17463             var d = domain(),
17464                 i0 = 0,
17465                 i1 = d.length - 1,
17466                 start = d[i0],
17467                 stop = d[i1],
17468                 step;
17469
17470             if (stop < start) {
17471               step = start, start = stop, stop = step;
17472               step = i0, i0 = i1, i1 = step;
17473             }
17474
17475             step = tickIncrement(start, stop, count);
17476
17477             if (step > 0) {
17478               start = Math.floor(start / step) * step;
17479               stop = Math.ceil(stop / step) * step;
17480               step = tickIncrement(start, stop, count);
17481             } else if (step < 0) {
17482               start = Math.ceil(start * step) / step;
17483               stop = Math.floor(stop * step) / step;
17484               step = tickIncrement(start, stop, count);
17485             }
17486
17487             if (step > 0) {
17488               d[i0] = Math.floor(start / step) * step;
17489               d[i1] = Math.ceil(stop / step) * step;
17490               domain(d);
17491             } else if (step < 0) {
17492               d[i0] = Math.ceil(start * step) / step;
17493               d[i1] = Math.floor(stop * step) / step;
17494               domain(d);
17495             }
17496
17497             return scale;
17498           };
17499
17500           return scale;
17501         }
17502
17503         function linear$2() {
17504           var scale = continuous(identity$5, identity$5);
17505
17506           scale.copy = function() {
17507             return copy$1(scale, linear$2());
17508           };
17509
17510           initRange.apply(scale, arguments);
17511
17512           return linearish(scale);
17513         }
17514
17515         function identity$6(domain) {
17516           var unknown;
17517
17518           function scale(x) {
17519             return isNaN(x = +x) ? unknown : x;
17520           }
17521
17522           scale.invert = scale;
17523
17524           scale.domain = scale.range = function(_) {
17525             return arguments.length ? (domain = map$4.call(_, number$2), scale) : domain.slice();
17526           };
17527
17528           scale.unknown = function(_) {
17529             return arguments.length ? (unknown = _, scale) : unknown;
17530           };
17531
17532           scale.copy = function() {
17533             return identity$6(domain).unknown(unknown);
17534           };
17535
17536           domain = arguments.length ? map$4.call(domain, number$2) : [0, 1];
17537
17538           return linearish(scale);
17539         }
17540
17541         function nice(domain, interval) {
17542           domain = domain.slice();
17543
17544           var i0 = 0,
17545               i1 = domain.length - 1,
17546               x0 = domain[i0],
17547               x1 = domain[i1],
17548               t;
17549
17550           if (x1 < x0) {
17551             t = i0, i0 = i1, i1 = t;
17552             t = x0, x0 = x1, x1 = t;
17553           }
17554
17555           domain[i0] = interval.floor(x0);
17556           domain[i1] = interval.ceil(x1);
17557           return domain;
17558         }
17559
17560         function transformLog(x) {
17561           return Math.log(x);
17562         }
17563
17564         function transformExp(x) {
17565           return Math.exp(x);
17566         }
17567
17568         function transformLogn(x) {
17569           return -Math.log(-x);
17570         }
17571
17572         function transformExpn(x) {
17573           return -Math.exp(-x);
17574         }
17575
17576         function pow10(x) {
17577           return isFinite(x) ? +("1e" + x) : x < 0 ? 0 : x;
17578         }
17579
17580         function powp(base) {
17581           return base === 10 ? pow10
17582               : base === Math.E ? Math.exp
17583               : function(x) { return Math.pow(base, x); };
17584         }
17585
17586         function logp(base) {
17587           return base === Math.E ? Math.log
17588               : base === 10 && Math.log10
17589               || base === 2 && Math.log2
17590               || (base = Math.log(base), function(x) { return Math.log(x) / base; });
17591         }
17592
17593         function reflect(f) {
17594           return function(x) {
17595             return -f(-x);
17596           };
17597         }
17598
17599         function loggish(transform) {
17600           var scale = transform(transformLog, transformExp),
17601               domain = scale.domain,
17602               base = 10,
17603               logs,
17604               pows;
17605
17606           function rescale() {
17607             logs = logp(base), pows = powp(base);
17608             if (domain()[0] < 0) {
17609               logs = reflect(logs), pows = reflect(pows);
17610               transform(transformLogn, transformExpn);
17611             } else {
17612               transform(transformLog, transformExp);
17613             }
17614             return scale;
17615           }
17616
17617           scale.base = function(_) {
17618             return arguments.length ? (base = +_, rescale()) : base;
17619           };
17620
17621           scale.domain = function(_) {
17622             return arguments.length ? (domain(_), rescale()) : domain();
17623           };
17624
17625           scale.ticks = function(count) {
17626             var d = domain(),
17627                 u = d[0],
17628                 v = d[d.length - 1],
17629                 r;
17630
17631             if (r = v < u) i = u, u = v, v = i;
17632
17633             var i = logs(u),
17634                 j = logs(v),
17635                 p,
17636                 k,
17637                 t,
17638                 n = count == null ? 10 : +count,
17639                 z = [];
17640
17641             if (!(base % 1) && j - i < n) {
17642               i = Math.round(i) - 1, j = Math.round(j) + 1;
17643               if (u > 0) for (; i < j; ++i) {
17644                 for (k = 1, p = pows(i); k < base; ++k) {
17645                   t = p * k;
17646                   if (t < u) continue;
17647                   if (t > v) break;
17648                   z.push(t);
17649                 }
17650               } else for (; i < j; ++i) {
17651                 for (k = base - 1, p = pows(i); k >= 1; --k) {
17652                   t = p * k;
17653                   if (t < u) continue;
17654                   if (t > v) break;
17655                   z.push(t);
17656                 }
17657               }
17658             } else {
17659               z = ticks(i, j, Math.min(j - i, n)).map(pows);
17660             }
17661
17662             return r ? z.reverse() : z;
17663           };
17664
17665           scale.tickFormat = function(count, specifier) {
17666             if (specifier == null) specifier = base === 10 ? ".0e" : ",";
17667             if (typeof specifier !== "function") specifier = format(specifier);
17668             if (count === Infinity) return specifier;
17669             if (count == null) count = 10;
17670             var k = Math.max(1, base * count / scale.ticks().length); // TODO fast estimate?
17671             return function(d) {
17672               var i = d / pows(Math.round(logs(d)));
17673               if (i * base < base - 0.5) i *= base;
17674               return i <= k ? specifier(d) : "";
17675             };
17676           };
17677
17678           scale.nice = function() {
17679             return domain(nice(domain(), {
17680               floor: function(x) { return pows(Math.floor(logs(x))); },
17681               ceil: function(x) { return pows(Math.ceil(logs(x))); }
17682             }));
17683           };
17684
17685           return scale;
17686         }
17687
17688         function log$1() {
17689           var scale = loggish(transformer$1()).domain([1, 10]);
17690
17691           scale.copy = function() {
17692             return copy$1(scale, log$1()).base(scale.base());
17693           };
17694
17695           initRange.apply(scale, arguments);
17696
17697           return scale;
17698         }
17699
17700         function transformSymlog(c) {
17701           return function(x) {
17702             return Math.sign(x) * Math.log1p(Math.abs(x / c));
17703           };
17704         }
17705
17706         function transformSymexp(c) {
17707           return function(x) {
17708             return Math.sign(x) * Math.expm1(Math.abs(x)) * c;
17709           };
17710         }
17711
17712         function symlogish(transform) {
17713           var c = 1, scale = transform(transformSymlog(c), transformSymexp(c));
17714
17715           scale.constant = function(_) {
17716             return arguments.length ? transform(transformSymlog(c = +_), transformSymexp(c)) : c;
17717           };
17718
17719           return linearish(scale);
17720         }
17721
17722         function symlog() {
17723           var scale = symlogish(transformer$1());
17724
17725           scale.copy = function() {
17726             return copy$1(scale, symlog()).constant(scale.constant());
17727           };
17728
17729           return initRange.apply(scale, arguments);
17730         }
17731
17732         function transformPow(exponent) {
17733           return function(x) {
17734             return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent);
17735           };
17736         }
17737
17738         function transformSqrt(x) {
17739           return x < 0 ? -Math.sqrt(-x) : Math.sqrt(x);
17740         }
17741
17742         function transformSquare(x) {
17743           return x < 0 ? -x * x : x * x;
17744         }
17745
17746         function powish(transform) {
17747           var scale = transform(identity$5, identity$5),
17748               exponent = 1;
17749
17750           function rescale() {
17751             return exponent === 1 ? transform(identity$5, identity$5)
17752                 : exponent === 0.5 ? transform(transformSqrt, transformSquare)
17753                 : transform(transformPow(exponent), transformPow(1 / exponent));
17754           }
17755
17756           scale.exponent = function(_) {
17757             return arguments.length ? (exponent = +_, rescale()) : exponent;
17758           };
17759
17760           return linearish(scale);
17761         }
17762
17763         function pow$1() {
17764           var scale = powish(transformer$1());
17765
17766           scale.copy = function() {
17767             return copy$1(scale, pow$1()).exponent(scale.exponent());
17768           };
17769
17770           initRange.apply(scale, arguments);
17771
17772           return scale;
17773         }
17774
17775         function sqrt$1() {
17776           return pow$1.apply(null, arguments).exponent(0.5);
17777         }
17778
17779         function quantile() {
17780           var domain = [],
17781               range = [],
17782               thresholds = [],
17783               unknown;
17784
17785           function rescale() {
17786             var i = 0, n = Math.max(1, range.length);
17787             thresholds = new Array(n - 1);
17788             while (++i < n) thresholds[i - 1] = threshold(domain, i / n);
17789             return scale;
17790           }
17791
17792           function scale(x) {
17793             return isNaN(x = +x) ? unknown : range[bisectRight(thresholds, x)];
17794           }
17795
17796           scale.invertExtent = function(y) {
17797             var i = range.indexOf(y);
17798             return i < 0 ? [NaN, NaN] : [
17799               i > 0 ? thresholds[i - 1] : domain[0],
17800               i < thresholds.length ? thresholds[i] : domain[domain.length - 1]
17801             ];
17802           };
17803
17804           scale.domain = function(_) {
17805             if (!arguments.length) return domain.slice();
17806             domain = [];
17807             for (var i = 0, n = _.length, d; i < n; ++i) if (d = _[i], d != null && !isNaN(d = +d)) domain.push(d);
17808             domain.sort(d3_ascending);
17809             return rescale();
17810           };
17811
17812           scale.range = function(_) {
17813             return arguments.length ? (range = slice$9.call(_), rescale()) : range.slice();
17814           };
17815
17816           scale.unknown = function(_) {
17817             return arguments.length ? (unknown = _, scale) : unknown;
17818           };
17819
17820           scale.quantiles = function() {
17821             return thresholds.slice();
17822           };
17823
17824           scale.copy = function() {
17825             return quantile()
17826                 .domain(domain)
17827                 .range(range)
17828                 .unknown(unknown);
17829           };
17830
17831           return initRange.apply(scale, arguments);
17832         }
17833
17834         function quantize() {
17835           var x0 = 0,
17836               x1 = 1,
17837               n = 1,
17838               domain = [0.5],
17839               range = [0, 1],
17840               unknown;
17841
17842           function scale(x) {
17843             return x <= x ? range[bisectRight(domain, x, 0, n)] : unknown;
17844           }
17845
17846           function rescale() {
17847             var i = -1;
17848             domain = new Array(n);
17849             while (++i < n) domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1);
17850             return scale;
17851           }
17852
17853           scale.domain = function(_) {
17854             return arguments.length ? (x0 = +_[0], x1 = +_[1], rescale()) : [x0, x1];
17855           };
17856
17857           scale.range = function(_) {
17858             return arguments.length ? (n = (range = slice$9.call(_)).length - 1, rescale()) : range.slice();
17859           };
17860
17861           scale.invertExtent = function(y) {
17862             var i = range.indexOf(y);
17863             return i < 0 ? [NaN, NaN]
17864                 : i < 1 ? [x0, domain[0]]
17865                 : i >= n ? [domain[n - 1], x1]
17866                 : [domain[i - 1], domain[i]];
17867           };
17868
17869           scale.unknown = function(_) {
17870             return arguments.length ? (unknown = _, scale) : scale;
17871           };
17872
17873           scale.thresholds = function() {
17874             return domain.slice();
17875           };
17876
17877           scale.copy = function() {
17878             return quantize()
17879                 .domain([x0, x1])
17880                 .range(range)
17881                 .unknown(unknown);
17882           };
17883
17884           return initRange.apply(linearish(scale), arguments);
17885         }
17886
17887         function threshold$1() {
17888           var domain = [0.5],
17889               range = [0, 1],
17890               unknown,
17891               n = 1;
17892
17893           function scale(x) {
17894             return x <= x ? range[bisectRight(domain, x, 0, n)] : unknown;
17895           }
17896
17897           scale.domain = function(_) {
17898             return arguments.length ? (domain = slice$9.call(_), n = Math.min(domain.length, range.length - 1), scale) : domain.slice();
17899           };
17900
17901           scale.range = function(_) {
17902             return arguments.length ? (range = slice$9.call(_), n = Math.min(domain.length, range.length - 1), scale) : range.slice();
17903           };
17904
17905           scale.invertExtent = function(y) {
17906             var i = range.indexOf(y);
17907             return [domain[i - 1], domain[i]];
17908           };
17909
17910           scale.unknown = function(_) {
17911             return arguments.length ? (unknown = _, scale) : unknown;
17912           };
17913
17914           scale.copy = function() {
17915             return threshold$1()
17916                 .domain(domain)
17917                 .range(range)
17918                 .unknown(unknown);
17919           };
17920
17921           return initRange.apply(scale, arguments);
17922         }
17923
17924         var t0$1 = new Date,
17925             t1$1 = new Date;
17926
17927         function newInterval(floori, offseti, count, field) {
17928
17929           function interval(date) {
17930             return floori(date = new Date(+date)), date;
17931           }
17932
17933           interval.floor = interval;
17934
17935           interval.ceil = function(date) {
17936             return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date;
17937           };
17938
17939           interval.round = function(date) {
17940             var d0 = interval(date),
17941                 d1 = interval.ceil(date);
17942             return date - d0 < d1 - date ? d0 : d1;
17943           };
17944
17945           interval.offset = function(date, step) {
17946             return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date;
17947           };
17948
17949           interval.range = function(start, stop, step) {
17950             var range = [], previous;
17951             start = interval.ceil(start);
17952             step = step == null ? 1 : Math.floor(step);
17953             if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date
17954             do range.push(previous = new Date(+start)), offseti(start, step), floori(start);
17955             while (previous < start && start < stop);
17956             return range;
17957           };
17958
17959           interval.filter = function(test) {
17960             return newInterval(function(date) {
17961               if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1);
17962             }, function(date, step) {
17963               if (date >= date) {
17964                 if (step < 0) while (++step <= 0) {
17965                   while (offseti(date, -1), !test(date)) {} // eslint-disable-line no-empty
17966                 } else while (--step >= 0) {
17967                   while (offseti(date, +1), !test(date)) {} // eslint-disable-line no-empty
17968                 }
17969               }
17970             });
17971           };
17972
17973           if (count) {
17974             interval.count = function(start, end) {
17975               t0$1.setTime(+start), t1$1.setTime(+end);
17976               floori(t0$1), floori(t1$1);
17977               return Math.floor(count(t0$1, t1$1));
17978             };
17979
17980             interval.every = function(step) {
17981               step = Math.floor(step);
17982               return !isFinite(step) || !(step > 0) ? null
17983                   : !(step > 1) ? interval
17984                   : interval.filter(field
17985                       ? function(d) { return field(d) % step === 0; }
17986                       : function(d) { return interval.count(0, d) % step === 0; });
17987             };
17988           }
17989
17990           return interval;
17991         }
17992
17993         var millisecond = newInterval(function() {
17994           // noop
17995         }, function(date, step) {
17996           date.setTime(+date + step);
17997         }, function(start, end) {
17998           return end - start;
17999         });
18000
18001         // An optimized implementation for this simple case.
18002         millisecond.every = function(k) {
18003           k = Math.floor(k);
18004           if (!isFinite(k) || !(k > 0)) return null;
18005           if (!(k > 1)) return millisecond;
18006           return newInterval(function(date) {
18007             date.setTime(Math.floor(date / k) * k);
18008           }, function(date, step) {
18009             date.setTime(+date + step * k);
18010           }, function(start, end) {
18011             return (end - start) / k;
18012           });
18013         };
18014         var milliseconds = millisecond.range;
18015
18016         var durationSecond = 1e3;
18017         var durationMinute = 6e4;
18018         var durationHour = 36e5;
18019         var durationDay = 864e5;
18020         var durationWeek = 6048e5;
18021
18022         var second = newInterval(function(date) {
18023           date.setTime(date - date.getMilliseconds());
18024         }, function(date, step) {
18025           date.setTime(+date + step * durationSecond);
18026         }, function(start, end) {
18027           return (end - start) / durationSecond;
18028         }, function(date) {
18029           return date.getUTCSeconds();
18030         });
18031         var seconds = second.range;
18032
18033         var minute = newInterval(function(date) {
18034           date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond);
18035         }, function(date, step) {
18036           date.setTime(+date + step * durationMinute);
18037         }, function(start, end) {
18038           return (end - start) / durationMinute;
18039         }, function(date) {
18040           return date.getMinutes();
18041         });
18042         var minutes = minute.range;
18043
18044         var hour = newInterval(function(date) {
18045           date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond - date.getMinutes() * durationMinute);
18046         }, function(date, step) {
18047           date.setTime(+date + step * durationHour);
18048         }, function(start, end) {
18049           return (end - start) / durationHour;
18050         }, function(date) {
18051           return date.getHours();
18052         });
18053         var hours = hour.range;
18054
18055         var day = newInterval(function(date) {
18056           date.setHours(0, 0, 0, 0);
18057         }, function(date, step) {
18058           date.setDate(date.getDate() + step);
18059         }, function(start, end) {
18060           return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay;
18061         }, function(date) {
18062           return date.getDate() - 1;
18063         });
18064         var days = day.range;
18065
18066         function weekday(i) {
18067           return newInterval(function(date) {
18068             date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7);
18069             date.setHours(0, 0, 0, 0);
18070           }, function(date, step) {
18071             date.setDate(date.getDate() + step * 7);
18072           }, function(start, end) {
18073             return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationWeek;
18074           });
18075         }
18076
18077         var sunday = weekday(0);
18078         var monday = weekday(1);
18079         var tuesday = weekday(2);
18080         var wednesday = weekday(3);
18081         var thursday = weekday(4);
18082         var friday = weekday(5);
18083         var saturday = weekday(6);
18084
18085         var sundays = sunday.range;
18086         var mondays = monday.range;
18087         var tuesdays = tuesday.range;
18088         var wednesdays = wednesday.range;
18089         var thursdays = thursday.range;
18090         var fridays = friday.range;
18091         var saturdays = saturday.range;
18092
18093         var month = newInterval(function(date) {
18094           date.setDate(1);
18095           date.setHours(0, 0, 0, 0);
18096         }, function(date, step) {
18097           date.setMonth(date.getMonth() + step);
18098         }, function(start, end) {
18099           return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12;
18100         }, function(date) {
18101           return date.getMonth();
18102         });
18103         var months = month.range;
18104
18105         var year = newInterval(function(date) {
18106           date.setMonth(0, 1);
18107           date.setHours(0, 0, 0, 0);
18108         }, function(date, step) {
18109           date.setFullYear(date.getFullYear() + step);
18110         }, function(start, end) {
18111           return end.getFullYear() - start.getFullYear();
18112         }, function(date) {
18113           return date.getFullYear();
18114         });
18115
18116         // An optimized implementation for this simple case.
18117         year.every = function(k) {
18118           return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) {
18119             date.setFullYear(Math.floor(date.getFullYear() / k) * k);
18120             date.setMonth(0, 1);
18121             date.setHours(0, 0, 0, 0);
18122           }, function(date, step) {
18123             date.setFullYear(date.getFullYear() + step * k);
18124           });
18125         };
18126         var years = year.range;
18127
18128         var utcMinute = newInterval(function(date) {
18129           date.setUTCSeconds(0, 0);
18130         }, function(date, step) {
18131           date.setTime(+date + step * durationMinute);
18132         }, function(start, end) {
18133           return (end - start) / durationMinute;
18134         }, function(date) {
18135           return date.getUTCMinutes();
18136         });
18137         var utcMinutes = utcMinute.range;
18138
18139         var utcHour = newInterval(function(date) {
18140           date.setUTCMinutes(0, 0, 0);
18141         }, function(date, step) {
18142           date.setTime(+date + step * durationHour);
18143         }, function(start, end) {
18144           return (end - start) / durationHour;
18145         }, function(date) {
18146           return date.getUTCHours();
18147         });
18148         var utcHours = utcHour.range;
18149
18150         var utcDay = newInterval(function(date) {
18151           date.setUTCHours(0, 0, 0, 0);
18152         }, function(date, step) {
18153           date.setUTCDate(date.getUTCDate() + step);
18154         }, function(start, end) {
18155           return (end - start) / durationDay;
18156         }, function(date) {
18157           return date.getUTCDate() - 1;
18158         });
18159         var utcDays = utcDay.range;
18160
18161         function utcWeekday(i) {
18162           return newInterval(function(date) {
18163             date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7);
18164             date.setUTCHours(0, 0, 0, 0);
18165           }, function(date, step) {
18166             date.setUTCDate(date.getUTCDate() + step * 7);
18167           }, function(start, end) {
18168             return (end - start) / durationWeek;
18169           });
18170         }
18171
18172         var utcSunday = utcWeekday(0);
18173         var utcMonday = utcWeekday(1);
18174         var utcTuesday = utcWeekday(2);
18175         var utcWednesday = utcWeekday(3);
18176         var utcThursday = utcWeekday(4);
18177         var utcFriday = utcWeekday(5);
18178         var utcSaturday = utcWeekday(6);
18179
18180         var utcSundays = utcSunday.range;
18181         var utcMondays = utcMonday.range;
18182         var utcTuesdays = utcTuesday.range;
18183         var utcWednesdays = utcWednesday.range;
18184         var utcThursdays = utcThursday.range;
18185         var utcFridays = utcFriday.range;
18186         var utcSaturdays = utcSaturday.range;
18187
18188         var utcMonth = newInterval(function(date) {
18189           date.setUTCDate(1);
18190           date.setUTCHours(0, 0, 0, 0);
18191         }, function(date, step) {
18192           date.setUTCMonth(date.getUTCMonth() + step);
18193         }, function(start, end) {
18194           return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12;
18195         }, function(date) {
18196           return date.getUTCMonth();
18197         });
18198         var utcMonths = utcMonth.range;
18199
18200         var utcYear = newInterval(function(date) {
18201           date.setUTCMonth(0, 1);
18202           date.setUTCHours(0, 0, 0, 0);
18203         }, function(date, step) {
18204           date.setUTCFullYear(date.getUTCFullYear() + step);
18205         }, function(start, end) {
18206           return end.getUTCFullYear() - start.getUTCFullYear();
18207         }, function(date) {
18208           return date.getUTCFullYear();
18209         });
18210
18211         // An optimized implementation for this simple case.
18212         utcYear.every = function(k) {
18213           return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) {
18214             date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k);
18215             date.setUTCMonth(0, 1);
18216             date.setUTCHours(0, 0, 0, 0);
18217           }, function(date, step) {
18218             date.setUTCFullYear(date.getUTCFullYear() + step * k);
18219           });
18220         };
18221         var utcYears = utcYear.range;
18222
18223         function localDate(d) {
18224           if (0 <= d.y && d.y < 100) {
18225             var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L);
18226             date.setFullYear(d.y);
18227             return date;
18228           }
18229           return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L);
18230         }
18231
18232         function utcDate(d) {
18233           if (0 <= d.y && d.y < 100) {
18234             var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L));
18235             date.setUTCFullYear(d.y);
18236             return date;
18237           }
18238           return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L));
18239         }
18240
18241         function newYear(y) {
18242           return {y: y, m: 0, d: 1, H: 0, M: 0, S: 0, L: 0};
18243         }
18244
18245         function formatLocale$1(locale) {
18246           var locale_dateTime = locale.dateTime,
18247               locale_date = locale.date,
18248               locale_time = locale.time,
18249               locale_periods = locale.periods,
18250               locale_weekdays = locale.days,
18251               locale_shortWeekdays = locale.shortDays,
18252               locale_months = locale.months,
18253               locale_shortMonths = locale.shortMonths;
18254
18255           var periodRe = formatRe(locale_periods),
18256               periodLookup = formatLookup(locale_periods),
18257               weekdayRe = formatRe(locale_weekdays),
18258               weekdayLookup = formatLookup(locale_weekdays),
18259               shortWeekdayRe = formatRe(locale_shortWeekdays),
18260               shortWeekdayLookup = formatLookup(locale_shortWeekdays),
18261               monthRe = formatRe(locale_months),
18262               monthLookup = formatLookup(locale_months),
18263               shortMonthRe = formatRe(locale_shortMonths),
18264               shortMonthLookup = formatLookup(locale_shortMonths);
18265
18266           var formats = {
18267             "a": formatShortWeekday,
18268             "A": formatWeekday,
18269             "b": formatShortMonth,
18270             "B": formatMonth,
18271             "c": null,
18272             "d": formatDayOfMonth,
18273             "e": formatDayOfMonth,
18274             "f": formatMicroseconds,
18275             "H": formatHour24,
18276             "I": formatHour12,
18277             "j": formatDayOfYear,
18278             "L": formatMilliseconds,
18279             "m": formatMonthNumber,
18280             "M": formatMinutes,
18281             "p": formatPeriod,
18282             "Q": formatUnixTimestamp,
18283             "s": formatUnixTimestampSeconds,
18284             "S": formatSeconds,
18285             "u": formatWeekdayNumberMonday,
18286             "U": formatWeekNumberSunday,
18287             "V": formatWeekNumberISO,
18288             "w": formatWeekdayNumberSunday,
18289             "W": formatWeekNumberMonday,
18290             "x": null,
18291             "X": null,
18292             "y": formatYear$1,
18293             "Y": formatFullYear,
18294             "Z": formatZone,
18295             "%": formatLiteralPercent
18296           };
18297
18298           var utcFormats = {
18299             "a": formatUTCShortWeekday,
18300             "A": formatUTCWeekday,
18301             "b": formatUTCShortMonth,
18302             "B": formatUTCMonth,
18303             "c": null,
18304             "d": formatUTCDayOfMonth,
18305             "e": formatUTCDayOfMonth,
18306             "f": formatUTCMicroseconds,
18307             "H": formatUTCHour24,
18308             "I": formatUTCHour12,
18309             "j": formatUTCDayOfYear,
18310             "L": formatUTCMilliseconds,
18311             "m": formatUTCMonthNumber,
18312             "M": formatUTCMinutes,
18313             "p": formatUTCPeriod,
18314             "Q": formatUnixTimestamp,
18315             "s": formatUnixTimestampSeconds,
18316             "S": formatUTCSeconds,
18317             "u": formatUTCWeekdayNumberMonday,
18318             "U": formatUTCWeekNumberSunday,
18319             "V": formatUTCWeekNumberISO,
18320             "w": formatUTCWeekdayNumberSunday,
18321             "W": formatUTCWeekNumberMonday,
18322             "x": null,
18323             "X": null,
18324             "y": formatUTCYear,
18325             "Y": formatUTCFullYear,
18326             "Z": formatUTCZone,
18327             "%": formatLiteralPercent
18328           };
18329
18330           var parses = {
18331             "a": parseShortWeekday,
18332             "A": parseWeekday,
18333             "b": parseShortMonth,
18334             "B": parseMonth,
18335             "c": parseLocaleDateTime,
18336             "d": parseDayOfMonth,
18337             "e": parseDayOfMonth,
18338             "f": parseMicroseconds,
18339             "H": parseHour24,
18340             "I": parseHour24,
18341             "j": parseDayOfYear,
18342             "L": parseMilliseconds,
18343             "m": parseMonthNumber,
18344             "M": parseMinutes,
18345             "p": parsePeriod,
18346             "Q": parseUnixTimestamp,
18347             "s": parseUnixTimestampSeconds,
18348             "S": parseSeconds,
18349             "u": parseWeekdayNumberMonday,
18350             "U": parseWeekNumberSunday,
18351             "V": parseWeekNumberISO,
18352             "w": parseWeekdayNumberSunday,
18353             "W": parseWeekNumberMonday,
18354             "x": parseLocaleDate,
18355             "X": parseLocaleTime,
18356             "y": parseYear,
18357             "Y": parseFullYear,
18358             "Z": parseZone,
18359             "%": parseLiteralPercent
18360           };
18361
18362           // These recursive directive definitions must be deferred.
18363           formats.x = newFormat(locale_date, formats);
18364           formats.X = newFormat(locale_time, formats);
18365           formats.c = newFormat(locale_dateTime, formats);
18366           utcFormats.x = newFormat(locale_date, utcFormats);
18367           utcFormats.X = newFormat(locale_time, utcFormats);
18368           utcFormats.c = newFormat(locale_dateTime, utcFormats);
18369
18370           function newFormat(specifier, formats) {
18371             return function(date) {
18372               var string = [],
18373                   i = -1,
18374                   j = 0,
18375                   n = specifier.length,
18376                   c,
18377                   pad,
18378                   format;
18379
18380               if (!(date instanceof Date)) date = new Date(+date);
18381
18382               while (++i < n) {
18383                 if (specifier.charCodeAt(i) === 37) {
18384                   string.push(specifier.slice(j, i));
18385                   if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i);
18386                   else pad = c === "e" ? " " : "0";
18387                   if (format = formats[c]) c = format(date, pad);
18388                   string.push(c);
18389                   j = i + 1;
18390                 }
18391               }
18392
18393               string.push(specifier.slice(j, i));
18394               return string.join("");
18395             };
18396           }
18397
18398           function newParse(specifier, newDate) {
18399             return function(string) {
18400               var d = newYear(1900),
18401                   i = parseSpecifier(d, specifier, string += "", 0),
18402                   week, day$1;
18403               if (i != string.length) return null;
18404
18405               // If a UNIX timestamp is specified, return it.
18406               if ("Q" in d) return new Date(d.Q);
18407
18408               // The am-pm flag is 0 for AM, and 1 for PM.
18409               if ("p" in d) d.H = d.H % 12 + d.p * 12;
18410
18411               // Convert day-of-week and week-of-year to day-of-year.
18412               if ("V" in d) {
18413                 if (d.V < 1 || d.V > 53) return null;
18414                 if (!("w" in d)) d.w = 1;
18415                 if ("Z" in d) {
18416                   week = utcDate(newYear(d.y)), day$1 = week.getUTCDay();
18417                   week = day$1 > 4 || day$1 === 0 ? utcMonday.ceil(week) : utcMonday(week);
18418                   week = utcDay.offset(week, (d.V - 1) * 7);
18419                   d.y = week.getUTCFullYear();
18420                   d.m = week.getUTCMonth();
18421                   d.d = week.getUTCDate() + (d.w + 6) % 7;
18422                 } else {
18423                   week = newDate(newYear(d.y)), day$1 = week.getDay();
18424                   week = day$1 > 4 || day$1 === 0 ? monday.ceil(week) : monday(week);
18425                   week = day.offset(week, (d.V - 1) * 7);
18426                   d.y = week.getFullYear();
18427                   d.m = week.getMonth();
18428                   d.d = week.getDate() + (d.w + 6) % 7;
18429                 }
18430               } else if ("W" in d || "U" in d) {
18431                 if (!("w" in d)) d.w = "u" in d ? d.u % 7 : "W" in d ? 1 : 0;
18432                 day$1 = "Z" in d ? utcDate(newYear(d.y)).getUTCDay() : newDate(newYear(d.y)).getDay();
18433                 d.m = 0;
18434                 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;
18435               }
18436
18437               // If a time zone is specified, all fields are interpreted as UTC and then
18438               // offset according to the specified time zone.
18439               if ("Z" in d) {
18440                 d.H += d.Z / 100 | 0;
18441                 d.M += d.Z % 100;
18442                 return utcDate(d);
18443               }
18444
18445               // Otherwise, all fields are in local time.
18446               return newDate(d);
18447             };
18448           }
18449
18450           function parseSpecifier(d, specifier, string, j) {
18451             var i = 0,
18452                 n = specifier.length,
18453                 m = string.length,
18454                 c,
18455                 parse;
18456
18457             while (i < n) {
18458               if (j >= m) return -1;
18459               c = specifier.charCodeAt(i++);
18460               if (c === 37) {
18461                 c = specifier.charAt(i++);
18462                 parse = parses[c in pads ? specifier.charAt(i++) : c];
18463                 if (!parse || ((j = parse(d, string, j)) < 0)) return -1;
18464               } else if (c != string.charCodeAt(j++)) {
18465                 return -1;
18466               }
18467             }
18468
18469             return j;
18470           }
18471
18472           function parsePeriod(d, string, i) {
18473             var n = periodRe.exec(string.slice(i));
18474             return n ? (d.p = periodLookup[n[0].toLowerCase()], i + n[0].length) : -1;
18475           }
18476
18477           function parseShortWeekday(d, string, i) {
18478             var n = shortWeekdayRe.exec(string.slice(i));
18479             return n ? (d.w = shortWeekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;
18480           }
18481
18482           function parseWeekday(d, string, i) {
18483             var n = weekdayRe.exec(string.slice(i));
18484             return n ? (d.w = weekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;
18485           }
18486
18487           function parseShortMonth(d, string, i) {
18488             var n = shortMonthRe.exec(string.slice(i));
18489             return n ? (d.m = shortMonthLookup[n[0].toLowerCase()], i + n[0].length) : -1;
18490           }
18491
18492           function parseMonth(d, string, i) {
18493             var n = monthRe.exec(string.slice(i));
18494             return n ? (d.m = monthLookup[n[0].toLowerCase()], i + n[0].length) : -1;
18495           }
18496
18497           function parseLocaleDateTime(d, string, i) {
18498             return parseSpecifier(d, locale_dateTime, string, i);
18499           }
18500
18501           function parseLocaleDate(d, string, i) {
18502             return parseSpecifier(d, locale_date, string, i);
18503           }
18504
18505           function parseLocaleTime(d, string, i) {
18506             return parseSpecifier(d, locale_time, string, i);
18507           }
18508
18509           function formatShortWeekday(d) {
18510             return locale_shortWeekdays[d.getDay()];
18511           }
18512
18513           function formatWeekday(d) {
18514             return locale_weekdays[d.getDay()];
18515           }
18516
18517           function formatShortMonth(d) {
18518             return locale_shortMonths[d.getMonth()];
18519           }
18520
18521           function formatMonth(d) {
18522             return locale_months[d.getMonth()];
18523           }
18524
18525           function formatPeriod(d) {
18526             return locale_periods[+(d.getHours() >= 12)];
18527           }
18528
18529           function formatUTCShortWeekday(d) {
18530             return locale_shortWeekdays[d.getUTCDay()];
18531           }
18532
18533           function formatUTCWeekday(d) {
18534             return locale_weekdays[d.getUTCDay()];
18535           }
18536
18537           function formatUTCShortMonth(d) {
18538             return locale_shortMonths[d.getUTCMonth()];
18539           }
18540
18541           function formatUTCMonth(d) {
18542             return locale_months[d.getUTCMonth()];
18543           }
18544
18545           function formatUTCPeriod(d) {
18546             return locale_periods[+(d.getUTCHours() >= 12)];
18547           }
18548
18549           return {
18550             format: function(specifier) {
18551               var f = newFormat(specifier += "", formats);
18552               f.toString = function() { return specifier; };
18553               return f;
18554             },
18555             parse: function(specifier) {
18556               var p = newParse(specifier += "", localDate);
18557               p.toString = function() { return specifier; };
18558               return p;
18559             },
18560             utcFormat: function(specifier) {
18561               var f = newFormat(specifier += "", utcFormats);
18562               f.toString = function() { return specifier; };
18563               return f;
18564             },
18565             utcParse: function(specifier) {
18566               var p = newParse(specifier, utcDate);
18567               p.toString = function() { return specifier; };
18568               return p;
18569             }
18570           };
18571         }
18572
18573         var pads = {"-": "", "_": " ", "0": "0"},
18574             numberRe = /^\s*\d+/, // note: ignores next directive
18575             percentRe = /^%/,
18576             requoteRe = /[\\^$*+?|[\]().{}]/g;
18577
18578         function pad$1(value, fill, width) {
18579           var sign = value < 0 ? "-" : "",
18580               string = (sign ? -value : value) + "",
18581               length = string.length;
18582           return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);
18583         }
18584
18585         function requote(s) {
18586           return s.replace(requoteRe, "\\$&");
18587         }
18588
18589         function formatRe(names) {
18590           return new RegExp("^(?:" + names.map(requote).join("|") + ")", "i");
18591         }
18592
18593         function formatLookup(names) {
18594           var map = {}, i = -1, n = names.length;
18595           while (++i < n) map[names[i].toLowerCase()] = i;
18596           return map;
18597         }
18598
18599         function parseWeekdayNumberSunday(d, string, i) {
18600           var n = numberRe.exec(string.slice(i, i + 1));
18601           return n ? (d.w = +n[0], i + n[0].length) : -1;
18602         }
18603
18604         function parseWeekdayNumberMonday(d, string, i) {
18605           var n = numberRe.exec(string.slice(i, i + 1));
18606           return n ? (d.u = +n[0], i + n[0].length) : -1;
18607         }
18608
18609         function parseWeekNumberSunday(d, string, i) {
18610           var n = numberRe.exec(string.slice(i, i + 2));
18611           return n ? (d.U = +n[0], i + n[0].length) : -1;
18612         }
18613
18614         function parseWeekNumberISO(d, string, i) {
18615           var n = numberRe.exec(string.slice(i, i + 2));
18616           return n ? (d.V = +n[0], i + n[0].length) : -1;
18617         }
18618
18619         function parseWeekNumberMonday(d, string, i) {
18620           var n = numberRe.exec(string.slice(i, i + 2));
18621           return n ? (d.W = +n[0], i + n[0].length) : -1;
18622         }
18623
18624         function parseFullYear(d, string, i) {
18625           var n = numberRe.exec(string.slice(i, i + 4));
18626           return n ? (d.y = +n[0], i + n[0].length) : -1;
18627         }
18628
18629         function parseYear(d, string, i) {
18630           var n = numberRe.exec(string.slice(i, i + 2));
18631           return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1;
18632         }
18633
18634         function parseZone(d, string, i) {
18635           var n = /^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(string.slice(i, i + 6));
18636           return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || "00")), i + n[0].length) : -1;
18637         }
18638
18639         function parseMonthNumber(d, string, i) {
18640           var n = numberRe.exec(string.slice(i, i + 2));
18641           return n ? (d.m = n[0] - 1, i + n[0].length) : -1;
18642         }
18643
18644         function parseDayOfMonth(d, string, i) {
18645           var n = numberRe.exec(string.slice(i, i + 2));
18646           return n ? (d.d = +n[0], i + n[0].length) : -1;
18647         }
18648
18649         function parseDayOfYear(d, string, i) {
18650           var n = numberRe.exec(string.slice(i, i + 3));
18651           return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1;
18652         }
18653
18654         function parseHour24(d, string, i) {
18655           var n = numberRe.exec(string.slice(i, i + 2));
18656           return n ? (d.H = +n[0], i + n[0].length) : -1;
18657         }
18658
18659         function parseMinutes(d, string, i) {
18660           var n = numberRe.exec(string.slice(i, i + 2));
18661           return n ? (d.M = +n[0], i + n[0].length) : -1;
18662         }
18663
18664         function parseSeconds(d, string, i) {
18665           var n = numberRe.exec(string.slice(i, i + 2));
18666           return n ? (d.S = +n[0], i + n[0].length) : -1;
18667         }
18668
18669         function parseMilliseconds(d, string, i) {
18670           var n = numberRe.exec(string.slice(i, i + 3));
18671           return n ? (d.L = +n[0], i + n[0].length) : -1;
18672         }
18673
18674         function parseMicroseconds(d, string, i) {
18675           var n = numberRe.exec(string.slice(i, i + 6));
18676           return n ? (d.L = Math.floor(n[0] / 1000), i + n[0].length) : -1;
18677         }
18678
18679         function parseLiteralPercent(d, string, i) {
18680           var n = percentRe.exec(string.slice(i, i + 1));
18681           return n ? i + n[0].length : -1;
18682         }
18683
18684         function parseUnixTimestamp(d, string, i) {
18685           var n = numberRe.exec(string.slice(i));
18686           return n ? (d.Q = +n[0], i + n[0].length) : -1;
18687         }
18688
18689         function parseUnixTimestampSeconds(d, string, i) {
18690           var n = numberRe.exec(string.slice(i));
18691           return n ? (d.Q = (+n[0]) * 1000, i + n[0].length) : -1;
18692         }
18693
18694         function formatDayOfMonth(d, p) {
18695           return pad$1(d.getDate(), p, 2);
18696         }
18697
18698         function formatHour24(d, p) {
18699           return pad$1(d.getHours(), p, 2);
18700         }
18701
18702         function formatHour12(d, p) {
18703           return pad$1(d.getHours() % 12 || 12, p, 2);
18704         }
18705
18706         function formatDayOfYear(d, p) {
18707           return pad$1(1 + day.count(year(d), d), p, 3);
18708         }
18709
18710         function formatMilliseconds(d, p) {
18711           return pad$1(d.getMilliseconds(), p, 3);
18712         }
18713
18714         function formatMicroseconds(d, p) {
18715           return formatMilliseconds(d, p) + "000";
18716         }
18717
18718         function formatMonthNumber(d, p) {
18719           return pad$1(d.getMonth() + 1, p, 2);
18720         }
18721
18722         function formatMinutes(d, p) {
18723           return pad$1(d.getMinutes(), p, 2);
18724         }
18725
18726         function formatSeconds(d, p) {
18727           return pad$1(d.getSeconds(), p, 2);
18728         }
18729
18730         function formatWeekdayNumberMonday(d) {
18731           var day = d.getDay();
18732           return day === 0 ? 7 : day;
18733         }
18734
18735         function formatWeekNumberSunday(d, p) {
18736           return pad$1(sunday.count(year(d), d), p, 2);
18737         }
18738
18739         function formatWeekNumberISO(d, p) {
18740           var day = d.getDay();
18741           d = (day >= 4 || day === 0) ? thursday(d) : thursday.ceil(d);
18742           return pad$1(thursday.count(year(d), d) + (year(d).getDay() === 4), p, 2);
18743         }
18744
18745         function formatWeekdayNumberSunday(d) {
18746           return d.getDay();
18747         }
18748
18749         function formatWeekNumberMonday(d, p) {
18750           return pad$1(monday.count(year(d), d), p, 2);
18751         }
18752
18753         function formatYear$1(d, p) {
18754           return pad$1(d.getFullYear() % 100, p, 2);
18755         }
18756
18757         function formatFullYear(d, p) {
18758           return pad$1(d.getFullYear() % 10000, p, 4);
18759         }
18760
18761         function formatZone(d) {
18762           var z = d.getTimezoneOffset();
18763           return (z > 0 ? "-" : (z *= -1, "+"))
18764               + pad$1(z / 60 | 0, "0", 2)
18765               + pad$1(z % 60, "0", 2);
18766         }
18767
18768         function formatUTCDayOfMonth(d, p) {
18769           return pad$1(d.getUTCDate(), p, 2);
18770         }
18771
18772         function formatUTCHour24(d, p) {
18773           return pad$1(d.getUTCHours(), p, 2);
18774         }
18775
18776         function formatUTCHour12(d, p) {
18777           return pad$1(d.getUTCHours() % 12 || 12, p, 2);
18778         }
18779
18780         function formatUTCDayOfYear(d, p) {
18781           return pad$1(1 + utcDay.count(utcYear(d), d), p, 3);
18782         }
18783
18784         function formatUTCMilliseconds(d, p) {
18785           return pad$1(d.getUTCMilliseconds(), p, 3);
18786         }
18787
18788         function formatUTCMicroseconds(d, p) {
18789           return formatUTCMilliseconds(d, p) + "000";
18790         }
18791
18792         function formatUTCMonthNumber(d, p) {
18793           return pad$1(d.getUTCMonth() + 1, p, 2);
18794         }
18795
18796         function formatUTCMinutes(d, p) {
18797           return pad$1(d.getUTCMinutes(), p, 2);
18798         }
18799
18800         function formatUTCSeconds(d, p) {
18801           return pad$1(d.getUTCSeconds(), p, 2);
18802         }
18803
18804         function formatUTCWeekdayNumberMonday(d) {
18805           var dow = d.getUTCDay();
18806           return dow === 0 ? 7 : dow;
18807         }
18808
18809         function formatUTCWeekNumberSunday(d, p) {
18810           return pad$1(utcSunday.count(utcYear(d), d), p, 2);
18811         }
18812
18813         function formatUTCWeekNumberISO(d, p) {
18814           var day = d.getUTCDay();
18815           d = (day >= 4 || day === 0) ? utcThursday(d) : utcThursday.ceil(d);
18816           return pad$1(utcThursday.count(utcYear(d), d) + (utcYear(d).getUTCDay() === 4), p, 2);
18817         }
18818
18819         function formatUTCWeekdayNumberSunday(d) {
18820           return d.getUTCDay();
18821         }
18822
18823         function formatUTCWeekNumberMonday(d, p) {
18824           return pad$1(utcMonday.count(utcYear(d), d), p, 2);
18825         }
18826
18827         function formatUTCYear(d, p) {
18828           return pad$1(d.getUTCFullYear() % 100, p, 2);
18829         }
18830
18831         function formatUTCFullYear(d, p) {
18832           return pad$1(d.getUTCFullYear() % 10000, p, 4);
18833         }
18834
18835         function formatUTCZone() {
18836           return "+0000";
18837         }
18838
18839         function formatLiteralPercent() {
18840           return "%";
18841         }
18842
18843         function formatUnixTimestamp(d) {
18844           return +d;
18845         }
18846
18847         function formatUnixTimestampSeconds(d) {
18848           return Math.floor(+d / 1000);
18849         }
18850
18851         var locale$1;
18852         var timeFormat;
18853         var timeParse;
18854         var utcFormat;
18855         var utcParse;
18856
18857         defaultLocale$1({
18858           dateTime: "%x, %X",
18859           date: "%-m/%-d/%Y",
18860           time: "%-I:%M:%S %p",
18861           periods: ["AM", "PM"],
18862           days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
18863           shortDays: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
18864           months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
18865           shortMonths: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
18866         });
18867
18868         function defaultLocale$1(definition) {
18869           locale$1 = formatLocale$1(definition);
18870           timeFormat = locale$1.format;
18871           timeParse = locale$1.parse;
18872           utcFormat = locale$1.utcFormat;
18873           utcParse = locale$1.utcParse;
18874           return locale$1;
18875         }
18876
18877         var isoSpecifier = "%Y-%m-%dT%H:%M:%S.%LZ";
18878
18879         function formatIsoNative(date) {
18880           return date.toISOString();
18881         }
18882
18883         var formatIso = Date.prototype.toISOString
18884             ? formatIsoNative
18885             : utcFormat(isoSpecifier);
18886
18887         function parseIsoNative(string) {
18888           var date = new Date(string);
18889           return isNaN(date) ? null : date;
18890         }
18891
18892         var parseIso = +new Date("2000-01-01T00:00:00.000Z")
18893             ? parseIsoNative
18894             : utcParse(isoSpecifier);
18895
18896         var durationSecond$1 = 1000,
18897             durationMinute$1 = durationSecond$1 * 60,
18898             durationHour$1 = durationMinute$1 * 60,
18899             durationDay$1 = durationHour$1 * 24,
18900             durationWeek$1 = durationDay$1 * 7,
18901             durationMonth = durationDay$1 * 30,
18902             durationYear = durationDay$1 * 365;
18903
18904         function date$1(t) {
18905           return new Date(t);
18906         }
18907
18908         function number$3(t) {
18909           return t instanceof Date ? +t : +new Date(+t);
18910         }
18911
18912         function calendar(year, month, week, day, hour, minute, second, millisecond, format) {
18913           var scale = continuous(identity$5, identity$5),
18914               invert = scale.invert,
18915               domain = scale.domain;
18916
18917           var formatMillisecond = format(".%L"),
18918               formatSecond = format(":%S"),
18919               formatMinute = format("%I:%M"),
18920               formatHour = format("%I %p"),
18921               formatDay = format("%a %d"),
18922               formatWeek = format("%b %d"),
18923               formatMonth = format("%B"),
18924               formatYear = format("%Y");
18925
18926           var tickIntervals = [
18927             [second,  1,      durationSecond$1],
18928             [second,  5,  5 * durationSecond$1],
18929             [second, 15, 15 * durationSecond$1],
18930             [second, 30, 30 * durationSecond$1],
18931             [minute,  1,      durationMinute$1],
18932             [minute,  5,  5 * durationMinute$1],
18933             [minute, 15, 15 * durationMinute$1],
18934             [minute, 30, 30 * durationMinute$1],
18935             [  hour,  1,      durationHour$1  ],
18936             [  hour,  3,  3 * durationHour$1  ],
18937             [  hour,  6,  6 * durationHour$1  ],
18938             [  hour, 12, 12 * durationHour$1  ],
18939             [   day,  1,      durationDay$1   ],
18940             [   day,  2,  2 * durationDay$1   ],
18941             [  week,  1,      durationWeek$1  ],
18942             [ month,  1,      durationMonth ],
18943             [ month,  3,  3 * durationMonth ],
18944             [  year,  1,      durationYear  ]
18945           ];
18946
18947           function tickFormat(date) {
18948             return (second(date) < date ? formatMillisecond
18949                 : minute(date) < date ? formatSecond
18950                 : hour(date) < date ? formatMinute
18951                 : day(date) < date ? formatHour
18952                 : month(date) < date ? (week(date) < date ? formatDay : formatWeek)
18953                 : year(date) < date ? formatMonth
18954                 : formatYear)(date);
18955           }
18956
18957           function tickInterval(interval, start, stop, step) {
18958             if (interval == null) interval = 10;
18959
18960             // If a desired tick count is specified, pick a reasonable tick interval
18961             // based on the extent of the domain and a rough estimate of tick size.
18962             // Otherwise, assume interval is already a time interval and use it.
18963             if (typeof interval === "number") {
18964               var target = Math.abs(stop - start) / interval,
18965                   i = d3_bisector(function(i) { return i[2]; }).right(tickIntervals, target);
18966               if (i === tickIntervals.length) {
18967                 step = tickStep(start / durationYear, stop / durationYear, interval);
18968                 interval = year;
18969               } else if (i) {
18970                 i = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i];
18971                 step = i[1];
18972                 interval = i[0];
18973               } else {
18974                 step = Math.max(tickStep(start, stop, interval), 1);
18975                 interval = millisecond;
18976               }
18977             }
18978
18979             return step == null ? interval : interval.every(step);
18980           }
18981
18982           scale.invert = function(y) {
18983             return new Date(invert(y));
18984           };
18985
18986           scale.domain = function(_) {
18987             return arguments.length ? domain(map$4.call(_, number$3)) : domain().map(date$1);
18988           };
18989
18990           scale.ticks = function(interval, step) {
18991             var d = domain(),
18992                 t0 = d[0],
18993                 t1 = d[d.length - 1],
18994                 r = t1 < t0,
18995                 t;
18996             if (r) t = t0, t0 = t1, t1 = t;
18997             t = tickInterval(interval, t0, t1, step);
18998             t = t ? t.range(t0, t1 + 1) : []; // inclusive stop
18999             return r ? t.reverse() : t;
19000           };
19001
19002           scale.tickFormat = function(count, specifier) {
19003             return specifier == null ? tickFormat : format(specifier);
19004           };
19005
19006           scale.nice = function(interval, step) {
19007             var d = domain();
19008             return (interval = tickInterval(interval, d[0], d[d.length - 1], step))
19009                 ? domain(nice(d, interval))
19010                 : scale;
19011           };
19012
19013           scale.copy = function() {
19014             return copy$1(scale, calendar(year, month, week, day, hour, minute, second, millisecond, format));
19015           };
19016
19017           return scale;
19018         }
19019
19020         function time() {
19021           return initRange.apply(calendar(year, month, sunday, day, hour, minute, second, millisecond, timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]), arguments);
19022         }
19023
19024         function utcTime() {
19025           return initRange.apply(calendar(utcYear, utcMonth, utcSunday, utcDay, utcHour, utcMinute, second, millisecond, utcFormat).domain([Date.UTC(2000, 0, 1), Date.UTC(2000, 0, 2)]), arguments);
19026         }
19027
19028         function transformer$2() {
19029           var x0 = 0,
19030               x1 = 1,
19031               t0,
19032               t1,
19033               k10,
19034               transform,
19035               interpolator = identity$5,
19036               clamp = false,
19037               unknown;
19038
19039           function scale(x) {
19040             return isNaN(x = +x) ? unknown : interpolator(k10 === 0 ? 0.5 : (x = (transform(x) - t0) * k10, clamp ? Math.max(0, Math.min(1, x)) : x));
19041           }
19042
19043           scale.domain = function(_) {
19044             return arguments.length ? (t0 = transform(x0 = +_[0]), t1 = transform(x1 = +_[1]), k10 = t0 === t1 ? 0 : 1 / (t1 - t0), scale) : [x0, x1];
19045           };
19046
19047           scale.clamp = function(_) {
19048             return arguments.length ? (clamp = !!_, scale) : clamp;
19049           };
19050
19051           scale.interpolator = function(_) {
19052             return arguments.length ? (interpolator = _, scale) : interpolator;
19053           };
19054
19055           scale.unknown = function(_) {
19056             return arguments.length ? (unknown = _, scale) : unknown;
19057           };
19058
19059           return function(t) {
19060             transform = t, t0 = t(x0), t1 = t(x1), k10 = t0 === t1 ? 0 : 1 / (t1 - t0);
19061             return scale;
19062           };
19063         }
19064
19065         function copy$2(source, target) {
19066           return target
19067               .domain(source.domain())
19068               .interpolator(source.interpolator())
19069               .clamp(source.clamp())
19070               .unknown(source.unknown());
19071         }
19072
19073         function sequential() {
19074           var scale = linearish(transformer$2()(identity$5));
19075
19076           scale.copy = function() {
19077             return copy$2(scale, sequential());
19078           };
19079
19080           return initInterpolator.apply(scale, arguments);
19081         }
19082
19083         function sequentialLog() {
19084           var scale = loggish(transformer$2()).domain([1, 10]);
19085
19086           scale.copy = function() {
19087             return copy$2(scale, sequentialLog()).base(scale.base());
19088           };
19089
19090           return initInterpolator.apply(scale, arguments);
19091         }
19092
19093         function sequentialSymlog() {
19094           var scale = symlogish(transformer$2());
19095
19096           scale.copy = function() {
19097             return copy$2(scale, sequentialSymlog()).constant(scale.constant());
19098           };
19099
19100           return initInterpolator.apply(scale, arguments);
19101         }
19102
19103         function sequentialPow() {
19104           var scale = powish(transformer$2());
19105
19106           scale.copy = function() {
19107             return copy$2(scale, sequentialPow()).exponent(scale.exponent());
19108           };
19109
19110           return initInterpolator.apply(scale, arguments);
19111         }
19112
19113         function sequentialSqrt() {
19114           return sequentialPow.apply(null, arguments).exponent(0.5);
19115         }
19116
19117         function sequentialQuantile() {
19118           var domain = [],
19119               interpolator = identity$5;
19120
19121           function scale(x) {
19122             if (!isNaN(x = +x)) return interpolator((bisectRight(domain, x) - 1) / (domain.length - 1));
19123           }
19124
19125           scale.domain = function(_) {
19126             if (!arguments.length) return domain.slice();
19127             domain = [];
19128             for (var i = 0, n = _.length, d; i < n; ++i) if (d = _[i], d != null && !isNaN(d = +d)) domain.push(d);
19129             domain.sort(d3_ascending);
19130             return scale;
19131           };
19132
19133           scale.interpolator = function(_) {
19134             return arguments.length ? (interpolator = _, scale) : interpolator;
19135           };
19136
19137           scale.copy = function() {
19138             return sequentialQuantile(interpolator).domain(domain);
19139           };
19140
19141           return initInterpolator.apply(scale, arguments);
19142         }
19143
19144         function transformer$3() {
19145           var x0 = 0,
19146               x1 = 0.5,
19147               x2 = 1,
19148               t0,
19149               t1,
19150               t2,
19151               k10,
19152               k21,
19153               interpolator = identity$5,
19154               transform,
19155               clamp = false,
19156               unknown;
19157
19158           function scale(x) {
19159             return isNaN(x = +x) ? unknown : (x = 0.5 + ((x = +transform(x)) - t1) * (x < t1 ? k10 : k21), interpolator(clamp ? Math.max(0, Math.min(1, x)) : x));
19160           }
19161
19162           scale.domain = function(_) {
19163             return arguments.length ? (t0 = transform(x0 = +_[0]), t1 = transform(x1 = +_[1]), t2 = transform(x2 = +_[2]), k10 = t0 === t1 ? 0 : 0.5 / (t1 - t0), k21 = t1 === t2 ? 0 : 0.5 / (t2 - t1), scale) : [x0, x1, x2];
19164           };
19165
19166           scale.clamp = function(_) {
19167             return arguments.length ? (clamp = !!_, scale) : clamp;
19168           };
19169
19170           scale.interpolator = function(_) {
19171             return arguments.length ? (interpolator = _, scale) : interpolator;
19172           };
19173
19174           scale.unknown = function(_) {
19175             return arguments.length ? (unknown = _, scale) : unknown;
19176           };
19177
19178           return function(t) {
19179             transform = t, t0 = t(x0), t1 = t(x1), t2 = t(x2), k10 = t0 === t1 ? 0 : 0.5 / (t1 - t0), k21 = t1 === t2 ? 0 : 0.5 / (t2 - t1);
19180             return scale;
19181           };
19182         }
19183
19184         function diverging() {
19185           var scale = linearish(transformer$3()(identity$5));
19186
19187           scale.copy = function() {
19188             return copy$2(scale, diverging());
19189           };
19190
19191           return initInterpolator.apply(scale, arguments);
19192         }
19193
19194         function divergingLog() {
19195           var scale = loggish(transformer$3()).domain([0.1, 1, 10]);
19196
19197           scale.copy = function() {
19198             return copy$2(scale, divergingLog()).base(scale.base());
19199           };
19200
19201           return initInterpolator.apply(scale, arguments);
19202         }
19203
19204         function divergingSymlog() {
19205           var scale = symlogish(transformer$3());
19206
19207           scale.copy = function() {
19208             return copy$2(scale, divergingSymlog()).constant(scale.constant());
19209           };
19210
19211           return initInterpolator.apply(scale, arguments);
19212         }
19213
19214         function divergingPow() {
19215           var scale = powish(transformer$3());
19216
19217           scale.copy = function() {
19218             return copy$2(scale, divergingPow()).exponent(scale.exponent());
19219           };
19220
19221           return initInterpolator.apply(scale, arguments);
19222         }
19223
19224         function divergingSqrt() {
19225           return divergingPow.apply(null, arguments).exponent(0.5);
19226         }
19227
19228         function colors(specifier) {
19229           var n = specifier.length / 6 | 0, colors = new Array(n), i = 0;
19230           while (i < n) colors[i] = "#" + specifier.slice(i * 6, ++i * 6);
19231           return colors;
19232         }
19233
19234         var category10 = colors("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf");
19235
19236         var Accent = colors("7fc97fbeaed4fdc086ffff99386cb0f0027fbf5b17666666");
19237
19238         var Dark2 = colors("1b9e77d95f027570b3e7298a66a61ee6ab02a6761d666666");
19239
19240         var Paired = colors("a6cee31f78b4b2df8a33a02cfb9a99e31a1cfdbf6fff7f00cab2d66a3d9affff99b15928");
19241
19242         var Pastel1 = colors("fbb4aeb3cde3ccebc5decbe4fed9a6ffffcce5d8bdfddaecf2f2f2");
19243
19244         var Pastel2 = colors("b3e2cdfdcdaccbd5e8f4cae4e6f5c9fff2aef1e2cccccccc");
19245
19246         var Set1 = colors("e41a1c377eb84daf4a984ea3ff7f00ffff33a65628f781bf999999");
19247
19248         var Set2 = colors("66c2a5fc8d628da0cbe78ac3a6d854ffd92fe5c494b3b3b3");
19249
19250         var Set3 = colors("8dd3c7ffffb3bebadafb807280b1d3fdb462b3de69fccde5d9d9d9bc80bdccebc5ffed6f");
19251
19252         function ramp(scheme) {
19253           return rgbBasis(scheme[scheme.length - 1]);
19254         }
19255
19256         var scheme = new Array(3).concat(
19257           "d8b365f5f5f55ab4ac",
19258           "a6611adfc27d80cdc1018571",
19259           "a6611adfc27df5f5f580cdc1018571",
19260           "8c510ad8b365f6e8c3c7eae55ab4ac01665e",
19261           "8c510ad8b365f6e8c3f5f5f5c7eae55ab4ac01665e",
19262           "8c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e",
19263           "8c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e",
19264           "5430058c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e003c30",
19265           "5430058c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e003c30"
19266         ).map(colors);
19267
19268         var BrBG = ramp(scheme);
19269
19270         var scheme$1 = new Array(3).concat(
19271           "af8dc3f7f7f77fbf7b",
19272           "7b3294c2a5cfa6dba0008837",
19273           "7b3294c2a5cff7f7f7a6dba0008837",
19274           "762a83af8dc3e7d4e8d9f0d37fbf7b1b7837",
19275           "762a83af8dc3e7d4e8f7f7f7d9f0d37fbf7b1b7837",
19276           "762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b7837",
19277           "762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b7837",
19278           "40004b762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b783700441b",
19279           "40004b762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b783700441b"
19280         ).map(colors);
19281
19282         var PRGn = ramp(scheme$1);
19283
19284         var scheme$2 = new Array(3).concat(
19285           "e9a3c9f7f7f7a1d76a",
19286           "d01c8bf1b6dab8e1864dac26",
19287           "d01c8bf1b6daf7f7f7b8e1864dac26",
19288           "c51b7de9a3c9fde0efe6f5d0a1d76a4d9221",
19289           "c51b7de9a3c9fde0eff7f7f7e6f5d0a1d76a4d9221",
19290           "c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221",
19291           "c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221",
19292           "8e0152c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221276419",
19293           "8e0152c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221276419"
19294         ).map(colors);
19295
19296         var PiYG = ramp(scheme$2);
19297
19298         var scheme$3 = new Array(3).concat(
19299           "998ec3f7f7f7f1a340",
19300           "5e3c99b2abd2fdb863e66101",
19301           "5e3c99b2abd2f7f7f7fdb863e66101",
19302           "542788998ec3d8daebfee0b6f1a340b35806",
19303           "542788998ec3d8daebf7f7f7fee0b6f1a340b35806",
19304           "5427888073acb2abd2d8daebfee0b6fdb863e08214b35806",
19305           "5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b35806",
19306           "2d004b5427888073acb2abd2d8daebfee0b6fdb863e08214b358067f3b08",
19307           "2d004b5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b358067f3b08"
19308         ).map(colors);
19309
19310         var PuOr = ramp(scheme$3);
19311
19312         var scheme$4 = new Array(3).concat(
19313           "ef8a62f7f7f767a9cf",
19314           "ca0020f4a58292c5de0571b0",
19315           "ca0020f4a582f7f7f792c5de0571b0",
19316           "b2182bef8a62fddbc7d1e5f067a9cf2166ac",
19317           "b2182bef8a62fddbc7f7f7f7d1e5f067a9cf2166ac",
19318           "b2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac",
19319           "b2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac",
19320           "67001fb2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac053061",
19321           "67001fb2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac053061"
19322         ).map(colors);
19323
19324         var RdBu = ramp(scheme$4);
19325
19326         var scheme$5 = new Array(3).concat(
19327           "ef8a62ffffff999999",
19328           "ca0020f4a582bababa404040",
19329           "ca0020f4a582ffffffbababa404040",
19330           "b2182bef8a62fddbc7e0e0e09999994d4d4d",
19331           "b2182bef8a62fddbc7ffffffe0e0e09999994d4d4d",
19332           "b2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d",
19333           "b2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d",
19334           "67001fb2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d1a1a1a",
19335           "67001fb2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d1a1a1a"
19336         ).map(colors);
19337
19338         var RdGy = ramp(scheme$5);
19339
19340         var scheme$6 = new Array(3).concat(
19341           "fc8d59ffffbf91bfdb",
19342           "d7191cfdae61abd9e92c7bb6",
19343           "d7191cfdae61ffffbfabd9e92c7bb6",
19344           "d73027fc8d59fee090e0f3f891bfdb4575b4",
19345           "d73027fc8d59fee090ffffbfe0f3f891bfdb4575b4",
19346           "d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4",
19347           "d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4",
19348           "a50026d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4313695",
19349           "a50026d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4313695"
19350         ).map(colors);
19351
19352         var RdYlBu = ramp(scheme$6);
19353
19354         var scheme$7 = new Array(3).concat(
19355           "fc8d59ffffbf91cf60",
19356           "d7191cfdae61a6d96a1a9641",
19357           "d7191cfdae61ffffbfa6d96a1a9641",
19358           "d73027fc8d59fee08bd9ef8b91cf601a9850",
19359           "d73027fc8d59fee08bffffbfd9ef8b91cf601a9850",
19360           "d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850",
19361           "d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850",
19362           "a50026d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850006837",
19363           "a50026d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850006837"
19364         ).map(colors);
19365
19366         var RdYlGn = ramp(scheme$7);
19367
19368         var scheme$8 = new Array(3).concat(
19369           "fc8d59ffffbf99d594",
19370           "d7191cfdae61abdda42b83ba",
19371           "d7191cfdae61ffffbfabdda42b83ba",
19372           "d53e4ffc8d59fee08be6f59899d5943288bd",
19373           "d53e4ffc8d59fee08bffffbfe6f59899d5943288bd",
19374           "d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd",
19375           "d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd",
19376           "9e0142d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd5e4fa2",
19377           "9e0142d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd5e4fa2"
19378         ).map(colors);
19379
19380         var Spectral = ramp(scheme$8);
19381
19382         var scheme$9 = new Array(3).concat(
19383           "e5f5f999d8c92ca25f",
19384           "edf8fbb2e2e266c2a4238b45",
19385           "edf8fbb2e2e266c2a42ca25f006d2c",
19386           "edf8fbccece699d8c966c2a42ca25f006d2c",
19387           "edf8fbccece699d8c966c2a441ae76238b45005824",
19388           "f7fcfde5f5f9ccece699d8c966c2a441ae76238b45005824",
19389           "f7fcfde5f5f9ccece699d8c966c2a441ae76238b45006d2c00441b"
19390         ).map(colors);
19391
19392         var BuGn = ramp(scheme$9);
19393
19394         var scheme$a = new Array(3).concat(
19395           "e0ecf49ebcda8856a7",
19396           "edf8fbb3cde38c96c688419d",
19397           "edf8fbb3cde38c96c68856a7810f7c",
19398           "edf8fbbfd3e69ebcda8c96c68856a7810f7c",
19399           "edf8fbbfd3e69ebcda8c96c68c6bb188419d6e016b",
19400           "f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d6e016b",
19401           "f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d810f7c4d004b"
19402         ).map(colors);
19403
19404         var BuPu = ramp(scheme$a);
19405
19406         var scheme$b = new Array(3).concat(
19407           "e0f3dba8ddb543a2ca",
19408           "f0f9e8bae4bc7bccc42b8cbe",
19409           "f0f9e8bae4bc7bccc443a2ca0868ac",
19410           "f0f9e8ccebc5a8ddb57bccc443a2ca0868ac",
19411           "f0f9e8ccebc5a8ddb57bccc44eb3d32b8cbe08589e",
19412           "f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe08589e",
19413           "f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe0868ac084081"
19414         ).map(colors);
19415
19416         var GnBu = ramp(scheme$b);
19417
19418         var scheme$c = new Array(3).concat(
19419           "fee8c8fdbb84e34a33",
19420           "fef0d9fdcc8afc8d59d7301f",
19421           "fef0d9fdcc8afc8d59e34a33b30000",
19422           "fef0d9fdd49efdbb84fc8d59e34a33b30000",
19423           "fef0d9fdd49efdbb84fc8d59ef6548d7301f990000",
19424           "fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301f990000",
19425           "fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301fb300007f0000"
19426         ).map(colors);
19427
19428         var OrRd = ramp(scheme$c);
19429
19430         var scheme$d = new Array(3).concat(
19431           "ece2f0a6bddb1c9099",
19432           "f6eff7bdc9e167a9cf02818a",
19433           "f6eff7bdc9e167a9cf1c9099016c59",
19434           "f6eff7d0d1e6a6bddb67a9cf1c9099016c59",
19435           "f6eff7d0d1e6a6bddb67a9cf3690c002818a016450",
19436           "fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016450",
19437           "fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016c59014636"
19438         ).map(colors);
19439
19440         var PuBuGn = ramp(scheme$d);
19441
19442         var scheme$e = new Array(3).concat(
19443           "ece7f2a6bddb2b8cbe",
19444           "f1eef6bdc9e174a9cf0570b0",
19445           "f1eef6bdc9e174a9cf2b8cbe045a8d",
19446           "f1eef6d0d1e6a6bddb74a9cf2b8cbe045a8d",
19447           "f1eef6d0d1e6a6bddb74a9cf3690c00570b0034e7b",
19448           "fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0034e7b",
19449           "fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0045a8d023858"
19450         ).map(colors);
19451
19452         var PuBu = ramp(scheme$e);
19453
19454         var scheme$f = new Array(3).concat(
19455           "e7e1efc994c7dd1c77",
19456           "f1eef6d7b5d8df65b0ce1256",
19457           "f1eef6d7b5d8df65b0dd1c77980043",
19458           "f1eef6d4b9dac994c7df65b0dd1c77980043",
19459           "f1eef6d4b9dac994c7df65b0e7298ace125691003f",
19460           "f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125691003f",
19461           "f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125698004367001f"
19462         ).map(colors);
19463
19464         var PuRd = ramp(scheme$f);
19465
19466         var scheme$g = new Array(3).concat(
19467           "fde0ddfa9fb5c51b8a",
19468           "feebe2fbb4b9f768a1ae017e",
19469           "feebe2fbb4b9f768a1c51b8a7a0177",
19470           "feebe2fcc5c0fa9fb5f768a1c51b8a7a0177",
19471           "feebe2fcc5c0fa9fb5f768a1dd3497ae017e7a0177",
19472           "fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a0177",
19473           "fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a017749006a"
19474         ).map(colors);
19475
19476         var RdPu = ramp(scheme$g);
19477
19478         var scheme$h = new Array(3).concat(
19479           "edf8b17fcdbb2c7fb8",
19480           "ffffcca1dab441b6c4225ea8",
19481           "ffffcca1dab441b6c42c7fb8253494",
19482           "ffffccc7e9b47fcdbb41b6c42c7fb8253494",
19483           "ffffccc7e9b47fcdbb41b6c41d91c0225ea80c2c84",
19484           "ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea80c2c84",
19485           "ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea8253494081d58"
19486         ).map(colors);
19487
19488         var YlGnBu = ramp(scheme$h);
19489
19490         var scheme$i = new Array(3).concat(
19491           "f7fcb9addd8e31a354",
19492           "ffffccc2e69978c679238443",
19493           "ffffccc2e69978c67931a354006837",
19494           "ffffccd9f0a3addd8e78c67931a354006837",
19495           "ffffccd9f0a3addd8e78c67941ab5d238443005a32",
19496           "ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443005a32",
19497           "ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443006837004529"
19498         ).map(colors);
19499
19500         var YlGn = ramp(scheme$i);
19501
19502         var scheme$j = new Array(3).concat(
19503           "fff7bcfec44fd95f0e",
19504           "ffffd4fed98efe9929cc4c02",
19505           "ffffd4fed98efe9929d95f0e993404",
19506           "ffffd4fee391fec44ffe9929d95f0e993404",
19507           "ffffd4fee391fec44ffe9929ec7014cc4c028c2d04",
19508           "ffffe5fff7bcfee391fec44ffe9929ec7014cc4c028c2d04",
19509           "ffffe5fff7bcfee391fec44ffe9929ec7014cc4c02993404662506"
19510         ).map(colors);
19511
19512         var YlOrBr = ramp(scheme$j);
19513
19514         var scheme$k = new Array(3).concat(
19515           "ffeda0feb24cf03b20",
19516           "ffffb2fecc5cfd8d3ce31a1c",
19517           "ffffb2fecc5cfd8d3cf03b20bd0026",
19518           "ffffb2fed976feb24cfd8d3cf03b20bd0026",
19519           "ffffb2fed976feb24cfd8d3cfc4e2ae31a1cb10026",
19520           "ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cb10026",
19521           "ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cbd0026800026"
19522         ).map(colors);
19523
19524         var YlOrRd = ramp(scheme$k);
19525
19526         var scheme$l = new Array(3).concat(
19527           "deebf79ecae13182bd",
19528           "eff3ffbdd7e76baed62171b5",
19529           "eff3ffbdd7e76baed63182bd08519c",
19530           "eff3ffc6dbef9ecae16baed63182bd08519c",
19531           "eff3ffc6dbef9ecae16baed64292c62171b5084594",
19532           "f7fbffdeebf7c6dbef9ecae16baed64292c62171b5084594",
19533           "f7fbffdeebf7c6dbef9ecae16baed64292c62171b508519c08306b"
19534         ).map(colors);
19535
19536         var Blues = ramp(scheme$l);
19537
19538         var scheme$m = new Array(3).concat(
19539           "e5f5e0a1d99b31a354",
19540           "edf8e9bae4b374c476238b45",
19541           "edf8e9bae4b374c47631a354006d2c",
19542           "edf8e9c7e9c0a1d99b74c47631a354006d2c",
19543           "edf8e9c7e9c0a1d99b74c47641ab5d238b45005a32",
19544           "f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45005a32",
19545           "f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45006d2c00441b"
19546         ).map(colors);
19547
19548         var Greens = ramp(scheme$m);
19549
19550         var scheme$n = new Array(3).concat(
19551           "f0f0f0bdbdbd636363",
19552           "f7f7f7cccccc969696525252",
19553           "f7f7f7cccccc969696636363252525",
19554           "f7f7f7d9d9d9bdbdbd969696636363252525",
19555           "f7f7f7d9d9d9bdbdbd969696737373525252252525",
19556           "fffffff0f0f0d9d9d9bdbdbd969696737373525252252525",
19557           "fffffff0f0f0d9d9d9bdbdbd969696737373525252252525000000"
19558         ).map(colors);
19559
19560         var Greys = ramp(scheme$n);
19561
19562         var scheme$o = new Array(3).concat(
19563           "efedf5bcbddc756bb1",
19564           "f2f0f7cbc9e29e9ac86a51a3",
19565           "f2f0f7cbc9e29e9ac8756bb154278f",
19566           "f2f0f7dadaebbcbddc9e9ac8756bb154278f",
19567           "f2f0f7dadaebbcbddc9e9ac8807dba6a51a34a1486",
19568           "fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a34a1486",
19569           "fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a354278f3f007d"
19570         ).map(colors);
19571
19572         var Purples = ramp(scheme$o);
19573
19574         var scheme$p = new Array(3).concat(
19575           "fee0d2fc9272de2d26",
19576           "fee5d9fcae91fb6a4acb181d",
19577           "fee5d9fcae91fb6a4ade2d26a50f15",
19578           "fee5d9fcbba1fc9272fb6a4ade2d26a50f15",
19579           "fee5d9fcbba1fc9272fb6a4aef3b2ccb181d99000d",
19580           "fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181d99000d",
19581           "fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181da50f1567000d"
19582         ).map(colors);
19583
19584         var Reds = ramp(scheme$p);
19585
19586         var scheme$q = new Array(3).concat(
19587           "fee6cefdae6be6550d",
19588           "feeddefdbe85fd8d3cd94701",
19589           "feeddefdbe85fd8d3ce6550da63603",
19590           "feeddefdd0a2fdae6bfd8d3ce6550da63603",
19591           "feeddefdd0a2fdae6bfd8d3cf16913d948018c2d04",
19592           "fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d948018c2d04",
19593           "fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d94801a636037f2704"
19594         ).map(colors);
19595
19596         var Oranges = ramp(scheme$q);
19597
19598         var cubehelix$3 = cubehelixLong(cubehelix(300, 0.5, 0.0), cubehelix(-240, 0.5, 1.0));
19599
19600         var warm = cubehelixLong(cubehelix(-100, 0.75, 0.35), cubehelix(80, 1.50, 0.8));
19601
19602         var cool = cubehelixLong(cubehelix(260, 0.75, 0.35), cubehelix(80, 1.50, 0.8));
19603
19604         var c = cubehelix();
19605
19606         function rainbow(t) {
19607           if (t < 0 || t > 1) t -= Math.floor(t);
19608           var ts = Math.abs(t - 0.5);
19609           c.h = 360 * t - 100;
19610           c.s = 1.5 - 1.5 * ts;
19611           c.l = 0.8 - 0.9 * ts;
19612           return c + "";
19613         }
19614
19615         var c$1 = rgb(),
19616             pi_1_3 = Math.PI / 3,
19617             pi_2_3 = Math.PI * 2 / 3;
19618
19619         function sinebow(t) {
19620           var x;
19621           t = (0.5 - t) * Math.PI;
19622           c$1.r = 255 * (x = Math.sin(t)) * x;
19623           c$1.g = 255 * (x = Math.sin(t + pi_1_3)) * x;
19624           c$1.b = 255 * (x = Math.sin(t + pi_2_3)) * x;
19625           return c$1 + "";
19626         }
19627
19628         function ramp$1(range) {
19629           var n = range.length;
19630           return function(t) {
19631             return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))];
19632           };
19633         }
19634
19635         var viridis = ramp$1(colors("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725"));
19636
19637         var magma = ramp$1(colors("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf"));
19638
19639         var inferno = ramp$1(colors("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4"));
19640
19641         var plasma = ramp$1(colors("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921"));
19642
19643         function constant$b(x) {
19644           return function constant() {
19645             return x;
19646           };
19647         }
19648
19649         var abs$3 = Math.abs;
19650         var atan2$1 = Math.atan2;
19651         var cos$2 = Math.cos;
19652         var max$4 = Math.max;
19653         var min$1 = Math.min;
19654         var sin$2 = Math.sin;
19655         var sqrt$2 = Math.sqrt;
19656
19657         var epsilon$3 = 1e-12;
19658         var pi$4 = Math.PI;
19659         var halfPi$3 = pi$4 / 2;
19660         var tau$4 = 2 * pi$4;
19661
19662         function acos$1(x) {
19663           return x > 1 ? 0 : x < -1 ? pi$4 : Math.acos(x);
19664         }
19665
19666         function asin$1(x) {
19667           return x >= 1 ? halfPi$3 : x <= -1 ? -halfPi$3 : Math.asin(x);
19668         }
19669
19670         function arcInnerRadius(d) {
19671           return d.innerRadius;
19672         }
19673
19674         function arcOuterRadius(d) {
19675           return d.outerRadius;
19676         }
19677
19678         function arcStartAngle(d) {
19679           return d.startAngle;
19680         }
19681
19682         function arcEndAngle(d) {
19683           return d.endAngle;
19684         }
19685
19686         function arcPadAngle(d) {
19687           return d && d.padAngle; // Note: optional!
19688         }
19689
19690         function intersect(x0, y0, x1, y1, x2, y2, x3, y3) {
19691           var x10 = x1 - x0, y10 = y1 - y0,
19692               x32 = x3 - x2, y32 = y3 - y2,
19693               t = y32 * x10 - x32 * y10;
19694           if (t * t < epsilon$3) return;
19695           t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / t;
19696           return [x0 + t * x10, y0 + t * y10];
19697         }
19698
19699         // Compute perpendicular offset line of length rc.
19700         // http://mathworld.wolfram.com/Circle-LineIntersection.html
19701         function cornerTangents(x0, y0, x1, y1, r1, rc, cw) {
19702           var x01 = x0 - x1,
19703               y01 = y0 - y1,
19704               lo = (cw ? rc : -rc) / sqrt$2(x01 * x01 + y01 * y01),
19705               ox = lo * y01,
19706               oy = -lo * x01,
19707               x11 = x0 + ox,
19708               y11 = y0 + oy,
19709               x10 = x1 + ox,
19710               y10 = y1 + oy,
19711               x00 = (x11 + x10) / 2,
19712               y00 = (y11 + y10) / 2,
19713               dx = x10 - x11,
19714               dy = y10 - y11,
19715               d2 = dx * dx + dy * dy,
19716               r = r1 - rc,
19717               D = x11 * y10 - x10 * y11,
19718               d = (dy < 0 ? -1 : 1) * sqrt$2(max$4(0, r * r * d2 - D * D)),
19719               cx0 = (D * dy - dx * d) / d2,
19720               cy0 = (-D * dx - dy * d) / d2,
19721               cx1 = (D * dy + dx * d) / d2,
19722               cy1 = (-D * dx + dy * d) / d2,
19723               dx0 = cx0 - x00,
19724               dy0 = cy0 - y00,
19725               dx1 = cx1 - x00,
19726               dy1 = cy1 - y00;
19727
19728           // Pick the closer of the two intersection points.
19729           // TODO Is there a faster way to determine which intersection to use?
19730           if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;
19731
19732           return {
19733             cx: cx0,
19734             cy: cy0,
19735             x01: -ox,
19736             y01: -oy,
19737             x11: cx0 * (r1 / r - 1),
19738             y11: cy0 * (r1 / r - 1)
19739           };
19740         }
19741
19742         function arc() {
19743           var innerRadius = arcInnerRadius,
19744               outerRadius = arcOuterRadius,
19745               cornerRadius = constant$b(0),
19746               padRadius = null,
19747               startAngle = arcStartAngle,
19748               endAngle = arcEndAngle,
19749               padAngle = arcPadAngle,
19750               context = null;
19751
19752           function arc() {
19753             var buffer,
19754                 r,
19755                 r0 = +innerRadius.apply(this, arguments),
19756                 r1 = +outerRadius.apply(this, arguments),
19757                 a0 = startAngle.apply(this, arguments) - halfPi$3,
19758                 a1 = endAngle.apply(this, arguments) - halfPi$3,
19759                 da = abs$3(a1 - a0),
19760                 cw = a1 > a0;
19761
19762             if (!context) context = buffer = path();
19763
19764             // Ensure that the outer radius is always larger than the inner radius.
19765             if (r1 < r0) r = r1, r1 = r0, r0 = r;
19766
19767             // Is it a point?
19768             if (!(r1 > epsilon$3)) context.moveTo(0, 0);
19769
19770             // Or is it a circle or annulus?
19771             else if (da > tau$4 - epsilon$3) {
19772               context.moveTo(r1 * cos$2(a0), r1 * sin$2(a0));
19773               context.arc(0, 0, r1, a0, a1, !cw);
19774               if (r0 > epsilon$3) {
19775                 context.moveTo(r0 * cos$2(a1), r0 * sin$2(a1));
19776                 context.arc(0, 0, r0, a1, a0, cw);
19777               }
19778             }
19779
19780             // Or is it a circular or annular sector?
19781             else {
19782               var a01 = a0,
19783                   a11 = a1,
19784                   a00 = a0,
19785                   a10 = a1,
19786                   da0 = da,
19787                   da1 = da,
19788                   ap = padAngle.apply(this, arguments) / 2,
19789                   rp = (ap > epsilon$3) && (padRadius ? +padRadius.apply(this, arguments) : sqrt$2(r0 * r0 + r1 * r1)),
19790                   rc = min$1(abs$3(r1 - r0) / 2, +cornerRadius.apply(this, arguments)),
19791                   rc0 = rc,
19792                   rc1 = rc,
19793                   t0,
19794                   t1;
19795
19796               // Apply padding? Note that since r1 ≥ r0, da1 ≥ da0.
19797               if (rp > epsilon$3) {
19798                 var p0 = asin$1(rp / r0 * sin$2(ap)),
19799                     p1 = asin$1(rp / r1 * sin$2(ap));
19800                 if ((da0 -= p0 * 2) > epsilon$3) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0;
19801                 else da0 = 0, a00 = a10 = (a0 + a1) / 2;
19802                 if ((da1 -= p1 * 2) > epsilon$3) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1;
19803                 else da1 = 0, a01 = a11 = (a0 + a1) / 2;
19804               }
19805
19806               var x01 = r1 * cos$2(a01),
19807                   y01 = r1 * sin$2(a01),
19808                   x10 = r0 * cos$2(a10),
19809                   y10 = r0 * sin$2(a10);
19810
19811               // Apply rounded corners?
19812               if (rc > epsilon$3) {
19813                 var x11 = r1 * cos$2(a11),
19814                     y11 = r1 * sin$2(a11),
19815                     x00 = r0 * cos$2(a00),
19816                     y00 = r0 * sin$2(a00),
19817                     oc;
19818
19819                 // Restrict the corner radius according to the sector angle.
19820                 if (da < pi$4 && (oc = intersect(x01, y01, x00, y00, x11, y11, x10, y10))) {
19821                   var ax = x01 - oc[0],
19822                       ay = y01 - oc[1],
19823                       bx = x11 - oc[0],
19824                       by = y11 - oc[1],
19825                       kc = 1 / sin$2(acos$1((ax * bx + ay * by) / (sqrt$2(ax * ax + ay * ay) * sqrt$2(bx * bx + by * by))) / 2),
19826                       lc = sqrt$2(oc[0] * oc[0] + oc[1] * oc[1]);
19827                   rc0 = min$1(rc, (r0 - lc) / (kc - 1));
19828                   rc1 = min$1(rc, (r1 - lc) / (kc + 1));
19829                 }
19830               }
19831
19832               // Is the sector collapsed to a line?
19833               if (!(da1 > epsilon$3)) context.moveTo(x01, y01);
19834
19835               // Does the sector’s outer ring have rounded corners?
19836               else if (rc1 > epsilon$3) {
19837                 t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw);
19838                 t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw);
19839
19840                 context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01);
19841
19842                 // Have the corners merged?
19843                 if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, atan2$1(t0.y01, t0.x01), atan2$1(t1.y01, t1.x01), !cw);
19844
19845                 // Otherwise, draw the two corners and the ring.
19846                 else {
19847                   context.arc(t0.cx, t0.cy, rc1, atan2$1(t0.y01, t0.x01), atan2$1(t0.y11, t0.x11), !cw);
19848                   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);
19849                   context.arc(t1.cx, t1.cy, rc1, atan2$1(t1.y11, t1.x11), atan2$1(t1.y01, t1.x01), !cw);
19850                 }
19851               }
19852
19853               // Or is the outer ring just a circular arc?
19854               else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw);
19855
19856               // Is there no inner ring, and it’s a circular sector?
19857               // Or perhaps it’s an annular sector collapsed due to padding?
19858               if (!(r0 > epsilon$3) || !(da0 > epsilon$3)) context.lineTo(x10, y10);
19859
19860               // Does the sector’s inner ring (or point) have rounded corners?
19861               else if (rc0 > epsilon$3) {
19862                 t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw);
19863                 t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw);
19864
19865                 context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01);
19866
19867                 // Have the corners merged?
19868                 if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, atan2$1(t0.y01, t0.x01), atan2$1(t1.y01, t1.x01), !cw);
19869
19870                 // Otherwise, draw the two corners and the ring.
19871                 else {
19872                   context.arc(t0.cx, t0.cy, rc0, atan2$1(t0.y01, t0.x01), atan2$1(t0.y11, t0.x11), !cw);
19873                   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);
19874                   context.arc(t1.cx, t1.cy, rc0, atan2$1(t1.y11, t1.x11), atan2$1(t1.y01, t1.x01), !cw);
19875                 }
19876               }
19877
19878               // Or is the inner ring just a circular arc?
19879               else context.arc(0, 0, r0, a10, a00, cw);
19880             }
19881
19882             context.closePath();
19883
19884             if (buffer) return context = null, buffer + "" || null;
19885           }
19886
19887           arc.centroid = function() {
19888             var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2,
19889                 a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi$4 / 2;
19890             return [cos$2(a) * r, sin$2(a) * r];
19891           };
19892
19893           arc.innerRadius = function(_) {
19894             return arguments.length ? (innerRadius = typeof _ === "function" ? _ : constant$b(+_), arc) : innerRadius;
19895           };
19896
19897           arc.outerRadius = function(_) {
19898             return arguments.length ? (outerRadius = typeof _ === "function" ? _ : constant$b(+_), arc) : outerRadius;
19899           };
19900
19901           arc.cornerRadius = function(_) {
19902             return arguments.length ? (cornerRadius = typeof _ === "function" ? _ : constant$b(+_), arc) : cornerRadius;
19903           };
19904
19905           arc.padRadius = function(_) {
19906             return arguments.length ? (padRadius = _ == null ? null : typeof _ === "function" ? _ : constant$b(+_), arc) : padRadius;
19907           };
19908
19909           arc.startAngle = function(_) {
19910             return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$b(+_), arc) : startAngle;
19911           };
19912
19913           arc.endAngle = function(_) {
19914             return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$b(+_), arc) : endAngle;
19915           };
19916
19917           arc.padAngle = function(_) {
19918             return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$b(+_), arc) : padAngle;
19919           };
19920
19921           arc.context = function(_) {
19922             return arguments.length ? ((context = _ == null ? null : _), arc) : context;
19923           };
19924
19925           return arc;
19926         }
19927
19928         function Linear(context) {
19929           this._context = context;
19930         }
19931
19932         Linear.prototype = {
19933           areaStart: function() {
19934             this._line = 0;
19935           },
19936           areaEnd: function() {
19937             this._line = NaN;
19938           },
19939           lineStart: function() {
19940             this._point = 0;
19941           },
19942           lineEnd: function() {
19943             if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
19944             this._line = 1 - this._line;
19945           },
19946           point: function(x, y) {
19947             x = +x, y = +y;
19948             switch (this._point) {
19949               case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
19950               case 1: this._point = 2; // proceed
19951               default: this._context.lineTo(x, y); break;
19952             }
19953           }
19954         };
19955
19956         function curveLinear(context) {
19957           return new Linear(context);
19958         }
19959
19960         function x$3(p) {
19961           return p[0];
19962         }
19963
19964         function y$3(p) {
19965           return p[1];
19966         }
19967
19968         function line() {
19969           var x = x$3,
19970               y = y$3,
19971               defined = constant$b(true),
19972               context = null,
19973               curve = curveLinear,
19974               output = null;
19975
19976           function line(data) {
19977             var i,
19978                 n = data.length,
19979                 d,
19980                 defined0 = false,
19981                 buffer;
19982
19983             if (context == null) output = curve(buffer = path());
19984
19985             for (i = 0; i <= n; ++i) {
19986               if (!(i < n && defined(d = data[i], i, data)) === defined0) {
19987                 if (defined0 = !defined0) output.lineStart();
19988                 else output.lineEnd();
19989               }
19990               if (defined0) output.point(+x(d, i, data), +y(d, i, data));
19991             }
19992
19993             if (buffer) return output = null, buffer + "" || null;
19994           }
19995
19996           line.x = function(_) {
19997             return arguments.length ? (x = typeof _ === "function" ? _ : constant$b(+_), line) : x;
19998           };
19999
20000           line.y = function(_) {
20001             return arguments.length ? (y = typeof _ === "function" ? _ : constant$b(+_), line) : y;
20002           };
20003
20004           line.defined = function(_) {
20005             return arguments.length ? (defined = typeof _ === "function" ? _ : constant$b(!!_), line) : defined;
20006           };
20007
20008           line.curve = function(_) {
20009             return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve;
20010           };
20011
20012           line.context = function(_) {
20013             return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context;
20014           };
20015
20016           return line;
20017         }
20018
20019         function area$1() {
20020           var x0 = x$3,
20021               x1 = null,
20022               y0 = constant$b(0),
20023               y1 = y$3,
20024               defined = constant$b(true),
20025               context = null,
20026               curve = curveLinear,
20027               output = null;
20028
20029           function area(data) {
20030             var i,
20031                 j,
20032                 k,
20033                 n = data.length,
20034                 d,
20035                 defined0 = false,
20036                 buffer,
20037                 x0z = new Array(n),
20038                 y0z = new Array(n);
20039
20040             if (context == null) output = curve(buffer = path());
20041
20042             for (i = 0; i <= n; ++i) {
20043               if (!(i < n && defined(d = data[i], i, data)) === defined0) {
20044                 if (defined0 = !defined0) {
20045                   j = i;
20046                   output.areaStart();
20047                   output.lineStart();
20048                 } else {
20049                   output.lineEnd();
20050                   output.lineStart();
20051                   for (k = i - 1; k >= j; --k) {
20052                     output.point(x0z[k], y0z[k]);
20053                   }
20054                   output.lineEnd();
20055                   output.areaEnd();
20056                 }
20057               }
20058               if (defined0) {
20059                 x0z[i] = +x0(d, i, data), y0z[i] = +y0(d, i, data);
20060                 output.point(x1 ? +x1(d, i, data) : x0z[i], y1 ? +y1(d, i, data) : y0z[i]);
20061               }
20062             }
20063
20064             if (buffer) return output = null, buffer + "" || null;
20065           }
20066
20067           function arealine() {
20068             return line().defined(defined).curve(curve).context(context);
20069           }
20070
20071           area.x = function(_) {
20072             return arguments.length ? (x0 = typeof _ === "function" ? _ : constant$b(+_), x1 = null, area) : x0;
20073           };
20074
20075           area.x0 = function(_) {
20076             return arguments.length ? (x0 = typeof _ === "function" ? _ : constant$b(+_), area) : x0;
20077           };
20078
20079           area.x1 = function(_) {
20080             return arguments.length ? (x1 = _ == null ? null : typeof _ === "function" ? _ : constant$b(+_), area) : x1;
20081           };
20082
20083           area.y = function(_) {
20084             return arguments.length ? (y0 = typeof _ === "function" ? _ : constant$b(+_), y1 = null, area) : y0;
20085           };
20086
20087           area.y0 = function(_) {
20088             return arguments.length ? (y0 = typeof _ === "function" ? _ : constant$b(+_), area) : y0;
20089           };
20090
20091           area.y1 = function(_) {
20092             return arguments.length ? (y1 = _ == null ? null : typeof _ === "function" ? _ : constant$b(+_), area) : y1;
20093           };
20094
20095           area.lineX0 =
20096           area.lineY0 = function() {
20097             return arealine().x(x0).y(y0);
20098           };
20099
20100           area.lineY1 = function() {
20101             return arealine().x(x0).y(y1);
20102           };
20103
20104           area.lineX1 = function() {
20105             return arealine().x(x1).y(y0);
20106           };
20107
20108           area.defined = function(_) {
20109             return arguments.length ? (defined = typeof _ === "function" ? _ : constant$b(!!_), area) : defined;
20110           };
20111
20112           area.curve = function(_) {
20113             return arguments.length ? (curve = _, context != null && (output = curve(context)), area) : curve;
20114           };
20115
20116           area.context = function(_) {
20117             return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), area) : context;
20118           };
20119
20120           return area;
20121         }
20122
20123         function descending(a, b) {
20124           return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
20125         }
20126
20127         function identity$7(d) {
20128           return d;
20129         }
20130
20131         function pie() {
20132           var value = identity$7,
20133               sortValues = descending,
20134               sort = null,
20135               startAngle = constant$b(0),
20136               endAngle = constant$b(tau$4),
20137               padAngle = constant$b(0);
20138
20139           function pie(data) {
20140             var i,
20141                 n = data.length,
20142                 j,
20143                 k,
20144                 sum = 0,
20145                 index = new Array(n),
20146                 arcs = new Array(n),
20147                 a0 = +startAngle.apply(this, arguments),
20148                 da = Math.min(tau$4, Math.max(-tau$4, endAngle.apply(this, arguments) - a0)),
20149                 a1,
20150                 p = Math.min(Math.abs(da) / n, padAngle.apply(this, arguments)),
20151                 pa = p * (da < 0 ? -1 : 1),
20152                 v;
20153
20154             for (i = 0; i < n; ++i) {
20155               if ((v = arcs[index[i] = i] = +value(data[i], i, data)) > 0) {
20156                 sum += v;
20157               }
20158             }
20159
20160             // Optionally sort the arcs by previously-computed values or by data.
20161             if (sortValues != null) index.sort(function(i, j) { return sortValues(arcs[i], arcs[j]); });
20162             else if (sort != null) index.sort(function(i, j) { return sort(data[i], data[j]); });
20163
20164             // Compute the arcs! They are stored in the original data's order.
20165             for (i = 0, k = sum ? (da - n * pa) / sum : 0; i < n; ++i, a0 = a1) {
20166               j = index[i], v = arcs[j], a1 = a0 + (v > 0 ? v * k : 0) + pa, arcs[j] = {
20167                 data: data[j],
20168                 index: i,
20169                 value: v,
20170                 startAngle: a0,
20171                 endAngle: a1,
20172                 padAngle: p
20173               };
20174             }
20175
20176             return arcs;
20177           }
20178
20179           pie.value = function(_) {
20180             return arguments.length ? (value = typeof _ === "function" ? _ : constant$b(+_), pie) : value;
20181           };
20182
20183           pie.sortValues = function(_) {
20184             return arguments.length ? (sortValues = _, sort = null, pie) : sortValues;
20185           };
20186
20187           pie.sort = function(_) {
20188             return arguments.length ? (sort = _, sortValues = null, pie) : sort;
20189           };
20190
20191           pie.startAngle = function(_) {
20192             return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$b(+_), pie) : startAngle;
20193           };
20194
20195           pie.endAngle = function(_) {
20196             return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$b(+_), pie) : endAngle;
20197           };
20198
20199           pie.padAngle = function(_) {
20200             return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$b(+_), pie) : padAngle;
20201           };
20202
20203           return pie;
20204         }
20205
20206         var curveRadialLinear = curveRadial(curveLinear);
20207
20208         function Radial(curve) {
20209           this._curve = curve;
20210         }
20211
20212         Radial.prototype = {
20213           areaStart: function() {
20214             this._curve.areaStart();
20215           },
20216           areaEnd: function() {
20217             this._curve.areaEnd();
20218           },
20219           lineStart: function() {
20220             this._curve.lineStart();
20221           },
20222           lineEnd: function() {
20223             this._curve.lineEnd();
20224           },
20225           point: function(a, r) {
20226             this._curve.point(r * Math.sin(a), r * -Math.cos(a));
20227           }
20228         };
20229
20230         function curveRadial(curve) {
20231
20232           function radial(context) {
20233             return new Radial(curve(context));
20234           }
20235
20236           radial._curve = curve;
20237
20238           return radial;
20239         }
20240
20241         function lineRadial(l) {
20242           var c = l.curve;
20243
20244           l.angle = l.x, delete l.x;
20245           l.radius = l.y, delete l.y;
20246
20247           l.curve = function(_) {
20248             return arguments.length ? c(curveRadial(_)) : c()._curve;
20249           };
20250
20251           return l;
20252         }
20253
20254         function lineRadial$1() {
20255           return lineRadial(line().curve(curveRadialLinear));
20256         }
20257
20258         function areaRadial() {
20259           var a = area$1().curve(curveRadialLinear),
20260               c = a.curve,
20261               x0 = a.lineX0,
20262               x1 = a.lineX1,
20263               y0 = a.lineY0,
20264               y1 = a.lineY1;
20265
20266           a.angle = a.x, delete a.x;
20267           a.startAngle = a.x0, delete a.x0;
20268           a.endAngle = a.x1, delete a.x1;
20269           a.radius = a.y, delete a.y;
20270           a.innerRadius = a.y0, delete a.y0;
20271           a.outerRadius = a.y1, delete a.y1;
20272           a.lineStartAngle = function() { return lineRadial(x0()); }, delete a.lineX0;
20273           a.lineEndAngle = function() { return lineRadial(x1()); }, delete a.lineX1;
20274           a.lineInnerRadius = function() { return lineRadial(y0()); }, delete a.lineY0;
20275           a.lineOuterRadius = function() { return lineRadial(y1()); }, delete a.lineY1;
20276
20277           a.curve = function(_) {
20278             return arguments.length ? c(curveRadial(_)) : c()._curve;
20279           };
20280
20281           return a;
20282         }
20283
20284         function pointRadial(x, y) {
20285           return [(y = +y) * Math.cos(x -= Math.PI / 2), y * Math.sin(x)];
20286         }
20287
20288         var slice$a = Array.prototype.slice;
20289
20290         function linkSource(d) {
20291           return d.source;
20292         }
20293
20294         function linkTarget(d) {
20295           return d.target;
20296         }
20297
20298         function link$2(curve) {
20299           var source = linkSource,
20300               target = linkTarget,
20301               x = x$3,
20302               y = y$3,
20303               context = null;
20304
20305           function link() {
20306             var buffer, argv = slice$a.call(arguments), s = source.apply(this, argv), t = target.apply(this, argv);
20307             if (!context) context = buffer = path();
20308             curve(context, +x.apply(this, (argv[0] = s, argv)), +y.apply(this, argv), +x.apply(this, (argv[0] = t, argv)), +y.apply(this, argv));
20309             if (buffer) return context = null, buffer + "" || null;
20310           }
20311
20312           link.source = function(_) {
20313             return arguments.length ? (source = _, link) : source;
20314           };
20315
20316           link.target = function(_) {
20317             return arguments.length ? (target = _, link) : target;
20318           };
20319
20320           link.x = function(_) {
20321             return arguments.length ? (x = typeof _ === "function" ? _ : constant$b(+_), link) : x;
20322           };
20323
20324           link.y = function(_) {
20325             return arguments.length ? (y = typeof _ === "function" ? _ : constant$b(+_), link) : y;
20326           };
20327
20328           link.context = function(_) {
20329             return arguments.length ? ((context = _ == null ? null : _), link) : context;
20330           };
20331
20332           return link;
20333         }
20334
20335         function curveHorizontal(context, x0, y0, x1, y1) {
20336           context.moveTo(x0, y0);
20337           context.bezierCurveTo(x0 = (x0 + x1) / 2, y0, x0, y1, x1, y1);
20338         }
20339
20340         function curveVertical(context, x0, y0, x1, y1) {
20341           context.moveTo(x0, y0);
20342           context.bezierCurveTo(x0, y0 = (y0 + y1) / 2, x1, y0, x1, y1);
20343         }
20344
20345         function curveRadial$1(context, x0, y0, x1, y1) {
20346           var p0 = pointRadial(x0, y0),
20347               p1 = pointRadial(x0, y0 = (y0 + y1) / 2),
20348               p2 = pointRadial(x1, y0),
20349               p3 = pointRadial(x1, y1);
20350           context.moveTo(p0[0], p0[1]);
20351           context.bezierCurveTo(p1[0], p1[1], p2[0], p2[1], p3[0], p3[1]);
20352         }
20353
20354         function linkHorizontal() {
20355           return link$2(curveHorizontal);
20356         }
20357
20358         function linkVertical() {
20359           return link$2(curveVertical);
20360         }
20361
20362         function linkRadial() {
20363           var l = link$2(curveRadial$1);
20364           l.angle = l.x, delete l.x;
20365           l.radius = l.y, delete l.y;
20366           return l;
20367         }
20368
20369         var circle$2 = {
20370           draw: function(context, size) {
20371             var r = Math.sqrt(size / pi$4);
20372             context.moveTo(r, 0);
20373             context.arc(0, 0, r, 0, tau$4);
20374           }
20375         };
20376
20377         var cross$2 = {
20378           draw: function(context, size) {
20379             var r = Math.sqrt(size / 5) / 2;
20380             context.moveTo(-3 * r, -r);
20381             context.lineTo(-r, -r);
20382             context.lineTo(-r, -3 * r);
20383             context.lineTo(r, -3 * r);
20384             context.lineTo(r, -r);
20385             context.lineTo(3 * r, -r);
20386             context.lineTo(3 * r, r);
20387             context.lineTo(r, r);
20388             context.lineTo(r, 3 * r);
20389             context.lineTo(-r, 3 * r);
20390             context.lineTo(-r, r);
20391             context.lineTo(-3 * r, r);
20392             context.closePath();
20393           }
20394         };
20395
20396         var tan30 = Math.sqrt(1 / 3),
20397             tan30_2 = tan30 * 2;
20398
20399         var diamond = {
20400           draw: function(context, size) {
20401             var y = Math.sqrt(size / tan30_2),
20402                 x = y * tan30;
20403             context.moveTo(0, -y);
20404             context.lineTo(x, 0);
20405             context.lineTo(0, y);
20406             context.lineTo(-x, 0);
20407             context.closePath();
20408           }
20409         };
20410
20411         var ka = 0.89081309152928522810,
20412             kr = Math.sin(pi$4 / 10) / Math.sin(7 * pi$4 / 10),
20413             kx = Math.sin(tau$4 / 10) * kr,
20414             ky = -Math.cos(tau$4 / 10) * kr;
20415
20416         var star = {
20417           draw: function(context, size) {
20418             var r = Math.sqrt(size * ka),
20419                 x = kx * r,
20420                 y = ky * r;
20421             context.moveTo(0, -r);
20422             context.lineTo(x, y);
20423             for (var i = 1; i < 5; ++i) {
20424               var a = tau$4 * i / 5,
20425                   c = Math.cos(a),
20426                   s = Math.sin(a);
20427               context.lineTo(s * r, -c * r);
20428               context.lineTo(c * x - s * y, s * x + c * y);
20429             }
20430             context.closePath();
20431           }
20432         };
20433
20434         var square = {
20435           draw: function(context, size) {
20436             var w = Math.sqrt(size),
20437                 x = -w / 2;
20438             context.rect(x, x, w, w);
20439           }
20440         };
20441
20442         var sqrt3 = Math.sqrt(3);
20443
20444         var triangle = {
20445           draw: function(context, size) {
20446             var y = -Math.sqrt(size / (sqrt3 * 3));
20447             context.moveTo(0, y * 2);
20448             context.lineTo(-sqrt3 * y, -y);
20449             context.lineTo(sqrt3 * y, -y);
20450             context.closePath();
20451           }
20452         };
20453
20454         var c$2 = -0.5,
20455             s = Math.sqrt(3) / 2,
20456             k = 1 / Math.sqrt(12),
20457             a = (k / 2 + 1) * 3;
20458
20459         var wye = {
20460           draw: function(context, size) {
20461             var r = Math.sqrt(size / a),
20462                 x0 = r / 2,
20463                 y0 = r * k,
20464                 x1 = x0,
20465                 y1 = r * k + r,
20466                 x2 = -x1,
20467                 y2 = y1;
20468             context.moveTo(x0, y0);
20469             context.lineTo(x1, y1);
20470             context.lineTo(x2, y2);
20471             context.lineTo(c$2 * x0 - s * y0, s * x0 + c$2 * y0);
20472             context.lineTo(c$2 * x1 - s * y1, s * x1 + c$2 * y1);
20473             context.lineTo(c$2 * x2 - s * y2, s * x2 + c$2 * y2);
20474             context.lineTo(c$2 * x0 + s * y0, c$2 * y0 - s * x0);
20475             context.lineTo(c$2 * x1 + s * y1, c$2 * y1 - s * x1);
20476             context.lineTo(c$2 * x2 + s * y2, c$2 * y2 - s * x2);
20477             context.closePath();
20478           }
20479         };
20480
20481         var symbols = [
20482           circle$2,
20483           cross$2,
20484           diamond,
20485           square,
20486           star,
20487           triangle,
20488           wye
20489         ];
20490
20491         function symbol() {
20492           var type = constant$b(circle$2),
20493               size = constant$b(64),
20494               context = null;
20495
20496           function symbol() {
20497             var buffer;
20498             if (!context) context = buffer = path();
20499             type.apply(this, arguments).draw(context, +size.apply(this, arguments));
20500             if (buffer) return context = null, buffer + "" || null;
20501           }
20502
20503           symbol.type = function(_) {
20504             return arguments.length ? (type = typeof _ === "function" ? _ : constant$b(_), symbol) : type;
20505           };
20506
20507           symbol.size = function(_) {
20508             return arguments.length ? (size = typeof _ === "function" ? _ : constant$b(+_), symbol) : size;
20509           };
20510
20511           symbol.context = function(_) {
20512             return arguments.length ? (context = _ == null ? null : _, symbol) : context;
20513           };
20514
20515           return symbol;
20516         }
20517
20518         function noop$5() {}
20519
20520         function point$2(that, x, y) {
20521           that._context.bezierCurveTo(
20522             (2 * that._x0 + that._x1) / 3,
20523             (2 * that._y0 + that._y1) / 3,
20524             (that._x0 + 2 * that._x1) / 3,
20525             (that._y0 + 2 * that._y1) / 3,
20526             (that._x0 + 4 * that._x1 + x) / 6,
20527             (that._y0 + 4 * that._y1 + y) / 6
20528           );
20529         }
20530
20531         function Basis(context) {
20532           this._context = context;
20533         }
20534
20535         Basis.prototype = {
20536           areaStart: function() {
20537             this._line = 0;
20538           },
20539           areaEnd: function() {
20540             this._line = NaN;
20541           },
20542           lineStart: function() {
20543             this._x0 = this._x1 =
20544             this._y0 = this._y1 = NaN;
20545             this._point = 0;
20546           },
20547           lineEnd: function() {
20548             switch (this._point) {
20549               case 3: point$2(this, this._x1, this._y1); // proceed
20550               case 2: this._context.lineTo(this._x1, this._y1); break;
20551             }
20552             if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
20553             this._line = 1 - this._line;
20554           },
20555           point: function(x, y) {
20556             x = +x, y = +y;
20557             switch (this._point) {
20558               case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
20559               case 1: this._point = 2; break;
20560               case 2: this._point = 3; this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6); // proceed
20561               default: point$2(this, x, y); break;
20562             }
20563             this._x0 = this._x1, this._x1 = x;
20564             this._y0 = this._y1, this._y1 = y;
20565           }
20566         };
20567
20568         function basis$2(context) {
20569           return new Basis(context);
20570         }
20571
20572         function BasisClosed(context) {
20573           this._context = context;
20574         }
20575
20576         BasisClosed.prototype = {
20577           areaStart: noop$5,
20578           areaEnd: noop$5,
20579           lineStart: function() {
20580             this._x0 = this._x1 = this._x2 = this._x3 = this._x4 =
20581             this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN;
20582             this._point = 0;
20583           },
20584           lineEnd: function() {
20585             switch (this._point) {
20586               case 1: {
20587                 this._context.moveTo(this._x2, this._y2);
20588                 this._context.closePath();
20589                 break;
20590               }
20591               case 2: {
20592                 this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3);
20593                 this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3);
20594                 this._context.closePath();
20595                 break;
20596               }
20597               case 3: {
20598                 this.point(this._x2, this._y2);
20599                 this.point(this._x3, this._y3);
20600                 this.point(this._x4, this._y4);
20601                 break;
20602               }
20603             }
20604           },
20605           point: function(x, y) {
20606             x = +x, y = +y;
20607             switch (this._point) {
20608               case 0: this._point = 1; this._x2 = x, this._y2 = y; break;
20609               case 1: this._point = 2; this._x3 = x, this._y3 = y; break;
20610               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;
20611               default: point$2(this, x, y); break;
20612             }
20613             this._x0 = this._x1, this._x1 = x;
20614             this._y0 = this._y1, this._y1 = y;
20615           }
20616         };
20617
20618         function basisClosed$1(context) {
20619           return new BasisClosed(context);
20620         }
20621
20622         function BasisOpen(context) {
20623           this._context = context;
20624         }
20625
20626         BasisOpen.prototype = {
20627           areaStart: function() {
20628             this._line = 0;
20629           },
20630           areaEnd: function() {
20631             this._line = NaN;
20632           },
20633           lineStart: function() {
20634             this._x0 = this._x1 =
20635             this._y0 = this._y1 = NaN;
20636             this._point = 0;
20637           },
20638           lineEnd: function() {
20639             if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
20640             this._line = 1 - this._line;
20641           },
20642           point: function(x, y) {
20643             x = +x, y = +y;
20644             switch (this._point) {
20645               case 0: this._point = 1; break;
20646               case 1: this._point = 2; break;
20647               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;
20648               case 3: this._point = 4; // proceed
20649               default: point$2(this, x, y); break;
20650             }
20651             this._x0 = this._x1, this._x1 = x;
20652             this._y0 = this._y1, this._y1 = y;
20653           }
20654         };
20655
20656         function basisOpen(context) {
20657           return new BasisOpen(context);
20658         }
20659
20660         function Bundle(context, beta) {
20661           this._basis = new Basis(context);
20662           this._beta = beta;
20663         }
20664
20665         Bundle.prototype = {
20666           lineStart: function() {
20667             this._x = [];
20668             this._y = [];
20669             this._basis.lineStart();
20670           },
20671           lineEnd: function() {
20672             var x = this._x,
20673                 y = this._y,
20674                 j = x.length - 1;
20675
20676             if (j > 0) {
20677               var x0 = x[0],
20678                   y0 = y[0],
20679                   dx = x[j] - x0,
20680                   dy = y[j] - y0,
20681                   i = -1,
20682                   t;
20683
20684               while (++i <= j) {
20685                 t = i / j;
20686                 this._basis.point(
20687                   this._beta * x[i] + (1 - this._beta) * (x0 + t * dx),
20688                   this._beta * y[i] + (1 - this._beta) * (y0 + t * dy)
20689                 );
20690               }
20691             }
20692
20693             this._x = this._y = null;
20694             this._basis.lineEnd();
20695           },
20696           point: function(x, y) {
20697             this._x.push(+x);
20698             this._y.push(+y);
20699           }
20700         };
20701
20702         var bundle = (function custom(beta) {
20703
20704           function bundle(context) {
20705             return beta === 1 ? new Basis(context) : new Bundle(context, beta);
20706           }
20707
20708           bundle.beta = function(beta) {
20709             return custom(+beta);
20710           };
20711
20712           return bundle;
20713         })(0.85);
20714
20715         function point$3(that, x, y) {
20716           that._context.bezierCurveTo(
20717             that._x1 + that._k * (that._x2 - that._x0),
20718             that._y1 + that._k * (that._y2 - that._y0),
20719             that._x2 + that._k * (that._x1 - x),
20720             that._y2 + that._k * (that._y1 - y),
20721             that._x2,
20722             that._y2
20723           );
20724         }
20725
20726         function Cardinal(context, tension) {
20727           this._context = context;
20728           this._k = (1 - tension) / 6;
20729         }
20730
20731         Cardinal.prototype = {
20732           areaStart: function() {
20733             this._line = 0;
20734           },
20735           areaEnd: function() {
20736             this._line = NaN;
20737           },
20738           lineStart: function() {
20739             this._x0 = this._x1 = this._x2 =
20740             this._y0 = this._y1 = this._y2 = NaN;
20741             this._point = 0;
20742           },
20743           lineEnd: function() {
20744             switch (this._point) {
20745               case 2: this._context.lineTo(this._x2, this._y2); break;
20746               case 3: point$3(this, this._x1, this._y1); break;
20747             }
20748             if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
20749             this._line = 1 - this._line;
20750           },
20751           point: function(x, y) {
20752             x = +x, y = +y;
20753             switch (this._point) {
20754               case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
20755               case 1: this._point = 2; this._x1 = x, this._y1 = y; break;
20756               case 2: this._point = 3; // proceed
20757               default: point$3(this, x, y); break;
20758             }
20759             this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
20760             this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
20761           }
20762         };
20763
20764         var cardinal = (function custom(tension) {
20765
20766           function cardinal(context) {
20767             return new Cardinal(context, tension);
20768           }
20769
20770           cardinal.tension = function(tension) {
20771             return custom(+tension);
20772           };
20773
20774           return cardinal;
20775         })(0);
20776
20777         function CardinalClosed(context, tension) {
20778           this._context = context;
20779           this._k = (1 - tension) / 6;
20780         }
20781
20782         CardinalClosed.prototype = {
20783           areaStart: noop$5,
20784           areaEnd: noop$5,
20785           lineStart: function() {
20786             this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =
20787             this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;
20788             this._point = 0;
20789           },
20790           lineEnd: function() {
20791             switch (this._point) {
20792               case 1: {
20793                 this._context.moveTo(this._x3, this._y3);
20794                 this._context.closePath();
20795                 break;
20796               }
20797               case 2: {
20798                 this._context.lineTo(this._x3, this._y3);
20799                 this._context.closePath();
20800                 break;
20801               }
20802               case 3: {
20803                 this.point(this._x3, this._y3);
20804                 this.point(this._x4, this._y4);
20805                 this.point(this._x5, this._y5);
20806                 break;
20807               }
20808             }
20809           },
20810           point: function(x, y) {
20811             x = +x, y = +y;
20812             switch (this._point) {
20813               case 0: this._point = 1; this._x3 = x, this._y3 = y; break;
20814               case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;
20815               case 2: this._point = 3; this._x5 = x, this._y5 = y; break;
20816               default: point$3(this, x, y); break;
20817             }
20818             this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
20819             this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
20820           }
20821         };
20822
20823         var cardinalClosed = (function custom(tension) {
20824
20825           function cardinal(context) {
20826             return new CardinalClosed(context, tension);
20827           }
20828
20829           cardinal.tension = function(tension) {
20830             return custom(+tension);
20831           };
20832
20833           return cardinal;
20834         })(0);
20835
20836         function CardinalOpen(context, tension) {
20837           this._context = context;
20838           this._k = (1 - tension) / 6;
20839         }
20840
20841         CardinalOpen.prototype = {
20842           areaStart: function() {
20843             this._line = 0;
20844           },
20845           areaEnd: function() {
20846             this._line = NaN;
20847           },
20848           lineStart: function() {
20849             this._x0 = this._x1 = this._x2 =
20850             this._y0 = this._y1 = this._y2 = NaN;
20851             this._point = 0;
20852           },
20853           lineEnd: function() {
20854             if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
20855             this._line = 1 - this._line;
20856           },
20857           point: function(x, y) {
20858             x = +x, y = +y;
20859             switch (this._point) {
20860               case 0: this._point = 1; break;
20861               case 1: this._point = 2; break;
20862               case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;
20863               case 3: this._point = 4; // proceed
20864               default: point$3(this, x, y); break;
20865             }
20866             this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
20867             this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
20868           }
20869         };
20870
20871         var cardinalOpen = (function custom(tension) {
20872
20873           function cardinal(context) {
20874             return new CardinalOpen(context, tension);
20875           }
20876
20877           cardinal.tension = function(tension) {
20878             return custom(+tension);
20879           };
20880
20881           return cardinal;
20882         })(0);
20883
20884         function point$4(that, x, y) {
20885           var x1 = that._x1,
20886               y1 = that._y1,
20887               x2 = that._x2,
20888               y2 = that._y2;
20889
20890           if (that._l01_a > epsilon$3) {
20891             var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a,
20892                 n = 3 * that._l01_a * (that._l01_a + that._l12_a);
20893             x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n;
20894             y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n;
20895           }
20896
20897           if (that._l23_a > epsilon$3) {
20898             var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a,
20899                 m = 3 * that._l23_a * (that._l23_a + that._l12_a);
20900             x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m;
20901             y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m;
20902           }
20903
20904           that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2);
20905         }
20906
20907         function CatmullRom(context, alpha) {
20908           this._context = context;
20909           this._alpha = alpha;
20910         }
20911
20912         CatmullRom.prototype = {
20913           areaStart: function() {
20914             this._line = 0;
20915           },
20916           areaEnd: function() {
20917             this._line = NaN;
20918           },
20919           lineStart: function() {
20920             this._x0 = this._x1 = this._x2 =
20921             this._y0 = this._y1 = this._y2 = NaN;
20922             this._l01_a = this._l12_a = this._l23_a =
20923             this._l01_2a = this._l12_2a = this._l23_2a =
20924             this._point = 0;
20925           },
20926           lineEnd: function() {
20927             switch (this._point) {
20928               case 2: this._context.lineTo(this._x2, this._y2); break;
20929               case 3: this.point(this._x2, this._y2); break;
20930             }
20931             if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
20932             this._line = 1 - this._line;
20933           },
20934           point: function(x, y) {
20935             x = +x, y = +y;
20936
20937             if (this._point) {
20938               var x23 = this._x2 - x,
20939                   y23 = this._y2 - y;
20940               this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
20941             }
20942
20943             switch (this._point) {
20944               case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
20945               case 1: this._point = 2; break;
20946               case 2: this._point = 3; // proceed
20947               default: point$4(this, x, y); break;
20948             }
20949
20950             this._l01_a = this._l12_a, this._l12_a = this._l23_a;
20951             this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
20952             this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
20953             this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
20954           }
20955         };
20956
20957         var catmullRom = (function custom(alpha) {
20958
20959           function catmullRom(context) {
20960             return alpha ? new CatmullRom(context, alpha) : new Cardinal(context, 0);
20961           }
20962
20963           catmullRom.alpha = function(alpha) {
20964             return custom(+alpha);
20965           };
20966
20967           return catmullRom;
20968         })(0.5);
20969
20970         function CatmullRomClosed(context, alpha) {
20971           this._context = context;
20972           this._alpha = alpha;
20973         }
20974
20975         CatmullRomClosed.prototype = {
20976           areaStart: noop$5,
20977           areaEnd: noop$5,
20978           lineStart: function() {
20979             this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =
20980             this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;
20981             this._l01_a = this._l12_a = this._l23_a =
20982             this._l01_2a = this._l12_2a = this._l23_2a =
20983             this._point = 0;
20984           },
20985           lineEnd: function() {
20986             switch (this._point) {
20987               case 1: {
20988                 this._context.moveTo(this._x3, this._y3);
20989                 this._context.closePath();
20990                 break;
20991               }
20992               case 2: {
20993                 this._context.lineTo(this._x3, this._y3);
20994                 this._context.closePath();
20995                 break;
20996               }
20997               case 3: {
20998                 this.point(this._x3, this._y3);
20999                 this.point(this._x4, this._y4);
21000                 this.point(this._x5, this._y5);
21001                 break;
21002               }
21003             }
21004           },
21005           point: function(x, y) {
21006             x = +x, y = +y;
21007
21008             if (this._point) {
21009               var x23 = this._x2 - x,
21010                   y23 = this._y2 - y;
21011               this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
21012             }
21013
21014             switch (this._point) {
21015               case 0: this._point = 1; this._x3 = x, this._y3 = y; break;
21016               case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;
21017               case 2: this._point = 3; this._x5 = x, this._y5 = y; break;
21018               default: point$4(this, x, y); break;
21019             }
21020
21021             this._l01_a = this._l12_a, this._l12_a = this._l23_a;
21022             this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
21023             this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
21024             this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
21025           }
21026         };
21027
21028         var catmullRomClosed = (function custom(alpha) {
21029
21030           function catmullRom(context) {
21031             return alpha ? new CatmullRomClosed(context, alpha) : new CardinalClosed(context, 0);
21032           }
21033
21034           catmullRom.alpha = function(alpha) {
21035             return custom(+alpha);
21036           };
21037
21038           return catmullRom;
21039         })(0.5);
21040
21041         function CatmullRomOpen(context, alpha) {
21042           this._context = context;
21043           this._alpha = alpha;
21044         }
21045
21046         CatmullRomOpen.prototype = {
21047           areaStart: function() {
21048             this._line = 0;
21049           },
21050           areaEnd: function() {
21051             this._line = NaN;
21052           },
21053           lineStart: function() {
21054             this._x0 = this._x1 = this._x2 =
21055             this._y0 = this._y1 = this._y2 = NaN;
21056             this._l01_a = this._l12_a = this._l23_a =
21057             this._l01_2a = this._l12_2a = this._l23_2a =
21058             this._point = 0;
21059           },
21060           lineEnd: function() {
21061             if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
21062             this._line = 1 - this._line;
21063           },
21064           point: function(x, y) {
21065             x = +x, y = +y;
21066
21067             if (this._point) {
21068               var x23 = this._x2 - x,
21069                   y23 = this._y2 - y;
21070               this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
21071             }
21072
21073             switch (this._point) {
21074               case 0: this._point = 1; break;
21075               case 1: this._point = 2; break;
21076               case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;
21077               case 3: this._point = 4; // proceed
21078               default: point$4(this, x, y); break;
21079             }
21080
21081             this._l01_a = this._l12_a, this._l12_a = this._l23_a;
21082             this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
21083             this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
21084             this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
21085           }
21086         };
21087
21088         var catmullRomOpen = (function custom(alpha) {
21089
21090           function catmullRom(context) {
21091             return alpha ? new CatmullRomOpen(context, alpha) : new CardinalOpen(context, 0);
21092           }
21093
21094           catmullRom.alpha = function(alpha) {
21095             return custom(+alpha);
21096           };
21097
21098           return catmullRom;
21099         })(0.5);
21100
21101         function LinearClosed(context) {
21102           this._context = context;
21103         }
21104
21105         LinearClosed.prototype = {
21106           areaStart: noop$5,
21107           areaEnd: noop$5,
21108           lineStart: function() {
21109             this._point = 0;
21110           },
21111           lineEnd: function() {
21112             if (this._point) this._context.closePath();
21113           },
21114           point: function(x, y) {
21115             x = +x, y = +y;
21116             if (this._point) this._context.lineTo(x, y);
21117             else this._point = 1, this._context.moveTo(x, y);
21118           }
21119         };
21120
21121         function linearClosed(context) {
21122           return new LinearClosed(context);
21123         }
21124
21125         function sign$3(x) {
21126           return x < 0 ? -1 : 1;
21127         }
21128
21129         // Calculate the slopes of the tangents (Hermite-type interpolation) based on
21130         // the following paper: Steffen, M. 1990. A Simple Method for Monotonic
21131         // Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO.
21132         // NOV(II), P. 443, 1990.
21133         function slope3(that, x2, y2) {
21134           var h0 = that._x1 - that._x0,
21135               h1 = x2 - that._x1,
21136               s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0),
21137               s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0),
21138               p = (s0 * h1 + s1 * h0) / (h0 + h1);
21139           return (sign$3(s0) + sign$3(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0;
21140         }
21141
21142         // Calculate a one-sided slope.
21143         function slope2(that, t) {
21144           var h = that._x1 - that._x0;
21145           return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t;
21146         }
21147
21148         // According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations
21149         // "you can express cubic Hermite interpolation in terms of cubic Bézier curves
21150         // with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1".
21151         function point$5(that, t0, t1) {
21152           var x0 = that._x0,
21153               y0 = that._y0,
21154               x1 = that._x1,
21155               y1 = that._y1,
21156               dx = (x1 - x0) / 3;
21157           that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1);
21158         }
21159
21160         function MonotoneX(context) {
21161           this._context = context;
21162         }
21163
21164         MonotoneX.prototype = {
21165           areaStart: function() {
21166             this._line = 0;
21167           },
21168           areaEnd: function() {
21169             this._line = NaN;
21170           },
21171           lineStart: function() {
21172             this._x0 = this._x1 =
21173             this._y0 = this._y1 =
21174             this._t0 = NaN;
21175             this._point = 0;
21176           },
21177           lineEnd: function() {
21178             switch (this._point) {
21179               case 2: this._context.lineTo(this._x1, this._y1); break;
21180               case 3: point$5(this, this._t0, slope2(this, this._t0)); break;
21181             }
21182             if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
21183             this._line = 1 - this._line;
21184           },
21185           point: function(x, y) {
21186             var t1 = NaN;
21187
21188             x = +x, y = +y;
21189             if (x === this._x1 && y === this._y1) return; // Ignore coincident points.
21190             switch (this._point) {
21191               case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
21192               case 1: this._point = 2; break;
21193               case 2: this._point = 3; point$5(this, slope2(this, t1 = slope3(this, x, y)), t1); break;
21194               default: point$5(this, this._t0, t1 = slope3(this, x, y)); break;
21195             }
21196
21197             this._x0 = this._x1, this._x1 = x;
21198             this._y0 = this._y1, this._y1 = y;
21199             this._t0 = t1;
21200           }
21201         };
21202
21203         function MonotoneY(context) {
21204           this._context = new ReflectContext(context);
21205         }
21206
21207         (MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) {
21208           MonotoneX.prototype.point.call(this, y, x);
21209         };
21210
21211         function ReflectContext(context) {
21212           this._context = context;
21213         }
21214
21215         ReflectContext.prototype = {
21216           moveTo: function(x, y) { this._context.moveTo(y, x); },
21217           closePath: function() { this._context.closePath(); },
21218           lineTo: function(x, y) { this._context.lineTo(y, x); },
21219           bezierCurveTo: function(x1, y1, x2, y2, x, y) { this._context.bezierCurveTo(y1, x1, y2, x2, y, x); }
21220         };
21221
21222         function monotoneX(context) {
21223           return new MonotoneX(context);
21224         }
21225
21226         function monotoneY(context) {
21227           return new MonotoneY(context);
21228         }
21229
21230         function Natural(context) {
21231           this._context = context;
21232         }
21233
21234         Natural.prototype = {
21235           areaStart: function() {
21236             this._line = 0;
21237           },
21238           areaEnd: function() {
21239             this._line = NaN;
21240           },
21241           lineStart: function() {
21242             this._x = [];
21243             this._y = [];
21244           },
21245           lineEnd: function() {
21246             var x = this._x,
21247                 y = this._y,
21248                 n = x.length;
21249
21250             if (n) {
21251               this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]);
21252               if (n === 2) {
21253                 this._context.lineTo(x[1], y[1]);
21254               } else {
21255                 var px = controlPoints(x),
21256                     py = controlPoints(y);
21257                 for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) {
21258                   this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]);
21259                 }
21260               }
21261             }
21262
21263             if (this._line || (this._line !== 0 && n === 1)) this._context.closePath();
21264             this._line = 1 - this._line;
21265             this._x = this._y = null;
21266           },
21267           point: function(x, y) {
21268             this._x.push(+x);
21269             this._y.push(+y);
21270           }
21271         };
21272
21273         // See https://www.particleincell.com/2012/bezier-splines/ for derivation.
21274         function controlPoints(x) {
21275           var i,
21276               n = x.length - 1,
21277               m,
21278               a = new Array(n),
21279               b = new Array(n),
21280               r = new Array(n);
21281           a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1];
21282           for (i = 1; i < n - 1; ++i) a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1];
21283           a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n];
21284           for (i = 1; i < n; ++i) m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1];
21285           a[n - 1] = r[n - 1] / b[n - 1];
21286           for (i = n - 2; i >= 0; --i) a[i] = (r[i] - a[i + 1]) / b[i];
21287           b[n - 1] = (x[n] + a[n - 1]) / 2;
21288           for (i = 0; i < n - 1; ++i) b[i] = 2 * x[i + 1] - a[i + 1];
21289           return [a, b];
21290         }
21291
21292         function natural(context) {
21293           return new Natural(context);
21294         }
21295
21296         function Step(context, t) {
21297           this._context = context;
21298           this._t = t;
21299         }
21300
21301         Step.prototype = {
21302           areaStart: function() {
21303             this._line = 0;
21304           },
21305           areaEnd: function() {
21306             this._line = NaN;
21307           },
21308           lineStart: function() {
21309             this._x = this._y = NaN;
21310             this._point = 0;
21311           },
21312           lineEnd: function() {
21313             if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y);
21314             if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
21315             if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line;
21316           },
21317           point: function(x, y) {
21318             x = +x, y = +y;
21319             switch (this._point) {
21320               case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
21321               case 1: this._point = 2; // proceed
21322               default: {
21323                 if (this._t <= 0) {
21324                   this._context.lineTo(this._x, y);
21325                   this._context.lineTo(x, y);
21326                 } else {
21327                   var x1 = this._x * (1 - this._t) + x * this._t;
21328                   this._context.lineTo(x1, this._y);
21329                   this._context.lineTo(x1, y);
21330                 }
21331                 break;
21332               }
21333             }
21334             this._x = x, this._y = y;
21335           }
21336         };
21337
21338         function step(context) {
21339           return new Step(context, 0.5);
21340         }
21341
21342         function stepBefore(context) {
21343           return new Step(context, 0);
21344         }
21345
21346         function stepAfter(context) {
21347           return new Step(context, 1);
21348         }
21349
21350         function none$1(series, order) {
21351           if (!((n = series.length) > 1)) return;
21352           for (var i = 1, j, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) {
21353             s0 = s1, s1 = series[order[i]];
21354             for (j = 0; j < m; ++j) {
21355               s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1];
21356             }
21357           }
21358         }
21359
21360         function none$2(series) {
21361           var n = series.length, o = new Array(n);
21362           while (--n >= 0) o[n] = n;
21363           return o;
21364         }
21365
21366         function stackValue(d, key) {
21367           return d[key];
21368         }
21369
21370         function stack() {
21371           var keys = constant$b([]),
21372               order = none$2,
21373               offset = none$1,
21374               value = stackValue;
21375
21376           function stack(data) {
21377             var kz = keys.apply(this, arguments),
21378                 i,
21379                 m = data.length,
21380                 n = kz.length,
21381                 sz = new Array(n),
21382                 oz;
21383
21384             for (i = 0; i < n; ++i) {
21385               for (var ki = kz[i], si = sz[i] = new Array(m), j = 0, sij; j < m; ++j) {
21386                 si[j] = sij = [0, +value(data[j], ki, j, data)];
21387                 sij.data = data[j];
21388               }
21389               si.key = ki;
21390             }
21391
21392             for (i = 0, oz = order(sz); i < n; ++i) {
21393               sz[oz[i]].index = i;
21394             }
21395
21396             offset(sz, oz);
21397             return sz;
21398           }
21399
21400           stack.keys = function(_) {
21401             return arguments.length ? (keys = typeof _ === "function" ? _ : constant$b(slice$a.call(_)), stack) : keys;
21402           };
21403
21404           stack.value = function(_) {
21405             return arguments.length ? (value = typeof _ === "function" ? _ : constant$b(+_), stack) : value;
21406           };
21407
21408           stack.order = function(_) {
21409             return arguments.length ? (order = _ == null ? none$2 : typeof _ === "function" ? _ : constant$b(slice$a.call(_)), stack) : order;
21410           };
21411
21412           stack.offset = function(_) {
21413             return arguments.length ? (offset = _ == null ? none$1 : _, stack) : offset;
21414           };
21415
21416           return stack;
21417         }
21418
21419         function expand(series, order) {
21420           if (!((n = series.length) > 0)) return;
21421           for (var i, n, j = 0, m = series[0].length, y; j < m; ++j) {
21422             for (y = i = 0; i < n; ++i) y += series[i][j][1] || 0;
21423             if (y) for (i = 0; i < n; ++i) series[i][j][1] /= y;
21424           }
21425           none$1(series, order);
21426         }
21427
21428         function diverging$1(series, order) {
21429           if (!((n = series.length) > 0)) return;
21430           for (var i, j = 0, d, dy, yp, yn, n, m = series[order[0]].length; j < m; ++j) {
21431             for (yp = yn = 0, i = 0; i < n; ++i) {
21432               if ((dy = (d = series[order[i]][j])[1] - d[0]) >= 0) {
21433                 d[0] = yp, d[1] = yp += dy;
21434               } else if (dy < 0) {
21435                 d[1] = yn, d[0] = yn += dy;
21436               } else {
21437                 d[0] = yp;
21438               }
21439             }
21440           }
21441         }
21442
21443         function silhouette(series, order) {
21444           if (!((n = series.length) > 0)) return;
21445           for (var j = 0, s0 = series[order[0]], n, m = s0.length; j < m; ++j) {
21446             for (var i = 0, y = 0; i < n; ++i) y += series[i][j][1] || 0;
21447             s0[j][1] += s0[j][0] = -y / 2;
21448           }
21449           none$1(series, order);
21450         }
21451
21452         function wiggle(series, order) {
21453           if (!((n = series.length) > 0) || !((m = (s0 = series[order[0]]).length) > 0)) return;
21454           for (var y = 0, j = 1, s0, m, n; j < m; ++j) {
21455             for (var i = 0, s1 = 0, s2 = 0; i < n; ++i) {
21456               var si = series[order[i]],
21457                   sij0 = si[j][1] || 0,
21458                   sij1 = si[j - 1][1] || 0,
21459                   s3 = (sij0 - sij1) / 2;
21460               for (var k = 0; k < i; ++k) {
21461                 var sk = series[order[k]],
21462                     skj0 = sk[j][1] || 0,
21463                     skj1 = sk[j - 1][1] || 0;
21464                 s3 += skj0 - skj1;
21465               }
21466               s1 += sij0, s2 += s3 * sij0;
21467             }
21468             s0[j - 1][1] += s0[j - 1][0] = y;
21469             if (s1) y -= s2 / s1;
21470           }
21471           s0[j - 1][1] += s0[j - 1][0] = y;
21472           none$1(series, order);
21473         }
21474
21475         function appearance(series) {
21476           var peaks = series.map(peak);
21477           return none$2(series).sort(function(a, b) { return peaks[a] - peaks[b]; });
21478         }
21479
21480         function peak(series) {
21481           var i = -1, j = 0, n = series.length, vi, vj = -Infinity;
21482           while (++i < n) if ((vi = +series[i][1]) > vj) vj = vi, j = i;
21483           return j;
21484         }
21485
21486         function ascending$2(series) {
21487           var sums = series.map(sum$2);
21488           return none$2(series).sort(function(a, b) { return sums[a] - sums[b]; });
21489         }
21490
21491         function sum$2(series) {
21492           var s = 0, i = -1, n = series.length, v;
21493           while (++i < n) if (v = +series[i][1]) s += v;
21494           return s;
21495         }
21496
21497         function descending$1(series) {
21498           return ascending$2(series).reverse();
21499         }
21500
21501         function insideOut(series) {
21502           var n = series.length,
21503               i,
21504               j,
21505               sums = series.map(sum$2),
21506               order = appearance(series),
21507               top = 0,
21508               bottom = 0,
21509               tops = [],
21510               bottoms = [];
21511
21512           for (i = 0; i < n; ++i) {
21513             j = order[i];
21514             if (top < bottom) {
21515               top += sums[j];
21516               tops.push(j);
21517             } else {
21518               bottom += sums[j];
21519               bottoms.push(j);
21520             }
21521           }
21522
21523           return bottoms.reverse().concat(tops);
21524         }
21525
21526         function reverse(series) {
21527           return none$2(series).reverse();
21528         }
21529
21530         function constant$c(x) {
21531           return function() {
21532             return x;
21533           };
21534         }
21535
21536         function x$4(d) {
21537           return d[0];
21538         }
21539
21540         function y$4(d) {
21541           return d[1];
21542         }
21543
21544         function RedBlackTree() {
21545           this._ = null; // root node
21546         }
21547
21548         function RedBlackNode(node) {
21549           node.U = // parent node
21550           node.C = // color - true for red, false for black
21551           node.L = // left node
21552           node.R = // right node
21553           node.P = // previous node
21554           node.N = null; // next node
21555         }
21556
21557         RedBlackTree.prototype = {
21558           constructor: RedBlackTree,
21559
21560           insert: function(after, node) {
21561             var parent, grandpa, uncle;
21562
21563             if (after) {
21564               node.P = after;
21565               node.N = after.N;
21566               if (after.N) after.N.P = node;
21567               after.N = node;
21568               if (after.R) {
21569                 after = after.R;
21570                 while (after.L) after = after.L;
21571                 after.L = node;
21572               } else {
21573                 after.R = node;
21574               }
21575               parent = after;
21576             } else if (this._) {
21577               after = RedBlackFirst(this._);
21578               node.P = null;
21579               node.N = after;
21580               after.P = after.L = node;
21581               parent = after;
21582             } else {
21583               node.P = node.N = null;
21584               this._ = node;
21585               parent = null;
21586             }
21587             node.L = node.R = null;
21588             node.U = parent;
21589             node.C = true;
21590
21591             after = node;
21592             while (parent && parent.C) {
21593               grandpa = parent.U;
21594               if (parent === grandpa.L) {
21595                 uncle = grandpa.R;
21596                 if (uncle && uncle.C) {
21597                   parent.C = uncle.C = false;
21598                   grandpa.C = true;
21599                   after = grandpa;
21600                 } else {
21601                   if (after === parent.R) {
21602                     RedBlackRotateLeft(this, parent);
21603                     after = parent;
21604                     parent = after.U;
21605                   }
21606                   parent.C = false;
21607                   grandpa.C = true;
21608                   RedBlackRotateRight(this, grandpa);
21609                 }
21610               } else {
21611                 uncle = grandpa.L;
21612                 if (uncle && uncle.C) {
21613                   parent.C = uncle.C = false;
21614                   grandpa.C = true;
21615                   after = grandpa;
21616                 } else {
21617                   if (after === parent.L) {
21618                     RedBlackRotateRight(this, parent);
21619                     after = parent;
21620                     parent = after.U;
21621                   }
21622                   parent.C = false;
21623                   grandpa.C = true;
21624                   RedBlackRotateLeft(this, grandpa);
21625                 }
21626               }
21627               parent = after.U;
21628             }
21629             this._.C = false;
21630           },
21631
21632           remove: function(node) {
21633             if (node.N) node.N.P = node.P;
21634             if (node.P) node.P.N = node.N;
21635             node.N = node.P = null;
21636
21637             var parent = node.U,
21638                 sibling,
21639                 left = node.L,
21640                 right = node.R,
21641                 next,
21642                 red;
21643
21644             if (!left) next = right;
21645             else if (!right) next = left;
21646             else next = RedBlackFirst(right);
21647
21648             if (parent) {
21649               if (parent.L === node) parent.L = next;
21650               else parent.R = next;
21651             } else {
21652               this._ = next;
21653             }
21654
21655             if (left && right) {
21656               red = next.C;
21657               next.C = node.C;
21658               next.L = left;
21659               left.U = next;
21660               if (next !== right) {
21661                 parent = next.U;
21662                 next.U = node.U;
21663                 node = next.R;
21664                 parent.L = node;
21665                 next.R = right;
21666                 right.U = next;
21667               } else {
21668                 next.U = parent;
21669                 parent = next;
21670                 node = next.R;
21671               }
21672             } else {
21673               red = node.C;
21674               node = next;
21675             }
21676
21677             if (node) node.U = parent;
21678             if (red) return;
21679             if (node && node.C) { node.C = false; return; }
21680
21681             do {
21682               if (node === this._) break;
21683               if (node === parent.L) {
21684                 sibling = parent.R;
21685                 if (sibling.C) {
21686                   sibling.C = false;
21687                   parent.C = true;
21688                   RedBlackRotateLeft(this, parent);
21689                   sibling = parent.R;
21690                 }
21691                 if ((sibling.L && sibling.L.C)
21692                     || (sibling.R && sibling.R.C)) {
21693                   if (!sibling.R || !sibling.R.C) {
21694                     sibling.L.C = false;
21695                     sibling.C = true;
21696                     RedBlackRotateRight(this, sibling);
21697                     sibling = parent.R;
21698                   }
21699                   sibling.C = parent.C;
21700                   parent.C = sibling.R.C = false;
21701                   RedBlackRotateLeft(this, parent);
21702                   node = this._;
21703                   break;
21704                 }
21705               } else {
21706                 sibling = parent.L;
21707                 if (sibling.C) {
21708                   sibling.C = false;
21709                   parent.C = true;
21710                   RedBlackRotateRight(this, parent);
21711                   sibling = parent.L;
21712                 }
21713                 if ((sibling.L && sibling.L.C)
21714                   || (sibling.R && sibling.R.C)) {
21715                   if (!sibling.L || !sibling.L.C) {
21716                     sibling.R.C = false;
21717                     sibling.C = true;
21718                     RedBlackRotateLeft(this, sibling);
21719                     sibling = parent.L;
21720                   }
21721                   sibling.C = parent.C;
21722                   parent.C = sibling.L.C = false;
21723                   RedBlackRotateRight(this, parent);
21724                   node = this._;
21725                   break;
21726                 }
21727               }
21728               sibling.C = true;
21729               node = parent;
21730               parent = parent.U;
21731             } while (!node.C);
21732
21733             if (node) node.C = false;
21734           }
21735         };
21736
21737         function RedBlackRotateLeft(tree, node) {
21738           var p = node,
21739               q = node.R,
21740               parent = p.U;
21741
21742           if (parent) {
21743             if (parent.L === p) parent.L = q;
21744             else parent.R = q;
21745           } else {
21746             tree._ = q;
21747           }
21748
21749           q.U = parent;
21750           p.U = q;
21751           p.R = q.L;
21752           if (p.R) p.R.U = p;
21753           q.L = p;
21754         }
21755
21756         function RedBlackRotateRight(tree, node) {
21757           var p = node,
21758               q = node.L,
21759               parent = p.U;
21760
21761           if (parent) {
21762             if (parent.L === p) parent.L = q;
21763             else parent.R = q;
21764           } else {
21765             tree._ = q;
21766           }
21767
21768           q.U = parent;
21769           p.U = q;
21770           p.L = q.R;
21771           if (p.L) p.L.U = p;
21772           q.R = p;
21773         }
21774
21775         function RedBlackFirst(node) {
21776           while (node.L) node = node.L;
21777           return node;
21778         }
21779
21780         function createEdge(left, right, v0, v1) {
21781           var edge = [null, null],
21782               index = edges.push(edge) - 1;
21783           edge.left = left;
21784           edge.right = right;
21785           if (v0) setEdgeEnd(edge, left, right, v0);
21786           if (v1) setEdgeEnd(edge, right, left, v1);
21787           cells[left.index].halfedges.push(index);
21788           cells[right.index].halfedges.push(index);
21789           return edge;
21790         }
21791
21792         function createBorderEdge(left, v0, v1) {
21793           var edge = [v0, v1];
21794           edge.left = left;
21795           return edge;
21796         }
21797
21798         function setEdgeEnd(edge, left, right, vertex) {
21799           if (!edge[0] && !edge[1]) {
21800             edge[0] = vertex;
21801             edge.left = left;
21802             edge.right = right;
21803           } else if (edge.left === right) {
21804             edge[1] = vertex;
21805           } else {
21806             edge[0] = vertex;
21807           }
21808         }
21809
21810         // Liang–Barsky line clipping.
21811         function clipEdge(edge, x0, y0, x1, y1) {
21812           var a = edge[0],
21813               b = edge[1],
21814               ax = a[0],
21815               ay = a[1],
21816               bx = b[0],
21817               by = b[1],
21818               t0 = 0,
21819               t1 = 1,
21820               dx = bx - ax,
21821               dy = by - ay,
21822               r;
21823
21824           r = x0 - ax;
21825           if (!dx && r > 0) return;
21826           r /= dx;
21827           if (dx < 0) {
21828             if (r < t0) return;
21829             if (r < t1) t1 = r;
21830           } else if (dx > 0) {
21831             if (r > t1) return;
21832             if (r > t0) t0 = r;
21833           }
21834
21835           r = x1 - ax;
21836           if (!dx && r < 0) return;
21837           r /= dx;
21838           if (dx < 0) {
21839             if (r > t1) return;
21840             if (r > t0) t0 = r;
21841           } else if (dx > 0) {
21842             if (r < t0) return;
21843             if (r < t1) t1 = r;
21844           }
21845
21846           r = y0 - ay;
21847           if (!dy && r > 0) return;
21848           r /= dy;
21849           if (dy < 0) {
21850             if (r < t0) return;
21851             if (r < t1) t1 = r;
21852           } else if (dy > 0) {
21853             if (r > t1) return;
21854             if (r > t0) t0 = r;
21855           }
21856
21857           r = y1 - ay;
21858           if (!dy && r < 0) return;
21859           r /= dy;
21860           if (dy < 0) {
21861             if (r > t1) return;
21862             if (r > t0) t0 = r;
21863           } else if (dy > 0) {
21864             if (r < t0) return;
21865             if (r < t1) t1 = r;
21866           }
21867
21868           if (!(t0 > 0) && !(t1 < 1)) return true; // TODO Better check?
21869
21870           if (t0 > 0) edge[0] = [ax + t0 * dx, ay + t0 * dy];
21871           if (t1 < 1) edge[1] = [ax + t1 * dx, ay + t1 * dy];
21872           return true;
21873         }
21874
21875         function connectEdge(edge, x0, y0, x1, y1) {
21876           var v1 = edge[1];
21877           if (v1) return true;
21878
21879           var v0 = edge[0],
21880               left = edge.left,
21881               right = edge.right,
21882               lx = left[0],
21883               ly = left[1],
21884               rx = right[0],
21885               ry = right[1],
21886               fx = (lx + rx) / 2,
21887               fy = (ly + ry) / 2,
21888               fm,
21889               fb;
21890
21891           if (ry === ly) {
21892             if (fx < x0 || fx >= x1) return;
21893             if (lx > rx) {
21894               if (!v0) v0 = [fx, y0];
21895               else if (v0[1] >= y1) return;
21896               v1 = [fx, y1];
21897             } else {
21898               if (!v0) v0 = [fx, y1];
21899               else if (v0[1] < y0) return;
21900               v1 = [fx, y0];
21901             }
21902           } else {
21903             fm = (lx - rx) / (ry - ly);
21904             fb = fy - fm * fx;
21905             if (fm < -1 || fm > 1) {
21906               if (lx > rx) {
21907                 if (!v0) v0 = [(y0 - fb) / fm, y0];
21908                 else if (v0[1] >= y1) return;
21909                 v1 = [(y1 - fb) / fm, y1];
21910               } else {
21911                 if (!v0) v0 = [(y1 - fb) / fm, y1];
21912                 else if (v0[1] < y0) return;
21913                 v1 = [(y0 - fb) / fm, y0];
21914               }
21915             } else {
21916               if (ly < ry) {
21917                 if (!v0) v0 = [x0, fm * x0 + fb];
21918                 else if (v0[0] >= x1) return;
21919                 v1 = [x1, fm * x1 + fb];
21920               } else {
21921                 if (!v0) v0 = [x1, fm * x1 + fb];
21922                 else if (v0[0] < x0) return;
21923                 v1 = [x0, fm * x0 + fb];
21924               }
21925             }
21926           }
21927
21928           edge[0] = v0;
21929           edge[1] = v1;
21930           return true;
21931         }
21932
21933         function clipEdges(x0, y0, x1, y1) {
21934           var i = edges.length,
21935               edge;
21936
21937           while (i--) {
21938             if (!connectEdge(edge = edges[i], x0, y0, x1, y1)
21939                 || !clipEdge(edge, x0, y0, x1, y1)
21940                 || !(Math.abs(edge[0][0] - edge[1][0]) > epsilon$4
21941                     || Math.abs(edge[0][1] - edge[1][1]) > epsilon$4)) {
21942               delete edges[i];
21943             }
21944           }
21945         }
21946
21947         function createCell(site) {
21948           return cells[site.index] = {
21949             site: site,
21950             halfedges: []
21951           };
21952         }
21953
21954         function cellHalfedgeAngle(cell, edge) {
21955           var site = cell.site,
21956               va = edge.left,
21957               vb = edge.right;
21958           if (site === vb) vb = va, va = site;
21959           if (vb) return Math.atan2(vb[1] - va[1], vb[0] - va[0]);
21960           if (site === va) va = edge[1], vb = edge[0];
21961           else va = edge[0], vb = edge[1];
21962           return Math.atan2(va[0] - vb[0], vb[1] - va[1]);
21963         }
21964
21965         function cellHalfedgeStart(cell, edge) {
21966           return edge[+(edge.left !== cell.site)];
21967         }
21968
21969         function cellHalfedgeEnd(cell, edge) {
21970           return edge[+(edge.left === cell.site)];
21971         }
21972
21973         function sortCellHalfedges() {
21974           for (var i = 0, n = cells.length, cell, halfedges, j, m; i < n; ++i) {
21975             if ((cell = cells[i]) && (m = (halfedges = cell.halfedges).length)) {
21976               var index = new Array(m),
21977                   array = new Array(m);
21978               for (j = 0; j < m; ++j) index[j] = j, array[j] = cellHalfedgeAngle(cell, edges[halfedges[j]]);
21979               index.sort(function(i, j) { return array[j] - array[i]; });
21980               for (j = 0; j < m; ++j) array[j] = halfedges[index[j]];
21981               for (j = 0; j < m; ++j) halfedges[j] = array[j];
21982             }
21983           }
21984         }
21985
21986         function clipCells(x0, y0, x1, y1) {
21987           var nCells = cells.length,
21988               iCell,
21989               cell,
21990               site,
21991               iHalfedge,
21992               halfedges,
21993               nHalfedges,
21994               start,
21995               startX,
21996               startY,
21997               end,
21998               endX,
21999               endY,
22000               cover = true;
22001
22002           for (iCell = 0; iCell < nCells; ++iCell) {
22003             if (cell = cells[iCell]) {
22004               site = cell.site;
22005               halfedges = cell.halfedges;
22006               iHalfedge = halfedges.length;
22007
22008               // Remove any dangling clipped edges.
22009               while (iHalfedge--) {
22010                 if (!edges[halfedges[iHalfedge]]) {
22011                   halfedges.splice(iHalfedge, 1);
22012                 }
22013               }
22014
22015               // Insert any border edges as necessary.
22016               iHalfedge = 0, nHalfedges = halfedges.length;
22017               while (iHalfedge < nHalfedges) {
22018                 end = cellHalfedgeEnd(cell, edges[halfedges[iHalfedge]]), endX = end[0], endY = end[1];
22019                 start = cellHalfedgeStart(cell, edges[halfedges[++iHalfedge % nHalfedges]]), startX = start[0], startY = start[1];
22020                 if (Math.abs(endX - startX) > epsilon$4 || Math.abs(endY - startY) > epsilon$4) {
22021                   halfedges.splice(iHalfedge, 0, edges.push(createBorderEdge(site, end,
22022                       Math.abs(endX - x0) < epsilon$4 && y1 - endY > epsilon$4 ? [x0, Math.abs(startX - x0) < epsilon$4 ? startY : y1]
22023                       : Math.abs(endY - y1) < epsilon$4 && x1 - endX > epsilon$4 ? [Math.abs(startY - y1) < epsilon$4 ? startX : x1, y1]
22024                       : Math.abs(endX - x1) < epsilon$4 && endY - y0 > epsilon$4 ? [x1, Math.abs(startX - x1) < epsilon$4 ? startY : y0]
22025                       : Math.abs(endY - y0) < epsilon$4 && endX - x0 > epsilon$4 ? [Math.abs(startY - y0) < epsilon$4 ? startX : x0, y0]
22026                       : null)) - 1);
22027                   ++nHalfedges;
22028                 }
22029               }
22030
22031               if (nHalfedges) cover = false;
22032             }
22033           }
22034
22035           // If there weren’t any edges, have the closest site cover the extent.
22036           // It doesn’t matter which corner of the extent we measure!
22037           if (cover) {
22038             var dx, dy, d2, dc = Infinity;
22039
22040             for (iCell = 0, cover = null; iCell < nCells; ++iCell) {
22041               if (cell = cells[iCell]) {
22042                 site = cell.site;
22043                 dx = site[0] - x0;
22044                 dy = site[1] - y0;
22045                 d2 = dx * dx + dy * dy;
22046                 if (d2 < dc) dc = d2, cover = cell;
22047               }
22048             }
22049
22050             if (cover) {
22051               var v00 = [x0, y0], v01 = [x0, y1], v11 = [x1, y1], v10 = [x1, y0];
22052               cover.halfedges.push(
22053                 edges.push(createBorderEdge(site = cover.site, v00, v01)) - 1,
22054                 edges.push(createBorderEdge(site, v01, v11)) - 1,
22055                 edges.push(createBorderEdge(site, v11, v10)) - 1,
22056                 edges.push(createBorderEdge(site, v10, v00)) - 1
22057               );
22058             }
22059           }
22060
22061           // Lastly delete any cells with no edges; these were entirely clipped.
22062           for (iCell = 0; iCell < nCells; ++iCell) {
22063             if (cell = cells[iCell]) {
22064               if (!cell.halfedges.length) {
22065                 delete cells[iCell];
22066               }
22067             }
22068           }
22069         }
22070
22071         var circlePool = [];
22072
22073         var firstCircle;
22074
22075         function Circle() {
22076           RedBlackNode(this);
22077           this.x =
22078           this.y =
22079           this.arc =
22080           this.site =
22081           this.cy = null;
22082         }
22083
22084         function attachCircle(arc) {
22085           var lArc = arc.P,
22086               rArc = arc.N;
22087
22088           if (!lArc || !rArc) return;
22089
22090           var lSite = lArc.site,
22091               cSite = arc.site,
22092               rSite = rArc.site;
22093
22094           if (lSite === rSite) return;
22095
22096           var bx = cSite[0],
22097               by = cSite[1],
22098               ax = lSite[0] - bx,
22099               ay = lSite[1] - by,
22100               cx = rSite[0] - bx,
22101               cy = rSite[1] - by;
22102
22103           var d = 2 * (ax * cy - ay * cx);
22104           if (d >= -epsilon2$2) return;
22105
22106           var ha = ax * ax + ay * ay,
22107               hc = cx * cx + cy * cy,
22108               x = (cy * ha - ay * hc) / d,
22109               y = (ax * hc - cx * ha) / d;
22110
22111           var circle = circlePool.pop() || new Circle;
22112           circle.arc = arc;
22113           circle.site = cSite;
22114           circle.x = x + bx;
22115           circle.y = (circle.cy = y + by) + Math.sqrt(x * x + y * y); // y bottom
22116
22117           arc.circle = circle;
22118
22119           var before = null,
22120               node = circles._;
22121
22122           while (node) {
22123             if (circle.y < node.y || (circle.y === node.y && circle.x <= node.x)) {
22124               if (node.L) node = node.L;
22125               else { before = node.P; break; }
22126             } else {
22127               if (node.R) node = node.R;
22128               else { before = node; break; }
22129             }
22130           }
22131
22132           circles.insert(before, circle);
22133           if (!before) firstCircle = circle;
22134         }
22135
22136         function detachCircle(arc) {
22137           var circle = arc.circle;
22138           if (circle) {
22139             if (!circle.P) firstCircle = circle.N;
22140             circles.remove(circle);
22141             circlePool.push(circle);
22142             RedBlackNode(circle);
22143             arc.circle = null;
22144           }
22145         }
22146
22147         var beachPool = [];
22148
22149         function Beach() {
22150           RedBlackNode(this);
22151           this.edge =
22152           this.site =
22153           this.circle = null;
22154         }
22155
22156         function createBeach(site) {
22157           var beach = beachPool.pop() || new Beach;
22158           beach.site = site;
22159           return beach;
22160         }
22161
22162         function detachBeach(beach) {
22163           detachCircle(beach);
22164           beaches.remove(beach);
22165           beachPool.push(beach);
22166           RedBlackNode(beach);
22167         }
22168
22169         function removeBeach(beach) {
22170           var circle = beach.circle,
22171               x = circle.x,
22172               y = circle.cy,
22173               vertex = [x, y],
22174               previous = beach.P,
22175               next = beach.N,
22176               disappearing = [beach];
22177
22178           detachBeach(beach);
22179
22180           var lArc = previous;
22181           while (lArc.circle
22182               && Math.abs(x - lArc.circle.x) < epsilon$4
22183               && Math.abs(y - lArc.circle.cy) < epsilon$4) {
22184             previous = lArc.P;
22185             disappearing.unshift(lArc);
22186             detachBeach(lArc);
22187             lArc = previous;
22188           }
22189
22190           disappearing.unshift(lArc);
22191           detachCircle(lArc);
22192
22193           var rArc = next;
22194           while (rArc.circle
22195               && Math.abs(x - rArc.circle.x) < epsilon$4
22196               && Math.abs(y - rArc.circle.cy) < epsilon$4) {
22197             next = rArc.N;
22198             disappearing.push(rArc);
22199             detachBeach(rArc);
22200             rArc = next;
22201           }
22202
22203           disappearing.push(rArc);
22204           detachCircle(rArc);
22205
22206           var nArcs = disappearing.length,
22207               iArc;
22208           for (iArc = 1; iArc < nArcs; ++iArc) {
22209             rArc = disappearing[iArc];
22210             lArc = disappearing[iArc - 1];
22211             setEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex);
22212           }
22213
22214           lArc = disappearing[0];
22215           rArc = disappearing[nArcs - 1];
22216           rArc.edge = createEdge(lArc.site, rArc.site, null, vertex);
22217
22218           attachCircle(lArc);
22219           attachCircle(rArc);
22220         }
22221
22222         function addBeach(site) {
22223           var x = site[0],
22224               directrix = site[1],
22225               lArc,
22226               rArc,
22227               dxl,
22228               dxr,
22229               node = beaches._;
22230
22231           while (node) {
22232             dxl = leftBreakPoint(node, directrix) - x;
22233             if (dxl > epsilon$4) node = node.L; else {
22234               dxr = x - rightBreakPoint(node, directrix);
22235               if (dxr > epsilon$4) {
22236                 if (!node.R) {
22237                   lArc = node;
22238                   break;
22239                 }
22240                 node = node.R;
22241               } else {
22242                 if (dxl > -epsilon$4) {
22243                   lArc = node.P;
22244                   rArc = node;
22245                 } else if (dxr > -epsilon$4) {
22246                   lArc = node;
22247                   rArc = node.N;
22248                 } else {
22249                   lArc = rArc = node;
22250                 }
22251                 break;
22252               }
22253             }
22254           }
22255
22256           createCell(site);
22257           var newArc = createBeach(site);
22258           beaches.insert(lArc, newArc);
22259
22260           if (!lArc && !rArc) return;
22261
22262           if (lArc === rArc) {
22263             detachCircle(lArc);
22264             rArc = createBeach(lArc.site);
22265             beaches.insert(newArc, rArc);
22266             newArc.edge = rArc.edge = createEdge(lArc.site, newArc.site);
22267             attachCircle(lArc);
22268             attachCircle(rArc);
22269             return;
22270           }
22271
22272           if (!rArc) { // && lArc
22273             newArc.edge = createEdge(lArc.site, newArc.site);
22274             return;
22275           }
22276
22277           // else lArc !== rArc
22278           detachCircle(lArc);
22279           detachCircle(rArc);
22280
22281           var lSite = lArc.site,
22282               ax = lSite[0],
22283               ay = lSite[1],
22284               bx = site[0] - ax,
22285               by = site[1] - ay,
22286               rSite = rArc.site,
22287               cx = rSite[0] - ax,
22288               cy = rSite[1] - ay,
22289               d = 2 * (bx * cy - by * cx),
22290               hb = bx * bx + by * by,
22291               hc = cx * cx + cy * cy,
22292               vertex = [(cy * hb - by * hc) / d + ax, (bx * hc - cx * hb) / d + ay];
22293
22294           setEdgeEnd(rArc.edge, lSite, rSite, vertex);
22295           newArc.edge = createEdge(lSite, site, null, vertex);
22296           rArc.edge = createEdge(site, rSite, null, vertex);
22297           attachCircle(lArc);
22298           attachCircle(rArc);
22299         }
22300
22301         function leftBreakPoint(arc, directrix) {
22302           var site = arc.site,
22303               rfocx = site[0],
22304               rfocy = site[1],
22305               pby2 = rfocy - directrix;
22306
22307           if (!pby2) return rfocx;
22308
22309           var lArc = arc.P;
22310           if (!lArc) return -Infinity;
22311
22312           site = lArc.site;
22313           var lfocx = site[0],
22314               lfocy = site[1],
22315               plby2 = lfocy - directrix;
22316
22317           if (!plby2) return lfocx;
22318
22319           var hl = lfocx - rfocx,
22320               aby2 = 1 / pby2 - 1 / plby2,
22321               b = hl / plby2;
22322
22323           if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx;
22324
22325           return (rfocx + lfocx) / 2;
22326         }
22327
22328         function rightBreakPoint(arc, directrix) {
22329           var rArc = arc.N;
22330           if (rArc) return leftBreakPoint(rArc, directrix);
22331           var site = arc.site;
22332           return site[1] === directrix ? site[0] : Infinity;
22333         }
22334
22335         var epsilon$4 = 1e-6;
22336         var epsilon2$2 = 1e-12;
22337         var beaches;
22338         var cells;
22339         var circles;
22340         var edges;
22341
22342         function triangleArea(a, b, c) {
22343           return (a[0] - c[0]) * (b[1] - a[1]) - (a[0] - b[0]) * (c[1] - a[1]);
22344         }
22345
22346         function lexicographic(a, b) {
22347           return b[1] - a[1]
22348               || b[0] - a[0];
22349         }
22350
22351         function Diagram(sites, extent) {
22352           var site = sites.sort(lexicographic).pop(),
22353               x,
22354               y,
22355               circle;
22356
22357           edges = [];
22358           cells = new Array(sites.length);
22359           beaches = new RedBlackTree;
22360           circles = new RedBlackTree;
22361
22362           while (true) {
22363             circle = firstCircle;
22364             if (site && (!circle || site[1] < circle.y || (site[1] === circle.y && site[0] < circle.x))) {
22365               if (site[0] !== x || site[1] !== y) {
22366                 addBeach(site);
22367                 x = site[0], y = site[1];
22368               }
22369               site = sites.pop();
22370             } else if (circle) {
22371               removeBeach(circle.arc);
22372             } else {
22373               break;
22374             }
22375           }
22376
22377           sortCellHalfedges();
22378
22379           if (extent) {
22380             var x0 = +extent[0][0],
22381                 y0 = +extent[0][1],
22382                 x1 = +extent[1][0],
22383                 y1 = +extent[1][1];
22384             clipEdges(x0, y0, x1, y1);
22385             clipCells(x0, y0, x1, y1);
22386           }
22387
22388           this.edges = edges;
22389           this.cells = cells;
22390
22391           beaches =
22392           circles =
22393           edges =
22394           cells = null;
22395         }
22396
22397         Diagram.prototype = {
22398           constructor: Diagram,
22399
22400           polygons: function() {
22401             var edges = this.edges;
22402
22403             return this.cells.map(function(cell) {
22404               var polygon = cell.halfedges.map(function(i) { return cellHalfedgeStart(cell, edges[i]); });
22405               polygon.data = cell.site.data;
22406               return polygon;
22407             });
22408           },
22409
22410           triangles: function() {
22411             var triangles = [],
22412                 edges = this.edges;
22413
22414             this.cells.forEach(function(cell, i) {
22415               if (!(m = (halfedges = cell.halfedges).length)) return;
22416               var site = cell.site,
22417                   halfedges,
22418                   j = -1,
22419                   m,
22420                   s0,
22421                   e1 = edges[halfedges[m - 1]],
22422                   s1 = e1.left === site ? e1.right : e1.left;
22423
22424               while (++j < m) {
22425                 s0 = s1;
22426                 e1 = edges[halfedges[j]];
22427                 s1 = e1.left === site ? e1.right : e1.left;
22428                 if (s0 && s1 && i < s0.index && i < s1.index && triangleArea(site, s0, s1) < 0) {
22429                   triangles.push([site.data, s0.data, s1.data]);
22430                 }
22431               }
22432             });
22433
22434             return triangles;
22435           },
22436
22437           links: function() {
22438             return this.edges.filter(function(edge) {
22439               return edge.right;
22440             }).map(function(edge) {
22441               return {
22442                 source: edge.left.data,
22443                 target: edge.right.data
22444               };
22445             });
22446           },
22447
22448           find: function(x, y, radius) {
22449             var that = this, i0, i1 = that._found || 0, n = that.cells.length, cell;
22450
22451             // Use the previously-found cell, or start with an arbitrary one.
22452             while (!(cell = that.cells[i1])) if (++i1 >= n) return null;
22453             var dx = x - cell.site[0], dy = y - cell.site[1], d2 = dx * dx + dy * dy;
22454
22455             // Traverse the half-edges to find a closer cell, if any.
22456             do {
22457               cell = that.cells[i0 = i1], i1 = null;
22458               cell.halfedges.forEach(function(e) {
22459                 var edge = that.edges[e], v = edge.left;
22460                 if ((v === cell.site || !v) && !(v = edge.right)) return;
22461                 var vx = x - v[0], vy = y - v[1], v2 = vx * vx + vy * vy;
22462                 if (v2 < d2) d2 = v2, i1 = v.index;
22463               });
22464             } while (i1 !== null);
22465
22466             that._found = i0;
22467
22468             return radius == null || d2 <= radius * radius ? cell.site : null;
22469           }
22470         };
22471
22472         function voronoi() {
22473           var x = x$4,
22474               y = y$4,
22475               extent = null;
22476
22477           function voronoi(data) {
22478             return new Diagram(data.map(function(d, i) {
22479               var s = [Math.round(x(d, i, data) / epsilon$4) * epsilon$4, Math.round(y(d, i, data) / epsilon$4) * epsilon$4];
22480               s.index = i;
22481               s.data = d;
22482               return s;
22483             }), extent);
22484           }
22485
22486           voronoi.polygons = function(data) {
22487             return voronoi(data).polygons();
22488           };
22489
22490           voronoi.links = function(data) {
22491             return voronoi(data).links();
22492           };
22493
22494           voronoi.triangles = function(data) {
22495             return voronoi(data).triangles();
22496           };
22497
22498           voronoi.x = function(_) {
22499             return arguments.length ? (x = typeof _ === "function" ? _ : constant$c(+_), voronoi) : x;
22500           };
22501
22502           voronoi.y = function(_) {
22503             return arguments.length ? (y = typeof _ === "function" ? _ : constant$c(+_), voronoi) : y;
22504           };
22505
22506           voronoi.extent = function(_) {
22507             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]]];
22508           };
22509
22510           voronoi.size = function(_) {
22511             return arguments.length ? (extent = _ == null ? null : [[0, 0], [+_[0], +_[1]]], voronoi) : extent && [extent[1][0] - extent[0][0], extent[1][1] - extent[0][1]];
22512           };
22513
22514           return voronoi;
22515         }
22516
22517         function constant$d(x) {
22518           return function() {
22519             return x;
22520           };
22521         }
22522
22523         function ZoomEvent(target, type, transform) {
22524           this.target = target;
22525           this.type = type;
22526           this.transform = transform;
22527         }
22528
22529         function Transform(k, x, y) {
22530           this.k = k;
22531           this.x = x;
22532           this.y = y;
22533         }
22534
22535         Transform.prototype = {
22536           constructor: Transform,
22537           scale: function(k) {
22538             return k === 1 ? this : new Transform(this.k * k, this.x, this.y);
22539           },
22540           translate: function(x, y) {
22541             return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y);
22542           },
22543           apply: function(point) {
22544             return [point[0] * this.k + this.x, point[1] * this.k + this.y];
22545           },
22546           applyX: function(x) {
22547             return x * this.k + this.x;
22548           },
22549           applyY: function(y) {
22550             return y * this.k + this.y;
22551           },
22552           invert: function(location) {
22553             return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k];
22554           },
22555           invertX: function(x) {
22556             return (x - this.x) / this.k;
22557           },
22558           invertY: function(y) {
22559             return (y - this.y) / this.k;
22560           },
22561           rescaleX: function(x) {
22562             return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x));
22563           },
22564           rescaleY: function(y) {
22565             return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y));
22566           },
22567           toString: function() {
22568             return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")";
22569           }
22570         };
22571
22572         var identity$8 = new Transform(1, 0, 0);
22573
22574         transform.prototype = Transform.prototype;
22575
22576         function transform(node) {
22577           return node.__zoom || identity$8;
22578         }
22579
22580         function nopropagation$2() {
22581           event.stopImmediatePropagation();
22582         }
22583
22584         function noevent$2() {
22585           event.preventDefault();
22586           event.stopImmediatePropagation();
22587         }
22588
22589         // Ignore right-click, since that should open the context menu.
22590         function defaultFilter$2() {
22591           return !event.button;
22592         }
22593
22594         function defaultExtent$1() {
22595           var e = this, w, h;
22596           if (e instanceof SVGElement) {
22597             e = e.ownerSVGElement || e;
22598             w = e.width.baseVal.value;
22599             h = e.height.baseVal.value;
22600           } else {
22601             w = e.clientWidth;
22602             h = e.clientHeight;
22603           }
22604           return [[0, 0], [w, h]];
22605         }
22606
22607         function defaultTransform() {
22608           return this.__zoom || identity$8;
22609         }
22610
22611         function defaultWheelDelta() {
22612           return -event.deltaY * (event.deltaMode ? 120 : 1) / 500;
22613         }
22614
22615         function defaultTouchable$1() {
22616           return "ontouchstart" in this;
22617         }
22618
22619         function defaultConstrain(transform, extent, translateExtent) {
22620           var dx0 = transform.invertX(extent[0][0]) - translateExtent[0][0],
22621               dx1 = transform.invertX(extent[1][0]) - translateExtent[1][0],
22622               dy0 = transform.invertY(extent[0][1]) - translateExtent[0][1],
22623               dy1 = transform.invertY(extent[1][1]) - translateExtent[1][1];
22624           return transform.translate(
22625             dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1),
22626             dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1)
22627           );
22628         }
22629
22630         function d3_zoom() {
22631           var filter = defaultFilter$2,
22632               extent = defaultExtent$1,
22633               constrain = defaultConstrain,
22634               wheelDelta = defaultWheelDelta,
22635               touchable = defaultTouchable$1,
22636               scaleExtent = [0, Infinity],
22637               translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]],
22638               duration = 250,
22639               interpolate = interpolateZoom,
22640               gestures = [],
22641               listeners = dispatch("start", "zoom", "end"),
22642               touchstarting,
22643               touchending,
22644               touchDelay = 500,
22645               wheelDelay = 150,
22646               clickDistance2 = 0;
22647
22648           function zoom(selection) {
22649             selection
22650                 .property("__zoom", defaultTransform)
22651                 .on("wheel.zoom", wheeled)
22652                 .on("mousedown.zoom", mousedowned)
22653                 .on("dblclick.zoom", dblclicked)
22654               .filter(touchable)
22655                 .on("touchstart.zoom", touchstarted)
22656                 .on("touchmove.zoom", touchmoved)
22657                 .on("touchend.zoom touchcancel.zoom", touchended)
22658                 .style("touch-action", "none")
22659                 .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
22660           }
22661
22662           zoom.transform = function(collection, transform) {
22663             var selection = collection.selection ? collection.selection() : collection;
22664             selection.property("__zoom", defaultTransform);
22665             if (collection !== selection) {
22666               schedule(collection, transform);
22667             } else {
22668               selection.interrupt().each(function() {
22669                 gesture(this, arguments)
22670                     .start()
22671                     .zoom(null, typeof transform === "function" ? transform.apply(this, arguments) : transform)
22672                     .end();
22673               });
22674             }
22675           };
22676
22677           zoom.scaleBy = function(selection, k) {
22678             zoom.scaleTo(selection, function() {
22679               var k0 = this.__zoom.k,
22680                   k1 = typeof k === "function" ? k.apply(this, arguments) : k;
22681               return k0 * k1;
22682             });
22683           };
22684
22685           zoom.scaleTo = function(selection, k) {
22686             zoom.transform(selection, function() {
22687               var e = extent.apply(this, arguments),
22688                   t0 = this.__zoom,
22689                   p0 = centroid(e),
22690                   p1 = t0.invert(p0),
22691                   k1 = typeof k === "function" ? k.apply(this, arguments) : k;
22692               return constrain(translate(scale(t0, k1), p0, p1), e, translateExtent);
22693             });
22694           };
22695
22696           zoom.translateBy = function(selection, x, y) {
22697             zoom.transform(selection, function() {
22698               return constrain(this.__zoom.translate(
22699                 typeof x === "function" ? x.apply(this, arguments) : x,
22700                 typeof y === "function" ? y.apply(this, arguments) : y
22701               ), extent.apply(this, arguments), translateExtent);
22702             });
22703           };
22704
22705           zoom.translateTo = function(selection, x, y) {
22706             zoom.transform(selection, function() {
22707               var e = extent.apply(this, arguments),
22708                   t = this.__zoom,
22709                   p = centroid(e);
22710               return constrain(identity$8.translate(p[0], p[1]).scale(t.k).translate(
22711                 typeof x === "function" ? -x.apply(this, arguments) : -x,
22712                 typeof y === "function" ? -y.apply(this, arguments) : -y
22713               ), e, translateExtent);
22714             });
22715           };
22716
22717           function scale(transform, k) {
22718             k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k));
22719             return k === transform.k ? transform : new Transform(k, transform.x, transform.y);
22720           }
22721
22722           function translate(transform, p0, p1) {
22723             var x = p0[0] - p1[0] * transform.k, y = p0[1] - p1[1] * transform.k;
22724             return x === transform.x && y === transform.y ? transform : new Transform(transform.k, x, y);
22725           }
22726
22727           function centroid(extent) {
22728             return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1][1]) / 2];
22729           }
22730
22731           function schedule(transition, transform, center) {
22732             transition
22733                 .on("start.zoom", function() { gesture(this, arguments).start(); })
22734                 .on("interrupt.zoom end.zoom", function() { gesture(this, arguments).end(); })
22735                 .tween("zoom", function() {
22736                   var that = this,
22737                       args = arguments,
22738                       g = gesture(that, args),
22739                       e = extent.apply(that, args),
22740                       p = center || centroid(e),
22741                       w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]),
22742                       a = that.__zoom,
22743                       b = typeof transform === "function" ? transform.apply(that, args) : transform,
22744                       i = interpolate(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k));
22745                   return function(t) {
22746                     if (t === 1) t = b; // Avoid rounding error on end.
22747                     else { var l = i(t), k = w / l[2]; t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k); }
22748                     g.zoom(null, t);
22749                   };
22750                 });
22751           }
22752
22753           function gesture(that, args) {
22754             for (var i = 0, n = gestures.length, g; i < n; ++i) {
22755               if ((g = gestures[i]).that === that) {
22756                 return g;
22757               }
22758             }
22759             return new Gesture(that, args);
22760           }
22761
22762           function Gesture(that, args) {
22763             this.that = that;
22764             this.args = args;
22765             this.index = -1;
22766             this.active = 0;
22767             this.extent = extent.apply(that, args);
22768           }
22769
22770           Gesture.prototype = {
22771             start: function() {
22772               if (++this.active === 1) {
22773                 this.index = gestures.push(this) - 1;
22774                 this.emit("start");
22775               }
22776               return this;
22777             },
22778             zoom: function(key, transform) {
22779               if (this.mouse && key !== "mouse") this.mouse[1] = transform.invert(this.mouse[0]);
22780               if (this.touch0 && key !== "touch") this.touch0[1] = transform.invert(this.touch0[0]);
22781               if (this.touch1 && key !== "touch") this.touch1[1] = transform.invert(this.touch1[0]);
22782               this.that.__zoom = transform;
22783               this.emit("zoom");
22784               return this;
22785             },
22786             end: function() {
22787               if (--this.active === 0) {
22788                 gestures.splice(this.index, 1);
22789                 this.index = -1;
22790                 this.emit("end");
22791               }
22792               return this;
22793             },
22794             emit: function(type) {
22795               customEvent(new ZoomEvent(zoom, type, this.that.__zoom), listeners.apply, listeners, [type, this.that, this.args]);
22796             }
22797           };
22798
22799           function wheeled() {
22800             if (!filter.apply(this, arguments)) return;
22801             var g = gesture(this, arguments),
22802                 t = this.__zoom,
22803                 k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))),
22804                 p = d3_mouse(this);
22805
22806             // If the mouse is in the same location as before, reuse it.
22807             // If there were recent wheel events, reset the wheel idle timeout.
22808             if (g.wheel) {
22809               if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) {
22810                 g.mouse[1] = t.invert(g.mouse[0] = p);
22811               }
22812               clearTimeout(g.wheel);
22813             }
22814
22815             // If this wheel event won’t trigger a transform change, ignore it.
22816             else if (t.k === k) return;
22817
22818             // Otherwise, capture the mouse point and location at the start.
22819             else {
22820               g.mouse = [p, t.invert(p)];
22821               interrupt(this);
22822               g.start();
22823             }
22824
22825             noevent$2();
22826             g.wheel = setTimeout(wheelidled, wheelDelay);
22827             g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent));
22828
22829             function wheelidled() {
22830               g.wheel = null;
22831               g.end();
22832             }
22833           }
22834
22835           function mousedowned() {
22836             if (touchending || !filter.apply(this, arguments)) return;
22837             var g = gesture(this, arguments),
22838                 v = d3_select(event.view).on("mousemove.zoom", mousemoved, true).on("mouseup.zoom", mouseupped, true),
22839                 p = d3_mouse(this),
22840                 x0 = event.clientX,
22841                 y0 = event.clientY;
22842
22843             dragDisable(event.view);
22844             nopropagation$2();
22845             g.mouse = [p, this.__zoom.invert(p)];
22846             interrupt(this);
22847             g.start();
22848
22849             function mousemoved() {
22850               noevent$2();
22851               if (!g.moved) {
22852                 var dx = event.clientX - x0, dy = event.clientY - y0;
22853                 g.moved = dx * dx + dy * dy > clickDistance2;
22854               }
22855               g.zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = d3_mouse(g.that), g.mouse[1]), g.extent, translateExtent));
22856             }
22857
22858             function mouseupped() {
22859               v.on("mousemove.zoom mouseup.zoom", null);
22860               yesdrag(event.view, g.moved);
22861               noevent$2();
22862               g.end();
22863             }
22864           }
22865
22866           function dblclicked() {
22867             if (!filter.apply(this, arguments)) return;
22868             var t0 = this.__zoom,
22869                 p0 = d3_mouse(this),
22870                 p1 = t0.invert(p0),
22871                 k1 = t0.k * (event.shiftKey ? 0.5 : 2),
22872                 t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, arguments), translateExtent);
22873
22874             noevent$2();
22875             if (duration > 0) d3_select(this).transition().duration(duration).call(schedule, t1, p0);
22876             else d3_select(this).call(zoom.transform, t1);
22877           }
22878
22879           function touchstarted() {
22880             if (!filter.apply(this, arguments)) return;
22881             var g = gesture(this, arguments),
22882                 touches = event.changedTouches,
22883                 started,
22884                 n = touches.length, i, t, p;
22885
22886             nopropagation$2();
22887             for (i = 0; i < n; ++i) {
22888               t = touches[i], p = touch(this, touches, t.identifier);
22889               p = [p, this.__zoom.invert(p), t.identifier];
22890               if (!g.touch0) g.touch0 = p, started = true;
22891               else if (!g.touch1) g.touch1 = p;
22892             }
22893
22894             // If this is a dbltap, reroute to the (optional) dblclick.zoom handler.
22895             if (touchstarting) {
22896               touchstarting = clearTimeout(touchstarting);
22897               if (!g.touch1) {
22898                 g.end();
22899                 p = d3_select(this).on("dblclick.zoom");
22900                 if (p) p.apply(this, arguments);
22901                 return;
22902               }
22903             }
22904
22905             if (started) {
22906               touchstarting = setTimeout(function() { touchstarting = null; }, touchDelay);
22907               interrupt(this);
22908               g.start();
22909             }
22910           }
22911
22912           function touchmoved() {
22913             var g = gesture(this, arguments),
22914                 touches = event.changedTouches,
22915                 n = touches.length, i, t, p, l;
22916
22917             noevent$2();
22918             if (touchstarting) touchstarting = clearTimeout(touchstarting);
22919             for (i = 0; i < n; ++i) {
22920               t = touches[i], p = touch(this, touches, t.identifier);
22921               if (g.touch0 && g.touch0[2] === t.identifier) g.touch0[0] = p;
22922               else if (g.touch1 && g.touch1[2] === t.identifier) g.touch1[0] = p;
22923             }
22924             t = g.that.__zoom;
22925             if (g.touch1) {
22926               var p0 = g.touch0[0], l0 = g.touch0[1],
22927                   p1 = g.touch1[0], l1 = g.touch1[1],
22928                   dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp,
22929                   dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl;
22930               t = scale(t, Math.sqrt(dp / dl));
22931               p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2];
22932               l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2];
22933             }
22934             else if (g.touch0) p = g.touch0[0], l = g.touch0[1];
22935             else return;
22936             g.zoom("touch", constrain(translate(t, p, l), g.extent, translateExtent));
22937           }
22938
22939           function touchended() {
22940             var g = gesture(this, arguments),
22941                 touches = event.changedTouches,
22942                 n = touches.length, i, t;
22943
22944             nopropagation$2();
22945             if (touchending) clearTimeout(touchending);
22946             touchending = setTimeout(function() { touchending = null; }, touchDelay);
22947             for (i = 0; i < n; ++i) {
22948               t = touches[i];
22949               if (g.touch0 && g.touch0[2] === t.identifier) delete g.touch0;
22950               else if (g.touch1 && g.touch1[2] === t.identifier) delete g.touch1;
22951             }
22952             if (g.touch1 && !g.touch0) g.touch0 = g.touch1, delete g.touch1;
22953             if (g.touch0) g.touch0[1] = this.__zoom.invert(g.touch0[0]);
22954             else g.end();
22955           }
22956
22957           zoom.wheelDelta = function(_) {
22958             return arguments.length ? (wheelDelta = typeof _ === "function" ? _ : constant$d(+_), zoom) : wheelDelta;
22959           };
22960
22961           zoom.filter = function(_) {
22962             return arguments.length ? (filter = typeof _ === "function" ? _ : constant$d(!!_), zoom) : filter;
22963           };
22964
22965           zoom.touchable = function(_) {
22966             return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$d(!!_), zoom) : touchable;
22967           };
22968
22969           zoom.extent = function(_) {
22970             return arguments.length ? (extent = typeof _ === "function" ? _ : constant$d([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent;
22971           };
22972
22973           zoom.scaleExtent = function(_) {
22974             return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]];
22975           };
22976
22977           zoom.translateExtent = function(_) {
22978             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]]];
22979           };
22980
22981           zoom.constrain = function(_) {
22982             return arguments.length ? (constrain = _, zoom) : constrain;
22983           };
22984
22985           zoom.duration = function(_) {
22986             return arguments.length ? (duration = +_, zoom) : duration;
22987           };
22988
22989           zoom.interpolate = function(_) {
22990             return arguments.length ? (interpolate = _, zoom) : interpolate;
22991           };
22992
22993           zoom.on = function() {
22994             var value = listeners.on.apply(listeners, arguments);
22995             return value === listeners ? zoom : value;
22996           };
22997
22998           zoom.clickDistance = function(_) {
22999             return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2);
23000           };
23001
23002           return zoom;
23003         }
23004
23005
23006
23007         var index$3 = /*#__PURE__*/Object.freeze({
23008                 version: version,
23009                 cluster: cluster,
23010                 hierarchy: hierarchy,
23011                 pack: index$1,
23012                 packSiblings: siblings,
23013                 packEnclose: enclose,
23014                 partition: partition,
23015                 stratify: stratify,
23016                 tree: tree,
23017                 treemap: index$2,
23018                 treemapBinary: binary,
23019                 treemapDice: treemapDice,
23020                 treemapSlice: treemapSlice,
23021                 treemapSliceDice: sliceDice,
23022                 treemapSquarify: squarify,
23023                 treemapResquarify: resquarify,
23024                 bisect: bisectRight,
23025                 bisectRight: bisectRight,
23026                 bisectLeft: bisectLeft,
23027                 ascending: d3_ascending,
23028                 bisector: d3_bisector,
23029                 cross: cross,
23030                 descending: d3_descending,
23031                 deviation: deviation,
23032                 extent: extent,
23033                 histogram: histogram,
23034                 thresholdFreedmanDiaconis: freedmanDiaconis,
23035                 thresholdScott: scott,
23036                 thresholdSturges: thresholdSturges,
23037                 max: max$2,
23038                 mean: mean,
23039                 median: d3_median,
23040                 merge: merge,
23041                 min: min,
23042                 pairs: pairs,
23043                 permute: permute,
23044                 quantile: threshold,
23045                 range: d3_range,
23046                 scan: scan,
23047                 shuffle: shuffle,
23048                 sum: sum,
23049                 ticks: ticks,
23050                 tickIncrement: tickIncrement,
23051                 tickStep: tickStep,
23052                 transpose: transpose,
23053                 variance: variance,
23054                 zip: zip,
23055                 brush: brush,
23056                 brushX: brushX,
23057                 brushY: brushY,
23058                 brushSelection: brushSelection,
23059                 chord: chord,
23060                 ribbon: ribbon,
23061                 nest: nest,
23062                 set: set$2,
23063                 map: map$3,
23064                 keys: keys$3,
23065                 values: values,
23066                 entries: entries,
23067                 color: color,
23068                 rgb: rgb,
23069                 hsl: hsl,
23070                 lab: lab,
23071                 hcl: hcl,
23072                 lch: lch,
23073                 gray: gray,
23074                 cubehelix: cubehelix,
23075                 contours: contours,
23076                 contourDensity: density,
23077                 dispatch: dispatch,
23078                 drag: d3_drag,
23079                 dragDisable: dragDisable,
23080                 dragEnable: yesdrag,
23081                 dsvFormat: dsvFormat,
23082                 csvParse: csvParse,
23083                 csvParseRows: csvParseRows,
23084                 csvFormat: csvFormat,
23085                 csvFormatBody: csvFormatBody,
23086                 csvFormatRows: csvFormatRows,
23087                 tsvParse: tsvParse,
23088                 tsvParseRows: tsvParseRows,
23089                 tsvFormat: tsvFormat,
23090                 tsvFormatBody: tsvFormatBody,
23091                 tsvFormatRows: tsvFormatRows,
23092                 autoType: autoType,
23093                 easeLinear: linear$1,
23094                 easeQuad: quadInOut,
23095                 easeQuadIn: quadIn,
23096                 easeQuadOut: quadOut,
23097                 easeQuadInOut: quadInOut,
23098                 easeCubic: cubicInOut,
23099                 easeCubicIn: cubicIn,
23100                 easeCubicOut: cubicOut,
23101                 easeCubicInOut: cubicInOut,
23102                 easePoly: polyInOut,
23103                 easePolyIn: polyIn,
23104                 easePolyOut: polyOut,
23105                 easePolyInOut: polyInOut,
23106                 easeSin: sinInOut,
23107                 easeSinIn: sinIn,
23108                 easeSinOut: sinOut,
23109                 easeSinInOut: sinInOut,
23110                 easeExp: expInOut,
23111                 easeExpIn: expIn,
23112                 easeExpOut: expOut,
23113                 easeExpInOut: expInOut,
23114                 easeCircle: circleInOut,
23115                 easeCircleIn: circleIn,
23116                 easeCircleOut: circleOut,
23117                 easeCircleInOut: circleInOut,
23118                 easeBounce: bounceOut,
23119                 easeBounceIn: bounceIn,
23120                 easeBounceOut: bounceOut,
23121                 easeBounceInOut: bounceInOut,
23122                 easeBack: backInOut,
23123                 easeBackIn: backIn,
23124                 easeBackOut: backOut,
23125                 easeBackInOut: backInOut,
23126                 easeElastic: elasticOut,
23127                 easeElasticIn: elasticIn,
23128                 easeElasticOut: elasticOut,
23129                 easeElasticInOut: elasticInOut,
23130                 blob: blob,
23131                 buffer: buffer,
23132                 dsv: dsv,
23133                 csv: csv$1,
23134                 tsv: tsv$1,
23135                 image: image,
23136                 json: d3_json,
23137                 text: d3_text,
23138                 xml: d3_xml,
23139                 html: html,
23140                 svg: svg,
23141                 forceCenter: center$1,
23142                 forceCollide: collide,
23143                 forceLink: link,
23144                 forceManyBody: manyBody,
23145                 forceRadial: radial,
23146                 forceSimulation: simulation,
23147                 forceX: x$2,
23148                 forceY: y$2,
23149                 formatDefaultLocale: defaultLocale,
23150                 get format () { return format; },
23151                 get formatPrefix () { return formatPrefix; },
23152                 formatLocale: formatLocale,
23153                 formatSpecifier: formatSpecifier,
23154                 precisionFixed: precisionFixed,
23155                 precisionPrefix: precisionPrefix,
23156                 precisionRound: precisionRound,
23157                 geoArea: d3_geoArea,
23158                 geoBounds: d3_geoBounds,
23159                 geoCentroid: d3_geoCentroid,
23160                 geoCircle: circle,
23161                 geoClipAntimeridian: clipAntimeridian,
23162                 geoClipCircle: clipCircle,
23163                 geoClipExtent: extent$1,
23164                 geoClipRectangle: clipRectangle,
23165                 geoContains: contains$2,
23166                 geoDistance: distance,
23167                 geoGraticule: graticule,
23168                 geoGraticule10: graticule10,
23169                 geoInterpolate: interpolate$1,
23170                 geoLength: d3_geoLength,
23171                 geoPath: d3_geoPath,
23172                 geoAlbers: albers,
23173                 geoAlbersUsa: albersUsa,
23174                 geoAzimuthalEqualArea: azimuthalEqualArea,
23175                 geoAzimuthalEqualAreaRaw: azimuthalEqualAreaRaw,
23176                 geoAzimuthalEquidistant: azimuthalEquidistant,
23177                 geoAzimuthalEquidistantRaw: azimuthalEquidistantRaw,
23178                 geoConicConformal: conicConformal,
23179                 geoConicConformalRaw: conicConformalRaw,
23180                 geoConicEqualArea: conicEqualArea,
23181                 geoConicEqualAreaRaw: conicEqualAreaRaw,
23182                 geoConicEquidistant: conicEquidistant,
23183                 geoConicEquidistantRaw: conicEquidistantRaw,
23184                 geoEqualEarth: equalEarth,
23185                 geoEqualEarthRaw: equalEarthRaw,
23186                 geoEquirectangular: equirectangular,
23187                 geoEquirectangularRaw: equirectangularRaw,
23188                 geoGnomonic: gnomonic,
23189                 geoGnomonicRaw: gnomonicRaw,
23190                 geoIdentity: d3_geoIdentity,
23191                 geoProjection: projection,
23192                 geoProjectionMutator: projectionMutator,
23193                 geoMercator: mercator,
23194                 geoMercatorRaw: mercatorRaw,
23195                 geoNaturalEarth1: naturalEarth1,
23196                 geoNaturalEarth1Raw: naturalEarth1Raw,
23197                 geoOrthographic: orthographic,
23198                 geoOrthographicRaw: orthographicRaw,
23199                 geoStereographic: stereographic,
23200                 geoStereographicRaw: stereographicRaw,
23201                 geoTransverseMercator: transverseMercator,
23202                 geoTransverseMercatorRaw: transverseMercatorRaw,
23203                 geoRotation: rotation,
23204                 geoStream: d3_geoStream,
23205                 geoTransform: d3_geoTransform,
23206                 axisTop: axisTop,
23207                 axisRight: axisRight,
23208                 axisBottom: axisBottom,
23209                 axisLeft: axisLeft,
23210                 interpolate: d3_interpolate,
23211                 interpolateArray: array$2,
23212                 interpolateBasis: basis$1,
23213                 interpolateBasisClosed: basisClosed,
23214                 interpolateDate: date,
23215                 interpolateDiscrete: discrete,
23216                 interpolateHue: hue$1,
23217                 interpolateNumber: d3_interpolateNumber,
23218                 interpolateObject: object,
23219                 interpolateRound: interpolateRound,
23220                 interpolateString: interpolateString,
23221                 interpolateTransformCss: interpolateTransformCss,
23222                 interpolateTransformSvg: interpolateTransformSvg,
23223                 interpolateZoom: interpolateZoom,
23224                 interpolateRgb: d3_interpolateRgb,
23225                 interpolateRgbBasis: rgbBasis,
23226                 interpolateRgbBasisClosed: rgbBasisClosed,
23227                 interpolateHsl: hsl$2,
23228                 interpolateHslLong: hslLong,
23229                 interpolateLab: lab$1,
23230                 interpolateHcl: hcl$2,
23231                 interpolateHclLong: hclLong,
23232                 interpolateCubehelix: cubehelix$2,
23233                 interpolateCubehelixLong: cubehelixLong,
23234                 piecewise: piecewise,
23235                 quantize: d3_quantize,
23236                 path: path,
23237                 polygonArea: d3_polygonArea,
23238                 polygonCentroid: d3_polygonCentroid,
23239                 polygonHull: d3_polygonHull,
23240                 polygonContains: contains$3,
23241                 polygonLength: length$1,
23242                 quadtree: quadtree,
23243                 randomUniform: uniform,
23244                 randomNormal: normal,
23245                 randomLogNormal: logNormal,
23246                 randomBates: bates,
23247                 randomIrwinHall: irwinHall,
23248                 randomExponential: exponential$1,
23249                 scaleBand: band,
23250                 scalePoint: point$1,
23251                 scaleIdentity: identity$6,
23252                 scaleLinear: linear$2,
23253                 scaleLog: log$1,
23254                 scaleSymlog: symlog,
23255                 scaleOrdinal: ordinal,
23256                 scaleImplicit: implicit,
23257                 scalePow: pow$1,
23258                 scaleSqrt: sqrt$1,
23259                 scaleQuantile: quantile,
23260                 scaleQuantize: quantize,
23261                 scaleThreshold: threshold$1,
23262                 scaleTime: time,
23263                 scaleUtc: utcTime,
23264                 scaleSequential: sequential,
23265                 scaleSequentialLog: sequentialLog,
23266                 scaleSequentialPow: sequentialPow,
23267                 scaleSequentialSqrt: sequentialSqrt,
23268                 scaleSequentialSymlog: sequentialSymlog,
23269                 scaleSequentialQuantile: sequentialQuantile,
23270                 scaleDiverging: diverging,
23271                 scaleDivergingLog: divergingLog,
23272                 scaleDivergingPow: divergingPow,
23273                 scaleDivergingSqrt: divergingSqrt,
23274                 scaleDivergingSymlog: divergingSymlog,
23275                 tickFormat: tickFormat,
23276                 schemeCategory10: category10,
23277                 schemeAccent: Accent,
23278                 schemeDark2: Dark2,
23279                 schemePaired: Paired,
23280                 schemePastel1: Pastel1,
23281                 schemePastel2: Pastel2,
23282                 schemeSet1: Set1,
23283                 schemeSet2: Set2,
23284                 schemeSet3: Set3,
23285                 interpolateBrBG: BrBG,
23286                 schemeBrBG: scheme,
23287                 interpolatePRGn: PRGn,
23288                 schemePRGn: scheme$1,
23289                 interpolatePiYG: PiYG,
23290                 schemePiYG: scheme$2,
23291                 interpolatePuOr: PuOr,
23292                 schemePuOr: scheme$3,
23293                 interpolateRdBu: RdBu,
23294                 schemeRdBu: scheme$4,
23295                 interpolateRdGy: RdGy,
23296                 schemeRdGy: scheme$5,
23297                 interpolateRdYlBu: RdYlBu,
23298                 schemeRdYlBu: scheme$6,
23299                 interpolateRdYlGn: RdYlGn,
23300                 schemeRdYlGn: scheme$7,
23301                 interpolateSpectral: Spectral,
23302                 schemeSpectral: scheme$8,
23303                 interpolateBuGn: BuGn,
23304                 schemeBuGn: scheme$9,
23305                 interpolateBuPu: BuPu,
23306                 schemeBuPu: scheme$a,
23307                 interpolateGnBu: GnBu,
23308                 schemeGnBu: scheme$b,
23309                 interpolateOrRd: OrRd,
23310                 schemeOrRd: scheme$c,
23311                 interpolatePuBuGn: PuBuGn,
23312                 schemePuBuGn: scheme$d,
23313                 interpolatePuBu: PuBu,
23314                 schemePuBu: scheme$e,
23315                 interpolatePuRd: PuRd,
23316                 schemePuRd: scheme$f,
23317                 interpolateRdPu: RdPu,
23318                 schemeRdPu: scheme$g,
23319                 interpolateYlGnBu: YlGnBu,
23320                 schemeYlGnBu: scheme$h,
23321                 interpolateYlGn: YlGn,
23322                 schemeYlGn: scheme$i,
23323                 interpolateYlOrBr: YlOrBr,
23324                 schemeYlOrBr: scheme$j,
23325                 interpolateYlOrRd: YlOrRd,
23326                 schemeYlOrRd: scheme$k,
23327                 interpolateBlues: Blues,
23328                 schemeBlues: scheme$l,
23329                 interpolateGreens: Greens,
23330                 schemeGreens: scheme$m,
23331                 interpolateGreys: Greys,
23332                 schemeGreys: scheme$n,
23333                 interpolatePurples: Purples,
23334                 schemePurples: scheme$o,
23335                 interpolateReds: Reds,
23336                 schemeReds: scheme$p,
23337                 interpolateOranges: Oranges,
23338                 schemeOranges: scheme$q,
23339                 interpolateCubehelixDefault: cubehelix$3,
23340                 interpolateRainbow: rainbow,
23341                 interpolateWarm: warm,
23342                 interpolateCool: cool,
23343                 interpolateSinebow: sinebow,
23344                 interpolateViridis: viridis,
23345                 interpolateMagma: magma,
23346                 interpolateInferno: inferno,
23347                 interpolatePlasma: plasma,
23348                 create: create$5,
23349                 creator: creator,
23350                 local: local,
23351                 matcher: matcher,
23352                 mouse: d3_mouse,
23353                 namespace: namespace,
23354                 namespaces: namespaces,
23355                 clientPoint: point,
23356                 select: d3_select,
23357                 selectAll: d3_selectAll,
23358                 selection: selection,
23359                 selector: selector,
23360                 selectorAll: selectorAll,
23361                 style: styleValue,
23362                 touch: touch,
23363                 touches: d3_touches,
23364                 window: defaultView,
23365                 get event () { return event; },
23366                 customEvent: customEvent,
23367                 arc: arc,
23368                 area: area$1,
23369                 line: line,
23370                 pie: pie,
23371                 areaRadial: areaRadial,
23372                 radialArea: areaRadial,
23373                 lineRadial: lineRadial$1,
23374                 radialLine: lineRadial$1,
23375                 pointRadial: pointRadial,
23376                 linkHorizontal: linkHorizontal,
23377                 linkVertical: linkVertical,
23378                 linkRadial: linkRadial,
23379                 symbol: symbol,
23380                 symbols: symbols,
23381                 symbolCircle: circle$2,
23382                 symbolCross: cross$2,
23383                 symbolDiamond: diamond,
23384                 symbolSquare: square,
23385                 symbolStar: star,
23386                 symbolTriangle: triangle,
23387                 symbolWye: wye,
23388                 curveBasisClosed: basisClosed$1,
23389                 curveBasisOpen: basisOpen,
23390                 curveBasis: basis$2,
23391                 curveBundle: bundle,
23392                 curveCardinalClosed: cardinalClosed,
23393                 curveCardinalOpen: cardinalOpen,
23394                 curveCardinal: cardinal,
23395                 curveCatmullRomClosed: catmullRomClosed,
23396                 curveCatmullRomOpen: catmullRomOpen,
23397                 curveCatmullRom: catmullRom,
23398                 curveLinearClosed: linearClosed,
23399                 curveLinear: curveLinear,
23400                 curveMonotoneX: monotoneX,
23401                 curveMonotoneY: monotoneY,
23402                 curveNatural: natural,
23403                 curveStep: step,
23404                 curveStepAfter: stepAfter,
23405                 curveStepBefore: stepBefore,
23406                 stack: stack,
23407                 stackOffsetExpand: expand,
23408                 stackOffsetDiverging: diverging$1,
23409                 stackOffsetNone: none$1,
23410                 stackOffsetSilhouette: silhouette,
23411                 stackOffsetWiggle: wiggle,
23412                 stackOrderAppearance: appearance,
23413                 stackOrderAscending: ascending$2,
23414                 stackOrderDescending: descending$1,
23415                 stackOrderInsideOut: insideOut,
23416                 stackOrderNone: none$2,
23417                 stackOrderReverse: reverse,
23418                 timeInterval: newInterval,
23419                 timeMillisecond: millisecond,
23420                 timeMilliseconds: milliseconds,
23421                 utcMillisecond: millisecond,
23422                 utcMilliseconds: milliseconds,
23423                 timeSecond: second,
23424                 timeSeconds: seconds,
23425                 utcSecond: second,
23426                 utcSeconds: seconds,
23427                 timeMinute: minute,
23428                 timeMinutes: minutes,
23429                 timeHour: hour,
23430                 timeHours: hours,
23431                 timeDay: day,
23432                 timeDays: days,
23433                 timeWeek: sunday,
23434                 timeWeeks: sundays,
23435                 timeSunday: sunday,
23436                 timeSundays: sundays,
23437                 timeMonday: monday,
23438                 timeMondays: mondays,
23439                 timeTuesday: tuesday,
23440                 timeTuesdays: tuesdays,
23441                 timeWednesday: wednesday,
23442                 timeWednesdays: wednesdays,
23443                 timeThursday: thursday,
23444                 timeThursdays: thursdays,
23445                 timeFriday: friday,
23446                 timeFridays: fridays,
23447                 timeSaturday: saturday,
23448                 timeSaturdays: saturdays,
23449                 timeMonth: month,
23450                 timeMonths: months,
23451                 timeYear: year,
23452                 timeYears: years,
23453                 utcMinute: utcMinute,
23454                 utcMinutes: utcMinutes,
23455                 utcHour: utcHour,
23456                 utcHours: utcHours,
23457                 utcDay: utcDay,
23458                 utcDays: utcDays,
23459                 utcWeek: utcSunday,
23460                 utcWeeks: utcSundays,
23461                 utcSunday: utcSunday,
23462                 utcSundays: utcSundays,
23463                 utcMonday: utcMonday,
23464                 utcMondays: utcMondays,
23465                 utcTuesday: utcTuesday,
23466                 utcTuesdays: utcTuesdays,
23467                 utcWednesday: utcWednesday,
23468                 utcWednesdays: utcWednesdays,
23469                 utcThursday: utcThursday,
23470                 utcThursdays: utcThursdays,
23471                 utcFriday: utcFriday,
23472                 utcFridays: utcFridays,
23473                 utcSaturday: utcSaturday,
23474                 utcSaturdays: utcSaturdays,
23475                 utcMonth: utcMonth,
23476                 utcMonths: utcMonths,
23477                 utcYear: utcYear,
23478                 utcYears: utcYears,
23479                 timeFormatDefaultLocale: defaultLocale$1,
23480                 get timeFormat () { return timeFormat; },
23481                 get timeParse () { return timeParse; },
23482                 get utcFormat () { return utcFormat; },
23483                 get utcParse () { return utcParse; },
23484                 timeFormatLocale: formatLocale$1,
23485                 isoFormat: formatIso,
23486                 isoParse: parseIso,
23487                 now: now,
23488                 timer: timer,
23489                 timerFlush: timerFlush,
23490                 timeout: d3_timeout,
23491                 interval: interval$1,
23492                 transition: transition,
23493                 active: active,
23494                 interrupt: interrupt,
23495                 voronoi: voronoi,
23496                 zoom: d3_zoom,
23497                 zoomTransform: transform,
23498                 zoomIdentity: identity$8
23499         });
23500
23501         function actionAddEntity(way) {
23502             return function(graph) {
23503                 return graph.replace(way);
23504             };
23505         }
23506
23507         /*
23508         Order the nodes of a way in reverse order and reverse any direction dependent tags
23509         other than `oneway`. (We assume that correcting a backwards oneway is the primary
23510         reason for reversing a way.)
23511
23512         In addition, numeric-valued `incline` tags are negated.
23513
23514         The JOSM implementation was used as a guide, but transformations that were of unclear benefit
23515         or adjusted tags that don't seem to be used in practice were omitted.
23516
23517         References:
23518             http://wiki.openstreetmap.org/wiki/Forward_%26_backward,_left_%26_right
23519             http://wiki.openstreetmap.org/wiki/Key:direction#Steps
23520             http://wiki.openstreetmap.org/wiki/Key:incline
23521             http://wiki.openstreetmap.org/wiki/Route#Members
23522             http://josm.openstreetmap.de/browser/josm/trunk/src/org/openstreetmap/josm/corrector/ReverseWayTagCorrector.java
23523             http://wiki.openstreetmap.org/wiki/Tag:highway%3Dstop
23524             http://wiki.openstreetmap.org/wiki/Key:traffic_sign#On_a_way_or_area
23525         */
23526         function actionReverse(wayID, options) {
23527             var ignoreKey = /^.*(_|:)?(description|name|note|website|ref|source|comment|watch|attribution)(_|:)?/;
23528             var numeric = /^([+\-]?)(?=[\d.])/;
23529             var turn_lanes = /^turn:lanes:?/;
23530             var keyReplacements = [
23531                 [/:right$/, ':left'],
23532                 [/:left$/, ':right'],
23533                 [/:forward$/, ':backward'],
23534                 [/:backward$/, ':forward'],
23535                 [/:right:/, ':left:'],
23536                 [/:left:/, ':right:'],
23537                 [/:forward:/, ':backward:'],
23538                 [/:backward:/, ':forward:']
23539             ];
23540             var valueReplacements = {
23541                 left: 'right',
23542                 right: 'left',
23543                 up: 'down',
23544                 down: 'up',
23545                 forward: 'backward',
23546                 backward: 'forward',
23547                 forwards: 'backward',
23548                 backwards: 'forward',
23549             };
23550             var roleReplacements = {
23551                 forward: 'backward',
23552                 backward: 'forward',
23553                 forwards: 'backward',
23554                 backwards: 'forward'
23555             };
23556             var onewayReplacements = {
23557                 yes: '-1',
23558                 '1': '-1',
23559                 '-1': 'yes'
23560             };
23561
23562
23563             function reverseKey(key) {
23564                 for (var i = 0; i < keyReplacements.length; ++i) {
23565                     var replacement = keyReplacements[i];
23566                     if (replacement[0].test(key)) {
23567                         return key.replace(replacement[0], replacement[1]);
23568                     }
23569                 }
23570                 return key;
23571             }
23572
23573
23574             function reverseValue(key, value) {
23575                 if (ignoreKey.test(key)) return value;
23576
23577                 // Turn lanes are left/right to key (not way) direction - #5674
23578                 if (turn_lanes.test(key)) {
23579                     return value;
23580                 } else if (key === 'incline' && numeric.test(value)) {
23581                     return value.replace(numeric, function(_, sign) { return sign === '-' ? '' : '-'; });
23582                 } else if (options && options.reverseOneway && key === 'oneway') {
23583                     return onewayReplacements[value] || value;
23584                 } else {
23585                     return valueReplacements[value] || value;
23586                 }
23587             }
23588
23589
23590             // Reverse the direction of tags attached to the nodes - #3076
23591             function reverseNodeTags(graph, nodeIDs) {
23592                 for (var i = 0; i < nodeIDs.length; i++) {
23593                     var node = graph.hasEntity(nodeIDs[i]);
23594                     if (!node || !Object.keys(node.tags).length) continue;
23595
23596                     var tags = {};
23597                     for (var key in node.tags) {
23598                         tags[reverseKey(key)] = reverseValue(key, node.tags[key]);
23599                     }
23600                     graph = graph.replace(node.update({tags: tags}));
23601                 }
23602                 return graph;
23603             }
23604
23605
23606             return function(graph) {
23607                 var way = graph.entity(wayID);
23608                 var nodes = way.nodes.slice().reverse();
23609                 var tags = {};
23610                 var role;
23611
23612                 for (var key in way.tags) {
23613                     tags[reverseKey(key)] = reverseValue(key, way.tags[key]);
23614                 }
23615
23616                 graph.parentRelations(way).forEach(function(relation) {
23617                     relation.members.forEach(function(member, index) {
23618                         if (member.id === way.id && (role = roleReplacements[member.role])) {
23619                             relation = relation.updateMember({role: role}, index);
23620                             graph = graph.replace(relation);
23621                         }
23622                     });
23623                 });
23624
23625                 // Reverse any associated directions on nodes on the way and then replace
23626                 // the way itself with the reversed node ids and updated way tags
23627                 return reverseNodeTags(graph, nodes)
23628                     .replace(way.update({nodes: nodes, tags: tags}));
23629             };
23630         }
23631
23632         function osmIsInterestingTag(key) {
23633             return key !== 'attribution' &&
23634                 key !== 'created_by' &&
23635                 key !== 'source' &&
23636                 key !== 'odbl' &&
23637                 key.indexOf('tiger:') !== 0;
23638         }
23639
23640         var osmAreaKeys = {};
23641         function osmSetAreaKeys(value) {
23642             osmAreaKeys = value;
23643         }
23644
23645         // Tags that indicate a node can be a standalone point
23646         // e.g. { amenity: { bar: true, parking: true, ... } ... }
23647         var osmPointTags = {};
23648         function osmSetPointTags(value) {
23649             osmPointTags = value;
23650         }
23651         // Tags that indicate a node can be part of a way
23652         // e.g. { amenity: { parking: true, ... }, highway: { stop: true ... } ... }
23653         var osmVertexTags = {};
23654         function osmSetVertexTags(value) {
23655             osmVertexTags = value;
23656         }
23657
23658         function osmNodeGeometriesForTags(nodeTags) {
23659             var geometries = {};
23660             for (var key in nodeTags) {
23661                 if (osmPointTags[key] &&
23662                     (osmPointTags[key]['*'] || osmPointTags[key][nodeTags[key]])) {
23663                     geometries.point = true;
23664                 }
23665                 if (osmVertexTags[key] &&
23666                     (osmVertexTags[key]['*'] || osmVertexTags[key][nodeTags[key]])) {
23667                     geometries.vertex = true;
23668                 }
23669                 // break early if both are already supported
23670                 if (geometries.point && geometries.vertex) break;
23671             }
23672             return geometries;
23673         }
23674
23675         var osmOneWayTags = {
23676             'aerialway': {
23677                 'chair_lift': true,
23678                 'drag_lift': true,
23679                 'j-bar': true,
23680                 'magic_carpet': true,
23681                 'mixed_lift': true,
23682                 'platter': true,
23683                 'rope_tow': true,
23684                 't-bar': true,
23685                 'zip_line': true
23686             },
23687             'highway': {
23688                 'motorway': true
23689             },
23690             'junction': {
23691                 'circular': true,
23692                 'roundabout': true
23693             },
23694             'man_made': {
23695                 'piste:halfpipe': true
23696             },
23697             'piste:type': {
23698                 'downhill': true,
23699                 'sled': true,
23700                 'yes': true
23701             },
23702             'waterway': {
23703                 'canal': true,
23704                 'ditch': true,
23705                 'drain': true,
23706                 'river': true,
23707                 'stream': true
23708             }
23709         };
23710
23711
23712         var osmPavedTags = {
23713             'surface': {
23714                 'paved': true,
23715                 'asphalt': true,
23716                 'concrete': true,
23717                 'concrete:lanes': true,
23718                 'concrete:plates': true
23719             },
23720             'tracktype': {
23721                 'grade1': true
23722             }
23723         };
23724
23725         var osmRightSideIsInsideTags = {
23726             'natural': {
23727                 'cliff': true,
23728                 'coastline': 'coastline',
23729             },
23730             'barrier': {
23731                 'retaining_wall': true,
23732                 'kerb': true,
23733                 'guard_rail': true,
23734                 'city_wall': true,
23735             },
23736             'man_made': {
23737                 'embankment': true
23738             }
23739         };
23740
23741         // "highway" tag values for pedestrian or vehicle right-of-ways that make up the routable network
23742         // (does not include `raceway`)
23743         var osmRoutableHighwayTagValues = {
23744             motorway: true, trunk: true, primary: true, secondary: true, tertiary: true, residential: true,
23745             motorway_link: true, trunk_link: true, primary_link: true, secondary_link: true, tertiary_link: true,
23746             unclassified: true, road: true, service: true, track: true, living_street: true, bus_guideway: true,
23747             path: true, footway: true, cycleway: true, bridleway: true, pedestrian: true, corridor: true, steps: true
23748         };
23749         // "highway" tag values that generally do not allow motor vehicles
23750         var osmPathHighwayTagValues = {
23751             path: true, footway: true, cycleway: true, bridleway: true, pedestrian: true, corridor: true, steps: true
23752         };
23753
23754         // "railway" tag values representing existing railroad tracks (purposely does not include 'abandoned')
23755         var osmRailwayTrackTagValues = {
23756             rail: true, light_rail: true, tram: true, subway: true,
23757             monorail: true, funicular: true, miniature: true, narrow_gauge: true,
23758             disused: true, preserved: true
23759         };
23760
23761         // "waterway" tag values for line features representing water flow
23762         var osmFlowingWaterwayTagValues = {
23763             canal: true, ditch: true, drain: true, river: true, stream: true
23764         };
23765
23766         // constants
23767         var TAU = 2 * Math.PI;
23768         var EQUATORIAL_RADIUS = 6356752.314245179;
23769         var POLAR_RADIUS = 6378137.0;
23770
23771
23772         function geoLatToMeters(dLat) {
23773             return dLat * (TAU * POLAR_RADIUS / 360);
23774         }
23775
23776
23777         function geoLonToMeters(dLon, atLat) {
23778             return Math.abs(atLat) >= 90 ? 0 :
23779                 dLon * (TAU * EQUATORIAL_RADIUS / 360) * Math.abs(Math.cos(atLat * (Math.PI / 180)));
23780         }
23781
23782
23783         function geoMetersToLat(m) {
23784             return m / (TAU * POLAR_RADIUS / 360);
23785         }
23786
23787
23788         function geoMetersToLon(m, atLat) {
23789             return Math.abs(atLat) >= 90 ? 0 :
23790                 m / (TAU * EQUATORIAL_RADIUS / 360) / Math.abs(Math.cos(atLat * (Math.PI / 180)));
23791         }
23792
23793
23794         function geoMetersToOffset(meters, tileSize) {
23795             tileSize = tileSize || 256;
23796             return [
23797                 meters[0] * tileSize / (TAU * EQUATORIAL_RADIUS),
23798                 -meters[1] * tileSize / (TAU * POLAR_RADIUS)
23799             ];
23800         }
23801
23802
23803         function geoOffsetToMeters(offset, tileSize) {
23804             tileSize = tileSize || 256;
23805             return [
23806                 offset[0] * TAU * EQUATORIAL_RADIUS / tileSize,
23807                 -offset[1] * TAU * POLAR_RADIUS / tileSize
23808             ];
23809         }
23810
23811
23812         // Equirectangular approximation of spherical distances on Earth
23813         function geoSphericalDistance(a, b) {
23814             var x = geoLonToMeters(a[0] - b[0], (a[1] + b[1]) / 2);
23815             var y = geoLatToMeters(a[1] - b[1]);
23816             return Math.sqrt((x * x) + (y * y));
23817         }
23818
23819
23820         // scale to zoom
23821         function geoScaleToZoom(k, tileSize) {
23822             tileSize = tileSize || 256;
23823             var log2ts = Math.log(tileSize) * Math.LOG2E;
23824             return Math.log(k * TAU) / Math.LN2 - log2ts;
23825         }
23826
23827
23828         // zoom to scale
23829         function geoZoomToScale(z, tileSize) {
23830             tileSize = tileSize || 256;
23831             return tileSize * Math.pow(2, z) / TAU;
23832         }
23833
23834
23835         // returns info about the node from `nodes` closest to the given `point`
23836         function geoSphericalClosestNode(nodes, point) {
23837             var minDistance = Infinity, distance;
23838             var indexOfMin;
23839
23840             for (var i in nodes) {
23841                 distance = geoSphericalDistance(nodes[i].loc, point);
23842                 if (distance < minDistance) {
23843                     minDistance = distance;
23844                     indexOfMin = i;
23845                 }
23846             }
23847
23848             if (indexOfMin !== undefined) {
23849                 return { index: indexOfMin, distance: minDistance, node: nodes[indexOfMin] };
23850             } else {
23851                 return null;
23852             }
23853         }
23854
23855         function geoExtent(min, max) {
23856             if (!(this instanceof geoExtent)) {
23857                 return new geoExtent(min, max);
23858             } else if (min instanceof geoExtent) {
23859                 return min;
23860             } else if (min && min.length === 2 && min[0].length === 2 && min[1].length === 2) {
23861                 this[0] = min[0];
23862                 this[1] = min[1];
23863             } else {
23864                 this[0] = min        || [ Infinity,  Infinity];
23865                 this[1] = max || min || [-Infinity, -Infinity];
23866             }
23867         }
23868
23869         geoExtent.prototype = new Array(2);
23870
23871         Object.assign(geoExtent.prototype, {
23872
23873             equals: function (obj) {
23874                 return this[0][0] === obj[0][0] &&
23875                     this[0][1] === obj[0][1] &&
23876                     this[1][0] === obj[1][0] &&
23877                     this[1][1] === obj[1][1];
23878             },
23879
23880
23881             extend: function(obj) {
23882                 if (!(obj instanceof geoExtent)) obj = new geoExtent(obj);
23883                 return geoExtent(
23884                     [Math.min(obj[0][0], this[0][0]), Math.min(obj[0][1], this[0][1])],
23885                     [Math.max(obj[1][0], this[1][0]), Math.max(obj[1][1], this[1][1])]
23886                 );
23887             },
23888
23889
23890             _extend: function(extent) {
23891                 this[0][0] = Math.min(extent[0][0], this[0][0]);
23892                 this[0][1] = Math.min(extent[0][1], this[0][1]);
23893                 this[1][0] = Math.max(extent[1][0], this[1][0]);
23894                 this[1][1] = Math.max(extent[1][1], this[1][1]);
23895             },
23896
23897
23898             area: function() {
23899                 return Math.abs((this[1][0] - this[0][0]) * (this[1][1] - this[0][1]));
23900             },
23901
23902
23903             center: function() {
23904                 return [(this[0][0] + this[1][0]) / 2, (this[0][1] + this[1][1]) / 2];
23905             },
23906
23907
23908             rectangle: function() {
23909                 return [this[0][0], this[0][1], this[1][0], this[1][1]];
23910             },
23911
23912
23913             bbox: function() {
23914                 return { minX: this[0][0], minY: this[0][1], maxX: this[1][0], maxY: this[1][1] };
23915             },
23916
23917
23918             polygon: function() {
23919                 return [
23920                     [this[0][0], this[0][1]],
23921                     [this[0][0], this[1][1]],
23922                     [this[1][0], this[1][1]],
23923                     [this[1][0], this[0][1]],
23924                     [this[0][0], this[0][1]]
23925                 ];
23926             },
23927
23928
23929             contains: function(obj) {
23930                 if (!(obj instanceof geoExtent)) obj = new geoExtent(obj);
23931                 return obj[0][0] >= this[0][0] &&
23932                        obj[0][1] >= this[0][1] &&
23933                        obj[1][0] <= this[1][0] &&
23934                        obj[1][1] <= this[1][1];
23935             },
23936
23937
23938             intersects: function(obj) {
23939                 if (!(obj instanceof geoExtent)) obj = new geoExtent(obj);
23940                 return obj[0][0] <= this[1][0] &&
23941                        obj[0][1] <= this[1][1] &&
23942                        obj[1][0] >= this[0][0] &&
23943                        obj[1][1] >= this[0][1];
23944             },
23945
23946
23947             intersection: function(obj) {
23948                 if (!this.intersects(obj)) return new geoExtent();
23949                 return new geoExtent(
23950                     [Math.max(obj[0][0], this[0][0]), Math.max(obj[0][1], this[0][1])],
23951                     [Math.min(obj[1][0], this[1][0]), Math.min(obj[1][1], this[1][1])]
23952                 );
23953             },
23954
23955
23956             percentContainedIn: function(obj) {
23957                 if (!(obj instanceof geoExtent)) obj = new geoExtent(obj);
23958                 var a1 = this.intersection(obj).area();
23959                 var a2 = this.area();
23960
23961                 if (a1 === Infinity || a2 === Infinity || a1 === 0 || a2 === 0) {
23962                     return 0;
23963                 } else {
23964                     return a1 / a2;
23965                 }
23966             },
23967
23968
23969             padByMeters: function(meters) {
23970                 var dLat = geoMetersToLat(meters);
23971                 var dLon = geoMetersToLon(meters, this.center()[1]);
23972                 return geoExtent(
23973                     [this[0][0] - dLon, this[0][1] - dLat],
23974                     [this[1][0] + dLon, this[1][1] + dLat]
23975                 );
23976             },
23977
23978
23979             toParam: function() {
23980                 return this.rectangle().join(',');
23981             }
23982
23983         });
23984
23985         // vector equals
23986         function geoVecEqual(a, b, epsilon) {
23987             if (epsilon) {
23988                 return (Math.abs(a[0] - b[0]) <= epsilon) && (Math.abs(a[1] - b[1]) <= epsilon);
23989             } else {
23990                 return (a[0] === b[0]) && (a[1] === b[1]);
23991             }
23992         }
23993
23994         // vector addition
23995         function geoVecAdd(a, b) {
23996             return [ a[0] + b[0], a[1] + b[1] ];
23997         }
23998
23999         // vector subtraction
24000         function geoVecSubtract(a, b) {
24001             return [ a[0] - b[0], a[1] - b[1] ];
24002         }
24003
24004         // vector scaling
24005         function geoVecScale(a, mag) {
24006             return [ a[0] * mag, a[1] * mag ];
24007         }
24008
24009         // vector rounding (was: geoRoundCoordinates)
24010         function geoVecFloor(a) {
24011             return [ Math.floor(a[0]), Math.floor(a[1]) ];
24012         }
24013
24014         // linear interpolation
24015         function geoVecInterp(a, b, t) {
24016             return [
24017                 a[0] + (b[0] - a[0]) * t,
24018                 a[1] + (b[1] - a[1]) * t
24019             ];
24020         }
24021
24022         // http://jsperf.com/id-dist-optimization
24023         function geoVecLength(a, b) {
24024             b = b || [0, 0];
24025             var x = a[0] - b[0];
24026             var y = a[1] - b[1];
24027             return Math.sqrt((x * x) + (y * y));
24028         }
24029
24030         // get a unit vector
24031         function geoVecNormalize(a) {
24032             var length = Math.sqrt((a[0] * a[0]) + (a[1] * a[1]));
24033             if (length !== 0) {
24034                 return geoVecScale(a, 1 / length);
24035             }
24036             return [0, 0];
24037         }
24038
24039         // Return the counterclockwise angle in the range (-pi, pi)
24040         // between the positive X axis and the line intersecting a and b.
24041         function geoVecAngle(a, b) {
24042             return Math.atan2(b[1] - a[1], b[0] - a[0]);
24043         }
24044
24045         // dot product
24046         function geoVecDot(a, b, origin) {
24047             origin = origin || [0, 0];
24048             var p = geoVecSubtract(a, origin);
24049             var q = geoVecSubtract(b, origin);
24050             return (p[0]) * (q[0]) + (p[1]) * (q[1]);
24051         }
24052
24053         // normalized dot product
24054         function geoVecNormalizedDot(a, b, origin) {
24055             origin = origin || [0, 0];
24056             var p = geoVecNormalize(geoVecSubtract(a, origin));
24057             var q = geoVecNormalize(geoVecSubtract(b, origin));
24058             return geoVecDot(p, q);
24059         }
24060
24061         // 2D cross product of OA and OB vectors, returns magnitude of Z vector
24062         // Returns a positive value, if OAB makes a counter-clockwise turn,
24063         // negative for clockwise turn, and zero if the points are collinear.
24064         function geoVecCross(a, b, origin) {
24065             origin = origin || [0, 0];
24066             var p = geoVecSubtract(a, origin);
24067             var q = geoVecSubtract(b, origin);
24068             return (p[0]) * (q[1]) - (p[1]) * (q[0]);
24069         }
24070
24071
24072         // find closest orthogonal projection of point onto points array
24073         function geoVecProject(a, points) {
24074             var min = Infinity;
24075             var idx;
24076             var target;
24077
24078             for (var i = 0; i < points.length - 1; i++) {
24079                 var o = points[i];
24080                 var s = geoVecSubtract(points[i + 1], o);
24081                 var v = geoVecSubtract(a, o);
24082                 var proj = geoVecDot(v, s) / geoVecDot(s, s);
24083                 var p;
24084
24085                 if (proj < 0) {
24086                     p = o;
24087                 } else if (proj > 1) {
24088                     p = points[i + 1];
24089                 } else {
24090                     p = [o[0] + proj * s[0], o[1] + proj * s[1]];
24091                 }
24092
24093                 var dist = geoVecLength(p, a);
24094                 if (dist < min) {
24095                     min = dist;
24096                     idx = i + 1;
24097                     target = p;
24098                 }
24099             }
24100
24101             if (idx !== undefined) {
24102                 return { index: idx, distance: min, target: target };
24103             } else {
24104                 return null;
24105             }
24106         }
24107
24108         // Return the counterclockwise angle in the range (-pi, pi)
24109         // between the positive X axis and the line intersecting a and b.
24110         function geoAngle(a, b, projection) {
24111             return geoVecAngle(projection(a.loc), projection(b.loc));
24112         }
24113
24114
24115         function geoEdgeEqual(a, b) {
24116             return (a[0] === b[0] && a[1] === b[1]) ||
24117                 (a[0] === b[1] && a[1] === b[0]);
24118         }
24119
24120
24121         // Rotate all points counterclockwise around a pivot point by given angle
24122         function geoRotate(points, angle, around) {
24123             return points.map(function(point) {
24124                 var radial = geoVecSubtract(point, around);
24125                 return [
24126                     radial[0] * Math.cos(angle) - radial[1] * Math.sin(angle) + around[0],
24127                     radial[0] * Math.sin(angle) + radial[1] * Math.cos(angle) + around[1]
24128                 ];
24129             });
24130         }
24131
24132
24133         // Choose the edge with the minimal distance from `point` to its orthogonal
24134         // projection onto that edge, if such a projection exists, or the distance to
24135         // the closest vertex on that edge. Returns an object with the `index` of the
24136         // chosen edge, the chosen `loc` on that edge, and the `distance` to to it.
24137         function geoChooseEdge(nodes, point, projection, activeID) {
24138             var dist = geoVecLength;
24139             var points = nodes.map(function(n) { return projection(n.loc); });
24140             var ids = nodes.map(function(n) { return n.id; });
24141             var min = Infinity;
24142             var idx;
24143             var loc;
24144
24145             for (var i = 0; i < points.length - 1; i++) {
24146                 if (ids[i] === activeID || ids[i + 1] === activeID) continue;
24147
24148                 var o = points[i];
24149                 var s = geoVecSubtract(points[i + 1], o);
24150                 var v = geoVecSubtract(point, o);
24151                 var proj = geoVecDot(v, s) / geoVecDot(s, s);
24152                 var p;
24153
24154                 if (proj < 0) {
24155                     p = o;
24156                 } else if (proj > 1) {
24157                     p = points[i + 1];
24158                 } else {
24159                     p = [o[0] + proj * s[0], o[1] + proj * s[1]];
24160                 }
24161
24162                 var d = dist(p, point);
24163                 if (d < min) {
24164                     min = d;
24165                     idx = i + 1;
24166                     loc = projection.invert(p);
24167                 }
24168             }
24169
24170             if (idx !== undefined) {
24171                 return { index: idx, distance: min, loc: loc };
24172             } else {
24173                 return null;
24174             }
24175         }
24176
24177
24178         // Test active (dragged or drawing) segments against inactive segments
24179         // This is used to test e.g. multipolygon rings that cross
24180         // `activeNodes` is the ring containing the activeID being dragged.
24181         // `inactiveNodes` is the other ring to test against
24182         function geoHasLineIntersections(activeNodes, inactiveNodes, activeID) {
24183             var actives = [];
24184             var inactives = [];
24185             var j, k, n1, n2, segment;
24186
24187             // gather active segments (only segments in activeNodes that contain the activeID)
24188             for (j = 0; j < activeNodes.length - 1; j++) {
24189                 n1 = activeNodes[j];
24190                 n2 = activeNodes[j+1];
24191                 segment = [n1.loc, n2.loc];
24192                 if (n1.id === activeID || n2.id === activeID) {
24193                     actives.push(segment);
24194                 }
24195             }
24196
24197             // gather inactive segments
24198             for (j = 0; j < inactiveNodes.length - 1; j++) {
24199                 n1 = inactiveNodes[j];
24200                 n2 = inactiveNodes[j+1];
24201                 segment = [n1.loc, n2.loc];
24202                 inactives.push(segment);
24203             }
24204
24205             // test
24206             for (j = 0; j < actives.length; j++) {
24207                 for (k = 0; k < inactives.length; k++) {
24208                     var p = actives[j];
24209                     var q = inactives[k];
24210                     var hit = geoLineIntersection(p, q);
24211                     if (hit) {
24212                         return true;
24213                     }
24214                 }
24215             }
24216
24217             return false;
24218         }
24219
24220
24221         // Test active (dragged or drawing) segments against inactive segments
24222         // This is used to test whether a way intersects with itself.
24223         function geoHasSelfIntersections(nodes, activeID) {
24224             var actives = [];
24225             var inactives = [];
24226             var j, k;
24227
24228             // group active and passive segments along the nodes
24229             for (j = 0; j < nodes.length - 1; j++) {
24230                 var n1 = nodes[j];
24231                 var n2 = nodes[j+1];
24232                 var segment = [n1.loc, n2.loc];
24233                 if (n1.id === activeID || n2.id === activeID) {
24234                     actives.push(segment);
24235                 } else {
24236                     inactives.push(segment);
24237                 }
24238             }
24239
24240             // test
24241             for (j = 0; j < actives.length; j++) {
24242                 for (k = 0; k < inactives.length; k++) {
24243                     var p = actives[j];
24244                     var q = inactives[k];
24245                     // skip if segments share an endpoint
24246                     if (geoVecEqual(p[1], q[0]) || geoVecEqual(p[0], q[1]) ||
24247                         geoVecEqual(p[0], q[0]) || geoVecEqual(p[1], q[1]) ) {
24248                         continue;
24249                     }
24250
24251                     var hit = geoLineIntersection(p, q);
24252                     if (hit) {
24253                         var epsilon = 1e-8;
24254                         // skip if the hit is at the segment's endpoint
24255                         if (geoVecEqual(p[1], hit, epsilon) || geoVecEqual(p[0], hit, epsilon) ||
24256                             geoVecEqual(q[1], hit, epsilon) || geoVecEqual(q[0], hit, epsilon) ) {
24257                             continue;
24258                         } else {
24259                             return true;
24260                         }
24261                     }
24262                 }
24263             }
24264
24265             return false;
24266         }
24267
24268
24269         // Return the intersection point of 2 line segments.
24270         // From https://github.com/pgkelley4/line-segments-intersect
24271         // This uses the vector cross product approach described below:
24272         //  http://stackoverflow.com/a/565282/786339
24273         function geoLineIntersection(a, b) {
24274             var p = [a[0][0], a[0][1]];
24275             var p2 = [a[1][0], a[1][1]];
24276             var q = [b[0][0], b[0][1]];
24277             var q2 = [b[1][0], b[1][1]];
24278             var r = geoVecSubtract(p2, p);
24279             var s = geoVecSubtract(q2, q);
24280             var uNumerator = geoVecCross(geoVecSubtract(q, p), r);
24281             var denominator = geoVecCross(r, s);
24282
24283             if (uNumerator && denominator) {
24284                 var u = uNumerator / denominator;
24285                 var t = geoVecCross(geoVecSubtract(q, p), s) / denominator;
24286
24287                 if ((t >= 0) && (t <= 1) && (u >= 0) && (u <= 1)) {
24288                     return geoVecInterp(p, p2, t);
24289                 }
24290             }
24291
24292             return null;
24293         }
24294
24295
24296         function geoPathIntersections(path1, path2) {
24297             var intersections = [];
24298             for (var i = 0; i < path1.length - 1; i++) {
24299                 for (var j = 0; j < path2.length - 1; j++) {
24300                     var a = [ path1[i], path1[i+1] ];
24301                     var b = [ path2[j], path2[j+1] ];
24302                     var hit = geoLineIntersection(a, b);
24303                     if (hit) {
24304                         intersections.push(hit);
24305                     }
24306                 }
24307             }
24308             return intersections;
24309         }
24310
24311         function geoPathHasIntersections(path1, path2) {
24312             for (var i = 0; i < path1.length - 1; i++) {
24313                 for (var j = 0; j < path2.length - 1; j++) {
24314                     var a = [ path1[i], path1[i+1] ];
24315                     var b = [ path2[j], path2[j+1] ];
24316                     var hit = geoLineIntersection(a, b);
24317                     if (hit) {
24318                         return true;
24319                     }
24320                 }
24321             }
24322             return false;
24323         }
24324
24325
24326         // Return whether point is contained in polygon.
24327         //
24328         // `point` should be a 2-item array of coordinates.
24329         // `polygon` should be an array of 2-item arrays of coordinates.
24330         //
24331         // From https://github.com/substack/point-in-polygon.
24332         // ray-casting algorithm based on
24333         // http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html
24334         //
24335         function geoPointInPolygon(point, polygon) {
24336             var x = point[0];
24337             var y = point[1];
24338             var inside = false;
24339
24340             for (var i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
24341                 var xi = polygon[i][0];
24342                 var yi = polygon[i][1];
24343                 var xj = polygon[j][0];
24344                 var yj = polygon[j][1];
24345
24346                 var intersect = ((yi > y) !== (yj > y)) &&
24347                     (x < (xj - xi) * (y - yi) / (yj - yi) + xi);
24348                 if (intersect) inside = !inside;
24349             }
24350
24351             return inside;
24352         }
24353
24354
24355         function geoPolygonContainsPolygon(outer, inner) {
24356             return inner.every(function(point) {
24357                 return geoPointInPolygon(point, outer);
24358             });
24359         }
24360
24361
24362         function geoPolygonIntersectsPolygon(outer, inner, checkSegments) {
24363             function testPoints(outer, inner) {
24364                 return inner.some(function(point) {
24365                     return geoPointInPolygon(point, outer);
24366                 });
24367             }
24368
24369            return testPoints(outer, inner) || (!!checkSegments && geoPathHasIntersections(outer, inner));
24370         }
24371
24372
24373         // http://gis.stackexchange.com/questions/22895/finding-minimum-area-rectangle-for-given-points
24374         // http://gis.stackexchange.com/questions/3739/generalisation-strategies-for-building-outlines/3756#3756
24375         function geoGetSmallestSurroundingRectangle(points) {
24376             var hull = d3_polygonHull(points);
24377             var centroid = d3_polygonCentroid(hull);
24378             var minArea = Infinity;
24379             var ssrExtent = [];
24380             var ssrAngle = 0;
24381             var c1 = hull[0];
24382
24383             for (var i = 0; i <= hull.length - 1; i++) {
24384                 var c2 = (i === hull.length - 1) ? hull[0] : hull[i + 1];
24385                 var angle = Math.atan2(c2[1] - c1[1], c2[0] - c1[0]);
24386                 var poly = geoRotate(hull, -angle, centroid);
24387                 var extent = poly.reduce(function(extent, point) {
24388                     return extent.extend(geoExtent(point));
24389                 }, geoExtent());
24390
24391                 var area = extent.area();
24392                 if (area < minArea) {
24393                     minArea = area;
24394                     ssrExtent = extent;
24395                     ssrAngle = angle;
24396                 }
24397                 c1 = c2;
24398             }
24399
24400             return {
24401                 poly: geoRotate(ssrExtent.polygon(), ssrAngle, centroid),
24402                 angle: ssrAngle
24403             };
24404         }
24405
24406
24407         function geoPathLength(path) {
24408             var length = 0;
24409             for (var i = 0; i < path.length - 1; i++) {
24410                 length += geoVecLength(path[i], path[i + 1]);
24411             }
24412             return length;
24413         }
24414
24415
24416         // If the given point is at the edge of the padded viewport,
24417         // return a vector that will nudge the viewport in that direction
24418         function geoViewportEdge(point, dimensions) {
24419             var pad = [80, 20, 50, 20];   // top, right, bottom, left
24420             var x = 0;
24421             var y = 0;
24422
24423             if (point[0] > dimensions[0] - pad[1])
24424                 x = -10;
24425             if (point[0] < pad[3])
24426                 x = 10;
24427             if (point[1] > dimensions[1] - pad[2])
24428                 y = -10;
24429             if (point[1] < pad[0])
24430                 y = 10;
24431
24432             if (x || y) {
24433                 return [x, y];
24434             } else {
24435                 return null;
24436             }
24437         }
24438
24439         /*
24440             Bypasses features of D3's default projection stream pipeline that are unnecessary:
24441             * Antimeridian clipping
24442             * Spherical rotation
24443             * Resampling
24444         */
24445         function geoRawMercator() {
24446             var project = mercatorRaw;
24447             var k = 512 / Math.PI; // scale
24448             var x = 0;
24449             var y = 0; // translate
24450             var clipExtent = [[0, 0], [0, 0]];
24451
24452
24453             function projection(point) {
24454                 point = project(point[0] * Math.PI / 180, point[1] * Math.PI / 180);
24455                 return [point[0] * k + x, y - point[1] * k];
24456             }
24457
24458
24459             projection.invert = function(point) {
24460                 point = project.invert((point[0] - x) / k, (y - point[1]) / k);
24461                 return point && [point[0] * 180 / Math.PI, point[1] * 180 / Math.PI];
24462             };
24463
24464
24465             projection.scale = function(_) {
24466                 if (!arguments.length) return k;
24467                 k = +_;
24468                 return projection;
24469             };
24470
24471
24472             projection.translate = function(_) {
24473                 if (!arguments.length) return [x, y];
24474                 x = +_[0];
24475                 y = +_[1];
24476                 return projection;
24477             };
24478
24479
24480             projection.clipExtent = function(_) {
24481                 if (!arguments.length) return clipExtent;
24482                 clipExtent = _;
24483                 return projection;
24484             };
24485
24486
24487             projection.transform = function(obj) {
24488                 if (!arguments.length) return identity$8.translate(x, y).scale(k);
24489                 x = +obj.x;
24490                 y = +obj.y;
24491                 k = +obj.k;
24492                 return projection;
24493             };
24494
24495
24496             projection.stream = d3_geoTransform({
24497                 point: function(x, y) {
24498                     var vec = projection([x, y]);
24499                     this.stream.point(vec[0], vec[1]);
24500                 }
24501             }).stream;
24502
24503
24504             return projection;
24505         }
24506
24507         function geoOrthoNormalizedDotProduct(a, b, origin) {
24508             if (geoVecEqual(origin, a) || geoVecEqual(origin, b)) {
24509                 return 1;  // coincident points, treat as straight and try to remove
24510             }
24511             return geoVecNormalizedDot(a, b, origin);
24512         }
24513
24514
24515         function geoOrthoFilterDotProduct(dotp, epsilon, lowerThreshold, upperThreshold, allowStraightAngles) {
24516             var val = Math.abs(dotp);
24517             if (val < epsilon) {
24518                 return 0;      // already orthogonal
24519             } else if (allowStraightAngles && Math.abs(val-1) < epsilon) {
24520                 return 0;      // straight angle, which is okay in this case
24521             } else if (val < lowerThreshold || val > upperThreshold) {
24522                 return dotp;   // can be adjusted
24523             } else {
24524                 return null;   // ignore vertex
24525             }
24526         }
24527
24528
24529         function geoOrthoCalcScore(points, isClosed, epsilon, threshold) {
24530             var score = 0;
24531             var first = isClosed ? 0 : 1;
24532             var last = isClosed ? points.length : points.length - 1;
24533             var coords = points.map(function(p) { return p.coord; });
24534
24535             var lowerThreshold = Math.cos((90 - threshold) * Math.PI / 180);
24536             var upperThreshold = Math.cos(threshold * Math.PI / 180);
24537
24538             for (var i = first; i < last; i++) {
24539                 var a = coords[(i - 1 + coords.length) % coords.length];
24540                 var origin = coords[i];
24541                 var b = coords[(i + 1) % coords.length];
24542
24543                 var dotp = geoOrthoFilterDotProduct(geoOrthoNormalizedDotProduct(a, b, origin), epsilon, lowerThreshold, upperThreshold);
24544                 if (dotp === null) continue;    // ignore vertex
24545                 score = score + 2.0 * Math.min(Math.abs(dotp - 1.0), Math.min(Math.abs(dotp), Math.abs(dotp + 1)));
24546             }
24547
24548             return score;
24549         }
24550
24551         // returns the maximum angle less than `lessThan` between the actual corner and a 0° or 90° corner
24552         function geoOrthoMaxOffsetAngle(coords, isClosed, lessThan) {
24553             var max = -Infinity;
24554
24555             var first = isClosed ? 0 : 1;
24556             var last = isClosed ? coords.length : coords.length - 1;
24557
24558             for (var i = first; i < last; i++) {
24559                 var a = coords[(i - 1 + coords.length) % coords.length];
24560                 var origin = coords[i];
24561                 var b = coords[(i + 1) % coords.length];
24562                 var normalizedDotP = geoOrthoNormalizedDotProduct(a, b, origin);
24563
24564                 var angle = Math.acos(Math.abs(normalizedDotP)) * 180 / Math.PI;
24565
24566                 if (angle > 45) angle = 90 - angle;
24567
24568                 if (angle >= lessThan) continue;
24569
24570                 if (angle > max) max = angle;
24571             }
24572
24573             if (max === -Infinity) return null;
24574
24575             return max;
24576         }
24577
24578
24579         // similar to geoOrthoCalcScore, but returns quickly if there is something to do
24580         function geoOrthoCanOrthogonalize(coords, isClosed, epsilon, threshold, allowStraightAngles) {
24581             var score = null;
24582             var first = isClosed ? 0 : 1;
24583             var last = isClosed ? coords.length : coords.length - 1;
24584
24585             var lowerThreshold = Math.cos((90 - threshold) * Math.PI / 180);
24586             var upperThreshold = Math.cos(threshold * Math.PI / 180);
24587
24588             for (var i = first; i < last; i++) {
24589                 var a = coords[(i - 1 + coords.length) % coords.length];
24590                 var origin = coords[i];
24591                 var b = coords[(i + 1) % coords.length];
24592
24593                 var dotp = geoOrthoFilterDotProduct(geoOrthoNormalizedDotProduct(a, b, origin), epsilon, lowerThreshold, upperThreshold, allowStraightAngles);
24594                 if (dotp === null) continue;        // ignore vertex
24595                 if (Math.abs(dotp) > 0) return 1;   // something to do
24596                 score = 0;                          // already square
24597             }
24598
24599             return score;
24600         }
24601
24602         var wikibooks = [["Afrikaans","Afrikaans","af"],["Arabic","العربية","ar"],["Azerbaijani","azərbaycanca","az"],["Belarusian","беларуская","be"],["Bulgarian","български","bg"],["Bangla","বাংলা","bn"],["Bosnian","bosanski","bs"],["Catalan","català","ca"],["Czech","čeština","cs"],["Chuvash","Чӑвашла","cv"],["Welsh","Cymraeg","cy"],["Danish","dansk","da"],["German","Deutsch","de"],["Greek","Ελληνικά","el"],["English","English","en"],["Esperanto","Esperanto","eo"],["Spanish","español","es"],["Estonian","eesti","et"],["Basque","euskara","eu"],["Persian","فارسی","fa"],["Finnish","suomi","fi"],["French","français","fr"],["Western Frisian","Frysk","fy"],["Galician","galego","gl"],["Hebrew","עברית","he"],["Hindi","हिन्दी","hi"],["Croatian","hrvatski","hr"],["Hungarian","magyar","hu"],["Armenian","Հայերեն","hy"],["Interlingua","interlingua","ia"],["Indonesian","Bahasa Indonesia","id"],["Icelandic","íslenska","is"],["Italian","italiano","it"],["Japanese","日本語","ja"],["Georgian","ქართული","ka"],["Kazakh","қазақша","kk"],["Khmer","ភាសាខ្មែរ","km"],["Korean","한국어","ko"],["Kurdish","Kurdî","ku"],["Kyrgyz","Кыргызча","ky"],["Latin","Latina","la"],["Limburgish","Limburgs","li"],["Lithuanian","lietuvių","lt"],["Malagasy","Malagasy","mg"],["Macedonian","македонски","mk"],["Malayalam","മലയാളം","ml"],["Marathi","मराठी","mr"],["Malay","Bahasa Melayu","ms"],["Nepali","नेपाली","ne"],["Dutch","Nederlands","nl"],["Norwegian","norsk bokmål","no"],["Occitan","occitan","oc"],["Punjabi","ਪੰਜਾਬੀ","pa"],["Polish","polski","pl"],["Portuguese","português","pt"],["Romanian","română","ro"],["Russian","русский","ru"],["Sanskrit","संस्कृतम्","sa"],["Sinhala","සිංහල","si"],["Slovak","slovenčina","sk"],["Slovenian","slovenščina","sl"],["Albanian","shqip","sq"],["Serbian","српски / srpski","sr"],["Swedish","svenska","sv"],["Tamil","தமிழ்","ta"],["Telugu","తెలుగు","te"],["Tajik","тоҷикӣ","tg"],["Thai","ไทย","th"],["Tagalog","Tagalog","tl"],["Turkish","Türkçe","tr"],["Tatar","татарча/tatarça","tt"],["Ukrainian","українська","uk"],["Urdu","اردو","ur"],["Vietnamese","Tiếng Việt","vi"],["Chinese","中文","zh"]];
24603
24604         var wikibooks$1 = /*#__PURE__*/Object.freeze({
24605                 'default': wikibooks
24606         });
24607
24608         var wikinews = [["Arabic","العربية","ar"],["Bulgarian","български","bg"],["Bosnian","bosanski","bs"],["Catalan","català","ca"],["Czech","čeština","cs"],["German","Deutsch","de"],["Greek","Ελληνικά","el"],["English","English","en"],["Esperanto","Esperanto","eo"],["Spanish","español","es"],["Persian","فارسی","fa"],["Finnish","suomi","fi"],["French","français","fr"],["Hebrew","עברית","he"],["Italian","italiano","it"],["Japanese","日本語","ja"],["Korean","한국어","ko"],["Norwegian","norsk bokmål","no"],["Polish","polski","pl"],["Portuguese","português","pt"],["Romanian","română","ro"],["Russian","русский","ru"],["Albanian","shqip","sq"],["Serbian","српски / srpski","sr"],["Swedish","svenska","sv"],["Tamil","தமிழ்","ta"],["Turkish","Türkçe","tr"],["Ukrainian","українська","uk"],["Chinese","中文","zh"]];
24609
24610         var wikinews$1 = /*#__PURE__*/Object.freeze({
24611                 'default': wikinews
24612         });
24613
24614         var wikiquote = [["Afrikaans","Afrikaans","af"],["Arabic","العربية","ar"],["Azerbaijani","azərbaycanca","az"],["Belarusian","беларуская","be"],["Bulgarian","български","bg"],["Breton","brezhoneg","br"],["Bosnian","bosanski","bs"],["Catalan","català","ca"],["Czech","čeština","cs"],["Welsh","Cymraeg","cy"],["Danish","dansk","da"],["German","Deutsch","de"],["Greek","Ελληνικά","el"],["English","English","en"],["Esperanto","Esperanto","eo"],["Spanish","español","es"],["Estonian","eesti","et"],["Basque","euskara","eu"],["Persian","فارسی","fa"],["Finnish","suomi","fi"],["French","français","fr"],["Galician","galego","gl"],["Gujarati","ગુજરાતી","gu"],["Hebrew","עברית","he"],["Hindi","हिन्दी","hi"],["Croatian","hrvatski","hr"],["Hungarian","magyar","hu"],["Armenian","Հայերեն","hy"],["Indonesian","Bahasa Indonesia","id"],["Icelandic","íslenska","is"],["Italian","italiano","it"],["Japanese","日本語","ja"],["Georgian","ქართული","ka"],["Kannada","ಕನ್ನಡ","kn"],["Korean","한국어","ko"],["Kurdish","Kurdî","ku"],["Kyrgyz","Кыргызча","ky"],["Latin","Latina","la"],["Limburgish","Limburgs","li"],["Lithuanian","lietuvių","lt"],["Malayalam","മലയാളം","ml"],["Marathi","मराठी","mr"],["Dutch","Nederlands","nl"],["Norwegian Nynorsk","norsk nynorsk","nn"],["Norwegian","norsk bokmål","no"],["Polish","polski","pl"],["Portuguese","português","pt"],["Romanian","română","ro"],["Russian","русский","ru"],["Sanskrit","संस्कृतम्","sa"],["Slovak","slovenčina","sk"],["Slovenian","slovenščina","sl"],["Albanian","shqip","sq"],["Serbian","српски / srpski","sr"],["Sundanese","Basa Sunda","su"],["Swedish","svenska","sv"],["Tamil","தமிழ்","ta"],["Telugu","తెలుగు","te"],["Thai","ไทย","th"],["Turkish","Türkçe","tr"],["Ukrainian","українська","uk"],["Urdu","اردو","ur"],["Uzbek","oʻzbekcha/ўзбекча","uz"],["Vietnamese","Tiếng Việt","vi"],["Wolof","Wolof","wo"],["Chinese","中文","zh"]];
24615
24616         var wikiquote$1 = /*#__PURE__*/Object.freeze({
24617                 'default': wikiquote
24618         });
24619
24620         var wikiversity = [["Arabic","العربية","ar"],["Czech","čeština","cs"],["German","Deutsch","de"],["Greek","Ελληνικά","el"],["English","English","en"],["Spanish","español","es"],["Finnish","suomi","fi"],["French","français","fr"],["Italian","italiano","it"],["Japanese","日本語","ja"],["Korean","한국어","ko"],["Portuguese","português","pt"],["Russian","русский","ru"],["Slovenian","slovenščina","sl"],["Swedish","svenska","sv"]];
24621
24622         var wikiversity$1 = /*#__PURE__*/Object.freeze({
24623                 'default': wikiversity
24624         });
24625
24626         var wikivoyage = [["German","Deutsch","de"],["Greek","Ελληνικά","el"],["English","English","en"],["Spanish","español","es"],["Persian","فارسی","fa"],["Finnish","suomi","fi"],["French","français","fr"],["Hebrew","עברית","he"],["Italian","italiano","it"],["Dutch","Nederlands","nl"],["Polish","polski","pl"],["Portuguese","português","pt"],["Romanian","română","ro"],["Russian","русский","ru"],["Swedish","svenska","sv"],["Ukrainian","українська","uk"],["Vietnamese","Tiếng Việt","vi"],["Chinese","中文","zh"]];
24627
24628         var wikivoyage$1 = /*#__PURE__*/Object.freeze({
24629                 'default': wikivoyage
24630         });
24631
24632         var wiktionary = [["Afrikaans","Afrikaans","af"],["Amharic","አማርኛ","am"],["Aragonese","aragonés","an"],["Old English","Ænglisc","ang"],["Arabic","العربية","ar"],["Asturian","asturianu","ast"],["Aymara","Aymar aru","ay"],["Azerbaijani","azərbaycanca","az"],["Belarusian","беларуская","be"],["Bulgarian","български","bg"],["Bangla","বাংলা","bn"],["Breton","brezhoneg","br"],["Bosnian","bosanski","bs"],["Catalan","català","ca"],["Cherokee","ᏣᎳᎩ","chr"],["Corsican","corsu","co"],["Czech","čeština","cs"],["Kashubian","kaszëbsczi","csb"],["Welsh","Cymraeg","cy"],["Danish","dansk","da"],["German","Deutsch","de"],["Divehi","ދިވެހިބަސް","dv"],["Greek","Ελληνικά","el"],["English","English","en"],["Esperanto","Esperanto","eo"],["Spanish","español","es"],["Estonian","eesti","et"],["Basque","euskara","eu"],["Persian","فارسی","fa"],["Finnish","suomi","fi"],["Fijian","Na Vosa Vakaviti","fj"],["Faroese","føroyskt","fo"],["French","français","fr"],["Western Frisian","Frysk","fy"],["Irish","Gaeilge","ga"],["Scottish Gaelic","Gàidhlig","gd"],["Galician","galego","gl"],["Guarani","Avañe'ẽ","gn"],["Gujarati","ગુજરાતી","gu"],["Manx","Gaelg","gv"],["Hausa","Hausa","ha"],["Hebrew","עברית","he"],["Hindi","हिन्दी","hi"],["Croatian","hrvatski","hr"],["Upper Sorbian","hornjoserbsce","hsb"],["Hungarian","magyar","hu"],["Armenian","Հայերեն","hy"],["Interlingua","interlingua","ia"],["Indonesian","Bahasa Indonesia","id"],["Interlingue","Interlingue","ie"],["Ido","Ido","io"],["Icelandic","íslenska","is"],["Italian","italiano","it"],["Inuktitut","ᐃᓄᒃᑎᑐᑦ/inuktitut","iu"],["Japanese","日本語","ja"],["Lojban","la .lojban.","jbo"],["Javanese","Basa Jawa","jv"],["Georgian","ქართული","ka"],["Kazakh","қазақша","kk"],["Kalaallisut","kalaallisut","kl"],["Khmer","ភាសាខ្មែរ","km"],["Kannada","ಕನ್ನಡ","kn"],["Korean","한국어","ko"],["Kashmiri","कॉशुर / کٲشُر","ks"],["Kurdish","Kurdî","ku"],["Cornish","kernowek","kw"],["Kyrgyz","Кыргызча","ky"],["Latin","Latina","la"],["Luxembourgish","Lëtzebuergesch","lb"],["Limburgish","Limburgs","li"],["Lingala","lingála","ln"],["Lao","ລາວ","lo"],["Lithuanian","lietuvių","lt"],["Latvian","latviešu","lv"],["Malagasy","Malagasy","mg"],["Maori","Māori","mi"],["Macedonian","македонски","mk"],["Malayalam","മലയാളം","ml"],["Mongolian","монгол","mn"],["Marathi","मराठी","mr"],["Malay","Bahasa Melayu","ms"],["Maltese","Malti","mt"],["Burmese","မြန်မာဘာသာ","my"],["Nauru","Dorerin Naoero","na"],["Nāhuatl","Nāhuatl","nah"],["Low German","Plattdüütsch","nds"],["Nepali","नेपाली","ne"],["Dutch","Nederlands","nl"],["Norwegian Nynorsk","norsk nynorsk","nn"],["Norwegian","norsk bokmål","no"],["Occitan","occitan","oc"],["Oromo","Oromoo","om"],["Odia","ଓଡ଼ିଆ","or"],["Punjabi","ਪੰਜਾਬੀ","pa"],["Polish","polski","pl"],["Western Punjabi","پنجابی","pnb"],["Pashto","پښتو","ps"],["Portuguese","português","pt"],["Quechua","Runa Simi","qu"],["Romanian","română","ro"],["Aromanian","armãneashti","roa-rup"],["Russian","русский","ru"],["Kinyarwanda","Kinyarwanda","rw"],["Sanskrit","संस्कृतम्","sa"],["Sicilian","sicilianu","scn"],["Sindhi","سنڌي","sd"],["Sango","Sängö","sg"],["Serbo-Croatian","srpskohrvatski / српскохрватски","sh"],["Sinhala","සිංහල","si"],["Simple English","Simple English","simple"],["Slovak","slovenčina","sk"],["Slovenian","slovenščina","sl"],["Samoan","Gagana Samoa","sm"],["Somali","Soomaaliga","so"],["Albanian","shqip","sq"],["Serbian","српски / srpski","sr"],["Swati","SiSwati","ss"],["Southern Sotho","Sesotho","st"],["Sundanese","Basa Sunda","su"],["Swedish","svenska","sv"],["Swahili","Kiswahili","sw"],["Tamil","தமிழ்","ta"],["Telugu","తెలుగు","te"],["Tajik","тоҷикӣ","tg"],["Thai","ไทย","th"],["Tigrinya","ትግርኛ","ti"],["Turkmen","Türkmençe","tk"],["Tagalog","Tagalog","tl"],["Tswana","Setswana","tn"],["Tok Pisin","Tok Pisin","tpi"],["Turkish","Türkçe","tr"],["Tsonga","Xitsonga","ts"],["Tatar","татарча/tatarça","tt"],["Uyghur","ئۇيغۇرچە / Uyghurche","ug"],["Ukrainian","українська","uk"],["Urdu","اردو","ur"],["Uzbek","oʻzbekcha/ўзбекча","uz"],["Venetian","vèneto","vec"],["Vietnamese","Tiếng Việt","vi"],["Volapük","Volapük","vo"],["Walloon","walon","wa"],["Wolof","Wolof","wo"],["Yiddish","ייִדיש","yi"],["Chinese","中文","zh"],["Chinese (Min Nan)","Bân-lâm-gú","zh-min-nan"],["Zulu","isiZulu","zu"]];
24633
24634         var wiktionary$1 = /*#__PURE__*/Object.freeze({
24635                 'default': wiktionary
24636         });
24637
24638         var wikipedia = [["Abkhazian","Аҧсшәа","ab"],["Achinese","Acèh","ace"],["Adyghe","адыгабзэ","ady"],["Afrikaans","Afrikaans","af"],["Akan","Akan","ak"],["Alemannisch","Alemannisch","als"],["Amharic","አማርኛ","am"],["Aragonese","aragonés","an"],["Old English","Ænglisc","ang"],["Arabic","العربية","ar"],["Aramaic","ܐܪܡܝܐ","arc"],["Egyptian Arabic","مصرى","arz"],["Assamese","অসমীয়া","as"],["Asturian","asturianu","ast"],["Avaric","авар","av"],["Aymara","Aymar aru","ay"],["Azerbaijani","azərbaycanca","az"],["تۆرکجه","تۆرکجه","azb"],["Bashkir","башҡортса","ba"],["Bavarian","Boarisch","bar"],["Samogitian","žemaitėška","bat-smg"],["Bikol Central","Bikol Central","bcl"],["Belarusian","беларуская","be"],["беларуская (тарашкевіца)‎","беларуская (тарашкевіца)‎","be-x-old"],["Bulgarian","български","bg"],["भोजपुरी","भोजपुरी","bh"],["Bislama","Bislama","bi"],["Banjar","Bahasa Banjar","bjn"],["Bambara","bamanankan","bm"],["Bangla","বাংলা","bn"],["Tibetan","བོད་ཡིག","bo"],["Bishnupriya","বিষ্ণুপ্রিয়া মণিপুরী","bpy"],["Breton","brezhoneg","br"],["Bosnian","bosanski","bs"],["Buginese","ᨅᨔ ᨕᨘᨁᨗ","bug"],["буряад","буряад","bxr"],["Catalan","català","ca"],["Chavacano de Zamboanga","Chavacano de Zamboanga","cbk-zam"],["Min Dong Chinese","Mìng-dĕ̤ng-ngṳ̄","cdo"],["Chechen","нохчийн","ce"],["Cebuano","Cebuano","ceb"],["Chamorro","Chamoru","ch"],["Cherokee","ᏣᎳᎩ","chr"],["Cheyenne","Tsetsêhestâhese","chy"],["Central Kurdish","کوردیی ناوەندی","ckb"],["Corsican","corsu","co"],["Cree","Nēhiyawēwin / ᓀᐦᐃᔭᐍᐏᐣ","cr"],["Crimean Turkish","qırımtatarca","crh"],["Czech","čeština","cs"],["Kashubian","kaszëbsczi","csb"],["Church Slavic","словѣньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ","cu"],["Chuvash","Чӑвашла","cv"],["Welsh","Cymraeg","cy"],["Danish","dansk","da"],["German","Deutsch","de"],["Zazaki","Zazaki","diq"],["Lower Sorbian","dolnoserbski","dsb"],["Divehi","ދިވެހިބަސް","dv"],["Dzongkha","ཇོང་ཁ","dz"],["Ewe","eʋegbe","ee"],["Greek","Ελληνικά","el"],["Emiliano-Romagnolo","emiliàn e rumagnòl","eml"],["English","English","en"],["Esperanto","Esperanto","eo"],["Spanish","español","es"],["Estonian","eesti","et"],["Basque","euskara","eu"],["Extremaduran","estremeñu","ext"],["Persian","فارسی","fa"],["Fulah","Fulfulde","ff"],["Finnish","suomi","fi"],["Võro","Võro","fiu-vro"],["Fijian","Na Vosa Vakaviti","fj"],["Faroese","føroyskt","fo"],["French","français","fr"],["Arpitan","arpetan","frp"],["Northern Frisian","Nordfriisk","frr"],["Friulian","furlan","fur"],["Western Frisian","Frysk","fy"],["Irish","Gaeilge","ga"],["Gagauz","Gagauz","gag"],["Gan Chinese","贛語","gan"],["Scottish Gaelic","Gàidhlig","gd"],["Galician","galego","gl"],["Gilaki","گیلکی","glk"],["Guarani","Avañe'ẽ","gn"],["Goan Konkani","गोंयची कोंकणी / Gõychi Konknni","gom"],["Gothic","𐌲𐌿𐍄𐌹𐍃𐌺","got"],["Gujarati","ગુજરાતી","gu"],["Manx","Gaelg","gv"],["Hausa","Hausa","ha"],["Hakka Chinese","客家語/Hak-kâ-ngî","hak"],["Hawaiian","Hawaiʻi","haw"],["Hebrew","עברית","he"],["Hindi","हिन्दी","hi"],["Fiji Hindi","Fiji Hindi","hif"],["Croatian","hrvatski","hr"],["Upper Sorbian","hornjoserbsce","hsb"],["Haitian Creole","Kreyòl ayisyen","ht"],["Hungarian","magyar","hu"],["Armenian","Հայերեն","hy"],["Interlingua","interlingua","ia"],["Indonesian","Bahasa Indonesia","id"],["Interlingue","Interlingue","ie"],["Igbo","Igbo","ig"],["Inupiaq","Iñupiak","ik"],["Iloko","Ilokano","ilo"],["Ido","Ido","io"],["Icelandic","íslenska","is"],["Italian","italiano","it"],["Inuktitut","ᐃᓄᒃᑎᑐᑦ/inuktitut","iu"],["Japanese","日本語","ja"],["Jamaican Creole English","Patois","jam"],["Lojban","la .lojban.","jbo"],["Javanese","Basa Jawa","jv"],["Georgian","ქართული","ka"],["Kara-Kalpak","Qaraqalpaqsha","kaa"],["Kabyle","Taqbaylit","kab"],["Kabardian","Адыгэбзэ","kbd"],["Kongo","Kongo","kg"],["Kikuyu","Gĩkũyũ","ki"],["Kazakh","қазақша","kk"],["Kalaallisut","kalaallisut","kl"],["Khmer","ភាសាខ្មែរ","km"],["Kannada","ಕನ್ನಡ","kn"],["Korean","한국어","ko"],["Komi-Permyak","Перем Коми","koi"],["Karachay-Balkar","къарачай-малкъар","krc"],["Kashmiri","कॉशुर / کٲشُر","ks"],["Colognian","Ripoarisch","ksh"],["Kurdish","Kurdî","ku"],["Komi","коми","kv"],["Cornish","kernowek","kw"],["Kyrgyz","Кыргызча","ky"],["Latin","Latina","la"],["Ladino","Ladino","lad"],["Luxembourgish","Lëtzebuergesch","lb"],["лакку","лакку","lbe"],["Lezghian","лезги","lez"],["Ganda","Luganda","lg"],["Limburgish","Limburgs","li"],["Ligurian","Ligure","lij"],["Lombard","lumbaart","lmo"],["Lingala","lingála","ln"],["Lao","ລາວ","lo"],["Northern Luri","لۊری شومالی","lrc"],["Lithuanian","lietuvių","lt"],["Latgalian","latgaļu","ltg"],["Latvian","latviešu","lv"],["Maithili","मैथिली","mai"],["Basa Banyumasan","Basa Banyumasan","map-bms"],["Moksha","мокшень","mdf"],["Malagasy","Malagasy","mg"],["Eastern Mari","олык марий","mhr"],["Maori","Māori","mi"],["Minangkabau","Baso Minangkabau","min"],["Macedonian","македонски","mk"],["Malayalam","മലയാളം","ml"],["Mongolian","монгол","mn"],["Marathi","मराठी","mr"],["Western Mari","кырык мары","mrj"],["Malay","Bahasa Melayu","ms"],["Maltese","Malti","mt"],["Mirandese","Mirandés","mwl"],["Burmese","မြန်မာဘာသာ","my"],["Erzya","эрзянь","myv"],["Mazanderani","مازِرونی","mzn"],["Nauru","Dorerin Naoero","na"],["Nāhuatl","Nāhuatl","nah"],["Neapolitan","Napulitano","nap"],["Low German","Plattdüütsch","nds"],["Low Saxon","Nedersaksies","nds-nl"],["Nepali","नेपाली","ne"],["Newari","नेपाल भाषा","new"],["Dutch","Nederlands","nl"],["Norwegian Nynorsk","norsk nynorsk","nn"],["Norwegian","norsk bokmål","no"],["Novial","Novial","nov"],["Nouormand","Nouormand","nrm"],["Northern Sotho","Sesotho sa Leboa","nso"],["Navajo","Diné bizaad","nv"],["Nyanja","Chi-Chewa","ny"],["Occitan","occitan","oc"],["Livvi-Karelian","Livvinkarjala","olo"],["Oromo","Oromoo","om"],["Odia","ଓଡ଼ିଆ","or"],["Ossetic","Ирон","os"],["Punjabi","ਪੰਜਾਬੀ","pa"],["Pangasinan","Pangasinan","pag"],["Pampanga","Kapampangan","pam"],["Papiamento","Papiamentu","pap"],["Picard","Picard","pcd"],["Pennsylvania German","Deitsch","pdc"],["Palatine German","Pälzisch","pfl"],["Pali","पालि","pi"],["Norfuk / Pitkern","Norfuk / Pitkern","pih"],["Polish","polski","pl"],["Piedmontese","Piemontèis","pms"],["Western Punjabi","پنجابی","pnb"],["Pontic","Ποντιακά","pnt"],["Pashto","پښتو","ps"],["Portuguese","português","pt"],["Quechua","Runa Simi","qu"],["Romansh","rumantsch","rm"],["Romani","Romani","rmy"],["Rundi","Kirundi","rn"],["Romanian","română","ro"],["Aromanian","armãneashti","roa-rup"],["tarandíne","tarandíne","roa-tara"],["Russian","русский","ru"],["Rusyn","русиньскый","rue"],["Kinyarwanda","Kinyarwanda","rw"],["Sanskrit","संस्कृतम्","sa"],["Sakha","саха тыла","sah"],["Sardinian","sardu","sc"],["Sicilian","sicilianu","scn"],["Scots","Scots","sco"],["Sindhi","سنڌي","sd"],["Northern Sami","sámegiella","se"],["Sango","Sängö","sg"],["Serbo-Croatian","srpskohrvatski / српскохрватски","sh"],["Sinhala","සිංහල","si"],["Simple English","Simple English","simple"],["Slovak","slovenčina","sk"],["Slovenian","slovenščina","sl"],["Samoan","Gagana Samoa","sm"],["Shona","chiShona","sn"],["Somali","Soomaaliga","so"],["Albanian","shqip","sq"],["Serbian","српски / srpski","sr"],["Sranan Tongo","Sranantongo","srn"],["Swati","SiSwati","ss"],["Southern Sotho","Sesotho","st"],["Saterland Frisian","Seeltersk","stq"],["Sundanese","Basa Sunda","su"],["Swedish","svenska","sv"],["Swahili","Kiswahili","sw"],["Silesian","ślůnski","szl"],["Tamil","தமிழ்","ta"],["Tulu","ತುಳು","tcy"],["Telugu","తెలుగు","te"],["Tetum","tetun","tet"],["Tajik","тоҷикӣ","tg"],["Thai","ไทย","th"],["Tigrinya","ትግርኛ","ti"],["Turkmen","Türkmençe","tk"],["Tagalog","Tagalog","tl"],["Tswana","Setswana","tn"],["Tongan","lea faka-Tonga","to"],["Tok Pisin","Tok Pisin","tpi"],["Turkish","Türkçe","tr"],["Tsonga","Xitsonga","ts"],["Tatar","татарча/tatarça","tt"],["Tumbuka","chiTumbuka","tum"],["Twi","Twi","tw"],["Tahitian","reo tahiti","ty"],["Tuvinian","тыва дыл","tyv"],["Udmurt","удмурт","udm"],["Uyghur","ئۇيغۇرچە / Uyghurche","ug"],["Ukrainian","українська","uk"],["Urdu","اردو","ur"],["Uzbek","oʻzbekcha/ўзбекча","uz"],["Venda","Tshivenda","ve"],["Venetian","vèneto","vec"],["Veps","vepsän kel’","vep"],["Vietnamese","Tiếng Việt","vi"],["West Flemish","West-Vlams","vls"],["Volapük","Volapük","vo"],["Walloon","walon","wa"],["Waray","Winaray","war"],["Wolof","Wolof","wo"],["Wu Chinese","吴语","wuu"],["Kalmyk","хальмг","xal"],["Xhosa","isiXhosa","xh"],["Mingrelian","მარგალური","xmf"],["Yiddish","ייִדיש","yi"],["Yoruba","Yorùbá","yo"],["Zhuang","Vahcuengh","za"],["Zeelandic","Zeêuws","zea"],["Chinese","中文","zh"],["Classical Chinese","文言","zh-classical"],["Chinese (Min Nan)","Bân-lâm-gú","zh-min-nan"],["Cantonese","粵語","zh-yue"],["Zulu","isiZulu","zu"]];
24639
24640         var wikipedia$1 = /*#__PURE__*/Object.freeze({
24641                 'default': wikipedia
24642         });
24643
24644         var wikisource = [["Arabic","العربية","ar"],["Assamese","অসমীয়া","as"],["Azerbaijani","azərbaycanca","az"],["Belarusian","беларуская","be"],["Bulgarian","български","bg"],["Bangla","বাংলা","bn"],["Breton","brezhoneg","br"],["Bosnian","bosanski","bs"],["Catalan","català","ca"],["Czech","čeština","cs"],["Welsh","Cymraeg","cy"],["Danish","dansk","da"],["German","Deutsch","de"],["Greek","Ελληνικά","el"],["English","English","en"],["Esperanto","Esperanto","eo"],["Spanish","español","es"],["Estonian","eesti","et"],["Persian","فارسی","fa"],["Finnish","suomi","fi"],["Faroese","føroyskt","fo"],["French","français","fr"],["Galician","galego","gl"],["Gujarati","ગુજરાતી","gu"],["Hebrew","עברית","he"],["Croatian","hrvatski","hr"],["Hungarian","magyar","hu"],["Armenian","Հայերեն","hy"],["Indonesian","Bahasa Indonesia","id"],["Icelandic","íslenska","is"],["Italian","italiano","it"],["Japanese","日本語","ja"],["Kannada","ಕನ್ನಡ","kn"],["Korean","한국어","ko"],["Latin","Latina","la"],["Limburgish","Limburgs","li"],["Lithuanian","lietuvių","lt"],["Macedonian","македонски","mk"],["Malayalam","മലയാളം","ml"],["Marathi","मराठी","mr"],["Dutch","Nederlands","nl"],["Norwegian","norsk bokmål","no"],["Odia","ଓଡ଼ିଆ","or"],["Punjabi","ਪੰਜਾਬੀ","pa"],["Polish","polski","pl"],["Portuguese","português","pt"],["Romanian","română","ro"],["Russian","русский","ru"],["Sanskrit","संस्कृतम्","sa"],["Sakha","саха тыла","sah"],["Slovak","slovenčina","sk"],["Slovenian","slovenščina","sl"],["Serbian","српски / srpski","sr"],["Swedish","svenska","sv"],["Tamil","தமிழ்","ta"],["Telugu","తెలుగు","te"],["Thai","ไทย","th"],["Turkish","Türkçe","tr"],["Ukrainian","українська","uk"],["Venetian","vèneto","vec"],["Vietnamese","Tiếng Việt","vi"],["Yiddish","ייִדיש","yi"],["Chinese","中文","zh"],["Chinese (Min Nan)","Bân-lâm-gú","zh-min-nan"]];
24645
24646         var wikisource$1 = /*#__PURE__*/Object.freeze({
24647                 'default': wikisource
24648         });
24649
24650         getCjsExportFromNamespace(wikibooks$1);
24651
24652         getCjsExportFromNamespace(wikinews$1);
24653
24654         getCjsExportFromNamespace(wikiquote$1);
24655
24656         getCjsExportFromNamespace(wikiversity$1);
24657
24658         getCjsExportFromNamespace(wikivoyage$1);
24659
24660         getCjsExportFromNamespace(wiktionary$1);
24661
24662         var require$$6 = getCjsExportFromNamespace(wikipedia$1);
24663
24664         getCjsExportFromNamespace(wikisource$1);
24665
24666         var wikipedia$2 = require$$6;
24667
24668         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"]]}];
24669
24670         var dataDeprecated = [{old:{aerialway:"canopy"},replace:{aerialway:"zip_line"}},{old:{aeroway:"aerobridge"},replace:{aeroway:"jet_bridge"}},{old:{amenity:"advertising"},replace:{advertising:"*"}},{old:{amenity:"artwork"},replace:{tourism:"artwork"}},{old:{amenity:"bail_bonds"},replace:{office:"bail_bond_agent"}},{old:{amenity:"car_repair"},replace:{shop:"car_repair"}},{old:{amenity:"citymap_post"},replace:{tourism:"information"}},{old:{amenity:"club"},replace:{club:"*"}},{old:{amenity:"community_center"},replace:{amenity:"community_centre"}},{old:{amenity:"dancing_school"},replace:{leisure:"dance","dance:teaching":"yes"}},{old:{amenity:"dog_bin"},replace:{amenity:"waste_basket",waste:"dog_excrement"}},{old:{amenity:"dog_waste_bin"},replace:{amenity:"waste_basket",waste:"dog_excrement"}},{old:{amenity:"embassy"},replace:{office:"diplomatic"}},{old:{amenity:"ev_charging"},replace:{amenity:"charging_station"}},{old:{amenity:"fire_hydrant"},replace:{emergency:"fire_hydrant"}},{old:{amenity:"firepit"},replace:{leisure:"firepit"}},{old:{amenity:"garage"},replace:{landuse:"garages"}},{old:{amenity:"garages"},replace:{landuse:"garages"}},{old:{amenity:"gym"},replace:{leisure:"fitness_centre"}},{old:{amenity:"hotel"},replace:{tourism:"hotel"}},{old:{amenity:"kiosk"},replace:{shop:"kiosk"}},{old:{amenity:"nursery"},replace:{amenity:"kindergarten"}},{old:{amenity:"preschool"},replace:{amenity:"kindergarten"}},{old:{amenity:"public_building"},replace:{building:"public"}},{old:{amenity:"real_estate"},replace:{office:"estate_agent"}},{old:{amenity:"register_office"},replace:{office:"government",government:"register_office"}},{old:{amenity:"sauna"},replace:{leisure:"sauna"}},{old:{amenity:"scrapyard"},replace:{landuse:"industrial",industrial:"scrap_yard"}},{old:{amenity:"shop"},replace:{shop:"*"}},{old:{amenity:"sloped_curb"},replace:{kerb:"lowered"}},{old:{amenity:"social_club"},replace:{club:"*"}},{old:{amenity:"swimming_pool"},replace:{leisure:"swimming_pool"}},{old:{amenity:"ticket_booth"},replace:{shop:"ticket"}},{old:{amenity:"toilet"},replace:{amenity:"toilets"}},{old:{amenity:"vending_machine",vending:"news_papers"},replace:{amenity:"vending_machine",vending:"newspapers"}},{old:{amenity:"winery"},replace:{craft:"winery"}},{old:{amenity:"youth_center"},replace:{amenity:"community_centre","community_centre:for":"juvenile"}},{old:{amenity:"youth_centre"},replace:{amenity:"community_centre","community_centre:for":"juvenile"}},{old:{artwork:"*"},replace:{artwork_type:"$1"}},{old:{"artwork:type":"*"},replace:{artwork_type:"$1"}},{old:{attraction:"ferris_wheel"},replace:{attraction:"big_wheel"}},{old:{barrier:"curb"},replace:{barrier:"kerb"}},{old:{barrier:"embankment"},replace:{man_made:"embankment"}},{old:{barrier:"wire_fence"},replace:{barrier:"fence",fence_type:"wire"}},{old:{barrier:"wood_fence"},replace:{barrier:"fence",fence_type:"wood"}},{old:{building:"entrance"},replace:{entrance:"*"}},{old:{building:"family_house"},replace:{building:"house"}},{old:{building:"home"},replace:{building:"house"}},{old:{building:"household"},replace:{building:"house"}},{old:{"building:color":"*"},replace:{"building:colour":"$1"}},{old:{"building:roof:colour":"*"},replace:{"roof:colour":"$1"}},{old:{"building:type":"*"},replace:{building:"$1"}},{old:{camp_site:"camp_pitch"},replace:{tourism:"camp_pitch"}},{old:{color:"*"},replace:{colour:"$1"}},{old:{craft:"glass"},replace:{craft:"glaziery"}},{old:{craft:"catering"},replace:{craft:"caterer"}},{old:{craft:"sculpter"},replace:{craft:"sculptor"}},{old:{crossing:"zebra"},replace:{crossing:"marked"}},{old:{cuisine:"gluten-free"},replace:{"diet:gluten_free":"*"}},{old:{cuisine:"halal"},replace:{"diet:halal":"*"}},{old:{cuisine:"kosher"},replace:{"diet:kosher":"*"}},{old:{cuisine:"vegan"},replace:{"diet:vegan":"*"}},{old:{cuisine:"vegetarian"},replace:{"diet:vegetarian":"*"}},{old:{curb:"*"},replace:{kerb:"$1"}},{old:{drinkable:"*"},replace:{drinking_water:"$1"}},{old:{dropped_kerb:"*"},replace:{kerb:"lowered"}},{old:{escalator:"*"},replace:{highway:"steps",conveying:"$1"}},{old:{fee:"0"},replace:{fee:"no"}},{old:{fee:"free"},replace:{fee:"no"}},{old:{fee:"Free"},replace:{fee:"no"}},{old:{fee:"No"},replace:{fee:"no"}},{old:{fee:"none"},replace:{fee:"no"}},{old:{fee:"some"},replace:{fee:"yes"}},{old:{fee:"Yes"},replace:{fee:"yes"}},{old:{fenced:"yes"},replace:{barrier:"fence"}},{old:{FIXME:"*"},replace:{fixme:"$1"}},{old:{footway:"both"},replace:{sidewalk:"both"}},{old:{footway:"crossing",highway:"cycleway"},replace:{cycleway:"crossing",highway:"cycleway"}},{old:{footway:"left"},replace:{sidewalk:"left"}},{old:{footway:"no"},replace:{sidewalk:"no"}},{old:{footway:"none"},replace:{sidewalk:"no"}},{old:{footway:"right"},replace:{sidewalk:"right"}},{old:{footway:"separate"},replace:{sidewalk:"separate"}},{old:{"generator:source":"photovoltaic"},replace:{"generator:source":"solar","generator:method":"photovoltaic"}},{old:{highway:"abandoned"},replace:{"abandoned:highway":"*"}},{old:{highway:"bridleway",horse:"no"},replace:{highway:"path",horse:"no"}},{old:{highway:"cycleway",bicycle:"no"},replace:{highway:"path",bicycle:"no"}},{old:{highway:"footway",foot:"no"},replace:{highway:"path",foot:"no"}},{old:{highway:"ford"},replace:{ford:"*"}},{old:{highway:"no"}},{old:{highway:"platform"},replace:{bus:"yes",public_transport:"platform"}},{old:{highway:"stile"},replace:{barrier:"stile"}},{old:{highway:"unsurfaced"},replace:{highway:"road",surface:"unpaved"}},{old:{internet_access:"public"},replace:{internet_access:"yes","internet_access:fee":"no"}},{old:{internet_access:"wifi"},replace:{internet_access:"wlan"}},{old:{"internet_access:fee":"0"},replace:{"internet_access:fee":"no"}},{old:{"internet_access:fee":"free"},replace:{"internet_access:fee":"no"}},{old:{"internet_access:fee":"Free"},replace:{"internet_access:fee":"no"}},{old:{"internet_access:fee":"No"},replace:{"internet_access:fee":"no"}},{old:{"internet_access:name":"*"},replace:{"internet_access:ssid":"$1"}},{old:{"internet_access:type":"*"},replace:{internet_access:"$1"}},{old:{kerb:"dropped"},replace:{kerb:"lowered"}},{old:{kerb:"flat"},replace:{kerb:"flush"}},{old:{landuse:"basin"},replace:{natural:"water",water:"basin"}},{old:{landuse:"conservation"},replace:{boundary:"protected_area"}},{old:{landuse:"farm"},replace:{landuse:"farmland"}},{old:{landuse:"field"},replace:{landuse:"farmland"}},{old:{landuse:"pond"},replace:{natural:"water",water:"pond"}},{old:{landuse:"port"},replace:{landuse:"industrial",industrial:"port"}},{old:{landuse:"reservoir"},replace:{natural:"water",water:"reservoir"}},{old:{landuse:"wood"},replace:{natural:"wood"}},{old:{lawyer:"notary"},replace:{office:"notary"}},{old:{leisure:"beach"},replace:{natural:"beach"}},{old:{leisure:"club"},replace:{club:"*"}},{old:{leisure:"ice_rink",sport:"hockey"},replace:{leisure:"ice_rink",sport:"ice_hockey"}},{old:{leisure:"ice_rink",sport:"skating"},replace:{leisure:"ice_rink",sport:"ice_skating"}},{old:{leisure:"social_club"},replace:{club:"*"}},{old:{leisure:"video_arcade"},replace:{leisure:"amusement_arcade"}},{old:{leisure:"recreation_ground"},replace:{landuse:"recreation_ground"}},{old:{man_made:"cut_line"},replace:{man_made:"cutline"}},{old:{man_made:"jetty"},replace:{highway:"footway",man_made:"pier"}},{old:{man_made:"mdf"},replace:{telecom:"exchange"}},{old:{man_made:"MDF"},replace:{telecom:"exchange"}},{old:{man_made:"fuel_storage_tank"},replace:{man_made:"storage_tank",content:"fuel"}},{old:{man_made:"oil_tank"},replace:{man_made:"storage_tank",content:"oil"}},{old:{man_made:"wastewater_tank"},replace:{man_made:"storage_tank",content:"wastewater"}},{old:{man_made:"water_tank"},replace:{man_made:"storage_tank",content:"water"}},{old:{man_made:"well"},replace:{man_made:"water_well"}},{old:{man_made:"winery"},replace:{craft:"winery"}},{old:{memorial:"plate"},replace:{memorial:"plaque"}},{old:{mining_resource:"*"},replace:{resource:"$1"}},{old:{natural:"marsh"},replace:{natural:"wetland",wetland:"marsh"}},{old:{natural:"waterfall"},replace:{waterway:"waterfall"}},{old:{NOTE:"*"},replace:{note:"$1"}},{old:{nosquare:"*"},replace:{nonsquare:"$1"}},{old:{office:"administrative"},replace:{office:"government"}},{old:{office:"real_estate"},replace:{office:"estate_agent"}},{old:{oneway:"1"},replace:{oneway:"yes"}},{old:{oneway:"alternate"},replace:{oneway:"alternating"}},{old:{oneway:"no;yes"}},{old:{oneway:"unknown"}},{old:{place_name:"*"},replace:{name:"$1"}},{old:{pole:"transition"},replace:{"location:transition":"yes"}},{old:{postcode:"*"},replace:{"addr:postcode":"$1"}},{old:{power:"busbar"},replace:{power:"line",line:"busbar"}},{old:{power:"line",location:"underground"},replace:{power:"cable",location:"underground"}},{old:{power:"sub_station"},replace:{power:"substation"}},{old:{power:"substation",location:"kiosk"},replace:{power:"substation",man_made:"street_cabinet",street_cabinet:"power"}},{old:{power:"underground_cable"},replace:{power:"cable",location:"underground"}},{old:{power_source:"*"},replace:{"generator:source":"$1"}},{old:{power_rating:"*"},replace:{"generator:output":"$1"}},{old:{recommended_speed:"*"},replace:{"maxspeed:advisory":"$1"}},{old:{"recommended_speed:backward":"*"},replace:{"maxspeed:advisory:backward":"$1"}},{old:{"recommended_speed:forward":"*"},replace:{"maxspeed:advisory:forward":"$1"}},{old:{religion:"catholic"},replace:{religion:"christian",denomination:"catholic"}},{old:{reservations:"*"},replace:{reservation:"$1"}},{old:{"roof:color":"*"},replace:{"roof:colour":"$1"}},{old:{route:"ncn"},replace:{route:"bicycle",network:"ncn"}},{old:{shop:"adult"},replace:{shop:"erotic"}},{old:{shop:"antique"},replace:{shop:"antiques"}},{old:{shop:"army_surplus"},replace:{shop:"military_surplus"}},{old:{shop:"auto_parts"},replace:{shop:"car_parts"}},{old:{shop:"baby"},replace:{shop:"baby_goods"}},{old:{shop:"baby_care"},replace:{shop:"baby_goods"}},{old:{shop:"bags"},replace:{shop:"bag"}},{old:{shop:"bail_bond"},replace:{office:"bail_bond_agent"}},{old:{shop:"bail_bonds"},replace:{office:"bail_bond_agent"}},{old:{shop:"betting"},replace:{shop:"bookmaker"}},{old:{shop:"boutique"},replace:{shop:"clothes"}},{old:{shop:"cafe"},replace:{amenity:"cafe"}},{old:{shop:"dive"},replace:{shop:"scuba_diving"}},{old:{shop:"fashion"},replace:{shop:"clothes"}},{old:{shop:"fish"},replace:{shop:"seafood"}},{old:{shop:"fishmonger"},replace:{shop:"seafood"}},{old:{shop:"furnace"},replace:{shop:"fireplace"}},{old:{shop:"gallery"},replace:{shop:"art"}},{old:{shop:"jewellery"},replace:{shop:"jewelry"}},{old:{shop:"lingerie"},replace:{shop:"clothes",clothes:"underwear"}},{old:{shop:"luggage"},replace:{shop:"bag"}},{old:{shop:"money_transfer"},replace:{amenity:"money_transfer"}},{old:{shop:"moneylender"},replace:{shop:"money_lender"}},{old:{shop:"organic"},replace:{shop:"supermarket",organic:"only"}},{old:{shop:"perfume"},replace:{shop:"perfumery"}},{old:{shop:"real_estate"},replace:{office:"estate_agent"}},{old:{shop:"tickets"},replace:{shop:"ticket"}},{old:{shop:"underwear"},replace:{shop:"clothes",clothes:"underwear"}},{old:{shop:"winery"},replace:{craft:"winery"}},{old:{sloped_curb:"0"},replace:{kerb:"flush"}},{old:{sloped_curb:"0.00"},replace:{kerb:"flush"}},{old:{sloped_curb:"0.01"},replace:{kerb:"lowered","kerb:height":"1 cm"}},{old:{sloped_curb:"0.02"},replace:{kerb:"lowered","kerb:height":"2 cm"}},{old:{sloped_curb:"0.03"},replace:{kerb:"lowered","kerb:height":"3 cm"}},{old:{sloped_curb:"at_grade"},replace:{kerb:"flush"}},{old:{sloped_curb:"both"},replace:{kerb:"lowered"}},{old:{sloped_curb:"flush"},replace:{kerb:"flush"}},{old:{sloped_curb:"low"},replace:{kerb:"lowered"}},{old:{sloped_curb:"no"},replace:{kerb:"raised"}},{old:{sloped_curb:"yes"},replace:{kerb:"lowered"}},{old:{speed_limit:"*"},replace:{maxspeed:"$1"}},{old:{speedlimit:"*"},replace:{maxspeed:"$1"}},{old:{SpeedLimit:"*"},replace:{maxspeed:"$1"}},{old:{SPEEDLIMIT:"*"},replace:{maxspeed:"$1"}},{old:{sport:"horse_shoes"},replace:{sport:"horseshoes"}},{old:{sport:"horseshoe"},replace:{sport:"horseshoes"}},{old:{sport:"shuffle_board"},replace:{sport:"shuffleboard"}},{old:{sustenance:"bar"},replace:{amenity:"bar"}},{old:{sustenance:"cafe"},replace:{amenity:"cafe"}},{old:{sustenance:"pub"},replace:{amenity:"pub"}},{old:{sustenance:"restaurant"},replace:{amenity:"restaurant"}},{old:{"theatre:type":"amphitheatre"},replace:{"theatre:type":"amphi"}},{old:{todo:"*"},replace:{fixme:"$1"}},{old:{TODO:"*"},replace:{fixme:"$1"}},{old:{"toilets:disposal":"longdrop"},replace:{"toilets:disposal":"pitlatrine"}},{old:{"toilets:disposal":"pit_latrine"},replace:{"toilets:disposal":"pitlatrine"}},{old:{tourism:"bed_and_breakfast"},replace:{tourism:"guest_house",guest_house:"bed_and_breakfast"}},{old:{type:"broad_leaved"},replace:{leaf_type:"broadleaved"}},{old:{type:"conifer"},replace:{leaf_type:"needleleaved"}},{old:{type:"deciduous"},replace:{leaf_cycle:"deciduous"}},{old:{unnamed:"*"},replace:{noname:"$1"}},{old:{water:"intermittent"},replace:{natural:"water",intermittent:"yes"}},{old:{water:"riverbank"},replace:{natural:"water",water:"river"}},{old:{water:"salt"},replace:{natural:"water",salt:"yes"}},{old:{water:"tidal"},replace:{natural:"water",tidal:"yes"}},{old:{waterway:"aqueduct"},replace:{waterway:"canal",bridge:"aqueduct"}},{old:{waterway:"lock"},replace:{waterway:"canal",lock:"yes"}},{old:{waterway:"riverbank"},replace:{natural:"water",water:"river"}},{old:{wifi:"yes"},replace:{internet_access:"wlan"}},{old:{wifi:"free"},replace:{internet_access:"wlan","internet_access:fee":"no"}},{old:{wood:"coniferous"},replace:{leaf_type:"needleleaved"}},{old:{wood:"deciduous"},replace:{leaf_cycle:"deciduous"}},{old:{wood:"evergreen"},replace:{leaf_cycle:"evergreen"}},{old:{wood:"mixed"},replace:{leaf_cycle:"mixed",leaf_type:"mixed"}}];
24671
24672         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,"osmarender:nameDirection":true,"osmarender:renderName":true,"osmarender:renderRef":true,"osmarender:rendernames":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};
24673
24674         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-AU":{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},pap:{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}};
24675
24676         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"};
24677
24678         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:["sidebar.key","`","²"],text:"shortcuts.browsing.display_options.sidebar"},{shortcuts:["area_fill.wireframe.key"],text:"shortcuts.browsing.display_options.wireframe"},{modifiers:["⌥"],shortcuts:["area_fill.wireframe.key"],text:"shortcuts.browsing.display_options.osm_data"},{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:["inspector.zoom_to.key"],text:"shortcuts.browsing.with_selected.zoom_to"},{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:["modes.add_feature.key"],text:"shortcuts.editing.drawing.focus_add_feature"},{shortcuts:["1","2","3"],text:"shortcuts.editing.drawing.add_favorite",separator:",",suffix:"…"},{shortcuts:["modes.add_note.key"],text:"shortcuts.editing.drawing.add_note"},{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.extract.key"],text:"shortcuts.editing.operations.extract"},{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.straighten.key"],text:"shortcuts.editing.operations.straighten"},{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"}]}]}];
24679
24680         var type$1 = "FeatureCollection";
24681         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]]]}}];
24682         var dataImperial = {
24683         type: type$1,
24684         features: features
24685         };
24686
24687         var type$2 = "FeatureCollection";
24688         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]]]}}];
24689         var dataDriveLeft = {
24690         type: type$2,
24691         features: features$1
24692         };
24693
24694         var en = {icons:{download:"download",information:"info",remove:"remove",undo:"undo",zoom_to:"zoom to",copy:"copy",open_wikidata:"open on wikidata.org",favorite:"favorite"},toolbar:{inspect:"Inspect",undo_redo:"Undo / Redo",recent:"Recent",favorites:"Favorites",add_feature:"Add Feature"},modes:{add_feature:{title:"Add a feature",description:"Search for features to add to the map.",key:"Tab",result:"{count} result",results:"{count} results"},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.",filter_tooltip:"areas"},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.",filter_tooltip:"lines"},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.",filter_tooltip:"points"},add_note:{title:"Note",label:"Add Note",description:"Spotted an issue? Let other mappers know.",tail:"Click on the map to add a note.",key:"N"},add_preset:{title:"Add {feature}",point:{title:"Add {feature} as a point"},line:{title:"Add {feature} as a line"},area:{title:"Add {feature} as an area"},building:{title:"Add {feature} as a building"}},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.",note:"Added a note."}},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.",not_downloaded:"This can't be made circular because parts of it have not yet been downloaded."},orthogonalize:{title:"Square",description:{vertex:"Square this corner.",line:"Square the corners of this line.",area:"Square the corners of this area."},key:"Q",annotation:{vertex:"Squared a single corner.",line:"Squared the corners of a line.",area:"Squared the corners of an area."},end_vertex:"This can't be squared because it is an end node.",square_enough:"This can't be made more square than it already is.",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.",not_downloaded:"This can't be made square because parts of it have not yet been downloaded."},straighten:{title:"Straighten",description:{points:"Straighten these points.",line:"Straighten this line."},key:"S",annotation:{points:"Straightened several points.",line:"Straightened a line."},too_bendy:"This can't be straightened because it bends too much.",connected_to_hidden:"This can't be straightened because it is connected to a hidden feature.",not_downloaded:"This can't be straightened because parts of it have not yet been downloaded."},"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."},not_downloaded:{single:"This feature can't be deleted because parts of it have not yet been downloaded.",multiple:"These features can't be deleted because parts of them have not yet been downloaded."},has_wikidata_tag:{single:"This feature can't be deleted because it has a Wikidata tag.",multiple:"These features can't be deleted because some have Wikidata tags."}},downgrade:{title:"Downgrade",description:{building_address:"Remove all non-address and non-building tags.",building:"Remove all non-building tags.",address:"Remove all non-address tags."},annotation:{building:{single:"Downgraded a feature to a basic building.",multiple:"Downgraded {n} features to basic buildings."},address:{single:"Downgraded a feature to an address.",multiple:"Downgraded {n} features to addresses."},multiple:"Downgraded {n} features."},has_wikidata_tag:{single:"This feature can't be downgraded because it has a Wikidata tag.",multiple:"These features can't be downgraded because some have Wikidata tags."}},add_member:{annotation:"Added a member to a relation."},delete_member:{annotation:"Removed a member from a relation."},reorder_members:{annotation:"Reordered a relation's members."},connect:{annotation:{from_vertex:{to_point:"Connected a way to a point.",to_vertex:"Connected a way to another.",to_line:"Connected a way to a line.",to_area:"Connected a way to an area.",to_adjacent_vertex:"Merged adjacent points in a way.",to_sibling_vertex:"Connected a way to itself."},from_point:{to_point:"Merged a point with another.",to_vertex:"Merged a point with a point in a way.",to_line:"Moved a point to a line.",to_area:"Moved a point 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.",line:{description:"Disconnect this line from other features."},area:{description:"Disconnect this area from other features."},key:"D",annotation:"Disconnected lines/areas.",too_large:{single:"This can't be disconnected because not enough of it is currently visible."},not_connected:"There aren't enough lines/areas here to disconnect.",not_downloaded:"This can't be disconnected because parts of it have not yet been downloaded.",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.",paths_intersect:"These features can't be merged because the resulting path would intersect itself."},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."},not_downloaded:{single:"This feature can't be moved because parts of it have not yet been downloaded.",multiple:"These features can't be moved because parts of them have not yet been downloaded."}},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."},not_downloaded:{single:"This feature can't be reflected because parts of it have not yet been downloaded.",multiple:"These features can't be reflected because parts of them have not yet been downloaded."}},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."},not_downloaded:{single:"This feature can't be rotated because parts of it have not yet been downloaded.",multiple:"These features can't be rotated because parts of them have not yet been downloaded."}},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"}},extract:{title:"Extract",key:"E",description:{vertex:{single:"Extract this point from its parent lines/areas."},area:{single:"Extract a point from this area."}},annotation:{single:"Extracted a point."},too_large:{area:{single:"A point can't be extracted from this area because not enough of it is currently visible."}},restriction:{vertex:{single:"This point can't be extracted because it would damage a \"{relation}\" relation."}},connected_to_hidden:{vertex:{single:"This point can't be extracted because it is connected to a hidden feature."}}}},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:"Log In",logout:"Log Out",loading_auth:"Connecting to OpenStreetMap...",report_a_bug:"Report a bug",help_translate:"Help translate",sidebar:{key:"`",tooltip:"Toggle the sidebar."},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",errors:"Errors",warnings:"Warnings",modified:"Modified",deleted:"Deleted",created:"Created",outstanding_errors_message:"Please resolve all errors first. {count} remaining.",comment_needed_message:"Please add a changeset comment first.",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",note_no_history:"No History (New Note)",note_comments:"Comments",note_created_date:"Created Date",note_created_user:"Created By",note_link_text:"Note 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",note:"note"},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:{zoom_to:{key:"Z",title:"Zoom to this",tooltip_feature:"Center and zoom the map to focus on this feature.",tooltip_note:"Center and zoom the map to focus on this note.",tooltip_data:"Center and zoom the map to focus on this data.",tooltip_issue:"Center and zoom the map to focus on this issue."},show_more:"Show More",view_on_osm:"View on openstreetmap.org",view_on_keepRight:"View on keepright.at",all_fields:"All fields",all_tags:"All tags",all_members:"All members",all_relations:"All relations",add_to_relation:"Add to a relation",new_relation:"New relation...",choose_relation:"Choose a parent relation",role:"Role",choose:"Select feature type",results:"{n} results for {search}",no_documentation_key:"There is no documentation available.",edit_reference:"edit/translate",wiki_reference:"View documentation",wiki_en_reference:"View documentation in English",hidden_preset:{manual:"{features} are hidden. Enable them in the Map Data pane.",zoom:"{features} are hidden. Zoom in to enable them."},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:",lock:{suggestion:"The \"{label}\" field is locked because there is a Wikidata tag. You can delete it or edit the tags in the \"All tags\" section."}},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",overlays:"Overlays",imagery_source_faq:"Imagery Info / Report a Problem",reset:"reset",reset_all:"Reset All",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"},notes:{tooltip:"Note data from OpenStreetMap",title:"OpenStreetMap notes"},keepRight:{tooltip:"Automatically detected map issues from keepright.at",title:"KeepRight Issues"},improveOSM:{tooltip:"Missing data automatically detected by improveosm.org",title:"ImproveOSM Issues"},custom:{tooltip:"Drag and drop a data file onto the page, or click the button to setup",title:"Custom Map Data",zoom:"Zoom to 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."},photo_overlays:{title:"Photo Overlays",traffic_signs:{title:"Traffic Signs"},photo_type:{flat:{title:"Flat Photos",tooltip:"Traditional photos"},panoramic:{title:"Panoramic Photos",tooltip:"360° photos"}}},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."},building_parts:{description:"Building Parts",tooltip:"3D Building and Roof Components"},indoor:{description:"Indoor Features",tooltip:"Rooms, Corridors, Stairwells, 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"},pistes:{description:"Pistes",tooltip:"Ski Slopes, Sled Runs, Ice Skating Trails, etc."},aerialways:{description:"Aerial Features",tooltip:"Chair Lifts, Gondolas, Zip Lines, etc."},power:{description:"Power Features",tooltip:"Power Lines, Power Plants, Substations, etc."},past_future:{description:"Past/Future Features",tooltip:"Proposed, Construction, Abandoned, Demolished, etc."},others:{description:"Other Features",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."}},settings:{custom_background:{tooltip:"Edit custom background",header:"Custom Background Settings",instructions:"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}",template:{placeholder:"Enter a url template"}},custom_data:{tooltip:"Edit custom data layer",header:"Custom Map Data Settings",file:{instructions:"Choose a local data file. Supported types are:\n   .gpx, .kml, .geojson, .json",label:"Browse files"},or:"Or",url:{instructions:"Enter a data file URL or vector tile URL template. Valid tokens are:\n   {zoom} or {z}, {x}, {y} for Z/X/Y tile scheme",placeholder:"Enter a url"}}},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}.",thank_you_where:{format:"{place}{separator}{region}",separator:", "},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}"},zoom:{"in":"Zoom in",out:"Zoom out"},cannot_zoom:"Cannot zoom out further in current mode.",full_screen:"Toggle Full Screen",QA:{improveOSM:{title:"ImproveOSM Detection",geometry_types:{path:"paths",parking:"parking",road:"roads",both:"roads and parking"},directions:{east:"east",north:"north",northeast:"northeast",northwest:"northwest",south:"south",southeast:"southeast",southwest:"southwest",west:"west"},error_types:{ow:{title:"Missing One-way",description:"Along this section of {highway}, {percentage}% of {num_trips} recorded trips travel from {from_node} to {to_node}. There may be missing a \"oneway\" tag."},mr:{title:"Missing Geometry",description:"{num_trips} recorded trips in this area suggest there may be unmapped {geometry_type} here.",description_alt:"Data from a 3rd party suggests there may be unmapped {geometry_type} here."},tr:{title:"Missing Turn Restriction",description:"{num_passed} of {num_trips} recorded trips (travelling {travel_direction}) make a turn from {from_way} to {to_way} at {junction}. There may be a missing \"{turn_restriction}\" restriction."}}},keepRight:{title:"KeepRight Error",detail_title:"Error",detail_description:"Description",comment:"Comment",comment_placeholder:"Enter a comment to share with other users.",close:"Close (Error Fixed)",ignore:"Ignore (Not an Error)",save_comment:"Save Comment",close_comment:"Close and Comment",ignore_comment:"Ignore and Comment",error_parts:{this_node:"this node",this_way:"this way",this_relation:"this relation",this_oneway:"this oneway",this_highway:"this highway",this_railway:"this railway",this_waterway:"this waterway",this_cycleway:"this cycleway",this_cycleway_footpath:"this cycleway/footpath",this_riverbank:"this riverbank",this_crossing:"this crossing",this_railway_crossing:"this railway crossing",this_bridge:"this bridge",this_tunnel:"this tunnel",this_boundary:"this boundary",this_turn_restriction:"this turn restriction",this_roundabout:"this roundabout",this_mini_roundabout:"this mini-roundabout",this_track:"this track",this_feature:"this feature",highway:"highway",railway:"railway",waterway:"waterway",cycleway:"cycleway",cycleway_footpath:"cycleway/footpath",riverbank:"riverbank",place_of_worship:"place of worship",pub:"pub",restaurant:"restaurant",school:"school",university:"university",hospital:"hospital",library:"library",theatre:"theatre",courthouse:"courthouse",bank:"bank",cinema:"cinema",pharmacy:"pharmacy",cafe:"cafe",fast_food:"fast food",fuel:"fuel",from:"from",to:"to",left_hand:"left-hand",right_hand:"right-hand"},errorTypes:{"20":{title:"Multiple nodes on the same spot",description:"There is more than one node in this spot. Node IDs: {var1}."},"30":{title:"Non-closed area",description:"{var1} is tagged with \"{var2}\" and should be a closed loop."},"40":{title:"Impossible oneway",description:"The first node {var1} of {var2} is not connected to any other way."},"41":{description:"The last node {var1} of {var2} is not connected to any other way."},"42":{description:"You cannot reach {var1} because all ways leading from it are oneway."},"43":{description:"You cannot escape from {var1} because all ways leading to it are oneway."},"50":{title:"Almost junction",description:"{var1} is very close but not connected to way {var2}."},"60":{title:"Deprecated tag",description:"{var1} uses deprecated tag \"{var2}\". Please use \"{var3}\" instead."},"70":{title:"Missing tag",description:"{var1} has an empty tag: \"{var2}\"."},"71":{description:"{var1} has no tags."},"72":{description:"{var1} is not member of any way and doesn't have any tags."},"73":{description:"{var1} has a \"{var2}\" tag but no \"highway\" tag."},"74":{description:"{var1} has an empty tag: \"{var2}\"."},"75":{description:"{var1} has a name \"{var2}\" but no other tags."},"90":{title:"Motorway without ref tag",description:"{var1} is tagged as a motorway and therefore needs a \"ref\", \"nat_ref\", or \"int_ref\" tag."},"100":{title:"Place of worship without religion",description:"{var1} is tagged as a place of worship and therefore needs a religion tag."},"110":{title:"Point of interest without name",description:"{var1} is tagged as a \"{var2}\" and therefore needs a name tag."},"120":{title:"Way without nodes",description:"{var1} has just one single node."},"130":{title:"Disconnected way",description:"{var1} is not connected to the rest of the map."},"150":{title:"Railway crossing without tag",description:"{var1} of a highway and a railway needs to be tagged as \"railway=crossing\" or \"railway=level_crossing\"."},"160":{title:"Railway layer conflict",description:"There are ways in different layers (e.g. tunnel or bridge) meeting at {var1}."},"170":{title:"FIXME tagged item",description:"{var1} has a FIXME tag: {var2}"},"180":{title:"Relation without type",description:"{var1} is missing a \"type\" tag."},"190":{title:"Intersection without junction",description:"{var1} intersects the {var2} {var3} but there is no junction node, bridge, or tunnel."},"200":{title:"Overlapping ways",description:"{var1} overlaps the {var2} {var3}."},"210":{title:"Self-intersecting way",description:"There is an unspecified issue with self intersecting ways."},"211":{description:"{var1} contains more than one node multiple times. Nodes are {var2}. This may or may not be an error."},"212":{description:"{var1} has only two different nodes and contains one of them more than once."},"220":{title:"Misspelled tag",description:"{var1} is tagged \"{var2}\" where \"{var3}\" looks like \"{var4}\"."},"221":{description:"{var1} has a suspicious tag \"{var2}\"."},"230":{title:"Layer conflict",description:"{var1} is a junction of ways on different layers."},"231":{description:"{var1} is a junction of ways on different layers: {var2}.",layer:"(layer: {layer})"},"232":{description:"{var1} is tagged with \"layer={var2}\". This need not be an error but it looks strange."},"270":{title:"Unusual motorway connection",description:"{var1} is a junction of a motorway and a highway other than \"motorway\", \"motorway_link\", \"trunk\", \"rest_area\", or \"construction\". Connection to \"service\" or \"unclassified\" is only valid if it has \"access=no/private\", or it leads to a motorway service area, or if it is a \"service=parking_aisle\"."},"280":{title:"Boundary issue",description:"There is an unspecified issue with this boundary."},"281":{title:"Boundary missing name",description:"{var1} has no name."},"282":{title:"Boundary missing admin level",description:"The boundary of {var1} has no valid numeric admin_level. Please do not mix admin levels (e.g. \"6;7\"). Always tag the lowest admin_level of all boundaries."},"283":{title:"Boundary not a closed loop",description:"The boundary of {var1} is not a closed loop."},"284":{title:"Boundary is split",description:"The boundary of {var1} splits here."},"285":{title:"Boundary admin_level too high",description:"{var1} has \"admin_level={var2}\" but belongs to a relation with lower \"admin_level\" (e.g. higher priority); it should have the lowest \"admin_level\" of all relations."},"290":{title:"Restriction issue",description:"There is an unspecified issue with this restriction."},"291":{title:"Restriction missing type",description:"{var1} has an unrecognized restriction type."},"292":{title:"Restriction missing \"from\" way",description:"{var1} has {var2} \"from\" members, but it should have 1."},"293":{title:"Restriction missing \"to\" way",description:"{var1} has {var2} \"to\" members, but it should have 1."},"294":{title:"Restriction \"from\" or \"to\" is not a way",description:"{var1} has \"from\" or \"to\" members which should be ways. {var2}."},"295":{title:"Restriction \"via\" is not an endpoint",description:"{var1} has a \"via\" (node {var2}) which is not the first or the last member of \"{var3}\" (way {var4})."},"296":{title:"Unusual restriction angle",description:"{var1} has a restriction type \"{var2}\" but the angle is {var3} degrees. Maybe the restriction type is not appropriate?"},"297":{title:"Wrong direction of \"to\" way",description:"{var1} does not match the direction of \"to\" way {var2}."},"298":{title:"Redundant restriction - oneway",description:"{var1} may be redundant. Entry already prohibited by \"oneway\" tag on {var2}."},"300":{title:"Missing maxspeed",description:"{var1} is missing a \"maxspeed\" tag and is tagged as motorway, trunk, primary, or secondary."},"310":{title:"Roundabout issue",description:"There is an unspecified issue with this roundabout."},"311":{title:"Roundabout not closed loop",description:"{var1} is part of a roundabout but is not closed-loop. (Split carriageways approaching a roundabout should not be tagged as roundabout)."},"312":{title:"Roundabout wrong direction",description:"If {var1} is in a country with {var2} traffic then its orientation goes the wrong way around."},"313":{title:"Roundabout weakly connected",description:"{var1} has only {var2} other road(s) connected. Roundabouts typically have 3 or more."},"320":{title:"Improper link connection",description:"{var1} is tagged as \"{var2}\" but doesn't have a connection to any other \"{var3}\" or \"{var4}\"."},"350":{title:"Improper bridge tag",description:"{var1} doesn't have a tag in common with its surrounding ways that shows the purpose of this bridge. There should be one of these tags: {var2}."},"360":{title:"Missing local name tag",description:"It would be nice if {var1} had a local name tag \"name:XX={var2}\" where XX shows the language of its common name \"{var2}\"."},"370":{title:"Doubled places",description:"{var1} has tags in common with the surrounding way {var2} {var3} and seems to be redundant.",including_the_name:"(including the name {name})"},"380":{title:"Non-physical use of sport tag",description:"{var1} is tagged \"{var2}\" but has no physical tag (e.g. \"leisure\", \"building\", \"amenity\", or \"highway\")."},"390":{title:"Missing tracktype",description:"{var1} doesn't have a \"tracktype\" tag."},"400":{title:"Geometry issue",description:"There is an unspecified issue with the geometry here."},"401":{title:"Missing turn restriction",description:"Ways {var1} and {var2} join in a very sharp angle here and there is no oneway tag or turn restriction that prevents turning."},"402":{title:"Impossible angle",description:"{var1} bends in a very sharp angle here."},"410":{title:"Website issue",description:"There is an unspecified issue with a contact website or URL."},"411":{description:"{var1} may have an outdated URL: {var2} returned HTTP status code {var3}."},"412":{description:"{var1} may have an outdated URL: {var2} contained suspicious text \"{var3}\"."},"413":{description:"{var1} may have an outdated URL: {var2} did not contain keywords \"{var3}\"."}}}},streetside:{tooltip:"Streetside photos from Microsoft",title:"Bing Streetside",report:"Report a privacy concern with this image",view_on_bing:"View on Bing Maps",hires:"High resolution"},mapillary_images:{tooltip:"Street-level photos from Mapillary"},mapillary:{title:"Mapillary",signs:{tooltip:"Traffic signs from Mapillary"},view_on_mapillary:"View this image on Mapillary"},openstreetcam_images:{tooltip:"Street-level photos from OpenStreetCam"},openstreetcam:{title:"OpenStreetCam",view_on_openstreetcam:"View this image on OpenStreetCam"},note:{note:"Note",title:"Edit note",anonymous:"anonymous",closed:"(Closed)",commentTitle:"Comments",status:{opened:"opened {when}",reopened:"reopened {when}",commented:"commented {when}",closed:"closed {when}"},newComment:"New Comment",inputPlaceholder:"Enter a comment to share with other users.",close:"Close Note",open:"Reopen Note",comment:"Comment",close_comment:"Close and Comment",open_comment:"Reopen and Comment",report:"Report","new":"New Note",newDescription:"Describe the issue.",save:"Save Note",login:"You must log in to change or comment on this note.",upload_explanation:"Your comments will be publicly visible to all OpenStreetMap users.",upload_explanation_with_user:"Your comments as {user} will be publicly visible to all OpenStreetMap users."},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."},notes:{title:"Notes",intro:"*Notes* are used to alert other users that a feature requires fixing or attention. Notes mark a specific location on the map. To view existing notes or add new ones, click the {data} **Map data** panel to enable the OpenStreetMap notes layer.",add_note_h:"Adding Notes",add_note:"To add a new note, click the {note} **Note** button on the toolbar above the map, or press the shortcut key `4`. This will change the mouse cursor to a cross symbol. To place the new note on the map, position the mouse cursor where the note should go, then {leftclick} left-click or press `Space`.",move_note:"Only new notes can be moved. To move a note, place the mouse cursor over the new note, then press and hold the {leftclick} left mouse button while dragging the note to its new location.",update_note_h:"Closing, Reopening, and Commenting",update_note:"An existing note can be updated by closing it, reopening it, or adding a comment to it. Closing a note indicates that the problem has been resolved. Reopening a note indicates that the original issue is not resolved.",save_note_h:"Saving Notes",save_note:"You must save any note edits individually by clicking the buttons below the note comments. Note edits are **not** included in changesets that you upload to OpenStreetMap."},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 {leftclick} 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 [Bing Streetside](https://www.microsoft.com/en-us/maps/streetside), [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."},qa:{title:"Quality Assurance",intro:"*Quality Assurance* (Q/A) tools can find improper tags, disconnected roads, and other issues with OpenStreetMap, which mappers can then fix. To view existing Q/A issues, click the {data} **Map data** panel to enable a specific Q/A layer.",tools_h:"Tools",tools:"The following tools are currently supported: [KeepRight](https://www.keepright.at/) and [ImproveOSM](https://improveosm.org/en/). Expect iD to support [Osmose](https://osmose.openstreetmap.fr/) and more Q/A tools in the future.",issues_h:"Handling Issues",issues:"Handling Q/A issues is similar to handling notes. Click on a marker to view the issue details in the sidebar. Each tool has its own capabilities, but generally you can comment and/or close an issue."},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."}}}},issues:{title:"Issues",key:"I",list_title:"Issues ({count})",errors:{list_title:"Errors ({count})"},warnings:{list_title:"Warnings ({count})"},rules:{title:"Rules"},no_issues:{message:{everything:"Everything looks fine",everything_in_view:"Everything in view looks fine",edits:"Your edits look fine",edits_in_view:"Your edits in view look fine"},hidden_issues:{none:"Detected issues will appear here",elsewhere:"Issues elsewhere: {count}",other_features:"Issues with other features: {count}",other_features_elsewhere:"Issues elsewhere with other features: {count}",disabled_rules:"Issues with disabled rules: {count}",disabled_rules_elsewhere:"Issues elsewhere with disabled rules: {count}",ignored_issues:"Ignored issues: {count}",ignored_issues_elsewhere:"Ignored issues elsewhere: {count}"}},options:{what:{title:"Check:",edited:"My Edits",all:"Everything"},where:{title:"Where:",visible:"In View",all:"Everywhere"}},suggested:"Suggested updates:",enable_all:"Enable All",disable_all:"Disable All",reset_ignored:"Reset Ignored ({count})",fix_one:{title:"fix"},fix_all:{title:"Fix All",annotation:"Fixed several validation issues."},almost_junction:{title:"Almost Junctions",message:"{feature} is very close but not connected to {feature2}",tip:"Find features that should possibly be connected to other nearby features",self:{message:"{feature} ends very close to itself but does not reconnect"},"highway-highway":{reference:"Intersecting highways should share a junction vertex."}},close_nodes:{title:"Very Close Points",tip:"Find redundant and crowded points",message:"Two points in {way} are very close together",reference:"Redundant points in a way should be merged or moved apart.",detached:{message:"{feature} is too close to {feature2}",reference:"Separate points should not share a location."}},crossing_ways:{title:"Crossings Ways",message:"{feature} crosses {feature2}",tip:"Find features that incorrectly cross over one another","building-building":{reference:"Buildings should not intersect except on different layers."},"building-highway":{reference:"Highways crossing buildings should use bridges, tunnels, coverings, or entrances."},"building-railway":{reference:"Railways crossing buildings should use bridges or tunnels."},"building-waterway":{reference:"Waterways crossing buildings should use tunnels or different layers."},"highway-highway":{reference:"Crossing highways should use bridges, tunnels, or intersections."},"highway-railway":{reference:"Highways crossing railways should use bridges, tunnels, or level crossings."},"highway-waterway":{reference:"Highways crossing waterways should use bridges, tunnels, or fords."},"railway-railway":{reference:"Crossing railways should be connected or use bridges or tunnels."},"railway-waterway":{reference:"Railways crossing waterways should use bridges or tunnels."},"waterway-waterway":{reference:"Crossing waterways should be connected or use tunnels."},"tunnel-tunnel":{reference:"Crossing tunnels should use different layers."},"tunnel-tunnel_connectable":{reference:"Crossing tunnels should be connected or use different layers."},"bridge-bridge":{reference:"Crossing bridges should use different layers."},"bridge-bridge_connectable":{reference:"Crossing bridges should be connected or use different layers."},"indoor-indoor":{reference:"Crossing indoor features should use different levels."},"indoor-indoor_connectable":{reference:"Crossing indoor features should be connected or use different levels."}},disconnected_way:{title:"Disconnected Ways",tip:"Find unroutable roads, paths, and ferry routes",routable:{message:{multiple:"{count} routable features are connected only to each other."},reference:"All roads, paths, and ferry routes should connect to form a single routing network."},highway:{message:"{highway} is disconnected from other roads and paths"}},fixme_tag:{title:"\"Fix Me\" Requests",message:"{feature} has a \"Fix Me\" request",tip:"Find features with \"fixme\" tags",reference:"A \"fixme\" tag indicates that a mapper has requested help with a feature."},generic_name:{title:"Suspicious Names",message:"{feature} has the suspicious name \"{name}\"",tip:"Find features with generic or suspicious names",reference:"Names should be the actual, on-the-ground names of features."},incompatible_source:{title:"Suspicious Sources",tip:"Find features with suspicious source tags",google:{feature:{message:"{feature} lists Google as a data source"},reference:"Google products are proprietary and must not be used as references."}},invalid_format:{title:"Invalid Formatting",tip:"Find tags with unexpected formats",email:{message:"{feature} has an invalid email address.",message_multi:"{feature} has multiple invalid email addresses.",reference:"Email addresses must look like \"user@example.com\"."},website:{message:"{feature} has an invalid website.",message_multi:"{feature} has multiple invalid websites.",reference:"Websites should start with \"http\" or \"https\"."}},missing_role:{title:"Missing Roles",message:"{member} has no role within {relation}",tip:"Find relations with missing or incorrect member roles",multipolygon:{reference:"Multipolygon members must have an inner or outer role."}},missing_tag:{title:"Missing Tags",tip:"Find features that are missing descriptive tags",reference:"Features must have tags that define what they are.",any:{message:"{feature} has no tags"},descriptive:{message:"{feature} has no descriptive tags"},relation_type:{message:"{feature} is a relation without a type"}},old_multipolygon:{message:"{multipolygon} has misplaced tags",reference:"Multipolygons should be tagged on their relation, not their outer way."},outdated_tags:{title:"Outdated Tags",message:"{feature} has outdated tags",tip:"Find features with deprecated tags that can be updated",reference:"Some tags change over time and should be updated.",incomplete:{message:"{feature} has incomplete tags",reference:"Some features should have additional tags."},noncanonical_brand:{message:"{feature} looks like a brand with nonstandard tags",reference:"All features of the same brand should be tagged the same way."}},private_data:{title:"Private Information",tip:"Find features that may contain private information",reference:"Sensitive data like personal phone numbers should not be tagged.",contact:{message:"{feature} might be tagged with private contact information"}},tag_suggests_area:{title:"Lines Tagged as Areas",message:"{feature} should be a closed area based on the tag \"{tag}\"",tip:"Find features that are tagged as lines and should possibly be tagged as areas",reference:"Areas must have connected endpoints."},unknown_road:{message:"{feature} has no classification",reference:"Roads without a specific type may not appear in maps or routing."},impossible_oneway:{title:"Impossible One-Ways",tip:"Find route issues with one-way features",waterway:{connected:{start:{message:"{feature} flows away from a connected waterway"},end:{message:"{feature} flows against a connected waterway"},reference:"Waterway segments should all flow in the same direction."}},highway:{start:{message:"{feature} is unreachable",reference:"One-way roads must be accessible via other roads."},end:{message:"{feature} has no outlet",reference:"One-way roads must lead to other roads."}}},unsquare_way:{title:"Unsquare Corners (up to {val}°)",message:"{feature} has unsquare corners",tip:"Find features with unsquare corners that can be drawn better",buildings:{reference:"Buildings with unsquare corners can often be drawn more accurately."}},fix:{connect_almost_junction:{annotation:"Connected very close features."},connect_crossing_features:{annotation:"Connected crossing features."},connect_endpoints:{title:"Connect the ends",annotation:"Connected the endpoints of a way."},connect_feature:{title:"Connect this feature"},connect_features:{title:"Connect the features"},continue_from_start:{title:"Continue drawing from start"},continue_from_end:{title:"Continue drawing from end"},delete_feature:{title:"Delete this feature"},ignore_issue:{title:"Ignore this issue"},merge_close_vertices:{annotation:"Merged very close points in a way."},merge_points:{title:"Merge these points"},move_points_apart:{title:"Move these points apart"},move_tags:{title:"Move the tags",annotation:"Moved tags."},remove_from_relation:{title:"Remove from relation"},remove_generic_name:{title:"Remove the name",annotation:"Removed a generic name."},remove_private_info:{annotation:"Removed private information."},remove_proprietary_data:{title:"Remove any proprietary data"},remove_tag:{title:"Remove the tag",annotation:"Removed tag."},remove_tags:{title:"Remove the tags"},reposition_features:{title:"Reposition the features"},reverse_feature:{title:"Reverse this feature"},select_preset:{title:"Select a feature type"},select_road_type:{title:"Select a road type"},set_as_inner:{title:"Set as inner"},set_as_outer:{title:"Set as outer"},square_feature:{title:"Square this feature"},tag_as_disconnected:{title:"Tag as disconnected",annotation:"Tagged very close features as disconnected."},tag_as_unsquare:{title:"Tag as physically unsquare",annotation:"Tagged a way as having unsquare corners."},tag_this_as_higher:{title:"Tag this as higher"},tag_this_as_lower:{title:"Tag this as lower"},upgrade_tags:{title:"Upgrade the tags",annotation:"Upgraded old tags."},use_bridge_or_tunnel:{title:"Use a bridge or tunnel"},use_different_layers:{title:"Use different layers"},use_different_levels:{title:"Use different levels"},use_tunnel:{title:"Use a tunnel"}}},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",sidebar:"Toggle sidebar",wireframe:"Toggle wireframe mode",osm_data:"Toggle OpenStreetMap data",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",zoom_to:"Zoom to selected feature"},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",focus_add_feature:"Focus the feature search field",add_point:"'Add point' mode",add_line:"'Add line' mode",add_area:"'Add area' mode",add_note:"'Add note' mode",add_favorite:"Add a favorite feature",place_point:"Place a point or note",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",extract:"Extract a point from a feature",split:"Split a line into two at the selected node",reverse:"Reverse a line",move:"Move selected features",rotate:"Rotate selected features",orthogonalize:"Square corners of a line or area",straighten:"Straighten a line or points",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}"},wikidata:{identifier:"Identifier",label:"Label",description:"Description"},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":{name:"Natural Features"},"category-path":{name:"Paths"},"category-rail":{name:"Rails"},"category-restriction":{name:"Restriction Features"},"category-road_major":{name:"Major Roads"},"category-road_minor":{name:"Minor Roads"},"category-road_service":{name:"Service Roads"},"category-route":{name:"Route Features"},"category-utility":{name:"Utility Features"},"category-water":{name:"Water Bodies"},"category-waterway":{name:"Waterways"}},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 allowed by law; a right of way"},no:{title:"Prohibited",description:"Access not allowed to the general public"},permissive:{title:"Permissive",description:"Access allowed until such time as the owner revokes the permission"},"private":{title:"Private",description:"Access allowed only with permission of the owner on an individual basis"},designated:{title:"Designated",description:"Access allowed according to signs or specific local laws"},destination:{title:"Destination",description:"Access allowed only to reach a destination"},dismount:{title:"Dismount",description:"Access allowed but rider must dismount"},permit:{title:"Permit",description:"Access allowed only with a valid permit or license"}}},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"},air_conditioning:{label:"Air Conditioning"},amenity:{label:"Type"},animal_boarding:{label:"For Animals"},animal_breeding:{label:"For Animals"},animal_shelter:{label:"For Animals"},architect:{label:"Architect"},"area/highway":{label:"Type"},artist:{label:"Artist"},artwork_type:{label:"Type"},atm:{label:"ATM"},attraction:{label:"Type"},backrest:{label:"Backrest"},bar:{label:"Bar"},barrier:{label:"Type"},basin:{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:"Beauty Specialty"},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"},"bridge/support":{label:"Type"},building_area:{label:"Building"},building:{label:"Building"},"building/levels_building":{label:"Building Levels",placeholder:"2, 4, 6..."},"building/material":{label:"Material"},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..."},cash_in:{label:"Cash In"},castle_type:{label:"Type"},check_date:{label:"Last Checked Date"},clothes:{label:"Clothes"},club:{label:"Type"},collection_times:{label:"Collection Times"},colour:{label:"Color"},comment:{label:"Changeset Comment",placeholder:"Brief description of your contributions (required)"},communication_multi:{label:"Communication Types"},construction:{label:"Type"},consulate:{label:"Type"},"contact/webcam":{label:"Webcam URL",placeholder:"http://example.com/"},content:{label:"Content"},conveying:{label:"Movement Direction",options:{forward:"Forward",backward:"Backward",reversible:"Reversible"}},country:{label:"Country"},couplings:{label:"Couplings",placeholder:"1, 2, 3..."},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"},departures_board:{label:"Departures Board",options:{yes:"Yes",timetable:"Timetable",realtime:"Realtime",no:"None"}},description:{label:"Description"},design:{label:"Design"},destination_oneway:{label:"Destinations"},"destination/ref_oneway":{label:"Destination Road Numbers"},"destination/symbol_oneway":{label:"Destination Symbols"},devices:{label:"Devices",placeholder:"1, 2, 3..."},diameter:{label:"Diameter",placeholder:"5 mm, 10 cm, 15 in…"},diaper:{label:"Diaper Changing Available"},diet_multi:{label:"Diet Types"},diplomatic:{label:"Type"},"diplomatic/services":{label:"Services"},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 Affected",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:"Distance"},dock:{label:"Type"},dog:{label:"Dogs",options:{yes:"Allowed",leashed:"Leashed Only",no:"Not Allowed"}},door_type:{label:"Type"},door:{label:"Door"},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"},embassy:{label:"Type"},emergency_combo:{label:"Type"},emergency:{label:"Emergency"},enforcement:{label:"Type"},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/diameter":{label:"Diameter (mm, in, or letters)"},"fire_hydrant/pressure":{label:"Pressure (bar)"},"fire_hydrant/type":{label:"Shape",options:{pillar:"Pillar/Aboveground",underground:"Underground",wall:"Wall",pipe:"Capped Pipe"}},fireplace:{label:"Fireplace"},fishing:{label:"Fishing"},fitness_station:{label:"Equipment Type"},fixme:{label:"Fix Me"},"flag/type":{label:"Flag Type"},floating:{label:"Floating"},flood_prone:{label:"Flood Prone"},ford:{label:"Type",placeholder:"Default"},frequency_electrified:{label:"Operating Frequency"},frequency:{label:"Operating Frequency"},from:{label:"From"},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"},guest_house:{label:"Type"},handicap:{label:"Handicap",placeholder:"1-18"},handrail:{label:"Handrail"},hashtags:{label:"Suggested Hashtags",placeholder:"#example"},healthcare:{label:"Type"},"healthcare/speciality":{label:"Specialties"},height_building:{label:"Building Height (Meters)"},height:{label:"Height (Meters)"},highspeed:{label:"High-Speed"},highway:{label:"Type"},historic:{label:"Type"},"historic/civilization":{label:"Historic Civilization"},"historic/wreck/date_sunk":{label:"Date Sunk"},"historic/wreck/visible_at_high_tide":{label:"Visible At High Tide"},"historic/wreck/visible_at_low_tide":{label:"Visible At Low Tide"},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_type:{label:"Type"},indoor:{label:"Indoor"},industrial:{label:"Type"},information:{label:"Type"},inscription:{label:"Inscription"},intermittent_yes:{label:"Intermittent"},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:"Wifi Network Name"},interval:{label:"Interval"},junction_line:{label:"Junction",options:{roundabout:"Roundabout",circular:"Traffic Circle",jughandle:"Jughandle"}},"junction/ref_oneway":{label:"Junction Number"},kerb:{label:"Curb"},"kerb/height":{label:"Height"},label:{label:"Label"},lamp_type:{label:"Type"},landuse:{label:"Type"},lanes:{label:"Lanes",placeholder:"1, 2, 3..."},language_multi:{label:"Languages"},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..."},liaison:{label:"Type"},lit:{label:"Lit"},location_pool:{label:"Location",options:{outdoor:"Outdoor",indoor:"Indoor",roof:"Rooftop"}},location:{label:"Location"},lock:{label:"Lock"},man_made:{label:"Type"},manhole:{label:"Type"},manufacturer:{label:"Manufacturer"},map_size:{label:"Coverage"},map_type:{label:"Type"},material:{label:"Material"},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_bridge:{label:"Max Weight"},maxweight:{label:"Max Weight"},memorial:{label:"Type"},microbrewery:{label:"Microbrewery"},minspeed:{label:"Minimum Speed Limit",placeholder:"20, 30, 40..."},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"}},"oneway/bicycle":{label:"One Way (Bicycles)"},opening_date:{label:"Expected Opening Date"},opening_hours:{label:"Hours",placeholder:"Unknown"},operator:{label:"Operator"},"operator/type":{label:"Operator Type"},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_fee:{label:"Payment Types"},payment_multi:{label:"Payment Types"},phases:{label:"Phases",placeholder:"1, 2, 3..."},phone:{label:"Telephone",placeholder:"+31 42 123 4567"},"piste/difficulty_downhill":{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/difficulty_nordic":{label:"Difficulty",placeholder:"Easy, Intermediate, Advanced...",options:{novice:"Novice - Flat, no effort needed",easy:"Easy - Soft hills, short steep section",intermediate:"Intermediate - Steep section",advanced:"Advanced - Narrow, steep or icy section, sharp turn",expert:"Expert - Dangerous terrain around"}},"piste/difficulty_skitour":{label:"Difficulty",placeholder:"Easy, Intermediate, Advanced...",options:{novice:"Novice - L: <30° incline",easy:"Easy - WS: 30-35° incline",intermediate:"Intermediate - ZS: 35-40° incline",advanced:"Advanced - S: 40-45° incline",expert:"Expert - SS: 45–50° incline",freeride:"Freeride - AS: 50–55° incline",extreme:"Extreme - EX: >55° incline"}},"piste/difficulty":{label:"Difficulty",placeholder:"Easy, Intermediate, Advanced...",options:{novice:"Novice",easy:"Easy",intermediate:"Intermediate",advanced:"Advanced",expert:"Expert",freeride:"Freeride",extreme:"Extreme"}},"piste/grooming_downhill":{label:"Grooming",options:{classic:"Classic",mogul:"Mogul",backcountry:"Backcountry - no grooming"}},"piste/grooming_hike":{label:"Grooming",options:{classic:"Classic - Winter Hiking",backcountry:"Backcountry - Snowshoeing"}},"piste/grooming_nordic":{label:"Grooming",options:{classic:"Classic",backcountry:"Backcountry, no grooming","classic+skating":"Classic and Skating",scooter:"Scooter/Snowmobile",skating:"Skating"}},"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",connection:"Connection"}},place:{label:"Type"},plant:{label:"Plant"},"plant/output/electricity":{label:"Power Output",placeholder:"500 MW, 1000 MW, 2000 MW..."},playground:{label:"Type"},"playground/baby":{label:"Baby Seat"},"playground/max_age":{label:"Maximum Age"},"playground/min_age":{label:"Minimum Age"},polling_station:{label:"Polling Place"},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 Affected",options:{forward:"Forward",backward:"Backward",both:"Both / All"}},rating:{label:"Power Rating"},recycling_accepts:{label:"Accepts"},recycling_type:{label:"Type",placeholder:"Container, Center",options:{container:"Container",centre:"Center"}},ref_aeroway_gate:{label:"Gate Number"},ref_golf_hole:{label:"Hole Number",placeholder:"1-18"},ref_highway_junction:{label:"Junction Number"},ref_platform:{label:"Platform Number"},ref_road_number:{label:"Road Number"},ref_room_number:{label:"Room 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"},reservation:{label:"Reservations",options:{yes:"Accepted",no:"Not Accepted",required:"Required",recommended:"Recommended"}},resort:{label:"Type"},resource:{label:"Resources"},restriction:{label:"Type"},restrictions:{label:"Turn Restrictions"},"roof/colour":{label:"Roof Color"},room:{label:"Type"},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"}},salt:{label:"Salt"},sanitary_dump_station:{label:"Toilet Disposal"},screen:{label:"Screens",placeholder:"1, 4, 8…"},scuba_diving:{label:"Services"},"seamark/beacon_isolated_danger/shape":{label:"Shape"},"seamark/beacon_lateral/category":{label:"Category",options:{port:"Port",starboard:"Starboard",waterway_left:"Waterway Left",waterway_right:"Waterway Right",danger_left:"Danger Left",danger_right:"Danger Right"}},"seamark/beacon_lateral/colour":{label:"Color",options:{red:"Red",green:"Green",grey:"Grey"}},"seamark/beacon_lateral/shape":{label:"Shape"},"seamark/beacon_lateral/system":{label:"System",options:{"iala-a":"IALA A","iala-b":"IALA B",cevni:"CEVNI",other:"Other"}},"seamark/buoy_lateral/category":{label:"Category",options:{port:"Port",starboard:"Starboard",channel_left:"Channel Left",channel_right:"Channel Right",waterway_left:"Waterway Left",waterway_right:"Waterway Right",danger_left:"Danger Left",danger_right:"Danger Right",preferred_channel_port:"Preferred Channel Port",preferred_channel_starboard:"Preferred Channel Starboard"}},"seamark/buoy_lateral/colour":{label:"Color",options:{red:"Red",green:"Green","red;white;red;white":"Red-White-Red-White","green;white;green;white":"Green-White-Green-White","red;green;red":"Red-Green-Red","green;red;green":"Green-Red-Green",white:"White",yellow:"Yellow"}},"seamark/buoy_lateral/shape":{label:"Shape"},"seamark/buoy_lateral/system":{label:"System",options:{"iala-a":"IALA A","iala-b":"IALA B",cevni:"CEVNI",other:"Other"}},"seamark/mooring/category":{label:"Category"},"seamark/type":{label:"Seamark"},"seamark/wreck/category":{label:"Category"},seasonal:{label:"Seasonal"},seats:{label:"Seats",placeholder:"2, 4, 6..."},second_hand:{label:"Sells Used",placeholder:"Yes, No, Only",options:{yes:"Yes",no:"No",only:"Only"}},self_service:{label:"Self-Service"},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_type:{label:"Site Type"},site:{label:"Type"},smoking:{label:"Smoking",placeholder:"No, Separated, Yes...",options:{no:"No smoking anywhere",separated:"In smoking areas, not physically isolated",isolated:"In smoking areas, physically isolated",outside:"Allowed outside",yes:"Allowed everywhere",dedicated:"Dedicated to smokers (e.g. smokers' club)"}},smoothness:{label:"Smoothness",placeholder:"Thin Rollers, Wheels, Off-Road...",options:{excellent:"Thin Rollers: rollerblade, skateboard",good:"Thin Wheels: racing bike",intermediate:"Wheels: city bike, wheelchair, scooter",bad:"Robust Wheels: trekking bike, car, rickshaw",very_bad:"High Clearance: light duty off-road vehicle",horrible:"Off-Road: heavy duty off-road vehicle",very_horrible:"Specialized off-road: tractor, ATV",impassable:"Impassable / No wheeled vehicle"}},social_facility_for:{label:"People Served"},social_facility:{label:"Type"},source:{label:"Sources"},sport_ice:{label:"Sports"},sport_racing_motor:{label:"Sports"},sport_racing_nonmotor:{label:"Sports"},sport:{label:"Sports"},stars:{label:"Stars"},start_date:{label:"Start Date"},step_count:{label:"Number of Steps"},stop:{label:"Stop Type",options:{all:"All Ways",minor:"Minor Road"}},street_cabinet:{label:"Type"},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"},"survey/date":{label:"Last Survey Date"},swimming_pool:{label:"Type"},"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"}},target:{label:"Target"},tidal:{label:"Tidal"},to:{label:"To"},"toilets/disposal":{label:"Disposal",options:{flush:"Flush",pitlatrine:"Pit Latrine",chemical:"Chemical",bucket:"Bucket"}},"toilets/handwashing":{label:"Handwashing"},"toilets/position":{label:"Positions"},toll:{label:"Toll"},tomb:{label:"Type"},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_sign:{label:"Traffic Sign"},"traffic_sign/direction":{label:"Direction Affected",options:{forward:"Forward",backward:"Backward",both:"Both / All"}},traffic_signals:{label:"Type"},"traffic_signals/direction":{label:"Direction Affected",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"},trench:{label:"Type"},trolley_wire:{label:"Overhead Trolley Wires"},tunnel:{label:"Type",placeholder:"Default"},usage_rail:{label:"Usage Type",options:{main:"Main",branch:"Branch",industrial:"Industrial",military:"Military",test:"Test",tourism:"Tourism"}},valve:{label:"Type"},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_electrified:{label:"Voltage"},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_source:{label:"Water Source"},water_volume:{label:"Water Reserve Volume (m³)"},water:{label:"Type"},waterway:{label:"Type"},website:{label:"Website",placeholder:"https://example.com"},wetland:{label:"Type"},wheelchair:{label:"Wheelchair Access"},wholesale:{label:"Wholesale"},width:{label:"Width (Meters)"},wikidata:{label:"Wikidata"},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:""},aeroway:{name:"Aeroway",terms:""},amenity:{name:"Amenity",terms:""},attraction:{name:"Attraction",terms:""},boundary:{name:"Boundary",terms:""},building_point:{name:"Building",terms:""},embankment:{name:"Embankment",terms:""},emergency:{name:"Emergency Feature",terms:""},ford_line:{name:"Ford",terms:""},highway:{name:"Highway",terms:""},indoor:{name:"Indoor Feature",terms:""},landuse:{name:"Land Use",terms:""},leisure:{name:"Leisure",terms:""},man_made:{name:"Man Made",terms:""},natural:{name:"Natural",terms:""},place:{name:"Place",terms:""},playground:{name:"Playground Equipment",terms:""},power:{name:"Power",terms:""},railway:{name:"Railway",terms:""},seamark:{name:"Seamark",terms:""},tourism:{name:"Tourism",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/j-bar":{name:"J-bar Lift",terms:"jbar"},"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"},"aerialway/zip_line":{name:"Zip Line",terms:"aerial runway,canopy,flying fox,foefie slide,gravity propelled aerial ropeslide,Tyrolean traverse,zip wire,zip-line,zipline,zipwire"},"aeroway/aerodrome":{name:"Airport",terms:"aerodrome,aeroway,airplane,airport,jet,plane"},"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/jet_bridge":{name:"Jet Bridge",terms:"aerobridge,air jetty,airbridge,finger,gangway,jet way,jetway,passenger boarding bridge,PBB,portal,skybridge,terminal gate connector"},"aeroway/runway":{name:"Runway",terms:"landing strip"},"aeroway/taxiway":{name:"Taxiway",terms:""},"aeroway/terminal":{name:"Airport Terminal",terms:"airport,aerodrome"},"aeroway/windsock":{name:"Windsock",terms:""},"allotments/plot":{name:"Community Garden Plot",terms:""},"amenity/bus_station":{name:"Bus Station / Terminal",terms:""},"amenity/coworking_space":{name:"Coworking Space",terms:""},"amenity/embassy":{name:"Embassy",terms:""},"amenity/ferry_terminal":{name:"Ferry Station / Terminal",terms:""},"amenity/nursing_home":{name:"Nursing Home",terms:""},"amenity/recycling":{name:"Recycling",terms:"bin,can,bottle,glass,garbage,rubbish,scrap,trash"},"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,pound"},"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/bar/lgbtq":{name:"LGBTQ+ Bar",terms:"gay bar,lesbian bar,lgbtq bar,lgbt bar,lgb bar"},"amenity/bbq":{name:"Barbecue/Grill",terms:"bbq,grill"},"amenity/bench":{name:"Bench",terms:"seat,chair"},"amenity/bicycle_parking":{name:"Bicycle Parking",terms:"bike"},"amenity/bicycle_parking/building":{name:"Bicycle Parking Garage",terms:"Multi-Storey Bicycle Park,Multi-Storey Bike Park,Bike Parking Station"},"amenity/bicycle_parking/lockers":{name:"Bicycle Lockers",terms:"Bike Lockers"},"amenity/bicycle_parking/shed":{name:"Bicycle Shed",terms:"Bike Shed"},"amenity/bicycle_rental":{name:"Bicycle Rental",terms:"bike,bicycle,bikeshare,bike share,bicycle share,hub,dock"},"amenity/bicycle_repair_station":{name:"Bicycle Repair Tool Stand",terms:"bike,repair,chain,pump,tools,stand,multitool"},"amenity/biergarten":{name:"Biergarten",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:"time"},"amenity/clock/sundial":{name:"Sundial",terms:"gnomon,shadow"},"amenity/college":{name:"College Grounds",terms:"university,undergraduate school"},"amenity/community_centre":{name:"Community Center",terms:"event,hall"},"amenity/community_centre/lgbtq":{name:"LGBTQ+ Community Center",terms:"lgbtq event,lgbtq hall,lgbt event,lgbt hall,lgb event,lgb hall"},"amenity/compressed_air":{name:"Compressed Air",terms:""},"amenity/conference_centre":{name:"Convention Center",terms:"auditorium,conference,exhibition,exposition,lecture"},"amenity/courthouse":{name:"Courthouse",terms:""},"amenity/crematorium":{name:"Crematorium",terms:"cemetery,funeral"},"amenity/dentist":{name:"Dentist",terms:"tooth,teeth"},"amenity/dive_centre":{name:"Dive Center",terms:"diving,scuba"},"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:"potable water source,water fountain,drinking fountain,bubbler,water tap"},"amenity/driving_school":{name:"Driving School",terms:""},"amenity/events_venue":{name:"Events Venue",terms:"banquet hall,baptism,Bar Mitzvah,Bat Mitzvah,birthdays,celebrations,conferences,confirmation,meetings,parties,party,quinceañera,reunions,weddings"},"amenity/fast_food":{name:"Fast Food",terms:"restaurant,takeaway"},"amenity/fast_food/ice_cream":{name:"Ice Cream Fast Food",terms:""},"amenity/fast_food/burger":{name:"Burger Fast Food",terms:"breakfast,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/fast_food/chicken":{name:"Chicken Fast Food",terms:"breakfast,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/fast_food/donut":{name:"Donut Fast Food",terms:"breakfast,brunch,cafe,canteen,coffee,dine,diner,donut,doughnut,dining,eat,lunch,table"},"amenity/fast_food/fish_and_chips":{name:"Fish & Chips Fast Food",terms:"breakfast,cafe,café,dine,dining,dinner,drive-in,eat,grill,lunch,table,french fries"},"amenity/fast_food/kebab":{name:"Kebab Fast Food",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/fast_food/mexican":{name:"Mexican Fast Food",terms:"breakfast,dine,dining,dinner,drive-in,eat,grill,lunch,table,tacos,burritos,enchiladas,fajitas,nachos,tortillas,salsa,tamales,quesadillas"},"amenity/fast_food/pizza":{name:"Pizza Fast Food",terms:"dine,dining,dinner,drive-in,eat,lunch,table,deep dish,thin crust,slice"},"amenity/fast_food/sandwich":{name:"Sandwich Fast Food",terms:"breakfast,cafe,café,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"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/karaoke":{name:"Karaoke Box",terms:"karaoke club,karaoke room,karaoke television,KTV"},"amenity/kindergarten":{name:"Preschool/Kindergarten Grounds",terms:"kindergarden,pre-school"},"amenity/language_school":{name:"Language School",terms:"esl"},"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/money_transfer":{name:"Money Transfer Station",terms:"money order,check,bill,currency,finance,wire transfer,cable,person to person,cash to cash,exchange"},"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/nightclub/lgbtq":{name:"LGBTQ+ Nightclub",terms:"gay nightclub,lesbian nightclub,lgbtq nightclub,lgbt nightclub,lgb nightclub"},"amenity/parking_entrance":{name:"Parking Garage Entrance/Exit",terms:""},"amenity/parking_space":{name:"Parking Space",terms:""},"amenity/parking":{name:"Parking Lot",terms:"automobile parking,car lot,car parking,rv parking,truck parking,vehicle parking"},"amenity/parking/multi-storey":{name:"Multilevel Parking Garage",terms:"car,indoor parking,multistorey car park,parkade,parking building,parking deck,parking garage,parking ramp,parking structure"},"amenity/parking/underground":{name:"Underground Parking",terms:"automobile parking,car lot,car parking,rv parking,subsurface parking,truck parking,vehicle parking"},"amenity/payment_centre":{name:"Payment Center",terms:"check,tax pay,bill pay,currency,finance,cash,money"},"amenity/payment_terminal":{name:"Payment Terminal",terms:"interactive kiosk,ekiosk,atm,bill pay,tax pay,phone pay,finance,cash,money transfer,card"},"amenity/pharmacy":{name:"Pharmacy Counter",terms:"apothecary,drug store,drugstore,med*,prescription"},"amenity/photo_booth":{name:"Photo Booth",terms:"photobooth,photo,booth,kiosk,camera"},"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:"Christian 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/christian/jehovahs_witness":{name:"Kingdom Hall of Jehovah's Witnesses",terms:"christian,church,house of God,house of prayer,house of worship"},"amenity/place_of_worship/christian/la_luz_del_mundo":{name:"La Luz del Mundo Temple",terms:"christian,church,house of God,house of prayer,house of worship,the light of the world church"},"amenity/place_of_worship/christian/quaker":{name:"Quaker Friends Meeting House",terms:"christian,church,house of God,house of prayer,house of worship"},"amenity/place_of_worship/hindu":{name:"Hindu Temple",terms:"kovil,devasthana,mandir,kshetram,alayam,shrine,temple"},"amenity/place_of_worship/jewish":{name:"Jewish Synagogue",terms:"jewish"},"amenity/place_of_worship/muslim":{name:"Muslim Mosque",terms:"islam,islamic center,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/polling_station":{name:"Permanent Polling Place",terms:"ballot box,ballot drop,democracy,elections,polling place,vote,voting booth,voting machine"},"amenity/post_box":{name:"Mailbox",terms:"letter drop,mail box,package drop,post box,postal box"},"amenity/post_office":{name:"Post Office",terms:"letter,mail"},"amenity/prep_school":{name:"Test Prep / Tutoring School",terms:"academic,ACT,SAT,homework,math,reading,test prep,tutoring,writing"},"amenity/prison":{name:"Prison Grounds",terms:"cell,jail,correction"},"amenity/pub":{name:"Pub",terms:"alcohol,drink,dive,beer,bier,booze"},"amenity/pub/lgbtq":{name:"LGBTQ+ Pub",terms:"gay pub,lesbian pub,lgbtq pub,lgbt pub,lgb pub"},"amenity/pub/microbrewery":{name:"Brewpub",terms:"alcohol,drink,dive,beer,bier,booze,craft brewery,microbrewery,small batch brewery"},"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_container":{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/restaurant/american":{name:"American Restaurant",terms:"bar,breakfast,cafe,café,canteen,coffee,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/asian":{name:"Asian Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/chinese":{name:"Chinese Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/french":{name:"French Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/german":{name:"German Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/greek":{name:"Greek Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table,gyros,pitas,olives"},"amenity/restaurant/indian":{name:"Indian Restaurant",terms:"bar,breakfast,dine,dining,dinner,drive-in,eat,grill,lunch,table,curry"},"amenity/restaurant/italian":{name:"Italian Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table,pasta,pizza"},"amenity/restaurant/japanese":{name:"Japanese Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/mexican":{name:"Mexican Restaurant",terms:"bar,breakfast,dine,dining,dinner,drive-in,eat,grill,lunch,table,tacos,burritos,enchiladas,fajitas,nachos,tortillas,salsa,tamales,quesadillas"},"amenity/restaurant/noodle":{name:"Noodle Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table,ramen noodles,soup,soba noodles,cellophane noodles,rice noodles"},"amenity/restaurant/pizza":{name:"Pizza Restaurant",terms:"bar,dine,dining,dinner,drive-in,eat,lunch,table,deep dish,thin crust,slice"},"amenity/restaurant/seafood":{name:"Seafood Restaurant",terms:"bar,breakfast,cafe,café,dine,dining,dinner,drive-in,eat,grill,lunch,table,fish,shellfish,molluscs,crustaceans,clams,oysters,lobsters,crab,shrimp,squid,octopus"},"amenity/restaurant/steakhouse":{name:"Steakhouse",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table,steak house,chop house,beef"},"amenity/restaurant/sushi":{name:"Sushi Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/thai":{name:"Thai Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/turkish":{name:"Turkish Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/vietnamese":{name:"Vietnamese Restaurant",terms:"bar,breakfast,cafe,café,canteen,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/shelter/gazebo":{name:"Gazebo",terms:""},"amenity/shelter/lean_to":{name:"Lean-To",terms:""},"amenity/shelter/picnic_shelter":{name:"Picnic Shelter",terms:"pavilion"},"amenity/shelter/public_transport":{name:"Transit Shelter",terms:"bus stop,metro stop,public transit shelter,public transport shelter,tram stop shelter,waiting"},"amenity/shower":{name:"Shower",terms:"rain closet"},"amenity/smoking_area":{name:"Smoking Area",terms:""},"amenity/social_centre":{name:"Social Center",terms:"event,fraternal,fraternity,hall,organization,professional,society,sorority,union,vetern"},"amenity/social_facility":{name:"Social Facility",terms:""},"amenity/social_facility/ambulatory_care":{name:"Ambulatory Care",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/theatre/type/amphi":{name:"Amphitheatre",terms:"open air,outdoor,greek,ampi"},"amenity/toilets":{name:"Toilets",terms:"bathroom,restroom,outhouse,privy,head,lavatory,latrine,water closet,WC,W.C."},"amenity/toilets/disposal/flush":{name:"Flush Toilets",terms:"bathroom,head,lavatory,privy,restroom,water closet,WC,W.C."},"amenity/toilets/disposal/pitlatrine":{name:"Pit Latrine",terms:"head,lavatory,long drop,outhouse,pit toilet,privy"},"amenity/townhall":{name:"Town Hall",terms:"village,city,government,courthouse,municipal"},"amenity/toy_library":{name:"Toy Library",terms:"game,toy"},"amenity/university":{name:"University Grounds",terms:"college,graduate school,PhD program,master's degree program"},"amenity/vehicle_inspection":{name:"Vehicle Inspection",terms:"car inspection"},"amenity/vending_machine":{name:"Vending Machine",terms:""},"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 Dispenser",terms:"excrement bags,poop,waste,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 Locker",terms:"mail,parcel,pickup"},"amenity/vending_machine/parcel_pickup":{name:"Parcel Pickup Locker",terms:"amazon,locker,mail,parcel,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:"polygon"},"area/highway":{name:"Road Surface",terms:"area:highway,edge of pavement,highway area,highway shape,pavement,road shape,street area"},"attraction/amusement_ride":{name:"Amusement Ride",terms:"theme park,carnival ride"},"attraction/animal":{name:"Animal Enclosure",terms:"amphibian,animal park,aquarium,bear,bird,fish,insect,lion,mammal,monkey,penguin,reptile,safari,theme park,tiger,zoo"},"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/summer_toboggan":{name:"Summer Toboggan",terms:"alpine slide,mountain coaster"},"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/chain":{name:"Chain",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/fence/railing":{name:"Railing",terms:"railing,handrail,guard rail"},"barrier/gate":{name:"Gate",terms:""},"barrier/guard_rail":{name:"Guard Rail",terms:"guardrail,traffic barrier,crash barrier,median barrier,roadside barrier,Armco barrier"},"barrier/hedge":{name:"Hedge",terms:""},"barrier/height_restrictor":{name:"Height Restrictor",terms:""},"barrier/kerb":{name:"Curb",terms:""},"barrier/kerb/flush":{name:"Flush Curb",terms:"even curb,level curb,tactile curb"},"barrier/kerb/lowered":{name:"Lowered Curb",terms:"curb cut,curb ramp,kerb ramp,dropped kerb,pram ramp"},"barrier/kerb/raised":{name:"Raised Curb",terms:""},"barrier/kerb/rolled":{name:"Rolled Curb",terms:"gutter"},"barrier/kissing_gate":{name:"Kissing Gate",terms:""},"barrier/lift_gate":{name:"Lift Gate",terms:""},"barrier/retaining_wall":{name:"Retaining Wall",terms:""},"barrier/sally_port":{name:"Sally Port",terms:"Postern,castle side gate"},"barrier/stile":{name:"Stile",terms:""},"barrier/toll_booth":{name:"Toll Booth",terms:""},"barrier/turnstile":{name:"Turnstile",terms:"baffle gate,turnstyle"},"barrier/wall":{name:"Wall",terms:""},"boundary/administrative":{name:"Administrative Boundary",terms:""},"bridge/support":{name:"Bridge Support",terms:""},"bridge/support/pier":{name:"Bridge Pier",terms:""},building_part:{name:"Building Part",terms:"roof,simple 3D buildings"},building:{name:"Building",terms:""},"building/bunker":{name:"Bunker",terms:""},"building/entrance":{name:"Entrance/Exit",terms:""},"building/train_station":{name:"Train Station Building",terms:""},"building/apartments":{name:"Apartment Building",terms:""},"building/barn":{name:"Barn",terms:""},"building/boathouse":{name:"Boathouse",terms:""},"building/bungalow":{name:"Bungalow",terms:"home,detached"},"building/cabin":{name:"Cabin",terms:""},"building/carport":{name:"Carport",terms:"covered parking space,garage,car,porch"},"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/hangar":{name:"Hangar Building",terms:""},"building/hospital":{name:"Hospital Building",terms:""},"building/hotel":{name:"Hotel Building",terms:""},"building/house":{name:"House",terms:"home,family,residence,dwelling"},"building/houseboat":{name:"Houseboat",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/pavilion":{name:"Pavilion Building",terms:"sports"},"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:""},club:{name:"Club",terms:"social"},"club/sport":{name:"Sports Club",terms:"athletics club,sporting club,sports association,sports society"},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/agricultural_engines":{name:"Argricultural Engines Mechanic",terms:""},"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/floorer":{name:"Floorer",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/joiner":{name:"Joiner",terms:"furniture"},"craft/key_cutter":{name:"Key Cutter",terms:""},"craft/metal_construction":{name:"Metal Construction",terms:""},"craft/painter":{name:"Painter",terms:""},"craft/parquet_layer":{name:"Parquet Layer",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/signmaker":{name:"Signmaker",terms:""},"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:""},"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_hose":{name:"Fire Hose",terms:""},"emergency/fire_hydrant":{name:"Fire Hydrant",terms:"fire plug,fire water well,hydrant"},"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:"entrance,exit,door"},ford:{name:"Ford",terms:""},"golf/bunker":{name:"Sand Trap",terms:"hazard,bunker"},"golf/cartpath":{name:"Golf Cartpath",terms:""},"golf/driving_range":{name:"Driving Range",terms:""},"golf/fairway":{name:"Fairway",terms:""},"golf/green":{name:"Putting Green",terms:""},"golf/hole":{name:"Golf Hole",terms:""},"golf/lateral_water_hazard":{name:"Lateral Water Hazard",terms:""},"golf/path":{name:"Golf Walking Path",terms:""},"golf/rough":{name:"Rough",terms:""},"golf/tee":{name:"Tee Box",terms:"teeing ground"},"golf/water_hazard":{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/counselling":{name:"Counselling Center",terms:""},"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",terms:""},"highway/crossing":{name:"Crossing",terms:""},"highway/bridleway":{name:"Bridle Path",terms:"bridleway,equestrian,horse,trail"},"highway/bus_guideway":{name:"Bus Guideway",terms:""},"highway/construction":{name:"Road Closed",terms:"closed,closure,construction"},"highway/corridor":{name:"Indoor Corridor",terms:"gallery,hall,hallway,indoor,passage,passageway"},"highway/crossing/zebra-raised":{name:"Marked Crosswalk (Raised)",terms:"zebra crossing,marked crossing,crosswalk,flat top,hump,speed,slow"},"highway/crossing/zebra":{name:"Marked Crosswalk",terms:"zebra crossing,marked crossing,crosswalk"},"highway/crossing/marked-raised":{name:"Marked Crosswalk (Raised)",terms:"zebra crossing,marked crossing,crosswalk,flat top,hump,speed,slow"},"highway/crossing/marked":{name:"Marked Crosswalk",terms:"zebra crossing,marked crossing,crosswalk"},"highway/crossing/unmarked-raised":{name:"Unmarked Crossing (Raised)",terms:"flat top,hump,speed,slow"},"highway/crossing/unmarked":{name:"Unmarked Crossing",terms:""},"highway/cycleway":{name:"Cycle Path",terms:"bike path,bicyle path"},"highway/cycleway/crossing":{name:"Cycle Crossing",terms:""},"highway/cycleway/bicycle_foot":{name:"Cycle & Foot Path",terms:"bicycle and foot path,bike and pedestrian path,green way,greenway,mixed-use trail,multi-use trail,segregated trail,rail trail"},"highway/cycleway/crossing/marked":{name:"Marked Cycle Crossing",terms:"cycle crosswalk,cycle path crossing,cycleway crossing,bicycle crossing,bike crossing"},"highway/cycleway/crossing/unmarked":{name:"Unmarked Cycle Crossing",terms:"cycle path crossing,cycleway crossing,bicycle crossing,bike crossing"},"highway/elevator":{name:"Elevator",terms:"lift"},"highway/emergency_bay":{name:"Emergency Stopping Place",terms:"Highway Emergency Bay"},"highway/footway":{name:"Foot Path",terms:"hike,hiking,promenade,trackway,trail,walk"},"highway/footway/crossing":{name:"Pedestrian Crossing",terms:""},"highway/footway/zebra-raised":{name:"Marked Crosswalk (Raised)",terms:"zebra crossing,marked crossing,crosswalk,flat top,hump,speed,slow"},"highway/footway/zebra":{name:"Marked Crosswalk",terms:"zebra crossing,marked crossing,crosswalk"},"highway/footway/conveying":{name:"Moving Walkway",terms:"moving sidewalk,autwalk,skywalk,travolator,travelator,travellator,conveyor"},"highway/footway/marked-raised":{name:"Marked Crosswalk (Raised)",terms:"zebra crossing,marked crossing,crosswalk,flat top,hump,speed,slow"},"highway/footway/marked":{name:"Marked Crosswalk",terms:"marked foot path crossing,marked crossing,marked pedestrian crosswalk,zebra crossing"},"highway/footway/sidewalk":{name:"Sidewalk",terms:"pavement,sidepath"},"highway/footway/unmarked-raised":{name:"Unmarked Crossing (Raised)",terms:"flat top,hump,speed,slow"},"highway/footway/unmarked":{name:"Unmarked Crossing",terms:"unmarked foot path crossing,unmarked crosswalk,unmarked pedestrian crossing"},"highway/give_way":{name:"Yield Sign",terms:"give way,yield,sign"},"highway/living_street":{name:"Living Street",terms:""},"highway/milestone":{name:"Highway Milestone",terms:"mile marker,mile post,mile stone,mileage marker,milemarker,milepost"},"highway/mini_roundabout":{name:"Mini-Roundabout",terms:"traffic circle"},"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,stairway"},"highway/steps/conveying":{name:"Escalator",terms:"moving staircase,moving stairway,people mover"},"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/trailhead":{name:"Trailhead",terms:"hiking,mile zero,mountain biking,mountaineering,trail endpoint,trail start,staging area,trekking"},"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/castle/fortress":{name:"Historic Fortress",terms:"citadel,military"},"historic/castle/palace":{name:"Palace",terms:"Royal Residence,royal,king,queen"},"historic/castle/stately":{name:"Château",terms:"Historic Country House,Stately Home,nobility,gentry,representative"},"historic/city_gate":{name:"City Gate",terms:"Town Gate"},"historic/fort":{name:"Historic Fort",terms:"military"},"historic/manor":{name:"Manor House",terms:"Mansion,gentry,nobility,estate"},"historic/memorial":{name:"Memorial",terms:"dedicatory,epitaph,remember,remembrance,memory,monument,stolperstein"},"historic/memorial/plaque":{name:"Commemorative Plaque",terms:"dedicatory,epitaph,historical marker,remember,remembrance,memory"},"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:""},"historic/wreck":{name:"Shipwreck",terms:"hull,mast,maritime,remains,ship,boat"},"indoor/corridor_line":{name:"Indoor Corridor",terms:""},"indoor/area":{name:"Indoor Area",terms:"indoor space"},"indoor/corridor":{name:"Indoor Corridor",terms:"concourse,foyer,hallway,passageway"},"indoor/door":{name:"Indoor Door",terms:"doorframe,doorway,portal,room access,threshold"},"indoor/room":{name:"Room",terms:"antechamber,anteroom,atrium,cell,chamber,concourse,foyer,indoor room,lobby,vestibule"},"indoor/wall":{name:"Indoor Wall",terms:"indoor barrier,room divider,room partition"},"internet_access/wlan":{name:"Wi-Fi Hotspot",terms:"wi-fi,wifi,hotspot"},junction:{name:"Junction",terms:""},"junction/circular":{name:"Traffic Circle",terms:""},"junction/jughandle":{name:"Jughandle",terms:""},"junction/roundabout":{name:"Roundabout",terms:""},"landuse/basin":{name:"Basin",terms:""},"landuse/farm":{name:"Farmland",terms:""},"landuse/pond":{name:"Pond",terms:""},"landuse/reservoir":{name:"Reservoir",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/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:"Managed Forest",terms:"cut,forest,forestry,lumber,silviculture,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:"grazing,hay field,pasture"},"landuse/military":{name:"Military Area",terms:""},"landuse/military/airfield":{name:"Military Airfield",terms:"aerodrome,aeroway,air force,airplane,airport,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/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/obstacle_course":{name:"Obstacle Course",terms:"army,base,force,guard,marine,navy,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/residential/apartments":{name:"Apartment Complex",terms:"flat,residence,tenement"},"landuse/retail":{name:"Retail Area",terms:""},"landuse/vineyard":{name:"Vineyard",terms:"grape,wine"},"landuse/winter_sports":{name:"Winter Sports Area",terms:"piste area,ski area,ski hill,ski mountain,ski resort,snow board area,snowboard area"},"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/bandstand":{name:"Bandstand",terms:""},"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/disc_golf_course":{name:"Disc Golf Course",terms:"disk golf,frisbee golf,flying disc golf,frolf,ultimate"},"leisure/dog_park":{name:"Dog Park",terms:""},"leisure/escape_game":{name:"Escape Room",terms:"escape game,escape the room,puzzle room,quest room"},"leisure/firepit":{name:"Firepit",terms:"fireplace,campfire"},"leisure/fishing":{name:"Fishing Spot",terms:"angler"},"leisure/fitness_centre":{name:"Gym / Fitness Center",terms:"health,gym,leisure,studio"},"leisure/fitness_centre/yoga":{name:"Yoga Studio",terms:"studio,asanas,modern yoga,meditation"},"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/picnic_table/chess":{name:"Chess Table",terms:"bench,chess board,checkerboard,checkers,chequerboard,game table"},"leisure/pitch":{name:"Sport Pitch",terms:"field"},"leisure/pitch/american_football":{name:"American Football Field",terms:"football,gridiron"},"leisure/pitch/australian_football":{name:"Australian Football Field",terms:"Aussie,AFL,football"},"leisure/pitch/badminton":{name:"Badminton Court",terms:""},"leisure/pitch/baseball":{name:"Baseball Field",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/field_hockey":{name:"Field Hockey Pitch",terms:"landhockey"},"leisure/pitch/horseshoes":{name:"Horseshoes Pit",terms:"horse shoes"},"leisure/pitch/netball":{name:"Netball Court",terms:""},"leisure/pitch/rugby_league":{name:"Rugby League Field",terms:""},"leisure/pitch/rugby_union":{name:"Rugby Union Field",terms:""},"leisure/pitch/shuffleboard":{name:"Shuffleboard Court",terms:"deck shuffleboard,floor shuffleboard"},"leisure/pitch/skateboard":{name:"Skate Park",terms:""},"leisure/pitch/soccer":{name:"Soccer Field",terms:"football"},"leisure/pitch/softball":{name:"Softball Field",terms:"softball,diamond"},"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:"recreation center,sanatorium,ski and snowboard resort,vacation resort,winter sports resort"},"leisure/sauna":{name:"Sauna",terms:""},"leisure/slipway_point":{name:"Slipway",terms:"boat launch,boat ramp,boat landing"},"leisure/slipway":{name:"Slipway",terms:"boat launch,boat ramp,boat landing"},"leisure/sports_centre":{name:"Sports Center / Complex",terms:""},"leisure/sports_centre/climbing":{name:"Climbing Gym",terms:"abseiling,artificial climbing wall,belaying,bouldering,rock climbing facility,indoor rock wall,rappeling,rock gym,ropes"},"leisure/sports_centre/swimming":{name:"Swimming Pool Facility",terms:"dive,water"},"leisure/stadium":{name:"Stadium",terms:""},"leisure/swimming_area":{name:"Natural Swimming Area",terms:"dive,water,aquatics"},"leisure/swimming_pool":{name:"Swimming Pool",terms:"dive,water,aquatics"},"leisure/track":{name:"Racetrack (Non-Motorsport)",terms:"cycle,dog,greyhound,horse,race*,track"},"leisure/track/cycling_point":{name:"Cycling Track",terms:"bicycle track,bicycling track,cycle racetrack,velodrome"},"leisure/track/cycling":{name:"Cycling Track",terms:"bicycle track,bicycling track,cycle racetrack,velodrome"},"leisure/track/horse_racing_point":{name:"Horse Racing Track",terms:"equestrian race track,horse race betting,horseracing,horsetrack,horse racetrack"},"leisure/track/horse_racing":{name:"Horse Racing Track",terms:"equestrian race track,horse race betting,horseracing,horsetrack,horse racetrack"},"leisure/track/running_point":{name:"Running Track",terms:"athletics track,decathlon,foot race,long distance running,marathon,middle distance running,racetrack,running,sprint,track,walking"},"leisure/track/running":{name:"Running Track",terms:"athletics track,decathlon,foot race,long distance running,marathon,middle distance running,racetrack,running,sprint,track,walking"},"leisure/water_park":{name:"Water Park",terms:"swim,pool,dive"},line:{name:"Line",terms:"polyline"},"man_made/adit":{name:"Adit",terms:"cave,horizontal mine entrance,tunnel,underground"},"man_made/antenna":{name:"Antenna",terms:"broadcast,cell phone,cell,communication,mobile phone,radio,television,transmission,tv"},"man_made/beacon":{name:"Beacon",terms:""},"man_made/beehive":{name:"Beehive",terms:"apiary,beekeeper,farm,honey,pollination"},"man_made/breakwater":{name:"Breakwater",terms:""},"man_made/bridge":{name:"Bridge",terms:""},"man_made/bunker_silo":{name:"Bunker Silo",terms:"Silage,Storage"},"man_made/cairn":{name:"Cairn",terms:"rock pile,stone stack,stone pile,càrn"},"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/cross":{name:"Summit Cross",terms:""},"man_made/cutline":{name:"Cut line",terms:""},"man_made/dyke":{name:"Levee",terms:"Dike,Dyke,Floodbank,Stopbank"},"man_made/embankment":{name:"Embankment",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/mast/communication":{name:"Communication 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/mast/communication/mobile_phone":{name:"Mobile Phone Mast",terms:"antenna,cell mast,cell phone mast,cell phone tower,cell tower,communication mast,communication tower,guyed tower,mobile phone tower,transmission mast,transmission tower"},"man_made/mast/communication/radio":{name:"Radio Broadcast Mast",terms:"antenna,broadcast tower,communication mast,communication tower,guyed tower,radio mast,radio tower,transmission mast,transmission tower"},"man_made/mast/communication/television":{name:"Television Broadcast Mast",terms:"antenna,broadcast tower,communication mast,communication tower,guyed tower,television mast,television tower,transmission mast,transmission tower,tv mast,tv tower"},"man_made/mineshaft":{name:"Mineshaft",terms:"cave,mine shaft,tunnel,underground,vertical mine entrance"},"man_made/monitoring_station":{name:"Monitoring Station",terms:"weather,earthquake,seismology,air,gps"},"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:"berth,dock,jetty,landing,promenade,wharf"},"man_made/pier/floating":{name:"Floating Pier",terms:"berth,dock,jetty,landing,promenade,wharf"},"man_made/pipeline":{name:"Pipeline",terms:"oil,natural gas,water,sewer,sewage"},"man_made/pipeline/underground":{name:"Underground Pipeline",terms:"oil,natural gas,water,sewer,sewage"},"man_made/pipeline/valve":{name:"Pipeline Valve",terms:"oil,natural gas,water,sewer,sewage"},"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/storage_tank/water":{name:"Water Tank",terms:"cistern,water tower"},"man_made/street_cabinet":{name:"Street Cabinet",terms:"cable tv,monitoring box,technical box,telecommunications,traffic signal controls"},"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/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/survey_point":{name:"Survey Point",terms:"trig point,triangulation pillar,trigonometrical station"},"man_made/torii":{name:"Torii",terms:"Japanese gate,Shinto shrine"},"man_made/tower":{name:"Tower",terms:""},"man_made/tower/bell_tower":{name:"Bell Tower",terms:"belfry,bell gable,campanile,church tower,klockstapel"},"man_made/tower/communication":{name:"Communication Tower",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/tower/defensive":{name:"Fortified Tower",terms:"Defensive Tower,Castle Tower"},"man_made/tower/minaret":{name:"Minaret",terms:"Islam,mosque,Muezzin,Muslim"},"man_made/tower/observation":{name:"Observation Tower",terms:"lookout tower,fire tower"},"man_made/tunnel":{name:"Tunnel",terms:"bore,dig,shaft,underground passage,underpass"},"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"},"military/bunker":{name:"Military Bunker",terms:"air force,army,base,fight,force,guard,marine,navy,troop,war"},"military/checkpoint":{name:"Checkpoint",terms:"air force,army,base,force,guard,marine,navy,troop,war"},"military/nuclear_explosion_site":{name:"Nuclear Explosion Site",terms:"atom,blast,bomb,detonat*,nuke,site,test"},"military/office":{name:"Military Office",terms:"air force,army,base,enlist,fight,force,guard,marine,navy,recruit,troop,war"},"military/trench":{name:"Military Trench",terms:"dugout,firestep,fox hole,infantry trench,war trench"},"natural/bare_rock":{name:"Bare Rock",terms:"rock"},"natural/bay":{name:"Bay",terms:""},"natural/beach":{name:"Beach",terms:"shore"},"natural/cape":{name:"Cape",terms:"bay,coastline,erosion,headland,promontory"},"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:"ice,snow"},"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/rock":{name:"Attached Rock / Boulder",terms:"boulder,stone,rock"},"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/shingle":{name:"Shingle",terms:"beach,gravel,pebbles,riverbed,rounded rock fragments"},"natural/spring":{name:"Spring",terms:""},"natural/stone":{name:"Unattached Stone / Boulder",terms:"boulder,stone,rock"},"natural/tree_row":{name:"Tree Row",terms:""},"natural/tree":{name:"Tree",terms:""},"natural/valley":{name:"Valley",terms:"canyon,dale,dell,dene,depression,glen,gorge,gully,gulley,gultch,hollow,ravine,rift,vale"},"natural/volcano":{name:"Volcano",terms:"mountain,crater"},"natural/water":{name:"Water",terms:""},"natural/water/basin":{name:"Basin",terms:"detention,drain,overflow,rain,retention"},"natural/water/canal":{name:"Canal",terms:""},"natural/water/lake":{name:"Lake",terms:"lakelet,loch,mere"},"natural/water/moat":{name:"Moat",terms:""},"natural/water/pond":{name:"Pond",terms:"lakelet,millpond,tarn,pool,mere"},"natural/water/reservoir":{name:"Reservoir",terms:""},"natural/water/river":{name:"River",terms:"beck,branch,brook,course,creek,estuary,rill,riverbank,rivulet,run,runnel,stream,tributary,watercourse"},"natural/water/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"},"natural/water/wastewater":{name:"Wastewater Basin",terms:"excrement,shit,sewage,wastewater,Settling Basin,Clarifier Basin"},"natural/wetland":{name:"Wetland",terms:"bog,fen,marsh,mire,moor,muskeg,peatland,quagmire,reedbed,saltmarsh,swamp,tidalflat,wet meadow"},"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/bail_bond_agent":{name:"Bail Bond Agent",terms:"bail bond dealer,bail bond man,bail bondsman,bail bondsperson"},"office/charity":{name:"Charity Office",terms:"charitable organization"},"office/company":{name:"Corporate Office",terms:""},"office/coworking":{name:"Coworking Space",terms:"coworking,office"},"office/diplomatic":{name:"Diplomatic Office",terms:""},"office/diplomatic/consulate":{name:"Consulate",terms:""},"office/diplomatic/embassy":{name:"Embassy",terms:""},"office/diplomatic/liaison":{name:"Liaison Office",terms:""},"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:"real estate"},"office/financial_advisor":{name:"Financial Advisor",terms:"401k,inheritance,savings,stocks,retirement,wealth management"},"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/religion":{name:"Religious Office",terms:""},"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/downhill":{name:"Downhill Piste/Ski Run",terms:"ski,alpine,snowboard,downhill,piste"},"piste/downhill/halfpipe":{name:"Halfpipe",terms:"ski,alpine,halfpipe,half pipe,snowboard,downhill,piste"},"piste/hike":{name:"Snowshoeing or Winter Hiking Trail",terms:"hike,winter hiking,snowshoe,snowshoeing,piste,ski"},"piste/ice_skate":{name:"Ice Skating Piste",terms:"ice,skating,ski,piste"},"piste/nordic":{name:"Nordic or Crosscountry Piste/Ski Trail",terms:"ski,nordic,crosscountry,skating,piste"},"piste/piste":{name:"Winter Sport Trails",terms:"ski,nordic,crosscountry,downhill,alpine,snowboard,skitour,ski touring,sled,luge,sleigh,sledge,ski-joring,husky,horse,winter hiking,snowshoe,snowshoeing,ice,skating"},"piste/skitour":{name:"Ski Touring Trail",terms:"ski,skitour,crosscountry,ski touring,piste"},"piste/sled":{name:"Sled Piste",terms:"ski,sled,luge,sleigh,sledge,piste"},"piste/sleigh":{name:"Sleigh Piste",terms:"ski,piste,sled,luge,sleigh,sledge,ski-joring,husky,horse"},"place/farm":{name:"Farm",terms:""},"place/city_block":{name:"City Block",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:"node,other,vertex,vertices"},polling_station:{name:"Temporary Polling Place",terms:"ballot box,ballot drop,democracy,elections,polling place,vote,voting booth,voting machine"},"power/sub_station":{name:"Substation",terms:""},"power/cable/underground":{name:"Underground Power Cable",terms:""},"power/generator":{name:"Power Generator",terms:"hydro,solar,turbine,wind"},"power/generator/method/photovoltaic":{name:"Solar Panel",terms:"photovoltaic module,PV module,sunlight"},"power/generator/source/hydro":{name:"Water Turbine",terms:"dam,generator,francis turbine,hydroelectricity,kaplan turbine,pelton turbine"},"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"},"power/transformer":{name:"Transformer",terms:""},"public_transport/platform_point":{name:"Transit Stop / Platform",terms:"platform,public transit,public transportation,transit,transportation"},"public_transport/platform":{name:"Transit Platform",terms:"platform,public transit,public transportation,transit,transportation"},"public_transport/platform/aerialway_point":{name:"Aerialway Stop / Platform",terms:"aerialway,cable car,platform,public transit,public transportation,transit,transportation"},"public_transport/platform/ferry_point":{name:"Ferry Stop / Platform",terms:"boat,dock,ferry,pier,platform,public transit,public transportation,transit,transportation"},"public_transport/platform/light_rail_point":{name:"Light Rail Stop / Platform",terms:"electric,light rail,platform,public transit,public transportation,rail,track,tram,trolley,transit,transportation"},"public_transport/platform/monorail_point":{name:"Monorail Stop / Platform",terms:"monorail,platform,public transit,public transportation,rail,transit,transportation"},"public_transport/platform/subway_point":{name:"Subway Stop / Platform",terms:"metro,platform,public transit,public transportation,rail,subway,track,transit,transportation,underground"},"public_transport/platform/train_point":{name:"Train Stop / Platform",terms:"platform,public transit,public transportation,rail,track,train,transit,transportation"},"public_transport/platform/tram_point":{name:"Tram Stop / Platform",terms:"electric,light rail,platform,public transit,public transportation,rail,streetcar,track,tram,trolley,transit,transportation"},"public_transport/platform/aerialway":{name:"Aerialway Platform",terms:"aerialway,cable car,platform,public transit,public transportation,transit,transportation"},"public_transport/platform/bus_point":{name:"Bus Stop",terms:"bus,platform,public transit,public transportation,transit,transportation"},"public_transport/platform/bus":{name:"Bus Platform",terms:"bus,platform,public transit,public transportation,transit,transportation"},"public_transport/platform/ferry":{name:"Ferry Platform",terms:"boat,dock,ferry,pier,platform,public transit,public transportation,transit,transportation"},"public_transport/platform/light_rail":{name:"Light Rail Platform",terms:"electric,light rail,platform,public transit,public transportation,rail,track,tram,trolley,transit,transportation"},"public_transport/platform/monorail":{name:"Monorail Platform",terms:"monorail,platform,public transit,public transportation,rail,transit,transportation"},"public_transport/platform/subway":{name:"Subway Platform",terms:"metro,platform,public transit,public transportation,rail,subway,track,transit,transportation,underground"},"public_transport/platform/train":{name:"Train Platform",terms:"platform,public transit,public transportation,rail,track,train,transit,transportation"},"public_transport/platform/tram":{name:"Tram Platform",terms:"electric,light rail,platform,public transit,public transportation,rail,streetcar,track,tram,trolley,transit,transportation"},"public_transport/platform/trolleybus_point":{name:"Trolleybus Stop",terms:"bus,electric,platform,public transit,public transportation,streetcar,trackless,tram,trolley,transit,transportation"},"public_transport/platform/trolleybus":{name:"Trolleybus Platform",terms:"bus,electric,platform,public transit,public transportation,streetcar,trackless,tram,trolley,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 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/construction":{name:"Railway Under Construction",terms:""},"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:"rail line,railroad track,train track"},"railway/rail/highspeed":{name:"High-Speed Rail",terms:"bullet train,fast rail,high speed rail,highspeed rail,HSR"},"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:""},"seamark/beacon_isolated_danger":{name:"Danger Beacon",terms:"beacon isolated danger,isolated danger beacon,iala"},"seamark/beacon_lateral":{name:"Channel Beacon",terms:"lateral beacon,beacon lateral,cevni,channel marker,iala,lateral mark"},"seamark/buoy_lateral":{name:"Channel Buoy",terms:"lateral buoy,buoy lateral,cevni,channel marker,iala,lateral mark"},"seamark/buoy_lateral/green":{name:"Green Buoy",terms:"lateral buoy,buoy lateral,cevni,channel marker,iala,lateral mark"},"seamark/buoy_lateral/red":{name:"Red Buoy",terms:"lateral buoy,buoy lateral,cevni,channel marker,iala,lateral mark"},"seamark/mooring":{name:"Mooring",terms:"dolphin,pile,bollard,buoy,post"},shop:{name:"Shop",terms:""},"shop/boutique":{name:"Boutique",terms:""},"shop/fashion":{name:"Fashion Store",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:"bread,cakes,rolls"},"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:"drinks"},"shop/bicycle":{name:"Bicycle Shop",terms:"bike,repair,tricycle,unicycle"},"shop/boat":{name:"Boat Store",terms:"fishing boat,jetski,motorboat,rowboat,sailboat,vessel,watercraft"},"shop/bookmaker":{name:"Bookmaker",terms:"betting,bookie"},"shop/books":{name:"Book Store",terms:""},"shop/butcher":{name:"Butcher",terms:"chicken,beef,lamb,meat,pork"},"shop/candles":{name:"Candle Shop",terms:"wax"},"shop/cannabis":{name:"Cannabis Shop",terms:"420,marijuana,pot,reefer,weed"},"shop/car_parts":{name:"Car Parts Store",terms:"automobile,automotive"},"shop/car_repair":{name:"Car Repair Shop",terms:"automobile,automotive,garage,service"},"shop/car":{name:"Car Dealership",terms:"automobile,automotive"},"shop/caravan":{name:"RV Dealership",terms:"auto,camper,recreational vehicle"},"shop/carpet":{name:"Carpet Store",terms:"rug"},"shop/catalogue":{name:"Catalog Shop",terms:""},"shop/charity":{name:"Charity Store",terms:"thrift,op shop,nonprofit"},"shop/cheese":{name:"Cheese Store",terms:""},"shop/chemist":{name:"Drugstore",terms:"apothecary,beauty,drug store,drugstore,gift,hair,med*,pharmacy,prescription,tooth"},"shop/chocolate":{name:"Chocolate Store",terms:"cocoa"},"shop/clothes":{name:"Clothing Store",terms:"blouses,boutique,bras,clothes,dresses,fashion,pants,shirts,shorts,skirts,slacks,socks,suits,underwear"},"shop/clothes/underwear":{name:"Underwear Store",terms:"boutique,bras,brassieres,briefs,boxers,fashion,lingerie,panties,slips,socks,stockings,underclothes,undergarments,underpants,undies"},"shop/coffee":{name:"Coffee Store",terms:""},"shop/computer":{name:"Computer Store",terms:"desktop,laptop,hardware,operating system,software"},"shop/confectionery":{name:"Candy Store",terms:"sweet"},"shop/convenience":{name:"Convenience Store",terms:""},"shop/copyshop":{name:"Copy Store",terms:"print,scan"},"shop/cosmetics":{name:"Cosmetics Store",terms:"make-up,makeup"},"shop/country_store":{name:"Country 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,vape,vaping,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/erotic/lgbtq":{name:"LGBTQ+ Erotic Store",terms:"sex,porn"},"shop/fabric":{name:"Fabric Store",terms:"sew"},"shop/farm":{name:"Produce Stand",terms:"farm shop,farm stand"},"shop/fashion_accessories":{name:"Fashion Accessories Store",terms:"bag,cologne,fragrance,hat,jewellery,purfume,purse,scarf,sunglasses,umbrella,wallet,watch"},"shop/fireplace":{name:"Fireplace Store",terms:"fireplace,stove,masonry heater"},"shop/fishing":{name:"Fishing Shop",terms:"bait,fishing line,flies,fly,lure,reel,rod,tackle"},"shop/florist":{name:"Florist",terms:"flower"},"shop/frame":{name:"Framing Shop",terms:"art*,paint*,photo*,frame"},"shop/frozen_food":{name:"Frozen Food",terms:""},"shop/fuel":{name:"Fuel Shop",terms:""},"shop/funeral_directors":{name:"Funeral Home",terms:"undertaker,memorial home"},"shop/furniture":{name:"Furniture Store",terms:"chair,sofa,table"},"shop/games":{name:"Tabletop Game Store",terms:"board game,card game,dice game,game shop,live action role-playing game,miniatures wargame,strategy game"},"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/general":{name:"General Store",terms:"Village Shop"},"shop/gift":{name:"Gift Shop",terms:"souvenir"},"shop/greengrocer":{name:"Greengrocer",terms:"fruit,produce,vegetable"},"shop/hairdresser_supply":{name:"Hairdresser Supply Store",terms:"barber,shampoo,conditioner"},"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:"audio,hi-fi,high fidelity,stereo,video"},"shop/hobby":{name:"Hobby Shop",terms:"manga,figurine,model"},"shop/houseware":{name:"Houseware Store",terms:"home,household,kitchenware"},"shop/hunting":{name:"Hunting Shop",terms:"arrows,bows,bullets,crossbows,rifles,traps"},"shop/interior_decoration":{name:"Interior Decoration Store",terms:""},"shop/jewelry":{name:"Jewelry Store",terms:"bracelet,diamond,earrings,gem,gold,jeweler,jewellery,jeweller,necklace,pins,ring,silver"},"shop/kiosk":{name:"Kiosk",terms:""},"shop/kitchen":{name:"Kitchen Design Store",terms:"cabinets,countertops,sinks"},"shop/laundry":{name:"Laundry",terms:""},"shop/laundry/self_service":{name:"Self-Service Laundry",terms:"Coin Laundry,Laundromat,Coin Wash,Launderette,Washateria"},"shop/leather":{name:"Leather Store",terms:""},"shop/lighting":{name:"Lighting Store",terms:"fluorescent lighting,lamps,LEDs,light fixtures,lightbulbs"},"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/military_surplus":{name:"Military Surplus Store",terms:"armor,army-navy store,army surplus,navy surplus,tactical gear,war surplus shop,weapons"},"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:"tape casettes,CDs,compact discs,vinyl records"},"shop/musical_instrument":{name:"Musical Instrument Store",terms:"guitar"},"shop/newsagent":{name:"Newspaper/Magazine Shop",terms:""},"shop/nutrition_supplements":{name:"Nutrition Supplements Store",terms:"health,supplement,vitamin"},"shop/optician":{name:"Optician",terms:"eye,glasses"},"shop/organic":{name:"Organic Goods Store",terms:""},"shop/outdoor":{name:"Outdoors Store",terms:"camping,climbing,hiking,outfitter,outdoor equipment,outdoor supplies"},"shop/outpost":{name:"Online Retailer Outpost",terms:"online,pick up,pickup"},"shop/paint":{name:"Paint Store",terms:""},"shop/party":{name:"Party Supply Store",terms:"balloons,costumes,decorations,invitations"},"shop/pastry":{name:"Pastry Shop",terms:"patisserie,cake shop,cakery"},"shop/pawnbroker":{name:"Pawn Shop",terms:""},"shop/perfumery":{name:"Perfume Store",terms:"cologne,fragrance,purfume"},"shop/pet_grooming":{name:"Pet Grooming Store",terms:"cat,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:"fireworks"},"shop/radiotechnics":{name:"Radio/Electronic Component Store",terms:"antenna,transistor"},"shop/religion":{name:"Religious Store",terms:""},"shop/scuba_diving":{name:"Scuba Diving Shop",terms:"diving,scuba"},"shop/seafood":{name:"Seafood Shop",terms:"fishmonger"},"shop/second_hand":{name:"Consignment/Thrift Store",terms:"secondhand,second hand,resale,thrift,used"},"shop/sewing":{name:"Sewing Supply Shop",terms:"haberdashery"},"shop/shoes":{name:"Shoe Store",terms:"boots,cleats,clogs,heels,loafers,oxfords,sneakers"},"shop/sports":{name:"Sporting Goods Store",terms:"athletics"},"shop/stationery":{name:"Stationery Store",terms:"card,paper"},"shop/storage_rental":{name:"Storage Rental",terms:"garages"},"shop/supermarket":{name:"Supermarket",terms:"grocery,store,shop"},"shop/tailor":{name:"Tailor",terms:"clothes,suit"},"shop/tattoo":{name:"Tattoo Parlor",terms:"ink"},"shop/tea":{name:"Tea Store",terms:""},"shop/ticket":{name:"Ticket Seller",terms:"box office"},"shop/tiles":{name:"Tile Shop",terms:""},"shop/tobacco":{name:"Tobacco Shop",terms:"cigarettes,cigars"},"shop/toys":{name:"Toy Store",terms:"games"},"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,VHS,video casette"},"shop/watches":{name:"Watches Shop",terms:""},"shop/water_sports":{name:"Watersport/Swim Shop",terms:""},"shop/water":{name:"Drinking Water 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:""},tactile_paving:{name:"Tactile Paving",terms:"blind path,detectable warning surfaces,tactile ground surface indicators,tactile walking surface indicators,truncated domes,visually impaired path"},"telecom/data_center":{name:"Data Center",terms:"computer systems storage,information technology,server farm,the cloud,telecommunications"},"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/artwork/bust":{name:"Bust",terms:"figure"},"tourism/artwork/graffiti":{name:"Graffiti",terms:"Street Artwork,Guerilla Artwork,Graffiti Artwork"},"tourism/artwork/installation":{name:"Art Installation",terms:"interactive art,intervention art,modern art"},"tourism/artwork/mural":{name:"Mural",terms:"fresco,wall painting"},"tourism/artwork/sculpture":{name:"Sculpture",terms:"statue,figure,carving"},"tourism/artwork/statue":{name:"Statue",terms:"sculpture,figure,carving"},"tourism/attraction":{name:"Tourist Attraction",terms:""},"tourism/camp_pitch":{name:"Camp Pitch",terms:"tent,rv"},"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/information/route_marker":{name:"Trail Marker",terms:"cairn,painted blaze,route flag,route marker,stone pile,trail blaze,trail post,way marker"},"tourism/information/terminal":{name:"Information Terminal",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"},"tourism/zoo/petting":{name:"Petting Zoo",terms:"Children's Zoo,Children's Farm,Petting Farm,farm animals"},"tourism/zoo/safari":{name:"Safari Park",terms:"Drive-Through Zoo,Drive-In Zoo"},"tourism/zoo/wildlife":{name:"Wildlife Park",terms:"indigenous animals"},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"},traffic_sign_vertex:{name:"Traffic Sign",terms:"road,highway"},traffic_sign:{name:"Traffic Sign",terms:"road,highway"},"traffic_sign/city_limit_vertex":{name:"City Limit Sign",terms:"town,village,hamlet,boundary,edge,border,road,highway"},"traffic_sign/city_limit":{name:"City Limit Sign",terms:"town,village,hamlet,boundary,edge,border,road,highway"},"traffic_sign/maxspeed_vertex":{name:"Speed Limit Sign",terms:"max speed,maximum speed,road,highway"},"traffic_sign/maxspeed":{name:"Speed Limit Sign",terms:"max speed,maximum speed,road,highway"},"type/multipolygon":{name:"Multipolygon",terms:""},"type/boundary":{name:"Boundary",terms:""},"type/boundary/administrative":{name:"Administrative Boundary",terms:""},"type/enforcement":{name:"Enforcement",terms:""},"type/public_transport/stop_area_group":{name:"Transit Stop Area Group",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/monorail":{name:"Monorail 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:""},"waterway/riverbank":{name:"Riverbank",terms:""},"waterway/boatyard":{name:"Boatyard",terms:""},"waterway/canal":{name:"Canal",terms:""},"waterway/canal/lock":{name:"Canal Lock",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/lock_gate":{name:"Lock Gate",terms:"canal"},"waterway/milestone":{name:"Waterway Milestone",terms:"milestone,marker"},"waterway/river":{name:"River",terms:"beck,branch,brook,course,creek,estuary,rill,rivulet,run,runnel,stream,tributary,watercourse"},"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:"© agentschap Informatie Vlaanderen"},name:"AIV Flanders most recent aerial imagery"},AGIV10cm:{attribution:{text:"© agentschap Informatie Vlaanderen"},name:"AIV Flanders 2013-2015 aerial imagery 10cm"},AGIVFlandersGRB:{attribution:{text:"© agentschap Informatie Vlaanderen"},name:"AIV Flanders GRB"},AIV_DHMV_II_HILL_25cm:{attribution:{text:"© agentschap Informatie Vlaanderen"},name:"AIV Digitaal Hoogtemodel Vlaanderen II, multidirectionale hillshade 0,25 m"},AIV_DHMV_II_SVF_25cm:{attribution:{text:"© agentschap Informatie Vlaanderen"},name:"AIV Digitaal Hoogtemodel Vlaanderen II, Skyview factor 0,25 m"},Bing:{description:"Satellite and aerial imagery.",name:"Bing aerial imagery"},EOXAT2018CLOUDLESS:{attribution:{text:"Sentinel-2 cloudless - https://s2maps.eu by EOX IT Services GmbH (Contains modified Copernicus Sentinel data 2017 & 2018)"},description:"Post-processed Sentinel Satellite imagery.",name:"eox.at 2018 cloudless"},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"},"Maxar-Premium":{attribution:{text:"Terms & Feedback"},description:"Maxar Premium is a mosaic composed of Maxar 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:"Maxar Premium Imagery (Beta)"},"Maxar-Standard":{attribution:{text:"Terms & Feedback"},description:"Maxar 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:"Maxar Standard Imagery (Beta)"},"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-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-TIGER-Roads-2018":{description:"Yellow = Public domain map data from the US Census. Red = Data not found in OpenStreetMap",name:"TIGER Roads 2018"},"USDA-NAIP":{description:"The most recent year of DOQQs from the National Agriculture Imagery Program (NAIP) for each state in the contiguous United States.",name:"National Agriculture Imagery Program"},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"},UrbISOrtho2018:{attribution:{text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB"},name:"UrbIS-Ortho 2018"},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"},"basemap.at-overlay":{attribution:{text:"basemap.at"},description:"Annotation overlay provided by basemap.at.",name:"basemap.at Overlay"},"basemap.at-surface":{attribution:{text:"basemap.at"},description:"Surface layer provided by basemap.at.",name:"basemap.at Surface"},"basemap.at-terrain":{attribution:{text:"basemap.at"},description:"Terrain layer provided by basemap.at.",name:"basemap.at Terrain"},"eufar-balaton":{attribution:{text:"EUFAR Balaton ortofotó 2010"},description:"1940 geo-tagged photography from Balaton Limnological Institute.",name:"EUFAR Balaton orthophotos"},"finds.jp_KBN_2500":{attribution:{text:"GSI KIBAN 2500"},description:"GSI Kiban 2500 via finds.jp. Good for tracing, but a bit older.",name:"Japan GSI KIBAN 2500"},"gsi.go.jp":{attribution:{text:"GSI Japan"},description:"Japan GSI ortho Imagery. Usually better than bing, but a bit older.",name:"Japan GSI ortho Imagery"},"gsi.go.jp_airphoto":{attribution:{text:"GSI Japan"},description:"Japan GSI airphoto Imagery. Not fully orthorectified, but a bit newer and/or differently covered than GSI ortho Imagery.",name:"Japan GSI airphoto Imagery"},"gsi.go.jp_seamlessphoto":{attribution:{text:"GSI Japan seamless photo"},description:"Japan GSI seamlessphoto Imagery. The collection of latest imageries of GSI ortho, airphoto, post disaster and others.",name:"Japan GSI seamlessphoto Imagery"},"gsi.go.jp_std_map":{attribution:{text:"GSI Japan"},description:"Japan GSI Standard Map. Widely covered.",name:"Japan GSI Standard Map"},"helsingborg-orto":{attribution:{text:"© Helsingborg municipality"},description:"Orthophotos from the municipality of Helsingborg 2016, public domain",name:"Helsingborg Orthophoto"},"kalmar-orto-2014":{attribution:{text:"© Kalmar municipality"},description:"Orthophotos for the north coast of the municipality of Kalmar 2014",name:"Kalmar North Orthophoto 2014"},"kalmar-orto-2016":{attribution:{text:"© Kalmar municipality"},description:"Orthophotos for the south coast of the municipality of Kalmar 2016",name:"Kalmar South Orthophoto 2016"},"kalmar-orto-2018":{attribution:{text:"© Kalmar municipality"},description:"Orthophotos for urban areas of the municipality of Kalmar 2018",name:"Kalmar Urban Orthophoto 2018"},kelkkareitit:{attribution:{text:"© Kelkkareitit.fi"},description:"Kelkkareitit.fi snowmobile trails from OSM (Nordic coverage)",name:"Nordic snowmobile overlay"},"lantmateriet-orto1960":{attribution:{text:"© Lantmäteriet, CC0"},description:"Mosaic of Swedish orthophotos from the period 1955–1965. Older and younger pictures may occur.",name:"Lantmäteriet Historic Orthophoto 1960"},"lantmateriet-orto1975":{attribution:{text:"© Lantmäteriet, CC0"},description:"Mosaic of Swedish orthophotos from the period 1970–1980. Is under construction.",name:"Lantmäteriet Historic Orthophoto 1975"},"lantmateriet-topowebb":{attribution:{text:"© Lantmäteriet, CC0"},description:"Topographic map of Sweden 1:50 000",name:"Lantmäteriet Topographic Map"},"linkoping-orto":{attribution:{text:"© Linköping municipality"},description:"Orthophotos from the municipality of Linköping 2010, open data",name:"Linköping Orthophoto"},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 1950–1980"},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"},skoterleder:{attribution:{text:"© Skoterleder.org"},description:"Snowmobile trails",name:"Snowmobile map Sweden"},"stamen-terrain-background":{attribution:{text:"Map tiles by Stamen Design, under CC BY 3.0. Data by OpenStreetMap, under ODbL"},name:"Stamen Terrain"},"stockholm-orto":{attribution:{text:"© Stockholm municipality, CC0"},description:"Orthophotos from the municipality of Stockholm 2016, CC0 license",name:"Stockholm Orthophoto"},"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:{"bw-facebook":{name:"Mapping Botswana on Facebook",description:"Page of OpenStreetMap in Botswana"},"bw-twitter":{name:"Mapping Botswana on Twitter",description:"Twitter of OpenStreetMap in Botswana"},"ym-Centre-Universitaire-de-Recherche-et-dApplication-en-Tldtection-CURAT-de-lUniversit-Felix-Houphouet-Boigny":{name:"YouthMappers CURAT",description:"YouthMappers chapter at Centre Universitaire de Recherche et d'Application en Télédétection (CURAT) de l'Université Felix Houphouet Boigny",extendedDescription:"Our chapter aim is to promote the use of collaborative free mapping and the use of openstreetmap data in the field of research and their application in the implementation of tools for decision-making. Help students produce their own data of their research."},"ym-The-Gambia-YMCA-University-of-the-Gambia":{name:"Connected YouthMappers",description:"YouthMappers chapter at The Gambia YMCA / University of the Gambia",extendedDescription:"Connected YouthMappers is comprised of dedicated young Gambians who aspire to change and aid national development."},"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."},"ym-Kwame-Nkrumah-University-of-Science-and-Technology":{name:"Kwame Nkrumah University of Science and Technology YouthMappers",description:"YouthMappers chapter at Kwame Nkrumah University of Science and Technology"},"ym-University-of-Cape-Coast":{name:"UCC Geographical Society",description:"YouthMappers chapter at University of Cape Coast",extendedDescription:"We are a society that encompasses all students who are reading and read geography in the Department of Geography and Regional Planning at the University of Cape Coast. Our main aim is to promote interest in the discipline inside and outside of the classroom. Our motto is “We comprehend the Earth and its inhabitants.”"},"ym-University-of-Energy-and-Natural-Resources":{name:"Eco-Club",description:"YouthMappers chapter at University of Energy and Natural Resources",extendedDescription:"To provide a sound education to all citizens about the deteriorating environment and provide utmost use of recreation of the environment for human survival."},"ym-University-of-Ghana":{name:"University of Ghana YouthMappers",description:"YouthMappers chapter at University of Ghana",extendedDescription:"UG YouthMappers consists of both graduate and undergraduate students possessing knowledge and skills in GIS and Remote Sensing. The club is composed of an energetic team that is poised to address social issues and mitigate environmental problems through mapping. Our fundamental principles are capacity building, empowerment and teamwork."},"ym-University-of-Mines-and-Technology":{name:"UMaT YouthMappers",description:"YouthMappers chapter at University of Mines and Technology",extendedDescription:"UMaT YouthMappers is a group of volunteer students who seek to grant students the opportunity to improve skills in the field of mapping & creating open geographic data and analyses that address locally defined development challenges worldwide."},"ym-General-Lansana-Conte-University":{name:"YouthMappers General Lansana Conte University",description:"YouthMappers chapter at General Lansana Conte University",extendedDescription:"The YouthMappers of the University General Lansana Conté is a non profit community willing to contribute to Map Guinea and others part of the world. We are promoting the use of GIS and Open data to build decision support tools. We also work to build capacities among the students and local communities."},"ym-Institute-of-Science-and-Veterinary-Medicine":{name:"YouthMappers ISSMV Dalaba",description:"YouthMappers chapter at Institute of Science and Veterinary Medicine",extendedDescription:"YouthMappers ISSMV Dabala is a non profit organisation working to promote humanitarian mapping and the use of open sources and open data to build decision making tools in Guinea."},"ym-Universit-de-NZrkor":{name:"Youthmappers à N'Zérékoré",description:"YouthMappers chapter at Université de N'Zérékoré",extendedDescription:"YouthMappers est un groupe qui permet de faire la cartographie des communautés enclavées et à la prise des décisions en cas de catastrophes ou épidémies. Elle permet aussi la production et l'utilisation des données en accès gratuit."},"ym-Dedan-Kimathi-University-of-Technology":{name:"GDEV",description:"YouthMappers chapter at Dedan Kimathi University of Technology",extendedDescription:"GDEV is a group of enthusiastic GIS group at DeKUT that aims at helping students share, engage and learn from each other in matters geospatial"},"ym-Jomo-Kenyatta-University-of-Agriculture-and-Technology":{name:"Association of Geomatics Engineering Students",description:"YouthMappers chapter at Jomo Kenyatta University of Agriculture and Technology",extendedDescription:"The Association of Geomatics Engineering Students (AGES), aims at promoting GIS products and services as well as training students on the use of the same. It not only promotes socialization between the students and practicing professionals, but also provides a platform for exchanging new ideas for holding new GIS and surveying events and training at the university."},"ym-Karatina-University":{name:"Nature Club Karatina University",description:"YouthMappers chapter at Karatina University",extendedDescription:"This chapter aims to bring together all GIS enthusiasts.They include environment experts, wildlife experts, aquatic and tourism officers, just to mention a few. Its main aim is to provide a platform where students can learn from each other and, in the process, understand how to integrate the GIS skills in their various career paths as well as provide solutions to various environmental related challenges."},"ym-Kenyatta-University":{name:"Kenyatta University GIS Club",description:"YouthMappers chapter at Kenyatta University",extendedDescription:"Kenyatta University GIS Club (KUGISC) was founded on 28th October 2016, with more than 200 students and staff from all faculty within campus as members. We are committed to empower members with spatial knowledge, skills and expertise required in understanding the Earth. We help in mapping resources within the university by incorporating geospatial data in their projects as well as fieldwork data collection."},"ym-Moi-University":{name:"Geography Students Association",description:"YouthMappers chapter at Moi University",extendedDescription:"The Geography Students Association at Moi University (GEOSAMU) explores, discovers and aims at developing the entire world through the young Geo-Spatial analysts.  GEOSAMU is part of the Department of Geography."},"ym-Technical-University-of-Kenya":{name:"Geospatial Science Student Association",description:"YouthMappers chapter at Technical University of Kenya",extendedDescription:"It's a geographical information based group with very passionate students in the relevant fields of study. We do training to members on emerging trends in the market and keep up with technological advancements"},"ym-University-of-Nairobi":{name:"Geospatial Engineering Students Association",description:"YouthMappers chapter at University of Nairobi",extendedDescription:"UN students are working with the local OSM community, Map Kibera, and GrouthTruth to learn about open mapping and contribute data for needs in their urban communities."},"ym-African-Methodist-Episcopal-University":{name:"YouthMappers-AMEU",description:"YouthMappers chapter at African Methodist Episcopal University"},"ym-Cuttington-University":{name:"Cuttington University YouthMappers",description:"YouthMappers chapter at Cuttington University",extendedDescription:"The YouthMappers at Cuttington University, Suakoko, and Bong County comprised of Students from three different departments; namely, the Department of Natural Resources Management “DONRM”, Department of Environmental Sciences, and the Department of Natural Sciences. Since the establishment of the Chapter in February 2017, the overall membership is  20 students, with each department containing 5 students."},"ym-Grand-Gedeh-County-Community-College":{name:"YouthMappers at Grand Gedeh County Community College",description:"YouthMappers chapter at Grand Gedeh County Community College",extendedDescription:"The Youth Mappers of GGCCC sole intent is to put  places in and around Liberia  that are not on the map. We gather youths from the college within the Grand Gedeh Community College to make it their duties to unite and bring these places to the spot light geographically."},"ym-Nimba-County-Community-College":{name:"Nimba County Community College Youth Mappers",description:"YouthMappers chapter at Nimba County Community College"},"ym-Stella-Maris-Polytechnic":{name:"YouthMappers-SMP",description:"YouthMappers chapter at Stella Maris Polytechnic"},"ym-University-of-Liberia-YouthMappers":{name:"University of Liberia YouthMappers",description:"YouthMappers chapter at University of Liberia YouthMappers",extendedDescription:"The University of Liberia YouthMappers is a chapter organization of the Global YouthMappers. We are a nonprofit student mapping organization focus on mapping for Liberia’s development and the World at large. The purpose of this organization shall be to utilize technology and geospatial knowledge as means of creating and developing maps; collecting and analyzing data that will address local and worldwide challenges. Our aim is to support and create opportunity for students to develop interest and skills in the fields of mapping. We envision a united student community that are collaborative, active and are willing to work with the University of Liberia YouthMappers in order to better the lives of others."},"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."},"ym-University-of-Malawi":{name:"Chanco Malawi YouthMappers",description:"YouthMappers chapter at University of Malawi",extendedDescription:"Chanco Malawi YouthMappers is the student mapping organization for the University of Malawi's Chancellor College. The students in this chapter focus on mapping for Malawi's development and science needs."},"ym-Universit-des-Sciences-Sociale-et-de-Gestion-de-Bamako":{name:"Etudiant au Laboratoire HoPE",description:"YouthMappers chapter at Université des Sciences Sociale et de Gestion de Bamako"},"ym-Universidade-Eduardo-Mondlane":{name:"Comunidade YouthMappers Moçambique",description:"YouthMappers chapter at Universidade Eduardo Mondlane",extendedDescription:"We are a student group that intends to join Mozambican society to create a resilient community of humanitarian mapping. The community intend to map the physical occupation of our Country and create open geographic data, accessible to the public and able to be used in several areas without associated costs."},"ym-Namibia-University-of-Science-and-Technology":{name:"Geoinformation Technology Student Society",description:"YouthMappers chapter at Namibia University of Science and Technology"},"ym-Abia-State-University":{name:"AbsuMappersTeam",description:"YouthMappers chapter at Abia State University",extendedDescription:"AbsuMappersTeam is  voluntary team of map enthusiast ,using openstreetmap,GIS and other open source geospatial techno;ogy to solve problems.It is a dedicated for disaster response using OpenStreetMap.It is a  professional mentoring  and empowerment platform for  those with passion for GIS and Mapping.It is a community of  volunteers for geospatial data creation,field data collection and mapping.The team was co-founded by Victor N.Sunday(the Team mentor) and Professor J.U.Ogbonna ,the team coordinator and faculty Advisor. AbsuMapperTeam is an affiliate of UniiqueMappersTeam-Port Harcourt.The team stands to support sustainable development using geospatial  technology"},"ym-Ahmadu-Bello-University":{name:"ABU Geomappers",description:"YouthMappers chapter at Ahmadu Bello University",extendedDescription:"We are a group of Data driven Humanitarian mappers, who are dedicated to rendering humanitarian service in response to disaster and mitigation. We are glad to contribute our expertise and knowledge through mapping, and helping to spread #OpenEvangelism through Training, and collaboration."},"ym-Federal-School-of-Surveys":{name:"OyoMappersTeam (OMT) Oyo",description:"YouthMappers chapter at Federal School of Surveys"},"ym-Federal-University-of-Technology-Akure":{name:"YouthMappers Futa Space Club",description:"YouthMappers chapter at Federal University of Technology, Akure",extendedDescription:"Our mission is to raise the next generation of Space Leaders. Activities include research and capacity building in Remote Sensing, GIS, Climate Change, Astronomy, Cosmology, Space Engineering, Global Navigation, Robotics and Space Education."},"ym-Ignatius-Ajuru-University-of-Education":{name:"IgnatiusMappersTeam (IMT)",description:"YouthMappers chapter at Ignatius Ajuru University of Education",extendedDescription:"We are a YouthMappers Chapter of Ignatius Ajuru University of Education involved in crowdsourced mapping of our environment and remote mapping of resilient communities.We are a team of volunteers using openstreetmap and other open Geospatial source for mapping."},"ym-University-of-Nigeria-Nsukka":{name:"LionMappersTeam (LMT) Nsukka",description:"YouthMappers chapter at University of Nigeria, Nsukka",extendedDescription:"The LionMappersTeam is an affiliate of YouthMappers Network, with the sole aim of providing members the opportunity to learn and improve their skills in the field of mapping science and to create open geographic data and analysis that addresses locally defined challenges globally. It is a team of volunteers for crowdsourced mapping and geographic information provision using Openstreetmap, citizen science  and other geospatial  technology for research, training and response to resilient community challenges. We are involved in GIS and Remote Sensing Applications and Research.Paticipatory GIS and Citizen Science,field mapping ,training workshops and outreaches to High Schools."},"ym-University-of-Port-Harcourt":{name:"UniqueMappersTeam (UMT) Port Harcourt",description:"YouthMappers chapter at University of Port Harcourt",extendedDescription:"UniqueMappersTeam(UMT)Port Harcourt  is an action group and a team of volunteers for a collaborative online mapping targeted at training and empowering members with trending mapping skills  to create open geospatial data and analysis that addresses locally defined challenges for geoinformation and to provide humanitarian mapping  services to resilient communities in Niger Delta,Nigeria and elsewhere.We promote Crowdsoucred Mapping and Geographic information volunteering using OpenStreetMap(OSM) platform and other accessible platforms for Rapid Response Mapping,Disaster Mapping,Geo-intelligence Mapping,Map updates and training.Its an affiliate Campus chapter of Humanitarian OpenStreetMap Team(HOT).It is a project-task team of YouthMappers that provide opportunity for members to learn and improve their skills in Geoinformatics so as to explore global opportunities in the field of Mapping and Geoinformation."},"ym-University-of-Nigeria-Enugu-Campus":{name:"LionMappersTeam (LMT) Enugu",description:"YouthMappers chapter at University of Nigeria, Enugu Campus",extendedDescription:"The LionMappersTeam(LMT)Enugu Campus is an affiliate of YouthMappers Network, with the sole aim of providing members the opportunity to learn and improve their skills in the field of Geoinformatics and to create open geographic data and analysis that addresses locally defined challenges globally. It is a team of volunteers for Crowdsourced Mapping and Geographic Information provision using Openstreetmap, Citizen Science and other Geospatial Technology for research, training and response to resilient community challenges. We are involved in Web-Cartography, GIS and Remote Sensing Applications and ResearchWe are passionate about Volunteered Geographic Information.Paticipatory GIS and Citizen Science.Our major activities include online crowdsourced-Cartography, Field Mapping ,Training workshops and outreaches to High School as well as Humanitarian/Disaster Response Mapping."},"ym-Insititue-d-Enseignement-Superieur-de-Ruhengeri":{name:"YouthMappers at INES Ruhengeri",description:"YouthMappers chapter at Insititue d' Enseignement Superieur de Ruhengeri",extendedDescription:"We are students from Land Administration and Management and Land survey Departments from INES-Ruhengeri. We are engaged in mapping activities that create the changes toward sustainable development in our community."},"ym-University-of-Rwanda-Huye-Campus":{name:"Rwanda YouthMappers",description:"YouthMappers chapter at University of Rwanda - Huye Campus",extendedDescription:"Based on the commitment and the purpose of promoting mapping, and the information from YouthMappers public talks, we have organized as students in Geography department who are committed in mapping to found a chapter of our Campus. We have supported by our Facilitator Dr. Gaspard Rwanyiziri (Director of CGIS-Rwanda) and various lecturer mentors."},"ym-Institut-Suprieur-de-Management-Kolda":{name:"Les Femmes Leaders de ISM/Kolda",description:"YouthMappers chapter at Institut Supérieur de Management Kolda",extendedDescription:"Les Femmes Leaders de ISM/Kolda is an all-female mapping group in southern Senegal looking to put Kolda and surrounding villages on the map and better understand how to use OSM."},"ym-Universit-Gaston-Berger":{name:"YouthMappers at UGB",description:"YouthMappers chapter at Université Gaston Berger",extendedDescription:"YouthMappers UGB is made up of young students and researchers who are passionate about mapping. Our aim is to improve students' skills in the field of cartography and to participate in the creation of open geographic data that responds to development challenges around the world and particularly in Africa."},"ym-Fourah-Bay-College":{name:"Student's Geographical Association",description:"YouthMappers chapter at Fourah Bay College",extendedDescription:"The Student's Geographical Association- YouthMappers is an association of Fourah Bay College Students with the common goals of mapping out vulnerable places in Sierra Leone and the world at large for relief and other beneficial purposes,carry out Research and other educative endeavors. The chapter consists of young people with great ideas, development oriented with the capacity to relate with each other, comprehend and implement sustainable developmental projects as a team."},"ym-Njala-University-Freetown-Campus":{name:"Njala Freetown YouthMappers",description:"YouthMappers chapter at Njala University, Freetown Campus",extendedDescription:"We are students of Njala University Freetown Campus, studying Information Technology under the department of Physics and Computer Science. and we are located at Henry Street Freetown, Sierra Leone."},"ym-Njala-University-Njala-Campus":{name:"YouthMappers Njala University, Njala Campus",description:"YouthMappers chapter at Njala University, Njala Campus"},"ym-University-of-Pretoria":{name:"Centre for Geoinformation Science",description:"YouthMappers chapter at University of Pretoria",extendedDescription:"The students who map Pretoria are supported by the University of Pretoria's Centre for Geoinformation Science, a platform from where the excellence of UP individuals and teams involved in geographic information science (GISc) research, education and training, professional development and community engagement is encouraged and strengthened through collaborations, education and training and  alliances within South Africa and abroad."},"ym-Ardhi-University":{name:"ARU Mapper",description:"YouthMappers chapter at Ardhi University",extendedDescription:"As upcoming geospatial data consultants we seek to educate and provide advice to the society on how they can use spatial data not only as a form of location but a tool of decision making and predict different hazardous and climatical changes which may harm them or future genarations."},"ym-Institute-of-Finance-Management":{name:"IFM mappers",description:"YouthMappers chapter at Institute of Finance Management",extendedDescription:"This is a new  chapter at out institute and we are looking forward to use our financial education that we are receiving here at the campus  and link ig with the environment in order to develop our sustainable environment towards helping the community  with the effects of our environment in a financial ways by converting them into numbers. this is widely explained in ecosystem accounting and environmental accounts"},"ym-Institute-of-Rural-Development-Planning-Mwanza":{name:"Youth Mappers Chapter at Institute of Rural Development Planning - Lake Zone Centre",description:"YouthMappers chapter at Institute of Rural Development Planning Mwanza"},"ym-Institute-of-Rural-Development-Planning":{name:"Mipango YouthMappers Chapter",description:"YouthMappers chapter at Institute of Rural Development Planning",extendedDescription:"Mipango YouthMappers Chapter was introduced at IRDP on 3rd July, 2017 by Dr.Domitilla Bashemera. The founding members were  300 (190 males and 110 female) Bachelor Degree students, who were registered as members of the Chapter. Gerald Zacharia is the president of the chapter and Juster Lugira is Vice President."},"ym-Open-University-of-Tanzania":{name:"Youth Mappers at Open University of Tanzania",description:"YouthMappers chapter at Open University of Tanzania",extendedDescription:"Youth Mappers at Open University of Tanzania\n\nHad been founded by members and students of Open University of Tanzania in Department of Geography who are mainly need to improve their career and help young community through joint and partnership projects with local community groups such as Mikoko Scout Group (www.msg.or.tz) and start cooperation with international colleges and universities for exchange programs in relation to Geography Studies as some programs prepared by Mikoko Scout Group which will link local university and other universities of the same interest through International Nature & Environmental Youth Camp 2019 (www.campsite.msg.or.tz/nature.html )\n\nOur chapter will soon be recognized as youth network program that will open opportunity for students to study and conduct research studies at a local levels."},"ym-Sokoine-University-of-Agriculture":{name:"SMCoSE YouthMappers",description:"YouthMappers chapter at Sokoine University of Agriculture",extendedDescription:"A Chapter comprising of Environmental sciences and management students and Geography studies under the dept. of Geography and  we will be using mapping techniques, based on systems concepts and theories, can be used to facilitate, explore, and capture the different understandings of the relationships, perspectives, and boundaries involved in environmental sustainability to obtain a more complete comprehension of the concept and develop plans for action."},"ym-University-of-Dar-es-Salaam":{name:"YouthMappers at University of Dar es Salaam",description:"YouthMappers chapter at University of Dar es Salaam",extendedDescription:"The purpose of the University of Dar es Salaam YouthMappers  is to use and promote open source data and GIS technologies to map potential disaster areas, provide resources for emergency management, connect its members with open source and GIS organizations in the city of Dar es Salaam, and serve any upcoming needs of our project partners ."},"ym-Busitema-University":{name:"Good Mappers",description:"YouthMappers chapter at Busitema University",extendedDescription:"Good mappers is a team of students in Busitema University. Its main objective is to create a community of experienced mappers who can contribute to the world map."},"ym-Gulu-University":{name:"CSGU Mappers",description:"YouthMappers chapter at Gulu University",extendedDescription:"The CSGU Mappers are the Computing Society at Gulu University. This chapter is creative, passionate, innovative and ready to map Uganda and the world at large, beyond other people's imagination."},"ym-Kumi-University":{name:"Ever Last YouthMappers",description:"YouthMappers chapter at Kumi University",extendedDescription:"This energetic group of students organizes within the faculty of Science and Information Technology."},"ym-Makerere-University":{name:"Geo YouthMappers",description:"YouthMappers chapter at Makerere University",extendedDescription:"Geo YouthMappers is a Makerere University based mapping chapter esteemed to apply the spatial conception to the real world.We have collaborated on various mapping events with OSM. Our main aim is the desire to simplify data and make it readily available mostly for disaster preparedness.\"We map the world and change lives."},"ym-Mbarara-University-of-Science-and-Technology":{name:"MUST Street Mappers",description:"YouthMappers chapter at Mbarara University of Science and Technology",extendedDescription:"MUST Street Mappers is a Youth Mappers chapter at the Mbarara University of Science and Technology that is based on making our country and the world at large a better place through mapping. We base on collected information to notice patterns and data mine to present relevant and beneficial information to society."},"ym-St.-Augustine-International-University":{name:"YouthMappers at St Augustine International University",description:"YouthMappers chapter at St. Augustine International University"},"ym-Uganda-Christian-University-Mbale-Campus":{name:"Mappers for Life",description:"YouthMappers chapter at Uganda Christian University Mbale Campus",extendedDescription:"We are Team Mappers for life! Please come and join us as we map together!\" This group works from the Department of Information Technology at the UCU."},"ym-Uganda-Pentecostal-University":{name:"HiTech Youth Mappers",description:"YouthMappers chapter at Uganda Pentecostal University",extendedDescription:"A new Youthmappers Chapter in Western Uganda. Ready to map and provide open data with OpenStreetMap for development purposes."},"ym-St.-Mawaggali-Trades-Training-Institute":{name:"MawaggaliMappers",description:"YouthMappers chapter at St. Mawaggali Trades Training Institute",extendedDescription:"We are the youthappers chapter at St. Mawaggali trades in choma who are want to contribute the different humantarian tasks to serve lives through mapping."},"ym-The-University-of-Zambia":{name:"YouthMappers Unza",description:"YouthMappers chapter at The University of Zambia"},"ym-University-of-Zimbabwe":{name:"UZMappers",description:"YouthMappers chapter at University of Zimbabwe",extendedDescription:"UzMappersTeam Zimbabwe is a team of Volunteers using OpenStreetMap for Open Data Mapping and Humanitarian Disaster response mapping .The team empowers its members with open source geospatial technology skills."},"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!"},"ym-Asian-University-for-Women":{name:"YouthMappers at AUW",description:"YouthMappers chapter at Asian University for Women",extendedDescription:"The Asian University for Women seeks to graduate women who will be skilled and innovative professionals, service-oriented leaders in the businesses and communities in which they will work and live, and promoters of intercultural understanding and sustainable human and economic development in Asia and throughout the world."},"ym-Dhaka-College":{name:"YouthMappers Daka College",description:"YouthMappers chapter at Dhaka College",extendedDescription:"YouthMappers DhakaCollege is an approach by students to help mapping vulnerable areas of the world as a part of Humanitarian Action. YouthMappers  gives the opportunity to the students for helping people and using mapping for humanitarian purposes. This open geographic data can be used for educational, navigational and other humanitarian purposes. Happy mapping."},"ym-Dhaka-University":{name:"Openstreetmap YouthMappers",description:"YouthMappers chapter at Dhaka University",extendedDescription:"It's a great privilege for the students of University of Dhaka to map for humanitarian purposes. Our chapter gives the opportunity to the students for helping people and use mapping for humanitarian purposes."},"ym-Eastern-University":{name:"YouthMappers at Eastern University",description:"YouthMappers chapter at Eastern University",extendedDescription:"YouthMappers at Eastern University, Bangladesh has been formed with a view to assisting people during humanitarian crisis. The students, likewise other mappers of the world, are promised to assist people in using the map for educational, navigational and other humanitarian purposes."},"ym-Jahangirnagar-University":{name:"YouthMappers at IRS, Jahangirnagar University",description:"YouthMappers chapter at Jahangirnagar University"},"ym-Khulna-University":{name:"Openstreetmap",description:"YouthMappers chapter at Khulna University",extendedDescription:"KU students and faculty from multiple disciplines are experienced at creating open data for OSM to address local challenges of development, including food security and other topics."},"ym-Rajshahi-University-of-Engineering-Technology":{name:"YouthMappers at RUET",description:"YouthMappers chapter at Rajshahi University of Engineering & Technology",extendedDescription:"The \"YouthMappers at RUET\" is a humanitarian mapping group of students of Rajshahi University of Engineering & Technology (RUET) to share, develop and practice the knowledge of GIS.  This group encourages using open source geospatial data and platform to make solution to reach the most vulnerable group of the world."},"ym-Sherubtse-College":{name:"Geographical Society",description:"YouthMappers chapter at Sherubtse College",extendedDescription:"The Geographical Society, in the Department of Geography & Planning, Sherubtse College, Royal University of Bhutan, with support from the Center for Climate Change and Spatial Information, has made several efforts to create awareness and address important issues at the local and national level. We now join hands with the international student-centered YouthMappers network on \"Mapping for Resilience\" and contributing to a global 'Happiness'!"},"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-forum":{name:"OpenStreetMap India forum",description:"OpenStreetMap India web forum"},"osm-india-github":{name:"OpenStreetMap India GitHub",description:"Code with us: {url}"},"OSM-india-mailinglist":{name:"OpenStreetMap India Mailinglist",description:"Talk-in is the official Mailinglist for Indian Community"},"osm-india-telegram":{name:"OpenStreetMap India Telegram",description:"Join our family: {url}"},"OSM-india-twitter":{name:"OpenStreetMap India Twitter",description:"We are just a tweet away: {url}"},"osm-india-website":{name:"OpenStreetMap India",description:"Mappers and OpenStreetMap users in India"},"osm-india-wiki":{name:"OpenStreetMap Wikiproject India",description:"Everything you need to know about mapping in India: {url}"},"osm-india-youtube":{name:"OpenStreetMap India Youtube",description:"Subscribe to our channel: {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-Puducherry-Mailing-List":{name:"Free Software Hardware Movement - Mailing List",description:"FSHM Puducherry mailing list to discuss mapping in Puducherry and other things.",extendedDescription:"FSHM organizes events relating to free software/hardware, technology, activism and OpenStreetMap."},"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."},"ym-Gujarat-University":{name:"CCIM at Ahmedabad",description:"YouthMappers chapter at Gujarat University"},"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!"},"ym-Universitas-Negeri-Makassar":{name:"Kontur Geografi",description:"YouthMappers chapter at Universitas Negeri Makassar"},"ym-University-Muhammadiyah-Surakarta":{name:"SpaceTime",description:"YouthMappers chapter at University Muhammadiyah Surakarta",extendedDescription:"SpaceTime is a community mapping in the Faculty of Geography of Muhammadiyah University of Surakarta. SpaceTime was founded by Bruce Maldy Pratama, Mukhlis Akbar and Irfandi Fauzi. They are active students in the Faculty of Geography University Muhammadiyah Surakarta."},"osm-iran-aparat":{name:"OpenStreetMap Iran Aparat",description:"Subscribe to our channel at {url}",extendedDescription:"A good resource of videos about anything related to OpenStreetMap. Mainly in Persian."},"osm-iran-forum":{name:"OpenStreetMap Iran web forum",description:"OpenStreetMap Iran web forum",extendedDescription:"A web forum for OpenStreetMap users in Iran. Feel free to ask questions and discuss with others!"},"osm-iran-telegram":{name:"OpenStreetMap Iran Telegram",description:"You're welcome to join our Telegram channel at {url}. We also have a supergroup of many OSMers interested in Iran. Find its link in bio of channel."},"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-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!"},"ym-Institute-of-Crisis-Management-Studies":{name:"Institute of Crisis Management Studies YouthMappers",description:"YouthMappers chapter at Institute of Crisis Management Studies",extendedDescription:"To develop Crisis Mappers to assist during disaster situations."},"ym-Kathmandu-University":{name:"Geomatics Engineering Society,GES",description:"YouthMappers chapter at Kathmandu University",extendedDescription:"Geomatics Engineering Society (GES) established in 2008 A.D is a departmental club under Department of Civil and Geomatics Engineering (DCGE) at Kathmandu University. GES acts as a platform to develop the skills of students apart from their educational activities by focusing on activities like technical trainings, seminars, talk programs and interaction with experts from related field, sports activities etc."},"ym-Tribhuvan-University":{name:"Geomatics Engineering Students Association",description:"YouthMappers chapter at Tribhuvan University",extendedDescription:"This organization is the student forum of Geomatics Engineering students of Tribhuvan University , Institute of Engineering on the Pashchimanchal campus. Established since the beginning of the degree program, students have been active in mapping and leadership and are thrilled to be a part of the YouthMappers network."},"OSM-Asia-mailinglist":{name:"OpenStreetMap Asia Mailinglist",description:"Talk-asia is the official Mailinglist for Asian Community"},"osm-asia-telegram":{name:"OpenStreetMap Asia Telegram",description:"Join our family: {url}"},"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"},"ym-Far-Eastern-University-Institute-of-Technology":{name:"Junior Philippines Computer Society",description:"YouthMappers chapter at Far Eastern University -Institute of Technology",extendedDescription:"FEU has been recognized as one of the leading universities in the Philippines. Its mission centers on producing graduates who have contributed to the advancement of the country. The university continuously challenges itself to raise the bar of excellence to achieve a top-tier status not only in the Philippines but also in the South East Asian region"},"ym-University-of-the-Philippines-Resilience-Institute":{name:"YouthMappers UP Resilience Institute",description:"YouthMappers chapter at University of the Philippines Resilience Institute",extendedDescription:"The UP Resilience Institute was established in 2016 with a mission statement to empower local communities through multidisciplinary research and actions toward resilience. Through UP NOAH Center, and the help of different organizations, we have provided building exposure maps for 17 provinces out of the 82 and uploaded more than 4 million footprints to Open Street Maps."},"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-south-korea-telegram":{name:"OSM South Korea Telegram",description:"Unofficial Channnel for OpenStreetMap contributors, communities, and users in South Korea to share and discuss."},"OSM-sri-lanka-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-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"},"ym-Queen-Mary-University-of-London":{name:"Queen Mary YouthMappers",description:"YouthMappers chapter at Queen Mary University of London",extendedDescription:"This chapter will be part of the activities of the Queen Mary Geography Society."},"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"},"ym-Heidelberg-University":{name:"disastermappers heidelberg",description:"YouthMappers chapter at Heidelberg University",extendedDescription:"Disastermappers Heidelberg was founded in 2014 as a student initiative to build a platform for exchange between students, researchers and humanitarian actors. Disastermappers are a member of Missing Maps and are organizing mapathons, workshops and webinars in Heidelberg and beyond and support HOT and Missing Maps through research and applications."},"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"},"is-facebook":{name:"OSM Iceland on Facebook",description:"Page of OpenStreetMap in Iceland"},"is-mailinglist":{name:"Talk-is Mailing List",description:"Talk-is is the official mailing list for the Icelandic OSM community"},"is-twitter":{name:"OSM Iceland on Twitter",description:"Twitter of OpenStreetMap in Iceland"},"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"},"ym-Politecnico-di-Milano":{name:"PoliMappers",description:"YouthMappers chapter at Politecnico di Milano",extendedDescription:"PoliMappers is a volunteer students’ association based at Politecnico di Milano. The mission of the group is to train and motivate the next generation of volunteer mappers and to do mapping using free and open source software within the university as well as primary and secondary schools."},"ym-Yarmouk-University":{name:"YouthMappers at YU",description:"YouthMappers chapter at Yarmouk University",extendedDescription:"YouthMappers chapter at YU is the first mapping group in the Middle East and North Africa region where refugees, drought, and poverty are rising crises and in urgent need for humanitarian mapping  activities to mitigate the consequences of such crises. YU Mappers are encouraged to use open data to address challenges in MENA region to bring relief and development to target areas within the region."},"kosovo-telegram":{name:"OpenStreetMap Kosovo on Telegram",description:"Semi-official all-Kosovo Telegram public group. We welcome all mappers from anywhere in any language."},"ym-Universit-Mohammed-V-Rabat":{name:"Brahmapoutre at Rabat",description:"YouthMappers chapter at Université Mohammed V Rabat",extendedDescription:"This chapter sees participation in the YouthMappers program as an oppourtunity to share our knowlege create new working relationships with other chapters in different countries"},"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"},"no-telegram":{name:"@OSM_no on Telegram",description:"OpenStreetMap Norway Telegram chat"},"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"},"pt-mailinglist":{name:"Talk-pt Mailing List",description:"Talk-pt is the official mailing list for the Portuguese OSM community"},"pt-telegram":{name:"OpenStreetMap Portugal no Telegram",description:"Telegram Group of the Portuguese OpenStreetMap community {url}"},"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"},"si-twitter":{name:"OpenStreetMap Slovenia Twitter",description:"Follow OpenStreetMap Slovenia On Twitter: {url}"},"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"},"ym-Universidad-Autonoma-de-Madrid":{name:"YouthMappers at UAM",description:"YouthMappers chapter at Universidad Autonoma de Madrid"},"ym-Universidad-Politcnica-de-Madrid":{name:"Mapeo Humanitario",description:"YouthMappers chapter at Universidad Politécnica de Madrid",extendedDescription:"Geo-volunteering group formed at Moncloa Campus on November 2017. Around 20 members from three Universities (Complutense, CEU and UPM). Undergraduate students, MSc and PhD students collaborate together with organizations (MSF, Acción contra el Hambre,...) supported by trainers from Geoinquietos. Official recognition by UPM as Educative Innovation Project (Code  IE1718.0411)"},"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}"},"ym-Istanbul-Technical-University":{name:"YouthMappers ITU",description:"YouthMappers chapter at Istanbul Technical University",extendedDescription:"YouthMappers ITU is an interdisciplinary and collaborative student community to promote humanitarian mapping for vulnerable settlements and aims to develop and share strategic and innovative spatial information for the future cities by using geographical information systems and open data."},"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"},"ym-University-of-Exeter":{name:"University of Exeter British Red Cross Missing Maps",description:"YouthMappers chapter at University of Exeter",extendedDescription:"We are a team of enthusiastic Geographers with comprehensive knowledge of GIS. We are passionate about supporting the British Red Cross Society with various humanitarian aid efforts. We are also important teachers of the significance of mapping remotely sensed data and how this helps on the ground. Our mapathons have themed academic focuses that highlight the different GIS research in our geography department, while also functioning as employability awareness events which we use to invite speakers in to talk about their GIS/British Red Cross careers."},"ym-University-of-Warwick":{name:"University of Warwick Resilience Mapping Society",description:"YouthMappers chapter at University of Warwick",extendedDescription:"We are a group of enthusiastic mappers based at Warwick University. Our aim is to get people excited about humanitarian mapping and help them understand the impact this activity has on the field. We are closely aligned with Missing Maps and Doctors Without Borders UK and focus on HOT tasks in our mapping activities and workshops. Our mapathons are listed on the Missing Maps page whenever they are scheduled."},"ym-Sacred-Heart-Junior-College":{name:"Youth Mappers at Sacred Heart Junior College",description:"YouthMappers chapter at Sacred Heart Junior College"},"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"},"ym-Universidad-de-Costa-Rica":{name:"YouthMappers de Universidad de Costa Rica",description:"YouthMappers chapter at Universidad de Costa Rica",extendedDescription:"YouthMappers de Universidad de Costa Rica nace en función de acción social para y por miembros de comunidades distintas según temáticas de involucramiento, interacción y representación de variables dentro de un espacio geográfico definido (un territorio) Gracias a las herramientas de OpenStreetMaps tenemos la viabilidad de poder obtener, validar y compartir la información generada para comprobación y uso destinadas a las comunidades o el interesado en tales temáticas objetivas."},"OSM-CU-telegram":{name:"OSM Cuba on Telegram",description:"OpenStreetMap Cuba Telegram chat"},"ym-Universidad-Nacional-Autnoma-de-Honduras":{name:"PumaGis Hn",description:"YouthMappers chapter at Universidad Nacional Autónoma de Honduras"},"ym-University-of-the-West-Indies-Mona-Campus":{name:"Libraries Outreach - ODL",description:"YouthMappers chapter at University of the West Indies, Mona Campus",extendedDescription:"The UWI, Mona Campus Library engages in public, outreach and special projects. This will allow our library the means to be a catalyst for spatial literacy and advocate for spatial data sharing and access to Jamaican and Caribbean interests. We have disaster relief and communication needs and   extensive earth science and geo-hazards needs to better serve our campus and community. Specifically, we hace a Science Library to showcase such to all faculty and students."},"OSM-NI-telegram":{name:"OSM Nicaragua on Telegram",description:"OpenStreetMap Nicaragua Telegram chat"},"ym-Universidad-Nacional-de-Ingenieria":{name:"Yeka Street MGA",description:"YouthMappers chapter at Universidad Nacional de Ingenieria",extendedDescription:"YEKA STREET is a work team constituted by students from Universidad Nacional de Ingenieria at Managua, Nicaragua. With the principal purpose of apply our knowledge and skills using many tools and apps to map areas in our cities and contribute to the development community projects and disasters relieve plans. We want to lead the way adding more students from all careers and universities in our country to join us at this cause, increasing in this way the life level and reducing the population vulnerability."},"ym-University-of-Panama":{name:"YouthMappers UP",description:"YouthMappers chapter at University of Panama",extendedDescription:"Student mappers in Panama work with open spatial data to help identify, define, address, and create meaning about locally defined development challenges. They collaborate with students from other countries on community mapping topics from ecotourism to food security, from biodiversity to indigenous issues, promoting a humanistic vision through scientific perspectives."},"ym-Universidad-de-Puerto-Rico-Rio-Piedras":{name:"UPR YouthMappers",description:"YouthMappers chapter at Universidad de Puerto Rico - Rio Piedras"},"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."},"MaptimeHRVA-twitter":{name:"MaptimeHRVA Twitter",description:"Follow us on Twitter at {url}"},"us-ma-mailinglist":{name:"Talk-us-massachusetts Mailing List",description:"Email mailing list for the Massachusetts OSM community"},"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-forum":{name:"OpenStreetMap PDX Google Group",description:"Forum and mailing list for OpenStreetMap users in the Portland area",extendedDescription:"This group is to facilitate improvements to OpenStreetMap in the Portland, Oregon area to support applications such as the Open Trip Planner."},"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:{"sotmus2019-cfs":{name:"Propose a Talk for SotM-US 2019",description:"We are calling on all members of the OpenStreetMap community to share your ideas and session proposals for State of the Map US 2019. Whether you are brand new to OSM or have been a core contributor since the beginning, we want to hear from you!",where:"Minneapolis, Minnesota"},sotmus2019:{name:"State of the Map US 2019",description:"Join the OpenStreetMap community at State of the Map US in Minneapolis, Minnesota. Connect with other mappers, businesses, government agencies, and non profits, all collaborating around the free and editable map of the world.",where:"Minneapolis, Minnesota"}}},"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!"},"ym-Ball-State-University":{name:"Gamma Theta Upsilon- Iota Omega Chapter",description:"YouthMappers chapter at Ball State University",extendedDescription:"Our chapter is a very active one. We primarily focus on community events, fundraising, and field trips. We are currently looking to develop more mapping-related activities to draw in other students from campus who may be interested in contributing."},"ym-California-University-of-Pennsylvania":{name:"CalU PA GIS Club",description:"YouthMappers chapter at California University of Pennsylvania",extendedDescription:"GIS Students at Cal U learn to apply spatial theory to the real world. The university degree program focuses on geography as well as utilizing GIS in emergency management."},"ym-Central-Washington-University":{name:"Geography Club",description:"YouthMappers chapter at Central Washington University",extendedDescription:"Our goal teaming up with Youthmappers is to bring relief to areas that are in need of humanitarian mapping. By doing so, we are serving our fellow brothers and sisters around the world as well as furthering our own cartography skills."},"ym-Clemson-University":{name:"Clemson Mappers",description:"YouthMappers chapter at Clemson University",extendedDescription:"Students in Clemson are supported by the Center for Geospatial Technologies, a community of interdisciplinary geospatial science practitioners supporting research, teaching, and outreach activities using technologies that enable the collection, analysis, and application of geospatial data. Students integrate geospatial technologies within their scholarly activities across all disciplines and build connections throughout the world."},"ym-College-of-William-and-Mary":{name:"All over the map!",description:"YouthMappers chapter at College of William and Mary",extendedDescription:"The students who are all over the map are supported by the Center for Geospatial Analysis, a group integrating GIS across the curriculum and providing student and faculty with hardware, software, and expertise.  Students of all backgrounds utilize GIS across campus, including environmental science and policy, geology, history, business, sociology, biology, anthropology, public policy, and marine sciences."},"ym-Cornell-University":{name:"Mapping Society",description:"YouthMappers chapter at Cornell University",extendedDescription:"Cornell students and faculty use open data and open source software to address challenges at local, national, and global scales. In doing so, we advance our academic and personal goals of developing our own skills around GIS and spatial literacy."},"ym-George-Mason-University":{name:"Mason Mappers",description:"YouthMappers chapter at George Mason University",extendedDescription:"Mason Mappers Student Society is a humanitarian mapping student organization in the George Mason University GGS Department, and its goal is to promote education and knowledge in geo-technologies, geo-info science, to foster good global stewardship and engage in professional development while building a positive, interactive geo-community, as well as shaping students into leaders of tomorrow."},"ym-Indiana-University-of-Pennsylvania":{name:"Geospatial Science Club",description:"YouthMappers chapter at Indiana University of Pennsylvania"},"ym-Jacksonville-State-University":{name:"JSU Disaster Mapping Team",description:"YouthMappers chapter at Jacksonville State University",extendedDescription:"The JSU Disaster Mapping Team is a program at Jacksonville State University dedicated to assisting disaster response in times of emergencies. This includes tornadoes, severe thunderstorms, floods, etc. The team is intended to be a valuable asset to surrounding counties and a conduit for the JSU Geoscience Department students to apply what they have learned in an academic setting to support emergency services. Our goal is to streamline disaster response and recovery operations while utilizing student skill sets"},"ym-Kansas-State-University":{name:"Gamma Theta Upsilon: Beta Psi Chapter",description:"YouthMappers chapter at Kansas State University",extendedDescription:"We are the Kansas State University Chapter of Gamma Theta Upsilon, an international geography honor society with affiliation to YouthMappers. We have been active with mapping for OSM and conducted a mapathon called \"Map for Nepal,\" in which we used OpenStreetMap to digitize unmapped areas of Nepal after the earthquake in 2015."},"ym-McGill-University":{name:"Open Mapping Group McGill: A Member of the McGill Undergraduate Geography Society",description:"YouthMappers chapter at McGill University",extendedDescription:"The Open Mapping Group McGill: A Member of McGill Undergraduate Geography Society (OMG McGill) aims to connect students with open geospatial data and technologies to enhance resilience, community-building, and learning through mapping–on campus, in Montreal, in Canada, and abroad."},"ym-Miami-University":{name:"Geography and Planning Society",description:"YouthMappers chapter at Miami University",extendedDescription:"GPS at Miami University aims to create a close-knit community of planners and geographers who want to have fun, learn more about careers and higher education in their field, network, and work alongside professionals for real experience."},"ym-Monroe-Community-College":{name:"MCC Mapping Corps",description:"YouthMappers chapter at Monroe Community College"},"ym-Montgomery-College":{name:"GeoMC",description:"YouthMappers chapter at Montgomery College",extendedDescription:"GeoMC’s mission is to provide students with hands-on experience in applying geospatial tools, collecting data, and project management. Most of our students come with a background in GIS and are geography majors. Our chapter’s members come from diverse backgrounds and we all work together to make a positive impact in the world live in."},"ym-New-York-University":{name:"NYU mHealth Initiative Mapping Corps",description:"YouthMappers chapter at New York University",extendedDescription:"The NYU mobile health or “mHealth” research initiative focuses on development of systems that link people - usually via their phones - to the places that they live and traverse, and thus supports novel research on the way phones and maps can be leveraged to understand behavioral decision making and ultimately health outcomes."},"ym-Ohio-Wesleyan-University":{name:"Environment and Wildlife Club",description:"YouthMappers chapter at Ohio Wesleyan University",extendedDescription:"Environment and Wildlife Club looks at environmental issues on campus, in Delaware, and even nationally! We create campus and community projects, explore and enjoy the outdoors, volunteer, and try to promote environmentalism in every aspect of our lives."},"ym-Oklahoma-State-University":{name:"Geography Club",description:"YouthMappers chapter at Oklahoma State University"},"ym-State-University-of-New-York-Geneseo":{name:"SUNY Geneseo GIS Association",description:"YouthMappers chapter at State University of New York Geneseo",extendedDescription:"We spread awareness, support, education, volunteerism, and career advancement opportunities in geographic information systems, across disciplines and departments, in the context of SUNY Geneseo, the local community, and global community."},"ym-SUNY-at-Fredonia":{name:"Geoventurers",description:"YouthMappers chapter at SUNY at Fredonia",extendedDescription:"GeoVenturers is a group of students joining together across a number of majors on our campus that see geospatial technologies as a tool to serve others and to bring people together. Mentoring for the group brings in science education from the department of curriculum and instruction. We hope that we can bring our skills to play in helping make people's lives better."},"ym-Texas-Tech-University":{name:"YouthMappers at TTU",description:"YouthMappers chapter at Texas Tech University",extendedDescription:"As one of the co-founding chapters of the network, the TTU YouthMappers are enthusiastic to serve as interdisciplinary leaders to help create open geographic data and analyses that address locally defined development challenges worldwide. The chapter strives to exchange and collaborate with other chapters around the globe while also offering themselves as a local resource and service to Texas Tech student organizations in ways that add value to their respecitive campus activities through mapping."},"ym-The-Citadel":{name:"YouthMappers at The Citadel",description:"YouthMappers chapter at The Citadel",extendedDescription:"This chapter is also a Rotaract Club, which is an affiliate of Rotary International. Multiple members, as well as leadership have expressed an interest in YouthMappers and we would like to affiliate our Citadel Rotaract Club with YouthMappers."},"ym-The-George-Washington-University":{name:"Humanitarian Mapping Society",description:"YouthMappers chapter at The George Washington University",extendedDescription:"Models of leadership and engagement, HMS seeks to render aid and better the world through humanitarian Geographic Information Systems (GIS) projects. This co-founding affiliated chapter on the campus of GWU has a plethora of experience to share, and frequently partners directly with USAID, the American Red Cross, and the US Department of State in their DC area to expand student-led efforts and serve the global community."},"ym-The-Johns-Hopkins-University-SAIS":{name:"SAIS YouthMappers",description:"YouthMappers chapter at The Johns Hopkins University, SAIS",extendedDescription:"The mission of SAIS Youth Mappers is to provide students at the Johns Hopkins University SAIS with the opportunity to become highly skilled humanitarian mappers. As a group within the South Asia Club, its primary focus is on supporting humanitarian mapping projects in the Indo-Pacific Region."},"ym-The-Pennsylvania-State-University":{name:"Penn State GIS Coalition",description:"YouthMappers chapter at The Pennsylvania State University",extendedDescription:"The Penn State Geospatial Information Science (GIS) Coalition is an organization that offers students majoring, minoring, or sharing an interest in GIS opportunities to develop supplementary knowledge and skills necessary to succeed in the professional GIS industry."},"ym-University-of-California-Davis":{name:"Mapping Club",description:"YouthMappers chapter at University of California, Davis"},"ym-University-of-Central-Florida":{name:"Geospatial Information Society",description:"YouthMappers chapter at University of Central Florida",extendedDescription:"Our mission is to foster a social and educational environment for all majors who are interested in the discussion and application of GIS. Group and community events throughout the academic year organize students to volunteer to help local and regional communities by using community-based GIS projects and educating local middle and high school students on the use and application of GIS."},"ym-University-of-Chicago":{name:"Tobler Society",description:"YouthMappers chapter at University of Chicago"},"ym-University-of-Maryland-College-Park":{name:"Geography Club",description:"YouthMappers chapter at University of Maryland - College Park",extendedDescription:"The mission of the Geography Club at the University of Maryland College Park is to engage and encourage students to explore geographic interests within the campus and the community."},"ym-University-of-North-Texas":{name:"UNT Geography Club",description:"YouthMappers chapter at University of North Texas",extendedDescription:"The Geography Club is a student organization at University of North Texas that welcomes all students who are interested in geography. The objective of the Geography Club is to promote interest in Geography, the Major and the Geography Department along with fellowship among students and faculty. The club also seeks to represent student needs and wants in regard to the study of geography and to provide a forum for the presentation of innovative ideas to the benefit of the University community."},"ym-University-of-Northern-Colorado":{name:"UNCO Geography and GIS Club",description:"YouthMappers chapter at University of Northern Colorado",extendedDescription:"Official Geography and GIS Club chapter affiliated with the University of Northern Colorado where our aim is to learn, share and connect with those around us. #MakingSenseOfTheWorld"},"ym-University-of-Oregon":{name:"Map by Northwest",description:"YouthMappers chapter at University of Oregon",extendedDescription:"Map By Northwest aims to engage undergraduate students at the University of Oregon in mapping projects to assist in humanitarian causes and for conducting geographic research. We welcome students from all disciplines to join us in our mapping adventures."},"ym-University-of-Redlands":{name:"URSpatial Geo-Thinkers",description:"YouthMappers chapter at University of Redlands",extendedDescription:"To build upon the members' GIS skills and knowledge of the tools and methods through applied social engagement as well as to educate the campus community about the power of mapping and spatial analysis through community service events."},"ym-University-of-South-Carolina":{name:"Geography Graduate Student Association",description:"YouthMappers chapter at University of South Carolina",extendedDescription:"The GGSA is a fully student-run organization, designed to serve as an advocate and resource for all geography graduate students by filling the role of liaison between the department and students. Our goal is to further professional, academic, and personal development of graduate students interested in the field of geography and its sub disciplines."},"ym-University-of-Southern-California":{name:"SC Mappers",description:"YouthMappers chapter at University of Southern California",extendedDescription:"We see the world differently: we view it through a spatial lens. With the power of spatial thinking, we connect place and space to help address global challenges. Collaborate with us!"},"ym-University-of-Vermont":{name:"University of Vermont Humanitarian Mapping Club",description:"YouthMappers chapter at University of Vermont"},"ym-University-of-Victoria":{name:"Society of Geography Students",description:"YouthMappers chapter at University of Victoria",extendedDescription:"SOGS seeks to promote and represent social and academic interests within the Department of Geography. This is expressed by four key goals: To provide a forum for the discussion of matters concerning the quality and accessibility of education within geography; to provide a means of expressing a consensus of student opinion to deparhnental faculty through representation at deparkrnental meetings and on departrnental committees; to undertake anangements for such activities as are for the benefit of students and are seen to be within the field of interest of students in geography; to act as a liaison through the UVSS and the Course Union Council with other student groups on campus"},"ym-University-of-Wyoming":{name:"Gamma Theta Upsilon/Geography Club",description:"YouthMappers chapter at University of Wyoming"},"ym-UW-Madison":{name:"BadgerMaps",description:"YouthMappers chapter at UW-Madison",extendedDescription:"BadgerMaps is the UW campus chapter of Youthmappers, an organization dedicated to humanitarian and community mapping services. We connect our volunteer network with opportunities to create GIS data for projects that need it."},"ym-Vassar-College":{name:"Hudson Valley Mappers",description:"YouthMappers chapter at Vassar College",extendedDescription:"Our mission is to provide a multi-disciplinary platform for peers, educators, and community organizations to engage in local mapping projects with a focus on strengthening our local ecosystems, our built environment, and the health of our community. We also seek to contribute geospatial support for global humanitarian aid and development efforts."},"ym-Villanova-University":{name:"The Villanova Globeplotters",description:"YouthMappers chapter at Villanova University",extendedDescription:"The Villanova Globeplotters is built on Villanova’s Augustinian principle of selfless-service to the global community. Mixed with relaxed social interaction, we strive to provide geospatial outreach to those in need regardless of participating students’ race, academic major, student group association, or college career level."},"ym-West-Virginia-University":{name:"Maptime Morgantown",description:"YouthMappers chapter at West Virginia University",extendedDescription:"Working as a collaborative team, this co-founding chapter focuses on providing an open learning environment for those interested in working on projects that intersect international development, emergency response, and geographic information science.\nThey connect beginners and experts by providing technical training and experience in building meaningful and useful geographic infrastructure data, while connecting to sister cities around the world."},"ym-Western-Michigan-University":{name:"Geography Club",description:"YouthMappers chapter at Western Michigan University"},"talk-au":{name:"Talk-au Mailing List",description:"Place for Aussie mappers to chat"},"Maptime-Oceania-Slack":{name:"Maptime Oceania Slack",description:"Sign up at {signupUrl}"},"talk-nz":{name:"Talk-nz Mailing List",description:"New Zealand's OSM community talk"},"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}"},"RS-telegram":{name:"OpenStreetMap Rio Grande do Sul Telegram Group",description:"Join the OpenStreetMap Rio Grande do Sul community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!"},"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"},"ym-Universidad-de-Antioquia":{name:"Geomatica UDEA",description:"YouthMappers chapter at Universidad de Antioquia",extendedDescription:"We are a group interested in geospatial data, voluntary cartography, and participating in mapping with others in our country and within the YouthMappers network."},"ym-Universidad-de-La-Guajira":{name:"Grupo Mesh",description:"YouthMappers chapter at Universidad de La Guajira",extendedDescription:"Grupo Mesh is a student organization at the Universidad de la Guajira in Colombia, including students from the program of Environmental Engineering who learn cartography and open mapping."},"ym-Universidad-de-Los-Andes":{name:"Cartografos Uniandes",description:"YouthMappers chapter at Universidad de Los Andes",extendedDescription:"We are a circle of student participation that seeks to use mapping and spatial reasoning as a means to create bonds of cooperation and integration between the university and society by addressing different spatial, social, political , economic and cultural dynamics."},"ym-Universidad-de-San-Buenaventura":{name:"YouthMappers San Buenaventura",description:"YouthMappers chapter at Universidad de San Buenaventura",extendedDescription:"We are pleased to join YouthMappers mapping for a better world and community."},"ym-Universidad-Distrital-Francisco-Jose-de-Caldas":{name:"YouthMappers at Bogota",description:"YouthMappers chapter at Universidad Distrital Francisco Jose de Caldas",extendedDescription:"The Universidad Distrital Francisco José de Caldas is a public, coeducational, research university based in Bogotá, Colombia with a population of 26,140 students."},"ym-Universidad-Nacional-de-Colombia":{name:"Grupo UN",description:"YouthMappers chapter at Universidad Nacional de Colombia",extendedDescription:"Students are uniting to map and network with university students across the country of Colombia and across the globe.  Geographic specialties include affiliation with microbiology and health disciplines."},"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"},"uy-forum":{name:"OpenStreetMap UY forum",description:"OpenStreetMap Uruguay web forum"},"uy-irc":{name:"OpenStreetMap Uruguay on IRC",description:"Join #osmuruguay on irc.freenode.org (port 6667)",extendedDescription:"Join #osmuruguay on irc.freenode.org"},"uy-mailinglist":{name:"Talk-uy Mailing List",description:"Talk-uy is the official mailing list for the Uruguayan OSM community"},"LATAM-Facebook":{name:"OpenStreetMap Latam Facebook",description:"OpenStreetMap Latam on Facebook"},"LATAM-Telegram":{name:"OpenStreetMap Latam Telegram",description:"OpenStreetMap Telegram for Latin America"},"LATAM-Twitter":{name:"OpenStreetMap Latam Twitter",description:"Follow us on Twitter at {url}"},"osm-latam":{name:"OpenStreetMap Latam",description:"Supporting OpenStreetMap in Latin America",events:{"sotm-latam-2018":{name:"State of the Map Latam 2018",description:"State of the Map Latam is the annual conference for all mappers and users of OpenStreetMap in Latin America. The program includes talks, panels, workshops, and mapathons related to OpenStreetMap.",where:"Buenos Aires, Argentina"}}},"OSM-Discord":{name:"OpenStreetMap Discord",description:"Get in touch with other mappers via Discord"},"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-IRC":{name:"OpenStreetMap IRC",description:"Join #osm on irc.oftc.net (port 6667)"},"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"}}}}};
24695
24696         var features$2 = {botswana:{type:"Feature",id:"botswana",properties:{},geometry:{type:"Polygon",coordinates:[[[25.65423,-18.48085],[25.70131,-18.56629],[25.79198,-18.60814],[25.83557,-18.82958],[25.95414,-18.89236],[26.00296,-19.02313],[25.9925,-19.058],[26.17908,-19.52356],[26.25057,-19.57064],[26.32554,-19.57064],[26.37611,-19.62121],[26.35344,-19.64562],[26.70741,-19.87404],[26.73356,-19.91763],[26.97419,-20.00133],[27.04394,-19.99784],[27.13984,-20.06585],[27.22005,-20.07456],[27.30723,-20.22626],[27.31769,-20.45643],[27.73269,-20.4913],[27.74664,-20.70926],[27.71525,-21.07718],[27.9088,-21.2777],[28.02562,-21.55668],[28.19825,-21.5933],[28.37261,-21.59679],[28.50339,-21.65433],[28.58011,-21.62643],[28.8033,-21.71362],[29.08577,-21.80603],[29.03346,-21.90193],[29.06659,-22.02399],[29.17645,-22.07107],[29.25665,-22.05189],[29.38569,-22.19312],[29.32117,-22.21231],[29.0387,-22.23323],[29.01428,-22.27159],[28.97941,-22.31344],[28.98115,-22.34482],[28.94105,-22.45991],[28.52257,-22.59766],[28.36041,-22.58371],[28.18255,-22.70053],[28.18255,-22.74761],[28.06747,-22.89931],[27.95239,-22.9708],[27.96285,-23.03532],[27.74838,-23.24107],[27.68561,-23.21666],[27.62109,-23.23758],[27.56006,-23.36836],[27.2741,-23.49565],[27.08578,-23.66304],[27.00034,-23.70489],[26.88875,-24.10593],[26.87654,-24.26635],[26.74228,-24.31343],[26.57663,-24.45292],[26.42842,-24.64821],[25.8844,-24.77724],[25.89486,-24.88012],[25.76585,-25.17485],[25.66467,-25.48682],[25.58448,-25.64908],[25.3456,-25.78509],[25.11021,-25.76939],[25.02517,-25.71967],[24.92538,-25.81822],[24.69696,-25.83042],[24.46156,-25.74324],[24.37786,-25.76765],[24.21127,-25.67022],[23.92974,-25.64036],[23.66819,-25.44158],[23.3121,-25.26869],[22.88179,-25.50087],[22.72835,-26.01351],[22.63768,-26.10767],[22.56793,-26.2367],[22.48424,-26.21054],[22.35521,-26.33609],[22.24971,-26.35352],[22.07317,-26.63251],[21.9668,-26.67131],[21.79767,-26.66956],[21.77761,-26.69223],[21.80377,-26.78465],[21.6913,-26.87096],[21.59889,-26.8605],[21.5274,-26.86224],[21.32339,-26.84349],[21.14248,-26.87375],[21.00386,-26.84873],[20.98729,-26.81621],[20.85826,-26.80575],[20.68477,-26.92022],[20.61677,-26.79293],[20.61589,-26.68718],[20.622,-26.60461],[20.5941,-26.47558],[20.82252,-26.153],[20.78939,-25.92458],[20.63769,-25.63862],[20.63595,-25.55143],[20.36045,-25.06321],[20.25583,-24.93766],[20.11982,-24.89756],[19.98556,-24.76853],[19.99602,-21.99435],[20.9934,-22.00132],[20.99514,-18.30648],[21.45547,-18.31171],[23.10324,-17.98913],[23.31422,-17.98913],[23.43105,-18.18268],[23.54439,-18.26289],[23.60542,-18.48085],[23.77455,-18.36577],[23.91928,-18.20884],[24.18606,-18.01355],[24.36915,-17.94031],[24.47377,-17.956],[24.51038,-18.03621],[24.57839,-18.05714],[24.615,-17.98565],[24.71439,-17.89498],[24.97594,-17.77466],[25.09102,-17.82174],[25.15903,-17.76246],[25.27411,-17.79559],[25.25493,-17.91241],[25.31596,-18.06062],[25.40489,-18.1077],[25.5374,-18.37972],[25.65423,-18.48085]]]}},"Centre-Universitaire-de-Recherche-et-dApplication-en-Tldtection-CURAT-de-lUniversit-Felix-Houphouet-Boigny":{type:"Feature",id:"Centre-Universitaire-de-Recherche-et-dApplication-en-Tldtection-CURAT-de-lUniversit-Felix-Houphouet-Boigny",properties:{},geometry:{type:"Polygon",coordinates:[[[-3.98799,5.5686],[-3.94397,5.56428],[-3.90165,5.5515],[-3.86264,5.53074],[-3.82846,5.5028],[-3.80041,5.46876],[-3.77958,5.42993],[-3.76675,5.38779],[-3.76243,5.34398],[-3.76678,5.30017],[-3.77963,5.25804],[-3.80049,5.21922],[-3.82854,5.1852],[-3.86272,5.15728],[-3.90171,5.13653],[-3.94401,5.12375],[-3.98799,5.11944],[-4.03198,5.12375],[-4.07428,5.13653],[-4.11327,5.15728],[-4.14745,5.1852],[-4.1755,5.21922],[-4.19635,5.25804],[-4.2092,5.30017],[-4.21355,5.34398],[-4.20924,5.38779],[-4.19641,5.42993],[-4.17558,5.46876],[-4.14753,5.5028],[-4.11335,5.53074],[-4.07434,5.5515],[-4.03201,5.56428],[-3.98799,5.5686]]]}},"The-Gambia-YMCA-University-of-the-Gambia":{type:"Feature",id:"The-Gambia-YMCA-University-of-the-Gambia",properties:{},geometry:{type:"Polygon",coordinates:[[[-16.6763,13.68253],[-16.63121,13.67821],[-16.58785,13.66542],[-16.54791,13.64465],[-16.5129,13.6167],[-16.48419,13.58265],[-16.46288,13.54381],[-16.44977,13.50166],[-16.44538,13.45785],[-16.44986,13.41404],[-16.46303,13.37192],[-16.4844,13.33311],[-16.51312,13.2991],[-16.54811,13.27119],[-16.58801,13.25045],[-16.63129,13.23769],[-16.6763,13.23337],[-16.72131,13.23769],[-16.76459,13.25045],[-16.80449,13.27119],[-16.83948,13.2991],[-16.8682,13.33311],[-16.88956,13.37192],[-16.90274,13.41404],[-16.90722,13.45785],[-16.90282,13.50166],[-16.88972,13.54381],[-16.8684,13.58265],[-16.83969,13.6167],[-16.80469,13.64465],[-16.76474,13.66542],[-16.72139,13.67821],[-16.6763,13.68253]]]}},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]]]}},"Kwame-Nkrumah-University-of-Science-and-Technology":{type:"Feature",id:"Kwame-Nkrumah-University-of-Science-and-Technology",properties:{},geometry:{type:"Polygon",coordinates:[[[-1.56831,6.89695],[-1.52418,6.89263],[-1.48174,6.87985],[-1.44264,6.85909],[-1.40837,6.83115],[-1.38026,6.7971],[-1.35937,6.75827],[-1.34652,6.71613],[-1.3422,6.67232],[-1.34656,6.62851],[-1.35945,6.58638],[-1.38035,6.54757],[-1.40848,6.51354],[-1.44274,6.48562],[-1.48182,6.46488],[-1.52422,6.45211],[-1.56831,6.44779],[-1.6124,6.45211],[-1.6548,6.46488],[-1.69388,6.48562],[-1.72814,6.51354],[-1.75627,6.54757],[-1.77717,6.58638],[-1.79006,6.62851],[-1.79442,6.67232],[-1.7901,6.71613],[-1.77725,6.75827],[-1.75636,6.7971],[-1.72825,6.83115],[-1.69398,6.85909],[-1.65488,6.87985],[-1.61244,6.89263],[-1.56831,6.89695]]]}},"University-of-Cape-Coast":{type:"Feature",id:"University-of-Cape-Coast",properties:{},geometry:{type:"Polygon",coordinates:[[[-1.23047,5.31552],[-1.18647,5.31121],[-1.14416,5.29842],[-1.10517,5.27766],[-1.071,5.24973],[-1.04296,5.21569],[-1.02214,5.17685],[-1.00932,5.13472],[-1.005,5.0909],[-1.00935,5.04709],[-1.02219,5.00497],[-1.04303,4.96615],[-1.07108,4.93212],[-1.10524,4.9042],[-1.14421,4.88345],[-1.1865,4.87068],[-1.23047,4.86637],[-1.27444,4.87068],[-1.31672,4.88345],[-1.3557,4.9042],[-1.38986,4.93212],[-1.4179,4.96615],[-1.43875,5.00497],[-1.45159,5.04709],[-1.45594,5.0909],[-1.45162,5.13472],[-1.4388,5.17685],[-1.41798,5.21569],[-1.38994,5.24973],[-1.35577,5.27766],[-1.31678,5.29842],[-1.27447,5.31121],[-1.23047,5.31552]]]}},"University-of-Energy-and-Natural-Resources":{type:"Feature",id:"University-of-Energy-and-Natural-Resources",properties:{},geometry:{type:"Polygon",coordinates:[[[-2.343,7.57482],[-2.2988,7.5705],[-2.2563,7.55771],[-2.21714,7.53695],[-2.18283,7.50901],[-2.15467,7.47497],[-2.13376,7.43613],[-2.12089,7.394],[-2.11656,7.35018],[-2.12093,7.30637],[-2.13384,7.26425],[-2.15477,7.22543],[-2.18294,7.19141],[-2.21725,7.16349],[-2.25639,7.14275],[-2.29885,7.12997],[-2.343,7.12566],[-2.38715,7.12997],[-2.42961,7.14275],[-2.46875,7.16349],[-2.50306,7.19141],[-2.53123,7.22543],[-2.55216,7.26425],[-2.56507,7.30637],[-2.56944,7.35018],[-2.56511,7.394],[-2.55224,7.43613],[-2.53133,7.47497],[-2.50317,7.50901],[-2.46886,7.53695],[-2.4297,7.55771],[-2.3872,7.5705],[-2.343,7.57482]]]}},"University-of-Ghana":{type:"Feature",id:"University-of-Ghana",properties:{},geometry:{type:"Polygon",coordinates:[[[-0.19624,5.87573],[-0.15219,5.87141],[-0.10984,5.85863],[-0.07082,5.83787],[-0.03662,5.80993],[-0.00855,5.77589],[0.01229,5.73706],[0.02512,5.69492],[0.02944,5.65111],[0.02509,5.6073],[0.01223,5.56517],[-0.00863,5.52635],[-0.0367,5.49233],[-0.0709,5.46441],[-0.1099,5.44366],[-0.15223,5.43089],[-0.19624,5.42657],[-0.24025,5.43089],[-0.28257,5.44366],[-0.32157,5.46441],[-0.35577,5.49233],[-0.38384,5.52635],[-0.4047,5.56517],[-0.41756,5.6073],[-0.42191,5.65111],[-0.41759,5.69492],[-0.40476,5.73706],[-0.38392,5.77589],[-0.35586,5.80993],[-0.32166,5.83787],[-0.28263,5.85863],[-0.24028,5.87141],[-0.19624,5.87573]]]}},"University-of-Mines-and-Technology":{type:"Feature",id:"University-of-Mines-and-Technology",properties:{},geometry:{type:"Polygon",coordinates:[[[-2.00125,5.52338],[-1.95723,5.51907],[-1.91491,5.50628],[-1.87591,5.48552],[-1.84173,5.45759],[-1.81368,5.42355],[-1.79285,5.38471],[-1.78003,5.34258],[-1.77571,5.29876],[-1.78006,5.25495],[-1.7929,5.21283],[-1.81376,5.17401],[-1.84181,5.13998],[-1.87598,5.11206],[-1.91497,5.09132],[-1.95726,5.07854],[-2.00125,5.07423],[-2.04524,5.07854],[-2.08753,5.09132],[-2.12652,5.11206],[-2.16069,5.13998],[-2.18874,5.17401],[-2.2096,5.21283],[-2.22244,5.25495],[-2.22679,5.29876],[-2.22247,5.34258],[-2.20965,5.38471],[-2.18882,5.42355],[-2.16077,5.45759],[-2.12659,5.48552],[-2.08759,5.50628],[-2.04527,5.51907],[-2.00125,5.52338]]]}},"General-Lansana-Conte-University":{type:"Feature",id:"General-Lansana-Conte-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-13.62305,9.93364],[-13.57857,9.92932],[-13.5358,9.91653],[-13.49639,9.89576],[-13.46186,9.86782],[-13.43353,9.83377],[-13.41249,9.79494],[-13.39955,9.7528],[-13.3952,9.70898],[-13.39961,9.66517],[-13.4126,9.62305],[-13.43367,9.58424],[-13.46201,9.55022],[-13.49653,9.5223],[-13.53591,9.50156],[-13.57863,9.48879],[-13.62305,9.48448],[-13.66747,9.48879],[-13.71018,9.50156],[-13.74956,9.5223],[-13.78408,9.55022],[-13.81242,9.58424],[-13.83349,9.62305],[-13.84648,9.66517],[-13.85089,9.70898],[-13.84654,9.7528],[-13.8336,9.79494],[-13.81256,9.83377],[-13.78423,9.86782],[-13.7497,9.89576],[-13.71029,9.91653],[-13.66753,9.92932],[-13.62305,9.93364]]]}},"Institute-of-Science-and-Veterinary-Medicine":{type:"Feature",id:"Institute-of-Science-and-Veterinary-Medicine",properties:{},geometry:{type:"Polygon",coordinates:[[[-12.1175,10.91114],[-12.07288,10.90682],[-12.02998,10.89403],[-11.99045,10.87326],[-11.95581,10.84532],[-11.9274,10.81127],[-11.90629,10.77243],[-11.89332,10.73029],[-11.88896,10.68648],[-11.89338,10.64267],[-11.90641,10.60055],[-11.92755,10.56173],[-11.95598,10.52772],[-11.99061,10.4998],[-12.0301,10.47906],[-12.07295,10.46629],[-12.1175,10.46198],[-12.16205,10.46629],[-12.2049,10.47906],[-12.24439,10.4998],[-12.27902,10.52772],[-12.30745,10.56173],[-12.32859,10.60055],[-12.34162,10.64267],[-12.34604,10.68648],[-12.34168,10.73029],[-12.32871,10.77243],[-12.3076,10.81127],[-12.27919,10.84532],[-12.24455,10.87326],[-12.20502,10.89403],[-12.16212,10.90682],[-12.1175,10.91114]]]}},"Universit-de-NZrkor":{type:"Feature",id:"Universit-de-NZrkor",properties:{},geometry:{type:"Polygon",coordinates:[[[-8.83716,7.95701],[-8.79292,7.95269],[-8.75039,7.9399],[-8.71119,7.91914],[-8.67684,7.8912],[-8.64866,7.85715],[-8.62773,7.81832],[-8.61485,7.77618],[-8.61052,7.73237],[-8.6149,7.68856],[-8.62781,7.64643],[-8.64877,7.60762],[-8.67696,7.5736],[-8.7113,7.54568],[-8.75047,7.52493],[-8.79297,7.51216],[-8.83716,7.50785],[-8.88135,7.51216],[-8.92385,7.52493],[-8.96302,7.54568],[-8.99736,7.5736],[-9.02555,7.60762],[-9.0465,7.64643],[-9.05942,7.68856],[-9.0638,7.73237],[-9.05947,7.77618],[-9.04659,7.81832],[-9.02566,7.85715],[-8.99748,7.8912],[-8.96313,7.91914],[-8.92393,7.9399],[-8.8814,7.95269],[-8.83716,7.95701]]]}},"Dedan-Kimathi-University-of-Technology":{type:"Feature",id:"Dedan-Kimathi-University-of-Technology",properties:{},geometry:{type:"Polygon",coordinates:[[[37.00195,-0.21487],[37.04577,-0.21919],[37.0879,-0.23196],[37.12672,-0.25272],[37.16076,-0.28065],[37.18869,-0.31468],[37.20944,-0.3535],[37.22222,-0.39563],[37.22654,-0.43945],[37.22222,-0.48326],[37.20945,-0.52539],[37.18869,-0.56422],[37.16076,-0.59825],[37.12673,-0.62618],[37.0879,-0.64693],[37.04577,-0.65971],[37.00195,-0.66403],[36.95814,-0.65971],[36.91601,-0.64693],[36.87718,-0.62618],[36.84314,-0.59825],[36.81521,-0.56422],[36.79446,-0.52539],[36.78168,-0.48326],[36.77737,-0.43945],[36.78168,-0.39563],[36.79447,-0.3535],[36.81522,-0.31468],[36.84315,-0.28065],[36.87718,-0.25272],[36.91601,-0.23196],[36.95814,-0.21919],[37.00195,-0.21487]]]}},"Jomo-Kenyatta-University-of-Agriculture-and-Technology":{type:"Feature",id:"Jomo-Kenyatta-University-of-Agriculture-and-Technology",properties:{},geometry:{type:"Polygon",coordinates:[[[37.0105,-0.86452],[37.05432,-0.86884],[37.09645,-0.88162],[37.13528,-0.90237],[37.16932,-0.93029],[37.19726,-0.96433],[37.21802,-1.00315],[37.2308,-1.04528],[37.23512,-1.08909],[37.23081,-1.1329],[37.21803,-1.17504],[37.19727,-1.21386],[37.16934,-1.2479],[37.1353,-1.27583],[37.09646,-1.29658],[37.05432,-1.30936],[37.0105,-1.31368],[36.96668,-1.30936],[36.92454,-1.29658],[36.8857,-1.27583],[36.85166,-1.2479],[36.82373,-1.21386],[36.80297,-1.17504],[36.79019,-1.1329],[36.78588,-1.08909],[36.7902,-1.04528],[36.80298,-1.00315],[36.82374,-0.96433],[36.85168,-0.93029],[36.88572,-0.90237],[36.92455,-0.88162],[36.96668,-0.86884],[37.0105,-0.86452]]]}},"Karatina-University":{type:"Feature",id:"Karatina-University",properties:{},geometry:{type:"Polygon",coordinates:[[[37.12789,-0.25676],[37.1717,-0.26108],[37.21383,-0.27386],[37.25266,-0.29461],[37.28669,-0.32254],[37.31462,-0.35657],[37.33538,-0.3954],[37.34816,-0.43752],[37.35247,-0.48134],[37.34816,-0.52515],[37.33538,-0.56728],[37.31463,-0.60611],[37.2867,-0.64014],[37.25267,-0.66807],[37.21384,-0.68882],[37.1717,-0.7016],[37.12789,-0.70592],[37.08407,-0.7016],[37.04194,-0.68882],[37.00311,-0.66807],[36.96908,-0.64014],[36.94115,-0.60611],[36.92039,-0.56728],[36.90762,-0.52515],[36.9033,-0.48134],[36.90762,-0.43752],[36.9204,-0.3954],[36.94115,-0.35657],[36.96908,-0.32254],[37.00312,-0.29461],[37.04194,-0.27386],[37.08407,-0.26108],[37.12789,-0.25676]]]}},"Kenyatta-University":{type:"Feature",id:"Kenyatta-University",properties:{},geometry:{type:"Polygon",coordinates:[[[36.93493,-0.95538],[36.97875,-0.9597],[37.02089,-0.97248],[37.05972,-0.99323],[37.09376,-1.02116],[37.12169,-1.05519],[37.14245,-1.09401],[37.15524,-1.13614],[37.15956,-1.17995],[37.15524,-1.22377],[37.14247,-1.2659],[37.12171,-1.30472],[37.09378,-1.33876],[37.05974,-1.36669],[37.0209,-1.38744],[36.97876,-1.40023],[36.93493,-1.40454],[36.8911,-1.40023],[36.84896,-1.38744],[36.81013,-1.36669],[36.77609,-1.33876],[36.74815,-1.30472],[36.7274,-1.2659],[36.71462,-1.22377],[36.7103,-1.17995],[36.71462,-1.13614],[36.72741,-1.09401],[36.74817,-1.05519],[36.7761,-1.02116],[36.81014,-0.99323],[36.84898,-0.97248],[36.89111,-0.9597],[36.93493,-0.95538]]]}},"Moi-University":{type:"Feature",id:"Moi-University",properties:{},geometry:{type:"Polygon",coordinates:[[[35.50781,-0.12698],[35.55163,-0.1313],[35.59376,-0.14408],[35.63258,-0.16483],[35.66661,-0.19276],[35.69454,-0.22679],[35.7153,-0.26562],[35.72808,-0.30774],[35.7324,-0.35156],[35.72808,-0.39537],[35.7153,-0.4375],[35.69455,-0.47633],[35.66662,-0.51036],[35.63259,-0.53829],[35.59376,-0.55904],[35.55163,-0.57182],[35.50781,-0.57614],[35.464,-0.57182],[35.42187,-0.55904],[35.38304,-0.53829],[35.34901,-0.51036],[35.32108,-0.47633],[35.30032,-0.4375],[35.28754,-0.39537],[35.28323,-0.35156],[35.28755,-0.30774],[35.30033,-0.26562],[35.32108,-0.22679],[35.34901,-0.19276],[35.38304,-0.16483],[35.42187,-0.14408],[35.464,-0.1313],[35.50781,-0.12698]]]}},"Technical-University-of-Kenya":{type:"Feature",id:"Technical-University-of-Kenya",properties:{},geometry:{type:"Polygon",coordinates:[[[36.82449,-1.06703],[36.86831,-1.07134],[36.91045,-1.08412],[36.94928,-1.10487],[36.98332,-1.1328],[37.01126,-1.16683],[37.03202,-1.20566],[37.04481,-1.24778],[37.04913,-1.2916],[37.04481,-1.33541],[37.03203,-1.37754],[37.01128,-1.41637],[36.98334,-1.4504],[36.9493,-1.47833],[36.91046,-1.49909],[36.86832,-1.51187],[36.82449,-1.51618],[36.78066,-1.51187],[36.73852,-1.49909],[36.69968,-1.47833],[36.66564,-1.4504],[36.6377,-1.41637],[36.61695,-1.37754],[36.60417,-1.33541],[36.59986,-1.2916],[36.60418,-1.24778],[36.61696,-1.20566],[36.63772,-1.16683],[36.66566,-1.1328],[36.6997,-1.10487],[36.73853,-1.08412],[36.78067,-1.07134],[36.82449,-1.06703]]]}},"University-of-Nairobi":{type:"Feature",id:"University-of-Nairobi",properties:{},geometry:{type:"Polygon",coordinates:[[[36.82617,-1.09366],[36.86999,-1.09798],[36.91213,-1.11076],[36.95097,-1.13151],[36.98501,-1.15944],[37.01294,-1.19347],[37.0337,-1.23229],[37.04649,-1.27442],[37.05081,-1.31823],[37.0465,-1.36205],[37.03372,-1.40418],[37.01296,-1.44301],[36.98503,-1.47704],[36.95098,-1.50497],[36.91214,-1.52573],[36.87,-1.53851],[36.82617,-1.54282],[36.78234,-1.53851],[36.7402,-1.52573],[36.70136,-1.50497],[36.66732,-1.47704],[36.63938,-1.44301],[36.61863,-1.40418],[36.60585,-1.36205],[36.60153,-1.31823],[36.60585,-1.27442],[36.61864,-1.23229],[36.6394,-1.19347],[36.66734,-1.15944],[36.70138,-1.13151],[36.74021,-1.11076],[36.78235,-1.09798],[36.82617,-1.09366]]]}},"African-Methodist-Episcopal-University":{type:"Feature",id:"African-Methodist-Episcopal-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-10.80063,6.53533],[-10.75653,6.53101],[-10.71413,6.51823],[-10.67505,6.49747],[-10.64081,6.46953],[-10.61272,6.43549],[-10.59185,6.39665],[-10.579,6.35452],[-10.57468,6.3107],[-10.57904,6.26689],[-10.59192,6.22477],[-10.61281,6.18595],[-10.64091,6.15193],[-10.67514,6.12401],[-10.7142,6.10326],[-10.75657,6.09049],[-10.80063,6.08617],[-10.84469,6.09049],[-10.88706,6.10326],[-10.92612,6.12401],[-10.96035,6.15193],[-10.98845,6.18595],[-11.00934,6.22477],[-11.02222,6.26689],[-11.02658,6.3107],[-11.02226,6.35452],[-11.00941,6.39665],[-10.98854,6.43549],[-10.96045,6.46953],[-10.92621,6.49747],[-10.88713,6.51823],[-10.84473,6.53101],[-10.80063,6.53533]]]}},"Cuttington-University":{type:"Feature",id:"Cuttington-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-9.5539,7.26498],[-9.50973,7.26066],[-9.46727,7.24788],[-9.42813,7.22711],[-9.39384,7.19917],[-9.3657,7.16513],[-9.3448,7.1263],[-9.33194,7.08416],[-9.32762,7.04035],[-9.33198,6.99653],[-9.34488,6.95441],[-9.3658,6.91559],[-9.39395,6.88157],[-9.42823,6.85365],[-9.46734,6.83291],[-9.50977,6.82013],[-9.5539,6.81582],[-9.59803,6.82013],[-9.64046,6.83291],[-9.67957,6.85365],[-9.71385,6.88157],[-9.742,6.91559],[-9.76292,6.95441],[-9.77582,6.99653],[-9.78018,7.04035],[-9.77586,7.08416],[-9.763,7.1263],[-9.7421,7.16513],[-9.71396,7.19917],[-9.67967,7.22711],[-9.64053,7.24788],[-9.59807,7.26066],[-9.5539,7.26498]]]}},"Grand-Gedeh-County-Community-College":{type:"Feature",id:"Grand-Gedeh-County-Community-College",properties:{},geometry:{type:"Polygon",coordinates:[[[-8.11817,6.28853],[-8.07409,6.28421],[-8.03171,6.27143],[-7.99266,6.25066],[-7.95843,6.22273],[-7.93035,6.18869],[-7.90949,6.14985],[-7.89665,6.10772],[-7.89233,6.0639],[-7.89669,6.02009],[-7.90955,5.97797],[-7.93043,5.93915],[-7.95852,5.90512],[-7.99274,5.8772],[-8.03178,5.85646],[-8.07413,5.84368],[-8.11817,5.83937],[-8.16221,5.84368],[-8.20456,5.85646],[-8.2436,5.8772],[-8.27782,5.90512],[-8.30591,5.93915],[-8.32679,5.97797],[-8.33966,6.02009],[-8.34401,6.0639],[-8.33969,6.10772],[-8.32686,6.14985],[-8.306,6.18869],[-8.27791,6.22273],[-8.24369,6.25066],[-8.20463,6.27143],[-8.16225,6.28421],[-8.11817,6.28853]]]}},"Nimba-County-Community-College":{type:"Feature",id:"Nimba-County-Community-College",properties:{},geometry:{type:"Polygon",coordinates:[[[-8.71645,7.57669],[-8.67226,7.57237],[-8.62976,7.55959],[-8.5906,7.53882],[-8.55628,7.51088],[-8.52812,7.47684],[-8.50721,7.438],[-8.49434,7.39587],[-8.49001,7.35205],[-8.49439,7.30824],[-8.50729,7.26612],[-8.52823,7.2273],[-8.55639,7.19328],[-8.5907,7.16536],[-8.62984,7.14462],[-8.6723,7.13185],[-8.71645,7.12753],[-8.76061,7.13185],[-8.80307,7.14462],[-8.84221,7.16536],[-8.87652,7.19328],[-8.90468,7.2273],[-8.92562,7.26612],[-8.93852,7.30824],[-8.9429,7.35205],[-8.93857,7.39587],[-8.9257,7.438],[-8.90479,7.47684],[-8.87663,7.51088],[-8.84231,7.53882],[-8.80315,7.55959],[-8.76065,7.57237],[-8.71645,7.57669]]]}},"Stella-Maris-Polytechnic":{type:"Feature",id:"Stella-Maris-Polytechnic",properties:{},geometry:{type:"Polygon",coordinates:[[[-10.7944,6.51458],[-10.7503,6.51026],[-10.7079,6.49748],[-10.66883,6.47672],[-10.63459,6.44878],[-10.60649,6.41474],[-10.58562,6.3759],[-10.57278,6.33377],[-10.56846,6.28995],[-10.57282,6.24614],[-10.58569,6.20402],[-10.60658,6.1652],[-10.63469,6.13117],[-10.66892,6.10325],[-10.70797,6.08251],[-10.75034,6.06973],[-10.7944,6.06542],[-10.83846,6.06973],[-10.88083,6.08251],[-10.91988,6.10325],[-10.95411,6.13117],[-10.98222,6.1652],[-11.00311,6.20402],[-11.01598,6.24614],[-11.02034,6.28995],[-11.01602,6.33377],[-11.00318,6.3759],[-10.98231,6.41474],[-10.95421,6.44878],[-10.91997,6.47672],[-10.8809,6.49748],[-10.8385,6.51026],[-10.7944,6.51458]]]}},"University-of-Liberia-YouthMappers":{type:"Feature",id:"University-of-Liberia-YouthMappers",properties:{},geometry:{type:"Polygon",coordinates:[[[-10.61986,6.60165],[-10.57576,6.59733],[-10.53335,6.58454],[-10.49427,6.56378],[-10.46002,6.53584],[-10.43192,6.5018],[-10.41105,6.46297],[-10.39821,6.42083],[-10.39389,6.37702],[-10.39825,6.33321],[-10.41112,6.29108],[-10.43202,6.25226],[-10.46012,6.21824],[-10.49436,6.19032],[-10.53342,6.16958],[-10.5758,6.1568],[-10.61986,6.15249],[-10.66393,6.1568],[-10.70631,6.16958],[-10.74536,6.19032],[-10.7796,6.21824],[-10.80771,6.25226],[-10.8286,6.29108],[-10.84148,6.33321],[-10.84584,6.37702],[-10.84152,6.42083],[-10.82867,6.46297],[-10.8078,6.5018],[-10.7797,6.53584],[-10.74546,6.56378],[-10.70638,6.58454],[-10.66397,6.59733],[-10.61986,6.60165]]]}},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]]]}},"University-of-Malawi":{type:"Feature",id:"University-of-Malawi",properties:{},geometry:{type:"Polygon",coordinates:[[[35.33203,-15.14437],[35.37742,-15.14868],[35.42107,-15.16145],[35.46131,-15.18218],[35.4966,-15.21009],[35.52557,-15.2441],[35.54712,-15.2829],[35.56042,-15.32502],[35.56494,-15.36883],[35.56051,-15.41265],[35.5473,-15.45479],[35.5258,-15.49364],[35.49685,-15.52769],[35.46154,-15.55564],[35.42125,-15.57642],[35.37752,-15.58921],[35.33203,-15.59353],[35.28654,-15.58921],[35.24281,-15.57642],[35.20252,-15.55564],[35.16721,-15.52769],[35.13826,-15.49364],[35.11676,-15.45479],[35.10355,-15.41265],[35.09912,-15.36883],[35.10365,-15.32502],[35.11694,-15.2829],[35.13849,-15.2441],[35.16747,-15.21009],[35.20275,-15.18218],[35.24299,-15.16145],[35.28664,-15.14868],[35.33203,-15.14437]]]}},"Universit-des-Sciences-Sociale-et-de-Gestion-de-Bamako":{type:"Feature",id:"Universit-des-Sciences-Sociale-et-de-Gestion-de-Bamako",properties:{},geometry:{type:"Polygon",coordinates:[[[-7.98832,12.83993],[-7.94339,12.83562],[-7.90018,12.82283],[-7.86037,12.80206],[-7.82549,12.77411],[-7.79688,12.74006],[-7.77564,12.70121],[-7.76257,12.65907],[-7.75819,12.61526],[-7.76265,12.57145],[-7.77578,12.52933],[-7.79707,12.49052],[-7.82569,12.45651],[-7.86056,12.4286],[-7.90033,12.40786],[-7.94347,12.39509],[-7.98832,12.39078],[-8.03318,12.39509],[-8.07632,12.40786],[-8.11609,12.4286],[-8.15095,12.45651],[-8.17958,12.49052],[-8.20087,12.52933],[-8.214,12.57145],[-8.21846,12.61526],[-8.21408,12.65907],[-8.20101,12.70121],[-8.17977,12.74006],[-8.15116,12.77411],[-8.11627,12.80206],[-8.07646,12.82283],[-8.03326,12.83562],[-7.98832,12.83993]]]}},"Universidade-Eduardo-Mondlane":{type:"Feature",id:"Universidade-Eduardo-Mondlane",properties:{},geometry:{type:"Polygon",coordinates:[[[32.60357,-25.72761],[32.65221,-25.73192],[32.69898,-25.74467],[32.74211,-25.76539],[32.77994,-25.79328],[32.81102,-25.82727],[32.83416,-25.86606],[32.84845,-25.90817],[32.85334,-25.95197],[32.84863,-25.99579],[32.83449,-26.03795],[32.81146,-26.07681],[32.78042,-26.11088],[32.74255,-26.13885],[32.69932,-26.15964],[32.65239,-26.17244],[32.60357,-26.17677],[32.55475,-26.17244],[32.50782,-26.15964],[32.46459,-26.13885],[32.42672,-26.11088],[32.39568,-26.07681],[32.37265,-26.03795],[32.35851,-25.99579],[32.35381,-25.95197],[32.3587,-25.90817],[32.37299,-25.86606],[32.39612,-25.82727],[32.4272,-25.79328],[32.46503,-25.76539],[32.50816,-25.74467],[32.55493,-25.73192],[32.60357,-25.72761]]]}},"Namibia-University-of-Science-and-Technology":{type:"Feature",id:"Namibia-University-of-Science-and-Technology",properties:{},geometry:{type:"Polygon",coordinates:[[[17.07709,-22.34124],[17.12446,-22.34555],[17.17002,-22.35831],[17.21202,-22.37903],[17.24886,-22.40692],[17.27912,-22.44092],[17.30164,-22.47972],[17.31554,-22.52183],[17.32029,-22.56563],[17.31569,-22.60945],[17.30192,-22.6516],[17.27949,-22.69046],[17.24926,-22.72453],[17.21239,-22.75249],[17.1703,-22.77327],[17.12461,-22.78607],[17.07709,-22.79039],[17.02957,-22.78607],[16.98388,-22.77327],[16.94179,-22.75249],[16.90493,-22.72453],[16.8747,-22.69046],[16.85226,-22.6516],[16.83849,-22.60945],[16.83389,-22.56563],[16.83864,-22.52183],[16.85255,-22.47972],[16.87506,-22.44092],[16.90532,-22.40692],[16.94216,-22.37903],[16.98416,-22.35831],[17.02972,-22.34555],[17.07709,-22.34124]]]}},"Abia-State-University":{type:"Feature",id:"Abia-State-University",properties:{},geometry:{type:"Polygon",coordinates:[[[7.41909,6.0554],[7.46315,6.05108],[7.50551,6.0383],[7.54455,6.01753],[7.57877,5.9896],[7.60684,5.95556],[7.62769,5.91672],[7.64052,5.87459],[7.64484,5.83077],[7.64048,5.78696],[7.62762,5.74484],[7.60675,5.70602],[7.57868,5.67199],[7.54447,5.64407],[7.50545,5.62333],[7.46312,5.61055],[7.41909,5.60624],[7.37507,5.61055],[7.33274,5.62333],[7.29372,5.64407],[7.25951,5.67199],[7.23143,5.70602],[7.21056,5.74484],[7.1977,5.78696],[7.19335,5.83077],[7.19767,5.87459],[7.2105,5.91672],[7.23135,5.95556],[7.25942,5.9896],[7.29363,6.01753],[7.33267,6.0383],[7.37503,6.05108],[7.41909,6.0554]]]}},"Ahmadu-Bello-University":{type:"Feature",id:"Ahmadu-Bello-University",properties:{},geometry:{type:"Polygon",coordinates:[[[7.64648,11.40298],[7.69118,11.39866],[7.73415,11.38587],[7.77375,11.36511],[7.80845,11.33716],[7.83691,11.30311],[7.85804,11.26427],[7.87104,11.22213],[7.87541,11.17831],[7.87097,11.13451],[7.85792,11.09239],[7.83674,11.05357],[7.80827,11.01956],[7.77359,10.99164],[7.73403,10.97091],[7.69111,10.95813],[7.64648,10.95382],[7.60186,10.95813],[7.55894,10.97091],[7.51938,10.99164],[7.4847,11.01956],[7.45622,11.05357],[7.43505,11.09239],[7.422,11.13451],[7.41756,11.17831],[7.42193,11.22213],[7.43493,11.26427],[7.45606,11.30311],[7.48452,11.33716],[7.51922,11.36511],[7.55882,11.38587],[7.60179,11.39866],[7.64648,11.40298]]]}},"Federal-School-of-Surveys":{type:"Feature",id:"Federal-School-of-Surveys",properties:{},geometry:{type:"Polygon",coordinates:[[[3.95129,8.06678],[3.99554,8.06247],[4.03808,8.04968],[4.07729,8.02892],[4.11165,8.00098],[4.13984,7.96693],[4.16077,7.9281],[4.17365,7.88596],[4.17798,7.84215],[4.17361,7.79833],[4.16069,7.75621],[4.13972,7.7174],[4.11153,7.68337],[4.07718,7.65546],[4.038,7.63471],[3.99549,7.62194],[3.95129,7.61763],[3.90708,7.62194],[3.86457,7.63471],[3.82539,7.65546],[3.79105,7.68337],[3.76285,7.7174],[3.74189,7.75621],[3.72897,7.79833],[3.72459,7.84215],[3.72892,7.88596],[3.7418,7.9281],[3.76274,7.96693],[3.79092,8.00098],[3.82528,8.02892],[3.86449,8.04968],[3.90704,8.06247],[3.95129,8.06678]]]}},"Federal-University-of-Technology-Akure":{type:"Feature",id:"Federal-University-of-Technology-Akure",properties:{},geometry:{type:"Polygon",coordinates:[[[5.18555,7.49987],[5.22974,7.49555],[5.27223,7.48277],[5.31138,7.46201],[5.34569,7.43407],[5.37385,7.40002],[5.39475,7.36119],[5.40762,7.31905],[5.41195,7.27524],[5.40758,7.23143],[5.39467,7.1893],[5.37374,7.15048],[5.34558,7.11646],[5.31128,7.08854],[5.27215,7.0678],[5.22969,7.05503],[5.18555,7.05071],[5.1414,7.05503],[5.09895,7.0678],[5.05982,7.08854],[5.02551,7.11646],[4.99735,7.15048],[4.97642,7.1893],[4.96352,7.23143],[4.95915,7.27524],[4.96347,7.31905],[4.97634,7.36119],[4.99725,7.40002],[5.0254,7.43407],[5.05971,7.46201],[5.09887,7.48277],[5.14136,7.49555],[5.18555,7.49987]]]}},"Ignatius-Ajuru-University-of-Education":{type:"Feature",id:"Ignatius-Ajuru-University-of-Education",properties:{},geometry:{type:"Polygon",coordinates:[[[6.93364,5.03111],[6.97762,5.02679],[7.01991,5.01401],[7.05888,4.99325],[7.09304,4.96531],[7.12106,4.93127],[7.14188,4.89244],[7.15469,4.85031],[7.15901,4.80649],[7.15466,4.76268],[7.14183,4.72056],[7.12099,4.68174],[7.09296,4.64771],[7.05881,4.61979],[7.01986,4.59904],[6.97759,4.58627],[6.93364,4.58195],[6.88968,4.58627],[6.84742,4.59904],[6.80846,4.61979],[6.77431,4.64771],[6.74628,4.68174],[6.72545,4.72056],[6.71261,4.76268],[6.70826,4.80649],[6.71258,4.85031],[6.72539,4.89244],[6.74621,4.93127],[6.77424,4.96531],[6.80839,4.99325],[6.84736,5.01401],[6.88965,5.02679],[6.93364,5.03111]]]}},"University-of-Nigeria-Nsukka":{type:"Feature",id:"University-of-Nigeria-Nsukka",properties:{},geometry:{type:"Polygon",coordinates:[[[7.40821,7.08921],[7.45236,7.0849],[7.49481,7.07211],[7.53393,7.05135],[7.56821,7.02341],[7.59634,6.98937],[7.61723,6.95053],[7.63008,6.9084],[7.63441,6.86458],[7.63004,6.82077],[7.61715,6.77865],[7.59624,6.73983],[7.5681,6.70581],[7.53383,6.67789],[7.49473,6.65714],[7.45232,6.64437],[7.40821,6.64006],[7.3641,6.64437],[7.32168,6.65714],[7.28259,6.67789],[7.24831,6.70581],[7.22018,6.73983],[7.19926,6.77865],[7.18637,6.82077],[7.18201,6.86458],[7.18633,6.9084],[7.19919,6.95053],[7.22008,6.98937],[7.24821,7.02341],[7.28249,7.05135],[7.32161,7.07211],[7.36406,7.0849],[7.40821,7.08921]]]}},"University-of-Port-Harcourt":{type:"Feature",id:"University-of-Port-Harcourt",properties:{},geometry:{type:"Polygon",coordinates:[[[6.92037,5.12633],[6.96436,5.12201],[7.00665,5.10923],[7.04563,5.08847],[7.07979,5.06053],[7.10782,5.02649],[7.12864,4.98766],[7.14145,4.94553],[7.14577,4.90171],[7.14142,4.8579],[7.12859,4.81578],[7.10775,4.77696],[7.07971,4.74293],[7.04556,4.71501],[7.0066,4.69426],[6.96433,4.68149],[6.92037,4.67717],[6.87641,4.68149],[6.83414,4.69426],[6.79517,4.71501],[6.76102,4.74293],[6.73299,4.77696],[6.71215,4.81578],[6.69931,4.8579],[6.69496,4.90171],[6.69928,4.94553],[6.71209,4.98766],[6.73292,5.02649],[6.76094,5.06053],[6.7951,5.08847],[6.83408,5.10923],[6.87638,5.12201],[6.92037,5.12633]]]}},"University-of-Nigeria-Enugu-Campus":{type:"Feature",id:"University-of-Nigeria-Enugu-Campus",properties:{},geometry:{type:"Polygon",coordinates:[[[7.50373,6.651],[7.54784,6.64668],[7.59025,6.63389],[7.62934,6.61313],[7.66359,6.58519],[7.69169,6.55115],[7.71256,6.51232],[7.72541,6.47018],[7.72973,6.42637],[7.72537,6.38256],[7.71249,6.34043],[7.6916,6.30161],[7.66349,6.26759],[7.62924,6.23967],[7.59018,6.21893],[7.5478,6.20615],[7.50373,6.20184],[7.45966,6.20615],[7.41728,6.21893],[7.37822,6.23967],[7.34398,6.26759],[7.31587,6.30161],[7.29497,6.34043],[7.28209,6.38256],[7.27773,6.42637],[7.28206,6.47018],[7.2949,6.51232],[7.31577,6.55115],[7.34388,6.58519],[7.37813,6.61313],[7.41721,6.63389],[7.45962,6.64668],[7.50373,6.651]]]}},"Insititue-d-Enseignement-Superieur-de-Ruhengeri":{type:"Feature",id:"Insititue-d-Enseignement-Superieur-de-Ruhengeri",properties:{},geometry:{type:"Polygon",coordinates:[[[29.6112,-1.27634],[29.65502,-1.28065],[29.69717,-1.29343],[29.736,-1.31418],[29.77005,-1.34211],[29.79799,-1.37614],[29.81875,-1.41496],[29.83154,-1.45709],[29.83586,-1.5009],[29.83154,-1.54472],[29.81876,-1.58685],[29.79801,-1.62568],[29.77007,-1.65971],[29.73602,-1.68764],[29.69718,-1.7084],[29.65503,-1.72118],[29.6112,-1.72549],[29.56737,-1.72118],[29.52522,-1.7084],[29.48638,-1.68764],[29.45233,-1.65971],[29.4244,-1.62568],[29.40364,-1.58685],[29.39086,-1.54472],[29.38655,-1.5009],[29.39087,-1.45709],[29.40365,-1.41496],[29.42442,-1.37614],[29.45236,-1.34211],[29.4864,-1.31418],[29.52524,-1.29343],[29.56738,-1.28065],[29.6112,-1.27634]]]}},"University-of-Rwanda-Huye-Campus":{type:"Feature",id:"University-of-Rwanda-Huye-Campus",properties:{},geometry:{type:"Polygon",coordinates:[[[29.7397,-2.39052],[29.78355,-2.39484],[29.82572,-2.40761],[29.86458,-2.42836],[29.89865,-2.45629],[29.92661,-2.49032],[29.94739,-2.52914],[29.96019,-2.57127],[29.96451,-2.61508],[29.9602,-2.65889],[29.94741,-2.70103],[29.92664,-2.73986],[29.89869,-2.77389],[29.86462,-2.80182],[29.82575,-2.82258],[29.78357,-2.83536],[29.7397,-2.83968],[29.69583,-2.83536],[29.65365,-2.82258],[29.61478,-2.80182],[29.58071,-2.77389],[29.55276,-2.73986],[29.53199,-2.70103],[29.5192,-2.65889],[29.51489,-2.61508],[29.51921,-2.57127],[29.53201,-2.52914],[29.55279,-2.49032],[29.58075,-2.45629],[29.61482,-2.42836],[29.65368,-2.40761],[29.69585,-2.39484],[29.7397,-2.39052]]]}},"Institut-Suprieur-de-Management-Kolda":{type:"Feature",id:"Institut-Suprieur-de-Management-Kolda",properties:{},geometry:{type:"Polygon",coordinates:[[[-14.94108,13.11445],[-14.8961,13.11013],[-14.85285,13.09734],[-14.81299,13.07657],[-14.77807,13.04862],[-14.74943,13.01457],[-14.72816,12.97573],[-14.71509,12.93359],[-14.7107,12.88977],[-14.71517,12.84596],[-14.72831,12.80384],[-14.74962,12.76503],[-14.77828,12.73102],[-14.81319,12.70311],[-14.85299,12.68237],[-14.89618,12.66961],[-14.94108,12.66529],[-14.98599,12.66961],[-15.02918,12.68237],[-15.06898,12.70311],[-15.10389,12.73102],[-15.13255,12.76503],[-15.15386,12.80384],[-15.167,12.84596],[-15.17147,12.88977],[-15.16708,12.93359],[-15.15401,12.97573],[-15.13274,13.01457],[-15.1041,13.04862],[-15.06918,13.07657],[-15.02932,13.09734],[-14.98607,13.11013],[-14.94108,13.11445]]]}},"Universit-Gaston-Berger":{type:"Feature",id:"Universit-Gaston-Berger",properties:{},geometry:{type:"Polygon",coordinates:[[[-16.42556,16.28748],[-16.37992,16.28316],[-16.33604,16.27037],[-16.2956,16.2496],[-16.26018,16.22164],[-16.23112,16.18759],[-16.20956,16.14874],[-16.1963,16.1066],[-16.19186,16.06278],[-16.1964,16.01897],[-16.20974,15.97685],[-16.23137,15.93805],[-16.26044,15.90404],[-16.29585,15.87614],[-16.33622,15.8554],[-16.38002,15.84264],[-16.42556,15.83833],[-16.47111,15.84264],[-16.51491,15.8554],[-16.55528,15.87614],[-16.59069,15.90404],[-16.61976,15.93805],[-16.64138,15.97685],[-16.65473,16.01897],[-16.65927,16.06278],[-16.65483,16.1066],[-16.64157,16.14874],[-16.62,16.18759],[-16.59095,16.22164],[-16.55552,16.2496],[-16.51509,16.27037],[-16.47121,16.28316],[-16.42556,16.28748]]]}},"Fourah-Bay-College":{type:"Feature",id:"Fourah-Bay-College",properties:{},geometry:{type:"Polygon",coordinates:[[[-13.18359,8.71868],[-13.13927,8.71437],[-13.09665,8.70158],[-13.05738,8.68081],[-13.02296,8.65287],[-12.99473,8.61883],[-12.97376,8.57999],[-12.96086,8.53785],[-12.95652,8.49404],[-12.96091,8.45023],[-12.97386,8.40811],[-12.99485,8.36929],[-13.0231,8.33527],[-13.0575,8.30735],[-13.09674,8.28661],[-13.13932,8.27384],[-13.18359,8.26953],[-13.22787,8.27384],[-13.27044,8.28661],[-13.30969,8.30735],[-13.34409,8.33527],[-13.37233,8.36929],[-13.39333,8.40811],[-13.40627,8.45023],[-13.41066,8.49404],[-13.40633,8.53785],[-13.39343,8.57999],[-13.37246,8.61883],[-13.34422,8.65287],[-13.30981,8.68081],[-13.27054,8.70158],[-13.22792,8.71437],[-13.18359,8.71868]]]}},"Njala-University-Freetown-Campus":{type:"Feature",id:"Njala-University-Freetown-Campus",properties:{},geometry:{type:"Polygon",coordinates:[[[-13.23673,8.7042],[-13.19241,8.69988],[-13.14979,8.68709],[-13.11052,8.66633],[-13.07611,8.63839],[-13.04787,8.60434],[-13.02691,8.5655],[-13.01401,8.52337],[-13.00967,8.47955],[-13.01406,8.43574],[-13.027,8.39362],[-13.048,8.3548],[-13.07624,8.32078],[-13.11064,8.29287],[-13.14988,8.27212],[-13.19246,8.25935],[-13.23673,8.25504],[-13.281,8.25935],[-13.32358,8.27212],[-13.36282,8.29287],[-13.39722,8.32078],[-13.42546,8.3548],[-13.44646,8.39362],[-13.4594,8.43574],[-13.46379,8.47955],[-13.45945,8.52337],[-13.44655,8.5655],[-13.42559,8.60434],[-13.39735,8.63839],[-13.36294,8.66633],[-13.32367,8.68709],[-13.28105,8.69988],[-13.23673,8.7042]]]}},"Njala-University-Njala-Campus":{type:"Feature",id:"Njala-University-Njala-Campus",properties:{},geometry:{type:"Polygon",coordinates:[[[-11.76548,8.16057],[-11.72122,8.15625],[-11.67867,8.14347],[-11.63945,8.1227],[-11.60508,8.09476],[-11.57689,8.06072],[-11.55595,8.02188],[-11.54307,7.97975],[-11.53873,7.93593],[-11.54311,7.89212],[-11.55604,7.85],[-11.577,7.81118],[-11.60521,7.77716],[-11.63956,7.74924],[-11.67875,7.7285],[-11.72127,7.71573],[-11.76548,7.71141],[-11.8097,7.71573],[-11.85221,7.7285],[-11.8914,7.74924],[-11.92576,7.77716],[-11.95396,7.81118],[-11.97493,7.85],[-11.98785,7.89212],[-11.99223,7.93593],[-11.9879,7.97975],[-11.97502,8.02188],[-11.95408,8.06072],[-11.92588,8.09476],[-11.89152,8.1227],[-11.8523,8.14347],[-11.80974,8.15625],[-11.76548,8.16057]]]}},"University-of-Pretoria":{type:"Feature",id:"University-of-Pretoria",properties:{},geometry:{type:"Polygon",coordinates:[[[28.21289,-25.49616],[28.26143,-25.50046],[28.30812,-25.51322],[28.35116,-25.53394],[28.38892,-25.56183],[28.41994,-25.59582],[28.44303,-25.63461],[28.45729,-25.67672],[28.46217,-25.72052],[28.45747,-25.76434],[28.44336,-25.8065],[28.42037,-25.84536],[28.38939,-25.87943],[28.3516,-25.9074],[28.30845,-25.92819],[28.26161,-25.94099],[28.21289,-25.94531],[28.16417,-25.94099],[28.11733,-25.92819],[28.07418,-25.9074],[28.03639,-25.87943],[28.00541,-25.84536],[27.98242,-25.8065],[27.96831,-25.76434],[27.96361,-25.72052],[27.96849,-25.67672],[27.98275,-25.63461],[28.00584,-25.59582],[28.03686,-25.56183],[28.07462,-25.53394],[28.11766,-25.51322],[28.16435,-25.50046],[28.21289,-25.49616]]]}},"Ardhi-University":{type:"Feature",id:"Ardhi-University",properties:{},geometry:{type:"Polygon",coordinates:[[[39.21541,-6.54158],[39.25951,-6.54589],[39.30192,-6.55867],[39.34101,-6.57941],[39.37527,-6.60733],[39.4034,-6.64135],[39.42431,-6.68017],[39.4372,-6.72229],[39.44156,-6.7661],[39.43724,-6.80992],[39.42439,-6.85205],[39.4035,-6.89089],[39.37538,-6.92493],[39.3411,-6.95287],[39.30199,-6.97363],[39.25955,-6.98642],[39.21541,-6.99074],[39.17127,-6.98642],[39.12883,-6.97363],[39.08972,-6.95287],[39.05544,-6.92493],[39.02732,-6.89089],[39.00643,-6.85205],[38.99358,-6.80992],[38.98926,-6.7661],[38.99362,-6.72229],[39.00651,-6.68017],[39.02742,-6.64135],[39.05555,-6.60733],[39.08981,-6.57941],[39.1289,-6.55867],[39.17131,-6.54589],[39.21541,-6.54158]]]}},"Institute-of-Finance-Management":{type:"Feature",id:"Institute-of-Finance-Management",properties:{},geometry:{type:"Polygon",coordinates:[[[39.2935,-5.91323],[39.33755,-5.91754],[39.3799,-5.93032],[39.41894,-5.95107],[39.45317,-5.97899],[39.48126,-6.01301],[39.50215,-6.05183],[39.51501,-6.09395],[39.51937,-6.13776],[39.51505,-6.18158],[39.50221,-6.22371],[39.48135,-6.26255],[39.45326,-6.29659],[39.41903,-6.32453],[39.37997,-6.34529],[39.33758,-6.35807],[39.2935,-6.36239],[39.24941,-6.35807],[39.20703,-6.34529],[39.16797,-6.32453],[39.13373,-6.29659],[39.10565,-6.26255],[39.08479,-6.22371],[39.07195,-6.18158],[39.06763,-6.13776],[39.07198,-6.09395],[39.08485,-6.05183],[39.10574,-6.01301],[39.13383,-5.97899],[39.16805,-5.95107],[39.20709,-5.93032],[39.24945,-5.91754],[39.2935,-5.91323]]]}},"Institute-of-Rural-Development-Planning-Mwanza":{type:"Feature",id:"Institute-of-Rural-Development-Planning-Mwanza",properties:{},geometry:{type:"Polygon",coordinates:[[[32.89851,-2.29201],[32.94236,-2.29632],[32.98452,-2.3091],[33.02338,-2.32985],[33.05745,-2.35778],[33.08541,-2.3918],[33.10618,-2.43063],[33.11898,-2.47275],[33.12331,-2.51657],[33.119,-2.56038],[33.10621,-2.60251],[33.08544,-2.64134],[33.05749,-2.67538],[33.02342,-2.70331],[32.98455,-2.72407],[32.94238,-2.73685],[32.89851,-2.74116],[32.85465,-2.73685],[32.81247,-2.72407],[32.7736,-2.70331],[32.73954,-2.67538],[32.71158,-2.64134],[32.69081,-2.60251],[32.67803,-2.56038],[32.67372,-2.51657],[32.67804,-2.47275],[32.69084,-2.43063],[32.71162,-2.3918],[32.73958,-2.35778],[32.77364,-2.32985],[32.8125,-2.3091],[32.85466,-2.29632],[32.89851,-2.29201]]]}},"Institute-of-Rural-Development-Planning":{type:"Feature",id:"Institute-of-Rural-Development-Planning",properties:{},geometry:{type:"Polygon",coordinates:[[[35.74578,-5.89759],[35.78983,-5.9019],[35.83218,-5.91468],[35.87122,-5.93543],[35.90545,-5.96335],[35.93354,-5.99737],[35.95442,-6.03619],[35.96729,-6.07831],[35.97165,-6.12212],[35.96733,-6.16594],[35.95449,-6.20807],[35.93363,-6.24691],[35.90554,-6.28095],[35.87131,-6.30889],[35.83225,-6.32965],[35.78986,-6.34243],[35.74578,-6.34675],[35.7017,-6.34243],[35.65931,-6.32965],[35.62025,-6.30889],[35.58602,-6.28095],[35.55794,-6.24691],[35.53707,-6.20807],[35.52424,-6.16594],[35.51992,-6.12212],[35.52427,-6.07831],[35.53714,-6.03619],[35.55802,-5.99737],[35.58612,-5.96335],[35.62034,-5.93543],[35.65938,-5.91468],[35.70174,-5.9019],[35.74578,-5.89759]]]}},"Open-University-of-Tanzania":{type:"Feature",id:"Open-University-of-Tanzania",properties:{},geometry:{type:"Polygon",coordinates:[[[39.26466,-6.55895],[39.30876,-6.56326],[39.35117,-6.57603],[39.39026,-6.59678],[39.42453,-6.6247],[39.45266,-6.65872],[39.47357,-6.69754],[39.48646,-6.73966],[39.49082,-6.78347],[39.4865,-6.82729],[39.47364,-6.86942],[39.45275,-6.90826],[39.42463,-6.9423],[39.39036,-6.97024],[39.35125,-6.991],[39.3088,-7.00379],[39.26466,-7.0081],[39.22052,-7.00379],[39.17807,-6.991],[39.13896,-6.97024],[39.10469,-6.9423],[39.07656,-6.90826],[39.05568,-6.86942],[39.04282,-6.82729],[39.0385,-6.78347],[39.04286,-6.73966],[39.05575,-6.69754],[39.07666,-6.65872],[39.10479,-6.6247],[39.13906,-6.59678],[39.17815,-6.57603],[39.22056,-6.56326],[39.26466,-6.55895]]]}},"Sokoine-University-of-Agriculture":{type:"Feature",id:"Sokoine-University-of-Agriculture",properties:{},geometry:{type:"Polygon",coordinates:[[[37.65636,-6.62796],[37.70047,-6.63227],[37.74288,-6.64505],[37.78198,-6.66579],[37.81625,-6.69371],[37.84439,-6.72773],[37.8653,-6.76655],[37.87819,-6.80868],[37.88255,-6.85249],[37.87823,-6.8963],[37.86537,-6.93844],[37.84448,-6.97727],[37.81636,-7.01131],[37.78208,-7.03925],[37.74296,-7.06002],[37.70051,-7.0728],[37.65636,-7.07712],[37.61221,-7.0728],[37.56976,-7.06002],[37.53064,-7.03925],[37.49636,-7.01131],[37.46824,-6.97727],[37.44735,-6.93844],[37.43449,-6.8963],[37.43017,-6.85249],[37.43453,-6.80868],[37.44742,-6.76655],[37.46833,-6.72773],[37.49647,-6.69371],[37.53074,-6.66579],[37.56984,-6.64505],[37.61225,-6.63227],[37.65636,-6.62796]]]}},"University-of-Dar-es-Salaam":{type:"Feature",id:"University-of-Dar-es-Salaam",properties:{},geometry:{type:"Polygon",coordinates:[[[39.20531,-6.55579],[39.24941,-6.56011],[39.29182,-6.57288],[39.33091,-6.59363],[39.36518,-6.62155],[39.39331,-6.65557],[39.41422,-6.69439],[39.42711,-6.73651],[39.43147,-6.78032],[39.42715,-6.82414],[39.41429,-6.86627],[39.39341,-6.90511],[39.36528,-6.93915],[39.33101,-6.96709],[39.2919,-6.98785],[39.24945,-7.00063],[39.20531,-7.00495],[39.16117,-7.00063],[39.11873,-6.98785],[39.07961,-6.96709],[39.04534,-6.93915],[39.01722,-6.90511],[38.99633,-6.86627],[38.98348,-6.82414],[38.97915,-6.78032],[38.98352,-6.73651],[38.9964,-6.69439],[39.01731,-6.65557],[39.04544,-6.62155],[39.07971,-6.59363],[39.1188,-6.57288],[39.16121,-6.56011],[39.20531,-6.55579]]]}},"Busitema-University":{type:"Feature",id:"Busitema-University",properties:{},geometry:{type:"Polygon",coordinates:[[[34.01367,0.75192],[34.05749,0.7476],[34.09962,0.73482],[34.13845,0.71407],[34.17248,0.68614],[34.20041,0.6521],[34.22117,0.61328],[34.23395,0.57115],[34.23826,0.52733],[34.23394,0.48352],[34.22116,0.44139],[34.20041,0.40256],[34.17248,0.36853],[34.13844,0.3406],[34.09962,0.31985],[34.05749,0.30707],[34.01367,0.30276],[33.96986,0.30707],[33.92773,0.31985],[33.8889,0.3406],[33.85487,0.36853],[33.82694,0.40256],[33.80618,0.44139],[33.7934,0.48352],[33.78908,0.52733],[33.7934,0.57115],[33.80618,0.61328],[33.82693,0.6521],[33.85486,0.68614],[33.88889,0.71407],[33.92772,0.73482],[33.96986,0.7476],[34.01367,0.75192]]]}},"Gulu-University":{type:"Feature",id:"Gulu-University",properties:{},geometry:{type:"Polygon",coordinates:[[[32.34375,3.03595],[32.38762,3.03163],[32.42981,3.01885],[32.46869,2.99809],[32.50276,2.97016],[32.53073,2.93613],[32.5515,2.8973],[32.56429,2.85516],[32.5686,2.81135],[32.56427,2.76754],[32.55147,2.72541],[32.53069,2.68659],[32.50272,2.65256],[32.46865,2.62463],[32.42978,2.60388],[32.38761,2.59111],[32.34375,2.58679],[32.29989,2.59111],[32.25772,2.60388],[32.21885,2.62463],[32.18478,2.65256],[32.15681,2.68659],[32.13603,2.72541],[32.12323,2.76754],[32.1189,2.81135],[32.12321,2.85516],[32.136,2.8973],[32.15677,2.93613],[32.18474,2.97016],[32.21881,2.99809],[32.25769,3.01885],[32.29988,3.03163],[32.34375,3.03595]]]}},"Kumi-University":{type:"Feature",id:"Kumi-University",properties:{},geometry:{type:"Polygon",coordinates:[[[33.83789,1.71855],[33.88172,1.71423],[33.92387,1.70145],[33.96271,1.6807],[33.99676,1.65277],[34.0247,1.61873],[34.04545,1.5799],[34.05823,1.53777],[34.06255,1.49396],[34.05822,1.45015],[34.04544,1.40802],[34.02467,1.36919],[33.99673,1.33516],[33.96269,1.30724],[33.92385,1.28649],[33.88171,1.27371],[33.83789,1.26939],[33.79407,1.27371],[33.75193,1.28649],[33.71309,1.30724],[33.67905,1.33516],[33.65111,1.36919],[33.63034,1.40802],[33.61756,1.45015],[33.61324,1.49396],[33.61755,1.53777],[33.63033,1.5799],[33.65109,1.61873],[33.67902,1.65277],[33.71307,1.6807],[33.75191,1.70145],[33.79406,1.71423],[33.83789,1.71855]]]}},"Makerere-University":{type:"Feature",id:"Makerere-University",properties:{},geometry:{type:"Polygon",coordinates:[[[32.60742,0.57614],[32.65124,0.57182],[32.69337,0.55904],[32.7322,0.53829],[32.76623,0.51036],[32.79416,0.47633],[32.81491,0.4375],[32.82769,0.39537],[32.832,0.35156],[32.82769,0.30774],[32.81491,0.26562],[32.79415,0.22679],[32.76622,0.19276],[32.73219,0.16483],[32.69336,0.14408],[32.65124,0.1313],[32.60742,0.12698],[32.56361,0.1313],[32.52148,0.14408],[32.48265,0.16483],[32.44862,0.19276],[32.42069,0.22679],[32.39994,0.26562],[32.38716,0.30774],[32.38284,0.35156],[32.38715,0.39537],[32.39993,0.4375],[32.42069,0.47633],[32.44861,0.51036],[32.48265,0.53829],[32.52148,0.55904],[32.56361,0.57182],[32.60742,0.57614]]]}},"Mbarara-University-of-Science-and-Technology":{type:"Feature",id:"Mbarara-University-of-Science-and-Technology",properties:{},geometry:{type:"Polygon",coordinates:[[[30.65679,-0.39187],[30.7006,-0.39618],[30.74273,-0.40896],[30.78156,-0.42971],[30.81559,-0.45764],[30.84353,-0.49167],[30.86428,-0.5305],[30.87706,-0.57263],[30.88138,-0.61644],[30.87707,-0.66025],[30.86429,-0.70238],[30.84353,-0.74121],[30.8156,-0.77524],[30.78157,-0.80317],[30.74274,-0.82393],[30.70061,-0.83671],[30.65679,-0.84102],[30.61297,-0.83671],[30.57084,-0.82393],[30.53201,-0.80317],[30.49797,-0.77524],[30.47004,-0.74121],[30.44929,-0.70238],[30.43651,-0.66025],[30.4322,-0.61644],[30.43651,-0.57263],[30.4493,-0.5305],[30.47005,-0.49167],[30.49798,-0.45764],[30.53202,-0.42971],[30.57084,-0.40896],[30.61297,-0.39618],[30.65679,-0.39187]]]}},"St.-Augustine-International-University":{type:"Feature",id:"St.-Augustine-International-University",properties:{},geometry:{type:"Polygon",coordinates:[[[32.62161,0.49696],[32.66543,0.49264],[32.70756,0.47986],[32.74639,0.45911],[32.78042,0.43118],[32.80835,0.39714],[32.8291,0.35832],[32.84188,0.31619],[32.8462,0.27237],[32.84188,0.22856],[32.8291,0.18643],[32.80834,0.14761],[32.78042,0.11357],[32.74638,0.08565],[32.70756,0.06489],[32.66543,0.05211],[32.62161,0.0478],[32.5778,0.05211],[32.53567,0.06489],[32.49684,0.08565],[32.46281,0.11357],[32.43488,0.14761],[32.41413,0.18643],[32.40135,0.22856],[32.39703,0.27237],[32.40135,0.31619],[32.41413,0.35832],[32.43488,0.39714],[32.46281,0.43118],[32.49684,0.45911],[32.53567,0.47986],[32.5778,0.49264],[32.62161,0.49696]]]}},"Uganda-Christian-University-Mbale-Campus":{type:"Feature",id:"Uganda-Christian-University-Mbale-Campus",properties:{},geometry:{type:"Polygon",coordinates:[[[34.17487,1.30046],[34.21869,1.29614],[34.26083,1.28336],[34.29967,1.26261],[34.3337,1.23468],[34.36164,1.20064],[34.38239,1.16182],[34.39517,1.11969],[34.39949,1.07587],[34.39517,1.03206],[34.38238,0.98993],[34.36162,0.95111],[34.33369,0.91707],[34.29965,0.88915],[34.26082,0.8684],[34.21868,0.85562],[34.17487,0.8513],[34.13105,0.85562],[34.08891,0.8684],[34.05008,0.88915],[34.01605,0.91707],[33.98811,0.95111],[33.96735,0.98993],[33.95457,1.03206],[33.95025,1.07587],[33.95456,1.11969],[33.96734,1.16182],[33.9881,1.20064],[34.01603,1.23468],[34.05007,1.26261],[34.0889,1.28336],[34.13104,1.29614],[34.17487,1.30046]]]}},"Uganda-Pentecostal-University":{type:"Feature",id:"Uganda-Pentecostal-University",properties:{},geometry:{type:"Polygon",coordinates:[[[30.26621,0.88664],[30.31003,0.88233],[30.35216,0.86955],[30.39099,0.84879],[30.42503,0.82086],[30.45296,0.78683],[30.47371,0.748],[30.48649,0.70587],[30.4908,0.66206],[30.48649,0.61825],[30.4737,0.57612],[30.45295,0.53729],[30.42502,0.50326],[30.39098,0.47533],[30.35215,0.45458],[30.31002,0.4418],[30.26621,0.43749],[30.22239,0.4418],[30.18026,0.45458],[30.14144,0.47533],[30.1074,0.50326],[30.07947,0.53729],[30.05871,0.57612],[30.04593,0.61825],[30.04162,0.66206],[30.04593,0.70587],[30.05871,0.748],[30.07946,0.78683],[30.10739,0.82086],[30.14143,0.84879],[30.18026,0.86955],[30.22239,0.88233],[30.26621,0.88664]]]}},"St.-Mawaggali-Trades-Training-Institute":{type:"Feature",id:"St.-Mawaggali-Trades-Training-Institute",properties:{},geometry:{type:"Polygon",coordinates:[[[26.9671,-16.59033],[27.01282,-16.59464],[27.05679,-16.60741],[27.09732,-16.62814],[27.13286,-16.65604],[27.16204,-16.69005],[27.18376,-16.72886],[27.19715,-16.77097],[27.20171,-16.81478],[27.19726,-16.8586],[27.18395,-16.90074],[27.1623,-16.93959],[27.13314,-16.97365],[27.09757,-17.0016],[27.05698,-17.02238],[27.01293,-17.03517],[26.9671,-17.03949],[26.92128,-17.03517],[26.87722,-17.02238],[26.83663,-17.0016],[26.80107,-16.97365],[26.7719,-16.93959],[26.75025,-16.90074],[26.73695,-16.8586],[26.73249,-16.81478],[26.73705,-16.77097],[26.75045,-16.72886],[26.77216,-16.69005],[26.80135,-16.65604],[26.83689,-16.62814],[26.87742,-16.60741],[26.92138,-16.59464],[26.9671,-16.59033]]]}},"The-University-of-Zambia":{type:"Feature",id:"The-University-of-Zambia",properties:{},geometry:{type:"Polygon",coordinates:[[[28.33027,-15.16737],[28.37567,-15.17168],[28.41932,-15.18445],[28.45957,-15.20518],[28.49485,-15.23309],[28.52383,-15.2671],[28.54538,-15.3059],[28.55868,-15.34802],[28.5632,-15.39183],[28.55878,-15.43565],[28.54556,-15.47779],[28.52406,-15.51664],[28.49511,-15.55069],[28.4598,-15.57864],[28.4195,-15.59942],[28.37576,-15.61221],[28.33027,-15.61653],[28.28478,-15.61221],[28.24104,-15.59942],[28.20074,-15.57864],[28.16544,-15.55069],[28.13648,-15.51664],[28.11498,-15.47779],[28.10177,-15.43565],[28.09734,-15.39183],[28.10186,-15.34802],[28.11516,-15.3059],[28.13671,-15.2671],[28.16569,-15.23309],[28.20098,-15.20518],[28.24122,-15.18445],[28.28488,-15.17168],[28.33027,-15.16737]]]}},"University-of-Zimbabwe":{type:"Feature",id:"University-of-Zimbabwe",properties:{},geometry:{type:"Polygon",coordinates:[[[31.05466,-17.56016],[31.10061,-17.56447],[31.14481,-17.57724],[31.18555,-17.59797],[31.22128,-17.62587],[31.25062,-17.65988],[31.27245,-17.69868],[31.28592,-17.74079],[31.29051,-17.7846],[31.28603,-17.82842],[31.27266,-17.87056],[31.2509,-17.90941],[31.22158,-17.94347],[31.18583,-17.97143],[31.14502,-17.99221],[31.10073,-18.005],[31.05466,-18.00932],[31.00859,-18.005],[30.9643,-17.99221],[30.92349,-17.97143],[30.88774,-17.94347],[30.85842,-17.90941],[30.83666,-17.87056],[30.82328,-17.82842],[30.81881,-17.7846],[30.8234,-17.74079],[30.83687,-17.69868],[30.85869,-17.65988],[30.88803,-17.62587],[30.92376,-17.59797],[30.96451,-17.57724],[31.0087,-17.56447],[31.05466,-17.56016]]]}},asia_full:{type:"Feature",id:"asia_full",properties:{},geometry:{type:"Polygon",coordinates:[[[51,13.5],[43.5,12.3],[34.25,27.3],[34.9,29.45],[34,31.9],[27,34.7],[25.1,39],[25.6,40.2],[26.33,40.98],[26.33,41.23],[26.63,41.36],[26.58,41.6],[26.32,41.76],[27.2,42.1],[27.55,41.93],[35,43],[38.3,47.6],[38.7,47.7],[38.86,47.86],[39.74,47.82],[40.1,49.6],[38,50],[37.4,50.4],[36.65,50.25],[35.66,50.35],[35.2,51.1],[34.28,51.27],[34.1,51.7],[34.4,51.73],[33.9,52.35],[31.8,52.05],[31.3,53.1],[32.8,53.3],[30.77,54.78],[30.95,55.61],[28.19,56.13],[27.83,57.29],[27.33,57.53],[27.7,57.9],[27.3,58.7],[28.2,59.37],[27.2,60.2],[31.5,62.6],[29,67],[30,67.66],[28.27,68.6],[31,70],[31,90],[180,90],[180,60],[130,7],[130,-0.5],[131.8,-3.5],[132.3,-8],[128,-11.3],[65,-11.3],[51,13.5]]]}},"Asian-University-for-Women":{type:"Feature",id:"Asian-University-for-Women",properties:{},geometry:{type:"Polygon",coordinates:[[[91.8457,22.57465],[91.89315,22.57033],[91.93877,22.55753],[91.98079,22.53675],[92.0176,22.50879],[92.04778,22.47472],[92.07018,22.43586],[92.08393,22.39371],[92.08852,22.34989],[92.08378,22.30609],[92.0699,22.26398],[92.04742,22.22518],[92.01721,22.19118],[91.98043,22.16329],[91.93849,22.14257],[91.893,22.12981],[91.8457,22.1255],[91.79841,22.12981],[91.75292,22.14257],[91.71098,22.16329],[91.6742,22.19118],[91.64399,22.22518],[91.6215,22.26398],[91.60762,22.30609],[91.60288,22.34989],[91.60747,22.39371],[91.62123,22.43586],[91.64362,22.47472],[91.67381,22.50879],[91.71062,22.53675],[91.75264,22.55753],[91.79826,22.57033],[91.8457,22.57465]]]}},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]]]}},"Dhaka-College":{type:"Feature",id:"Dhaka-College",properties:{},geometry:{type:"Polygon",coordinates:[[[90.35156,23.94959],[90.3995,23.94527],[90.44559,23.93247],[90.48805,23.91168],[90.52524,23.88372],[90.55573,23.84965],[90.57835,23.81079],[90.59224,23.76864],[90.59687,23.72482],[90.59208,23.68101],[90.57805,23.6389],[90.55534,23.60011],[90.52481,23.56611],[90.48766,23.53822],[90.44529,23.5175],[90.39934,23.50474],[90.35156,23.50043],[90.30379,23.50474],[90.25783,23.5175],[90.21547,23.53822],[90.17831,23.56611],[90.14779,23.60011],[90.12507,23.6389],[90.11105,23.68101],[90.10625,23.72482],[90.11088,23.76864],[90.12478,23.81079],[90.1474,23.84965],[90.17789,23.88372],[90.21508,23.91168],[90.25754,23.93247],[90.30362,23.94527],[90.35156,23.94959]]]}},"Dhaka-University":{type:"Feature",id:"Dhaka-University",properties:{},geometry:{type:"Polygon",coordinates:[[[90.35156,23.94959],[90.3995,23.94527],[90.44559,23.93247],[90.48805,23.91168],[90.52524,23.88372],[90.55573,23.84965],[90.57835,23.81079],[90.59224,23.76864],[90.59687,23.72482],[90.59208,23.68101],[90.57805,23.6389],[90.55534,23.60011],[90.52481,23.56611],[90.48766,23.53822],[90.44529,23.5175],[90.39934,23.50474],[90.35156,23.50043],[90.30379,23.50474],[90.25783,23.5175],[90.21547,23.53822],[90.17831,23.56611],[90.14779,23.60011],[90.12507,23.6389],[90.11105,23.68101],[90.10625,23.72482],[90.11088,23.76864],[90.12478,23.81079],[90.1474,23.84965],[90.17789,23.88372],[90.21508,23.91168],[90.25754,23.93247],[90.30362,23.94527],[90.35156,23.94959]]]}},"Eastern-University":{type:"Feature",id:"Eastern-University",properties:{},geometry:{type:"Polygon",coordinates:[[[90.38063,23.96703],[90.42857,23.96271],[90.47466,23.94991],[90.51713,23.92913],[90.55432,23.90116],[90.58482,23.86709],[90.60744,23.82823],[90.62134,23.78608],[90.62597,23.74226],[90.62117,23.69846],[90.60714,23.65635],[90.58443,23.61755],[90.5539,23.58356],[90.51674,23.55567],[90.47437,23.53494],[90.42841,23.52218],[90.38063,23.51788],[90.33284,23.52218],[90.28688,23.53494],[90.24451,23.55567],[90.20735,23.58356],[90.17682,23.61755],[90.15411,23.65635],[90.14008,23.69846],[90.13528,23.74226],[90.13991,23.78608],[90.15381,23.82823],[90.17643,23.86709],[90.20693,23.90116],[90.24412,23.92913],[90.28659,23.94991],[90.33268,23.96271],[90.38063,23.96703]]]}},"Jahangirnagar-University":{type:"Feature",id:"Jahangirnagar-University",properties:{},geometry:{type:"Polygon",coordinates:[[[90.26753,24.10689],[90.31553,24.10257],[90.36167,24.08977],[90.40418,24.06899],[90.44141,24.04102],[90.47194,24.00695],[90.49459,23.96809],[90.5085,23.92594],[90.51314,23.88212],[90.50834,23.83831],[90.49429,23.79621],[90.47155,23.75741],[90.44099,23.72342],[90.40378,23.69552],[90.36137,23.6748],[90.31536,23.66204],[90.26753,23.65774],[90.21969,23.66204],[90.17369,23.6748],[90.13127,23.69552],[90.09407,23.72342],[90.06351,23.75741],[90.04077,23.79621],[90.02672,23.83831],[90.02192,23.88212],[90.02656,23.92594],[90.04046,23.96809],[90.06312,24.00695],[90.09364,24.04102],[90.13088,24.06899],[90.17339,24.08977],[90.21953,24.10257],[90.26753,24.10689]]]}},"Khulna-University":{type:"Feature",id:"Khulna-University",properties:{},geometry:{type:"Polygon",coordinates:[[[89.56055,23.06152],[89.60816,23.0572],[89.65394,23.0444],[89.69611,23.02362],[89.73306,22.99565],[89.76335,22.96159],[89.78582,22.92273],[89.79962,22.88058],[89.80423,22.83676],[89.79947,22.79295],[89.78554,22.75085],[89.76297,22.71205],[89.73265,22.67805],[89.69574,22.65016],[89.65366,22.62944],[89.60801,22.61668],[89.56055,22.61237],[89.51308,22.61668],[89.46744,22.62944],[89.42535,22.65016],[89.38844,22.67805],[89.35812,22.71205],[89.33556,22.75085],[89.32163,22.79295],[89.31687,22.83676],[89.32147,22.88058],[89.33527,22.92273],[89.35775,22.96159],[89.38804,22.99565],[89.42498,23.02362],[89.46715,23.0444],[89.51293,23.0572],[89.56055,23.06152]]]}},"Rajshahi-University-of-Engineering-Technology":{type:"Feature",id:"Rajshahi-University-of-Engineering-Technology",properties:{},geometry:{type:"Polygon",coordinates:[[[88.62839,24.58841],[88.67657,24.58409],[88.72289,24.57129],[88.76556,24.5505],[88.80293,24.52253],[88.83358,24.48846],[88.85631,24.4496],[88.87027,24.40745],[88.87492,24.36363],[88.8701,24.31983],[88.856,24.27772],[88.83317,24.23893],[88.8025,24.20493],[88.76515,24.17704],[88.72258,24.15632],[88.6764,24.14356],[88.62839,24.13925],[88.58037,24.14356],[88.5342,24.15632],[88.49162,24.17704],[88.45428,24.20493],[88.4236,24.23893],[88.40077,24.27772],[88.38667,24.31983],[88.38185,24.36363],[88.38651,24.40745],[88.40047,24.4496],[88.4232,24.48846],[88.45384,24.52253],[88.49122,24.5505],[88.53389,24.57129],[88.58021,24.58409],[88.62839,24.58841]]]}},"Sherubtse-College":{type:"Feature",id:"Sherubtse-College",properties:{},geometry:{type:"Polygon",coordinates:[[[91.52369,27.51129],[91.57309,27.50697],[91.62058,27.49416],[91.66432,27.47337],[91.70263,27.4454],[91.73404,27.41133],[91.75734,27.37246],[91.77163,27.33031],[91.77639,27.28649],[91.77144,27.24268],[91.75698,27.20058],[91.73357,27.16179],[91.70212,27.1278],[91.66385,27.09991],[91.62022,27.0792],[91.5729,27.06644],[91.52369,27.06214],[91.47449,27.06644],[91.42717,27.0792],[91.38354,27.09991],[91.34526,27.1278],[91.31382,27.16179],[91.29041,27.20058],[91.27595,27.24268],[91.271,27.28649],[91.27575,27.33031],[91.29005,27.37246],[91.31335,27.41133],[91.34475,27.4454],[91.38307,27.47337],[91.42681,27.49416],[91.4743,27.50697],[91.52369,27.51129]]]}},"Gujarat-University":{type:"Feature",id:"Gujarat-University",properties:{},geometry:{type:"Polygon",coordinates:[[[72.50977,23.22343],[72.55744,23.21911],[72.60327,23.20631],[72.6455,23.18552],[72.68248,23.15756],[72.71281,23.12349],[72.73531,23.08463],[72.74913,23.04248],[72.75374,22.99866],[72.74897,22.95486],[72.73502,22.91275],[72.71243,22.87395],[72.68208,22.83996],[72.64512,22.81206],[72.60299,22.79134],[72.55728,22.77858],[72.50977,22.77427],[72.46225,22.77858],[72.41654,22.79134],[72.37441,22.81206],[72.33745,22.83996],[72.3071,22.87395],[72.28451,22.91275],[72.27056,22.95486],[72.26579,22.99866],[72.2704,23.04248],[72.28422,23.08463],[72.30672,23.12349],[72.33705,23.15756],[72.37403,23.18552],[72.41626,23.20631],[72.46209,23.21911],[72.50977,23.22343]]]}},india_andhrapradesh:{type:"Feature",id:"india_andhrapradesh",properties:{},geometry:{type:"Polygon",coordinates:[[[76.76365,14.98503],[76.78952,15.01589],[76.77614,15.05336],[76.80034,15.09466],[76.86072,15.05669],[76.87678,15.02859],[76.94279,15.02725],[76.98159,15.0103],[77.00077,15.02948],[77.04671,15.02904],[77.07882,15.00004],[77.1096,15.02859],[77.12744,15.09371],[77.14751,15.10753],[77.16873,15.17462],[77.14554,15.22413],[77.15223,15.29148],[77.12118,15.29418],[77.11387,15.3334],[77.07705,15.32577],[77.0421,15.36103],[77.027,15.44075],[76.97414,15.50807],[77.02697,15.5037],[77.03509,15.63815],[77.08728,15.65733],[77.08192,15.69524],[77.05293,15.72914],[77.05561,15.82458],[77.03333,15.85326],[77.07659,15.90991],[77.14448,15.94265],[77.2479,15.96378],[77.3564,15.95008],[77.42745,15.94836],[77.46652,15.93453],[77.61152,15.91691],[77.6536,15.88393],[77.72205,15.89199],[77.80554,15.87083],[77.8616,15.88138],[77.89376,15.90154],[78.00803,15.86506],[78.03641,15.90188],[78.06997,15.85048],[78.10755,15.83401],[78.17153,15.85511],[78.17371,15.89569],[78.20995,15.9197],[78.2507,15.96993],[78.2682,16.02857],[78.29785,16.01169],[78.40727,16.0756],[78.45394,16.07503],[78.55814,16.04517],[78.59917,16.08361],[78.64311,16.08312],[78.68277,16.03346],[78.73718,16.0097],[78.78267,16.02125],[78.8419,16.08707],[78.83228,16.13919],[78.87606,16.13902],[78.88876,16.0879],[78.92138,16.10307],[78.9049,16.17711],[78.92807,16.19871],[78.98352,16.21074],[79.01236,16.24173],[79.09802,16.2236],[79.12305,16.23187],[79.1593,16.20893],[79.22111,16.23251],[79.23438,16.32518],[79.21143,16.35493],[79.21112,16.44396],[79.22091,16.51631],[79.25265,16.57381],[79.37802,16.58412],[79.41773,16.57986],[79.44409,16.61796],[79.49421,16.63408],[79.53884,16.63046],[79.60613,16.67239],[79.63566,16.6594],[79.68544,16.69755],[79.72286,16.68966],[79.74673,16.72106],[79.79256,16.72485],[79.81796,16.69098],[79.84286,16.70561],[79.88555,16.68642],[79.90723,16.63408],[79.95306,16.63621],[80.00576,16.70857],[80.05536,16.74833],[80.07093,16.81323],[80.0332,16.85233],[79.99173,16.86303],[80.04569,16.96517],[80.08405,16.96339],[80.134,16.98524],[80.18217,17.04501],[80.19555,17.01825],[80.26201,17.01066],[80.28877,16.97677],[80.31553,16.91254],[80.3191,16.87106],[80.35879,16.85501],[80.37306,16.8113],[80.41856,16.84252],[80.45647,16.78989],[80.56262,16.76268],[80.6041,16.78766],[80.55593,16.81843],[80.56485,16.86883],[80.59027,16.91165],[80.53184,16.95001],[80.44264,16.9451],[80.35835,16.97052],[80.38778,17.0071],[80.36682,17.0566],[80.39001,17.07623],[80.42034,17.02494],[80.48234,17.05036],[80.49616,17.10789],[80.56039,17.13822],[80.68393,17.06865],[80.82309,17.03787],[80.85877,17.05081],[80.87714,17.10478],[80.88011,17.1644],[80.91689,17.15439],[80.91892,17.22003],[80.99838,17.19012],[81.03576,17.19196],[81.05653,17.22041],[81.16295,17.23278],[81.18035,17.25463],[81.17053,17.29656],[81.19016,17.32733],[81.26732,17.3202],[81.31385,17.37576],[81.24132,17.40667],[81.22725,17.43762],[81.17746,17.45203],[81.15755,17.47938],[81.11343,17.49477],[81.08374,17.45957],[81.01198,17.49248],[80.99962,17.53013],[80.95671,17.58749],[80.85431,17.59347],[80.86444,17.62914],[80.90266,17.63912],[80.90684,17.67993],[80.89153,17.74125],[80.94636,17.76025],[81.03556,17.74495],[81.07481,17.76038],[81.08891,17.81081],[81.15938,17.85273],[81.19194,17.84694],[81.25394,17.81215],[81.40915,17.80501],[81.47025,17.8233],[81.48096,17.80278],[81.5541,17.81616],[81.61119,17.81527],[81.66293,17.87682],[81.70307,17.86121],[81.78246,17.90982],[81.80119,17.93614],[81.89932,17.9687],[82.0019,18.02356],[82.03316,18.06597],[82.08072,18.07378],[82.14091,18.0439],[82.17228,18.04993],[82.25028,17.9883],[82.27583,17.995],[82.2667,18.04332],[82.29628,18.06899],[82.34354,18.07485],[82.33329,18.1422],[82.30608,18.19572],[82.33284,18.21579],[82.33685,18.26619],[82.37209,18.27421],[82.39305,18.30633],[82.33462,18.31703],[82.38458,18.36922],[82.36138,18.4098],[82.43513,18.48477],[82.48969,18.52285],[82.53139,18.51177],[82.54422,18.41638],[82.60918,18.37427],[82.59758,18.26516],[82.64005,18.23708],[82.67329,18.29908],[82.70644,18.30476],[82.77538,18.33958],[82.79251,18.36262],[82.78448,18.42803],[82.80742,18.44772],[82.89919,18.40074],[82.91103,18.36453],[82.98471,18.36362],[83.0002,18.38368],[83.04775,18.37883],[83.07472,18.401],[83.04552,18.44345],[83.05997,18.48603],[83.09665,18.54123],[83.05931,18.54334],[83.0336,18.57266],[83.05776,18.62215],[83.09414,18.63021],[83.15495,18.70089],[83.23099,18.75616],[83.27407,18.76523],[83.28745,18.79777],[83.36791,18.81557],[83.40661,18.84174],[83.39569,18.87914],[83.35554,18.92896],[83.36892,18.96132],[83.32119,18.97447],[83.3428,19.01449],[83.41665,19.00408],[83.45049,18.95576],[83.48237,19.00825],[83.46716,19.07746],[83.51314,19.07262],[83.52143,19.03271],[83.61209,19.10076],[83.62679,19.14969],[83.69206,19.05202],[83.71342,18.99346],[83.73398,18.98382],[83.79596,19.01607],[83.84255,18.9178],[83.85136,18.86003],[83.87788,18.82716],[84.05557,18.79246],[84.0894,18.75373],[84.16689,18.78415],[84.22422,18.79642],[84.2535,18.78262],[84.2914,18.8],[84.33966,18.80123],[84.39349,18.89211],[84.43671,18.92277],[84.42292,18.94711],[84.47894,18.99017],[84.51711,19.04634],[84.62687,19.08543],[84.61653,19.12624],[84.66828,19.13065],[84.6721,19.16552],[84.71352,19.1524],[84.70468,19.11772],[84.76857,19.08003],[85.15481,18.87834],[85.14492,18.85295],[85.05442,18.77126],[85.01176,18.69225],[84.94947,18.67649],[84.44354,18.21885],[83.98107,17.79763],[83.77893,17.63361],[83.20925,17.15734],[82.8246,16.92714],[82.20846,16.16914],[81.78413,16.05362],[81.60171,16.04774],[80.84225,15.52037],[80.65306,15.4875],[80.54735,15.42991],[80.4922,15.34128],[80.47381,15.25261],[80.48624,15.06582],[80.49835,15.0251],[80.66968,13.56514],[80.26863,13.56255],[80.24181,13.46797],[80.22545,13.48346],[80.14774,13.49443],[80.08045,13.49111],[80.08,13.52565],[80.00213,13.53964],[80.01841,13.50074],[79.97441,13.46419],[79.96622,13.38714],[79.93821,13.34898],[79.86379,13.31632],[79.8129,13.31712],[79.79245,13.29487],[79.73437,13.27843],[79.79598,13.24103],[79.75102,13.21106],[79.68369,13.24845],[79.68102,13.29448],[79.57781,13.26176],[79.54809,13.32329],[79.42941,13.33391],[79.41957,13.24971],[79.43293,13.1966],[79.39666,13.19679],[79.36005,13.17504],[79.36244,13.13752],[79.31106,13.1268],[79.28351,13.14994],[79.23853,13.1464],[79.20549,13.10147],[79.16498,13.01908],[79.06532,13.04951],[78.99361,13.08754],[78.95768,13.07478],[78.81243,13.08649],[78.75104,13.05634],[78.71387,13.06691],[78.70525,13.01518],[78.6625,13.02861],[78.63167,12.98455],[78.63629,12.92494],[78.60313,12.84933],[78.59178,12.77804],[78.55737,12.73938],[78.55312,12.69582],[78.50595,12.74103],[78.50517,12.68031],[78.46933,12.67292],[78.47136,12.62811],[78.3799,12.62235],[78.30177,12.66322],[78.27563,12.70205],[78.23857,12.6994],[78.23025,12.75702],[78.2528,12.82236],[78.25198,12.85741],[78.31411,12.85733],[78.32741,12.90272],[78.35638,12.93819],[78.38944,12.90542],[78.41213,12.94302],[78.46924,12.97546],[78.46092,13.03126],[78.5219,13.06638],[78.54509,13.11098],[78.57956,13.21461],[78.57797,13.28201],[78.51185,13.28722],[78.44649,13.30825],[78.43949,13.327],[78.36546,13.36503],[78.38151,13.40071],[78.37259,13.46181],[78.38241,13.52477],[78.40574,13.57659],[78.39268,13.5915],[78.32632,13.59445],[78.25894,13.58461],[78.20436,13.60369],[78.16645,13.65721],[78.11784,13.65587],[78.12295,13.71405],[78.09423,13.74251],[78.12795,13.78565],[78.11441,13.8625],[78.04999,13.89494],[78.04642,13.86104],[78.00476,13.87355],[77.95566,13.82664],[77.95098,13.88825],[77.98752,13.89784],[77.97015,13.95827],[77.92868,13.90698],[77.89567,13.93954],[77.83858,13.93508],[77.81494,13.91679],[77.83635,13.86863],[77.79261,13.8211],[77.6267,13.76984],[77.53033,13.69514],[77.45805,13.68671],[77.47014,13.7502],[77.45855,13.79212],[77.41662,13.80595],[77.43223,13.84163],[77.32787,13.83226],[77.31449,13.86393],[77.25829,13.84609],[77.21904,13.86794],[77.18236,13.8682],[77.15308,13.84278],[77.18088,13.78098],[77.17444,13.76135],[77.10308,13.76759],[77.06516,13.74405],[77.0277,13.77651],[77.00003,13.74482],[76.97723,13.81547],[77.01323,13.85558],[77.04239,13.9332],[76.99574,13.96114],[77.00108,13.98729],[76.93324,14.03009],[76.97878,14.07002],[76.89779,14.16518],[76.96469,14.18169],[77.02696,14.17477],[77.02154,14.13052],[77.03389,14.05587],[77.13014,14.04533],[77.1441,14.00245],[77.28518,14.01342],[77.31997,14.03126],[77.3503,13.95767],[77.35476,13.90325],[77.39713,13.90415],[77.42702,13.98353],[77.39,14.01386],[77.33291,14.02947],[77.40204,14.1102],[77.38331,14.13607],[77.39624,14.17175],[77.51711,14.17844],[77.49659,14.23419],[77.50284,14.27834],[77.45021,14.28414],[77.44887,14.31625],[77.37617,14.33081],[77.38984,14.26937],[77.28608,14.2828],[77.28786,14.33766],[77.23835,14.31759],[77.1661,14.34301],[77.13845,14.33721],[77.11838,14.29395],[77.11539,14.22104],[77.0818,14.2159],[77.05638,14.24623],[76.9426,14.2444],[76.92967,14.27651],[76.94748,14.31179],[76.9038,14.32379],[76.88373,14.35055],[76.88774,14.3947],[76.97828,14.48256],[76.91138,14.48836],[76.87481,14.47275],[76.83244,14.52761],[76.80434,14.53207],[76.76554,14.60075],[76.77639,14.68002],[76.80359,14.7398],[76.78371,14.78455],[76.83756,14.78968],[76.86771,14.96792],[76.76736,14.97267],[76.76365,14.98503]]]}},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_karnataka:{type:"Feature",id:"india_karnataka",properties:{},geometry:{type:"Polygon",coordinates:[[[73.87267,14.75312],[74.17989,14.95708],[74.2532,14.95804],[74.29821,15.04123],[74.31574,15.18805],[74.27607,15.27727],[74.32187,15.34414],[74.28027,15.38891],[74.27464,15.54999],[74.24074,15.66684],[74.11652,15.65308],[74.16212,15.75075],[74.28923,15.73953],[74.36893,15.78648],[74.34579,15.84959],[74.43203,15.95338],[74.46484,16.0421],[74.37226,16.07692],[74.48045,16.14527],[74.50509,16.22265],[74.31843,16.32588],[74.33806,16.40125],[74.26427,16.53936],[74.33986,16.54825],[74.54427,16.63407],[74.6313,16.57831],[74.68877,16.71489],[74.91203,16.7883],[74.99259,16.95146],[75.09075,16.95064],[75.18186,16.84374],[75.26705,16.86247],[75.28311,16.95524],[75.46783,16.98524],[75.51065,16.94733],[75.66898,16.97766],[75.67389,17.11369],[75.62834,17.18928],[75.65739,17.27069],[75.58469,17.34963],[75.63468,17.47651],[75.77995,17.37683],[75.89432,17.40292],[75.93159,17.32197],[76.11996,17.37007],[76.22917,17.36301],[76.38171,17.31172],[76.37153,17.4341],[76.33086,17.46872],[76.41561,17.60431],[76.48659,17.66155],[76.48652,17.71358],[76.56488,17.76523],[76.66314,17.68771],[76.8094,17.8693],[76.92164,17.94103],[76.9513,18.05843],[76.92422,18.14531],[77.14325,18.20848],[77.20119,18.27828],[77.24726,18.41311],[77.31257,18.43674],[77.41407,18.39352],[77.3672,18.30846],[77.46332,18.26219],[77.57345,18.24294],[77.59821,18.0861],[77.64737,17.99934],[77.6208,17.9031],[77.5709,17.86625],[77.53999,17.72825],[77.45138,17.69052],[77.44541,17.58272],[77.6912,17.50865],[77.53911,17.44295],[77.52471,17.36431],[77.45747,17.34038],[77.3772,17.14285],[77.46328,17.11129],[77.50069,17.01255],[77.45223,16.91995],[77.47617,16.7804],[77.46008,16.61106],[77.37653,16.48644],[77.25617,16.47308],[77.28927,16.408],[77.41673,16.36775],[77.52418,16.3753],[77.59655,16.31743],[77.49303,16.25534],[77.51178,15.92828],[77.2479,15.96378],[77.07659,15.90991],[77.03509,15.63815],[77.027,15.44075],[77.0421,15.36103],[77.15223,15.29148],[77.16873,15.17462],[77.1096,15.02859],[76.98159,15.0103],[76.87678,15.02859],[76.80034,15.09466],[76.76736,14.97267],[76.86771,14.96792],[76.83756,14.78968],[76.77639,14.68002],[76.76554,14.60075],[76.87481,14.47275],[76.88373,14.35055],[76.94748,14.31179],[76.9426,14.2444],[77.05638,14.24623],[77.1661,14.34301],[77.28608,14.2828],[77.38984,14.26937],[77.44887,14.31625],[77.50284,14.27834],[77.51711,14.17844],[77.39624,14.17175],[77.40204,14.1102],[77.33291,14.02947],[77.42702,13.98353],[77.35476,13.90325],[77.31997,14.03126],[77.1441,14.00245],[77.03389,14.05587],[77.02696,14.17477],[76.89779,14.16518],[76.97878,14.07002],[76.93324,14.03009],[77.04239,13.9332],[76.97723,13.81547],[77.06516,13.74405],[77.17444,13.76135],[77.18236,13.8682],[77.32787,13.83226],[77.43223,13.84163],[77.47014,13.7502],[77.53033,13.69514],[77.6267,13.76984],[77.79261,13.8211],[77.89567,13.93954],[77.95098,13.88825],[78.04999,13.89494],[78.11441,13.8625],[78.11784,13.65587],[78.20436,13.60369],[78.40574,13.57659],[78.37068,13.46984],[78.40217,13.31113],[78.58854,13.26912],[78.5219,13.06638],[78.46924,12.97546],[78.35684,12.94022],[78.31447,12.8595],[78.25248,12.85994],[78.23196,12.76495],[78.08636,12.80344],[77.99036,12.80553],[77.93327,12.8876],[77.81099,12.8303],[77.74108,12.67162],[77.60006,12.6661],[77.58743,12.51473],[77.63575,12.48605],[77.61553,12.36799],[77.52722,12.27746],[77.51993,12.19264],[77.60853,12.20409],[77.73432,12.17555],[77.77447,12.12033],[77.67932,11.97287],[77.60217,11.93627],[77.49513,11.94251],[77.42332,11.77259],[77.29576,11.80871],[77.11315,11.77337],[77.01458,11.81306],[76.90977,11.79343],[76.8262,11.60485],[76.56305,11.62046],[76.51399,11.70565],[76.41621,11.67255],[76.20482,11.86247],[76.1155,11.8579],[76.11204,11.97862],[76.00455,11.93123],[75.86924,11.95161],[75.79654,12.0533],[75.63883,12.14712],[75.5804,12.1556],[75.4863,12.29074],[75.43456,12.29653],[75.37427,12.46113],[75.22345,12.56714],[75.1619,12.66883],[75.06067,12.66842],[75.00958,12.79255],[74.8591,12.76032],[74.64061,12.65899],[74.51827,12.99543],[74.32397,13.82179],[73.87267,14.75312]]]}},india_kerala:{type:"Feature",id:"india_kerala",properties:{},geometry:{type:"Polygon",coordinates:[[[74.64061,12.65899],[74.8591,12.76032],[74.88399,12.75347],[74.95843,12.78474],[75.00958,12.79255],[74.99766,12.73819],[75.05297,12.71899],[75.06067,12.66842],[75.11342,12.67842],[75.1619,12.66883],[75.14362,12.63805],[75.18287,12.63181],[75.22345,12.56714],[75.23683,12.56625],[75.28071,12.61847],[75.29121,12.59649],[75.27114,12.55367],[75.28095,12.51799],[75.33492,12.49034],[75.3573,12.46234],[75.39003,12.49736],[75.41661,12.49293],[75.4241,12.46603],[75.39599,12.45143],[75.37427,12.46113],[75.36747,12.41202],[75.38331,12.39011],[75.42333,12.37233],[75.41374,12.34763],[75.43456,12.29653],[75.4863,12.29074],[75.51484,12.25818],[75.53759,12.20064],[75.5804,12.1556],[75.63883,12.14712],[75.66604,12.09583],[75.68727,12.10816],[75.73047,12.07283],[75.75506,12.08318],[75.79833,12.08006],[75.79654,12.0533],[75.82391,12.01308],[75.82999,11.98372],[75.86924,11.95161],[76.00455,11.93123],[76.03621,11.9406],[76.07903,11.96914],[76.11204,11.97862],[76.1155,11.8579],[76.15528,11.87128],[76.20482,11.86247],[76.22662,11.80542],[76.27964,11.81018],[76.30774,11.78297],[76.31799,11.75041],[76.34252,11.73748],[76.41129,11.75913],[76.42399,11.72006],[76.40338,11.70748],[76.41621,11.67255],[76.44345,11.63744],[76.42497,11.62329],[76.37992,11.6224],[76.37056,11.59341],[76.29786,11.56442],[76.2711,11.59296],[76.2256,11.56442],[76.24255,11.52874],[76.24478,11.49439],[76.32105,11.44489],[76.33354,11.45871],[76.39063,11.42794],[76.44861,11.38155],[76.53826,11.35167],[76.54532,11.30094],[76.52349,11.27236],[76.45271,11.23905],[76.44934,11.20462],[76.51048,11.21163],[76.53385,11.19671],[76.60091,11.20654],[76.62971,11.19413],[76.69784,11.23906],[76.72537,11.22534],[76.72765,11.19388],[76.69301,11.17193],[76.69124,11.14472],[76.73852,11.12108],[76.74788,11.07514],[76.73718,11.04749],[76.69507,11.02252],[76.68644,10.98934],[76.66047,10.96052],[76.64932,10.92395],[76.73272,10.88113],[76.77286,10.88158],[76.81746,10.86195],[76.85983,10.79996],[76.88838,10.79996],[76.8973,10.77096],[76.875,10.70674],[76.85537,10.67507],[76.87277,10.62958],[76.80497,10.62646],[76.80854,10.59434],[76.82995,10.58498],[76.81746,10.43869],[76.8072,10.41505],[76.83932,10.35974],[76.82944,10.30749],[76.9018,10.26001],[76.90974,10.23668],[76.93976,10.23927],[76.98194,10.22077],[77.04075,10.25298],[77.06496,10.29751],[77.11964,10.31782],[77.17683,10.35777],[77.23655,10.35242],[77.21441,10.30577],[77.25054,10.25359],[77.25544,10.22549],[77.28042,10.20721],[77.26769,10.12222],[77.23784,10.12768],[77.20426,10.11207],[77.21976,10.07801],[77.26184,10.03015],[77.25908,9.9945],[77.27231,9.96404],[77.24834,9.95177],[77.21305,9.87549],[77.23646,9.85946],[77.22277,9.82317],[77.24656,9.80841],[77.20553,9.69439],[77.17963,9.65641],[77.16816,9.61495],[77.21264,9.60207],[77.23711,9.58089],[77.27684,9.57498],[77.3042,9.59951],[77.36511,9.54996],[77.3997,9.49683],[77.39331,9.45986],[77.36661,9.46037],[77.33693,9.40901],[77.33713,9.36507],[77.32506,9.33664],[77.28329,9.30039],[77.28844,9.27469],[77.26509,9.18184],[77.26714,9.15394],[77.24693,9.12483],[77.21199,9.101],[77.18667,9.04329],[77.16025,9.03584],[77.14986,9.01008],[77.17354,8.99121],[77.19759,8.95104],[77.19567,8.9236],[77.2559,8.8781],[77.25798,8.83758],[77.2292,8.78679],[77.19607,8.74588],[77.17517,8.73703],[77.20586,8.68645],[77.21552,8.64836],[77.27872,8.56521],[77.26344,8.50713],[77.20618,8.47859],[77.22506,8.44602],[77.18854,8.43476],[77.15375,8.37722],[77.14974,8.32192],[77.12209,8.32281],[77.09077,8.2973],[76.92132,8.09605],[76.6728,8.34299],[76.46487,8.59279],[76.22556,8.95652],[75.91159,10.04616],[75.68288,10.55908],[75.58764,10.89204],[75.55244,11.04304],[75.25797,11.51227],[75.53645,11.69255],[75.53089,11.70357],[75.25113,11.52458],[74.97117,11.94518],[74.71236,12.49398],[74.64061,12.65899]]]}},india_maharashtra:{type:"Feature",id:"india_maharashtra",properties:{name:"Maharashtra"},geometry:{type:"Polygon",coordinates:[[[72.53789,20.1498],[72.80202,20.12516],[72.87472,20.22596],[72.97061,20.21213],[72.97329,20.13096],[73.18604,20.05291],[73.29353,20.15371],[73.31137,20.20723],[73.43,20.20634],[73.41484,20.38162],[73.47594,20.49491],[73.51787,20.67019],[73.62224,20.62514],[73.63428,20.58232],[73.74801,20.56716],[73.84658,20.62336],[73.88538,20.72951],[73.93846,20.76073],[73.94515,20.84012],[73.79279,21.06787],[73.68111,21.15233],[73.82249,21.17195],[73.83231,21.2674],[73.94827,21.29773],[73.96879,21.39228],[74.10883,21.44803],[74.30776,21.48014],[74.2917,21.55864],[73.97926,21.54124],[73.86085,21.49576],[73.82294,21.60057],[73.88583,21.64517],[73.89029,21.71073],[73.83231,21.81064],[74.04684,21.92259],[74.14585,21.95425],[74.28991,21.93597],[74.38848,22.02026],[74.52764,21.90876],[74.50578,21.78254],[74.59053,21.66435],[74.83048,21.61038],[74.86438,21.63402],[75.05795,21.56489],[75.11504,21.45963],[75.21985,21.41101],[75.38443,21.38559],[75.46828,21.39406],[75.83267,21.38336],[75.95934,21.39629],[76.05255,21.35259],[76.09849,21.37399],[76.15915,21.25892],[76.16851,21.08587],[76.3826,21.07963],[76.45262,21.11486],[76.48741,21.19604],[76.61676,21.19871],[76.66091,21.28256],[76.62434,21.33519],[76.73227,21.40878],[76.79159,21.48996],[76.79516,21.59745],[76.90131,21.60101],[76.9972,21.68174],[77.1212,21.72545],[77.20728,21.69423],[77.27998,21.76113],[77.47756,21.77005],[77.57122,21.62688],[77.56721,21.52965],[77.45749,21.55641],[77.41869,21.52073],[77.48692,21.37756],[77.93873,21.38693],[78.16932,21.49843],[78.21526,21.55374],[78.3,21.58496],[78.41329,21.57782],[78.43024,21.50155],[78.50874,21.52831],[78.58501,21.48683],[78.932,21.48728],[78.91327,21.59254],[79.1278,21.62822],[79.22102,21.69646],[79.48862,21.67416],[79.50602,21.59031],[79.57604,21.54348],[79.73259,21.60235],[79.85703,21.53099],[80.06665,21.55686],[80.18842,21.63402],[80.26022,21.62019],[80.36905,21.52296],[80.41142,21.43822],[80.51936,21.3896],[80.63532,21.25],[80.45736,21.17284],[80.42391,21.0096],[80.46539,20.92709],[80.54166,20.93378],[80.54344,20.79195],[80.57823,20.67866],[80.50776,20.65458],[80.51177,20.585],[80.62239,20.60373],[80.58581,20.39544],[80.61659,20.32587],[80.38288,20.24157],[80.4141,20.19028],[80.54032,20.11],[80.54567,19.98734],[80.46048,19.82812],[80.66476,19.69075],[80.65673,19.61225],[80.82755,19.56274],[80.88553,19.50922],[80.84271,19.36605],[80.74905,19.28666],[80.67864,19.33089],[80.60751,19.31353],[80.58732,19.39674],[80.48071,19.3355],[80.39329,19.24591],[80.39154,19.1836],[80.3302,19.13746],[80.26929,18.94468],[80.35176,18.84592],[80.24684,18.70149],[80.10826,18.68928],[79.94712,18.78372],[79.95979,18.85795],[79.93945,19.0406],[79.85699,19.09508],[79.94349,19.16387],[79.92836,19.24777],[79.97469,19.38922],[79.92536,19.49855],[79.87599,19.5041],[79.75713,19.60733],[79.63608,19.57639],[79.60249,19.51309],[79.5317,19.55241],[79.42494,19.53529],[79.22736,19.61468],[79.22023,19.5286],[79.1725,19.46081],[79.08018,19.53261],[79.00213,19.54198],[78.89954,19.66954],[78.84245,19.65839],[78.82963,19.75513],[78.60098,19.81809],[78.48728,19.79375],[78.28109,19.90236],[78.3514,19.78327],[78.32909,19.71548],[78.26933,19.69184],[78.29475,19.60621],[78.29564,19.46794],[78.20778,19.43583],[78.16318,19.3551],[78.16675,19.2436],[78.03473,19.2436],[77.92412,19.3444],[77.84428,19.30426],[77.81484,19.13745],[77.74304,19.06118],[77.75106,18.98357],[77.83714,18.95414],[77.90751,18.8295],[77.83749,18.80764],[77.74829,18.60515],[77.65541,18.5316],[77.59709,18.54762],[77.54937,18.3875],[77.55171,18.29114],[77.46332,18.26219],[77.3672,18.30846],[77.41407,18.39352],[77.31257,18.43674],[77.2452,18.41278],[77.19913,18.27795],[77.14119,18.20815],[77.03495,18.18076],[76.95329,18.18881],[76.92422,18.14531],[76.9513,18.05843],[76.9075,18.00923],[76.92164,17.94103],[76.8094,17.8693],[76.66314,17.68771],[76.56488,17.76523],[76.48652,17.71358],[76.48659,17.66155],[76.41561,17.60431],[76.33086,17.46872],[76.37153,17.4341],[76.38171,17.31172],[76.22917,17.36301],[76.11996,17.37007],[75.93159,17.32197],[75.89432,17.40292],[75.77995,17.37683],[75.63468,17.47651],[75.58469,17.34963],[75.65739,17.27069],[75.62834,17.18928],[75.67389,17.11369],[75.66898,16.97766],[75.51065,16.94733],[75.46783,16.98524],[75.28311,16.95524],[75.26705,16.86247],[75.18186,16.84374],[75.09075,16.95064],[74.99259,16.95146],[74.96287,16.87942],[74.90306,16.86241],[74.91203,16.7883],[74.68877,16.71489],[74.6313,16.57831],[74.56843,16.55445],[74.54427,16.63407],[74.33986,16.54825],[74.26427,16.53936],[74.33806,16.40125],[74.31843,16.32588],[74.50509,16.22265],[74.48045,16.14527],[74.37226,16.07692],[74.46484,16.0421],[74.43203,15.95338],[74.34579,15.84959],[74.36893,15.78648],[74.28923,15.73953],[74.16212,15.75075],[74.11652,15.65308],[74.02811,15.60433],[73.97592,15.62887],[73.94515,15.74126],[73.88226,15.74929],[73.68072,15.72057],[73.32871,15.60794],[72.98859,16.57559],[72.71294,17.97077],[72.60935,19.26366],[72.53789,20.1498]]]}},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]]]}},india_tamilnadu:{type:"Feature",id:"india_tamilnadu",properties:{},geometry:{type:"Polygon",coordinates:[[[76.23882,11.52666],[76.42497,11.62329],[76.48321,11.69182],[76.56305,11.62046],[76.8262,11.60485],[76.90977,11.79343],[77.01458,11.81306],[77.11315,11.77337],[77.29576,11.80871],[77.33679,11.76902],[77.42332,11.77259],[77.49513,11.94251],[77.60217,11.93627],[77.67932,11.97287],[77.77447,12.12033],[77.73432,12.17555],[77.60853,12.20409],[77.51993,12.19264],[77.52722,12.27746],[77.61553,12.36799],[77.63575,12.48605],[77.58743,12.51473],[77.60006,12.6661],[77.74108,12.67162],[77.79267,12.74643],[77.81099,12.8303],[77.93327,12.8876],[77.99036,12.80553],[78.08636,12.80344],[78.23196,12.76495],[78.2273,12.71513],[78.36824,12.61165],[78.54754,12.68569],[78.62559,12.9194],[78.61355,12.97872],[78.70231,13.05633],[78.80801,13.07774],[78.97973,13.0764],[79.15278,13.00727],[79.1889,13.08443],[79.25625,13.13661],[79.34679,13.13482],[79.45292,13.33852],[79.53513,13.33423],[79.58006,13.24544],[79.68442,13.25659],[79.92572,13.33598],[79.96184,13.45149],[80.06933,13.53757],[80.15229,13.4787],[80.25978,13.44748],[80.68273,13.45353],[80.58546,12.88895],[80.57389,12.78634],[80.43092,12.33305],[80.32877,12.14],[80.20563,11.84284],[79.85031,11.95606],[79.74742,12.0054],[79.69629,11.95142],[79.76493,11.85315],[80.17499,11.74816],[80.13891,11.5158],[80.22104,11.03359],[80.22222,10.98402],[79.85413,10.97539],[79.73705,10.98906],[79.70405,10.91904],[79.85166,10.82788],[80.22599,10.82479],[80.03964,10.09642],[79.66744,9.97318],[79.55982,9.92323],[79.37812,9.6665],[79.42037,9.35343],[79.56652,9.25796],[79.57134,9.08722],[79.49634,8.89762],[79.37403,8.97879],[79.06914,9.02225],[78.73928,8.93257],[78.54484,8.84743],[78.46298,8.3509],[78.36123,8.16045],[78.10363,8.04096],[77.66766,7.85864],[76.92132,8.09605],[77.09077,8.2973],[77.14974,8.32192],[77.20618,8.47859],[77.27872,8.56521],[77.21552,8.64836],[77.19607,8.74588],[77.25798,8.83758],[77.14986,9.01008],[77.26714,9.15394],[77.28844,9.27469],[77.33693,9.40901],[77.3997,9.49683],[77.3042,9.59951],[77.27684,9.57498],[77.16816,9.61495],[77.24656,9.80841],[77.21305,9.87549],[77.26184,10.03015],[77.28042,10.20721],[77.17683,10.35777],[77.06496,10.29751],[76.98194,10.22077],[76.82944,10.30749],[76.81746,10.43869],[76.82995,10.58498],[76.8973,10.77096],[76.81746,10.86195],[76.64932,10.92395],[76.73718,11.04749],[76.72765,11.19388],[76.44934,11.20462],[76.52349,11.27236],[76.53826,11.35167],[76.39063,11.42794],[76.25772,11.47343],[76.23882,11.52666]]]}},india_telengana:{type:"Feature",id:"india_telengana",properties:{},geometry:{type:"Polygon",coordinates:[[[77.23521,16.47123],[77.29413,16.47453],[77.37516,16.48768],[77.37501,16.50885],[77.41861,16.51735],[77.42586,16.57007],[77.46147,16.58589],[77.45871,16.61229],[77.47627,16.64839],[77.43775,16.64241],[77.42132,16.66752],[77.46657,16.6772],[77.47337,16.71709],[77.42692,16.72829],[77.44309,16.76259],[77.4748,16.78164],[77.45754,16.82843],[77.46322,16.84476],[77.45223,16.91995],[77.48061,16.97751],[77.478,17.00152],[77.50069,17.01255],[77.49527,17.04601],[77.46328,17.11129],[77.40575,17.12751],[77.3772,17.14285],[77.36157,17.16669],[77.37179,17.19944],[77.39294,17.1981],[77.40662,17.2372],[77.45894,17.28058],[77.43826,17.29144],[77.45747,17.34038],[77.45274,17.37335],[77.50349,17.35735],[77.52471,17.36431],[77.53972,17.40645],[77.53911,17.44295],[77.57779,17.43051],[77.60849,17.44332],[77.61732,17.47261],[77.65946,17.48011],[77.69188,17.47463],[77.6912,17.50865],[77.66304,17.5217],[77.59762,17.53374],[77.59603,17.56309],[77.55361,17.55007],[77.52751,17.57308],[77.49462,17.56675],[77.44541,17.58272],[77.45732,17.63263],[77.45138,17.69052],[77.49398,17.7153],[77.53999,17.72825],[77.56532,17.74838],[77.55654,17.76872],[77.50997,17.78724],[77.51604,17.80424],[77.55572,17.81934],[77.5709,17.86625],[77.6208,17.9031],[77.61974,17.93865],[77.65529,17.97047],[77.64737,17.99934],[77.5862,18.01459],[77.55377,18.03572],[77.54914,18.06475],[77.59821,18.0861],[77.59705,18.15205],[77.57179,18.19195],[77.58611,18.21875],[77.57345,18.24294],[77.60614,18.28059],[77.57018,18.29238],[77.56676,18.31792],[77.51948,18.34914],[77.54937,18.3875],[77.56007,18.43522],[77.59709,18.54762],[77.64035,18.55386],[77.65775,18.5271],[77.71216,18.55431],[77.73669,18.55476],[77.74829,18.60515],[77.72956,18.64262],[77.73268,18.67607],[77.74963,18.6899],[77.78664,18.6841],[77.83749,18.80764],[77.90751,18.8295],[77.90895,18.86137],[77.88264,18.86984],[77.86524,18.91043],[77.82421,18.9131],[77.83714,18.95414],[77.79611,18.95146],[77.80057,18.98447],[77.75106,18.98357],[77.74081,19.03041],[77.74304,19.06118],[77.77693,19.07322],[77.78942,19.10534],[77.83179,19.09195],[77.81484,19.13745],[77.84205,19.18294],[77.82822,19.19008],[77.85097,19.25743],[77.88398,19.25832],[77.88442,19.27928],[77.84562,19.28597],[77.84428,19.30426],[77.89602,19.31987],[77.92412,19.3444],[77.96916,19.31095],[78.00172,19.29846],[78.02938,19.27304],[78.03473,19.2436],[78.1101,19.24851],[78.1333,19.232],[78.16675,19.2436],[78.16675,19.28106],[78.18057,19.33369],[78.16318,19.3551],[78.17121,19.39747],[78.20778,19.43583],[78.23543,19.43182],[78.25684,19.4559],[78.29564,19.46794],[78.2787,19.5393],[78.29475,19.57365],[78.29475,19.60621],[78.27111,19.65661],[78.26933,19.69184],[78.29966,19.69273],[78.32909,19.71548],[78.3514,19.78327],[78.3224,19.84125],[78.2778,19.85151],[78.27921,19.88196],[78.3679,19.8814],[78.38128,19.83858],[78.41205,19.8252],[78.45978,19.81851],[78.47762,19.79531],[78.50973,19.82386],[78.5686,19.8136],[78.58734,19.8194],[78.67966,19.79175],[78.70018,19.769],[78.72203,19.78149],[78.76842,19.7806],[78.79116,19.76008],[78.82774,19.76097],[78.84691,19.69898],[78.84245,19.65839],[78.87457,19.65705],[78.89954,19.66954],[78.9379,19.66553],[78.95262,19.65125],[78.94637,19.61914],[78.97626,19.56384],[79.00213,19.54198],[79.03513,19.54733],[79.08018,19.53261],[79.08821,19.51477],[79.12389,19.50318],[79.1725,19.46081],[79.2064,19.46973],[79.19034,19.49381],[79.22023,19.5286],[79.23361,19.57945],[79.22736,19.61468],[79.35492,19.56339],[79.39729,19.53529],[79.42494,19.53529],[79.45394,19.49961],[79.4972,19.52013],[79.5317,19.55241],[79.55367,19.52413],[79.60249,19.51309],[79.61596,19.55941],[79.63608,19.57639],[79.71198,19.58528],[79.75713,19.60733],[79.81825,19.57293],[79.82378,19.55743],[79.87599,19.5041],[79.92536,19.49855],[79.97171,19.42013],[79.97469,19.38922],[79.94937,19.29163],[79.9293,19.24996],[79.92636,19.20252],[79.94349,19.16387],[79.88262,19.13295],[79.85699,19.09508],[79.8741,19.04152],[79.92544,19.05312],[79.93945,19.0406],[79.9397,18.98616],[79.95302,18.96934],[79.95979,18.85795],[79.91056,18.82565],[79.94712,18.78372],[79.99276,18.76905],[80.03276,18.74654],[80.10826,18.68928],[80.24684,18.70149],[80.27513,18.72272],[80.30656,18.68345],[80.33809,18.59903],[80.379,18.60937],[80.38851,18.5972],[80.45022,18.62656],[80.48858,18.62656],[80.514,18.61318],[80.53184,18.58598],[80.59562,18.54896],[80.63264,18.51863],[80.65093,18.47224],[80.6991,18.43612],[80.74281,18.32194],[80.74459,18.30231],[80.7883,18.24968],[80.73344,18.21891],[80.73478,18.17163],[80.79811,18.16628],[80.81774,18.18724],[80.81729,18.22515],[80.85922,18.22605],[80.84807,18.1975],[80.86189,18.13283],[80.9007,18.13461],[80.95422,18.16717],[80.9725,18.14353],[80.94931,18.12302],[80.94396,18.08109],[80.96225,18.03158],[80.98455,17.92276],[80.99436,17.91428],[81.00417,17.83846],[81.03227,17.78985],[81.07375,17.78628],[81.08891,17.81081],[81.15938,17.85273],[81.19194,17.84694],[81.25394,17.81215],[81.40915,17.80501],[81.47025,17.8233],[81.48096,17.80278],[81.5541,17.81616],[81.56882,17.82776],[81.61119,17.81527],[81.64286,17.83935],[81.66293,17.87682],[81.68835,17.88485],[81.70307,17.86121],[81.75838,17.89332],[81.79272,17.85273],[81.78246,17.83177],[81.72939,17.81928],[81.68478,17.77067],[81.62323,17.76264],[81.5764,17.72607],[81.57105,17.68771],[81.50281,17.59003],[81.52377,17.57264],[81.50147,17.53919],[81.49345,17.44865],[81.44171,17.38175],[81.41584,17.36168],[81.37168,17.35722],[81.32262,17.38933],[81.28917,17.33759],[81.26732,17.3202],[81.19016,17.32733],[81.17053,17.29656],[81.18035,17.25463],[81.16295,17.23278],[81.11835,17.22475],[81.02603,17.18684],[80.99124,17.1797],[80.93058,17.20513],[80.90516,17.20111],[80.91318,17.14581],[80.87037,17.14625],[80.8552,17.11146],[80.86412,17.09585],[80.85877,17.05081],[80.82309,17.03787],[80.72586,17.06463],[80.68393,17.06865],[80.65673,17.08782],[80.56039,17.13822],[80.51936,17.10834],[80.49616,17.10789],[80.48234,17.05036],[80.42034,17.02494],[80.39001,17.07623],[80.36682,17.0566],[80.38778,17.0071],[80.35835,16.97052],[80.44264,16.9451],[80.48769,16.91745],[80.49126,16.94822],[80.53184,16.95001],[80.59027,16.91165],[80.5867,16.87374],[80.56485,16.86883],[80.55593,16.81843],[80.6041,16.78766],[80.56262,16.76268],[80.51088,16.76982],[80.45647,16.78989],[80.45245,16.81531],[80.41856,16.84252],[80.37306,16.8113],[80.35879,16.85501],[80.3191,16.87106],[80.31553,16.91254],[80.28877,16.97677],[80.26201,17.01066],[80.23569,17.00219],[80.19555,17.01825],[80.18217,17.04501],[80.134,16.98524],[80.08405,16.96339],[80.04569,16.96517],[80.03722,16.93663],[80.00957,16.90719],[79.99173,16.86303],[80.0332,16.85233],[80.04168,16.82602],[80.07093,16.81323],[80.054,16.74194],[80.02722,16.71251],[80.00576,16.70857],[79.95306,16.63621],[79.90723,16.63408],[79.88555,16.68642],[79.84286,16.70561],[79.81796,16.69098],[79.79256,16.72485],[79.74673,16.72106],[79.72286,16.68966],[79.68544,16.69755],[79.6621,16.68835],[79.63566,16.6594],[79.60613,16.67239],[79.53884,16.63046],[79.49421,16.63408],[79.44409,16.61796],[79.41773,16.57986],[79.37802,16.58412],[79.31162,16.57554],[79.27926,16.5816],[79.24543,16.57009],[79.24388,16.53515],[79.22091,16.51631],[79.21526,16.4846],[79.23202,16.46035],[79.21112,16.44396],[79.21143,16.35493],[79.23438,16.32518],[79.22111,16.23251],[79.1593,16.20893],[79.12305,16.23187],[79.09802,16.2236],[79.05373,16.23827],[79.01236,16.24173],[78.98352,16.21074],[78.92807,16.19871],[78.9049,16.17711],[78.92481,16.13259],[78.92138,16.10307],[78.88876,16.0879],[78.87606,16.13902],[78.83228,16.13919],[78.8419,16.08707],[78.82164,16.05227],[78.78267,16.02125],[78.73718,16.0097],[78.68277,16.03346],[78.64311,16.08312],[78.59917,16.08361],[78.55814,16.04517],[78.45394,16.07503],[78.40727,16.0756],[78.36075,16.04605],[78.32341,16.033],[78.29785,16.01169],[78.2682,16.02857],[78.25445,16.01627],[78.2507,15.96993],[78.20995,15.9197],[78.17371,15.89569],[78.17153,15.85511],[78.13252,15.8549],[78.10755,15.83401],[78.06997,15.85048],[78.03641,15.90188],[78.00803,15.86506],[77.97903,15.87982],[77.93428,15.88216],[77.89376,15.90154],[77.8616,15.88138],[77.80554,15.87083],[77.72205,15.89199],[77.689,15.87914],[77.6536,15.88393],[77.61152,15.91691],[77.58504,15.91532],[77.51178,15.92828],[77.52058,15.95112],[77.51562,16.00803],[77.49612,16.03679],[77.50848,16.07885],[77.49242,16.12134],[77.48889,16.16443],[77.50036,16.1925],[77.49303,16.25534],[77.59655,16.31743],[77.58991,16.33381],[77.54011,16.35849],[77.52418,16.3753],[77.4865,16.38299],[77.41673,16.36775],[77.37791,16.38517],[77.35761,16.3815],[77.28927,16.408],[77.26056,16.45344],[77.23521,16.47123]]]}},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]]]}},"Universitas-Negeri-Makassar":{type:"Feature",id:"Universitas-Negeri-Makassar",properties:{},geometry:{type:"Polygon",coordinates:[[[119.4292,-4.96157],[119.47318,-4.96588],[119.51547,-4.97866],[119.55445,-4.9994],[119.58862,-5.02733],[119.61666,-5.06135],[119.63751,-5.10017],[119.65035,-5.14229],[119.6547,-5.18611],[119.65039,-5.22992],[119.63757,-5.27205],[119.61674,-5.31089],[119.5887,-5.34493],[119.55452,-5.37286],[119.51553,-5.39362],[119.47321,-5.40641],[119.4292,-5.41072],[119.38519,-5.40641],[119.34288,-5.39362],[119.30388,-5.37286],[119.26971,-5.34493],[119.24167,-5.31089],[119.22084,-5.27205],[119.20802,-5.22992],[119.2037,-5.18611],[119.20805,-5.14229],[119.22089,-5.10017],[119.24174,-5.06135],[119.26979,-5.02733],[119.30396,-4.9994],[119.34293,-4.97866],[119.38522,-4.96588],[119.4292,-4.96157]]]}},"University-Muhammadiyah-Surakarta":{type:"Feature",id:"University-Muhammadiyah-Surakarta",properties:{},geometry:{type:"Polygon",coordinates:[[[110.76899,-7.33303],[110.81316,-7.33735],[110.85564,-7.35012],[110.89479,-7.37086],[110.92912,-7.39878],[110.9573,-7.4328],[110.97825,-7.47162],[110.99116,-7.51374],[110.99553,-7.55755],[110.9912,-7.60137],[110.97833,-7.64351],[110.95741,-7.68234],[110.92924,-7.71638],[110.8949,-7.74433],[110.85572,-7.76509],[110.81321,-7.77787],[110.76899,-7.78219],[110.72477,-7.77787],[110.68225,-7.76509],[110.64307,-7.74433],[110.60873,-7.71638],[110.58056,-7.68234],[110.55964,-7.64351],[110.54677,-7.60137],[110.54244,-7.55755],[110.54681,-7.51374],[110.55973,-7.47162],[110.58067,-7.4328],[110.60885,-7.39878],[110.64318,-7.37086],[110.68233,-7.35012],[110.72481,-7.33735],[110.76899,-7.33303]]]}},iran:{type:"Feature",properties:{},id:"iran",geometry:{type:"Polygon",coordinates:[[[43.96643,39.42704],[44.36828,39.45104],[44.3518,39.57183],[44.62479,39.89048],[45.02746,39.54218],[45.50433,39.06259],[45.9613,38.92951],[46.50828,38.94537],[47.3236,39.44892],[48.00512,39.77374],[48.4411,39.3641],[48.19977,39.25565],[48.3728,39.10236],[48.30414,38.906],[48.10427,38.85269],[48.67649,38.48336],[49.32106,38.48734],[53.94287,37.48358],[54.43724,37.47487],[54.70691,37.69815],[55.26122,38.10864],[55.91695,38.16284],[56.239,38.26407],[57.28683,38.36073],[57.57896,37.98007],[58.01879,37.91821],[58.41395,37.7018],[58.72191,37.76204],[59.4218,37.59896],[59.63834,37.17964],[60.08422,37.11653],[60.37835,36.70792],[61.23424,36.72619],[61.37598,35.51361],[60.99608,34.29808],[60.63333,34.05914],[60.68847,33.68779],[61.01753,33.53868],[60.68833,33.11604],[60.98034,32.20735],[60.95577,31.5572],[61.7915,31.4486],[61.89696,31.1188],[61.90736,30.81546],[60.99448,29.85451],[61.42455,29.4109],[61.97206,28.63509],[62.8889,28.33884],[62.90715,27.31879],[63.29659,27.35528],[63.40209,27.17648],[63.2895,26.57212],[62.5891,26.47058],[62.29032,26.24108],[61.94822,26.12877],[61.62376,24.73837],[60.55845,24.98624],[58.03141,25.27164],[57.11051,25.5495],[56.54686,26.57238],[55.4988,26.01213],[55.28816,25.6474],[54.37853,25.61961],[53.90126,26.2239],[53.08217,26.52934],[51.26311,27.61327],[50.77328,28.14996],[50.48217,27.81479],[50.17456,27.78564],[49.93835,27.81965],[49.88342,27.975],[49.92187,28.18825],[50.33305,28.67232],[49.4197,29.70202],[48.58632,29.62242],[47.9928,30.44356],[47.98907,30.97004],[47.65869,30.98703],[47.65817,31.39276],[47.76361,31.76875],[47.30962,32.37144],[45.91075,33.02471],[46.06882,33.24741],[45.37024,33.9384],[45.40649,34.48845],[45.61523,34.74162],[45.84765,35.07793],[46.0613,35.21211],[45.91186,35.63945],[46.06018,35.76881],[45.75644,35.74371],[45.3092,35.9317],[45.19226,36.33283],[44.97802,36.46548],[44.95056,36.68605],[44.80224,36.7609],[44.83543,36.92589],[44.74731,37.02887],[44.71435,37.2828],[44.57153,37.38762],[44.51099,37.70537],[44.17537,37.86225],[44.29736,38.30899],[44.10461,39.10449],[43.93976,39.34825],[43.96643,39.42704]]]}},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]]]}},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]]]}},"Institute-of-Crisis-Management-Studies":{type:"Feature",id:"Institute-of-Crisis-Management-Studies",properties:{},geometry:{type:"Polygon",coordinates:[[[85.34173,27.95228],[85.39133,27.94796],[85.43901,27.93515],[85.48293,27.91436],[85.5214,27.88639],[85.55293,27.85231],[85.57632,27.81345],[85.59067,27.77129],[85.59544,27.72747],[85.59047,27.68367],[85.57595,27.64156],[85.55245,27.60278],[85.52087,27.56879],[85.48245,27.5409],[85.43864,27.52019],[85.39113,27.50743],[85.34173,27.50313],[85.29233,27.50743],[85.24482,27.52019],[85.20102,27.5409],[85.16259,27.56879],[85.13102,27.60278],[85.10752,27.64156],[85.09299,27.68367],[85.08802,27.72747],[85.09279,27.77129],[85.10715,27.81345],[85.13054,27.85231],[85.16207,27.88639],[85.20053,27.91436],[85.24445,27.93515],[85.29213,27.94796],[85.34173,27.95228]]]}},"Kathmandu-University":{type:"Feature",id:"Kathmandu-University",properties:{},geometry:{type:"Polygon",coordinates:[[[85.53873,27.84494],[85.58828,27.84062],[85.63591,27.82781],[85.67979,27.80702],[85.71822,27.77905],[85.74972,27.74497],[85.77308,27.70611],[85.78742,27.66395],[85.79219,27.62013],[85.78722,27.57633],[85.77272,27.53422],[85.74924,27.49543],[85.7177,27.46145],[85.67931,27.43356],[85.63554,27.41285],[85.58808,27.40009],[85.53873,27.39578],[85.48938,27.40009],[85.44192,27.41285],[85.39815,27.43356],[85.35976,27.46145],[85.32822,27.49543],[85.30474,27.53422],[85.29024,27.57633],[85.28527,27.62013],[85.29004,27.66395],[85.30438,27.70611],[85.32774,27.74497],[85.35924,27.77905],[85.39767,27.80702],[85.44155,27.82781],[85.48918,27.84062],[85.53873,27.84494]]]}},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]]]}},"Tribhuvan-University":{type:"Feature",id:"Tribhuvan-University",properties:{},geometry:{type:"Polygon",coordinates:[[[83.97645,28.47849],[84.0263,28.47417],[84.07421,28.46136],[84.11835,28.44057],[84.157,28.4126],[84.18869,28.37852],[84.21219,28.33965],[84.22661,28.2975],[84.23141,28.25368],[84.22641,28.20987],[84.21181,28.16777],[84.18819,28.12898],[84.15647,28.09499],[84.11785,28.06711],[84.07383,28.04639],[84.02609,28.03364],[83.97645,28.02933],[83.92682,28.03364],[83.87908,28.04639],[83.83506,28.06711],[83.79644,28.09499],[83.76471,28.12898],[83.7411,28.16777],[83.7265,28.20987],[83.7215,28.25368],[83.72629,28.2975],[83.74072,28.33965],[83.76422,28.37852],[83.7959,28.4126],[83.83456,28.44057],[83.8787,28.46136],[83.92661,28.47417],[83.97645,28.47849]]]}},north_korea:{type:"Feature",id:"north_korea",properties:{},geometry:{type:"Polygon",coordinates:[[[125,37.2],[123.5,38.4],[124.38,40.12],[124.87,40.47],[126.05,40.95],[126.6,41.6],[126.9,41.8],[127.25,41.5],[128.2,41.4],[128.3,41.56],[128.04,42.03],[128.95,42.03],[129.35,42.44],[129.69,42.44],[129.88,43],[130.2,42.9],[130.3,42.66],[130.5,42.6],[130.7,42.3],[131,39],[128.33,38.61],[128.28,38.42],[128.08,38.32],[127.14,38.32],[126.99,38.21],[126.95,38.14],[126.88,38.1],[126.82,38],[126.67,37.95],[126.69,37.84],[126.667,37.828],[126.66,37.79],[126.585,37.76],[126.474,37.81],[126.42,37.845],[126.2,37.82],[126.18,37.74],[125,37.2]]]}},"Far-Eastern-University-Institute-of-Technology":{type:"Feature",id:"Far-Eastern-University-Institute-of-Technology",properties:{},geometry:{type:"Polygon",coordinates:[[[121.02539,14.82943],[121.07071,14.82511],[121.11429,14.81231],[121.15444,14.79154],[121.18961,14.76359],[121.21847,14.72954],[121.23989,14.69069],[121.25305,14.64855],[121.25747,14.60473],[121.25296,14.56092],[121.23972,14.51881],[121.21825,14.48],[121.18938,14.44599],[121.15422,14.41808],[121.11412,14.39735],[121.07062,14.38458],[121.02539,14.38027],[120.98016,14.38458],[120.93666,14.39735],[120.89656,14.41808],[120.8614,14.44599],[120.83253,14.48],[120.81106,14.51881],[120.79782,14.56092],[120.79331,14.60473],[120.79773,14.64855],[120.81089,14.69069],[120.83232,14.72954],[120.86117,14.76359],[120.89635,14.79154],[120.93649,14.81231],[120.98007,14.82511],[121.02539,14.82943]]]}},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]]]}},"University-of-the-Philippines-Resilience-Institute":{type:"Feature",id:"University-of-the-Philippines-Resilience-Institute",properties:{},geometry:{type:"Polygon",coordinates:[[[121.06511,14.87964],[121.11044,14.87532],[121.15402,14.86253],[121.19418,14.84176],[121.22937,14.81381],[121.25822,14.77975],[121.27965,14.74091],[121.29282,14.69877],[121.29724,14.65495],[121.29273,14.61114],[121.27948,14.56902],[121.25801,14.53022],[121.22913,14.49621],[121.19396,14.4683],[121.15385,14.44756],[121.11035,14.4348],[121.06511,14.43049],[121.01986,14.4348],[120.97636,14.44756],[120.93625,14.4683],[120.90108,14.49621],[120.8722,14.53022],[120.85073,14.56902],[120.83748,14.61114],[120.83297,14.65495],[120.83739,14.69877],[120.85056,14.74091],[120.87199,14.77975],[120.90084,14.81381],[120.93603,14.84176],[120.97619,14.86253],[121.01977,14.87532],[121.06511,14.87964]]]}},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]]]]}},south_korea:{type:"Feature",id:"south_korea",properties:{},geometry:{type:"Polygon",coordinates:[[[125,33],[125,37.2],[126.18,37.74],[126.2,37.82],[126.42,37.845],[126.474,37.81],[126.585,37.76],[126.66,37.79],[126.667,37.828],[126.69,37.84],[126.67,37.95],[126.82,38],[126.88,38.1],[126.95,38.14],[126.99,38.21],[127.14,38.32],[128.08,38.32],[128.28,38.42],[128.33,38.61],[131,39],[131.3,36.6],[127.3,33],[125,33]]]}},sri_lanka:{type:"Feature",id:"sri_lanka",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:"Polygon",coordinates:[[[18.55316,42.39709],[18.487,42.33],[16,42.2],[13,45],[13.48,45.55],[13.6,45.46],[13.67282,45.45244],[13.78445,45.47445],[13.87695,45.43477],[13.98354,45.46061],[13.95607,45.5049],[13.99868,45.52812],[14.07402,45.49231],[14.19361,45.48114],[14.23361,45.51383],[14.33098,45.47073],[14.4841,45.54339],[14.55276,45.65149],[15.16462,45.43061],[15.36301,45.48661],[15.28061,45.60731],[15.34584,45.65341],[15.24587,45.72718],[15.55939,45.85272],[15.68573,45.84315],[15.71043,46.04506],[15.61913,46.08657],[15.60059,46.16509],[15.67131,46.23068],[15.78049,46.21928],[15.79422,46.26439],[16.073,46.34266],[16.04759,46.3891],[16.15145,46.40378],[16.30028,46.38152],[16.24191,46.49508],[16.36894,46.55083],[16.66077,46.45725],[16.72462,46.39715],[16.86058,46.35783],[16.97456,46.22688],[17.17232,46.1551],[17.31102,45.97167],[17.58087,45.93874],[17.66574,45.84483],[17.86118,45.77993],[18.15765,45.79625],[18.43522,45.74655],[18.68019,45.91486],[18.77838,45.88666],[18.82507,45.91724],[18.9164,45.70714],[18.96652,45.66972],[18.89717,45.56551],[18.94817,45.54136],[19.01686,45.56369],[19.10858,45.5144],[19.08125,45.47585],[19.00341,45.48553],[18.99315,45.44969],[19.03735,45.40735],[18.9792,45.37883],[19.09424,45.3367],[19.10972,45.30469],[19.2687,45.24886],[19.42108,45.23622],[19.45198,45.16219],[19.2041,45.17236],[19.14345,45.119],[19.09331,45.13091],[19.08464,45.11852],[19.11231,45.08359],[19.1011,44.98811],[19.16343,44.94855],[19.06865,44.88961],[18.99843,44.89696],[19.01991,44.84386],[18.83764,44.84591],[18.75065,44.90197],[18.73803,44.94119],[18.75375,44.95245],[18.78491,44.94261],[18.77858,44.98426],[18.72157,44.98326],[18.66267,45.04785],[18.46602,45.05359],[18.41889,45.09637],[18.22841,45.09274],[18.2011,45.0684],[18.11746,45.06832],[18.0011,45.14282],[17.93745,45.09903],[17.93891,45.07086],[17.84756,45.03242],[17.66404,45.12204],[17.59713,45.09425],[17.16882,45.13674],[16.92275,45.23503],[16.81812,45.17296],[16.5105,45.20898],[16.46738,45.13326],[16.40374,45.10639],[16.36047,44.99622],[16.29175,44.9865],[16.11145,45.08758],[15.99747,45.21978],[15.81894,45.2072],[15.77283,45.16143],[15.80439,45.1121],[15.75505,45.05587],[15.78598,44.96966],[15.7338,44.9371],[15.78598,44.84029],[15.74818,44.81311],[15.82858,44.72686],[15.90458,44.75089],[16.14789,44.48088],[16.15253,44.38405],[16.39709,44.06983],[17.1476,43.49677],[17.22656,43.49776],[17.282,43.47769],[17.30151,43.4393],[17.26227,43.39108],[17.37488,43.2502],[17.44734,43.1998],[17.43805,43.18365],[17.63424,43.09863],[17.71339,42.97351],[17.53967,42.93531],[17.64267,42.88351],[17.67975,42.92174],[17.7903,42.89961],[17.80815,42.92073],[17.85896,42.89458],[17.90239,42.81647],[18.24898,42.61375],[18.3609,42.61526],[18.44437,42.56076],[18.43575,42.48273],[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]]]}},"Queen-Mary-University-of-London":{type:"Feature",id:"Queen-Mary-University-of-London",properties:{},geometry:{type:"Polygon",coordinates:[[[-0.04049,51.74867],[0.03027,51.74434],[0.09827,51.7315],[0.16087,51.71065],[0.21563,51.68262],[0.26045,51.64848],[0.29361,51.60956],[0.31386,51.56737],[0.32046,51.52354],[0.31318,51.47975],[0.29235,51.43768],[0.25881,51.39894],[0.21385,51.36502],[0.15922,51.33719],[0.09701,51.31653],[0.02959,51.30381],[-0.04049,51.29952],[-0.11057,51.30381],[-0.178,51.31653],[-0.24021,51.33719],[-0.29484,51.36502],[-0.33979,51.39894],[-0.37334,51.43768],[-0.39417,51.47975],[-0.40144,51.52354],[-0.39485,51.56737],[-0.3746,51.60956],[-0.34144,51.64848],[-0.29662,51.68262],[-0.24185,51.71065],[-0.17926,51.7315],[-0.11125,51.74434],[-0.04049,51.74867]]]}},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]]]}},"Heidelberg-University":{type:"Feature",id:"Heidelberg-University",properties:{},geometry:{type:"Polygon",coordinates:[[[8.67039,49.64365],[8.73804,49.63932],[8.80306,49.62648],[8.86292,49.60564],[8.91529,49.57762],[8.95817,49.54349],[8.98989,49.50458],[9.00928,49.46239],[9.01561,49.41856],[9.00868,49.37477],[8.98878,49.33269],[8.95671,49.29395],[8.91371,49.26002],[8.86146,49.23218],[8.80194,49.21151],[8.73744,49.19879],[8.67039,49.19449],[8.60334,49.19879],[8.53883,49.21151],[8.47931,49.23218],[8.42706,49.26002],[8.38407,49.29395],[8.352,49.33269],[8.3321,49.37477],[8.32516,49.41856],[8.33149,49.46239],[8.35088,49.50458],[8.38261,49.54349],[8.42548,49.57762],[8.47786,49.60564],[8.53771,49.62648],[8.60273,49.63932],[8.67039,49.64365]]]}},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]]]}},iceland:{type:"Feature",id:"iceland",properties:{},geometry:{type:"Polygon",coordinates:[[[-25.21,65.81],[-23.17,66.89],[-19.51,66.29],[-19.09,67.46],[-17.98,67.34],[-17.38,66.83],[-14.01,66.72],[-12.36,64.54],[-17.21,62.92],[-23.63,63.15],[-25.21,65.81]]]}},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]]]}},"Politecnico-di-Milano":{type:"Feature",id:"Politecnico-di-Milano",properties:{},geometry:{type:"Polygon",coordinates:[[[9.22852,45.68471],[9.29123,45.68038],[9.3515,45.66755],[9.40699,45.64672],[9.45556,45.61871],[9.49533,45.58459],[9.52478,45.54569],[9.54279,45.50351],[9.5487,45.45968],[9.5423,45.41589],[9.52388,45.37381],[9.49415,45.33505],[9.45428,45.30111],[9.40581,45.27326],[9.3506,45.25258],[9.29074,45.23985],[9.22852,45.23555],[9.16629,45.23985],[9.10644,45.25258],[9.05122,45.27326],[9.00275,45.30111],[8.96288,45.33505],[8.93316,45.37381],[8.91473,45.41589],[8.90833,45.45968],[8.91424,45.50351],[8.93225,45.54569],[8.9617,45.58459],[9.00147,45.61871],[9.05004,45.64672],[9.10553,45.66755],[9.16581,45.68038],[9.22852,45.68471]]]}},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]]]}},"Yarmouk-University":{type:"Feature",id:"Yarmouk-University",properties:{},geometry:{type:"Polygon",coordinates:[[[35.85811,32.76124],[35.91021,32.75691],[35.96029,32.7441],[36.00642,32.72331],[36.04681,32.69532],[36.07992,32.66124],[36.10446,32.62236],[36.11951,32.5802],[36.1245,32.53638],[36.11926,32.49258],[36.10399,32.45048],[36.0793,32.4117],[36.04615,32.37772],[36.00581,32.34985],[35.95982,32.32914],[35.90996,32.31639],[35.85811,32.31208],[35.80627,32.31639],[35.75641,32.32914],[35.71042,32.34985],[35.67008,32.37772],[35.63693,32.4117],[35.61224,32.45048],[35.59697,32.49258],[35.59173,32.53638],[35.59672,32.5802],[35.61177,32.62236],[35.63631,32.66124],[35.66941,32.69532],[35.70981,32.72331],[35.75593,32.7441],[35.80602,32.75691],[35.85811,32.76124]]]}},kosovo:{type:"Feature",id:"kosovo",properties:{},geometry:{type:"Polygon",coordinates:[[[20.68323,41.85101],[20.64878,41.8621],[20.62895,41.87788],[20.59321,41.87344],[20.5834,41.88906],[20.57131,41.92032],[20.61548,41.94279],[20.61932,41.97284],[20.60727,41.98358],[20.58959,42.03994],[20.56682,42.05515],[20.55,42.08081],[20.5618,42.12415],[20.51171,42.21912],[20.4557,42.26696],[20.40232,42.28017],[20.39286,42.29328],[20.35016,42.30573],[20.34327,42.32034],[20.32919,42.32272],[20.30564,42.30975],[20.28975,42.31841],[20.25651,42.31381],[20.23897,42.32339],[20.24172,42.33451],[20.23137,42.34709],[20.24041,42.36756],[20.20299,42.40034],[20.2216,42.42031],[20.18897,42.44976],[20.18995,42.46123],[20.16241,42.50248],[20.09905,42.52756],[20.07781,42.55062],[20.05218,42.55643],[20.0611,42.56636],[20.07983,42.63561],[20.09833,42.65387],[20.02597,42.70293],[20.01357,42.73718],[20.0294,42.76543],[20.05828,42.77918],[20.17177,42.77208],[20.25749,42.77015],[20.26633,42.81006],[20.26709,42.81838],[20.40458,42.85177],[20.48421,42.87209],[20.52629,42.8857],[20.48117,42.92979],[20.48712,42.94371],[20.52036,42.97599],[20.538,42.97944],[20.54736,42.96696],[20.56759,43.00047],[20.59714,43.01791],[20.61815,43.00738],[20.63582,43.01263],[20.65529,43.03791],[20.66666,43.05941],[20.65555,43.06668],[20.65535,43.07614],[20.69024,43.09046],[20.68474,43.11734],[20.6571,43.13426],[20.60822,43.17079],[20.59313,43.19966],[20.59288,43.20807],[20.60326,43.21586],[20.61577,43.20947],[20.6759,43.21404],[20.71781,43.23861],[20.72976,43.25396],[20.78861,43.2509],[20.79902,43.26973],[20.82402,43.27416],[20.88056,43.23237],[20.89633,43.2064],[20.89185,43.19741],[20.86038,43.18418],[20.88322,43.17221],[20.968,43.12786],[20.97317,43.13725],[21.00171,43.14304],[21.02916,43.13467],[21.05505,43.11374],[21.0768,43.12108],[21.0795,43.1332],[21.09221,43.14057],[21.11813,43.11808],[21.14314,43.11815],[21.15722,43.09497],[21.14943,43.08237],[21.15915,43.04152],[21.17346,43.02927],[21.17228,43.01229],[21.18865,43.01181],[21.19528,43.02655],[21.20838,43.03051],[21.24098,43.01253],[21.25156,42.98139],[21.24127,42.95446],[21.27793,42.90132],[21.30679,42.91192],[21.33168,42.90934],[21.34717,42.90549],[21.36699,42.87815],[21.44,42.87777],[21.44185,42.85103],[21.43,42.84464],[21.42818,42.80712],[21.41748,42.77388],[21.39541,42.75691],[21.39835,42.75158],[21.45096,42.75723],[21.46671,42.74511],[21.48212,42.7524],[21.53015,42.73143],[21.56111,42.74322],[21.59623,42.731],[21.59439,42.7097],[21.67045,42.68104],[21.68037,42.6972],[21.73393,42.71782],[21.7767,42.72243],[21.77888,42.69807],[21.80449,42.65599],[21.77972,42.64209],[21.77173,42.62838],[21.77008,42.60166],[21.75125,42.58434],[21.75095,42.55505],[21.72961,42.54235],[21.70728,42.54294],[21.70222,42.53272],[21.71414,42.51308],[21.69423,42.49888],[21.67446,42.49033],[21.67458,42.48071],[21.62857,42.45056],[21.65142,42.40951],[21.62852,42.37199],[21.57112,42.35813],[21.5391,42.36425],[21.53133,42.33801],[21.56671,42.3189],[21.59596,42.27006],[21.58272,42.25167],[21.52186,42.23975],[21.50594,42.2651],[21.44573,42.27489],[21.43843,42.25552],[21.44638,42.23142],[21.43208,42.22775],[21.39412,42.24212],[21.3493,42.20076],[21.33667,42.1989],[21.33915,42.18753],[21.30895,42.13871],[21.32219,42.10706],[21.30296,42.10363],[21.29279,42.10824],[21.25722,42.08817],[21.23557,42.08617],[21.21595,42.09461],[21.20791,42.12657],[21.16719,42.1714],[21.16274,42.19266],[21.11303,42.20093],[21.05269,42.16308],[21.02143,42.14681],[20.92263,42.12229],[20.89259,42.09216],[20.83556,42.08285],[20.79199,42.07669],[20.76879,42.04106],[20.77208,41.95756],[20.77892,41.91873],[20.74544,41.8779],[20.68323,41.85101]]]}},"Universit-Mohammed-V-Rabat":{type:"Feature",id:"Universit-Mohammed-V-Rabat",properties:{},geometry:{type:"Polygon",coordinates:[[[-6.84395,34.22335],[-6.79097,34.21902],[-6.74003,34.20621],[-6.69312,34.18541],[-6.65205,34.15742],[-6.61839,34.12333],[-6.59343,34.08446],[-6.57813,34.0423],[-6.57307,33.99847],[-6.57841,33.95467],[-6.59394,33.91257],[-6.61905,33.8738],[-6.65276,33.83982],[-6.69379,33.81195],[-6.74054,33.79124],[-6.79124,33.7785],[-6.84395,33.77419],[-6.89666,33.7785],[-6.94736,33.79124],[-6.99412,33.81195],[-7.03514,33.83982],[-7.06886,33.8738],[-7.09397,33.91257],[-7.1095,33.95467],[-7.11484,33.99847],[-7.10977,34.0423],[-7.09447,34.08446],[-7.06952,34.12333],[-7.03586,34.15742],[-6.99478,34.18541],[-6.94787,34.20621],[-6.89694,34.21902],[-6.84395,34.22335]]]}},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]]]}},portugal_full:{type:"Feature",id:"portugal_full",properties:{},geometry:{type:"MultiPolygon",coordinates:[[[[-9.8183,39.46654],[-9.74297,39.61243],[-9.15336,40.2689],[-9.02339,40.66605],[-9.06499,41.53361],[-9.14028,41.86583],[-8.87097,41.86393],[-8.63678,42.04749],[-8.33189,42.08383],[-8.09392,41.80804],[-7.70414,41.90734],[-7.57391,41.82972],[-7.31532,41.84255],[-7.07696,41.95194],[-6.59946,41.9483],[-6.54827,41.6856],[-6.18916,41.57483],[-6.31541,41.39007],[-6.64838,41.24755],[-6.80893,41.0365],[-6.78122,40.3638],[-7.00889,40.22732],[-6.88093,40.04168],[-7.01552,39.67043],[-7.49982,39.59116],[-7.29426,39.45683],[-7.22161,39.1933],[-6.95113,39.0236],[-7.03302,38.87882],[-7.26003,38.72294],[-7.3179,38.44009],[-7.00719,38.02075],[-7.24557,37.9918],[-7.52267,37.55307],[-7.44048,37.39102],[-7.36982,36.96795],[-7.86807,36.75651],[-8.93249,36.70613],[-9.19102,36.85095],[-9.24841,37.0566],[-9.15002,37.89299],[-9.43993,38.30501],[-9.69634,38.59117],[-9.76209,38.77148],[-9.8183,39.46654]]],[[[-29.09544,38.59321],[-28.99861,38.75606],[-28.29551,38.95917],[-28.27253,39.20819],[-28.0874,39.30317],[-27.74735,39.18461],[-27.67871,38.98361],[-27.87807,38.81064],[-27.64155,38.71777],[-27.49973,38.96044],[-27.24547,39.00544],[-26.96172,38.94667],[-26.75981,38.69471],[-26.84006,38.53312],[-27.09439,38.40899],[-27.50811,38.51656],[-27.62972,38.36611],[-27.92878,38.22365],[-28.20466,38.18043],[-28.57194,38.21044],[-28.8786,38.34414],[-29.09544,38.59321]]],[[[-17.50448,32.80672],[-17.33873,33.02841],[-17.13654,33.07618],[-16.85671,33.03341],[-16.64298,33.07363],[-16.50498,33.26683],[-16.31749,33.32499],[-16.07438,33.22887],[-16.03974,33.01477],[-16.29967,32.80354],[-16.32939,32.68259],[-16.23823,32.34105],[-16.43009,32.20188],[-16.57427,32.2215],[-17.20787,32.49171],[-17.4233,32.6378],[-17.50448,32.80672]]],[[[-31.55753,39.44564],[-31.35042,39.8176],[-31.19648,39.91735],[-30.95234,39.88204],[-30.85434,39.72257],[-30.8573,39.42079],[-30.93102,39.25354],[-31.27059,39.14744],[-31.46896,39.23418],[-31.55753,39.44564]]],[[[-26.09699,37.8288],[-25.94558,38.06895],[-25.76694,38.10856],[-25.14862,38.0596],[-24.91128,37.9213],[-24.55129,37.35666],[-24.56246,37.16939],[-24.80604,36.81868],[-24.95535,36.7319],[-25.22799,36.74365],[-25.37354,36.82104],[-26.05947,37.72099],[-26.09699,37.8288]]],[[[-16.28153,30.01758],[-16.25213,30.14668],[-16.00891,30.32696],[-15.68743,30.28727],[-15.63441,30.07799],[-15.89594,29.862],[-16.08667,29.83115],[-16.28153,30.01758]]]]}},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]]]]}},"Universidad-Autonoma-de-Madrid":{type:"Feature",id:"Universidad-Autonoma-de-Madrid",properties:{},geometry:{type:"Polygon",coordinates:[[[-3.69437,40.77124],[-3.63652,40.76691],[-3.58092,40.75409],[-3.52972,40.73327],[-3.48489,40.70527],[-3.44818,40.67117],[-3.42097,40.63228],[-3.40432,40.59011],[-3.39883,40.54628],[-3.4047,40.50248],[-3.42167,40.46039],[-3.44909,40.42163],[-3.48588,40.38767],[-3.53063,40.35981],[-3.58162,40.33912],[-3.6369,40.32638],[-3.69437,40.32208],[-3.75184,40.32638],[-3.80712,40.33912],[-3.85811,40.35981],[-3.90286,40.38767],[-3.93965,40.42163],[-3.96707,40.46039],[-3.98405,40.50248],[-3.98992,40.54628],[-3.98443,40.59011],[-3.96777,40.63228],[-3.94057,40.67117],[-3.90385,40.70527],[-3.85903,40.73327],[-3.80783,40.75409],[-3.75222,40.76691],[-3.69437,40.77124]]]}},"Universidad-Politcnica-de-Madrid":{type:"Feature",id:"Universidad-Politcnica-de-Madrid",properties:{},geometry:{type:"Polygon",coordinates:[[[-3.7173,40.67259],[-3.65954,40.66826],[-3.60402,40.65544],[-3.55289,40.63463],[-3.50813,40.60662],[-3.47147,40.57252],[-3.44431,40.53363],[-3.42767,40.49146],[-3.42219,40.44764],[-3.42805,40.40384],[-3.445,40.36175],[-3.47238,40.32298],[-3.50912,40.28902],[-3.5538,40.26117],[-3.60472,40.24047],[-3.65992,40.22773],[-3.7173,40.22343],[-3.77469,40.22773],[-3.82989,40.24047],[-3.8808,40.26117],[-3.92549,40.28902],[-3.96222,40.32298],[-3.9896,40.36175],[-4.00656,40.40384],[-4.01241,40.44764],[-4.00693,40.49146],[-3.9903,40.53363],[-3.96314,40.57252],[-3.92647,40.60662],[-3.88172,40.63463],[-3.83059,40.65544],[-3.77507,40.66826],[-3.7173,40.67259]]]}},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]]]}},"Istanbul-Technical-University":{type:"Feature",id:"Istanbul-Technical-University",properties:{},geometry:{type:"Polygon",coordinates:[[[29.02465,41.33019],[29.083,41.32586],[29.13907,41.31304],[29.19071,41.29222],[29.23592,41.26422],[29.27294,41.23011],[29.30037,41.19122],[29.31717,41.14905],[29.3227,41.10523],[29.31678,41.06143],[29.29965,41.01934],[29.272,40.98058],[29.2349,40.94662],[29.18977,40.91876],[29.13835,40.89807],[29.08261,40.88533],[29.02465,40.88103],[28.9667,40.88533],[28.91095,40.89807],[28.85954,40.91876],[28.81441,40.94662],[28.77731,40.98058],[28.74965,41.01934],[28.73253,41.06143],[28.72661,41.10523],[28.73214,41.14905],[28.74893,41.19122],[28.77636,41.23011],[28.81339,41.26422],[28.85859,41.29222],[28.91023,41.31304],[28.96631,41.32586],[29.02465,41.33019]]]}},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]]]}},"University-of-Exeter":{type:"Feature",id:"University-of-Exeter",properties:{},geometry:{type:"Polygon",coordinates:[[[-3.53515,50.96148],[-3.46559,50.95715],[-3.39875,50.94431],[-3.33721,50.92347],[-3.28338,50.89544],[-3.23931,50.8613],[-3.20671,50.82239],[-3.18679,50.7802],[-3.1803,50.73637],[-3.18744,50.69258],[-3.20791,50.6505],[-3.24089,50.61177],[-3.28508,50.57784],[-3.33879,50.55001],[-3.39995,50.52934],[-3.46624,50.51662],[-3.53515,50.51233],[-3.60405,50.51662],[-3.67035,50.52934],[-3.73151,50.55001],[-3.78522,50.57784],[-3.82941,50.61177],[-3.86239,50.6505],[-3.88285,50.69258],[-3.89,50.73637],[-3.8835,50.7802],[-3.86359,50.82239],[-3.83098,50.8613],[-3.78692,50.89544],[-3.73308,50.92347],[-3.67155,50.94431],[-3.6047,50.95715],[-3.53515,50.96148]]]}},"University-of-Warwick":{type:"Feature",id:"University-of-Warwick",properties:{},geometry:{type:"Polygon",coordinates:[[[-1.56119,52.60392],[-1.48906,52.59958],[-1.41974,52.58674],[-1.35593,52.56589],[-1.30011,52.53785],[-1.25443,52.50371],[-1.22063,52.46479],[-1.2,52.4226],[-1.19329,52.37877],[-1.20072,52.33498],[-1.22196,52.29291],[-1.25615,52.25418],[-1.30198,52.22025],[-1.35766,52.19243],[-1.42106,52.17177],[-1.48977,52.15905],[-1.56119,52.15476],[-1.63261,52.15905],[-1.70132,52.17177],[-1.76473,52.19243],[-1.8204,52.22025],[-1.86623,52.25418],[-1.90043,52.29291],[-1.92166,52.33498],[-1.92909,52.37877],[-1.92238,52.4226],[-1.90175,52.46479],[-1.86796,52.50371],[-1.82228,52.53785],[-1.76645,52.56589],[-1.70265,52.58674],[-1.63333,52.59958],[-1.56119,52.60392]]]}},"Sacred-Heart-Junior-College":{type:"Feature",id:"Sacred-Heart-Junior-College",properties:{},geometry:{type:"Polygon",coordinates:[[[-89.07411,17.38565],[-89.0282,17.38133],[-88.98406,17.36853],[-88.9434,17.34776],[-88.90777,17.3198],[-88.87855,17.28574],[-88.85686,17.24689],[-88.84353,17.20475],[-88.83907,17.16093],[-88.84364,17.11712],[-88.85706,17.07501],[-88.87881,17.0362],[-88.90805,17.0022],[-88.94366,16.97429],[-88.98426,16.95356],[-89.02831,16.9408],[-89.07411,16.93649],[-89.11991,16.9408],[-89.16396,16.95356],[-89.20456,16.97429],[-89.24017,17.0022],[-89.26941,17.0362],[-89.29116,17.07501],[-89.30458,17.11712],[-89.30915,17.16093],[-89.30469,17.20475],[-89.29136,17.24689],[-89.26967,17.28574],[-89.24045,17.3198],[-89.20483,17.34776],[-89.16416,17.36853],[-89.12002,17.38133],[-89.07411,17.38565]]]}},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]]]}},"Universidad-de-Costa-Rica":{type:"Feature",id:"Universidad-de-Costa-Rica",properties:{},geometry:{type:"Polygon",coordinates:[[[-84.05105,10.16183],[-84.00654,10.15751],[-83.96374,10.14472],[-83.92431,10.12396],[-83.88975,10.09601],[-83.8614,10.06196],[-83.84035,10.02313],[-83.8274,9.98099],[-83.82305,9.93717],[-83.82746,9.89336],[-83.84046,9.85124],[-83.86155,9.81243],[-83.88991,9.77841],[-83.92445,9.75049],[-83.96385,9.72975],[-84.0066,9.71698],[-84.05105,9.71267],[-84.0955,9.71698],[-84.13825,9.72975],[-84.17765,9.75049],[-84.21219,9.77841],[-84.24055,9.81243],[-84.26164,9.85124],[-84.27464,9.89336],[-84.27905,9.93717],[-84.2747,9.98099],[-84.26175,10.02313],[-84.2407,10.06196],[-84.21235,10.09601],[-84.17779,10.12396],[-84.13836,10.14472],[-84.09556,10.15751],[-84.05105,10.16183]]]}},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]]]}},"Universidad-Nacional-Autnoma-de-Honduras":{type:"Feature",id:"Universidad-Nacional-Autnoma-de-Honduras",properties:{},geometry:{type:"Polygon",coordinates:[[[-87.16598,14.30969],[-87.12077,14.30537],[-87.07729,14.29258],[-87.03724,14.27181],[-87.00214,14.24385],[-86.97336,14.2098],[-86.95199,14.17096],[-86.93885,14.12882],[-86.93444,14.085],[-86.93893,14.04119],[-86.95215,13.99907],[-86.97357,13.96026],[-87.00237,13.92625],[-87.03745,13.89834],[-87.07745,13.87761],[-87.12085,13.86484],[-87.16598,13.86053],[-87.21111,13.86484],[-87.25451,13.87761],[-87.29451,13.89834],[-87.32959,13.92625],[-87.35839,13.96026],[-87.37982,13.99907],[-87.39303,14.04119],[-87.39752,14.085],[-87.39312,14.12882],[-87.37998,14.17096],[-87.3586,14.2098],[-87.32982,14.24385],[-87.29472,14.27181],[-87.25467,14.29258],[-87.2112,14.30537],[-87.16598,14.30969]]]}},"University-of-the-West-Indies-Mona-Campus":{type:"Feature",id:"University-of-the-West-Indies-Mona-Campus",properties:{},geometry:{type:"Polygon",coordinates:[[[-76.74601,18.23094],[-76.69988,18.22662],[-76.65553,18.21383],[-76.61468,18.19305],[-76.57888,18.16509],[-76.54952,18.13104],[-76.52773,18.09219],[-76.51435,18.05004],[-76.50987,18.00622],[-76.51446,17.96241],[-76.52795,17.9203],[-76.5498,17.8815],[-76.57918,17.84749],[-76.61495,17.81959],[-76.65575,17.79886],[-76.7,17.7861],[-76.74601,17.78179],[-76.79202,17.7861],[-76.83627,17.79886],[-76.87707,17.81959],[-76.91284,17.84749],[-76.94222,17.8815],[-76.96407,17.9203],[-76.97756,17.96241],[-76.98215,18.00622],[-76.97767,18.05004],[-76.96429,18.09219],[-76.9425,18.13104],[-76.91314,18.16509],[-76.87734,18.19305],[-76.83649,18.21383],[-76.79214,18.22662],[-76.74601,18.23094]]]}},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]]]}},"Universidad-Nacional-de-Ingenieria":{type:"Feature",id:"Universidad-Nacional-de-Ingenieria",properties:{},geometry:{type:"Polygon",coordinates:[[[-86.27051,12.35623],[-86.22565,12.35191],[-86.18253,12.33912],[-86.1428,12.31835],[-86.10798,12.2904],[-86.07942,12.25635],[-86.05821,12.21751],[-86.04517,12.17537],[-86.0408,12.13156],[-86.04525,12.08775],[-86.05835,12.04563],[-86.0796,12.00682],[-86.10817,11.9728],[-86.14298,11.94489],[-86.18267,11.92415],[-86.22573,11.91138],[-86.27051,11.90707],[-86.31528,11.91138],[-86.35834,11.92415],[-86.39804,11.94489],[-86.43284,11.9728],[-86.46141,12.00682],[-86.48266,12.04563],[-86.49576,12.08775],[-86.50021,12.13156],[-86.49584,12.17537],[-86.4828,12.21751],[-86.46159,12.25635],[-86.43303,12.2904],[-86.39822,12.31835],[-86.35848,12.33912],[-86.31536,12.35191],[-86.27051,12.35623]]]}},"University-of-Panama":{type:"Feature",id:"University-of-Panama",properties:{},geometry:{type:"Polygon",coordinates:[[[-79.54102,9.23988],[-79.49663,9.23556],[-79.45395,9.22278],[-79.41462,9.20201],[-79.38016,9.17407],[-79.35188,9.14002],[-79.33089,9.10119],[-79.31797,9.05905],[-79.31363,9.01523],[-79.31802,8.97142],[-79.33099,8.9293],[-79.35201,8.89048],[-79.3803,8.85647],[-79.41475,8.82855],[-79.45405,8.80781],[-79.49668,8.79504],[-79.54102,8.79072],[-79.58535,8.79504],[-79.62798,8.80781],[-79.66728,8.82855],[-79.70173,8.85647],[-79.73002,8.89048],[-79.75104,8.9293],[-79.76401,8.97142],[-79.7684,9.01523],[-79.76406,9.05905],[-79.75114,9.10119],[-79.73015,9.14002],[-79.70187,9.17407],[-79.66741,9.20201],[-79.62808,9.22278],[-79.5854,9.23556],[-79.54102,9.23988]]]}},"Universidad-de-Puerto-Rico-Rio-Piedras":{type:"Feature",id:"Universidad-de-Puerto-Rico-Rio-Piedras",properties:{},geometry:{type:"Polygon",coordinates:[[[-66.04978,18.62742],[-66.00355,18.6231],[-65.9591,18.6103],[-65.91815,18.58953],[-65.88227,18.56157],[-65.85285,18.52751],[-65.83101,18.48866],[-65.81759,18.44651],[-65.8131,18.40269],[-65.81771,18.35889],[-65.83123,18.31677],[-65.85313,18.27797],[-65.88258,18.24397],[-65.91843,18.21606],[-65.95932,18.19533],[-66.00367,18.18257],[-66.04978,18.17826],[-66.0959,18.18257],[-66.14025,18.19533],[-66.18113,18.21606],[-66.21699,18.24397],[-66.24644,18.27797],[-66.26834,18.31677],[-66.28186,18.35889],[-66.28647,18.40269],[-66.28198,18.44651],[-66.26856,18.48866],[-66.24672,18.52751],[-66.2173,18.56157],[-66.18142,18.58953],[-66.14047,18.6103],[-66.09602,18.6231],[-66.04978,18.62742]]]}},"Ball-State-University":{type:"Feature",id:"Ball-State-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-85.40688,40.43064],[-85.34933,40.42631],[-85.294,40.41349],[-85.24306,40.39268],[-85.19846,40.36468],[-85.16193,40.33057],[-85.13486,40.29169],[-85.11829,40.24952],[-85.11283,40.20569],[-85.11866,40.16189],[-85.13555,40.1198],[-85.16283,40.08104],[-85.19944,40.04708],[-85.24396,40.01922],[-85.29469,39.99852],[-85.3497,39.98578],[-85.40688,39.98148],[-85.46406,39.98578],[-85.51907,39.99852],[-85.5698,40.01922],[-85.61432,40.04708],[-85.65093,40.08104],[-85.67821,40.1198],[-85.6951,40.16189],[-85.70094,40.20569],[-85.69547,40.24952],[-85.6789,40.29169],[-85.65183,40.33057],[-85.6153,40.36468],[-85.5707,40.39268],[-85.51976,40.41349],[-85.46444,40.42631],[-85.40688,40.43064]]]}},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]]]}},"California-University-of-Pennsylvania":{type:"Feature",id:"California-University-of-Pennsylvania",properties:{},geometry:{type:"Polygon",coordinates:[[[-79.89258,40.26902],[-79.83516,40.26469],[-79.77997,40.25187],[-79.72915,40.23105],[-79.68466,40.20305],[-79.64821,40.16895],[-79.62121,40.13006],[-79.60467,40.08789],[-79.59922,40.04407],[-79.60504,40.00027],[-79.62189,39.95818],[-79.64911,39.91941],[-79.68562,39.88545],[-79.73004,39.85759],[-79.78066,39.8369],[-79.83553,39.82416],[-79.89258,39.81986],[-79.94963,39.82416],[-80.0045,39.8369],[-80.05511,39.85759],[-80.09953,39.88545],[-80.13605,39.91941],[-80.16326,39.95818],[-80.18011,40.00027],[-80.18593,40.04407],[-80.18048,40.08789],[-80.16395,40.13006],[-80.13694,40.16895],[-80.1005,40.20305],[-80.05601,40.23105],[-80.00518,40.25187],[-79.95,40.26469],[-79.89258,40.26902]]]}},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]]]}},"Central-Washington-University":{type:"Feature",id:"Central-Washington-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-120.49805,47.20483],[-120.43356,47.2005],[-120.37159,47.18767],[-120.31453,47.16684],[-120.26459,47.13882],[-120.22371,47.10469],[-120.19344,47.06579],[-120.17494,47.02361],[-120.16888,46.97978],[-120.17546,46.93599],[-120.19442,46.89391],[-120.22499,46.85516],[-120.26598,46.82122],[-120.3158,46.79338],[-120.37256,46.7727],[-120.43409,46.75997],[-120.49805,46.75567],[-120.562,46.75997],[-120.62353,46.7727],[-120.68029,46.79338],[-120.73012,46.82122],[-120.77111,46.85516],[-120.80167,46.89391],[-120.82063,46.93599],[-120.82722,46.97978],[-120.82116,47.02361],[-120.80265,47.06579],[-120.77238,47.10469],[-120.7315,47.13882],[-120.68157,47.16684],[-120.62451,47.18767],[-120.56253,47.2005],[-120.49805,47.20483]]]}},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]]]}},"Clemson-University":{type:"Feature",id:"Clemson-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-82.79297,34.89394],[-82.73955,34.88961],[-82.68821,34.8768],[-82.64092,34.85599],[-82.59951,34.82801],[-82.56558,34.79392],[-82.54043,34.75504],[-82.52501,34.71288],[-82.51991,34.66905],[-82.5253,34.62525],[-82.54095,34.58316],[-82.56627,34.54438],[-82.60025,34.51041],[-82.6416,34.48253],[-82.68873,34.46183],[-82.73984,34.44908],[-82.79297,34.44478],[-82.8461,34.44908],[-82.8972,34.46183],[-82.94433,34.48253],[-82.98568,34.51041],[-83.01967,34.54438],[-83.04498,34.58316],[-83.06064,34.62525],[-83.06603,34.66905],[-83.06092,34.71288],[-83.04551,34.75504],[-83.02035,34.79392],[-82.98642,34.82801],[-82.94502,34.85599],[-82.89773,34.8768],[-82.84638,34.88961],[-82.79297,34.89394]]]}},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]]]}},"College-of-William-and-Mary":{type:"Feature",id:"College-of-William-and-Mary",properties:{},geometry:{type:"Polygon",coordinates:[[[-76.72852,37.52485],[-76.67328,37.52053],[-76.62018,37.50771],[-76.57128,37.4869],[-76.52846,37.45891],[-76.49338,37.42481],[-76.46739,37.38593],[-76.45146,37.34377],[-76.44619,37.29994],[-76.45178,37.25614],[-76.46798,37.21405],[-76.49416,37.17527],[-76.5293,37.14131],[-76.57205,37.11344],[-76.62077,37.09274],[-76.6736,37.08],[-76.72852,37.0757],[-76.78343,37.08],[-76.83626,37.09274],[-76.88498,37.11344],[-76.92773,37.14131],[-76.96287,37.17527],[-76.98905,37.21405],[-77.00525,37.25614],[-77.01084,37.29994],[-77.00557,37.34377],[-76.98965,37.38593],[-76.96365,37.42481],[-76.92857,37.45891],[-76.88576,37.4869],[-76.83685,37.50771],[-76.78376,37.52053],[-76.72852,37.52485]]]}},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]]]}},"Cornell-University":{type:"Feature",id:"Cornell-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-76.4735,42.67798],[-76.41391,42.67365],[-76.35663,42.66082],[-76.30389,42.64001],[-76.25772,42.612],[-76.21991,42.57789],[-76.1919,42.539],[-76.17476,42.49683],[-76.16912,42.453],[-76.17518,42.4092],[-76.19268,42.36711],[-76.22092,42.32835],[-76.25882,42.2944],[-76.3049,42.26655],[-76.3574,42.24586],[-76.41433,42.23312],[-76.4735,42.22882],[-76.53267,42.23312],[-76.5896,42.24586],[-76.6421,42.26655],[-76.68818,42.2944],[-76.72608,42.32835],[-76.75432,42.36711],[-76.77182,42.4092],[-76.77788,42.453],[-76.77224,42.49683],[-76.7551,42.539],[-76.72709,42.57789],[-76.68928,42.612],[-76.64311,42.64001],[-76.59037,42.66082],[-76.53309,42.67365],[-76.4735,42.67798]]]}},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]]]}},"George-Mason-University":{type:"Feature",id:"George-Mason-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-77.34375,39.04717],[-77.28734,39.04284],[-77.23312,39.03002],[-77.18318,39.00921],[-77.13947,38.98121],[-77.10365,38.94711],[-77.07711,38.90823],[-77.06086,38.86606],[-77.05549,38.82224],[-77.06121,38.77844],[-77.07776,38.73635],[-77.10449,38.69758],[-77.14037,38.66361],[-77.18402,38.63575],[-77.23376,38.61506],[-77.28769,38.60231],[-77.34375,38.59801],[-77.39981,38.60231],[-77.45374,38.61506],[-77.50348,38.63575],[-77.54713,38.66361],[-77.58301,38.69758],[-77.60974,38.73635],[-77.62629,38.77844],[-77.63201,38.82224],[-77.62664,38.86606],[-77.61039,38.90823],[-77.58385,38.94711],[-77.54803,38.98121],[-77.50432,39.00921],[-77.45438,39.03002],[-77.40016,39.04284],[-77.34375,39.04717]]]}},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]]]}},hrva:{type:"Feature",id:"hrva",properties:{},geometry:{type:"Polygon",coordinates:[[[-76.85486,36.53392],[-76.85486,37.35488],[-75.8194,37.35488],[-75.8194,36.53392],[-76.85486,36.53392]]]}},"Indiana-University-of-Pennsylvania":{type:"Feature",id:"Indiana-University-of-Pennsylvania",properties:{},geometry:{type:"Polygon",coordinates:[[[-79.16139,40.83872],[-79.10348,40.83439],[-79.04782,40.82157],[-78.99657,40.80076],[-78.9517,40.77275],[-78.91495,40.73865],[-78.88772,40.69976],[-78.87104,40.65759],[-78.86555,40.61377],[-78.87142,40.56997],[-78.88842,40.52788],[-78.91586,40.48911],[-78.95269,40.45515],[-78.99749,40.4273],[-79.04853,40.4066],[-79.10386,40.39387],[-79.16139,40.38956],[-79.21892,40.39387],[-79.27426,40.4066],[-79.3253,40.4273],[-79.37009,40.45515],[-79.40692,40.48911],[-79.43437,40.52788],[-79.45136,40.56997],[-79.45724,40.61377],[-79.45174,40.65759],[-79.43507,40.69976],[-79.40784,40.73865],[-79.37108,40.77275],[-79.32622,40.80076],[-79.27496,40.82157],[-79.2193,40.83439],[-79.16139,40.83872]]]}},"Jacksonville-State-University":{type:"Feature",id:"Jacksonville-State-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-85.76795,34.04756],[-85.71507,34.04323],[-85.66424,34.03042],[-85.61743,34.00962],[-85.57644,33.98163],[-85.54285,33.94754],[-85.51794,33.90867],[-85.50268,33.86651],[-85.49762,33.82268],[-85.50295,33.77888],[-85.51845,33.73679],[-85.5435,33.69801],[-85.57715,33.66403],[-85.61809,33.63616],[-85.66475,33.61545],[-85.71534,33.6027],[-85.76795,33.5984],[-85.82055,33.6027],[-85.87115,33.61545],[-85.91781,33.63616],[-85.95874,33.66403],[-85.99239,33.69801],[-86.01745,33.73679],[-86.03295,33.77888],[-86.03828,33.82268],[-86.03322,33.86651],[-86.01795,33.90867],[-85.99305,33.94754],[-85.95945,33.98163],[-85.91846,34.00962],[-85.87165,34.03042],[-85.82082,34.04323],[-85.76795,34.04756]]]}},"Kansas-State-University":{type:"Feature",id:"Kansas-State-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-96.5918,39.38872],[-96.53511,39.38439],[-96.48062,39.37157],[-96.43045,39.35076],[-96.38652,39.32276],[-96.35053,39.28866],[-96.32387,39.24978],[-96.30753,39.20761],[-96.30215,39.16378],[-96.30789,39.11998],[-96.32452,39.07789],[-96.35139,39.03912],[-96.38744,39.00516],[-96.4313,38.9773],[-96.48128,38.95661],[-96.53546,38.94386],[-96.5918,38.93956],[-96.64813,38.94386],[-96.70232,38.95661],[-96.75229,38.9773],[-96.79615,39.00516],[-96.83221,39.03912],[-96.85907,39.07789],[-96.87571,39.11998],[-96.88145,39.16378],[-96.87606,39.20761],[-96.85973,39.24978],[-96.83306,39.28866],[-96.79708,39.32276],[-96.75315,39.35076],[-96.70297,39.37157],[-96.64848,39.38439],[-96.5918,39.38872]]]}},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]]]}},massachusetts:{type:"Feature",id:"massachusetts",properties:{},geometry:{type:"Polygon",coordinates:[[[-73.53149,42.9725],[-69.40063,42.9725],[-69.40063,40.98819],[-71.55396,41.04622],[-71.53198,41.91863],[-73.70728,41.91045],[-73.53149,42.9725]]]}},"McGill-University":{type:"Feature",id:"McGill-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-73.5787,45.73088],[-73.51593,45.72655],[-73.45561,45.71372],[-73.40007,45.69289],[-73.35147,45.66488],[-73.31166,45.63076],[-73.28219,45.59186],[-73.26416,45.54968],[-73.25825,45.50585],[-73.26465,45.46206],[-73.28309,45.41998],[-73.31284,45.38122],[-73.35274,45.34728],[-73.40125,45.31943],[-73.45652,45.29875],[-73.51642,45.28602],[-73.5787,45.28172],[-73.64097,45.28602],[-73.70088,45.29875],[-73.75614,45.31943],[-73.80465,45.34728],[-73.84455,45.38122],[-73.8743,45.41998],[-73.89274,45.46206],[-73.89914,45.50585],[-73.89323,45.54968],[-73.8752,45.59186],[-73.84573,45.63076],[-73.80593,45.66488],[-73.75732,45.69289],[-73.70178,45.71372],[-73.64146,45.72655],[-73.5787,45.73088]]]}},"Miami-University":{type:"Feature",id:"Miami-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-84.73174,39.73566],[-84.67477,39.73133],[-84.62001,39.71851],[-84.56958,39.6977],[-84.52543,39.6697],[-84.48927,39.6356],[-84.46247,39.59671],[-84.44606,39.55454],[-84.44065,39.51072],[-84.44642,39.46692],[-84.46314,39.42483],[-84.49014,39.38606],[-84.52638,39.3521],[-84.57045,39.32424],[-84.62067,39.30354],[-84.67513,39.2908],[-84.73174,39.2865],[-84.78835,39.2908],[-84.84281,39.30354],[-84.89303,39.32424],[-84.9371,39.3521],[-84.97334,39.38606],[-85.00034,39.42483],[-85.01706,39.46692],[-85.02283,39.51072],[-85.01742,39.55454],[-85.00101,39.59671],[-84.97421,39.6356],[-84.93805,39.6697],[-84.8939,39.6977],[-84.84347,39.71851],[-84.78871,39.73133],[-84.73174,39.73566]]]}},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]]]}},"Monroe-Community-College":{type:"Feature",id:"Monroe-Community-College",properties:{},geometry:{type:"Polygon",coordinates:[[[-77.61025,43.32617],[-77.55003,43.32184],[-77.49214,43.30901],[-77.43884,43.28819],[-77.39219,43.26018],[-77.35398,43.22607],[-77.32568,43.18718],[-77.30836,43.14501],[-77.30267,43.10118],[-77.30879,43.05738],[-77.32648,43.0153],[-77.35502,42.97654],[-77.39332,42.94258],[-77.43988,42.91473],[-77.49294,42.89405],[-77.55046,42.88131],[-77.61025,42.87701],[-77.67004,42.88131],[-77.72756,42.89405],[-77.78061,42.91473],[-77.82718,42.94258],[-77.86547,42.97654],[-77.89402,43.0153],[-77.9117,43.05738],[-77.91783,43.10118],[-77.91214,43.14501],[-77.89482,43.18718],[-77.86652,43.22607],[-77.82831,43.26018],[-77.78166,43.28819],[-77.72836,43.30901],[-77.67047,43.32184],[-77.61025,43.32617]]]}},"Montgomery-College":{type:"Feature",id:"Montgomery-College",properties:{},geometry:{type:"Polygon",coordinates:[[[-77.15782,39.32194],[-77.10119,39.31761],[-77.04675,39.30479],[-76.99662,39.28398],[-76.95274,39.25598],[-76.91678,39.22188],[-76.89014,39.183],[-76.87383,39.14083],[-76.86844,39.097],[-76.87418,39.0532],[-76.8908,39.01111],[-76.91764,38.97234],[-76.95366,38.93838],[-76.99747,38.91052],[-77.0474,38.88982],[-77.10154,38.87708],[-77.15782,38.87278],[-77.2141,38.87708],[-77.26823,38.88982],[-77.31816,38.91052],[-77.36198,38.93838],[-77.398,38.97234],[-77.42484,39.01111],[-77.44146,39.0532],[-77.4472,39.097],[-77.44181,39.14083],[-77.42549,39.183],[-77.39885,39.22188],[-77.3629,39.25598],[-77.31902,39.28398],[-77.26889,39.30479],[-77.21445,39.31761],[-77.15782,39.32194]]]}},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]]]}},"New-York-University":{type:"Feature",id:"New-York-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-74.00391,40.93853],[-73.94591,40.9342],[-73.89017,40.92138],[-73.83883,40.90057],[-73.7939,40.87257],[-73.75709,40.83846],[-73.72982,40.79957],[-73.71312,40.7574],[-73.70762,40.71358],[-73.7135,40.66978],[-73.73053,40.62769],[-73.75801,40.58893],[-73.7949,40.55497],[-73.83976,40.52711],[-73.89087,40.50642],[-73.94629,40.49368],[-74.00391,40.48938],[-74.06152,40.49368],[-74.11694,40.50642],[-74.16805,40.52711],[-74.21291,40.55497],[-74.2498,40.58893],[-74.27729,40.62769],[-74.29431,40.66978],[-74.30019,40.71358],[-74.29469,40.7574],[-74.27799,40.79957],[-74.25072,40.83846],[-74.21391,40.87257],[-74.16898,40.90057],[-74.11765,40.92138],[-74.0619,40.9342],[-74.00391,40.93853]]]}},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]]]}},"Ohio-Wesleyan-University":{type:"Feature",id:"Ohio-Wesleyan-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-83.06823,40.52082],[-83.0106,40.51649],[-82.9552,40.50367],[-82.90419,40.48285],[-82.85953,40.45485],[-82.82295,40.42075],[-82.79585,40.38186],[-82.77925,40.33969],[-82.77378,40.29586],[-82.77963,40.25207],[-82.79654,40.20998],[-82.82385,40.17121],[-82.86051,40.13725],[-82.90509,40.10939],[-82.95589,40.0887],[-83.01097,40.07596],[-83.06823,40.07166],[-83.12549,40.07596],[-83.18056,40.0887],[-83.23136,40.10939],[-83.27595,40.13725],[-83.3126,40.17121],[-83.33992,40.20998],[-83.35683,40.25207],[-83.36268,40.29586],[-83.3572,40.33969],[-83.34061,40.38186],[-83.31351,40.42075],[-83.27692,40.45485],[-83.23227,40.48285],[-83.18126,40.50367],[-83.12586,40.51649],[-83.06823,40.52082]]]}},"Oklahoma-State-University":{type:"Feature",id:"Oklahoma-State-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-97.07253,36.34551],[-97.01814,36.34119],[-96.96586,36.32837],[-96.9177,36.30756],[-96.87554,36.27957],[-96.841,36.24548],[-96.81539,36.2066],[-96.7997,36.16444],[-96.79451,36.12061],[-96.80001,36.07681],[-96.81596,36.03472],[-96.84173,35.99594],[-96.87634,35.96197],[-96.91844,35.9341],[-96.96642,35.9134],[-97.01845,35.90066],[-97.07253,35.89636],[-97.12662,35.90066],[-97.17865,35.9134],[-97.22663,35.9341],[-97.26873,35.96197],[-97.30333,35.99594],[-97.32911,36.03472],[-97.34506,36.07681],[-97.35055,36.12061],[-97.34537,36.16444],[-97.32967,36.2066],[-97.30407,36.24548],[-97.26952,36.27957],[-97.22736,36.30756],[-97.17921,36.32837],[-97.12693,36.34119],[-97.07253,36.34551]]]}},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]]]}},"State-University-of-New-York-Geneseo":{type:"Feature",id:"State-University-of-New-York-Geneseo",properties:{},geometry:{type:"Polygon",coordinates:[[[-77.7832,43.0361],[-77.72327,43.03177],[-77.66566,43.01895],[-77.61261,42.99813],[-77.56618,42.97012],[-77.52815,42.93601],[-77.49998,42.89712],[-77.48274,42.85494],[-77.47707,42.81111],[-77.48316,42.76732],[-77.50076,42.72523],[-77.52917,42.68647],[-77.56729,42.65252],[-77.61364,42.62467],[-77.66644,42.60398],[-77.72369,42.59124],[-77.7832,42.58694],[-77.84272,42.59124],[-77.89996,42.60398],[-77.95277,42.62467],[-77.99912,42.65252],[-78.03723,42.68647],[-78.06564,42.72523],[-78.08324,42.76732],[-78.08934,42.81111],[-78.08367,42.85494],[-78.06643,42.89712],[-78.03826,42.93601],[-78.00023,42.97012],[-77.9538,42.99813],[-77.90075,43.01895],[-77.84314,43.03177],[-77.7832,43.0361]]]}},"SUNY-at-Fredonia":{type:"Feature",id:"SUNY-at-Fredonia",properties:{},geometry:{type:"Polygon",coordinates:[[[-79.36523,42.64804],[-79.30567,42.6437],[-79.24842,42.63088],[-79.19571,42.61006],[-79.14956,42.58206],[-79.11177,42.54795],[-79.08377,42.50906],[-79.06664,42.46688],[-79.061,42.42305],[-79.06706,42.37926],[-79.08454,42.33717],[-79.11278,42.29841],[-79.15065,42.26445],[-79.19671,42.2366],[-79.24919,42.21591],[-79.30609,42.20318],[-79.36523,42.19888],[-79.42438,42.20318],[-79.48128,42.21591],[-79.53376,42.2366],[-79.57982,42.26445],[-79.61769,42.29841],[-79.64592,42.33717],[-79.66341,42.37926],[-79.66947,42.42305],[-79.66383,42.46688],[-79.64669,42.50906],[-79.6187,42.54795],[-79.58091,42.58206],[-79.53476,42.61006],[-79.48205,42.63088],[-79.4248,42.6437],[-79.36523,42.64804]]]}},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]]]}},"Texas-Tech-University":{type:"Feature",id:"Texas-Tech-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-101.86523,33.80259],[-101.81251,33.79827],[-101.76183,33.78546],[-101.71515,33.76465],[-101.67428,33.73667],[-101.64078,33.70258],[-101.61595,33.66371],[-101.60072,33.62155],[-101.59568,33.57772],[-101.60099,33.53392],[-101.61644,33.49182],[-101.64143,33.45304],[-101.67498,33.41907],[-101.7158,33.39119],[-101.76233,33.37049],[-101.81278,33.35774],[-101.86523,33.35344],[-101.91769,33.35774],[-101.96814,33.37049],[-102.01467,33.39119],[-102.05549,33.41907],[-102.08904,33.45304],[-102.11403,33.49182],[-102.12948,33.53392],[-102.13479,33.57772],[-102.12975,33.62155],[-102.11452,33.66371],[-102.08969,33.70258],[-102.05619,33.73667],[-102.01532,33.76465],[-101.96864,33.78546],[-101.91796,33.79827],[-101.86523,33.80259]]]}},"The-Citadel":{type:"Feature",id:"The-Citadel",properties:{},geometry:{type:"Polygon",coordinates:[[[-79.96064,33.02165],[-79.90838,33.01732],[-79.85816,33.00451],[-79.81189,32.98371],[-79.77138,32.95573],[-79.73818,32.92164],[-79.71357,32.88277],[-79.69847,32.84061],[-79.69347,32.79679],[-79.69873,32.75298],[-79.71404,32.71088],[-79.73881,32.6721],[-79.77206,32.63813],[-79.81252,32.61025],[-79.85863,32.58954],[-79.90864,32.57679],[-79.96064,32.57249],[-80.01263,32.57679],[-80.06264,32.58954],[-80.10876,32.61025],[-80.14921,32.63813],[-80.18247,32.6721],[-80.20723,32.71088],[-80.22254,32.75298],[-80.2278,32.79679],[-80.2228,32.84061],[-80.2077,32.88277],[-80.18309,32.92164],[-80.14989,32.95573],[-80.10938,32.98371],[-80.06312,33.00451],[-80.01289,33.01732],[-79.96064,33.02165]]]}},"The-George-Washington-University":{type:"Feature",id:"The-George-Washington-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-77.04812,39.12442],[-76.99165,39.12009],[-76.93737,39.10727],[-76.88738,39.08646],[-76.84362,39.05846],[-76.80776,39.02436],[-76.7812,38.98548],[-76.76492,38.94331],[-76.75955,38.89948],[-76.76527,38.85569],[-76.78184,38.81359],[-76.80861,38.77483],[-76.84453,38.74086],[-76.88822,38.713],[-76.93801,38.6923],[-76.992,38.67956],[-77.04812,38.67526],[-77.10425,38.67956],[-77.15823,38.6923],[-77.20803,38.713],[-77.25172,38.74086],[-77.28764,38.77483],[-77.31441,38.81359],[-77.33097,38.85569],[-77.33669,38.89948],[-77.33132,38.94331],[-77.31505,38.98548],[-77.28848,39.02436],[-77.25263,39.05846],[-77.20887,39.08646],[-77.15888,39.10727],[-77.1046,39.12009],[-77.04812,39.12442]]]}},"The-Johns-Hopkins-University-SAIS":{type:"Feature",id:"The-Johns-Hopkins-University-SAIS",properties:{},geometry:{type:"Polygon",coordinates:[[[-77.04027,39.13272],[-76.98379,39.12839],[-76.9295,39.11557],[-76.87951,39.09476],[-76.83574,39.06677],[-76.79988,39.03267],[-76.77331,38.99378],[-76.75704,38.95161],[-76.75167,38.90779],[-76.75739,38.86399],[-76.77396,38.8219],[-76.80073,38.78313],[-76.83665,38.74916],[-76.88035,38.7213],[-76.93015,38.70061],[-76.98414,38.68787],[-77.04027,38.68356],[-77.0964,38.68787],[-77.15039,38.70061],[-77.20019,38.7213],[-77.24389,38.74916],[-77.27982,38.78313],[-77.30658,38.8219],[-77.32316,38.86399],[-77.32888,38.90779],[-77.32351,38.95161],[-77.30723,38.99378],[-77.28066,39.03267],[-77.2448,39.06677],[-77.20104,39.09476],[-77.15104,39.11557],[-77.09675,39.12839],[-77.04027,39.13272]]]}},"The-Pennsylvania-State-University":{type:"Feature",id:"The-Pennsylvania-State-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-77.85976,41.02277],[-77.80169,41.01844],[-77.74587,41.00562],[-77.69448,40.9848],[-77.64948,40.9568],[-77.61263,40.92269],[-77.58532,40.88381],[-77.5686,40.84164],[-77.5631,40.79781],[-77.56899,40.75401],[-77.58603,40.71192],[-77.61355,40.67316],[-77.65049,40.6392],[-77.6954,40.61134],[-77.74658,40.59065],[-77.80207,40.57791],[-77.85976,40.57361],[-77.91744,40.57791],[-77.97293,40.59065],[-78.02411,40.61134],[-78.06903,40.6392],[-78.10596,40.67316],[-78.13348,40.71192],[-78.15053,40.75401],[-78.15642,40.79781],[-78.15091,40.84164],[-78.13419,40.88381],[-78.10689,40.92269],[-78.07003,40.9568],[-78.02504,40.9848],[-77.97364,41.00562],[-77.91783,41.01844],[-77.85976,41.02277]]]}},"University-of-California-Davis":{type:"Feature",id:"University-of-California-Davis",properties:{},geometry:{type:"Polygon",coordinates:[[[-121.72852,38.77274],[-121.67232,38.76842],[-121.61831,38.7556],[-121.56857,38.73479],[-121.52502,38.70679],[-121.48934,38.67269],[-121.4629,38.63381],[-121.44671,38.59164],[-121.44136,38.54781],[-121.44705,38.50402],[-121.46354,38.46192],[-121.49017,38.42315],[-121.52591,38.38919],[-121.56939,38.36133],[-121.61894,38.34063],[-121.67267,38.32789],[-121.72852,38.32359],[-121.78437,38.32789],[-121.83809,38.34063],[-121.88764,38.36133],[-121.93112,38.38919],[-121.96686,38.42315],[-121.99349,38.46192],[-122.00998,38.50402],[-122.01567,38.54781],[-122.01032,38.59164],[-121.99413,38.63381],[-121.96769,38.67269],[-121.93201,38.70679],[-121.88847,38.73479],[-121.83872,38.7556],[-121.78471,38.76842],[-121.72852,38.77274]]]}},"University-of-Central-Florida":{type:"Feature",id:"University-of-Central-Florida",properties:{},geometry:{type:"Polygon",coordinates:[[[-81.38672,28.68361],[-81.33678,28.67929],[-81.28877,28.66648],[-81.24455,28.64569],[-81.20582,28.61771],[-81.17407,28.58364],[-81.15052,28.54477],[-81.13608,28.50262],[-81.13127,28.45879],[-81.13628,28.41499],[-81.15091,28.37289],[-81.17457,28.3341],[-81.20636,28.30011],[-81.24505,28.27223],[-81.28915,28.25151],[-81.33699,28.23876],[-81.38672,28.23445],[-81.43645,28.23876],[-81.48428,28.25151],[-81.52839,28.27223],[-81.56708,28.30011],[-81.59887,28.3341],[-81.62253,28.37289],[-81.63715,28.41499],[-81.64217,28.45879],[-81.63736,28.50262],[-81.62291,28.54477],[-81.59937,28.58364],[-81.56762,28.61771],[-81.52889,28.64569],[-81.48467,28.66648],[-81.43666,28.67929],[-81.38672,28.68361]]]}},"University-of-Chicago":{type:"Feature",id:"University-of-Chicago",properties:{},geometry:{type:"Polygon",coordinates:[[[-87.59878,42.0135],[-87.53981,42.00917],[-87.48314,41.99634],[-87.43095,41.97553],[-87.38527,41.94752],[-87.34785,41.91341],[-87.32013,41.87452],[-87.30316,41.83235],[-87.29758,41.78852],[-87.30357,41.74473],[-87.32088,41.70264],[-87.34882,41.66388],[-87.38632,41.62992],[-87.43192,41.60207],[-87.48388,41.58138],[-87.54022,41.56864],[-87.59878,41.56434],[-87.65734,41.56864],[-87.71367,41.58138],[-87.76563,41.60207],[-87.81124,41.62992],[-87.84873,41.66388],[-87.87668,41.70264],[-87.89399,41.74473],[-87.89998,41.78852],[-87.8944,41.83235],[-87.87743,41.87452],[-87.84971,41.91341],[-87.81229,41.94752],[-87.76661,41.97553],[-87.71442,41.99634],[-87.65774,42.00917],[-87.59878,42.0135]]]}},"University-of-Maryland-College-Park":{type:"Feature",id:"University-of-Maryland-College-Park",properties:{},geometry:{type:"Polygon",coordinates:[[[-76.94332,39.21148],[-76.88677,39.20715],[-76.83242,39.19433],[-76.78237,39.17352],[-76.73856,39.14552],[-76.70266,39.11142],[-76.67606,39.07254],[-76.65977,39.03037],[-76.65439,38.98654],[-76.66012,38.94275],[-76.67671,38.90065],[-76.70351,38.86189],[-76.73947,38.82792],[-76.78322,38.80006],[-76.83307,38.77937],[-76.88712,38.76662],[-76.94332,38.76232],[-76.99951,38.76662],[-77.05356,38.77937],[-77.10341,38.80006],[-77.14716,38.82792],[-77.18313,38.86189],[-77.20992,38.90065],[-77.22651,38.94275],[-77.23224,38.98654],[-77.22686,39.03037],[-77.21057,39.07254],[-77.18397,39.11142],[-77.14808,39.14552],[-77.10426,39.17352],[-77.05421,39.19433],[-76.99986,39.20715],[-76.94332,39.21148]]]}},"University-of-North-Texas":{type:"Feature",id:"University-of-North-Texas",properties:{},geometry:{type:"Polygon",coordinates:[[[-97.15255,33.43207],[-97.10005,33.42774],[-97.04958,33.41493],[-97.0031,33.39413],[-96.9624,33.36615],[-96.92905,33.33206],[-96.90432,33.29319],[-96.88916,33.25103],[-96.88413,33.2072],[-96.88942,33.1634],[-96.90481,33.1213],[-96.92969,33.08252],[-96.96309,33.04855],[-97.00374,33.02067],[-97.05007,32.99997],[-97.10031,32.98722],[-97.15255,32.98291],[-97.20478,32.98722],[-97.25502,32.99997],[-97.30135,33.02067],[-97.342,33.04855],[-97.3754,33.08252],[-97.40028,33.1213],[-97.41567,33.1634],[-97.42096,33.2072],[-97.41593,33.25103],[-97.40077,33.29319],[-97.37604,33.33206],[-97.34269,33.36615],[-97.30199,33.39413],[-97.25551,33.41493],[-97.20504,33.42774],[-97.15255,33.43207]]]}},"University-of-Northern-Colorado":{type:"Feature",id:"University-of-Northern-Colorado",properties:{},geometry:{type:"Polygon",coordinates:[[[-104.69563,40.62872],[-104.63791,40.62439],[-104.58242,40.61157],[-104.53133,40.59075],[-104.4866,40.56275],[-104.44996,40.52865],[-104.42281,40.48976],[-104.40619,40.44759],[-104.40071,40.40377],[-104.40657,40.35997],[-104.42351,40.31788],[-104.45087,40.27911],[-104.48758,40.24515],[-104.53224,40.21729],[-104.58312,40.1966],[-104.63828,40.18386],[-104.69563,40.17956],[-104.75298,40.18386],[-104.80815,40.1966],[-104.85903,40.21729],[-104.90368,40.24515],[-104.94039,40.27911],[-104.96775,40.31788],[-104.98469,40.35997],[-104.99055,40.40377],[-104.98507,40.44759],[-104.96845,40.48976],[-104.9413,40.52865],[-104.90466,40.56275],[-104.85994,40.59075],[-104.80884,40.61157],[-104.75336,40.62439],[-104.69563,40.62872]]]}},"University-of-Oregon":{type:"Feature",id:"University-of-Oregon",properties:{},geometry:{type:"Polygon",coordinates:[[[-123.04688,44.249],[-122.98571,44.24467],[-122.92693,44.23184],[-122.87281,44.21102],[-122.82543,44.18301],[-122.78663,44.1489],[-122.7579,44.11],[-122.74032,44.06783],[-122.73455,44.024],[-122.74077,43.9802],[-122.75874,43.93812],[-122.78773,43.89936],[-122.82661,43.86541],[-122.8739,43.83756],[-122.92777,43.81688],[-122.98617,43.80414],[-123.04688,43.79984],[-123.10758,43.80414],[-123.16598,43.81688],[-123.21985,43.83756],[-123.26714,43.86541],[-123.30602,43.89936],[-123.33501,43.93812],[-123.35298,43.9802],[-123.3592,44.024],[-123.35343,44.06783],[-123.33585,44.11],[-123.30712,44.1489],[-123.26832,44.18301],[-123.22094,44.21102],[-123.16682,44.23184],[-123.10804,44.24467],[-123.04688,44.249]]]}},"University-of-Redlands":{type:"Feature",id:"University-of-Redlands",properties:{},geometry:{type:"Polygon",coordinates:[[[-117.16339,34.28768],[-117.11037,34.28336],[-117.0594,34.27054],[-117.01245,34.24974],[-116.97134,34.22175],[-116.93766,34.18767],[-116.91268,34.14879],[-116.89737,34.10663],[-116.8923,34.06281],[-116.89765,34.019],[-116.91319,33.97691],[-116.93832,33.93813],[-116.97206,33.90415],[-117.01311,33.87628],[-117.0599,33.85558],[-117.11064,33.84283],[-117.16339,33.83852],[-117.21614,33.84283],[-117.26688,33.85558],[-117.31367,33.87628],[-117.35473,33.90415],[-117.38847,33.93813],[-117.4136,33.97691],[-117.42914,34.019],[-117.43448,34.06281],[-117.42941,34.10663],[-117.4141,34.14879],[-117.38913,34.18767],[-117.35544,34.22175],[-117.31434,34.24974],[-117.26739,34.27054],[-117.21642,34.28336],[-117.16339,34.28768]]]}},"University-of-South-Carolina":{type:"Feature",id:"University-of-South-Carolina",properties:{},geometry:{type:"Polygon",coordinates:[[[-81.03516,34.24082],[-80.98216,34.23649],[-80.93122,34.22368],[-80.8843,34.20288],[-80.84321,34.17489],[-80.80954,34.14081],[-80.78458,34.10193],[-80.76928,34.05977],[-80.76421,34.01594],[-80.76956,33.97214],[-80.78509,33.93005],[-80.81021,33.89127],[-80.84393,33.85729],[-80.88496,33.82942],[-80.93172,33.80871],[-80.98243,33.79597],[-81.03516,33.79166],[-81.08788,33.79597],[-81.13859,33.80871],[-81.18535,33.82942],[-81.22638,33.85729],[-81.26011,33.89127],[-81.28522,33.93005],[-81.30076,33.97214],[-81.3061,34.01594],[-81.30103,34.05977],[-81.28573,34.10193],[-81.26077,34.14081],[-81.2271,34.17489],[-81.18602,34.20288],[-81.1391,34.22368],[-81.08815,34.23649],[-81.03516,34.24082]]]}},"University-of-Southern-California":{type:"Feature",id:"University-of-Southern-California",properties:{},geometry:{type:"Polygon",coordinates:[[[-118.30078,34.24082],[-118.24779,34.23649],[-118.19684,34.22368],[-118.14992,34.20288],[-118.10884,34.17489],[-118.07517,34.14081],[-118.05021,34.10193],[-118.03491,34.05977],[-118.02984,34.01594],[-118.03518,33.97214],[-118.05072,33.93005],[-118.07583,33.89127],[-118.10955,33.85729],[-118.15058,33.82942],[-118.19735,33.80871],[-118.24806,33.79597],[-118.30078,33.79166],[-118.3535,33.79597],[-118.40421,33.80871],[-118.45098,33.82942],[-118.49201,33.85729],[-118.52573,33.89127],[-118.55085,33.93005],[-118.56638,33.97214],[-118.57172,34.01594],[-118.56665,34.05977],[-118.55135,34.10193],[-118.52639,34.14081],[-118.49273,34.17489],[-118.45164,34.20288],[-118.40472,34.22368],[-118.35378,34.23649],[-118.30078,34.24082]]]}},"University-of-Vermont":{type:"Feature",id:"University-of-Vermont",properties:{},geometry:{type:"Polygon",coordinates:[[[-73.21289,44.68973],[-73.15127,44.6854],[-73.09204,44.67257],[-73.0375,44.65175],[-72.98977,44.62374],[-72.95068,44.58962],[-72.92174,44.55072],[-72.90403,44.50855],[-72.89821,44.46472],[-72.90449,44.42092],[-72.92259,44.37884],[-72.9518,44.34008],[-72.99098,44.30613],[-73.03862,44.27829],[-73.09289,44.2576],[-73.15173,44.24487],[-73.21289,44.24057],[-73.27405,44.24487],[-73.33289,44.2576],[-73.38716,44.27829],[-73.4348,44.30613],[-73.47398,44.34008],[-73.50319,44.37884],[-73.52129,44.42092],[-73.52757,44.46472],[-73.52175,44.50855],[-73.50404,44.55072],[-73.4751,44.58962],[-73.43601,44.62374],[-73.38828,44.65175],[-73.33374,44.67257],[-73.27451,44.6854],[-73.21289,44.68973]]]}},"University-of-Victoria":{type:"Feature",id:"University-of-Victoria",properties:{},geometry:{type:"Polygon",coordinates:[[[-123.31186,48.68804],[-123.24549,48.68371],[-123.18171,48.67087],[-123.123,48.65004],[-123.07162,48.62201],[-123.02956,48.58789],[-122.99842,48.54898],[-122.9794,48.5068],[-122.97318,48.46297],[-122.97997,48.41917],[-122.99948,48.3771],[-123.03094,48.33835],[-123.07312,48.30441],[-123.12438,48.27658],[-123.18277,48.25591],[-123.24607,48.24318],[-123.31186,48.23888],[-123.37764,48.24318],[-123.44094,48.25591],[-123.49933,48.27658],[-123.55059,48.30441],[-123.59277,48.33835],[-123.62423,48.3771],[-123.64374,48.41917],[-123.65053,48.46297],[-123.64431,48.5068],[-123.62529,48.54898],[-123.59415,48.58789],[-123.55209,48.62201],[-123.50071,48.65004],[-123.442,48.67087],[-123.37822,48.68371],[-123.31186,48.68804]]]}},"University-of-Wyoming":{type:"Feature",id:"University-of-Wyoming",properties:{},geometry:{type:"Polygon",coordinates:[[[-105.56651,41.53953],[-105.50798,41.5352],[-105.45172,41.52238],[-105.39992,41.50157],[-105.35457,41.47356],[-105.31742,41.43946],[-105.2899,41.40057],[-105.27306,41.3584],[-105.26751,41.31457],[-105.27345,41.27077],[-105.29063,41.22868],[-105.31837,41.18992],[-105.3556,41.15596],[-105.40087,41.12811],[-105.45245,41.10742],[-105.50837,41.09468],[-105.56651,41.09038],[-105.62465,41.09468],[-105.68057,41.10742],[-105.73215,41.12811],[-105.77742,41.15596],[-105.81465,41.18992],[-105.84239,41.22868],[-105.85957,41.27077],[-105.86551,41.31457],[-105.85996,41.3584],[-105.84312,41.40057],[-105.8156,41.43946],[-105.77845,41.47356],[-105.7331,41.50157],[-105.6813,41.52238],[-105.62504,41.5352],[-105.56651,41.53953]]]}},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]]]]}},"UW-Madison":{type:"Feature",id:"UW-Madison",properties:{},geometry:{type:"Polygon",coordinates:[[[-89.41268,43.30123],[-89.35248,43.2969],[-89.29462,43.28408],[-89.24134,43.26326],[-89.19471,43.23525],[-89.15652,43.20114],[-89.12823,43.16225],[-89.11092,43.12007],[-89.10523,43.07624],[-89.11135,43.03245],[-89.12903,42.99036],[-89.15756,42.9516],[-89.19584,42.91765],[-89.24239,42.8898],[-89.29542,42.86911],[-89.35291,42.85638],[-89.41268,42.85208],[-89.47245,42.85638],[-89.52994,42.86911],[-89.58298,42.8898],[-89.62952,42.91765],[-89.6678,42.9516],[-89.69634,42.99036],[-89.71401,43.03245],[-89.72014,43.07624],[-89.71444,43.12007],[-89.69713,43.16225],[-89.66884,43.20114],[-89.63065,43.23525],[-89.58402,43.26326],[-89.53074,43.28408],[-89.47288,43.2969],[-89.41268,43.30123]]]}},"Vassar-College":{type:"Feature",id:"Vassar-College",properties:{},geometry:{type:"Polygon",coordinates:[[[-73.89515,41.91136],[-73.83628,41.90703],[-73.7797,41.8942],[-73.72759,41.87339],[-73.68198,41.84538],[-73.64462,41.81127],[-73.61695,41.77238],[-73.6,41.73021],[-73.59443,41.68639],[-73.60041,41.64259],[-73.61769,41.6005],[-73.64559,41.56174],[-73.68303,41.52778],[-73.72856,41.49993],[-73.78044,41.47924],[-73.83668,41.4665],[-73.89515,41.4622],[-73.95362,41.4665],[-74.00986,41.47924],[-74.06174,41.49993],[-74.10727,41.52778],[-74.14471,41.56174],[-74.17261,41.6005],[-74.1899,41.64259],[-74.19587,41.68639],[-74.1903,41.73021],[-74.17336,41.77238],[-74.14568,41.81127],[-74.10832,41.84538],[-74.06271,41.87339],[-74.01061,41.8942],[-73.95402,41.90703],[-73.89515,41.91136]]]}},"Villanova-University":{type:"Feature",id:"Villanova-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-75.34361,40.26191],[-75.28619,40.25758],[-75.23101,40.24476],[-75.18019,40.22394],[-75.13571,40.19594],[-75.09927,40.16184],[-75.07227,40.12296],[-75.05573,40.08079],[-75.05028,40.03696],[-75.0561,39.99316],[-75.07295,39.95107],[-75.10016,39.9123],[-75.13667,39.87834],[-75.18109,39.85048],[-75.23169,39.82979],[-75.28656,39.81705],[-75.34361,39.81275],[-75.40065,39.81705],[-75.45552,39.82979],[-75.50613,39.85048],[-75.55054,39.87834],[-75.58705,39.9123],[-75.61426,39.95107],[-75.63111,39.99316],[-75.63693,40.03696],[-75.63148,40.08079],[-75.61495,40.12296],[-75.58795,40.16184],[-75.5515,40.19594],[-75.50702,40.22394],[-75.4562,40.24476],[-75.40102,40.25758],[-75.34361,40.26191]]]}},"West-Virginia-University":{type:"Feature",id:"West-Virginia-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-79.98047,39.86412],[-79.92339,39.85979],[-79.86853,39.84697],[-79.81801,39.82616],[-79.77378,39.79816],[-79.73755,39.76405],[-79.7107,39.72517],[-79.69426,39.683],[-79.68884,39.63917],[-79.69462,39.59537],[-79.71137,39.55328],[-79.73842,39.51452],[-79.77473,39.48055],[-79.81888,39.4527],[-79.8692,39.432],[-79.92375,39.41926],[-79.98047,39.41496],[-80.03718,39.41926],[-80.09174,39.432],[-80.14206,39.4527],[-80.18621,39.48055],[-80.22252,39.51452],[-80.24957,39.55328],[-80.26632,39.59537],[-80.2721,39.63917],[-80.26668,39.683],[-80.25024,39.72517],[-80.22339,39.76405],[-80.18716,39.79816],[-80.14293,39.82616],[-80.09241,39.84697],[-80.03755,39.85979],[-79.98047,39.86412]]]}},"Western-Michigan-University":{type:"Feature",id:"Western-Michigan-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-85.61042,42.5082],[-85.55099,42.50387],[-85.49387,42.49105],[-85.44127,42.47023],[-85.39523,42.44222],[-85.35752,42.40811],[-85.32959,42.36922],[-85.31249,42.32705],[-85.30686,42.28322],[-85.3129,42.23942],[-85.33035,42.19734],[-85.35852,42.15858],[-85.39631,42.12462],[-85.44227,42.09677],[-85.49464,42.07608],[-85.55141,42.06334],[-85.61042,42.05904],[-85.66944,42.06334],[-85.72621,42.07608],[-85.77857,42.09677],[-85.82453,42.12462],[-85.86232,42.15858],[-85.89049,42.19734],[-85.90794,42.23942],[-85.91398,42.28322],[-85.90835,42.32705],[-85.89125,42.36922],[-85.86332,42.40811],[-85.82561,42.44222],[-85.77957,42.47023],[-85.72697,42.49105],[-85.66985,42.50387],[-85.61042,42.5082]]]}},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]]]}},new_zealand_full:{type:"Feature",id:"new_zealand_full",properties:{},geometry:{type:"Polygon",coordinates:[[[170.55176,-33.54139],[173.62793,-32.28713],[181.3623,-36.80928],[181.4502,-43.10098],[181.95557,-47.45781],[180.59326,-53.31775],[171.5625,-56.70451],[162.72949,-53.33087],[160.7959,-46.70974],[170.55176,-33.54139]]]}},oceania_full:{type:"Feature",properties:{},id:"oceania_full",geometry:{type:"Polygon",coordinates:[[[94.92188,-18.47961],[119.35547,-13.23995],[128.4082,-10.27168],[135.08789,-8.84165],[140.67993,-9.57908],[141.0157,-9.13193],[140.99716,-2.58091],[144.31641,10.09867],[156.97266,16.88866],[177.97852,15.96133],[193.44727,-2.81137],[197.75391,-14.26438],[193.18359,-40.71396],[161.89453,-55.37911],[102.65625,-45.58329],[94.92188,-18.47961]]]}},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]]]}},rs_br:{id:"rs_br",type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-50.56791,-28.32331],[-49.64837,-28.40599],[-49.62152,-28.67722],[-49.82288,-28.81257],[-49.86986,-29.14725],[-49.40674,-29.43409],[-50.66187,-31.5221],[-51.51429,-32.07544],[-52.0244,-32.51232],[-52.32644,-33.22264],[-53.199,-34.04411],[-53.65541,-33.63156],[-53.50103,-32.61414],[-55.57503,-31.01726],[-56.0113,-31.18392],[-56.20595,-30.78112],[-56.93084,-30.18535],[-57.2463,-30.36505],[-57.57519,-30.33029],[-57.71614,-30.18535],[-57.40068,-29.91811],[-57.23959,-29.67347],[-56.02473,-28.4178],[-55.70255,-28.08671],[-54.40043,-27.2008],[-53.38022,-26.97372],[-51.97071,-27.23661],[-51.03103,-27.74271],[-50.56791,-28.32331]]]}},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]]]}},"Universidad-de-Antioquia":{type:"Feature",id:"Universidad-de-Antioquia",properties:{},geometry:{type:"Polygon",coordinates:[[[-75.58594,6.45251],[-75.54185,6.4482],[-75.49945,6.43541],[-75.46038,6.41465],[-75.42614,6.38671],[-75.39805,6.35267],[-75.37719,6.31384],[-75.36435,6.2717],[-75.36003,6.22789],[-75.36438,6.18407],[-75.37726,6.14195],[-75.39814,6.10313],[-75.42624,6.06911],[-75.46047,6.04119],[-75.49952,6.02044],[-75.54188,6.00767],[-75.58594,6.00336],[-75.62999,6.00767],[-75.67236,6.02044],[-75.7114,6.04119],[-75.74563,6.06911],[-75.77373,6.10313],[-75.79462,6.14195],[-75.80749,6.18407],[-75.81185,6.22789],[-75.80753,6.2717],[-75.79469,6.31384],[-75.77382,6.35267],[-75.74573,6.38671],[-75.71149,6.41465],[-75.67242,6.43541],[-75.63003,6.4482],[-75.58594,6.45251]]]}},"Universidad-de-La-Guajira":{type:"Feature",id:"Universidad-de-La-Guajira",properties:{},geometry:{type:"Polygon",coordinates:[[[-72.86133,11.74767],[-72.81658,11.74335],[-72.77355,11.73056],[-72.73391,11.70979],[-72.69917,11.68184],[-72.67067,11.64779],[-72.64951,11.60895],[-72.6365,11.56681],[-72.63213,11.523],[-72.63657,11.47919],[-72.64964,11.43707],[-72.67084,11.39826],[-72.69935,11.36424],[-72.73408,11.33633],[-72.77368,11.31559],[-72.81665,11.30282],[-72.86133,11.29851],[-72.90601,11.30282],[-72.94897,11.31559],[-72.98858,11.33633],[-73.0233,11.36424],[-73.05182,11.39826],[-73.07302,11.43707],[-73.08609,11.47919],[-73.09053,11.523],[-73.08616,11.56681],[-73.07314,11.60895],[-73.05198,11.64779],[-73.02349,11.68184],[-72.98875,11.70979],[-72.9491,11.73056],[-72.90608,11.74335],[-72.86133,11.74767]]]}},"Universidad-de-Los-Andes":{type:"Feature",id:"Universidad-de-Los-Andes",properties:{},geometry:{type:"Polygon",coordinates:[[[-74.0918,4.79005],[-74.04783,4.78574],[-74.00556,4.77295],[-73.9666,4.75219],[-73.93245,4.72426],[-73.90444,4.69022],[-73.88363,4.65139],[-73.87082,4.60925],[-73.8665,4.56544],[-73.87085,4.52163],[-73.88368,4.4795],[-73.9045,4.44068],[-73.93253,4.40665],[-73.96666,4.37873],[-74.00561,4.35798],[-74.04786,4.34521],[-74.0918,4.34089],[-74.13574,4.34521],[-74.17799,4.35798],[-74.21693,4.37873],[-74.25107,4.40665],[-74.27909,4.44068],[-74.29992,4.4795],[-74.31275,4.52163],[-74.31709,4.56544],[-74.31278,4.60925],[-74.29997,4.65139],[-74.27915,4.69022],[-74.25114,4.72426],[-74.217,4.75219],[-74.17804,4.77295],[-74.13576,4.78574],[-74.0918,4.79005]]]}},"Universidad-de-San-Buenaventura":{type:"Feature",id:"Universidad-de-San-Buenaventura",properties:{},geometry:{type:"Polygon",coordinates:[[[-75.58594,6.45251],[-75.54185,6.4482],[-75.49945,6.43541],[-75.46038,6.41465],[-75.42614,6.38671],[-75.39805,6.35267],[-75.37719,6.31384],[-75.36435,6.2717],[-75.36003,6.22789],[-75.36438,6.18407],[-75.37726,6.14195],[-75.39814,6.10313],[-75.42624,6.06911],[-75.46047,6.04119],[-75.49952,6.02044],[-75.54188,6.00767],[-75.58594,6.00336],[-75.62999,6.00767],[-75.67236,6.02044],[-75.7114,6.04119],[-75.74563,6.06911],[-75.77373,6.10313],[-75.79462,6.14195],[-75.80749,6.18407],[-75.81185,6.22789],[-75.80753,6.2717],[-75.79469,6.31384],[-75.77382,6.35267],[-75.74573,6.38671],[-75.71149,6.41465],[-75.67242,6.43541],[-75.63003,6.4482],[-75.58594,6.45251]]]}},"Universidad-Distrital-Francisco-Jose-de-Caldas":{type:"Feature",id:"Universidad-Distrital-Francisco-Jose-de-Caldas",properties:{},geometry:{type:"Polygon",coordinates:[[[-74.0918,4.87766],[-74.04782,4.87334],[-74.00554,4.86056],[-73.96658,4.8398],[-73.93243,4.81186],[-73.90442,4.77782],[-73.8836,4.73899],[-73.87079,4.69686],[-73.86648,4.65304],[-73.87082,4.60923],[-73.88365,4.56711],[-73.90448,4.52829],[-73.93251,4.49426],[-73.96665,4.46634],[-74.0056,4.44559],[-74.04785,4.43281],[-74.0918,4.4285],[-74.13574,4.43281],[-74.178,4.44559],[-74.21695,4.46634],[-74.25109,4.49426],[-74.27911,4.52829],[-74.29994,4.56711],[-74.31278,4.60923],[-74.31712,4.65304],[-74.3128,4.69686],[-74.29999,4.73899],[-74.27918,4.77782],[-74.25116,4.81186],[-74.21701,4.8398],[-74.17805,4.86056],[-74.13577,4.87334],[-74.0918,4.87766]]]}},"Universidad-Nacional-de-Colombia":{type:"Feature",id:"Universidad-Nacional-de-Colombia",properties:{},geometry:{type:"Polygon",coordinates:[[[-74.0918,4.87766],[-74.04782,4.87334],[-74.00554,4.86056],[-73.96658,4.8398],[-73.93243,4.81186],[-73.90442,4.77782],[-73.8836,4.73899],[-73.87079,4.69686],[-73.86648,4.65304],[-73.87082,4.60923],[-73.88365,4.56711],[-73.90448,4.52829],[-73.93251,4.49426],[-73.96665,4.46634],[-74.0056,4.44559],[-74.04785,4.43281],[-74.0918,4.4285],[-74.13574,4.43281],[-74.178,4.44559],[-74.21695,4.46634],[-74.25109,4.49426],[-74.27911,4.52829],[-74.29994,4.56711],[-74.31278,4.60923],[-74.31712,4.65304],[-74.3128,4.69686],[-74.29999,4.73899],[-74.27918,4.77782],[-74.25116,4.81186],[-74.21701,4.8398],[-74.17805,4.86056],[-74.13577,4.87334],[-74.0918,4.87766]]]}},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]]]}},uruguay:{type:"Feature",id:"uruguay",properties:{},geometry:{type:"Polygon",coordinates:[[[-58.37,-33.12],[-58.15,-33.07],[-58.09,-33],[-58.2,-32.48],[-58.18,-32.37],[-58.11,-32.33],[-58.1,-32.25],[-58.18,-32.16],[-58.15,-32],[-58.2,-31.86],[-58.07,-31.81],[-57.98,-31.58],[-58.04,-31.5],[-57.91,-31.23],[-57.88,-30.97],[-57.8,-30.9],[-57.89,-30.5],[-57.63,-30.34],[-57.6,-30.2],[-57.2,-30.3],[-57.1,-30.1],[-56.8,-30.1],[-56,-30.8],[-56,-31.1],[-55.6,-30.85],[-53.8,-32],[-53.5,-32.5],[-53.1,-32.7],[-53.5,-33.1],[-53.5,-33.7],[-53,-34],[-55,-36],[-58,-34.6],[-58.4,-34],[-58.5,-33.6],[-58.37,-33.12]]]}},latam:{type:"Feature",id:"latam",properties:{},geometry:{type:"Polygon",coordinates:[[[-123,14],[-117.45574,32.58935],[-117.23326,32.52453],[-116.43813,32.58992],[-115.96571,32.62752],[-115.48953,32.66395],[-114.71211,32.7179],[-114.7455,32.65614],[-114.79837,32.6067],[-114.81091,32.49615],[-111.06611,31.33282],[-109.5397,31.33311],[-108.86816,31.33165],[-108.2131,31.33135],[-108.21447,31.78655],[-106.52962,31.78363],[-106.51966,31.77225],[-106.50867,31.76116],[-106.4867,31.74715],[-106.4716,31.75123],[-106.46851,31.75912],[-106.45409,31.76554],[-106.43898,31.75678],[-106.41426,31.75007],[-106.37959,31.7305],[-106.37409,31.71269],[-106.35075,31.69575],[-106.33289,31.65835],[-106.30543,31.6224],[-106.28002,31.56186],[-106.24741,31.54314],[-106.21101,31.47347],[-106.17805,31.45766],[-106.14956,31.43335],[-106.00502,31.38881],[-105.76607,31.16816],[-105.38292,30.84683],[-104.9121,30.63644],[-104.67293,29.91804],[-104.39415,29.56151],[-103.20921,28.98742],[-102.4182,29.81056],[-101.4514,29.77242],[-100.96779,29.34866],[-100.9005,29.31454],[-100.69725,29.14257],[-100.62309,28.91322],[-100.51598,28.749],[-100.51186,28.70474],[-100.50293,28.66227],[-100.40337,28.58271],[-100.01472,28.06956],[-99.53957,27.59837],[-99.53339,27.57859],[-99.51279,27.5655],[-99.52103,27.55607],[-99.52824,27.49731],[-99.5018,27.50066],[-99.48601,27.49426],[-99.47777,27.48299],[-99.48498,27.4635],[-99.49596,27.44857],[-99.48669,27.39067],[-99.53476,27.31321],[-99.44344,27.25951],[-99.45717,27.03222],[-99.07127,26.42692],[-98.9978,26.39248],[-98.46771,26.21028],[-98.25966,26.09194],[-98.08388,26.05061],[-97.95067,26.06172],[-97.79205,26.05185],[-97.57919,25.95002],[-97.51328,25.89073],[-97.46315,25.87899],[-97.41783,25.83821],[-97.34367,25.92594],[-97,26],[-81,24],[-73.5,20.5],[-64,20],[-29,0],[-29,-20],[-63,-51],[-62,-57],[-72,-57],[-113,-30],[-123,14]]]}}};
24697
24698         var resources = {"bw-facebook":{id:"bw-facebook",type:"facebook",featureId:"botswana",countryCodes:["bw"],languageCodes:["en","tn"],name:"Mapping Botswana on Facebook",description:"Page of OpenStreetMap in Botswana",url:"https://www.facebook.com/MappingBotswana/",contacts:[{name:"info@openstreetmap.org.bw",email:"info@openstreetmap.org.bw"}]},"bw-twitter":{id:"bw-twitter",type:"twitter",featureId:"botswana",countryCodes:["bw"],languageCodes:["en","tn"],name:"Mapping Botswana on Twitter",description:"Twitter of OpenStreetMap in Botswana",url:"https://twitter.com/mappingbotswana",contacts:[{name:"info@openstreetmap.org.bw",email:"info@openstreetmap.org.bw"}]},"ym-Centre-Universitaire-de-Recherche-et-dApplication-en-Tldtection-CURAT-de-lUniversit-Felix-Houphouet-Boigny":{type:"youthmappers",name:"YouthMappers CURAT",description:"YouthMappers chapter at Centre Universitaire de Recherche et d'Application en Télédétection (CURAT) de l'Université Felix Houphouet Boigny",id:"ym-Centre-Universitaire-de-Recherche-et-dApplication-en-Tldtection-CURAT-de-lUniversit-Felix-Houphouet-Boigny",featureId:"Centre-Universitaire-de-Recherche-et-dApplication-en-Tldtection-CURAT-de-lUniversit-Felix-Houphouet-Boigny",contacts:[{name:"Organizer",email:"gpcome@gmail.com"}],extendedDescription:"Our chapter aim is to promote the use of collaborative free mapping and the use of openstreetmap data in the field of research and their application in the implementation of tools for decision-making. Help students produce their own data of their research.",countryCodes:["ci"],url:"mailto:gpcome@gmail.com"},"ym-The-Gambia-YMCA-University-of-the-Gambia":{type:"youthmappers",name:"Connected YouthMappers",description:"YouthMappers chapter at The Gambia YMCA / University of the Gambia",id:"ym-The-Gambia-YMCA-University-of-the-Gambia",featureId:"The-Gambia-YMCA-University-of-the-Gambia",contacts:[{name:"Organizer",email:"connectedyouthmappers@gmail.com"}],extendedDescription:"Connected YouthMappers is comprised of dedicated young Gambians who aspire to change and aid national development.",countryCodes:["gm"],url:"mailto:connectedyouthmappers@gmail.com"},"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"}]},"ym-Kwame-Nkrumah-University-of-Science-and-Technology":{type:"youthmappers",name:"Kwame Nkrumah University of Science and Technology YouthMappers",description:"YouthMappers chapter at Kwame Nkrumah University of Science and Technology",id:"ym-Kwame-Nkrumah-University-of-Science-and-Technology",featureId:"Kwame-Nkrumah-University-of-Science-and-Technology",contacts:[{name:"Organizer",email:"knustyouthmappers@outlook.com"}],countryCodes:["gh"],url:"https://www.facebook.com/KNUSTMappers/"},"ym-University-of-Cape-Coast":{type:"youthmappers",name:"UCC Geographical Society",description:"YouthMappers chapter at University of Cape Coast",id:"ym-University-of-Cape-Coast",featureId:"University-of-Cape-Coast",contacts:[{name:"Organizer",email:"geosoc_ucc@yahoo.com"}],extendedDescription:"We are a society that encompasses all students who are reading and read geography in the Department of Geography and Regional Planning at the University of Cape Coast. Our main aim is to promote interest in the discipline inside and outside of the classroom. Our motto is “We comprehend the Earth and its inhabitants.”",countryCodes:["gh"],url:"https://www.facebook.com/Geographical-Society-Ucc-105157196204838/info/?tab=page_info"},"ym-University-of-Energy-and-Natural-Resources":{type:"youthmappers",name:"Eco-Club",description:"YouthMappers chapter at University of Energy and Natural Resources",id:"ym-University-of-Energy-and-Natural-Resources",featureId:"University-of-Energy-and-Natural-Resources",contacts:[{name:"Organizer",email:"james.agyei-ohemeng@uenr.edu.gh"}],extendedDescription:"To provide a sound education to all citizens about the deteriorating environment and provide utmost use of recreation of the environment for human survival.",countryCodes:["gh"],url:"mailto:james.agyei-ohemeng@uenr.edu.gh"},"ym-University-of-Ghana":{type:"youthmappers",name:"University of Ghana YouthMappers",description:"YouthMappers chapter at University of Ghana",id:"ym-University-of-Ghana",featureId:"University-of-Ghana",contacts:[{name:"Organizer",email:"mawulikaf@gmail.com"}],extendedDescription:"UG YouthMappers consists of both graduate and undergraduate students possessing knowledge and skills in GIS and Remote Sensing. The club is composed of an energetic team that is poised to address social issues and mitigate environmental problems through mapping. Our fundamental principles are capacity building, empowerment and teamwork.",countryCodes:["gh"],url:"https://twitter.com/UGYouthMappers"},"ym-University-of-Mines-and-Technology":{type:"youthmappers",name:"UMaT YouthMappers",description:"YouthMappers chapter at University of Mines and Technology",id:"ym-University-of-Mines-and-Technology",featureId:"University-of-Mines-and-Technology",contacts:[{name:"Organizer",email:"kwadzo459@gmail.com"}],extendedDescription:"UMaT YouthMappers is a group of volunteer students who seek to grant students the opportunity to improve skills in the field of mapping & creating open geographic data and analyses that address locally defined development challenges worldwide.",countryCodes:["gh"],url:"http://umatyouthmappers.wordpress.com/"},"ym-General-Lansana-Conte-University":{type:"youthmappers",name:"YouthMappers General Lansana Conte University",description:"YouthMappers chapter at General Lansana Conte University",id:"ym-General-Lansana-Conte-University",featureId:"General-Lansana-Conte-University",contacts:[{name:"Organizer",email:"condefa3@gmail.com"}],extendedDescription:"The YouthMappers of the University General Lansana Conté is a non profit community willing to contribute to Map Guinea and others part of the world. We are promoting the use of GIS and Open data to build decision support tools. We also work to build capacities among the students and local communities.",countryCodes:["gn"],url:"www.uglc.org"},"ym-Institute-of-Science-and-Veterinary-Medicine":{type:"youthmappers",name:"YouthMappers ISSMV Dalaba",description:"YouthMappers chapter at Institute of Science and Veterinary Medicine",id:"ym-Institute-of-Science-and-Veterinary-Medicine",featureId:"Institute-of-Science-and-Veterinary-Medicine",contacts:[{name:"Organizer",email:"bvloua45@gmail.com"}],extendedDescription:"YouthMappers ISSMV Dabala is a non profit organisation working to promote humanitarian mapping and the use of open sources and open data to build decision making tools in Guinea.",countryCodes:["gn"],url:"mailto:bvloua45@gmail.com"},"ym-Universit-de-NZrkor":{type:"youthmappers",name:"Youthmappers à N'Zérékoré",description:"YouthMappers chapter at Université de N'Zérékoré",id:"ym-Universit-de-NZrkor",featureId:"Universit-de-NZrkor",contacts:[{name:"Organizer",email:"donpaul1974@gmail.com"}],extendedDescription:"YouthMappers est un groupe qui permet de faire la cartographie des communautés enclavées et à la prise des décisions en cas de catastrophes ou épidémies. Elle permet aussi la production et l'utilisation des données en accès gratuit.",countryCodes:["gn"],url:"mailto:donpaul1974@gmail.com"},"ym-Dedan-Kimathi-University-of-Technology":{type:"youthmappers",name:"GDEV",description:"YouthMappers chapter at Dedan Kimathi University of Technology",id:"ym-Dedan-Kimathi-University-of-Technology",featureId:"Dedan-Kimathi-University-of-Technology",contacts:[{name:"Organizer",email:"gdevkenya@gmail.com"}],extendedDescription:"GDEV is a group of enthusiastic GIS group at DeKUT that aims at helping students share, engage and learn from each other in matters geospatial",countryCodes:["ke"],url:"https://plus.google.com/u/0/communities/102367719061492681269/stream/e376a295-1246-4e19-9f66-fa6077719f32"},"ym-Jomo-Kenyatta-University-of-Agriculture-and-Technology":{type:"youthmappers",name:"Association of Geomatics Engineering Students",description:"YouthMappers chapter at Jomo Kenyatta University of Agriculture and Technology",id:"ym-Jomo-Kenyatta-University-of-Agriculture-and-Technology",featureId:"Jomo-Kenyatta-University-of-Agriculture-and-Technology",contacts:[{name:"Organizer",email:"laurahmugeha36@gmail.com"}],extendedDescription:"The Association of Geomatics Engineering Students (AGES), aims at promoting GIS products and services as well as training students on the use of the same. It not only promotes socialization between the students and practicing professionals, but also provides a platform for exchanging new ideas for holding new GIS and surveying events and training at the university.",countryCodes:["ke"],url:"mailto:laurahmugeha36@gmail.com"},"ym-Karatina-University":{type:"youthmappers",name:"Nature Club Karatina University",description:"YouthMappers chapter at Karatina University",id:"ym-Karatina-University",featureId:"Karatina-University",contacts:[{name:"Organizer",email:"karunatureclub@gmail.com"}],extendedDescription:"This chapter aims to bring together all GIS enthusiasts.They include environment experts, wildlife experts, aquatic and tourism officers, just to mention a few. Its main aim is to provide a platform where students can learn from each other and, in the process, understand how to integrate the GIS skills in their various career paths as well as provide solutions to various environmental related challenges.",countryCodes:["ke"],url:"https://twitter.com/karunature"},"ym-Kenyatta-University":{type:"youthmappers",name:"Kenyatta University GIS Club",description:"YouthMappers chapter at Kenyatta University",id:"ym-Kenyatta-University",featureId:"Kenyatta-University",contacts:[{name:"Organizer",email:"jamesmagige24@gmail.com"}],extendedDescription:"Kenyatta University GIS Club (KUGISC) was founded on 28th October 2016, with more than 200 students and staff from all faculty within campus as members. We are committed to empower members with spatial knowledge, skills and expertise required in understanding the Earth. We help in mapping resources within the university by incorporating geospatial data in their projects as well as fieldwork data collection.",countryCodes:["ke"],url:"mailto:jamesmagige24@gmail.com"},"ym-Moi-University":{type:"youthmappers",name:"Geography Students Association",description:"YouthMappers chapter at Moi University",id:"ym-Moi-University",featureId:"Moi-University",contacts:[{name:"Organizer",email:"geosamu44@gmail.com"}],extendedDescription:"The Geography Students Association at Moi University (GEOSAMU) explores, discovers and aims at developing the entire world through the young Geo-Spatial analysts.  GEOSAMU is part of the Department of Geography.",countryCodes:["ke"],url:"mailto:geosamu44@gmail.com?subject=YouthMappers%20at%20Moi%20University"},"ym-Technical-University-of-Kenya":{type:"youthmappers",name:"Geospatial Science Student Association",description:"YouthMappers chapter at Technical University of Kenya",id:"ym-Technical-University-of-Kenya",featureId:"Technical-University-of-Kenya",contacts:[{name:"Organizer",email:"youthmappers.tuk@gmail.com"}],extendedDescription:"It's a geographical information based group with very passionate students in the relevant fields of study. We do training to members on emerging trends in the market and keep up with technological advancements",countryCodes:["ke"],url:"mailto:youthmappers.tuk@gmail.com"},"ym-University-of-Nairobi":{type:"youthmappers",name:"Geospatial Engineering Students Association",description:"YouthMappers chapter at University of Nairobi",id:"ym-University-of-Nairobi",featureId:"University-of-Nairobi",contacts:[{name:"Organizer",email:"contact@mapkibera.org"}],extendedDescription:"UN students are working with the local OSM community, Map Kibera, and GrouthTruth to learn about open mapping and contribute data for needs in their urban communities.",countryCodes:["ke"],url:"www.geospatial.uonbi.ac.ke"},"ym-African-Methodist-Episcopal-University":{type:"youthmappers",name:"YouthMappers-AMEU",description:"YouthMappers chapter at African Methodist Episcopal University",id:"ym-African-Methodist-Episcopal-University",featureId:"African-Methodist-Episcopal-University",contacts:[{name:"Organizer",email:"youthmapper.ameu@gmail.com"}],countryCodes:["lr"],url:"mailto:youthmapper.ameu@gmail.com"},"ym-Cuttington-University":{type:"youthmappers",name:"Cuttington University YouthMappers",description:"YouthMappers chapter at Cuttington University",id:"ym-Cuttington-University",featureId:"Cuttington-University",contacts:[{name:"Organizer",email:"youthmappers.cu@gmail.com"}],extendedDescription:"The YouthMappers at Cuttington University, Suakoko, and Bong County comprised of Students from three different departments; namely, the Department of Natural Resources Management “DONRM”, Department of Environmental Sciences, and the Department of Natural Sciences. Since the establishment of the Chapter in February 2017, the overall membership is  20 students, with each department containing 5 students.",countryCodes:["lr"],url:"mailto:youthmappers.cu@gmail.com"},"ym-Grand-Gedeh-County-Community-College":{type:"youthmappers",name:"YouthMappers at Grand Gedeh County Community College",description:"YouthMappers chapter at Grand Gedeh County Community College",id:"ym-Grand-Gedeh-County-Community-College",featureId:"Grand-Gedeh-County-Community-College",contacts:[{name:"Organizer",email:"yimodaxzibitallison@gmail.com"}],extendedDescription:"The Youth Mappers of GGCCC sole intent is to put  places in and around Liberia  that are not on the map. We gather youths from the college within the Grand Gedeh Community College to make it their duties to unite and bring these places to the spot light geographically.",countryCodes:["lr"],url:"mailto:yimodaxzibitallison@gmail.com"},"ym-Nimba-County-Community-College":{type:"youthmappers",name:"Nimba County Community College Youth Mappers",description:"YouthMappers chapter at Nimba County Community College",id:"ym-Nimba-County-Community-College",featureId:"Nimba-County-Community-College",contacts:[{name:"Organizer",email:"ncccyouthmappers@yahoo.com"}],countryCodes:["lr"],url:"mailto:ncccyouthmappers@yahoo.com"},"ym-Stella-Maris-Polytechnic":{type:"youthmappers",name:"YouthMappers-SMP",description:"YouthMappers chapter at Stella Maris Polytechnic",id:"ym-Stella-Maris-Polytechnic",featureId:"Stella-Maris-Polytechnic",contacts:[{name:"Organizer",email:"youthmappers.smp@gmail.com"}],countryCodes:["lr"],url:"mailto:youthmappers.smp@gmail.com"},"ym-University-of-Liberia-YouthMappers":{type:"youthmappers",name:"University of Liberia YouthMappers",description:"YouthMappers chapter at University of Liberia YouthMappers",id:"ym-University-of-Liberia-YouthMappers",featureId:"University-of-Liberia-YouthMappers",contacts:[{name:"Organizer",email:"ulym2017@gmail.com"}],extendedDescription:"The University of Liberia YouthMappers is a chapter organization of the Global YouthMappers. We are a nonprofit student mapping organization focus on mapping for Liberia’s development and the World at large. The purpose of this organization shall be to utilize technology and geospatial knowledge as means of creating and developing maps; collecting and analyzing data that will address local and worldwide challenges. Our aim is to support and create opportunity for students to develop interest and skills in the fields of mapping. We envision a united student community that are collaborative, active and are willing to work with the University of Liberia YouthMappers in order to better the lives of others.",countryCodes:["lr"],url:"mailto:ulym2017@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"}]},"ym-University-of-Malawi":{type:"youthmappers",name:"Chanco Malawi YouthMappers",description:"YouthMappers chapter at University of Malawi",id:"ym-University-of-Malawi",featureId:"University-of-Malawi",contacts:[{name:"Organizer",email:"zolamanyungwa@gmail.com"}],extendedDescription:"Chanco Malawi YouthMappers is the student mapping organization for the University of Malawi's Chancellor College. The students in this chapter focus on mapping for Malawi's development and science needs.",countryCodes:["mw"],url:"mailto:zolamanyungwa@gmail.com"},"ym-Universit-des-Sciences-Sociale-et-de-Gestion-de-Bamako":{type:"youthmappers",name:"Etudiant au Laboratoire HoPE",description:"YouthMappers chapter at Université des Sciences Sociale et de Gestion de Bamako",id:"ym-Universit-des-Sciences-Sociale-et-de-Gestion-de-Bamako",featureId:"Universit-des-Sciences-Sociale-et-de-Gestion-de-Bamako",contacts:[{name:"Organizer",email:"youthmappersfhg@gmail.com"}],countryCodes:["ml"],url:"mailto:youthmappersfhg@gmail.com"},"ym-Universidade-Eduardo-Mondlane":{type:"youthmappers",name:"Comunidade YouthMappers Moçambique",description:"YouthMappers chapter at Universidade Eduardo Mondlane",id:"ym-Universidade-Eduardo-Mondlane",featureId:"Universidade-Eduardo-Mondlane",contacts:[{name:"Organizer",email:"moz.youthmappers1@hotmail.com"}],extendedDescription:"We are a student group that intends to join Mozambican society to create a resilient community of humanitarian mapping. The community intend to map the physical occupation of our Country and create open geographic data, accessible to the public and able to be used in several areas without associated costs.",countryCodes:["mz"],url:"www.facebook.com/Moz-YouthMappers"},"ym-Namibia-University-of-Science-and-Technology":{type:"youthmappers",name:"Geoinformation Technology Student Society",description:"YouthMappers chapter at Namibia University of Science and Technology",id:"ym-Namibia-University-of-Science-and-Technology",featureId:"Namibia-University-of-Science-and-Technology",contacts:[{name:"Organizer",email:"patriciasem87@gmail.com"}],countryCodes:["na"],url:"mailto:patriciasem87@gmail.com"},"ym-Abia-State-University":{type:"youthmappers",name:"AbsuMappersTeam",description:"YouthMappers chapter at Abia State University",id:"ym-Abia-State-University",featureId:"Abia-State-University",contacts:[{name:"Organizer",email:"absumappersteam@gmail.com"}],extendedDescription:"AbsuMappersTeam is  voluntary team of map enthusiast ,using openstreetmap,GIS and other open source geospatial techno;ogy to solve problems.It is a dedicated for disaster response using OpenStreetMap.It is a  professional mentoring  and empowerment platform for  those with passion for GIS and Mapping.It is a community of  volunteers for geospatial data creation,field data collection and mapping.The team was co-founded by Victor N.Sunday(the Team mentor) and Professor J.U.Ogbonna ,the team coordinator and faculty Advisor. AbsuMapperTeam is an affiliate of UniiqueMappersTeam-Port Harcourt.The team stands to support sustainable development using geospatial  technology",countryCodes:["ng"],url:"https://www.facebook.com/Absumappersteam-1709186109157466"},"ym-Ahmadu-Bello-University":{type:"youthmappers",name:"ABU Geomappers",description:"YouthMappers chapter at Ahmadu Bello University",id:"ym-Ahmadu-Bello-University",featureId:"Ahmadu-Bello-University",contacts:[{name:"Organizer",email:"abugeomappers@gmail.com"}],extendedDescription:"We are a group of Data driven Humanitarian mappers, who are dedicated to rendering humanitarian service in response to disaster and mitigation. We are glad to contribute our expertise and knowledge through mapping, and helping to spread #OpenEvangelism through Training, and collaboration.",countryCodes:["ng"],url:"https://web.facebook.com/abugeomappers/"},"ym-Federal-School-of-Surveys":{type:"youthmappers",name:"OyoMappersTeam (OMT) Oyo",description:"YouthMappers chapter at Federal School of Surveys",id:"ym-Federal-School-of-Surveys",featureId:"Federal-School-of-Surveys",contacts:[{name:"Organizer",email:"oyomappersteam@gmail.com"}],countryCodes:["ng"],url:"https://web.facebook.com/Oyomappersteam-omt-oyo-1432864713415765/"},"ym-Federal-University-of-Technology-Akure":{type:"youthmappers",name:"YouthMappers Futa Space Club",description:"YouthMappers chapter at Federal University of Technology, Akure",id:"ym-Federal-University-of-Technology-Akure",featureId:"Federal-University-of-Technology-Akure",contacts:[{name:"Organizer",email:"denironyx@gmail.com"}],extendedDescription:"Our mission is to raise the next generation of Space Leaders. Activities include research and capacity building in Remote Sensing, GIS, Climate Change, Astronomy, Cosmology, Space Engineering, Global Navigation, Robotics and Space Education.",countryCodes:["ng"],url:"http://spaceclubfuta.com.ng/"},"ym-Ignatius-Ajuru-University-of-Education":{type:"youthmappers",name:"IgnatiusMappersTeam (IMT)",description:"YouthMappers chapter at Ignatius Ajuru University of Education",id:"ym-Ignatius-Ajuru-University-of-Education",featureId:"Ignatius-Ajuru-University-of-Education",contacts:[{name:"Organizer",email:"ignatiusmappersteam@gmail.com"}],extendedDescription:"We are a YouthMappers Chapter of Ignatius Ajuru University of Education involved in crowdsourced mapping of our environment and remote mapping of resilient communities.We are a team of volunteers using openstreetmap and other open Geospatial source for mapping.",countryCodes:["ng"],url:"https://fb.me/ignatiusmappersteam"},"ym-University-of-Nigeria-Nsukka":{type:"youthmappers",name:"LionMappersTeam (LMT) Nsukka",description:"YouthMappers chapter at University of Nigeria, Nsukka",id:"ym-University-of-Nigeria-Nsukka",featureId:"University-of-Nigeria-Nsukka",contacts:[{name:"Organizer",email:"lionmappersteam@gmail.com"}],extendedDescription:"The LionMappersTeam is an affiliate of YouthMappers Network, with the sole aim of providing members the opportunity to learn and improve their skills in the field of mapping science and to create open geographic data and analysis that addresses locally defined challenges globally. It is a team of volunteers for crowdsourced mapping and geographic information provision using Openstreetmap, citizen science  and other geospatial  technology for research, training and response to resilient community challenges. We are involved in GIS and Remote Sensing Applications and Research.Paticipatory GIS and Citizen Science,field mapping ,training workshops and outreaches to High Schools.",countryCodes:["ng"],url:"http://fb.me/LionMappersTeamNsukka;and send messages to our Page at m.me/LionMappersTeamNsukka"},"ym-University-of-Port-Harcourt":{type:"youthmappers",name:"UniqueMappersTeam (UMT) Port Harcourt",description:"YouthMappers chapter at University of Port Harcourt",id:"ym-University-of-Port-Harcourt",featureId:"University-of-Port-Harcourt",contacts:[{name:"Organizer",email:"victor.sunday@uniport.edu.ng"}],extendedDescription:"UniqueMappersTeam(UMT)Port Harcourt  is an action group and a team of volunteers for a collaborative online mapping targeted at training and empowering members with trending mapping skills  to create open geospatial data and analysis that addresses locally defined challenges for geoinformation and to provide humanitarian mapping  services to resilient communities in Niger Delta,Nigeria and elsewhere.We promote Crowdsoucred Mapping and Geographic information volunteering using OpenStreetMap(OSM) platform and other accessible platforms for Rapid Response Mapping,Disaster Mapping,Geo-intelligence Mapping,Map updates and training.Its an affiliate Campus chapter of Humanitarian OpenStreetMap Team(HOT).It is a project-task team of YouthMappers that provide opportunity for members to learn and improve their skills in Geoinformatics so as to explore global opportunities in the field of Mapping and Geoinformation.",countryCodes:["ng"],url:"https://web.facebook.com/uniquemappersteamportharcourt/"},"ym-University-of-Nigeria-Enugu-Campus":{type:"youthmappers",name:"LionMappersTeam (LMT) Enugu",description:"YouthMappers chapter at University of Nigeria, Enugu Campus",id:"ym-University-of-Nigeria-Enugu-Campus",featureId:"University-of-Nigeria-Enugu-Campus",contacts:[{name:"Organizer",email:"lmtenugucampus@gmail.com"}],extendedDescription:"The LionMappersTeam(LMT)Enugu Campus is an affiliate of YouthMappers Network, with the sole aim of providing members the opportunity to learn and improve their skills in the field of Geoinformatics and to create open geographic data and analysis that addresses locally defined challenges globally. It is a team of volunteers for Crowdsourced Mapping and Geographic Information provision using Openstreetmap, Citizen Science and other Geospatial Technology for research, training and response to resilient community challenges. We are involved in Web-Cartography, GIS and Remote Sensing Applications and ResearchWe are passionate about Volunteered Geographic Information.Paticipatory GIS and Citizen Science.Our major activities include online crowdsourced-Cartography, Field Mapping ,Training workshops and outreaches to High School as well as Humanitarian/Disaster Response Mapping.",countryCodes:["ng"],url:"https://web.facebook.com/Lionmappersteam-enugu-Campus-361221567667528/"},"ym-Insititue-d-Enseignement-Superieur-de-Ruhengeri":{type:"youthmappers",name:"YouthMappers at INES Ruhengeri",description:"YouthMappers chapter at Insititue d' Enseignement Superieur de Ruhengeri",id:"ym-Insititue-d-Enseignement-Superieur-de-Ruhengeri",featureId:"Insititue-d-Enseignement-Superieur-de-Ruhengeri",contacts:[{name:"Organizer",email:"dufitesaie91@yahoo.com"}],extendedDescription:"We are students from Land Administration and Management and Land survey Departments from INES-Ruhengeri. We are engaged in mapping activities that create the changes toward sustainable development in our community.",countryCodes:["rw"],url:"www.ines.ac.rw"},"ym-University-of-Rwanda-Huye-Campus":{type:"youthmappers",name:"Rwanda YouthMappers",description:"YouthMappers chapter at University of Rwanda - Huye Campus",id:"ym-University-of-Rwanda-Huye-Campus",featureId:"University-of-Rwanda-Huye-Campus",contacts:[{name:"Organizer",email:"erneruz@gmail.com"}],extendedDescription:"Based on the commitment and the purpose of promoting mapping, and the information from YouthMappers public talks, we have organized as students in Geography department who are committed in mapping to found a chapter of our Campus. We have supported by our Facilitator Dr. Gaspard Rwanyiziri (Director of CGIS-Rwanda) and various lecturer mentors.",countryCodes:["rw"],url:"https://www.facebook.com/Rwanda-YouthMappers"},"ym-Institut-Suprieur-de-Management-Kolda":{type:"youthmappers",name:"Les Femmes Leaders de ISM/Kolda",description:"YouthMappers chapter at Institut Supérieur de Management Kolda",id:"ym-Institut-Suprieur-de-Management-Kolda",featureId:"Institut-Suprieur-de-Management-Kolda",contacts:[{name:"Organizer",email:"koldaym@gmail.com"}],extendedDescription:"Les Femmes Leaders de ISM/Kolda is an all-female mapping group in southern Senegal looking to put Kolda and surrounding villages on the map and better understand how to use OSM.",countryCodes:["sn"],url:"mailto:koldaym@gmail.com"},"ym-Universit-Gaston-Berger":{type:"youthmappers",name:"YouthMappers at UGB",description:"YouthMappers chapter at Université Gaston Berger",id:"ym-Universit-Gaston-Berger",featureId:"Universit-Gaston-Berger",contacts:[{name:"Organizer",email:"youthmappers.ugb@gmail.com"}],extendedDescription:"YouthMappers UGB is made up of young students and researchers who are passionate about mapping. Our aim is to improve students' skills in the field of cartography and to participate in the creation of open geographic data that responds to development challenges around the world and particularly in Africa.",countryCodes:["sn"],url:"https://web.facebook.com/youthmappersugb/"},"ym-Fourah-Bay-College":{type:"youthmappers",name:"Student's Geographical Association",description:"YouthMappers chapter at Fourah Bay College",id:"ym-Fourah-Bay-College",featureId:"Fourah-Bay-College",contacts:[{name:"Organizer",email:"sgayouthmappers@gmail.com"}],extendedDescription:"The Student's Geographical Association- YouthMappers is an association of Fourah Bay College Students with the common goals of mapping out vulnerable places in Sierra Leone and the world at large for relief and other beneficial purposes,carry out Research and other educative endeavors. The chapter consists of young people with great ideas, development oriented with the capacity to relate with each other, comprehend and implement sustainable developmental projects as a team.",countryCodes:["sl"],url:"mailto:sgayouthmappers@gmail.com?subject=YouthMappers%20at%20Fourah%20Bay%20College"},"ym-Njala-University-Freetown-Campus":{type:"youthmappers",name:"Njala Freetown YouthMappers",description:"YouthMappers chapter at Njala University, Freetown Campus",id:"ym-Njala-University-Freetown-Campus",featureId:"Njala-University-Freetown-Campus",contacts:[{name:"Organizer",email:"njalafreetownmappers@gmail.com"}],extendedDescription:"We are students of Njala University Freetown Campus, studying Information Technology under the department of Physics and Computer Science. and we are located at Henry Street Freetown, Sierra Leone.",countryCodes:["sl"],url:"mailto:Njalafreetownmappers@gmail.com"},"ym-Njala-University-Njala-Campus":{type:"youthmappers",name:"YouthMappers Njala University, Njala Campus",description:"YouthMappers chapter at Njala University, Njala Campus",id:"ym-Njala-University-Njala-Campus",featureId:"Njala-University-Njala-Campus",contacts:[{name:"Organizer",email:"youthmappersnu2017@gmail.com"}],countryCodes:["sl"],url:"mailto:youthmappersnu2017@gmail.com"},"ym-University-of-Pretoria":{type:"youthmappers",name:"Centre for Geoinformation Science",description:"YouthMappers chapter at University of Pretoria",id:"ym-University-of-Pretoria",featureId:"University-of-Pretoria",contacts:[{name:"Organizer",email:"cgis-info@kendy.up.ac.za"}],extendedDescription:"The students who map Pretoria are supported by the University of Pretoria's Centre for Geoinformation Science, a platform from where the excellence of UP individuals and teams involved in geographic information science (GISc) research, education and training, professional development and community engagement is encouraged and strengthened through collaborations, education and training and  alliances within South Africa and abroad.",countryCodes:["za"],url:"http://www.up.ac.za/cgis"},"ym-Ardhi-University":{type:"youthmappers",name:"ARU Mapper",description:"YouthMappers chapter at Ardhi University",id:"ym-Ardhi-University",featureId:"Ardhi-University",contacts:[{name:"Organizer",email:"bayonakennedy@gmail.com"}],extendedDescription:"As upcoming geospatial data consultants we seek to educate and provide advice to the society on how they can use spatial data not only as a form of location but a tool of decision making and predict different hazardous and climatical changes which may harm them or future genarations.",countryCodes:["tz"],url:"mailto:bayonakennedy@gmail.com"},"ym-Institute-of-Finance-Management":{type:"youthmappers",name:"IFM mappers",description:"YouthMappers chapter at Institute of Finance Management",id:"ym-Institute-of-Finance-Management",featureId:"Institute-of-Finance-Management",contacts:[{name:"Organizer",email:"supermalik95@gmail.com"}],extendedDescription:"This is a new  chapter at out institute and we are looking forward to use our financial education that we are receiving here at the campus  and link ig with the environment in order to develop our sustainable environment towards helping the community  with the effects of our environment in a financial ways by converting them into numbers. this is widely explained in ecosystem accounting and environmental accounts",countryCodes:["tz"],url:"mailto:supermalik95@gmail.com"},"ym-Institute-of-Rural-Development-Planning-Mwanza":{type:"youthmappers",name:"Youth Mappers Chapter at Institute of Rural Development Planning - Lake Zone Centre",description:"YouthMappers chapter at Institute of Rural Development Planning Mwanza",id:"ym-Institute-of-Rural-Development-Planning-Mwanza",featureId:"Institute-of-Rural-Development-Planning-Mwanza",contacts:[{name:"Organizer",email:"shabanimagawila@gmail.com"}],countryCodes:["tz"],url:"www.facebook.com/IYMLZC/"},"ym-Institute-of-Rural-Development-Planning":{type:"youthmappers",name:"Mipango YouthMappers Chapter",description:"YouthMappers chapter at Institute of Rural Development Planning",id:"ym-Institute-of-Rural-Development-Planning",featureId:"Institute-of-Rural-Development-Planning",contacts:[{name:"Organizer",email:"msmapperschapter@gmail.com"}],extendedDescription:"Mipango YouthMappers Chapter was introduced at IRDP on 3rd July, 2017 by Dr.Domitilla Bashemera. The founding members were  300 (190 males and 110 female) Bachelor Degree students, who were registered as members of the Chapter. Gerald Zacharia is the president of the chapter and Juster Lugira is Vice President.",countryCodes:["tz"],url:"mailto:msmapperschapter@gmail.com"},"ym-Open-University-of-Tanzania":{type:"youthmappers",name:"Youth Mappers at Open University of Tanzania",description:"YouthMappers chapter at Open University of Tanzania",id:"ym-Open-University-of-Tanzania",featureId:"Open-University-of-Tanzania",contacts:[{name:"Organizer",email:"youthmapout@gmail.com"}],extendedDescription:"Youth Mappers at Open University of Tanzania\n\nHad been founded by members and students of Open University of Tanzania in Department of Geography who are mainly need to improve their career and help young community through joint and partnership projects with local community groups such as Mikoko Scout Group (www.msg.or.tz) and start cooperation with international colleges and universities for exchange programs in relation to Geography Studies as some programs prepared by Mikoko Scout Group which will link local university and other universities of the same interest through International Nature & Environmental Youth Camp 2019 (www.campsite.msg.or.tz/nature.html )\n\nOur chapter will soon be recognized as youth network program that will open opportunity for students to study and conduct research studies at a local levels.",countryCodes:["tz"],url:"mailto:youthmapout@gmail.com"},"ym-Sokoine-University-of-Agriculture":{type:"youthmappers",name:"SMCoSE YouthMappers",description:"YouthMappers chapter at Sokoine University of Agriculture",id:"ym-Sokoine-University-of-Agriculture",featureId:"Sokoine-University-of-Agriculture",contacts:[{name:"Organizer",email:"smcoseyouthmappers@gmail.com"}],extendedDescription:"A Chapter comprising of Environmental sciences and management students and Geography studies under the dept. of Geography and  we will be using mapping techniques, based on systems concepts and theories, can be used to facilitate, explore, and capture the different understandings of the relationships, perspectives, and boundaries involved in environmental sustainability to obtain a more complete comprehension of the concept and develop plans for action.",countryCodes:["tz"],url:"mailto:SMCoSEyouthmappers@gmail.com"},"ym-University-of-Dar-es-Salaam":{type:"youthmappers",name:"YouthMappers at University of Dar es Salaam",description:"YouthMappers chapter at University of Dar es Salaam",id:"ym-University-of-Dar-es-Salaam",featureId:"University-of-Dar-es-Salaam",contacts:[{name:"Organizer",email:"godluckur@gmail.com"}],extendedDescription:"The purpose of the University of Dar es Salaam YouthMappers  is to use and promote open source data and GIS technologies to map potential disaster areas, provide resources for emergency management, connect its members with open source and GIS organizations in the city of Dar es Salaam, and serve any upcoming needs of our project partners .",countryCodes:["tz"],url:"https://www.facebook.com/UDSMYouthMappers/"},"ym-Busitema-University":{type:"youthmappers",name:"Good Mappers",description:"YouthMappers chapter at Busitema University",id:"ym-Busitema-University",featureId:"Busitema-University",contacts:[{name:"Organizer",email:"mulindwasteven82@gmail.com"}],extendedDescription:"Good mappers is a team of students in Busitema University. Its main objective is to create a community of experienced mappers who can contribute to the world map.",countryCodes:["ug"],url:"https://m.facebook.com/HOTBusitemaUniv/"},"ym-Gulu-University":{type:"youthmappers",name:"CSGU Mappers",description:"YouthMappers chapter at Gulu University",id:"ym-Gulu-University",featureId:"Gulu-University",contacts:[{name:"Organizer",email:"git445@gmail.com"}],extendedDescription:"The CSGU Mappers are the Computing Society at Gulu University. This chapter is creative, passionate, innovative and ready to map Uganda and the world at large, beyond other people's imagination.",countryCodes:["ug"],url:"mailto:git445@gmail.com?subject=YouthMappers%20at%20Gulu%20University"},"ym-Kumi-University":{type:"youthmappers",name:"Ever Last YouthMappers",description:"YouthMappers chapter at Kumi University",id:"ym-Kumi-University",featureId:"Kumi-University",contacts:[{name:"Organizer",email:"kumiuniversityeverlastyouthmap@gmail.com"}],extendedDescription:"This energetic group of students organizes within the faculty of Science and Information Technology.",countryCodes:["ug"],url:"mailto:kumiuniversityeverlastyouthmap@gmail.com?subject=YouthMappers%20at%20Kumi%20University"},"ym-Makerere-University":{type:"youthmappers",name:"Geo YouthMappers",description:"YouthMappers chapter at Makerere University",id:"ym-Makerere-University",featureId:"Makerere-University",contacts:[{name:"Organizer",email:"geo-youthmappers@googlegroups.com"}],extendedDescription:"Geo YouthMappers is a Makerere University based mapping chapter esteemed to apply the spatial conception to the real world.We have collaborated on various mapping events with OSM. Our main aim is the desire to simplify data and make it readily available mostly for disaster preparedness.\"We map the world and change lives.",countryCodes:["ug"],url:"https://www.facebook.com/groups/1742657446017065/"},"ym-Mbarara-University-of-Science-and-Technology":{type:"youthmappers",name:"MUST Street Mappers",description:"YouthMappers chapter at Mbarara University of Science and Technology",id:"ym-Mbarara-University-of-Science-and-Technology",featureId:"Mbarara-University-of-Science-and-Technology",contacts:[{name:"Organizer",email:"muststreetmappers@gmail.com"}],extendedDescription:"MUST Street Mappers is a Youth Mappers chapter at the Mbarara University of Science and Technology that is based on making our country and the world at large a better place through mapping. We base on collected information to notice patterns and data mine to present relevant and beneficial information to society.",countryCodes:["ug"],url:"https://web.facebook.com/muststreetmappers/"},"ym-St.-Augustine-International-University":{type:"youthmappers",name:"YouthMappers at St Augustine International University",description:"YouthMappers chapter at St. Augustine International University",id:"ym-St.-Augustine-International-University",featureId:"St.-Augustine-International-University",contacts:[{name:"Organizer",email:"youthmapperssaiu@gmail.com"}],countryCodes:["ng"],url:"mailto:youthmapperssaiu@gmail.com"},"ym-Uganda-Christian-University-Mbale-Campus":{type:"youthmappers",name:"Mappers for Life",description:"YouthMappers chapter at Uganda Christian University Mbale Campus",id:"ym-Uganda-Christian-University-Mbale-Campus",featureId:"Uganda-Christian-University-Mbale-Campus",contacts:[{name:"Organizer",email:"munhilll@gmail.com"}],extendedDescription:"We are Team Mappers for life! Please come and join us as we map together!\" This group works from the Department of Information Technology at the UCU.",countryCodes:["ug"],url:"mailto:munhilll@gmail.com?subject=YouthMappers%20and%20the%20Uganda%20Christian%20University%20Mappers%20for%20Life"},"ym-Uganda-Pentecostal-University":{type:"youthmappers",name:"HiTech Youth Mappers",description:"YouthMappers chapter at Uganda Pentecostal University",id:"ym-Uganda-Pentecostal-University",featureId:"Uganda-Pentecostal-University",contacts:[{name:"Organizer",email:"hitechyouthmappers@gmail.com"}],extendedDescription:"A new Youthmappers Chapter in Western Uganda. Ready to map and provide open data with OpenStreetMap for development purposes.",countryCodes:["ug"],url:"mailto:hitechyouthmappers@gmail.com"},"ym-St.-Mawaggali-Trades-Training-Institute":{type:"youthmappers",name:"MawaggaliMappers",description:"YouthMappers chapter at St. Mawaggali Trades Training Institute",id:"ym-St.-Mawaggali-Trades-Training-Institute",featureId:"St.-Mawaggali-Trades-Training-Institute",contacts:[{name:"Organizer",email:"mawaggalimappers@gmail.com"}],extendedDescription:"We are the youthappers chapter at St. Mawaggali trades in choma who are want to contribute the different humantarian tasks to serve lives through mapping.",countryCodes:["zm"],url:"mailto:mawaggalimappers@gmail.com"},"ym-The-University-of-Zambia":{type:"youthmappers",name:"YouthMappers Unza",description:"YouthMappers chapter at The University of Zambia",id:"ym-The-University-of-Zambia",featureId:"The-University-of-Zambia",contacts:[{name:"Organizer",email:"chombachishala13@gmail.com"}],countryCodes:["zm"],url:"https://www.facebook.com/search/posts/?q=youth%20mappers%20unza"},"ym-University-of-Zimbabwe":{type:"youthmappers",name:"UZMappers",description:"YouthMappers chapter at University of Zimbabwe",id:"ym-University-of-Zimbabwe",featureId:"University-of-Zimbabwe",contacts:[{name:"Organizer",email:"uzmappersteam@gmail.com"}],extendedDescription:"UzMappersTeam Zimbabwe is a team of Volunteers using OpenStreetMap for Open Data Mapping and Humanitarian Disaster response mapping .The team empowers its members with open source geospatial technology skills.",countryCodes:["zw"],url:"https://www.facebook.com/Uzmappersteam-Zimbabwe-246038666256392/"},"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"}]},"ym-Asian-University-for-Women":{type:"youthmappers",name:"YouthMappers at AUW",description:"YouthMappers chapter at Asian University for Women",id:"ym-Asian-University-for-Women",featureId:"Asian-University-for-Women",contacts:[{name:"Organizer",email:"harunur.rashid@auw.edu.bd"}],extendedDescription:"The Asian University for Women seeks to graduate women who will be skilled and innovative professionals, service-oriented leaders in the businesses and communities in which they will work and live, and promoters of intercultural understanding and sustainable human and economic development in Asia and throughout the world.",countryCodes:["bd"],url:"http://www.auw.edu.bd/"},"ym-Dhaka-College":{type:"youthmappers",name:"YouthMappers Daka College",description:"YouthMappers chapter at Dhaka College",id:"ym-Dhaka-College",featureId:"Dhaka-College",contacts:[{name:"Organizer",email:"youthmappersdc@gmail.com"}],extendedDescription:"YouthMappers DhakaCollege is an approach by students to help mapping vulnerable areas of the world as a part of Humanitarian Action. YouthMappers  gives the opportunity to the students for helping people and using mapping for humanitarian purposes. This open geographic data can be used for educational, navigational and other humanitarian purposes. Happy mapping.",countryCodes:["bd"],url:"https://www.facebook.com/groups/321220498214124/"},"ym-Dhaka-University":{type:"youthmappers",name:"Openstreetmap YouthMappers",description:"YouthMappers chapter at Dhaka University",id:"ym-Dhaka-University",featureId:"Dhaka-University",contacts:[{name:"Organizer",email:"hoque.ahasan@gmail.com"}],extendedDescription:"It's a great privilege for the students of University of Dhaka to map for humanitarian purposes. Our chapter gives the opportunity to the students for helping people and use mapping for humanitarian purposes.",countryCodes:["bd"],url:"https://www.facebook.com/groups/osmDU/1773150346233538/?notif_t=group_activity&notif_id=1472953820177890"},"ym-Eastern-University":{type:"youthmappers",name:"YouthMappers at Eastern University",description:"YouthMappers chapter at Eastern University",id:"ym-Eastern-University",featureId:"Eastern-University",contacts:[{name:"Organizer",email:"infolimon@gmail.com"}],extendedDescription:"YouthMappers at Eastern University, Bangladesh has been formed with a view to assisting people during humanitarian crisis. The students, likewise other mappers of the world, are promised to assist people in using the map for educational, navigational and other humanitarian purposes.",countryCodes:["bd"],url:"mailto:infolimon@gmail.com"},"ym-Jahangirnagar-University":{type:"youthmappers",name:"YouthMappers at IRS, Jahangirnagar University",description:"YouthMappers chapter at Jahangirnagar University",id:"ym-Jahangirnagar-University",featureId:"Jahangirnagar-University",contacts:[{name:"Organizer",email:"s.t.islam@juniv.edu"}],countryCodes:["bd"],url:"mailto:s.t.islam@juniv.edu"},"ym-Khulna-University":{type:"youthmappers",name:"Openstreetmap",description:"YouthMappers chapter at Khulna University",id:"ym-Khulna-University",featureId:"Khulna-University",contacts:[{name:"Organizer",email:"hoque.ahasan@gmail.com"}],extendedDescription:"KU students and faculty from multiple disciplines are experienced at creating open data for OSM to address local challenges of development, including food security and other topics.",countryCodes:["bd"],url:"https://www.facebook.com/groups/osmku/"},"ym-Rajshahi-University-of-Engineering-Technology":{type:"youthmappers",name:"YouthMappers at RUET",description:"YouthMappers chapter at Rajshahi University of Engineering & Technology",id:"ym-Rajshahi-University-of-Engineering-Technology",featureId:"Rajshahi-University-of-Engineering-Technology",contacts:[{name:"Organizer",email:"ruetmappers@gmail.com"}],extendedDescription:"The \"YouthMappers at RUET\" is a humanitarian mapping group of students of Rajshahi University of Engineering & Technology (RUET) to share, develop and practice the knowledge of GIS.  This group encourages using open source geospatial data and platform to make solution to reach the most vulnerable group of the world.",countryCodes:["bd"],url:"mailto:ruetmappers@gmail.com"},"ym-Sherubtse-College":{type:"youthmappers",name:"Geographical Society",description:"YouthMappers chapter at Sherubtse College",id:"ym-Sherubtse-College",featureId:"Sherubtse-College",contacts:[{name:"Organizer",email:"gsscbhutan@gmail.com"}],extendedDescription:"The Geographical Society, in the Department of Geography & Planning, Sherubtse College, Royal University of Bhutan, with support from the Center for Climate Change and Spatial Information, has made several efforts to create awareness and address important issues at the local and national level. We now join hands with the international student-centered YouthMappers network on \"Mapping for Resilience\" and contributing to a global 'Happiness'!",countryCodes:["bt"],url:"mailto:gsscbhutan@gmail.com?subject=About%20the%20Royal%20University%20of%20Bhutan%20Geographical%20Society%20and%20Youth%20Mappers"},"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-forum":{id:"osm-india-forum",featureId:"india_full",type:"forum",countryCodes:["in"],name:"OpenStreetMap India forum",description:"OpenStreetMap India web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=65",contacts:[{name:"OpenStreetMap India",email:"openstreetmapindia@gmail.com"}]},"osm-india-github":{id:"osm-india-github",featureId:"india_full",type:"github",name:"OpenStreetMap India GitHub",description:"Code with us: {url}",url:"https://github.com/osm-in",contacts:[{name:"Naveen Francis",email:"naveenpf@gmail.com"}]},"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-telegram":{id:"osm-india-telegram",featureId:"india_full",type:"telegram",name:"OpenStreetMap India Telegram",description:"Join our family: {url}",url:"https://t.me/OSMIndia",contacts:[{name:"Naveen Francis",email:"naveenpf@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-website":{id:"osm-india-website",featureId:"india_full",type:"osm",name:"OpenStreetMap India",countryCodes:["in"],description:"Mappers and OpenStreetMap users in India",url:"https://openstreetmap.in/",contacts:[{name:" OpenStreetMap India",email:"openstreetmapindia@gmail.com"}]},"osm-india-wiki":{id:"osm-india-wiki",featureId:"india_full",type:"wiki",name:"OpenStreetMap Wikiproject India",description:"Everything you need to know about mapping in India: {url}",url:"https://wiki.openstreetmap.org/wiki/WikiProject_India",contacts:[{name:"Naveen Francis",email:"naveenpf@gmail.com"}]},"osm-india-youtube":{id:"osm-india-youtube",featureId:"india_full",type:"youtube",name:"OpenStreetMap India Youtube",description:"Subscribe to our channel: {url}",url:"https://www.youtube.com/channel/UCu5sKaPU04x0RJkgGkoFORw",contacts:[{name:"Naveen Francis",email:"naveenpf@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-Puducherry-Mailing-List":{id:"OSM-Puducherry-Mailing-List",featureId:"india_puducherry",type:"mailinglist",name:"Free Software Hardware Movement - Mailing List",description:"FSHM Puducherry mailing list to discuss mapping in Puducherry and other things.",extendedDescription:"FSHM organizes events relating to free software/hardware, technology, activism and OpenStreetMap.",url:"https://www.freelists.org/archive/puduvailug/",signupUrl:"https://www.freelists.org/list/puduvailug",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"}]},"ym-Gujarat-University":{type:"youthmappers",name:"CCIM at Ahmedabad",description:"YouthMappers chapter at Gujarat University",id:"ym-Gujarat-University",featureId:"Gujarat-University",contacts:[{name:"Organizer",email:"coolmulls@gmail.com"}],countryCodes:["in"],url:"mailto:Coolmulls@gmail.com"},"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"}]},"ym-Universitas-Negeri-Makassar":{type:"youthmappers",name:"Kontur Geografi",description:"YouthMappers chapter at Universitas Negeri Makassar",id:"ym-Universitas-Negeri-Makassar",featureId:"Universitas-Negeri-Makassar",contacts:[{name:"Organizer",email:"konturgeografi@gmail.com"}],countryCodes:["in"],url:"https://tentangkontur.blogspot.co.id"},"ym-University-Muhammadiyah-Surakarta":{type:"youthmappers",name:"SpaceTime",description:"YouthMappers chapter at University Muhammadiyah Surakarta",id:"ym-University-Muhammadiyah-Surakarta",featureId:"University-Muhammadiyah-Surakarta",contacts:[{name:"Organizer",email:"spacetime1717@gmail.com"}],extendedDescription:"SpaceTime is a community mapping in the Faculty of Geography of Muhammadiyah University of Surakarta. SpaceTime was founded by Bruce Maldy Pratama, Mukhlis Akbar and Irfandi Fauzi. They are active students in the Faculty of Geography University Muhammadiyah Surakarta.",countryCodes:["in"],url:"mailto:spacetime1717@gmail.com"},"osm-iran-aparat":{id:"osm-iran-aparat",featureId:"iran",type:"aparat",countryCodes:["ir"],languageCodes:["fa"],name:"OpenStreetMap Iran Aparat",description:"Subscribe to our channel at {url}",extendedDescription:"A good resource of videos about anything related to OpenStreetMap. Mainly in Persian.",url:"https://www.aparat.com/osm_iran",contacts:[{name:"Iman",email:"iriman@chmail.ir"}]},"osm-iran-forum":{id:"osm-iran-forum",featureId:"iran",type:"forum",countryCodes:["ir"],languageCodes:["fa"],name:"OpenStreetMap Iran web forum",description:"OpenStreetMap Iran web forum",extendedDescription:"A web forum for OpenStreetMap users in Iran. Feel free to ask questions and discuss with others!",url:"https://forum.openstreetmap.org/viewforum.php?id=103",contacts:[{name:"Iman",email:"iriman@chmail.ir"}]},"osm-iran-telegram":{id:"osm-iran-telegram",featureId:"iran",type:"telegram",countryCodes:["ir"],languageCodes:["fa"],name:"OpenStreetMap Iran Telegram",description:"You're welcome to join our Telegram channel at {url}. We also have a supergroup of many OSMers interested in Iran. Find its link in bio of channel.",url:"https://t.me/openstreetmapir",contacts:[{name:"Iman",email:"iriman@chmail.ir"}]},"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-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"}]},"ym-Institute-of-Crisis-Management-Studies":{type:"youthmappers",name:"Institute of Crisis Management Studies YouthMappers",description:"YouthMappers chapter at Institute of Crisis Management Studies",id:"ym-Institute-of-Crisis-Management-Studies",featureId:"Institute-of-Crisis-Management-Studies",contacts:[{name:"Organizer",email:"deepakadhikari@tuicms.edu.np"}],extendedDescription:"To develop Crisis Mappers to assist during disaster situations.",countryCodes:["np"],url:"mailto:deepakadhikari@tuicms.edu.np"},"ym-Kathmandu-University":{type:"youthmappers",name:"Geomatics Engineering Society,GES",description:"YouthMappers chapter at Kathmandu University",id:"ym-Kathmandu-University",featureId:"Kathmandu-University",contacts:[{name:"Organizer",email:"ges@ku.edu.np"}],extendedDescription:"Geomatics Engineering Society (GES) established in 2008 A.D is a departmental club under Department of Civil and Geomatics Engineering (DCGE) at Kathmandu University. GES acts as a platform to develop the skills of students apart from their educational activities by focusing on activities like technical trainings, seminars, talk programs and interaction with experts from related field, sports activities etc.",countryCodes:["np"],url:"ku.edu.np/ges"},"ym-Tribhuvan-University":{type:"youthmappers",name:"Geomatics Engineering Students Association",description:"YouthMappers chapter at Tribhuvan University",id:"ym-Tribhuvan-University",featureId:"Tribhuvan-University",contacts:[{name:"Organizer",email:"gesan.nepal@gmail.com"}],extendedDescription:"This organization is the student forum of Geomatics Engineering students of Tribhuvan University , Institute of Engineering on the Pashchimanchal campus. Established since the beginning of the degree program, students have been active in mapping and leadership and are thrilled to be a part of the YouthMappers network.",countryCodes:["np"],url:"http://gesanwrc.wordpress.com/"},"OSM-Asia-mailinglist":{id:"OSM-Asia-mailinglist",featureId:"asia_full",type:"mailinglist",name:"OpenStreetMap Asia Mailinglist",description:"Talk-asia is the official Mailinglist for Asian Community",url:"https://lists.openstreetmap.org/listinfo/talk-asia",contacts:[{name:"Erwin Olario",email:"govvin@gmail.com"}]},"osm-asia-telegram":{id:"osm-asia-telegram",featureId:"asia_full",type:"telegram",name:"OpenStreetMap Asia Telegram",description:"Join our family: {url}",url:"https://t.me/OpenStreetMapAsia",contacts:[{name:"Erwin Olario",email:"govvin@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"}]},"ym-Far-Eastern-University-Institute-of-Technology":{type:"youthmappers",name:"Junior Philippines Computer Society",description:"YouthMappers chapter at Far Eastern University -Institute of Technology",id:"ym-Far-Eastern-University-Institute-of-Technology",featureId:"Far-Eastern-University-Institute-of-Technology",contacts:[{name:"Organizer",email:"jpcsfeutech@outlook.com"}],extendedDescription:"FEU has been recognized as one of the leading universities in the Philippines. Its mission centers on producing graduates who have contributed to the advancement of the country. The university continuously challenges itself to raise the bar of excellence to achieve a top-tier status not only in the Philippines but also in the South East Asian region",countryCodes:["ph"],url:"mailto:jpcsfeutech@outlook.com?subject=YouthMappers%20and%20Junior%20Philippines%20Computer%20Society"},"ym-University-of-the-Philippines-Resilience-Institute":{type:"youthmappers",name:"YouthMappers UP Resilience Institute",description:"YouthMappers chapter at University of the Philippines Resilience Institute",id:"ym-University-of-the-Philippines-Resilience-Institute",featureId:"University-of-the-Philippines-Resilience-Institute",contacts:[{name:"Organizer",email:"llnguyen@up.edu.ph"}],extendedDescription:"The UP Resilience Institute was established in 2016 with a mission statement to empower local communities through multidisciplinary research and actions toward resilience. Through UP NOAH Center, and the help of different organizations, we have provided building exposure maps for 17 provinces out of the 82 and uploaded more than 4 million footprints to Open Street Maps.",countryCodes:["ph"],url:"https://www.facebook.com/UP-Resillience-Institute-Youth-Mappers-123477508533225"},"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-south-korea-telegram":{id:"OSM-south-korea-telegram",featureId:"south_korea",type:"telegram",countryCodes:["kr"],languageCodes:["ko","en"],name:"OSM South Korea Telegram",description:"Unofficial Channnel for OpenStreetMap contributors, communities, and users in South 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-sri-lanka-facebook":{id:"OSM-sri-lanka-facebook",featureId:"sri_lanka",type:"facebook",countryCodes:["lk"],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-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://webchat.oftc.net/?channels=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"}]},"ym-Queen-Mary-University-of-London":{type:"youthmappers",name:"Queen Mary YouthMappers",description:"YouthMappers chapter at Queen Mary University of London",id:"ym-Queen-Mary-University-of-London",featureId:"Queen-Mary-University-of-London",contacts:[{name:"Organizer",email:"youthmappers@qmul.ac.uk"}],extendedDescription:"This chapter will be part of the activities of the Queen Mary Geography Society.",countryCodes:["uk"],url:"https://www.facebook.com/groups/qmulgeographysociety/"},"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://webchat.oftc.net/?channels=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://webchat.oftc.net/?channels=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://webchat.oftc.net/?channels=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"}]},"ym-Heidelberg-University":{type:"youthmappers",name:"disastermappers heidelberg",description:"YouthMappers chapter at Heidelberg University",id:"ym-Heidelberg-University",featureId:"Heidelberg-University",contacts:[{name:"Organizer",email:"disastermappers@posteo.de"}],extendedDescription:"Disastermappers Heidelberg was founded in 2014 as a student initiative to build a platform for exchange between students, researchers and humanitarian actors. Disastermappers are a member of Missing Maps and are organizing mapathons, workshops and webinars in Heidelberg and beyond and support HOT and Missing Maps through research and applications.",countryCodes:["de"],url:"https://disastermappers.wordpress.com/"},"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"}]},"is-facebook":{id:"is-facebook",type:"facebook",featureId:"iceland",countryCodes:["is"],languageCodes:["is","en"],name:"OSM Iceland on Facebook",description:"Page of OpenStreetMap in Iceland",url:"https://www.facebook.com/osmiceland/",contacts:[{name:"Talk-is-owner",email:"talk-is-owner@openstreetmap.org"}]},"is-mailinglist":{id:"is-mailinglist",type:"mailinglist",featureId:"iceland",countryCodes:["is"],languageCodes:["is","en"],name:"Talk-is Mailing List",description:"Talk-is is the official mailing list for the Icelandic OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-is",contacts:[{name:"Talk-is-owner",email:"talk-is-owner@openstreetmap.org"}]},"is-twitter":{id:"is-twitter",type:"twitter",featureId:"iceland",countryCodes:["is"],languageCodes:["is","en"],name:"OSM Iceland on Twitter",description:"Twitter of OpenStreetMap in Iceland",url:"https://twitter.com/openstreetmapis",contacts:[{name:"Talk-is-owner",email:"talk-is-owner@openstreetmap.org"}]},"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://webchat.oftc.net/?channels=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"}]},"ym-Politecnico-di-Milano":{type:"youthmappers",name:"PoliMappers",description:"YouthMappers chapter at Politecnico di Milano",id:"ym-Politecnico-di-Milano",featureId:"Politecnico-di-Milano",contacts:[{name:"Organizer",email:"polimappers@gmail.com"}],extendedDescription:"PoliMappers is a volunteer students’ association based at Politecnico di Milano. The mission of the group is to train and motivate the next generation of volunteer mappers and to do mapping using free and open source software within the university as well as primary and secondary schools.",countryCodes:["it"],url:"https://polimappers.github.io/"},"ym-Yarmouk-University":{type:"youthmappers",name:"YouthMappers at YU",description:"YouthMappers chapter at Yarmouk University",id:"ym-Yarmouk-University",featureId:"Yarmouk-University",contacts:[{name:"Organizer",email:"rnjawarneh@yu.edu.jo"}],extendedDescription:"YouthMappers chapter at YU is the first mapping group in the Middle East and North Africa region where refugees, drought, and poverty are rising crises and in urgent need for humanitarian mapping  activities to mitigate the consequences of such crises. YU Mappers are encouraged to use open data to address challenges in MENA region to bring relief and development to target areas within the region.",countryCodes:["jo"],url:"mailto:rnjawarneh@yu.edu.jo"},"kosovo-telegram":{id:"kosovo-telegram",type:"telegram",featureId:"kosovo",countryCodes:["xk"],languageCodes:["sq","sr","en"],name:"OpenStreetMap Kosovo on Telegram",description:"Semi-official all-Kosovo Telegram public group. We welcome all mappers from anywhere in any language.",url:"https://t.me/osmkosovo",contacts:[{name:"Guillaume Rischard",email:"guillaumenospam@openstreetmapnospam.lu"}]},"ym-Universit-Mohammed-V-Rabat":{type:"youthmappers",name:"Brahmapoutre at Rabat",description:"YouthMappers chapter at Université Mohammed V Rabat",id:"ym-Universit-Mohammed-V-Rabat",featureId:"Universit-Mohammed-V-Rabat",contacts:[{name:"Organizer",email:"khmichasma@gmail.com"}],extendedDescription:"This chapter sees participation in the YouthMappers program as an oppourtunity to share our knowlege create new working relationships with other chapters in different countries",countryCodes:["ma"],url:"mailto:khmichasma@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"},"no-telegram":{id:"no-telegram",type:"telegram",featureId:"norway",countryCodes:["no"],languageCodes:["no"],name:"@OSM_no on Telegram",description:"OpenStreetMap Norway Telegram chat",url:"https://t.me/OSM_no",contacts:[{name:"Syver Stensholt",email:"sssandum@gmail.com"}]},"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"}]},"pt-mailinglist":{id:"pt-mailinglist",featureId:"portugal_full",type:"mailinglist",name:"Talk-pt Mailing List",countryCodes:["pt"],languageCodes:["pt"],description:"Talk-pt is the official mailing list for the Portuguese OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-pt",contacts:[{name:"Nuno Caldeira",email:"hello@iamnunocaldeira.com"}]},"pt-telegram":{id:"pt-telegram",featureId:"portugal_full",type:"telegram",name:"OpenStreetMap Portugal no Telegram",countryCodes:["pt"],languageCodes:["pt"],description:"Telegram Group of the Portuguese OpenStreetMap community {url}",url:"https://t.me/OSMPortugal",contacts:[{name:"Nuno Caldeira",email:"hello@iamnunocaldeira.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"}]},"si-twitter":{id:"si-twitter",featureId:"slovenia",type:"twitter",name:"OpenStreetMap Slovenia Twitter",countryCodes:["si"],languageCodes:["sl","en"],description:"Follow OpenStreetMap Slovenia On Twitter: {url}",url:"https://twitter.com/OpenStreetMapSi",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"}]},"ym-Universidad-Autonoma-de-Madrid":{type:"youthmappers",name:"YouthMappers at UAM",description:"YouthMappers chapter at Universidad Autonoma de Madrid",id:"ym-Universidad-Autonoma-de-Madrid",featureId:"Universidad-Autonoma-de-Madrid",contacts:[{name:"Organizer",email:"youthmappersatuam@gmail.com"}],countryCodes:["es"],url:"mailto:youthmappersatuam@gmail.com"},"ym-Universidad-Politcnica-de-Madrid":{type:"youthmappers",name:"Mapeo Humanitario",description:"YouthMappers chapter at Universidad Politécnica de Madrid",id:"ym-Universidad-Politcnica-de-Madrid",featureId:"Universidad-Politcnica-de-Madrid",contacts:[{name:"Organizer",email:"lab.topografia@gmail.com"}],extendedDescription:"Geo-volunteering group formed at Moncloa Campus on November 2017. Around 20 members from three Universities (Complutense, CEU and UPM). Undergraduate students, MSc and PhD students collaborate together with organizations (MSF, Acción contra el Hambre,...) supported by trainers from Geoinquietos. Official recognition by UPM as Educative Innovation Project (Code  IE1718.0411)",countryCodes:["es"],url:"https://blogs.upm.es/mapeo-humanitario/"},"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://webchat.oftc.net/?channels=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"}]},"ym-Istanbul-Technical-University":{type:"youthmappers",name:"YouthMappers ITU",description:"YouthMappers chapter at Istanbul Technical University",id:"ym-Istanbul-Technical-University",featureId:"Istanbul-Technical-University",contacts:[{name:"Organizer",email:"youthmappersitu@gmail.com"}],extendedDescription:"YouthMappers ITU is an interdisciplinary and collaborative student community to promote humanitarian mapping for vulnerable settlements and aims to develop and share strategic and innovative spatial information for the future cities by using geographical information systems and open data.",countryCodes:["tr"],url:"https://www.facebook.com/YouthMappers-ITU-226489641442744/?modal=admin_todo_tour"},"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://webchat.oftc.net/?channels=osm-gb",contacts:[{name:"UK mailing list",email:"talk-gb-owner@lists.openstreetmap.org"}]},"ym-University-of-Exeter":{type:"youthmappers",name:"University of Exeter British Red Cross Missing Maps",description:"YouthMappers chapter at University of Exeter",id:"ym-University-of-Exeter",featureId:"University-of-Exeter",contacts:[{name:"Organizer",email:"uniofexemissingmaps@gmail.com"}],extendedDescription:"We are a team of enthusiastic Geographers with comprehensive knowledge of GIS. We are passionate about supporting the British Red Cross Society with various humanitarian aid efforts. We are also important teachers of the significance of mapping remotely sensed data and how this helps on the ground. Our mapathons have themed academic focuses that highlight the different GIS research in our geography department, while also functioning as employability awareness events which we use to invite speakers in to talk about their GIS/British Red Cross careers.",countryCodes:["uk"],url:"https://www.facebook.com/EUMissingMaps/"},"ym-University-of-Warwick":{type:"youthmappers",name:"University of Warwick Resilience Mapping Society",description:"YouthMappers chapter at University of Warwick",id:"ym-University-of-Warwick",featureId:"University-of-Warwick",contacts:[{name:"Organizer",email:"p.ulbrich@warwick.ac.uk"}],extendedDescription:"We are a group of enthusiastic mappers based at Warwick University. Our aim is to get people excited about humanitarian mapping and help them understand the impact this activity has on the field. We are closely aligned with Missing Maps and Doctors Without Borders UK and focus on HOT tasks in our mapping activities and workshops. Our mapathons are listed on the Missing Maps page whenever they are scheduled.",countryCodes:["uk"],url:"mailto:p.ulbrich@warwick.ac.uk"},"ym-Sacred-Heart-Junior-College":{type:"youthmappers",name:"Youth Mappers at Sacred Heart Junior College",description:"YouthMappers chapter at Sacred Heart Junior College",id:"ym-Sacred-Heart-Junior-College",featureId:"Sacred-Heart-Junior-College",contacts:[{name:"Organizer",email:"jtzib18@gmail.com"}],countryCodes:["bz"],url:"mailto:jtzib18@gmail.com"},"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/"}]},"ym-Universidad-de-Costa-Rica":{type:"youthmappers",name:"YouthMappers de Universidad de Costa Rica",description:"YouthMappers chapter at Universidad de Costa Rica",id:"ym-Universidad-de-Costa-Rica",featureId:"Universidad-de-Costa-Rica",contacts:[{name:"Organizer",email:"youthmappersucr@gmail.com"}],extendedDescription:"YouthMappers de Universidad de Costa Rica nace en función de acción social para y por miembros de comunidades distintas según temáticas de involucramiento, interacción y representación de variables dentro de un espacio geográfico definido (un territorio) Gracias a las herramientas de OpenStreetMaps tenemos la viabilidad de poder obtener, validar y compartir la información generada para comprobación y uso destinadas a las comunidades o el interesado en tales temáticas objetivas.",countryCodes:["cr"],url:"https://www.facebook.com/ucr.asege/"},"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"}]},"ym-Universidad-Nacional-Autnoma-de-Honduras":{type:"youthmappers",name:"PumaGis Hn",description:"YouthMappers chapter at Universidad Nacional Autónoma de Honduras",id:"ym-Universidad-Nacional-Autnoma-de-Honduras",featureId:"Universidad-Nacional-Autnoma-de-Honduras",contacts:[{name:"Organizer",email:"pumagishn@gmail.com"}],countryCodes:["hn"],url:"mailto:pumagishn@gmail.com"},"ym-University-of-the-West-Indies-Mona-Campus":{type:"youthmappers",name:"Libraries Outreach - ODL",description:"YouthMappers chapter at University of the West Indies, Mona Campus",id:"ym-University-of-the-West-Indies-Mona-Campus",featureId:"University-of-the-West-Indies-Mona-Campus",contacts:[{name:"Organizer",email:"benjamin.branch@uwimona.edu.jm"}],extendedDescription:"The UWI, Mona Campus Library engages in public, outreach and special projects. This will allow our library the means to be a catalyst for spatial literacy and advocate for spatial data sharing and access to Jamaican and Caribbean interests. We have disaster relief and communication needs and   extensive earth science and geo-hazards needs to better serve our campus and community. Specifically, we hace a Science Library to showcase such to all faculty and students.",countryCodes:["jm"],url:"mailto:benjamin.branch@uwimona.edu.jm"},"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"}]},"ym-Universidad-Nacional-de-Ingenieria":{type:"youthmappers",name:"Yeka Street MGA",description:"YouthMappers chapter at Universidad Nacional de Ingenieria",id:"ym-Universidad-Nacional-de-Ingenieria",featureId:"Universidad-Nacional-de-Ingenieria",contacts:[{name:"Organizer",email:"yeka.street.mga@gmail.com"}],extendedDescription:"YEKA STREET is a work team constituted by students from Universidad Nacional de Ingenieria at Managua, Nicaragua. With the principal purpose of apply our knowledge and skills using many tools and apps to map areas in our cities and contribute to the development community projects and disasters relieve plans. We want to lead the way adding more students from all careers and universities in our country to join us at this cause, increasing in this way the life level and reducing the population vulnerability.",countryCodes:["ni"],url:"https://www.facebook.com/yekastreetmga/"},"ym-University-of-Panama":{type:"youthmappers",name:"YouthMappers UP",description:"YouthMappers chapter at University of Panama",id:"ym-University-of-Panama",featureId:"University-of-Panama",contacts:[{name:"Organizer",email:"youthmappers.up@gmail.com"}],extendedDescription:"Student mappers in Panama work with open spatial data to help identify, define, address, and create meaning about locally defined development challenges. They collaborate with students from other countries on community mapping topics from ecotourism to food security, from biodiversity to indigenous issues, promoting a humanistic vision through scientific perspectives.",countryCodes:["pa"],url:"mailto:Youthmappers.up@gmail.com"},"ym-Universidad-de-Puerto-Rico-Rio-Piedras":{type:"youthmappers",name:"UPR YouthMappers",description:"YouthMappers chapter at Universidad de Puerto Rico - Rio Piedras",id:"ym-Universidad-de-Puerto-Rico-Rio-Piedras",featureId:"Universidad-de-Puerto-Rico-Rio-Piedras",contacts:[{name:"Organizer",email:"carlosguilbe@gmail.com"}],countryCodes:["pa"],url:"mailto:carlosguilbe@gmail.com"},"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"}]},"MaptimeHRVA-twitter":{id:"MaptimeHRVA-twitter",featureId:"hrva",type:"twitter",name:"MaptimeHRVA Twitter",countryCodes:["us"],languageCodes:["en"],description:"Follow us on Twitter at {url}",url:"https://twitter.com/maptimehrva",contacts:[{name:"Jonah Adkins",email:"jonahadkins@gmail.com"}]},"us-ma-mailinglist":{id:"us-ma-mailinglist",featureId:"massachusetts",type:"mailinglist",name:"Talk-us-massachusetts Mailing List",countryCodes:["us"],languageCodes:["en"],description:"Email mailing list for the Massachusetts OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-us-massachusetts",contacts:[{name:"Alan Bragg",email:"alan.ruth.bragg@gmail.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-forum":{id:"OSM-Portland-forum",featureId:"portland_or",type:"forum",name:"OpenStreetMap PDX Google Group",countryCodes:["us"],languageCodes:["en"],description:"Forum and mailing list for OpenStreetMap users in the Portland area",extendedDescription:"This group is to facilitate improvements to OpenStreetMap in the Portland, Oregon area to support applications such as the Open Trip Planner.",url:"https://groups.google.com/group/osm-pdx",contacts:[{name:"Madeline Steele",email:"madeline.steele@gmail.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://slack.openstreetmap.us/",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:"sotmus2019-cfs",i18n:true,name:"Propose a Talk for SotM-US 2019",description:"We are calling on all members of the OpenStreetMap community to share your ideas and session proposals for State of the Map US 2019. Whether you are brand new to OSM or have been a core contributor since the beginning, we want to hear from you!",where:"Minneapolis, Minnesota",when:"2019-jun-01",url:"https://sessionize.com/sotmus2019"},{id:"sotmus2019",i18n:true,name:"State of the Map US 2019",description:"Join the OpenStreetMap community at State of the Map US in Minneapolis, Minnesota. Connect with other mappers, businesses, government agencies, and non profits, all collaborating around the free and editable map of the world.",where:"Minneapolis, Minnesota",when:"2019-sep-05",url:"https://2019.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"}]},"ym-Ball-State-University":{type:"youthmappers",name:"Gamma Theta Upsilon- Iota Omega Chapter",description:"YouthMappers chapter at Ball State University",id:"ym-Ball-State-University",featureId:"Ball-State-University",contacts:[{name:"Organizer",email:"gtu@bsu.edu"}],extendedDescription:"Our chapter is a very active one. We primarily focus on community events, fundraising, and field trips. We are currently looking to develop more mapping-related activities to draw in other students from campus who may be interested in contributing.",countryCodes:["us"],url:"https://www.facebook.com/BallState.GammaThetaUpsilon/"},"ym-California-University-of-Pennsylvania":{type:"youthmappers",name:"CalU PA GIS Club",description:"YouthMappers chapter at California University of Pennsylvania",id:"ym-California-University-of-Pennsylvania",featureId:"California-University-of-Pennsylvania",contacts:[{name:"Organizer",email:"mueller@calu.edu"}],extendedDescription:"GIS Students at Cal U learn to apply spatial theory to the real world. The university degree program focuses on geography as well as utilizing GIS in emergency management.",countryCodes:["us"],url:"https://www.facebook.com/CalUGisClub/"},"ym-Central-Washington-University":{type:"youthmappers",name:"Geography Club",description:"YouthMappers chapter at Central Washington University",id:"ym-Central-Washington-University",featureId:"Central-Washington-University",contacts:[{name:"Organizer",email:"valkoc@cwu.edu"}],extendedDescription:"Our goal teaming up with Youthmappers is to bring relief to areas that are in need of humanitarian mapping. By doing so, we are serving our fellow brothers and sisters around the world as well as furthering our own cartography skills.",countryCodes:["us"],url:"https://www.cwu.edu/geography/geography-club"},"ym-Clemson-University":{type:"youthmappers",name:"Clemson Mappers",description:"YouthMappers chapter at Clemson University",id:"ym-Clemson-University",featureId:"Clemson-University",contacts:[{name:"Organizer",email:"clemsonmappers@gmail.com"}],extendedDescription:"Students in Clemson are supported by the Center for Geospatial Technologies, a community of interdisciplinary geospatial science practitioners supporting research, teaching, and outreach activities using technologies that enable the collection, analysis, and application of geospatial data. Students integrate geospatial technologies within their scholarly activities across all disciplines and build connections throughout the world.",countryCodes:["us"],url:"http://www.clemsongis.org/#!clemson-mappers/i9w6t"},"ym-College-of-William-and-Mary":{type:"youthmappers",name:"All over the map!",description:"YouthMappers chapter at College of William and Mary",id:"ym-College-of-William-and-Mary",featureId:"College-of-William-and-Mary",contacts:[{name:"Organizer",email:"lnseitz@email.wm.edu"}],extendedDescription:"The students who are all over the map are supported by the Center for Geospatial Analysis, a group integrating GIS across the curriculum and providing student and faculty with hardware, software, and expertise.  Students of all backgrounds utilize GIS across campus, including environmental science and policy, geology, history, business, sociology, biology, anthropology, public policy, and marine sciences.",countryCodes:["us"],url:"mailto:lnseitz@email.wm.edu"},"ym-Cornell-University":{type:"youthmappers",name:"Mapping Society",description:"YouthMappers chapter at Cornell University",id:"ym-Cornell-University",featureId:"Cornell-University",contacts:[{name:"Organizer",email:"mappingsocietycornell@gmail.com"}],extendedDescription:"Cornell students and faculty use open data and open source software to address challenges at local, national, and global scales. In doing so, we advance our academic and personal goals of developing our own skills around GIS and spatial literacy.",countryCodes:["us"],url:"mailto:mappingsocietycornell@gmail.com?subject=Youth%20Mappers%20and%20Mapping%20Society%20at%20Cornell%20University"},"ym-George-Mason-University":{type:"youthmappers",name:"Mason Mappers",description:"YouthMappers chapter at George Mason University",id:"ym-George-Mason-University",featureId:"George-Mason-University",contacts:[{name:"Organizer",email:"masonmappers@gmail.com"}],extendedDescription:"Mason Mappers Student Society is a humanitarian mapping student organization in the George Mason University GGS Department, and its goal is to promote education and knowledge in geo-technologies, geo-info science, to foster good global stewardship and engage in professional development while building a positive, interactive geo-community, as well as shaping students into leaders of tomorrow.",countryCodes:["us"],url:"Facebook.com/MasonMappers"},"ym-Indiana-University-of-Pennsylvania":{type:"youthmappers",name:"Geospatial Science Club",description:"YouthMappers chapter at Indiana University of Pennsylvania",id:"ym-Indiana-University-of-Pennsylvania",featureId:"Indiana-University-of-Pennsylvania",contacts:[{name:"Organizer",email:"rhoch@iup.edu"}],countryCodes:["us"],url:"mailto:rhoch@iup.edu"},"ym-Jacksonville-State-University":{type:"youthmappers",name:"JSU Disaster Mapping Team",description:"YouthMappers chapter at Jacksonville State University",id:"ym-Jacksonville-State-University",featureId:"Jacksonville-State-University",contacts:[{name:"Organizer",email:"ltatum@stu.jsu.edu"}],extendedDescription:"The JSU Disaster Mapping Team is a program at Jacksonville State University dedicated to assisting disaster response in times of emergencies. This includes tornadoes, severe thunderstorms, floods, etc. The team is intended to be a valuable asset to surrounding counties and a conduit for the JSU Geoscience Department students to apply what they have learned in an academic setting to support emergency services. Our goal is to streamline disaster response and recovery operations while utilizing student skill sets",countryCodes:["us"],url:"mailto:ltatum@stu.jsu.edu"},"ym-Kansas-State-University":{type:"youthmappers",name:"Gamma Theta Upsilon: Beta Psi Chapter",description:"YouthMappers chapter at Kansas State University",id:"ym-Kansas-State-University",featureId:"Kansas-State-University",contacts:[{name:"Organizer",email:"tblarsen@ksu.edu"}],extendedDescription:"We are the Kansas State University Chapter of Gamma Theta Upsilon, an international geography honor society with affiliation to YouthMappers. We have been active with mapping for OSM and conducted a mapathon called \"Map for Nepal,\" in which we used OpenStreetMap to digitize unmapped areas of Nepal after the earthquake in 2015.",countryCodes:["us"],url:"https://www.facebook.com/kstate.gtu?fref=ts"},"ym-McGill-University":{type:"youthmappers",name:"Open Mapping Group McGill: A Member of the McGill Undergraduate Geography Society",description:"YouthMappers chapter at McGill University",id:"ym-McGill-University",featureId:"McGill-University",contacts:[{name:"Organizer",email:"omg.mcgill@gmail.com"}],extendedDescription:"The Open Mapping Group McGill: A Member of McGill Undergraduate Geography Society (OMG McGill) aims to connect students with open geospatial data and technologies to enhance resilience, community-building, and learning through mapping–on campus, in Montreal, in Canada, and abroad.",countryCodes:["ca"],url:"mailto:omg.mcgill@gmail.com"},"ym-Miami-University":{type:"youthmappers",name:"Geography and Planning Society",description:"YouthMappers chapter at Miami University",id:"ym-Miami-University",featureId:"Miami-University",contacts:[{name:"Organizer",email:"gpsmiamioh@gmail.com"}],extendedDescription:"GPS at Miami University aims to create a close-knit community of planners and geographers who want to have fun, learn more about careers and higher education in their field, network, and work alongside professionals for real experience.",countryCodes:["us"],url:"mailto:GPSMiamiOH@gmail.com"},"ym-Monroe-Community-College":{type:"youthmappers",name:"MCC Mapping Corps",description:"YouthMappers chapter at Monroe Community College",id:"ym-Monroe-Community-College",featureId:"Monroe-Community-College",contacts:[{name:"Organizer",email:"gist@monroecc.edu"}],countryCodes:["us"],url:"mailto:GIST@monroecc.edu"},"ym-Montgomery-College":{type:"youthmappers",name:"GeoMC",description:"YouthMappers chapter at Montgomery College",id:"ym-Montgomery-College",featureId:"Montgomery-College",contacts:[{name:"Organizer",email:"stephanie.calderon@montgomerycollege.edu"}],extendedDescription:"GeoMC’s mission is to provide students with hands-on experience in applying geospatial tools, collecting data, and project management. Most of our students come with a background in GIS and are geography majors. Our chapter’s members come from diverse backgrounds and we all work together to make a positive impact in the world live in.",countryCodes:["us"],url:"mailto:stephanie.calderon@montgomerycollege.edu"},"ym-New-York-University":{type:"youthmappers",name:"NYU mHealth Initiative Mapping Corps",description:"YouthMappers chapter at New York University",id:"ym-New-York-University",featureId:"New-York-University",contacts:[{name:"Organizer",email:"mhealth@nyu.edu"}],extendedDescription:"The NYU mobile health or “mHealth” research initiative focuses on development of systems that link people - usually via their phones - to the places that they live and traverse, and thus supports novel research on the way phones and maps can be leveraged to understand behavioral decision making and ultimately health outcomes.",countryCodes:["us"],url:"http://www.nyumhealth.org/"},"ym-Ohio-Wesleyan-University":{type:"youthmappers",name:"Environment and Wildlife Club",description:"YouthMappers chapter at Ohio Wesleyan University",id:"ym-Ohio-Wesleyan-University",featureId:"Ohio-Wesleyan-University",contacts:[{name:"Organizer",email:"envirowild@owu.edu"}],extendedDescription:"Environment and Wildlife Club looks at environmental issues on campus, in Delaware, and even nationally! We create campus and community projects, explore and enjoy the outdoors, volunteer, and try to promote environmentalism in every aspect of our lives.",countryCodes:["us"],url:"mailto:envirowild@owu.edu"},"ym-Oklahoma-State-University":{type:"youthmappers",name:"Geography Club",description:"YouthMappers chapter at Oklahoma State University",id:"ym-Oklahoma-State-University",featureId:"Oklahoma-State-University",contacts:[{name:"Organizer",email:"hhayden@okstate.edu"}],countryCodes:["us"],url:"mailto:hhayden@okstate.edu"},"ym-State-University-of-New-York-Geneseo":{type:"youthmappers",name:"SUNY Geneseo GIS Association",description:"YouthMappers chapter at State University of New York Geneseo",id:"ym-State-University-of-New-York-Geneseo",featureId:"State-University-of-New-York-Geneseo",contacts:[{name:"Organizer",email:"bb18@geneseo.edu"}],extendedDescription:"We spread awareness, support, education, volunteerism, and career advancement opportunities in geographic information systems, across disciplines and departments, in the context of SUNY Geneseo, the local community, and global community.",countryCodes:["us"],url:"http://www.facebook.com/GeneseoGIS"},"ym-SUNY-at-Fredonia":{type:"youthmappers",name:"Geoventurers",description:"YouthMappers chapter at SUNY at Fredonia",id:"ym-SUNY-at-Fredonia",featureId:"SUNY-at-Fredonia",contacts:[{name:"Organizer",email:"amw30@geneseo.edu"}],extendedDescription:"GeoVenturers is a group of students joining together across a number of majors on our campus that see geospatial technologies as a tool to serve others and to bring people together. Mentoring for the group brings in science education from the department of curriculum and instruction. We hope that we can bring our skills to play in helping make people's lives better.",countryCodes:["us"],url:"mailto:amw30@geneseo.edu?subject=GeoVenturers%20and%20the%20YouthMappers%20network"},"ym-Texas-Tech-University":{type:"youthmappers",name:"YouthMappers at TTU",description:"YouthMappers chapter at Texas Tech University",id:"ym-Texas-Tech-University",featureId:"Texas-Tech-University",contacts:[{name:"Organizer",email:"emily.glaeser@ttu.edu"}],extendedDescription:"As one of the co-founding chapters of the network, the TTU YouthMappers are enthusiastic to serve as interdisciplinary leaders to help create open geographic data and analyses that address locally defined development challenges worldwide. The chapter strives to exchange and collaborate with other chapters around the globe while also offering themselves as a local resource and service to Texas Tech student organizations in ways that add value to their respecitive campus activities through mapping.",countryCodes:["us"],url:"https://www.facebook.com/youthmapperstexastech/"},"ym-The-Citadel":{type:"youthmappers",name:"YouthMappers at The Citadel",description:"YouthMappers chapter at The Citadel",id:"ym-The-Citadel",featureId:"The-Citadel",contacts:[{name:"Organizer",email:"cstokes5@citadel.edu"}],extendedDescription:"This chapter is also a Rotaract Club, which is an affiliate of Rotary International. Multiple members, as well as leadership have expressed an interest in YouthMappers and we would like to affiliate our Citadel Rotaract Club with YouthMappers.",countryCodes:["us"],url:"Mailto:cstokes5@citadel.edu"},"ym-The-George-Washington-University":{type:"youthmappers",name:"Humanitarian Mapping Society",description:"YouthMappers chapter at The George Washington University",id:"ym-The-George-Washington-University",featureId:"The-George-Washington-University",contacts:[{name:"Organizer",email:"hms.gwu@gmail.com"}],extendedDescription:"Models of leadership and engagement, HMS seeks to render aid and better the world through humanitarian Geographic Information Systems (GIS) projects. This co-founding affiliated chapter on the campus of GWU has a plethora of experience to share, and frequently partners directly with USAID, the American Red Cross, and the US Department of State in their DC area to expand student-led efforts and serve the global community.",countryCodes:["us"],url:"https://www.facebook.com/GWHMS/"},"ym-The-Johns-Hopkins-University-SAIS":{type:"youthmappers",name:"SAIS YouthMappers",description:"YouthMappers chapter at The Johns Hopkins University, SAIS",id:"ym-The-Johns-Hopkins-University-SAIS",featureId:"The-Johns-Hopkins-University-SAIS",contacts:[{name:"Organizer",email:"saisyouthmappers@gmail.com"}],extendedDescription:"The mission of SAIS Youth Mappers is to provide students at the Johns Hopkins University SAIS with the opportunity to become highly skilled humanitarian mappers. As a group within the South Asia Club, its primary focus is on supporting humanitarian mapping projects in the Indo-Pacific Region.",countryCodes:["us"],url:"mailto:saisyouthmappers@gmail.com"},"ym-The-Pennsylvania-State-University":{type:"youthmappers",name:"Penn State GIS Coalition",description:"YouthMappers chapter at The Pennsylvania State University",id:"ym-The-Pennsylvania-State-University",featureId:"The-Pennsylvania-State-University",contacts:[{name:"Organizer",email:"advising@geog.psu.edu"}],extendedDescription:"The Penn State Geospatial Information Science (GIS) Coalition is an organization that offers students majoring, minoring, or sharing an interest in GIS opportunities to develop supplementary knowledge and skills necessary to succeed in the professional GIS industry.",countryCodes:["us"],url:"mailto:advising@geog.psu.edu"},"ym-University-of-California-Davis":{type:"youthmappers",name:"Mapping Club",description:"YouthMappers chapter at University of California, Davis",id:"ym-University-of-California-Davis",featureId:"University-of-California-Davis",contacts:[{name:"Organizer",email:"ucdmappingclub@ucdavis.edu"}],countryCodes:["us"],url:"mailto:ucdmappingclub@ucdavis.edu?subject=YouthMappers%20and%20UC%20Davis%20Mapping%20Club"},"ym-University-of-Central-Florida":{type:"youthmappers",name:"Geospatial Information Society",description:"YouthMappers chapter at University of Central Florida",id:"ym-University-of-Central-Florida",featureId:"University-of-Central-Florida",contacts:[{name:"Organizer",email:"rsouth@knights.ucf.edu"}],extendedDescription:"Our mission is to foster a social and educational environment for all majors who are interested in the discussion and application of GIS. Group and community events throughout the academic year organize students to volunteer to help local and regional communities by using community-based GIS projects and educating local middle and high school students on the use and application of GIS.",countryCodes:["us"],url:"mailto:rsouth@knights.ucf.edu"},"ym-University-of-Chicago":{type:"youthmappers",name:"Tobler Society",description:"YouthMappers chapter at University of Chicago",id:"ym-University-of-Chicago",featureId:"University-of-Chicago",contacts:[{name:"Organizer",email:"toblersociety@uchicago.edu"}],countryCodes:["us"],url:"mailto:toblersociety@uchicago.edu"},"ym-University-of-Maryland-College-Park":{type:"youthmappers",name:"Geography Club",description:"YouthMappers chapter at University of Maryland - College Park",id:"ym-University-of-Maryland-College-Park",featureId:"University-of-Maryland-College-Park",contacts:[{name:"Organizer",email:"geogclubumd@gmail.com"}],extendedDescription:"The mission of the Geography Club at the University of Maryland College Park is to engage and encourage students to explore geographic interests within the campus and the community.",countryCodes:["us"],url:"https://www.facebook.com/UMDGeographyClub/?fref=ts"},"ym-University-of-North-Texas":{type:"youthmappers",name:"UNT Geography Club",description:"YouthMappers chapter at University of North Texas",id:"ym-University-of-North-Texas",featureId:"University-of-North-Texas",contacts:[{name:"Organizer",email:"reeseramsey@my.unt.edu"}],extendedDescription:"The Geography Club is a student organization at University of North Texas that welcomes all students who are interested in geography. The objective of the Geography Club is to promote interest in Geography, the Major and the Geography Department along with fellowship among students and faculty. The club also seeks to represent student needs and wants in regard to the study of geography and to provide a forum for the presentation of innovative ideas to the benefit of the University community.",countryCodes:["us"],url:"Mailto:reeseramsey@my.unt.edu"},"ym-University-of-Northern-Colorado":{type:"youthmappers",name:"UNCO Geography and GIS Club",description:"YouthMappers chapter at University of Northern Colorado",id:"ym-University-of-Northern-Colorado",featureId:"University-of-Northern-Colorado",contacts:[{name:"Organizer",email:"uncogeoggisclub@gmail.com"}],extendedDescription:"Official Geography and GIS Club chapter affiliated with the University of Northern Colorado where our aim is to learn, share and connect with those around us. #MakingSenseOfTheWorld",countryCodes:["us"],url:"www.facebook.com/groups/476365076071166/"},"ym-University-of-Oregon":{type:"youthmappers",name:"Map by Northwest",description:"YouthMappers chapter at University of Oregon",id:"ym-University-of-Oregon",featureId:"University-of-Oregon",contacts:[{name:"Organizer",email:"cbone@uoregon.edu"}],extendedDescription:"Map By Northwest aims to engage undergraduate students at the University of Oregon in mapping projects to assist in humanitarian causes and for conducting geographic research. We welcome students from all disciplines to join us in our mapping adventures.",countryCodes:["us"],url:"http://blogs.uoregon.edu/mxnw/"},"ym-University-of-Redlands":{type:"youthmappers",name:"URSpatial Geo-Thinkers",description:"YouthMappers chapter at University of Redlands",id:"ym-University-of-Redlands",featureId:"University-of-Redlands",contacts:[{name:"Organizer",email:"nathan_strout@redlands.edu"}],extendedDescription:"To build upon the members' GIS skills and knowledge of the tools and methods through applied social engagement as well as to educate the campus community about the power of mapping and spatial analysis through community service events.",countryCodes:["us"],url:"mailto:nathan_strout@redlands.edu"},"ym-University-of-South-Carolina":{type:"youthmappers",name:"Geography Graduate Student Association",description:"YouthMappers chapter at University of South Carolina",id:"ym-University-of-South-Carolina",featureId:"University-of-South-Carolina",contacts:[{name:"Organizer",email:"carolina_ggsa@gmail.com"}],extendedDescription:"The GGSA is a fully student-run organization, designed to serve as an advocate and resource for all geography graduate students by filling the role of liaison between the department and students. Our goal is to further professional, academic, and personal development of graduate students interested in the field of geography and its sub disciplines.",countryCodes:["us"],url:"https://carolinaggsa.wordpress.com/"},"ym-University-of-Southern-California":{type:"youthmappers",name:"SC Mappers",description:"YouthMappers chapter at University of Southern California",id:"ym-University-of-Southern-California",featureId:"University-of-Southern-California",contacts:[{name:"Organizer",email:"scmappers@gmail.com"}],extendedDescription:"We see the world differently: we view it through a spatial lens. With the power of spatial thinking, we connect place and space to help address global challenges. Collaborate with us!",countryCodes:["us"],url:"mailto:scmappers@gmail.com?subject=YouthMappers%20at%20USC"},"ym-University-of-Vermont":{type:"youthmappers",name:"University of Vermont Humanitarian Mapping Club",description:"YouthMappers chapter at University of Vermont",id:"ym-University-of-Vermont",featureId:"University-of-Vermont",contacts:[{name:"Organizer",email:"uvm.hmc@gmail.com"}],countryCodes:["us"],url:"https://www.facebook.com/UVMHMC"},"ym-University-of-Victoria":{type:"youthmappers",name:"Society of Geography Students",description:"YouthMappers chapter at University of Victoria",id:"ym-University-of-Victoria",featureId:"University-of-Victoria",contacts:[{name:"Organizer",email:"sogsmappers@gmail.com"}],extendedDescription:"SOGS seeks to promote and represent social and academic interests within the Department of Geography. This is expressed by four key goals: To provide a forum for the discussion of matters concerning the quality and accessibility of education within geography; to provide a means of expressing a consensus of student opinion to deparhnental faculty through representation at deparkrnental meetings and on departrnental committees; to undertake anangements for such activities as are for the benefit of students and are seen to be within the field of interest of students in geography; to act as a liaison through the UVSS and the Course Union Council with other student groups on campus",url:"https://www.facebook.com/SOGSUVic/"},"ym-University-of-Wyoming":{type:"youthmappers",name:"Gamma Theta Upsilon/Geography Club",description:"YouthMappers chapter at University of Wyoming",id:"ym-University-of-Wyoming",featureId:"University-of-Wyoming",contacts:[{name:"Organizer",email:"gtu-geography@uwyo.edu"}],countryCodes:["us"],url:"http://www.uwyo.edu/geography/geographyclub/"},"ym-UW-Madison":{type:"youthmappers",name:"BadgerMaps",description:"YouthMappers chapter at UW-Madison",id:"ym-UW-Madison",featureId:"UW-Madison",contacts:[{name:"Organizer",email:"uwbadgermaps@gmail.com"}],extendedDescription:"BadgerMaps is the UW campus chapter of Youthmappers, an organization dedicated to humanitarian and community mapping services. We connect our volunteer network with opportunities to create GIS data for projects that need it.",countryCodes:["us"],url:"https://www.facebook.com/UW-BadgerMaps-197746270811951/"},"ym-Vassar-College":{type:"youthmappers",name:"Hudson Valley Mappers",description:"YouthMappers chapter at Vassar College",id:"ym-Vassar-College",featureId:"Vassar-College",contacts:[{name:"Organizer",email:"geo@vassar.edu"}],extendedDescription:"Our mission is to provide a multi-disciplinary platform for peers, educators, and community organizations to engage in local mapping projects with a focus on strengthening our local ecosystems, our built environment, and the health of our community. We also seek to contribute geospatial support for global humanitarian aid and development efforts.",countryCodes:["us"],url:"http://pages.vassar.edu/gis/vassar-youthmappers/"},"ym-Villanova-University":{type:"youthmappers",name:"The Villanova Globeplotters",description:"YouthMappers chapter at Villanova University",id:"ym-Villanova-University",featureId:"Villanova-University",contacts:[{name:"Organizer",email:"villanova.globeplotters@gmail.com"}],extendedDescription:"The Villanova Globeplotters is built on Villanova’s Augustinian principle of selfless-service to the global community. Mixed with relaxed social interaction, we strive to provide geospatial outreach to those in need regardless of participating students’ race, academic major, student group association, or college career level.",countryCodes:["us"],url:"mailto:villanova.globeplotters@gmail.com"},"ym-West-Virginia-University":{type:"youthmappers",name:"Maptime Morgantown",description:"YouthMappers chapter at West Virginia University",id:"ym-West-Virginia-University",featureId:"West-Virginia-University",contacts:[{name:"Organizer",email:"maptimemorgantown@gmail.com"}],extendedDescription:"Working as a collaborative team, this co-founding chapter focuses on providing an open learning environment for those interested in working on projects that intersect international development, emergency response, and geographic information science.\nThey connect beginners and experts by providing technical training and experience in building meaningful and useful geographic infrastructure data, while connecting to sister cities around the world.",countryCodes:["us"],url:"mailto:MaptimeMorgantown@gmail.com?subject=Maptime%20Morgantown%20from%20YouthMappers%20website"},"ym-Western-Michigan-University":{type:"youthmappers",name:"Geography Club",description:"YouthMappers chapter at Western Michigan University",id:"ym-Western-Michigan-University",featureId:"Western-Michigan-University",contacts:[{name:"Organizer",email:"wmu.geog.club@gmail.com"}],countryCodes:["us"],url:"http://www.facebook.com/groups/WMUGeographyClub/"},"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"}]},"Maptime-Oceania-Slack":{id:"Maptime-Oceania-Slack",featureId:"oceania_full",type:"slack",countryCodes:["au","nz"],languageCodes:["en"],name:"Maptime Oceania Slack",description:"Sign up at {signupUrl}",signupUrl:"https://bit.ly/maptimeau",url:"https://maptimeoceania.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-nz":{id:"talk-nz",featureId:"new_zealand_full",type:"mailinglist",countryCodes:["nz"],languageCodes:["en"],name:"Talk-nz Mailing List",description:"New Zealand's OSM community talk",url:"https://lists.openstreetmap.org/listinfo/talk-nz",contacts:[{name:"Talk NZ Owner",email:"talk-nz-owner@openstreetmap.org"}]},"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://webchat.oftc.net/?channels=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"}]},"RS-telegram":{id:"RS-telegram",featureId:"rs_br",type:"telegram",name:"OpenStreetMap Rio Grande do Sul Telegram Group",countryCodes:["br"],languageCodes:["pt"],description:"Join the OpenStreetMap Rio Grande do Sul 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/osmrs",contacts:[{name:"No one",email:"nobody@nowhere.org"}]},"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"}]},"ym-Universidad-de-Antioquia":{type:"youthmappers",name:"Geomatica UDEA",description:"YouthMappers chapter at Universidad de Antioquia",id:"ym-Universidad-de-Antioquia",featureId:"Universidad-de-Antioquia",contacts:[{name:"Organizer",email:"geomatica.ing.udea@gmail.com"}],extendedDescription:"We are a group interested in geospatial data, voluntary cartography, and participating in mapping with others in our country and within the YouthMappers network.",countryCodes:["co"],url:"mailto:geomatica.ing.udea@gmail.com?subject=YouthMappers%20y%20Universidad%20de%20Antioquia"},"ym-Universidad-de-La-Guajira":{type:"youthmappers",name:"Grupo Mesh",description:"YouthMappers chapter at Universidad de La Guajira",id:"ym-Universidad-de-La-Guajira",featureId:"Universidad-de-La-Guajira",contacts:[{name:"Organizer",email:"zoviedo@uniguajira.edu.co"}],extendedDescription:"Grupo Mesh is a student organization at the Universidad de la Guajira in Colombia, including students from the program of Environmental Engineering who learn cartography and open mapping.",countryCodes:["co"],url:"mailto:zoviedo@uniguajira.edu.co?subject=Grupo%20Mesh%20y%20YouthMappers"},"ym-Universidad-de-Los-Andes":{type:"youthmappers",name:"Cartografos Uniandes",description:"YouthMappers chapter at Universidad de Los Andes",id:"ym-Universidad-de-Los-Andes",featureId:"Universidad-de-Los-Andes",contacts:[{name:"Organizer",email:"geografia@uniandes.edu.co"}],extendedDescription:"We are a circle of student participation that seeks to use mapping and spatial reasoning as a means to create bonds of cooperation and integration between the university and society by addressing different spatial, social, political , economic and cultural dynamics.",countryCodes:["co"],url:"mailto:geografia@uniandes.edu.co?subject=Youth%20Mappers%20Chapter%20y%20la%20Universidad%20de%20los%20Andes"},"ym-Universidad-de-San-Buenaventura":{type:"youthmappers",name:"YouthMappers San Buenaventura",description:"YouthMappers chapter at Universidad de San Buenaventura",id:"ym-Universidad-de-San-Buenaventura",featureId:"Universidad-de-San-Buenaventura",contacts:[{name:"Organizer",email:"ingenieria.sistemas@usbmed.edu.co"}],extendedDescription:"We are pleased to join YouthMappers mapping for a better world and community.",countryCodes:["co"],url:"https://www.facebook.com/groups/1742657446017065/"},"ym-Universidad-Distrital-Francisco-Jose-de-Caldas":{type:"youthmappers",name:"YouthMappers at Bogota",description:"YouthMappers chapter at Universidad Distrital Francisco Jose de Caldas",id:"ym-Universidad-Distrital-Francisco-Jose-de-Caldas",featureId:"Universidad-Distrital-Francisco-Jose-de-Caldas",contacts:[{name:"Organizer",email:"lrocha@selper.org.co"}],extendedDescription:"The Universidad Distrital Francisco José de Caldas is a public, coeducational, research university based in Bogotá, Colombia with a population of 26,140 students.",countryCodes:["co"],url:"mailto:lrocha@selper.org.co"},"ym-Universidad-Nacional-de-Colombia":{type:"youthmappers",name:"Grupo UN",description:"YouthMappers chapter at Universidad Nacional de Colombia",id:"ym-Universidad-Nacional-de-Colombia",featureId:"Universidad-Nacional-de-Colombia",contacts:[{name:"Organizer",email:"raknudsono@unal.edu.co"}],extendedDescription:"Students are uniting to map and network with university students across the country of Colombia and across the globe.  Geographic specialties include affiliation with microbiology and health disciplines.",countryCodes:["co"],url:"mailto:raknudsono@unal.edu.co?subject=Youth%20Mappers%20y%20Grupo%20UN%20Colombia"},"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"}]},"uy-forum":{id:"uy-forum",type:"forum",featureId:"uruguay",countryCodes:["uy"],languageCodes:["es"],name:"OpenStreetMap UY forum",description:"OpenStreetMap Uruguay web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=78",contacts:[{name:"UY community",email:"talk-uy-owner@openstreetmap.org"}]},"uy-irc":{id:"uy-irc",featureId:"uruguay",type:"irc",name:"OpenStreetMap Uruguay on IRC",countryCodes:["uy"],languageCodes:["es"],description:"Join #osmuruguay on irc.freenode.org (port 6667)",extendedDescription:"Join #osmuruguay on irc.freenode.org",url:"https://webchat.freenode.net/?url=irc://irc.freenode.net/osmuruguay",contacts:[{name:"UY community",email:"talk-uy-owner@openstreetmap.org"}]},"uy-mailinglist":{id:"uy-mailinglist",featureId:"uruguay",type:"mailinglist",name:"Talk-uy Mailing List",countryCodes:["uy"],languageCodes:["es"],description:"Talk-uy is the official mailing list for the Uruguayan OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-uy",contacts:[{name:"UY community",email:"talk-uy-owner@openstreetmap.org"}]},"LATAM-Facebook":{id:"LATAM-Facebook",featureId:"latam",type:"facebook",languageCodes:["es","pt"],name:"OpenStreetMap Latam Facebook",description:"OpenStreetMap Latam on Facebook",url:"https://www.facebook.com/osmlatam/",contacts:[{name:"OSM LATAM",email:"info@osmlatam.org"}]},"LATAM-Telegram":{id:"LATAM-Telegram",featureId:"latam",type:"telegram",languageCodes:["es","pt"],name:"OpenStreetMap Latam Telegram",description:"OpenStreetMap Telegram for Latin America",url:"https://t.me/OSMLatam",contacts:[{name:"OSM LATAM",email:"info@osmlatam.org"}]},"LATAM-Twitter":{id:"LATAM-Twitter",featureId:"latam",type:"twitter",languageCodes:["es","pt"],name:"OpenStreetMap Latam Twitter",description:"Follow us on Twitter at {url}",url:"https://twitter.com/osmlatam",contacts:[{name:"OSM LATAM",email:"info@osmlatam.org"}]},"osm-latam":{id:"osm-latam",featureId:"latam",type:"group",languageCodes:["es","pt"],name:"OpenStreetMap Latam",description:"Supporting OpenStreetMap in Latin America",url:"https://osmlatam.org/",contacts:[{name:"OSM LATAM",email:"info@osmlatam.org"}],events:[{id:"sotm-latam-2018",i18n:true,name:"State of the Map Latam 2018",description:"State of the Map Latam is the annual conference for all mappers and users of OpenStreetMap in Latin America. The program includes talks, panels, workshops, and mapathons related to OpenStreetMap.",where:"Buenos Aires, Argentina",when:"2018-sep-24",url:"https://state.osmlatam.org/"}]},"OSM-Discord":{id:"OSM-Discord",type:"discord",languageCodes:["en"],name:"OpenStreetMap Discord",description:"Get in touch with other mappers via Discord",url:"https://discord.gg/SRZUYUz",contacts:[{name:"Austin Harrison",email:"jaustinharrison@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-IRC":{id:"OSM-IRC",type:"irc",languageCodes:["en"],name:"OpenStreetMap IRC",description:"Join #osm on irc.oftc.net (port 6667)",url:"https://webchat.oftc.net/?channels=osm",contacts:[{name:"Harry Wood",email:"mail@harrywood.co.uk"}]},"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/"}]}};
24699
24700         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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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/rest/services/actmapi/imagery2017mga/ImageServer/exportImage?f=image&format=jpeg&imageSR=3857&bboxSR=3857&bbox={bbox}&size={width},{height}&foo={proj}",projection:"EPSG:3857",endDate:"2017-05-01T00:00:00.000Z",startDate:"2017-05-01T00:00:00.000Z",zoomExtent:[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",icon:"http://actmapi.act.gov.au/img/apple-touch-icon.png"},{id:"ACT2018",name:"ACTmapi Imagery 2018",type:"wms",template:"https://data.actmapi.act.gov.au/arcgis/rest/services/actmapi/imagery2018mga/ImageServer/exportImage?f=image&format=jpeg&imageSR=3857&bboxSR=3857&bbox={bbox}&size={width},{height}&foo={proj}",projection:"EPSG:3857",endDate:"2018-03-19T00:00:00.000Z",startDate:"2018-03-19T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[149.2695,-35.4381],[149.2669,-35.348],[149.3329,-35.3468],[149.3334,-35.3648],[149.3774,-35.364],[149.3769,-35.3459],[149.3989,-35.3455],[149.3984,-35.3275],[149.4094,-35.3273],[149.4088,-35.3092],[149.3978,-35.3095],[149.3973,-35.2914],[149.3533,-35.2923],[149.3528,-35.2743],[149.3089,-35.2751],[149.3084,-35.2571],[149.2644,-35.2579],[149.2634,-35.2219],[149.2415,-35.2223],[149.241,-35.2043],[149.219,-35.2047],[149.218,-35.1687],[149.1961,-35.1691],[149.1956,-35.151],[149.1737,-35.1514],[149.1732,-35.1334],[149.1512,-35.1338],[149.1508,-35.1158],[149.085,-35.1169],[149.0854,-35.135],[149.0635,-35.1353],[149.0639,-35.1534],[149.0201,-35.1541],[149.0205,-35.1721],[148.9985,-35.1725],[148.999,-35.1905],[148.9331,-35.1916],[148.934,-35.2276],[148.912,-35.228],[148.9124,-35.246],[148.8685,-35.2467],[148.8689,-35.2647],[148.8469,-35.265],[148.8473,-35.2831],[148.8034,-35.2837],[148.8038,-35.3018],[148.7818,-35.3021],[148.7838,-35.3922],[148.8058,-35.3919],[148.8086,-35.5181],[148.7976,-35.5182],[148.7994,-35.5993],[148.8766,-35.5982],[148.8747,-35.517],[148.8527,-35.5174],[148.8508,-35.4363],[148.8398,-35.4364],[148.8388,-35.3914],[149.0039,-35.3888],[149.0048,-35.4248],[149.0268,-35.4244],[149.0277,-35.4605],[149.0497,-35.4601],[149.0511,-35.5142],[149.1613,-35.5122],[149.1594,-35.4402],[149.2695,-35.4381]]],terms_text:"© Jacobs Group (Australia) Pty Ltd and Australian Capital Territory",best:true,icon:"http://actmapi.act.gov.au/img/apple-touch-icon.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",zoomExtent:[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:"AIV_DHMV_II_HILL_25cm",name:"AIV Digitaal Hoogtemodel Vlaanderen II, multidirectionale hillshade 0,25 m",type:"wms",template:"https://geoservices.informatievlaanderen.be/raadpleegdiensten/dhmv/wms?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=DHMV_II_HILL_25cm&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:"© agentschap Informatie Vlaanderen",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/BE_GRB_Flanders_TMS.png"},{id:"AIV_DHMV_II_SVF_25cm",name:"AIV Digitaal Hoogtemodel Vlaanderen II, Skyview factor 0,25 m",type:"wms",template:"https://geoservices.informatievlaanderen.be/raadpleegdiensten/dhmv/wms?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=DHMV_II_SVF_25cm&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:"© agentschap Informatie Vlaanderen",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/BE_GRB_Flanders_TMS.png"},{id:"AGIV10cm",name:"AIV 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:"© agentschap Informatie Vlaanderen",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/BE_GRB_Flanders_TMS.png"},{id:"AGIVFlandersGRB",name:"AIV 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}",zoomExtent:[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:"© agentschap Informatie Vlaanderen",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/BE_GRB_Flanders_TMS.png"},{id:"AGIV",name:"AIV 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}",zoomExtent:[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:"© agentschap Informatie Vlaanderen",best:true,icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/BE_GRB_Flanders_TMS.png"},{id:"alagoas_litoral",name:"Alagoas Litoral 2006",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"arapiraca_al",name:"Arapiraca AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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-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",zoomExtent:[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:"basemap.at-overlay",name:"basemap.at Overlay",type:"tms",template:"https://maps{switch:1,2,3,4}.wien.gv.at/basemap/bmapoverlay/normal/google3857/{zoom}/{y}/{x}.png",zoomExtent:[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-surface",name:"basemap.at Surface",type:"tms",template:"https://maps{switch:1,2,3,4}.wien.gv.at/basemap/bmapoberflaeche/grau/google3857/{zoom}/{y}/{x}.jpeg",zoomExtent:[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:"Surface layer provided by basemap.at.",icon:"https://www.basemap.at/images/logo_basemap.jpg"},{id:"basemap.at-terrain",name:"basemap.at Terrain",type:"tms",template:"https://maps{switch:1,2,3,4}.wien.gv.at/basemap/bmapgelaende/grau/google3857/{zoom}/{y}/{x}.jpeg",zoomExtent:[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:"Terrain layer provided by basemap.at.",icon:"https://www.basemap.at/images/logo_basemap.jpg"},{id:"bavaria-80cm",name:"Bavaria (80 cm)",type:"wms",template:"https://geoservices.bayern.de/wms/v2/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",zoomExtent:[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",zoomExtent:[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,description:"This imagery is provided via a proxy operated by https://sosm.ch/"},{id:"route500hydro",name:"BD Carthage",type:"tms",template:"https://{switch:a,b,c}.tile.openstreetmap.fr/route500hydro/{zoom}/{x}/{y}.png",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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-08-03T00:00:00.000Z",startDate:"2015-08-02T00: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-04-03T00:00:00.000Z",startDate:"2016-04-02T00: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-2016-infrared",name:"Berlin aerial photography 2016 (infrared)",type:"tms",template:"https://tiles.codefor.de/berlin-2016i/{zoom}/{x}/{y}.png",endDate:"2016-04-03T00:00:00.000Z",startDate:"2016-04-02T00: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 2016"},{id:"Berlin-2017",name:"Berlin aerial photography 2017",type:"tms",template:"https://tiles.codefor.de/berlin-2017/{zoom}/{x}/{y}.png",endDate:"2017-03-28T00:00:00.000Z",startDate:"2017-03-27T00: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"},{id:"Berlin-2018",name:"Berlin aerial photography 2018",type:"tms",template:"https://tiles.codefor.de/berlin-2018/{zoom}/{x}/{y}.png",endDate:"2018-04-07T00:00:00.000Z",startDate:"2018-03-19T00: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 2018",best:true},{id:"Bing",name:"Bing aerial imagery",type:"bing",template:"https://www.bing.com/maps",zoomExtent:[1,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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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",zoomExtent:[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",zoomExtent:[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 : 2019",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",zoomExtent:[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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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",zoomExtent:[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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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",zoomExtent:[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",zoomExtent:[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'",description:"This imagery is provided via a proxy operated by https://sosm.ch/"},{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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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",zoomExtent:[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:"BDGEx_ctm_multi",name:"Cartas Topográficas do Exército Brasileiro",type:"wms",template:"https://bdgex.eb.mil.br/mapcache?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ctmmultiescalas_mercator&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[1,22],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]]],terms_text:"BDGEx",icon:"https://osmlab.github.io/editor-layer-index/sources/south-america/br/Exercito.png"},{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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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:"City_of_Melbourne_May_2018",name:"City of Melbourne",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/openstreetmapau.gdbhzo3g/{zoom}/{x}/{y}.jpg?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcGF1IiwiYSI6ImNqbWl3bXZ6aDA0MTkzd21xdnV1d2k0azEifQ.HYkMOqH_E2fYd1b0oXRe6w",endDate:"2018-05-01T00:00:00.000Z",startDate:"2018-05-01T00:00:00.000Z",zoomExtent:[10,22],polygon:[[[144.9146,-37.79929],[144.9139,-37.79888],[144.91276,-37.79858],[144.91138,-37.79876],[144.90975,-37.79976],[144.90604,-37.80641],[144.90428,-37.81261],[144.9042,-37.81421],[144.90561,-37.82089],[144.90426,-37.82245],[144.89902,-37.82728],[144.89686,-37.83007],[144.89598,-37.83355],[144.89602,-37.83873],[144.89703,-37.84192],[144.90113,-37.84692],[144.9052,-37.85019],[144.90684,-37.85056],[144.90802,-37.8502],[144.9084,-37.84948],[144.90701,-37.84771],[144.90763,-37.84693],[144.90448,-37.84165],[144.90529,-37.84139],[144.90806,-37.8458],[144.91181,-37.8502],[144.91274,-37.85039],[144.91548,-37.84892],[144.91553,-37.84814],[144.91396,-37.84594],[144.91619,-37.84451],[144.91396,-37.84131],[144.91634,-37.83985],[144.91651,-37.83841],[144.91508,-37.83441],[144.91829,-37.83307],[144.91947,-37.83258],[144.92102,-37.83087],[144.92186,-37.83002],[144.92297,-37.8295],[144.92937,-37.82816],[144.93529,-37.82702],[144.94112,-37.82692],[144.94181,-37.82679],[144.94585,-37.8275],[144.94707,-37.82794],[144.94784,-37.82779],[144.95786,-37.82953],[144.95921,-37.82941],[144.9613,-37.82902],[144.96254,-37.82972],[144.96477,-37.83184],[144.96565,-37.83229],[144.96621,-37.83231],[144.97033,-37.83121],[144.97052,-37.83228],[144.97106,-37.83307],[144.97346,-37.83507],[144.97428,-37.83595],[144.97943,-37.85002],[144.97968,-37.85081],[144.98061,-37.85117],[144.98425,-37.85151],[144.98483,-37.85139],[144.98537,-37.85085],[144.98923,-37.83109],[144.98891,-37.83038],[144.99226,-37.81041],[144.99243,-37.80983],[144.99187,-37.80895],[144.97449,-37.80714],[144.97683,-37.79327],[144.97674,-37.7928],[144.97642,-37.79232],[144.97589,-37.79219],[144.96977,-37.79146],[144.97076,-37.78566],[144.97041,-37.785],[144.9699,-37.78477],[144.96488,-37.7842],[144.96511,-37.78252],[144.96507,-37.78198],[144.96421,-37.78142],[144.96398,-37.78082],[144.96389,-37.77964],[144.96355,-37.7785],[144.96267,-37.77779],[144.96136,-37.77724],[144.93919,-37.77456],[144.93836,-37.77458],[144.93801,-37.77485],[144.93728,-37.77601],[144.93658,-37.77692],[144.93613,-37.77728],[144.93598,-37.77791],[144.93778,-37.78142],[144.93827,-37.78421],[144.93911,-37.78654],[144.93885,-37.78672],[144.93881,-37.7873],[144.93773,-37.78801],[144.93216,-37.7874],[144.93123,-37.78783],[144.93076,-37.78786],[144.93003,-37.78735],[144.92181,-37.78642],[144.91488,-37.77938],[144.91428,-37.77865],[144.9137,-37.77853],[144.91293,-37.77855],[144.90819,-37.78135],[144.90722,-37.78206],[144.90572,-37.7845],[144.90529,-37.78637],[144.90428,-37.78657],[144.90375,-37.78718],[144.90319,-37.78827],[144.90201,-37.78883],[144.90143,-37.78964],[144.90188,-37.79103],[144.90257,-37.79198],[144.90415,-37.79288],[144.90645,-37.79383],[144.90814,-37.79456],[144.91046,-37.79519],[144.9127,-37.79605],[144.91429,-37.79695],[144.91525,-37.79783],[144.91539,-37.79815],[144.91531,-37.79848],[144.91518,-37.79872],[144.9148,-37.79914],[144.9146,-37.79929]]],terms_url:"https://data.melbourne.vic.gov.au/Property-Planning/2018-Aerial-Imagery-True-Ortho-/qa5h-sfgh",terms_text:"City of Melbourne",best:true,icon:"https://www.melbourne.vic.gov.au/_catalogs/masterpage/android-icon.png"},{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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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:"https://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",zoomExtent:[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",zoomExtent:[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:"DCGIS-County-Imagery-2017-Fall-Leaf-Off-6-Inch",name:"Dakota County GIS 2017 Fall Leaf-Off 6-Inch",type:"wms",template:"https://gisimg.co.dakota.mn.us/arcgis/services/AerialPhotography/2017AirPhotoLeafOff6Inch/ImageServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=2017AirPhotoLeafOff6Inch:None&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",zoomExtent:[5,20],polygon:[[[-93.32967,44.79107],[-93.32964,44.63037],[-93.28189,44.63074],[-93.28169,44.47194],[-93.28176,44.47137],[-93.0395,44.47103],[-93.03924,44.51125],[-92.91932,44.51049],[-92.91899,44.54325],[-92.79268,44.54324],[-92.7926,44.62971],[-92.73207,44.62948],[-92.73122,44.71411],[-92.80342,44.74652],[-92.82767,44.75056],[-92.85209,44.74695],[-92.85959,44.75359],[-92.87724,44.77283],[-92.88149,44.77492],[-92.9049,44.77408],[-92.92808,44.78111],[-92.93969,44.77563],[-92.94843,44.76786],[-92.95859,44.76724],[-92.98604,44.77501],[-92.99291,44.77517],[-93.00306,44.77206],[-93.01685,44.77635],[-93.02153,44.79431],[-93.00523,44.81541],[-93.0119,44.83657],[-93.00859,44.85652],[-93.01041,44.86586],[-93.02074,44.89279],[-93.0309,44.8967],[-93.04083,44.90391],[-93.04445,44.91514],[-93.04725,44.9195],[-93.04724,44.92318],[-93.12863,44.92335],[-93.12882,44.91965],[-93.13257,44.91243],[-93.1641,44.89048],[-93.18289,44.8872],[-93.20075,44.86486],[-93.20325,44.85263],[-93.22179,44.83825],[-93.25188,44.81146],[-93.28177,44.80611],[-93.30453,44.7945],[-93.32645,44.79245],[-93.32961,44.79107],[-93.32967,44.79107]]],terms_url:"https://dakotacounty.us",terms_text:"Dakota County GIS",icon:"https://www.co.dakota.mn.us//SiteAssets/DakotaCountyLogo_W.png"},{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",zoomExtent:[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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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:"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:"tms",template:"https://osm.rrze.fau.de/protected/YgktSWTTo6HS9nKi/lbe2016/{zoom}/{x}/{y}.jpg",endDate:"2016-03-18T00:00:00.000Z",startDate:"2016-03-18T00:00:00.000Z",zoomExtent:[0,21],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"},{id:"Erlangen-2018",name:"Erlangen Luftbild (2018 5,0 cm)",type:"tms",template:"https://osm.rrze.fau.de/protected/YgktSWTTo6HS9nKi/lbe2018/{zoom}/{x}/{y}.jpg",endDate:"2018-04-09T00:00:00.000Z",startDate:"2018-04-09T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[10.85157,49.55172],[10.93037,49.55272],[10.9326,49.55818],[10.91627,49.55882],[10.91144,49.56652],[10.92281,49.60584],[10.9108,49.63751],[10.92775,49.64838],[10.94444,49.64321],[10.96487,49.63317],[10.96384,49.62711],[10.9745,49.62483],[10.9786,49.61794],[10.98478,49.61694],[10.998,49.62228],[11.00813,49.62194],[11.0071,49.61449],[11.01448,49.61394],[11.02081,49.62292],[11.05757,49.63993],[11.08136,49.62614],[11.08312,49.62034],[11.10419,49.61524],[11.11767,49.61449],[11.11997,49.60377],[11.13132,49.60348],[11.1272,49.58815],[11.10271,49.58378],[11.08898,49.59124],[11.07988,49.60837],[11.05808,49.60971],[11.06049,49.59803],[11.06512,49.59614],[11.0689,49.58879],[11.06031,49.58556],[11.04469,49.58913],[11.03851,49.58556],[11.03577,49.57276],[11.03937,49.55785],[11.04272,49.5432],[11.03465,49.5324],[10.97531,49.53467],[10.97158,49.53084],[10.94279,49.52986],[10.94273,49.50582],[10.92163,49.50566],[10.91245,49.51829],[10.88818,49.52834],[10.87518,49.51725],[10.84872,49.52291],[10.84652,49.52797],[10.84637,49.53223],[10.85157,49.55172]]],terms_text:"© Stadt Erlangen | © Hansa Luftbild AG",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}",zoomExtent:[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}",zoomExtent:[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",zoomExtent:[6,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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"eufar-balaton",name:"EUFAR Balaton orthophotos",type:"tms",template:"http://e.tile.openstreetmap.hu/balaton/0/{zoom}/{x}/{y}.jpg",endDate:"2010-08-31T00:00:00.000Z",startDate:"2010-08-01T00:00:00.000Z",zoomExtent:[12,19],polygon:[[[18.17918,46.98502],[18.17773,47.01816],[18.08176,47.05643],[18.10281,47.06311],[18.08152,47.09344],[18.06436,47.09049],[18.03537,47.07983],[18.03344,47.08262],[17.9582,47.05567],[17.99436,47.00449],[17.86441,46.95517],[17.80274,47.0103],[17.67184,46.97207],[17.23875,46.77079],[17.22244,46.6796],[17.47175,46.70306],[18.16735,46.94133],[18.17918,46.98502]]],terms_url:"http://www.bli.okologia.mta.hu/",terms_text:"EUFAR Balaton ortofotó 2010",best:true,description:"1940 geo-tagged photography from Balaton Limnological Institute."},{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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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.din.developpement-durable.gouv.fr/wxs?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.din.developpement-durable.gouv.fr/wxs?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.din.developpement-durable.gouv.fr/wxs?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:"https://{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",zoomExtent:[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",zoomExtent:[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:"https://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}",zoomExtent:[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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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",zoomExtent:[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:"https://wms.openstreetmap.de/tms/GURS-building-outlines/{zoom}/{x}/{y}.png",zoomExtent:[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.38,45.5666],[13.63822,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 ©2019 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:"https://wms.openstreetmap.de/tms/GURS-road-lines/{zoom}/{x}/{y}.png",zoomExtent:[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.38,45.5666],[13.63822,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 ©2019 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",zoomExtent:[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",zoomExtent:[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:"helsingborg-orto",name:"Helsingborg Orthophoto",type:"tms",template:"http://mapproxy.openstreetmap.se/tiles/1.0.0/hborg2016_EPSG3857/{zoom}/{x}/{y}.jpeg",zoomExtent:[5,20],polygon:[[[12.74345,55.94997],[12.93777,55.90804],[13.00369,55.96842],[12.79083,56.25022],[12.56698,56.1356],[12.74345,55.94997]]],terms_url:"https://helsingborg.opendatasoft.com/",terms_text:"© Helsingborg municipality",best:true,description:"Orthophotos from the municipality of Helsingborg 2016, public domain",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/1/18/Helsingborg_vapen.svg/198px-Helsingborg_vapen.svg.png"},{id:"hri-orto",name:"Helsinki region orthophoto",type:"wms",template:"https://kartta.hsy.fi/geoserver/ows?SERVICE=WMS&FORMAT=image/jpeg&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=taustakartat_ja_aluejaot:Ortoilmakuva_2017&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,19],polygon:[[[24.26948,59.8593],[24.26674,60.22549],[24.55307,60.36703],[24.50363,60.49038],[24.76387,60.60079],[25.00625,60.54175],[24.90051,60.38197],[24.9884,60.35073],[25.06943,60.44096],[25.17517,60.45248],[25.18066,60.34122],[25.27954,60.2943],[25.19577,60.08813],[24.26948,59.8593]]],terms_url:"https://hri.fi/data/en_GB/dataset/paakaupunkiseudun-ortokuva-2017",terms_text:"© Espoon, Helsingin ja Vantaan kaupungit, Kirkkonummen ja Nurmijärven kunnat sekä HSL ja HSY",best:true,description:"Ortophotos from the municipalities of Espoo, Helsinki, Vantaa, Kirkkonummi and Nurmijärvi + HSL and HSY",icon:"https://raw.githubusercontent.com/osmlab/editor-layer-index/gh-pages/sources/europe/fi/hri_logo.png"},{id:"hu-hillshade",name:"Hillshade Hungary",type:"tms",template:"https://{switch:a,b,c}.map.turistautak.hu/tiles/shading/{zoom}/{x}/{y}.png",zoomExtent:[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",zoomExtent:[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.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJjaml5MjVyb3MwMWV0M3hxYmUzdGdwbzE4In0.q548FjhsSJzvXsGlPsFxAQ",zoomExtent:[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.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.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJjaml5MjVyb3MwMWV0M3hxYmUzdGdwbzE4In0.q548FjhsSJzvXsGlPsFxAQ",zoomExtent:[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.png"},{id:"IBGE_Nomes_Ruas",name:"IBGE Nomes de Ruas",type:"tms",template:"https://api.maptiler.com/maps/b2037b15-5614-4fed-9608-9830b8dc574a/256/{zoom}/{x}/{y}.png?key=YmPoUxbTlEHlrASzv56Z",zoomExtent:[4,22],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, OSM Brasil",icon:"https://osmlab.github.io/editor-layer-index/sources/south-america/br/IBGE.png",overlay:true},{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}",zoomExtent:[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}",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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_airphoto",name:"Japan GSI airphoto Imagery",type:"tms",template:"http://cyberjapandata.gsi.go.jp/xyz/airphoto/{zoom}/{x}/{y}.png",zoomExtent:[14,18],polygon:[[[140.88867,45.67548],[140.71289,45.41388],[141.04248,43.80282],[139.96582,43.35714],[138.99902,42.01665],[139.04297,41.26129],[137.5708,38.58253],[132.69287,36.86204],[130.84717,34.93999],[129.74854,34.994],[129.02344,34.56086],[128.36426,33.21112],[127.90283,31.87756],[128.4082,29.89781],[125.8374,26.78485],[123.33252,25.0657],[122.58545,24.42715],[123.53027,23.44309],[125.88135,24.10665],[129.96826,26.31311],[132.1875,30.20211],[134.42871,32.43561],[136.82373,33.28462],[137.85645,34.21634],[138.64746,33.24788],[138.58154,32.00808],[139.6582,28.67131],[141.65771,29.66896],[142.0752,32.06396],[141.21826,33.37641],[141.56982,35.44277],[141.43799,36.52729],[142.82227,39.16414],[143.04199,40.89691],[145.92041,42.40723],[146.18408,43.03678],[145.74463,43.54855],[145.32715,43.67582],[145.30518,43.91372],[145.61279,44.2452],[145.41504,44.62175],[144.38232,44.52784],[142.31689,45.53714],[141.3501,45.70618],[140.88867,45.67548]]],terms_url:"http://www.gsi.go.jp/kikakuchousei/kikakuchousei40182.html",terms_text:"GSI Japan",description:"Japan GSI airphoto Imagery. Not fully orthorectified, but a bit newer and/or differently covered than GSI ortho Imagery."},{id:"finds.jp_KBN_2500",name:"Japan GSI KIBAN 2500",type:"tms",template:"http://www.finds.jp/ws/tmc/1.0.0/KBN2500FN-900913-L/{zoom}/{x}/{y}.png",zoomExtent:[15,20],polygon:[[[140.88867,45.67548],[140.71289,45.41388],[141.04248,43.80282],[139.96582,43.35714],[138.99902,42.01665],[139.04297,41.26129],[137.5708,38.58253],[132.69287,36.86204],[130.84717,34.93999],[129.74854,34.994],[129.02344,34.56086],[128.36426,33.21112],[127.90283,31.87756],[128.4082,29.89781],[125.8374,26.78485],[123.33252,25.0657],[122.58545,24.42715],[123.53027,23.44309],[125.88135,24.10665],[129.96826,26.31311],[132.1875,30.20211],[134.42871,32.43561],[136.82373,33.28462],[137.85645,34.21634],[138.64746,33.24788],[138.58154,32.00808],[139.6582,28.67131],[141.65771,29.66896],[142.0752,32.06396],[141.21826,33.37641],[141.56982,35.44277],[141.43799,36.52729],[142.82227,39.16414],[143.04199,40.89691],[145.92041,42.40723],[146.18408,43.03678],[145.74463,43.54855],[145.32715,43.67582],[145.30518,43.91372],[145.61279,44.2452],[145.41504,44.62175],[144.38232,44.52784],[142.31689,45.53714],[141.3501,45.70618],[140.88867,45.67548]]],terms_url:"http://www.finds.jp/siteinfo/c_tou.html.ja",terms_text:"GSI KIBAN 2500",description:"GSI Kiban 2500 via finds.jp. Good for tracing, but a bit older."},{id:"gsi.go.jp",name:"Japan GSI ortho Imagery",type:"tms",template:"https://cyberjapandata.gsi.go.jp/xyz/ort/{zoom}/{x}/{y}.jpg",zoomExtent:[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",description:"Japan GSI ortho Imagery. Usually better than bing, but a bit older."},{id:"gsi.go.jp_seamlessphoto",name:"Japan GSI seamlessphoto Imagery",type:"tms",template:"https://cyberjapandata.gsi.go.jp/xyz/seamlessphoto/{zoom}/{x}/{y}.jpg",zoomExtent:[14,18],polygon:[[[140.88867,45.67548],[140.71289,45.41388],[141.04248,43.80282],[139.96582,43.35714],[138.99902,42.01665],[139.04297,41.26129],[137.5708,38.58253],[132.69287,36.86204],[130.84717,34.93999],[129.74854,34.994],[129.02344,34.56086],[128.36426,33.21112],[127.90283,31.87756],[128.4082,29.89781],[125.8374,26.78485],[123.33252,25.0657],[122.58545,24.42715],[123.53027,23.44309],[125.88135,24.10665],[129.96826,26.31311],[132.1875,30.20211],[134.42871,32.43561],[136.82373,33.28462],[137.85645,34.21634],[138.64746,33.24788],[138.58154,32.00808],[139.6582,28.67131],[141.65771,29.66896],[142.0752,32.06396],[141.21826,33.37641],[141.56982,35.44277],[141.43799,36.52729],[142.82227,39.16414],[143.04199,40.89691],[145.92041,42.40723],[146.18408,43.03678],[145.74463,43.54855],[145.32715,43.67582],[145.30518,43.91372],[145.61279,44.2452],[145.41504,44.62175],[144.38232,44.52784],[142.31689,45.53714],[141.3501,45.70618],[140.88867,45.67548]]],terms_url:"http://www.gsi.go.jp/kikakuchousei/kikakuchousei40182.html",terms_text:"GSI Japan seamless photo",description:"Japan GSI seamlessphoto Imagery. The collection of latest imageries of GSI ortho, airphoto, post disaster and others."},{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",zoomExtent:[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",description:"Japan GSI Standard Map. Widely covered."},{id:"juno-gps",name:"Juno GPS traces",type:"tms",template:"https://gps-tile.junolab.net/{zoom}/{x}/{y}.png",startDate:"2019-01-01T00:00:00.000Z",zoomExtent:[0,19],polygon:[[[-74.337,40.484],[-73.572,40.484],[-73.572,40.957],[-74.337,40.957],[-74.337,40.484]]],terms_url:"https://gps-tile.junolab.net/about.html",terms_text:"© 2019 Juno",description:"Juno drivers' GPS traces from two days ago, updated daily",icon:"https://osmlab.github.io/editor-layer-index/sources/north-america/us/ny/Juno-GPS.png",overlay:true},{id:"kalmar-orto-2014",name:"Kalmar North Orthophoto 2014",type:"wms",template:"https://kartportal.kalmar.se/arcgisserver/services/Ortofoto/Kalmar_2014/ImageServer/WMSServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[9,22],polygon:[[[16.28473,56.70827],[16.38856,56.70798],[16.40843,56.7615],[16.46269,56.75672],[16.47753,56.76023],[16.48815,56.77023],[16.48754,56.79231],[16.48254,56.79547],[16.47667,56.8223],[16.4687,56.82614],[16.48584,56.86271],[16.48809,56.87369],[16.45694,56.87786],[16.46288,56.88769],[16.42696,56.88757],[16.39809,56.89604],[16.36791,56.8952],[16.36717,56.85985],[16.36431,56.84636],[16.36001,56.83657],[16.34423,56.82532],[16.32675,56.79284],[16.26114,56.74422],[16.28473,56.70827]]],terms_url:"http://data-kalmar.opendata.arcgis.com/",terms_text:"© Kalmar municipality",best:true,description:"Orthophotos for the north coast of the municipality of Kalmar 2014",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/6/67/Kalmarvapen_1a.svg/206px-Kalmarvapen_1a.svg.png"},{id:"kalmar-orto-2016",name:"Kalmar South Orthophoto 2016",type:"wms",template:"https://kartportal.kalmar.se/arcgisserver/services/Ortofoto/Kalmar_2016/ImageServer/WMSServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[9,22],polygon:[[[16.156,56.45834],[16.11389,56.46083],[16.09246,56.46633],[16.0724,56.4662],[16.07126,56.51153],[16.08516,56.56847],[16.14417,56.63933],[16.21168,56.68491],[16.28412,56.71655],[16.25135,56.74358],[16.25045,56.75062],[16.29558,56.7512],[16.33516,56.72511],[16.38922,56.71885],[16.41137,56.67602],[16.4053,56.66294],[16.33101,56.625],[16.28048,56.613],[16.21561,56.51967],[16.156,56.45834]]],terms_url:"http://data-kalmar.opendata.arcgis.com/",terms_text:"© Kalmar municipality",best:true,description:"Orthophotos for the south coast of the municipality of Kalmar 2016",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/6/67/Kalmarvapen_1a.svg/206px-Kalmarvapen_1a.svg.png"},{id:"kalmar-orto-2018",name:"Kalmar Urban Orthophoto 2018",type:"wms",template:"https://kartportal.kalmar.se/arcgisserver/services/Ortofoto/Kalmar_2018/ImageServer/WMSServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2018-01-01T00:00:00.000Z",startDate:"2018-01-01T00:00:00.000Z",zoomExtent:[9,22],polygon:[[[16.3416,56.81756],[16.32773,56.7973],[16.36692,56.78706],[16.37105,56.79153],[16.36978,56.80511],[16.35645,56.8133],[16.3416,56.81756]],[[16.39207,56.79339],[16.4608,56.78944],[16.48817,56.79067],[16.4833,56.76986],[16.46612,56.76711],[16.45409,56.76774],[16.43173,56.77309],[16.43178,56.77663],[16.40554,56.77214],[16.39325,56.77349],[16.39207,56.79339]],[[16.29836,56.79102],[16.28796,56.7883],[16.27727,56.78367],[16.27623,56.77952],[16.2862,56.7761],[16.3108,56.77696],[16.3118,56.78086],[16.30364,56.78883],[16.29836,56.79102]],[[16.20686,56.63637],[16.22098,56.62389],[16.2453,56.62467],[16.26751,56.62951],[16.28724,56.63831],[16.37871,56.65462],[16.38806,56.6897],[16.38664,56.72867],[16.31586,56.72879],[16.29956,56.7219],[16.29331,56.70021],[16.26799,56.66889],[16.23945,56.66991],[16.2266,56.6624],[16.21411,56.64972],[16.20686,56.63637]],[[16.15172,56.67843],[16.15712,56.69334],[16.15268,56.70297],[16.13274,56.71254],[16.10987,56.71964],[16.08638,56.7112],[16.07969,56.70056],[16.08149,56.69566],[16.09534,56.69599],[16.12877,56.67766],[16.15172,56.67843]],[[15.97369,56.62759],[16.00164,56.63215],[16.04126,56.62999],[16.05658,56.62489],[16.06201,56.61794],[16.09186,56.60378],[16.10527,56.5926],[16.09581,56.58161],[16.03481,56.60405],[16.0305,56.61252],[16.0088,56.60223],[15.98755,56.59742],[15.98449,56.57141],[15.94887,56.57264],[15.91878,56.55184],[15.90892,56.55393],[15.89921,56.56867],[15.9188,56.57287],[15.94612,56.57491],[15.96371,56.59004],[15.9496,56.59724],[15.94308,56.60903],[15.95726,56.61598],[15.97589,56.62005],[15.97369,56.62759]]],terms_url:"http://data-kalmar.opendata.arcgis.com/",terms_text:"© Kalmar municipality",best:true,description:"Orthophotos for urban areas of the municipality of Kalmar 2018",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/6/67/Kalmarvapen_1a.svg/206px-Kalmarvapen_1a.svg.png"},{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",zoomExtent:[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",description:"This imagery is provided via a proxy operated by https://sosm.ch/"},{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",zoomExtent:[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",description:"This imagery is provided via a proxy operated by https://sosm.ch/"},{id:"Aargau-AGIS-2017",name:"Kanton Aargau 25cm (AGIS 2017)",type:"tms",template:"https://mapproxy.osm.ch/tiles/AGIS2017/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",zoomExtent:[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 OF2017",best:true,description:"This imagery is provided via a proxy operated by https://sosm.ch/"},{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",zoomExtent:[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,description:"This imagery is provided via a proxy operated by https://sosm.ch/"},{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",zoomExtent:[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",description:"This imagery is provided via a proxy operated by https://sosm.ch/"},{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",zoomExtent:[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,description:"This imagery is provided via a proxy operated by https://sosm.ch/"},{id:"Bern-dsm-hillshade-2015",name:"Kanton Bern, Digitales Oberflaechenmodell 50cm, Relief",type:"wms",template:"https://www.geoservice.apps.be.ch/geoservice2/services/a42geo/a42geo_hoehenwms_d_fk/MapServer/WmsServer?LAYERS=GEODB.LDOM50CM_LORELIEF&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&STYLES=default&FORMAT=image/jpeg&CRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[8,22],polygon:[[[6.82526,47.07901],[7.28497,46.74221],[7.06335,46.27329],[8.20129,46.43975],[8.44334,46.59001],[8.47595,46.76315],[8.41244,46.79841],[8.13984,46.7869],[7.96543,46.80687],[7.90089,46.8914],[7.97676,47.00414],[7.88784,47.05609],[7.90363,47.17665],[7.81952,47.29413],[7.55859,47.33231],[7.16583,47.31183],[6.82388,47.18131],[6.82526,47.07901]]],terms_text:"Digitales Oberflächenmodell LIDAR 50cm © Amt für Wald des Kantons Bern"},{id:"Bern-dtm-hillshade-2015",name:"Kanton Bern, Digitales Terrainmodell 50cm, Relief",type:"wms",template:"https://www.geoservice.apps.be.ch/geoservice2/services/a42geo/a42geo_hoehenwms_d_fk/MapServer/WmsServer?LAYERS=GEODB.LDTM50CM_LTRELIEF&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&STYLES=default&FORMAT=image/jpeg&CRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[8,22],polygon:[[[6.82526,47.07901],[7.28497,46.74221],[7.06335,46.27329],[8.20129,46.43975],[8.44334,46.59001],[8.47595,46.76315],[8.41244,46.79841],[8.13984,46.7869],[7.96543,46.80687],[7.90089,46.8914],[7.97676,47.00414],[7.88784,47.05609],[7.90363,47.17665],[7.81952,47.29413],[7.55859,47.33231],[7.16583,47.31183],[6.82388,47.18131],[6.82526,47.07901]]],terms_text:"Digitales Terrainmodell LIDAR 50cm © Amt für Wald des Kantons Bern"},{id:"KTGL_ORTHO_2013",name:"Kanton Glarus Orthophoto 2013",type:"wms",template:"https://wms.geo.gl.ch?LAYERS=ch.gl.imagery.orthofoto2013&STYLES=default&FORMAT=image/jpeg&CRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&VERSION=1.3.0&SERVICE=WMS&REQUEST=GetMap",projection:"EPSG:3857",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[8,22],polygon:[[[8.99094,47.18505],[8.94836,47.13462],[8.93738,47.05609],[8.87421,47.03363],[8.9415,46.93807],[8.86597,46.84423],[8.86459,46.80852],[8.91815,46.78596],[9.04587,46.80758],[9.245,46.8968],[9.26147,46.92213],[9.25186,47.01865],[9.2189,47.04673],[9.19693,47.12154],[9.06235,47.1505],[8.99094,47.18505]]],terms_text:"Kanton Glarus, Luftbild Orthofoto 2013"},{id:"KTGL_ORTHO_2015",name:"Kanton Glarus Orthophoto 2015",type:"wms",template:"https://wms.geo.gl.ch?LAYERS=ch.gl.imagery.orthofoto2015&STYLES=default&FORMAT=image/jpeg&CRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&VERSION=1.3.0&SERVICE=WMS&REQUEST=GetMap",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[8,22],polygon:[[[8.99094,47.18505],[8.94836,47.13462],[8.93738,47.05609],[8.87421,47.03363],[8.9415,46.93807],[8.86597,46.84423],[8.86459,46.80852],[8.91815,46.78596],[9.04587,46.80758],[9.245,46.8968],[9.26147,46.92213],[9.25186,47.01865],[9.2189,47.04673],[9.19693,47.12154],[9.06235,47.1505],[8.99094,47.18505]]],terms_text:"Kanton Glarus, Luftbild Orthofoto 2015"},{id:"KTGL_ORTHO_2017",name:"Kanton Glarus Orthophoto 2017",type:"wms",template:"https://wms.geo.gl.ch?LAYERS=ch.gl.imagery.orthofoto2017&STYLES=default&FORMAT=image/jpeg&CRS={proj}&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&VERSION=1.3.0&SERVICE=WMS&REQUEST=GetMap",projection:"EPSG:3857",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",zoomExtent:[8,22],polygon:[[[8.99094,47.18505],[8.94836,47.13462],[8.93738,47.05609],[8.87421,47.03363],[8.9415,46.93807],[8.86597,46.84423],[8.86459,46.80852],[8.91815,46.78596],[9.04587,46.80758],[9.245,46.8968],[9.26147,46.92213],[9.25186,47.01865],[9.2189,47.04673],[9.19693,47.12154],[9.06235,47.1505],[8.99094,47.18505]]],terms_text:"Kanton Glarus, Luftbild Orthofoto 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",zoomExtent:[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,description:"This imagery is provided via a proxy operated by https://sosm.ch/",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",zoomExtent:[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:"Solothurn-sogis2014-dom-wms",name:"Kanton Solothurn, DOM Relief 2014 50cm",type:"wms",template:"https://geoweb.so.ch/wms/wms_lidar?LAYERS=dom_relief2014_50cm&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/jpeg&CRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[8,22],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:"DOM Relief 2014 - Auflösung 50cm, WMS Solothurn (SOGIS)"},{id:"Solothurn-sogis2014-dtm-wms",name:"Kanton Solothurn, DTM Relief 2014 50cm",type:"wms",template:"https://geoweb.so.ch/wms/wms_lidar?LAYERS=dtm_relief2014_50cm&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/jpeg&CRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[8,22],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:"DTM Relief 2014 - Auflösung 50cm, WMS Solothurn (SOGIS)"},{id:"KTTHURGAU2017",name:"Kanton Thurgau OF 2017",type:"tms",template:"https://mapproxy.osm.ch/tiles/KTTHURGAU2017/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",zoomExtent:[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,description:"This imagery is provided via a proxy operated by https://sosm.ch/"},{id:"Zug-2011",name:"Kanton Zug 2011",type:"wms",template:"https://services.geo.zg.ch:443/ows/Orthofotos?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=zg.orthofoto_2011_kt_zg&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",zoomExtent:[10,21],polygon:[[[8.38726,47.10908],[8.38983,47.25303],[8.42944,47.25265],[8.42894,47.22567],[8.60057,47.22407],[8.60037,47.21507],[8.61357,47.21495],[8.61338,47.20594],[8.62658,47.20582],[8.62618,47.18783],[8.63934,47.18769],[8.63914,47.1787],[8.66555,47.17844],[8.66534,47.16943],[8.7049,47.16899],[8.70427,47.14203],[8.69105,47.14215],[8.69046,47.11516],[8.67731,47.1153],[8.67706,47.10634],[8.66389,47.10647],[8.66371,47.0975],[8.65052,47.09761],[8.65031,47.08863],[8.59764,47.08915],[8.59746,47.08015],[8.49204,47.0812],[8.49245,47.09917],[8.43969,47.09967],[8.43996,47.10863],[8.38726,47.10908]]],terms_text:"GIS Kanton Zug",best:true},{id:"Zug-2018",name:"Kanton Zug Gemeinde Zug Süd 2018",type:"wms",template:"https://services.geo.zg.ch:443/ows/Orthofotos?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=zg.orthofoto_2018_kt_zg&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",zoomExtent:[10,21],polygon:[[[8.50052,47.11291],[8.49638,47.11761],[8.49451,47.12364],[8.49538,47.12653],[8.50462,47.13724],[8.50322,47.13933],[8.50466,47.14722],[8.51099,47.15916],[8.56415,47.15299],[8.5652,47.14929],[8.54924,47.13843],[8.55098,47.12132],[8.50052,47.11291]]],terms_text:"GIS Kanton Zug",best:true},{id:"Zug-2016",name:"Kanton Zug Nord 2016",type:"wms",template:"https://services.geo.zg.ch:443/ows/Orthofotos?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=zg.orthofoto_2016_kt_zg&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",zoomExtent:[10,21],polygon:[[[8.41093,47.16521],[8.40759,47.16918],[8.40754,47.23725],[8.419,47.23722],[8.42336,47.22958],[8.43891,47.22945],[8.48056,47.2125],[8.5294,47.22688],[8.57951,47.22275],[8.57946,47.17083],[8.57535,47.14926],[8.56428,47.14944],[8.53594,47.15205],[8.50658,47.15268],[8.50686,47.162],[8.44723,47.16256],[8.41093,47.16521]]],terms_text:"GIS Kanton Zug",best:true},{id:"OGDLidarZH-DOM",name:"Kanton Zurich, Oberflächenschummerung 50cm",type:"wms",template:"https://wms.zh.ch/OGDLidarZH?FORMAT=image/jpeg&VERSION=1.3.0&SERVICE=WMS&REQUEST=GetMap&LAYERS=dom2014hillshade&CRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[8,22],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:"Geographisches Informationssystem des Kantons Zürich (GIS-ZH), Oberflächenschummerung"},{id:"OGDOrthoZH2016",name:"Kanton Zurich, Orthofoto ZH Frühjahr 2015/16 RGB 10cm",type:"wms",template:"https://wms.zh.ch/OGDOrthoZH?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&LAYERS=ortho_w_15&FORMAT=image/jpeg&CRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2016-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[8,22],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:"Geographisches Informationssystem des Kantons Zürich (GIS-ZH), Orthofoto ZH Frühjahr 2015/16 RGB"},{id:"OGDOrthoZH2015",name:"Kanton Zurich, Orthofoto ZH Sommer 2014/15 RGB 10cm",type:"wms",template:"https://wms.zh.ch/OGDOrthoZH?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&LAYERS=ortho_s_14&FORMAT=image/jpeg&CRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[8,22],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:"Geographisches Informationssystem des Kantons Zürich (GIS-ZH), Orthofoto ZH Sommer 2014/15 RGB"},{id:"OGDOrthoZH2018",name:"Kanton Zurich, Orthofoto ZH Sommer 2018 RGB 10cm",type:"wms",template:"https://wms.zh.ch/OGDOrthoZH?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&LAYERS=ortho&FORMAT=image/jpeg&CRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2018-01-01T00:00:00.000Z",startDate:"2018-01-01T00:00:00.000Z",zoomExtent:[8,22],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:"Geographisches Informationssystem des Kantons Zürich (GIS-ZH), Orthofoto ZH Sommer 2018 RGB",best:true},{id:"OGDLidarZH-DTM",name:"Kanton Zurich, Terrainschummerung 50cm",type:"wms",template:"https://wms.zh.ch/OGDLidarZH?FORMAT=image/jpeg&VERSION=1.3.0&SERVICE=WMS&REQUEST=GetMap&LAYERS=dtm2014hillshade&CRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[8,22],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:"Geographisches Informationssystem des Kantons Zürich (GIS-ZH), Terrainschummerung"},{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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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}",zoomExtent:[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",zoomExtent:[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}",zoomExtent:[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}",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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 1950–1980",type:"tms",template:"https://mapproxy.openstreetmap.se/tms/1.0.0/ek_EPSG3857/{zoom}/{x}/{-y}.jpeg",zoomExtent:[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://raw.githubusercontent.com/osmlab/editor-layer-index/gh-pages/sources/europe/se/lantmateriet_icon.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",zoomExtent:[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 1955–1965. Older and younger pictures may occur.",icon:"https://raw.githubusercontent.com/osmlab/editor-layer-index/gh-pages/sources/europe/se/lantmateriet_icon.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",zoomExtent:[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. Is under construction.",icon:"https://raw.githubusercontent.com/osmlab/editor-layer-index/gh-pages/sources/europe/se/lantmateriet_icon.png"},{id:"lantmateriet-topowebb",name:"Lantmäteriet Topographic Map",type:"tms",template:"https://api.lantmateriet.se/open/topowebb-ccby/v1/wmts/token/9b342b7d9f12d4ddb92277be9869d860/1.0.0/topowebb/default/3857/{zoom}/{y}/{x}.png",zoomExtent:[3,15],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:"Topographic map of Sweden 1:50 000",icon:"https://raw.githubusercontent.com/osmlab/editor-layer-index/gh-pages/sources/europe/se/lantmateriet_icon.png"},{id:"lu.geoportail.opendata.ortholatest",name:"Latest available ortho geoportail.lu",type:"tms",template:"https://{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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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:"linkoping-orto",name:"Linköping Orthophoto",type:"wms",template:"http://kartan.linkoping.se/wms?servicename=wms_ortofoto&FORMAT=image/jpeg&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Kommun_2010_25cm&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[13,20],polygon:[[[15.36884,58.6305],[15.41279,58.65623],[15.46635,58.6339],[15.54291,58.64408],[15.54119,58.60672],[15.58376,58.6414],[15.7592,58.55267],[15.76675,58.52006],[15.91438,58.51755],[16.08089,58.37148],[15.82718,58.30588],[15.84915,58.21449],[15.65861,58.15513],[15.56763,58.19134],[15.55939,58.14661],[15.50171,58.07679],[15.37777,58.05881],[15.28713,58.1031],[15.27203,58.13483],[15.35889,58.16455],[15.32387,58.38012],[15.24971,58.40027],[15.3582,58.47288],[15.36884,58.6305]]],terms_url:"https://www.linkoping.se/open/",terms_text:"© Linköping municipality",best:true,description:"Orthophotos from the municipality of Linköping 2010, open data",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/2/29/Linköping_vapen.svg/198px-Linköping_vapen.svg.png"},{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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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:"Loire_Atlantique-Orthophotos-2016",name:"Loire-Atlantique - Orthophotos 2016 - 10 cm",type:"wms",template:"https://wms-vuduciel2.makina-corpus.net/geoserver/wms?SERVICE=WMS&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=cg44:ortho44-2016&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",zoomExtent:[0,20],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:"© Loire-Atlantique ouverture des données publiques"},{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",zoomExtent:[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",zoomExtent:[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 2019",icon:"http://spatialservices.finance.nsw.gov.au/__data/assets/file/0010/210520/favicon.ico",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",zoomExtent:[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 2019",icon:"http://spatialservices.finance.nsw.gov.au/__data/assets/file/0010/210520/favicon.ico",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",zoomExtent:[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 2019",icon:"http://spatialservices.finance.nsw.gov.au/__data/assets/file/0010/210520/favicon.ico",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",zoomExtent:[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 2019",icon:"http://spatialservices.finance.nsw.gov.au/__data/assets/file/0010/210520/favicon.ico",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",zoomExtent:[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 2019",icon:"http://spatialservices.finance.nsw.gov.au/__data/assets/file/0010/210520/favicon.ico",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",zoomExtent:[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 2019",icon:"http://spatialservices.finance.nsw.gov.au/__data/assets/file/0010/210520/favicon.ico",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}",zoomExtent:[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 2019",icon:"http://spatialservices.finance.nsw.gov.au/__data/assets/file/0010/210520/favicon.ico"},{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}",zoomExtent:[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]],[[159.22678,-31.74407],[159.26398,-31.74399],[159.28989,-31.77428],[159.28993,-31.79393],[159.26157,-31.79395],[159.22682,-31.75483],[159.22678,-31.74407]],[[159.03784,-31.49819],[159.04448,-31.5006],[159.04619,-31.49734],[159.04888,-31.49829],[159.04884,-31.48423],[159.06882,-31.48423],[159.06991,-31.482],[159.08317,-31.48203],[159.08203,-31.48434],[159.08205,-31.49567],[159.08564,-31.49703],[159.08383,-31.50058],[159.09007,-31.5026],[159.08682,-31.50859],[159.09433,-31.51136],[159.09174,-31.51585],[159.09537,-31.51724],[159.10276,-31.52611],[159.1161,-31.53006],[159.11422,-31.5342],[159.11875,-31.53417],[159.1193,-31.54888],[159.12618,-31.55796],[159.11841,-31.56323],[159.11553,-31.55983],[159.1115,-31.55983],[159.11154,-31.60158],[159.08954,-31.6016],[159.08626,-31.60845],[159.07954,-31.60611],[159.07714,-31.61149],[159.05943,-31.61155],[159.05296,-31.60369],[159.05893,-31.59087],[159.05891,-31.57897],[159.05541,-31.57773],[159.05735,-31.57387],[159.05585,-31.57333],[159.05038,-31.57335],[159.05035,-31.56329],[159.0463,-31.5619],[159.04847,-31.55793],[159.04237,-31.55601],[159.04533,-31.55038],[159.03783,-31.54763],[159.03802,-31.54723],[159.03487,-31.54724],[159.03487,-31.54383],[159.03244,-31.54297],[159.03461,-31.53808],[159.02754,-31.53554],[159.02964,-31.53159],[159.02305,-31.52935],[159.03784,-31.49819]]],terms_url:"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services",terms_text:"© Land and Property Information 2019",best:true,icon:"http://spatialservices.finance.nsw.gov.au/__data/assets/file/0010/210520/favicon.ico"},{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",zoomExtent:[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]],[[159.22678,-31.74407],[159.26398,-31.74399],[159.28989,-31.77428],[159.28993,-31.79393],[159.26157,-31.79395],[159.22682,-31.75483],[159.22678,-31.74407]],[[159.03784,-31.49819],[159.04448,-31.5006],[159.04619,-31.49734],[159.04888,-31.49829],[159.04884,-31.48423],[159.06882,-31.48423],[159.06991,-31.482],[159.08317,-31.48203],[159.08203,-31.48434],[159.08205,-31.49567],[159.08564,-31.49703],[159.08383,-31.50058],[159.09007,-31.5026],[159.08682,-31.50859],[159.09433,-31.51136],[159.09174,-31.51585],[159.09537,-31.51724],[159.10276,-31.52611],[159.1161,-31.53006],[159.11422,-31.5342],[159.11875,-31.53417],[159.1193,-31.54888],[159.12618,-31.55796],[159.11841,-31.56323],[159.11553,-31.55983],[159.1115,-31.55983],[159.11154,-31.60158],[159.08954,-31.6016],[159.08626,-31.60845],[159.07954,-31.60611],[159.07714,-31.61149],[159.05943,-31.61155],[159.05296,-31.60369],[159.05893,-31.59087],[159.05891,-31.57897],[159.05541,-31.57773],[159.05735,-31.57387],[159.05585,-31.57333],[159.05038,-31.57335],[159.05035,-31.56329],[159.0463,-31.5619],[159.04847,-31.55793],[159.04237,-31.55601],[159.04533,-31.55038],[159.03783,-31.54763],[159.03802,-31.54723],[159.03487,-31.54724],[159.03487,-31.54383],[159.03244,-31.54297],[159.03461,-31.53808],[159.02754,-31.53554],[159.02964,-31.53159],[159.02305,-31.52935],[159.03784,-31.49819]]],terms_url:"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services",terms_text:"© Land and Property Information 2019",icon:"http://spatialservices.finance.nsw.gov.au/__data/assets/file/0010/210520/favicon.ico",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}",zoomExtent:[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 2019",icon:"http://spatialservices.finance.nsw.gov.au/__data/assets/file/0010/210520/favicon.ico"},{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",name:"Lyon Orthophoto 8cm",type:"tms",template:"http://wms.openstreetmap.fr/tms/1.0.0/lyon/{zoom}/{x}/{y}",endDate:"2018-01-01T00:00:00.000Z",startDate:"2015-05-01T00:00:00.000Z",zoomExtent:[2,22],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",zoomExtent:[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://geodaten.mainz.de/map/service?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortho_2018&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[12,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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"Mapbox",name:"Mapbox Satellite",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/mapbox.satellite/{zoom}/{x}/{y}@2x.jpg?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJjaml5MjVyb3MwMWV0M3hxYmUzdGdwbzE4In0.q548FjhsSJzvXsGlPsFxAQ",tileSize:512,zoomExtent:[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:"https://owsproxy.lgl-bw.de/owsproxy/ows/WMS_Maps4BW?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=webatlasde&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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"MassGIS-L3-Parcels",name:"MassGIS L3 Parcels",type:"tms",template:"https://tiles.arcgis.com/tiles/hGdibHYSPO59RG1h/arcgis/rest/services/MassGIS_Level3_Parcels/MapServer/tile/{zoom}/{y}/{x}",zoomExtent:[15,20],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]]],overlay:true},{id:"Maxar-Premium",name:"Maxar Premium Imagery (Beta)",type:"tms",template:"https://earthwatch.digitalglobe.com/earthservice/tmsaccess/tms/1.0.0/DigitalGlobe:ImageryTileService@EPSG:3857@jpg/{zoom}/{x}/{-y}.jpg?connectId=91e57457-aa2d-41ad-a42b-3b63a123f54a",zoomExtent:[0,22],terms_url:"https://wiki.openstreetmap.org/wiki/DigitalGlobe",terms_text:"Terms & Feedback","default":true,description:"Maxar Premium is a mosaic composed of Maxar 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/Maxar.png"},{id:"Maxar-Standard",name:"Maxar Standard Imagery (Beta)",type:"tms",template:"https://earthwatch.digitalglobe.com/earthservice/tmsaccess/tms/1.0.0/DigitalGlobe:ImageryTileService@EPSG:3857@jpg/{zoom}/{x}/{-y}.jpg?connectId=d9c5e3ef-6300-4cec-9562-c1f27da6b2d9",zoomExtent:[0,22],terms_url:"https://wiki.openstreetmap.org/wiki/DigitalGlobe",terms_text:"Terms & Feedback","default":true,description:"Maxar 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/Maxar.png"},{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",zoomExtent:[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",zoomExtent:[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:"MCGIS-County-NAIP-Imagery-2015",name:"Mesa County GIS NAIP 2015",type:"wms",template:"https://mcgis.mesacounty.us/image/services/Mosaic_Datasets/MesaCounty_2015/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:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-109.06765,39.37875],[-107.37012,39.37962],[-107.36995,39.18422],[-107.49574,39.18416],[-107.49568,39.12133],[-107.62081,39.12126],[-107.62076,39.05974],[-107.68231,39.05971],[-107.68226,38.99652],[-107.81774,38.99645],[-107.81779,39.05859],[-107.86948,39.05856],[-107.86943,38.99769],[-108.05698,38.99759],[-108.05688,38.87126],[-108.18204,38.8712],[-108.18198,38.8081],[-108.37142,38.808],[-108.3711,38.43452],[-109.06685,38.43416],[-109.06765,39.37875]]],terms_url:"http://gis.mesacounty.us/",terms_text:"Mesa County GIS",icon:"https://gis.mesacounty.us/globalassets/images/county-logos/mesa-county-logo.png"},{id:"MCGIS-County-NAIP-Imagery-2017",name:"Mesa County GIS NAIP 2017",type:"wms",template:"https://mcgis.mesacounty.us/image/services/Mosaic_Datasets/NAIP_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:4326",endDate:"2017-10-24T00:00:00.000Z",startDate:"2017-08-26T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-109.06765,39.37875],[-107.37012,39.37962],[-107.36995,39.18422],[-107.49574,39.18416],[-107.49568,39.12133],[-107.62081,39.12126],[-107.62076,39.05974],[-107.68231,39.05971],[-107.68226,38.99652],[-107.81774,38.99645],[-107.81779,39.05859],[-107.86948,39.05856],[-107.86943,38.99769],[-108.05698,38.99759],[-108.05688,38.87126],[-108.18204,38.8712],[-108.18198,38.8081],[-108.37142,38.808],[-108.3711,38.43452],[-109.06685,38.43416],[-109.06765,39.37875]]],terms_url:"http://gis.mesacounty.us/",terms_text:"Mesa County GIS",icon:"https://gis.mesacounty.us/globalassets/images/county-logos/mesa-county-logo.png"},{id:"MCGIS-County-Valleywide-Imagery-2018",name:"Mesa County GIS Valleywide 2018",type:"wms",template:"https://mcgis.mesacounty.us/image/services/Mosaic_Datasets/City_Color_2018/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:"2018-01-01T00:00:00.000Z",startDate:"2018-01-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-108.93915,39.23931],[-108.86841,39.23846],[-108.86843,39.23734],[-108.81245,39.23666],[-108.81274,39.22256],[-108.79405,39.22234],[-108.79432,39.20857],[-108.70096,39.20745],[-108.70123,39.1939],[-108.60764,39.19277],[-108.60791,39.17906],[-108.58915,39.17884],[-108.58943,39.1649],[-108.53332,39.16422],[-108.53361,39.14993],[-108.51461,39.14971],[-108.51489,39.13611],[-108.44076,39.13522],[-108.44104,39.12109],[-108.42192,39.12086],[-108.42201,39.1163],[-108.3984,39.11602],[-108.39798,39.13708],[-108.32446,39.13619],[-108.32416,39.15107],[-108.30718,39.15087],[-108.3066,39.18],[-108.28866,39.17979],[-108.28807,39.20939],[-108.26868,39.20916],[-108.26957,39.16484],[-108.2864,39.16505],[-108.28699,39.13571],[-108.30312,39.13591],[-108.3038,39.10194],[-108.32335,39.10218],[-108.32328,39.10574],[-108.32914,39.10581],[-108.32943,39.09121],[-108.34736,39.09142],[-108.34764,39.07715],[-108.36637,39.07738],[-108.36666,39.06268],[-108.38569,39.06291],[-108.38599,39.04799],[-108.42216,39.04843],[-108.42245,39.03377],[-108.44051,39.03399],[-108.44137,38.99101],[-108.42193,38.99077],[-108.42252,38.96127],[-108.44162,38.9615],[-108.44133,38.97595],[-108.46034,38.97618],[-108.46006,38.99024],[-108.47877,38.99047],[-108.47848,39.00485],[-108.51515,39.0053],[-108.51519,39.00287],[-108.51825,39.00291],[-108.51821,39.00517],[-108.53414,39.00536],[-108.53397,39.0139],[-108.54342,39.01401],[-108.54336,39.01733],[-108.5455,39.01735],[-108.54548,39.01855],[-108.65864,39.01991],[-108.65778,39.06287],[-108.67867,39.06313],[-108.67837,39.07793],[-108.69699,39.07816],[-108.69671,39.09203],[-108.71557,39.09225],[-108.71529,39.10619],[-108.7388,39.10648],[-108.73853,39.12033],[-108.75744,39.12056],[-108.75686,39.14927],[-108.79422,39.14972],[-108.79393,39.16386],[-108.83224,39.16432],[-108.83196,39.17845],[-108.85061,39.17868],[-108.85033,39.19302],[-108.86938,39.19325],[-108.86906,39.20925],[-108.90237,39.20965],[-108.90208,39.22384],[-108.93946,39.22429],[-108.93915,39.23931]]],terms_url:"http://gis.mesacounty.us/",terms_text:"Mesa County GIS",icon:"https://gis.mesacounty.us/globalassets/images/county-logos/mesa-county-logo.png"},{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:"https://www.metropoleruhr.de/regionalverband-ruhr.html",terms_text:"Datengrundlage: Regionalverband Ruhr"},{id:"miljodirektoratet-vern",name:"Miljødirektoratet Protected Areas overlay",type:"wms",template:"https://kart.miljodirektoratet.no/arcgis/services/vern/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=naturvern_klasser_omrade&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[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:"https://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://kart.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",zoomExtent:[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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"mml-tausta",name:"MML Background Map",type:"tms",template:"http://tiles.kartat.kapsi.fi/taustakartta/{zoom}/{x}/{y}.jpg",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",tileSize:512,zoomExtent:[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:"Mulhouse_2018",name:"Mulhouse - 2018",type:"tms",template:"http://wms.openstreetmap.fr/tms/1.0.0/mulhouse_2018/{zoom}/{x}/{y}",endDate:"2018-01-01T00:00:00.000Z",startDate:"2018-01-01T00:00:00.000Z",zoomExtent:[0,23],polygon:[[[7.53731,47.78041],[7.57439,47.84128],[7.57301,47.85602],[7.55035,47.86201],[7.53525,47.84588],[7.5016,47.85141],[7.45972,47.84174],[7.4556,47.83252],[7.4453,47.83114],[7.43088,47.84128],[7.41549,47.83831],[7.39174,47.84727],[7.38007,47.83851],[7.33475,47.83989],[7.34024,47.89563],[7.31758,47.91082],[7.28737,47.89977],[7.28462,47.88412],[7.24686,47.88228],[7.23724,47.87629],[7.23312,47.86431],[7.2139,47.86524],[7.183,47.85786],[7.17613,47.84819],[7.21115,47.82284],[7.18986,47.81085],[7.19948,47.78179],[7.16789,47.77025],[7.183,47.73517],[7.17682,47.72362],[7.19467,47.69451],[7.21802,47.68527],[7.24548,47.68527],[7.25166,47.69497],[7.2448,47.70376],[7.2551,47.71392],[7.27844,47.713],[7.27982,47.70237],[7.26814,47.69405],[7.26883,47.68434],[7.28531,47.67094],[7.30247,47.66308],[7.32376,47.65984],[7.33337,47.66724],[7.3732,47.65383],[7.39242,47.65475],[7.40822,47.6603],[7.39723,47.67648],[7.42744,47.68666],[7.47551,47.69821],[7.5222,47.69636],[7.55104,47.71531],[7.56134,47.73517],[7.53731,47.78041]]],terms_url:"https://data.mulhouse-alsace.fr/explore/dataset/m2a_orthophotographie-2018/information/",terms_text:"Mulhouse Alsace Agglomération 2018"},{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",zoomExtent:[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:"https://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",zoomExtent:[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",zoomExtent:[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:"USDA-NAIP",name:"National Agriculture Imagery Program",type:"wms",template:"https://gis.apfo.usda.gov/arcgis/services/NAIP/USDA_CONUS_PRIME/ImageServer/WMSServer?FORMAT=image/jpeg&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[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]]],description:"The most recent year of DOQQs from the National Agriculture Imagery Program (NAIP) for each state in the contiguous United States.",icon:"https://osmlab.github.io/editor-layer-index/sources/north-america/us/USDA.png"},{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",zoomExtent:[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:"img.nj.gov-Infrared2015",name:"NJ 2015 Aerial Imagery (Infrared)",type:"wms",template:"https://img.nj.gov/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",zoomExtent:[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=188471FF-2803-4145-A5AD-605DE86D3B4D",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:"img.nj.gov-Natural2015",name:"NJ 2015 Aerial Imagery (Natural Color)",type:"wms",template:"https://img.nj.gov/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",zoomExtent:[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=188471FF-2803-4145-A5AD-605DE86D3B4D",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",zoomExtent:[0,15],polygon:[[[121.2237,25.76997],[122.2251,26.60305],[122.9312,22.57058],[120.6771,20.72799],[118.2509,23.26265],[118.3036,23.30751],[118.1978,24.34453],[118.1036,24.36172],[118.2283,24.49486],[118.4416,24.55302],[118.6024,24.46068],[120.0474,25.38843],[119.8935,25.78169],[119.787,26.2048],[120.4578,26.53253],[121.2237,25.76997]]],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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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:"Norwegian orthophotos (max zoom 21), courtesy of Geovekst and Norkart.",icon:"https://register.geonorge.no/data/organizations/_L_norgeibilder96x96.png"},{id:"geovekst-nib2",name:"Norway Orthophoto (more recent, less zoom)",type:"tms",template:"https://opencache{switch:,2,3}.statkart.no/gatekeeper/gk/gk.open_nib_web_mercator_wmts_v2?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=Nibcache_web_mercator_v2&STYLE=default&FORMAT=image/jpgpng&tileMatrixSet=default028mm&tileMatrix={zoom}&tileRow={y}&tileCol={x}",zoomExtent:[0,19],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 (max zoom 19), courtesy of Geovekst and Kartverket.",icon:"https://register.geonorge.no/data/organizations/_L_norgeibilder96x96.png"},{id:"npd-offshore",name:"NPD Offshore Installations overlay",type:"wms",template:"http://gis.npd.no/ogc/factmaps/2_0?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=fclFixed,pplAll,fldByStatus&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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/Vindkraft2/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Vindkraft_konsesjon_gitt_ikke_utbygd,Vindkraft_under_bygging,Vindkraft_utbygd,Vindkraftomrade,Vindturbin&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[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 (blue: planned, light green: construction, dark green: built).",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",zoomExtent:[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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"osmbe-nl",name:"OpenStreetMap (Belgian Style - Dutch)",type:"tms",template:"https://tile.openstreetmap.be/osmbe-nl/{zoom}/{x}/{y}.png",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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]],[[17.79852,46.81745],[17.79178,46.81585],[17.79601,46.80664],[17.7948,46.80598],[17.79693,46.80056],[17.80109,46.79993],[17.80736,46.80225],[17.79852,46.81745]],[[17.7788,46.81461],[17.78446,46.80714],[17.79083,46.80925],[17.7853,46.81683],[17.7788,46.81461]]],terms_text:"openstreetmap.hu"},{id:"OpenTopoMap",name:"OpenTopoMap",type:"tms",template:"https://{switch:a,b,c}.tile.opentopomap.org/{zoom}/{x}/{y}.png",zoomExtent:[3,17],terms_url:"https://tile.opentopomap.org/about#verwendung",terms_text:"Kartendaten: © OpenStreetMap-Mitwirkende, SRTM | Kartendarstellung: © OpenTopoMap (CC-BY-SA)",icon:"https://osmlab.github.io/editor-layer-index/sources/world/OpenTopoMap.png"},{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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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:"OSIP_1ft",name:"OSIP 1ft Imagery Most Current Available",type:"wms",template:"https://geo1.oit.ohio.gov/arcgis/services/OSIP/osip_best_avail_1ft/ImageServer/WMSServer?FORMAT=image/jpeg&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2014-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",zoomExtent:[8,20],polygon:[[[-83.1356,41.75081],[-83.08101,41.7511],[-83.0796,41.62936],[-82.95011,41.54404],[-82.89032,41.54404],[-82.89032,41.69462],[-82.8494,41.7463],[-82.76758,41.73925],[-82.75184,41.63584],[-82.64799,41.62408],[-82.68575,41.50634],[-82.49063,41.40492],[-82.0217,41.53462],[-81.72901,41.52048],[-81.39541,41.7369],[-81.10587,41.84484],[-80.50161,41.99939],[-80.51105,40.62127],[-80.6275,40.59021],[-80.58344,40.49933],[-80.58973,40.2812],[-80.85095,39.625],[-81.19399,39.37974],[-81.38912,39.31159],[-81.45521,39.38704],[-81.515,39.35054],[-81.54333,39.26288],[-81.72586,39.19461],[-81.73216,38.9258],[-81.9021,38.85477],[-81.95875,38.89397],[-81.9084,38.93315],[-82.02799,38.99922],[-82.11611,38.92336],[-82.12555,38.8278],[-82.19794,38.78856],[-82.16647,38.72475],[-82.16017,38.58712],[-82.26718,38.57236],[-82.29865,38.43198],[-82.57875,38.39745],[-82.73925,38.53545],[-82.8494,38.56006],[-82.91235,38.73212],[-83.00676,38.71002],[-83.14524,38.59942],[-83.30575,38.58466],[-83.39387,38.64368],[-83.46625,38.64614],[-83.54178,38.69283],[-83.65193,38.61172],[-83.74635,38.63385],[-83.9635,38.76403],[-84.08624,38.75421],[-84.22157,38.7812],[-84.34117,38.99922],[-84.49223,39.07255],[-84.64015,39.05545],[-84.74086,39.11164],[-84.84471,39.08477],[-84.82898,41.70637],[-83.44737,41.76038],[-83.13438,41.64959],[-83.1356,41.75081]]],terms_url:"https://ogrip.oit.ohio.gov/ProjectsInitiatives/StatewideImagery.aspx",terms_text:"Ohio Statewide Imagery Program",description:"Most recent available 1-foot orthoimagery from the Ohio Statewide Imagery Program."},{id:"OSIP_6in",name:"OSIP 6in Imagery Most Current Available",type:"wms",template:"https://geo1.oit.ohio.gov/arcgis/services/OSIP/OSIP_6in_best_avail/ImageServer/WMSServer?FORMAT=image/jpeg&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2018-01-01T00:00:00.000Z",startDate:"2010-01-01T00:00:00.000Z",zoomExtent:[8,20],polygon:[[[-83.1356,41.75081],[-83.08101,41.7511],[-83.0796,41.62936],[-82.95011,41.54404],[-82.89032,41.54404],[-82.89032,41.69462],[-82.8494,41.7463],[-82.76758,41.73925],[-82.75184,41.63584],[-82.64799,41.62408],[-82.68575,41.50634],[-82.49063,41.40492],[-82.0217,41.53462],[-81.72901,41.52048],[-81.39541,41.7369],[-81.10587,41.84484],[-80.50161,41.99939],[-80.51105,40.62127],[-80.6275,40.59021],[-80.58344,40.49933],[-80.58973,40.2812],[-80.85095,39.625],[-81.19399,39.37974],[-81.38912,39.31159],[-81.45521,39.38704],[-81.515,39.35054],[-81.54333,39.26288],[-81.72586,39.19461],[-81.73216,38.9258],[-81.9021,38.85477],[-81.95875,38.89397],[-81.9084,38.93315],[-82.02799,38.99922],[-82.11611,38.92336],[-82.12555,38.8278],[-82.19794,38.78856],[-82.16647,38.72475],[-82.16017,38.58712],[-82.26718,38.57236],[-82.29865,38.43198],[-82.57875,38.39745],[-82.73925,38.53545],[-82.8494,38.56006],[-82.91235,38.73212],[-83.00676,38.71002],[-83.14524,38.59942],[-83.30575,38.58466],[-83.39387,38.64368],[-83.46625,38.64614],[-83.54178,38.69283],[-83.65193,38.61172],[-83.74635,38.63385],[-83.9635,38.76403],[-84.08624,38.75421],[-84.22157,38.7812],[-84.34117,38.99922],[-84.49223,39.07255],[-84.64015,39.05545],[-84.74086,39.11164],[-84.84471,39.08477],[-84.82898,41.70637],[-83.44737,41.76038],[-83.13438,41.64959],[-83.1356,41.75081]]],terms_url:"https://ogrip.oit.ohio.gov/ProjectsInitiatives/StatewideImagery.aspx",terms_text:"Ohio Statewide Imagery Program",description:"Most recent available 6-inch orthoimagery from the Ohio Statewide Imagery Program."},{id:"osm-hr-knin-2007",name:"osm-hr: Knin-2007 Aerial imagery",type:"tms",template:"https://tms.osm-hr.org/knin-2007/{zoom}/{x}/{-y}.png",endDate:"2007-01-01T00:00:00.000Z",startDate:"2007-01-01T00:00:00.000Z",zoomExtent:[0,19],polygon:[[[16.21712,44.08054],[16.22916,44.08041],[16.22938,44.06055],[16.2303,44.05757],[16.23715,44.04213],[16.23715,44.03615],[16.23041,44.03599],[16.22494,44.03627],[16.2243,44.03599],[16.22404,44.03504],[16.21608,44.02178],[16.21286,44.01661],[16.20391,44.01672],[16.19269,44.02601],[16.18003,44.03662],[16.18011,44.03772],[16.21129,44.06685],[16.21712,44.08054]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/hr/osm-hr.png"},{id:"osm-hr-zagreb-2012",name:"osm-hr: Zagreb 2012 Aerial imagery",type:"tms",template:"https://tms.osm-hr.org/zagreb-2012/{zoom}/{x}/{-y}.png",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",zoomExtent:[0,19],polygon:[[[16.15334,45.96857],[16.17462,45.94041],[16.17599,45.91796],[16.18595,45.90793],[16.18423,45.89789],[16.19728,45.8924],[16.22578,45.86085],[16.22097,45.85248],[16.22938,45.84638],[16.22921,45.84148],[16.24088,45.83645],[16.21719,45.83885],[16.20655,45.82784],[16.19865,45.77638],[16.1602,45.79554],[16.12827,45.80224],[16.13033,45.79434],[16.12278,45.78716],[16.10081,45.7862],[16.07677,45.77303],[16.0572,45.75746],[16.03901,45.76082],[16.03695,45.7577],[16.03935,45.75411],[16.02699,45.75507],[16.01772,45.74453],[16.01772,45.71936],[15.98785,45.71601],[15.96554,45.69131],[15.96725,45.67236],[15.95077,45.65125],[15.95077,45.63589],[15.94768,45.62989],[15.94288,45.63109],[15.93395,45.62172],[15.92606,45.61932],[15.92125,45.6138],[15.90031,45.62244],[15.90717,45.63229],[15.89619,45.63565],[15.87421,45.65557],[15.83885,45.66517],[15.81722,45.67044],[15.8131,45.67716],[15.77568,45.68915],[15.77396,45.7081],[15.78941,45.73398],[15.79285,45.73159],[15.80898,45.7383],[15.81001,45.73063],[15.82237,45.72344],[15.83473,45.72871],[15.85155,45.71673],[15.87078,45.73159],[15.84434,45.73159],[15.84469,45.76465],[15.83834,45.76764],[15.81276,45.76764],[15.80555,45.77543],[15.80538,45.80403],[15.8325,45.80391],[15.82993,45.80762],[15.83319,45.81062],[15.82289,45.82581],[15.82186,45.83837],[15.82975,45.84136],[15.84074,45.83992],[15.8452,45.84112],[15.84434,45.84459],[15.84984,45.84805],[15.85052,45.85236],[15.85979,45.85511],[15.86031,45.85308],[15.86477,45.85272],[15.87301,45.85451],[15.87378,45.85755],[15.87328,45.86081],[15.87816,45.8621],[15.87782,45.86563],[15.88263,45.8618],[15.88649,45.86306],[15.88529,45.86545],[15.89026,45.87603],[15.89709,45.88143],[15.9082,45.88642],[15.92125,45.88953],[15.9288,45.88762],[15.93876,45.89359],[15.92194,45.89431],[15.91988,45.89789],[15.92983,45.90339],[15.94768,45.90434],[15.95352,45.90554],[15.95524,45.91223],[15.97412,45.91271],[15.99918,45.92369],[16.00811,45.9299],[16.02802,45.93324],[16.03043,45.93611],[16.04313,45.93969],[16.05206,45.93563],[16.05171,45.94447],[16.06476,45.94661],[16.06579,45.95115],[16.0778,45.95569],[16.09325,45.95903],[16.09497,45.95449],[16.10767,45.95688],[16.11317,45.96165],[16.11282,45.96762],[16.12038,45.96905],[16.13205,45.96475],[16.1372,45.96523],[16.13823,45.96786],[16.15334,45.96857]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/hr/osm-hr.png"},{id:"osmie_barony",name:"OSMIE Baronies",type:"tms",template:"https://tile.openstreetmap.ie/barony/{zoom}/{x}/{y}.png",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"palmeira_dos_indios",name:"Palmeira dos Indios AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"Pangasinan_Bulacan_HiRes",name:"Pangasinán/Bulacan (Philippines HiRes)",type:"tms",template:"https://gravitystorm.dev.openstreetmap.org/imagery/philippines/{zoom}/{x}/{y}.png",zoomExtent:[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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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}",zoomExtent:[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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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}",zoomExtent:[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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"e-mapa.net-buildings",name:"polska.e-mapa.net: Buildings",type:"wms",template:"http://integracja02.gugik.gov.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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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:"https://wms.openstreetmap.de/tms/RABA3000/{zoom}/{x}/{y}.png",zoomExtent:[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.38,45.5666],[13.63822,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 ©2019 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:"https://wms.openstreetmap.de/tms/RABA/{zoom}/{x}/{y}.png",zoomExtent:[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.38,45.5666],[13.63822,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 ©2019 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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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-03-15T00:00:00.000Z",startDate:"2013-03-13T00:00:00.000Z",zoomExtent:[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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"Sao_miguel_dos_campos",name:"São Miguel dos Campos AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[0,18],polygon:[[[11.71495,46.51227],[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.61936,46.43957],[11.62508,46.43957],[11.62508,46.44797],[11.63349,46.44587],[11.63769,46.45846],[11.64399,46.45846],[11.6608,46.44587],[11.66711,46.44587],[11.66711,46.47525],[11.69442,46.47735],[11.69652,46.48575],[11.70913,46.49624],[11.70913,46.50254],[11.71333,46.50254],[11.71495,46.51227]],[[11.61435,46.41535],[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.20644,46.4156],[11.20485,46.3997],[11.17754,46.3997],[11.17543,46.3871],[11.16703,46.38081],[11.16703,46.36821],[11.16283,46.36821],[11.16283,46.29895],[11.12501,46.29895],[11.12291,46.25488],[11.13131,46.25278],[11.12711,46.24858],[11.16283,46.24858],[11.16283,46.215],[11.24898,46.2129],[11.25108,46.2234],[11.2889,46.2234],[11.2889,46.24019],[11.3015,46.25278],[11.30991,46.25278],[11.31201,46.24858],[11.33722,46.25068],[11.34143,46.26747],[11.34563,46.26747],[11.34773,46.25698],[11.35613,46.24858],[11.41707,46.25278],[11.41917,46.32414],[11.49271,46.32204],[11.48851,46.33044],[11.49901,46.32834],[11.50111,46.34723],[11.52423,46.34723],[11.53894,46.34513],[11.53894,46.32834],[11.55995,46.32414],[11.58306,46.34932],[11.58306,46.37241],[11.60407,46.37241],[11.60617,46.38291],[11.61458,46.38291],[11.62508,46.3934],[11.62508,46.41229],[11.61435,46.41535]],[[11.20663,46.41745],[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.96285,46.47718],[10.96952,46.45217],[10.98423,46.45217],[10.98843,46.44587],[10.99894,46.44587],[11.01154,46.42068],[11.04096,46.42068],[11.08088,46.43537],[11.08298,46.47525],[11.15232,46.47525],[11.18804,46.48365],[11.19014,46.47525],[11.20695,46.47315],[11.20485,46.44587],[11.19855,46.44167],[11.19435,46.42698],[11.19014,46.42698],[11.19014,46.42068],[11.20695,46.42068],[11.20663,46.41745]],[[10.47433,46.55501],[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.46952,46.62628],[10.47785,46.61797],[10.47785,46.59069],[10.47365,46.59069],[10.47155,46.5676],[10.46314,46.55501],[10.47433,46.55501]],[[10.46925,46.62643],[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],[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.43626,46.79843],[10.43373,46.81106],[10.42532,46.80686],[10.42532,46.79847],[10.42112,46.79847],[10.41692,46.78587],[10.41692,46.75229],[10.3938,46.7376],[10.3896,46.72081],[10.3854,46.72081],[10.3791,46.69353],[10.3791,46.66834],[10.3833,46.66414],[10.3812,46.64735],[10.3896,46.64525],[10.3938,46.63056],[10.42532,46.62846],[10.44843,46.63476],[10.46925,46.62643]]],terms_url:"https://geoservices.buergernetz.bz.it/geokatalog/",terms_text:"© Autonomen Provinz Bozen/Provincia Autonoma di Bolzano CC-BY 3.0"},{id:"South-Tyrol-Orthofoto-2014-2015",name:"South Tyrol Orthofoto 2014/2015",type:"tms",template:"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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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,description:"This imagery is provided via a proxy operated by https://sosm.ch/"},{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",zoomExtent:[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",description:"This imagery is provided via a proxy operated by https://sosm.ch/"},{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",zoomExtent:[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",description:"This imagery is provided via a proxy operated by https://sosm.ch/"},{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",zoomExtent:[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",description:"This imagery is provided via a proxy operated by https://sosm.ch/"},{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",zoomExtent:[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",description:"This imagery is provided via a proxy operated by https://sosm.ch/"},{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",zoomExtent:[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:"stockholm-orto",name:"Stockholm Orthophoto",type:"wms",template:"https://openmap.stockholm.se/bios/wms/app/baggis/web/WMS_STHLM_ORTOFOTO_2016?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=p_1002630&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[5,21],polygon:[[[17.8755,59.2625],[17.94411,59.27307],[18.09551,59.22603],[18.19582,59.22786],[18.20297,59.24886],[18.12538,59.30779],[18.1786,59.32566],[18.09876,59.3721],[18.04264,59.37816],[18.00796,59.34334],[17.93655,59.37641],[17.97483,59.40246],[17.90882,59.4417],[17.8854,59.43792],[17.88918,59.41382],[17.84077,59.38568],[17.81708,59.40054],[17.77725,59.39984],[17.75622,59.3916],[17.79899,59.36204],[17.94993,59.31121],[17.85622,59.28412],[17.8755,59.2625]]],terms_url:"http://dataportalen.stockholm.se/dataportalen/",terms_text:"© Stockholm municipality, CC0",best:true,description:"Orthophotos from the municipality of Stockholm 2016, CC0 license",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/4/4d/Stockholm_vapen_bra.svg/196px-Stockholm_vapen_bra.svg.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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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}",zoomExtent:[0,15],polygon:[[[121.2237,25.76997],[122.2251,26.60305],[122.9312,22.57058],[120.6771,20.72799],[118.2509,23.26265],[118.3036,23.30751],[118.1978,24.34453],[118.1036,24.36172],[118.2283,24.49486],[118.4416,24.55302],[118.6024,24.46068],[120.0474,25.38843],[119.8935,25.78169],[119.787,26.2048],[120.4578,26.53253],[121.2237,25.76997]]],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://wms.nlsc.gov.tw/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:[[[121.2237,25.76997],[122.2251,26.60305],[122.9312,22.57058],[120.6771,20.72799],[118.2509,23.26265],[118.3036,23.30751],[118.1978,24.34453],[118.1036,24.36172],[118.2283,24.49486],[118.4416,24.55302],[118.6024,24.46068],[120.0474,25.38843],[119.8935,25.78169],[119.787,26.2048],[120.4578,26.53253],[121.2237,25.76997]]],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://wms.nlsc.gov.tw/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:[[[121.2237,25.76997],[122.2251,26.60305],[122.9312,22.57058],[120.6771,20.72799],[118.2509,23.26265],[118.3036,23.30751],[118.1978,24.34453],[118.1036,24.36172],[118.2283,24.49486],[118.4416,24.55302],[118.6024,24.46068],[120.0474,25.38843],[119.8935,25.78169],[119.787,26.2048],[120.4578,26.53253],[121.2237,25.76997]]],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/services/Lignes/MapServer/WMSServer?FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",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/services/Poteaux/MapServer/WMSServer?FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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",zoomExtent:[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",zoomExtent:[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:"US-TIGER-Roads-2018",name:"TIGER Roads 2018",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/styles/v1/openstreetmapus/cjo1wbulo3ub82ro1c9onlzmh/tiles/256/{zoom}/{x}/{y}?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcHVzIiwiYSI6ImNpcnF4Ym43dDBoOXZmYW04bWhlNWdrY2EifQ.4SFexuTUuKkZeerO3dgtmw",endDate:"2018-01-01T00:00:00.000Z",startDate:"2018-01-01T00:00:00.000Z",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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-2017",name:"Toulouse - Orthophotoplan 2017",type:"wms",template:"https://wms.plan.toulouse.fr/geocache/wms?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortho2017&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",zoomExtent:[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",best:true},{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",zoomExtent:[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",zoomExtent:[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:"https://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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",description:"This imagery is provided via a proxy operated by https://sosm.ch/"},{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",zoomExtent:[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",zoomExtent:[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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"UrbISOrtho2018",name:"UrbIS-Ortho 2018",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:Ortho2018&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",endDate:"2018-01-01T00:00:00.000Z",startDate:"2018-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-Imagery",name:"USGS Imagery",type:"tms",template:"https://ags-proxy.openstreetmap.us/tiles/{zoom}/{x}/{y}?url=https%3A%2F%2Fbasemap.nationalmap.gov%2Farcgis%2Frest%2Fservices%2FUSGSImageryOnly%2FMapServer",zoomExtent:[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]]],description:"Public domain aerial imagery, mostly NAIP",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",zoomExtent:[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}",zoomExtent:[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:"vicosa_al",name:"Viçosa AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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:"VGIN-BuildingFootprints_WM",name:"Virginia Building Footprints",type:"tms",template:"http://tileify-ags.herokuapp.com/tiles/{zoom}/{x}/{y}?url=https%3A%2F%2Fgismaps.vita.virginia.gov%2Farcgis%2Frest%2Fservices%2FVA_Base_layers%2FVA_Building_Footprints%2FMapServer&transparent=true&layers=show%3A20",endDate:"2018-06-01T00:00:00.000Z",startDate:"2015-05-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-83.64853,36.6023],[-79.9118,36.55819],[-75.90179,36.56701],[-75.8606,36.985],[-75.19867,38.0178],[-76.15448,37.99183],[-76.25336,37.92253],[-76.62689,38.1648],[-76.90704,38.22524],[-77.05536,38.42132],[-77.19818,38.37396],[-77.28333,38.3675],[-77.31628,38.45789],[-77.25586,38.58253],[-77.15698,38.61043],[-77.11853,38.68337],[-77.0636,38.69409],[-77.05811,38.82259],[-77.07458,38.88462],[-77.20367,38.99357],[-77.3822,39.07038],[-77.47833,39.09809],[-77.53876,39.16627],[-77.4646,39.23651],[-77.59918,39.30455],[-77.74475,39.33005],[-77.84637,39.14284],[-78.36273,39.45528],[-78.3847,39.36616],[-78.36548,39.32792],[-78.4671,39.19182],[-78.60168,39.03199],[-78.69232,38.94659],[-78.89282,38.76479],[-78.99719,38.8504],[-79.13727,38.68551],[-79.31854,38.42993],[-79.5108,38.46004],[-79.56299,38.54817],[-79.65637,38.58253],[-79.71954,38.50519],[-79.70856,38.44068],[-79.94476,38.16911],[-80.00519,38.0243],[-80.21942,37.83148],[-80.32379,37.67513],[-80.22766,37.62511],[-80.36224,37.56417],[-80.32928,37.52498],[-80.49408,37.42907],[-80.53253,37.48794],[-80.78522,37.37889],[-80.86487,37.43561],[-80.9198,37.39635],[-80.88135,37.36143],[-81.02692,37.28935],[-81.26038,37.25219],[-81.37024,37.34396],[-81.47736,37.26312],[-81.55426,37.22595],[-81.71906,37.20189],[-81.98273,37.42689],[-81.96899,37.55329],[-82.40845,37.26531],[-82.74078,37.13186],[-82.73529,37.05299],[-82.90283,36.985],[-82.87811,36.90818],[-83.02643,36.85765],[-83.07587,36.85765],[-83.16101,36.74989],[-83.44666,36.69265],[-83.61145,36.64418],[-83.63892,36.63592],[-83.69385,36.61222],[-83.70003,36.6023],[-83.64853,36.6023]]],terms_url:"https://vgin.maps.arcgis.com/home/item.html?id=bcd049dfcdc342a7a08ec81644eeb339",terms_text:"Virginia Geographic Information Network (VGIN)",description:"Virginia Building Footprint Map Service",overlay:true},{id:"VGIN-Imagery_WM",name:"Virginia Imagery Service - Most Recent",type:"tms",template:"http://tileify-ags.herokuapp.com/tiles/{zoom}/{x}/{y}?url=https%3A%2F%2Fgismaps.vita.virginia.gov%2Farcgis%2Frest%2Fservices%2FMostRecentImagery%2FMostRecentImagery_WGS%2FMapServer&transparent=true&layers=show%3A0",endDate:"2018-08-01T00:00:00.000Z",startDate:"2013-04-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-83.64853,36.6023],[-79.9118,36.55819],[-75.90179,36.56701],[-75.8606,36.985],[-75.19867,38.0178],[-76.15448,37.99183],[-76.25336,37.92253],[-76.62689,38.1648],[-76.90704,38.22524],[-77.05536,38.42132],[-77.19818,38.37396],[-77.28333,38.3675],[-77.31628,38.45789],[-77.25586,38.58253],[-77.15698,38.61043],[-77.11853,38.68337],[-77.0636,38.69409],[-77.05811,38.82259],[-77.07458,38.88462],[-77.20367,38.99357],[-77.3822,39.07038],[-77.47833,39.09809],[-77.53876,39.16627],[-77.4646,39.23651],[-77.59918,39.30455],[-77.74475,39.33005],[-77.84637,39.14284],[-78.36273,39.45528],[-78.3847,39.36616],[-78.36548,39.32792],[-78.4671,39.19182],[-78.60168,39.03199],[-78.69232,38.94659],[-78.89282,38.76479],[-78.99719,38.8504],[-79.13727,38.68551],[-79.31854,38.42993],[-79.5108,38.46004],[-79.56299,38.54817],[-79.65637,38.58253],[-79.71954,38.50519],[-79.70856,38.44068],[-79.94476,38.16911],[-80.00519,38.0243],[-80.21942,37.83148],[-80.32379,37.67513],[-80.22766,37.62511],[-80.36224,37.56417],[-80.32928,37.52498],[-80.49408,37.42907],[-80.53253,37.48794],[-80.78522,37.37889],[-80.86487,37.43561],[-80.9198,37.39635],[-80.88135,37.36143],[-81.02692,37.28935],[-81.26038,37.25219],[-81.37024,37.34396],[-81.47736,37.26312],[-81.55426,37.22595],[-81.71906,37.20189],[-81.98273,37.42689],[-81.96899,37.55329],[-82.40845,37.26531],[-82.74078,37.13186],[-82.73529,37.05299],[-82.90283,36.985],[-82.87811,36.90818],[-83.02643,36.85765],[-83.07587,36.85765],[-83.16101,36.74989],[-83.44666,36.69265],[-83.61145,36.64418],[-83.63892,36.63592],[-83.69385,36.61222],[-83.70003,36.6023],[-83.64853,36.6023]]],terms_url:"https://vgin.maps.arcgis.com/home/item.html?id=36386a7e7dae4032a33cb0b83a1711f1",terms_text:"Virginia Geographic Information Network (VGIN)",description:"The most recently available VBMP orthoimagery for all of Virginia."},{id:"VGIN-PropertyLines_WM",name:"Virginia Property Lines",type:"tms",template:"http://tileify-ags.herokuapp.com/tiles/{zoom}/{x}/{y}?url=http%3A%2F%2Fgismaps.vita.virginia.gov%2Farcgis%2Frest%2Fservices%2FVA_Base_layers%2FVA_Parcels%2FMapServer&transparent=true",endDate:"2018-06-01T00:00:00.000Z",startDate:"2015-05-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-83.64853,36.6023],[-79.9118,36.55819],[-75.90179,36.56701],[-75.8606,36.985],[-75.19867,38.0178],[-76.15448,37.99183],[-76.25336,37.92253],[-76.62689,38.1648],[-76.90704,38.22524],[-77.05536,38.42132],[-77.19818,38.37396],[-77.28333,38.3675],[-77.31628,38.45789],[-77.25586,38.58253],[-77.15698,38.61043],[-77.11853,38.68337],[-77.0636,38.69409],[-77.05811,38.82259],[-77.07458,38.88462],[-77.20367,38.99357],[-77.3822,39.07038],[-77.47833,39.09809],[-77.53876,39.16627],[-77.4646,39.23651],[-77.59918,39.30455],[-77.74475,39.33005],[-77.84637,39.14284],[-78.36273,39.45528],[-78.3847,39.36616],[-78.36548,39.32792],[-78.4671,39.19182],[-78.60168,39.03199],[-78.69232,38.94659],[-78.89282,38.76479],[-78.99719,38.8504],[-79.13727,38.68551],[-79.31854,38.42993],[-79.5108,38.46004],[-79.56299,38.54817],[-79.65637,38.58253],[-79.71954,38.50519],[-79.70856,38.44068],[-79.94476,38.16911],[-80.00519,38.0243],[-80.21942,37.83148],[-80.32379,37.67513],[-80.22766,37.62511],[-80.36224,37.56417],[-80.32928,37.52498],[-80.49408,37.42907],[-80.53253,37.48794],[-80.78522,37.37889],[-80.86487,37.43561],[-80.9198,37.39635],[-80.88135,37.36143],[-81.02692,37.28935],[-81.26038,37.25219],[-81.37024,37.34396],[-81.47736,37.26312],[-81.55426,37.22595],[-81.71906,37.20189],[-81.98273,37.42689],[-81.96899,37.55329],[-82.40845,37.26531],[-82.74078,37.13186],[-82.73529,37.05299],[-82.90283,36.985],[-82.87811,36.90818],[-83.02643,36.85765],[-83.07587,36.85765],[-83.16101,36.74989],[-83.44666,36.69265],[-83.61145,36.64418],[-83.63892,36.63592],[-83.69385,36.61222],[-83.70003,36.6023],[-83.64853,36.6023]]],terms_url:"https://vgin.maps.arcgis.com/home/item.html?id=f1dccaf1f42e40cbba791feae2e23690",terms_text:"Virginia Geographic Information Network (VGIN)",description:"A statewide Parcel service showing property ownership outlines where available",overlay:true},{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:"https://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:"https://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:"https://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:"https://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-ef2018_10cm",name:"VoGIS: Echtfarbenbild 2018 (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=ef2018_10cm&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",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:"https://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:"https://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",zoomExtent:[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",zoomExtent:[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"}];
24701
24702         var presets = {aerialway:{fields:["name","aerialway"],moreFields:["layer"],geometry:["point","vertex","line"],tags:{aerialway:"*"},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","line","area"],tags:{amenity:"*"},searchable:false,name:"Amenity"},attraction:{icon:"maki-star",fields:["name","attraction","operator","opening_hours"],moreFields:["opening_hours","fee","payment_multi","address","website","phone","email","fax"],geometry:["point","vertex","line","area"],tags:{attraction:"*"},searchable:false,name:"Attraction"},boundary:{fields:["boundary"],geometry:["line"],tags:{boundary:"*"},searchable:false,name:"Boundary"},building_point:{icon:"maki-home",fields:["{building}"],moreFields:["{building}"],geometry:["point"],tags:{building:"*"},matchScore:0.6,searchable:false,terms:[],name:"Building"},embankment:{geometry:["line"],tags:{embankment:"yes"},name:"Embankment",matchScore:0.2,searchable:false},emergency:{fields:["emergency_combo"],geometry:["point","vertex","area"],tags:{emergency:"*"},searchable:false,name:"Emergency Feature"},ford_line:{geometry:["line"],tags:{ford:"*"},name:"Ford",searchable:false},highway:{fields:["name","highway"],geometry:["point","vertex","line","area"],tags:{highway:"*"},searchable:false,name:"Highway"},indoor:{fields:["level","indoor_type"],geometry:["point","vertex","line","area"],tags:{indoor:"*"},matchScore:0.8,searchable:false,name:"Indoor Feature"},landuse:{fields:["name","landuse"],geometry:["area"],tags:{landuse:"*"},matchScore:0.9,searchable:false,name:"Land Use"},leisure:{icon:"maki-pitch",fields:["name","leisure"],geometry:["point","vertex","line","area"],tags:{leisure:"*"},searchable:false,name:"Leisure"},man_made:{icon:"temaki-storage_tank",fields:["name","man_made"],moreFields:["material"],geometry:["point","vertex","line","area"],tags:{man_made:"*"},matchScore:0.95,searchable:false,name:"Man Made"},natural:{icon:"maki-natural",fields:["name","natural"],geometry:["point","vertex","line","area"],tags:{natural:"*"},searchable:false,name:"Natural"},place:{fields:["name","place"],geometry:["point","vertex","area"],tags:{place:"*"},searchable:false,name:"Place"},playground:{icon:"maki-playground",fields:["playground"],geometry:["point","vertex","line","area"],tags:{playground:"*"},searchable:false,name:"Playground Equipment"},power:{geometry:["point","vertex","line","area"],tags:{power:"*"},fields:["power"],moreFields:["material"],searchable:false,name:"Power"},railway:{fields:["railway"],geometry:["point","vertex","line","area"],tags:{railway:"*"},searchable:false,name:"Railway"},seamark:{icon:"maki-harbor",fields:["seamark/type"],geometry:["point","vertex","line","area"],tags:{"seamark:type":"*"},searchable:false,name:"Seamark"},tourism:{icon:"maki-attraction",fields:["name","tourism"],geometry:["point","vertex","line","area"],tags:{tourism:"*"},searchable:false,name:"Tourism"},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":{icon:"temaki-storage_tank",fields:["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"},matchScore:0.95,name:"Aerialway Station",searchable:false,replacement:"public_transport/station_aerialway"},"aerialway/cable_car":{icon:"fas-tram",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":{icon:"temaki-chairlift",geometry:["line"],fields:["name","oneway_yes","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":{icon:"maki-aerialway",geometry:["line"],fields:["name","oneway","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/j-bar":{geometry:["line"],fields:["name","aerialway/capacity","aerialway/duration"],terms:["jbar"],tags:{aerialway:"j-bar"},name:"J-bar Lift"},"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","oneway_yes","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","oneway_yes","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"},"aerialway/zip_line":{geometry:["line"],fields:["name","oneway_yes","aerialway/duration","maxweight","access_simple"],terms:["aerial runway","canopy","flying fox","foefie slide","gravity propelled aerial ropeslide","Tyrolean traverse","zip wire","zip-line","zipline","zipwire"],tags:{aerialway:"zip_line"},name:"Zip Line"},"aeroway/aerodrome":{icon:"maki-airport",geometry:["point","area"],fields:["name","iata","icao","operator","internet_access","internet_access/fee","internet_access/ssid"],terms:["aerodrome","aeroway","airplane","airport","jet","plane"],tags:{aeroway:"aerodrome"},matchScore:0.9,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":{icon:"fas-warehouse",geometry:["area"],fields:["name","building_area"],tags:{aeroway:"hangar"},addTags:{building:"hangar",aeroway:"hangar"},name:"Hangar"},"aeroway/helipad":{icon:"maki-heliport",geometry:["point","area"],fields:["name","ref","operator","surface","lit"],moreFields:["access_simple","address","fee","opening_hours"],terms:["helicopter","helipad","heliport"],tags:{aeroway:"helipad"},name:"Helipad"},"aeroway/jet_bridge":{icon:"temaki-pedestrian",geometry:["line"],fields:["ref_aeroway_gate","width","access_simple","wheelchair"],moreFields:["manufacturer"],terms:["aerobridge","air jetty","airbridge","finger","gangway","jet way","jetway","passenger boarding bridge","PBB","portal","skybridge","terminal gate connector"],tags:{aeroway:"jet_bridge"},addTags:{aeroway:"jet_bridge",highway:"corridor"},matchScore:1.05,name:"Jet Bridge"},"aeroway/runway":{icon:"fas-plane-departure",geometry:["line","area"],terms:["landing strip"],fields:["ref_runway","surface","length","width"],tags:{aeroway:"runway"},name:"Runway"},"aeroway/taxiway":{icon:"fas-plane",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"],moreFields:["wheelchair","smoking"],tags:{aeroway:"terminal"},name:"Airport Terminal"},"aeroway/windsock":{icon:"fas-wind",geometry:["point","vertex"],fields:["ref","lit","height"],moreFields:["manufacturer"],tags:{aeroway:"windsock"},name:"Windsock"},"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,replacement:"public_transport/station_bus"},"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/embassy":{icon:"maki-embassy",fields:["name","country","address","building_area"],moreFields:["website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"embassy"},searchable:false,name:"Embassy"},"amenity/ferry_terminal":{icon:"maki-ferry",fields:["name","network","operator","address","building_area"],geometry:["point","vertex","area"],terms:[],tags:{amenity:"ferry_terminal"},matchScore:0.95,name:"Ferry Station / Terminal",searchable:false,replacement:"public_transport/station_ferry"},"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/recycling":{icon:"maki-recycling",fields:["recycling_type","recycling_accepts","collection_times"],geometry:["point","area"],terms:["bin","can","bottle","glass","garbage","rubbish","scrap","trash"],tags:{amenity:"recycling"},name:"Recycling",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:"fas-swimmer",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"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],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"],moreFields:["website","phone","email","fax","wheelchair"],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"],moreFields:["website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["adoption","aspca","cat","dog","horse","kitten","pet care","pet rescue","puppy","raptor","reptile","rescue","spca","pound"],tags:{amenity:"animal_shelter"},name:"Animal Shelter"},"amenity/arts_centre":{icon:"maki-theatre",fields:["name","address","building_area","opening_hours","website"],moreFields:["email","fax","fee","internet_access","internet_access/fee","internet_access/ssid","payment_multi","phone","website","wheelchair"],geometry:["point","area"],terms:[],tags:{amenity:"arts_centre"},name:"Arts Center"},"amenity/atm":{icon:"maki-bank",fields:["operator","network","cash_in","currency_multi","drive_through"],moreFields:["brand","covered","height","indoor","lit","manufacturer","name","opening_hours","wheelchair"],geometry:["point","vertex"],terms:["money","cash","machine"],tags:{amenity:"atm"},name:"ATM"},"amenity/bank":{icon:"maki-bank",fields:["name","operator","address","building_area","atm","drive_through"],moreFields:["air_conditioning","currency_multi","email","fax","internet_access","internet_access/fee","internet_access/ssid","opening_hours","phone","website","wheelchair"],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","address","building_area","outdoor_seating","brewery"],moreFields:["air_conditioning","email","fax","internet_access","internet_access/fee","internet_access/ssid","microbrewery","opening_hours","payment_multi","phone","smoking","website","wheelchair"],geometry:["point","area"],terms:["dive","beer","bier","booze"],tags:{amenity:"bar"},name:"Bar"},"amenity/bar/lgbtq":{icon:"maki-bar",geometry:["point","area"],terms:["gay bar","lesbian bar","lgbtq bar","lgbt bar","lgb bar"],tags:{amenity:"bar",lgbtq:"primary"},name:"LGBTQ+ Bar"},"amenity/bbq":{icon:"maki-bbq",fields:["covered","fuel","access_simple"],moreFields:["lit"],geometry:["point"],terms:["bbq","grill"],tags:{amenity:"bbq"},name:"Barbecue/Grill"},"amenity/bench":{icon:"temaki-bench",fields:["backrest","material","seats","colour"],moreFields:["access_simple","height","inscription","lit","manufacturer","operator"],geometry:["point","vertex","line"],terms:["seat","chair"],tags:{amenity:"bench"},name:"Bench"},"amenity/bicycle_parking":{icon:"maki-bicycle",fields:["bicycle_parking","capacity","operator","operator/type","covered","access_simple","fee","payment_multi_fee"],moreFields:["colour","indoor","lit"],geometry:["point","vertex","area"],terms:["bike"],tags:{amenity:"bicycle_parking"},name:"Bicycle Parking"},"amenity/bicycle_parking/building":{icon:"maki-bicycle",fields:["{amenity/bicycle_parking}","opening_hours","building_area"],geometry:["point","vertex","area"],tags:{amenity:"bicycle_parking",bicycle_parking:"building"},reference:{key:"bicycle_parking"},terms:["Multi-Storey Bicycle Park","Multi-Storey Bike Park","Bike Parking Station"],name:"Bicycle Parking Garage"},"amenity/bicycle_parking/lockers":{icon:"maki-bicycle",geometry:["point","vertex","area"],tags:{amenity:"bicycle_parking",bicycle_parking:"lockers"},reference:{key:"bicycle_parking"},terms:["Bike Lockers"],name:"Bicycle Lockers"},"amenity/bicycle_parking/shed":{icon:"maki-bicycle",fields:["{amenity/bicycle_parking}","building_area"],geometry:["point","vertex","area"],tags:{amenity:"bicycle_parking",bicycle_parking:"shed"},reference:{key:"bicycle_parking"},terms:["Bike Shed"],name:"Bicycle Shed"},"amenity/bicycle_rental":{icon:"maki-bicycle",fields:["capacity","network","operator","operator/type","fee","payment_multi_fee"],moreFields:["address","email","covered","fax","opening_hours","phone","website","wheelchair"],geometry:["point","vertex","area"],terms:["bike","bicycle","bikeshare","bike share","bicycle share","hub","dock"],tags:{amenity:"bicycle_rental"},name:"Bicycle Rental"},"amenity/bicycle_repair_station":{icon:"maki-bicycle",fields:["operator","brand","opening_hours","fee","payment_multi_fee","service/bicycle"],moreFields:["colour","covered","indoor","manufacturer"],geometry:["point","vertex"],terms:["bike","repair","chain","pump","tools","stand","multitool"],tags:{amenity:"bicycle_repair_station"},name:"Bicycle Repair Tool Stand"},"amenity/biergarten":{icon:"fas-beer",fields:["name","address","building","outdoor_seating","brewery"],moreFields:["{amenity/bar}"],geometry:["point","area"],tags:{amenity:"biergarten"},terms:["beer","bier","booze"],name:"Biergarten"},"amenity/boat_rental":{icon:"temaki-boating",fields:["name","operator","operator/type","fee","payment_multi_fee"],moreFields:["address","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"boat_rental"},name:"Boat Rental"},"amenity/bureau_de_change":{icon:"maki-bank",fields:["name","operator","payment_multi","currency_multi","address","building_area"],moreFields:["opening_hours","website","phone","email","fax","wheelchair"],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","outdoor_seating","internet_access","internet_access/fee"],moreFields:["air_conditioning","bar","capacity","delivery","diet_multi","email","fax","internet_access/ssid","opening_hours","payment_multi","phone","reservation","smoking","takeaway","website","wheelchair"],geometry:["point","area"],terms:["bistro","coffee","tea"],tags:{amenity:"cafe"},name:"Cafe"},"amenity/car_pooling":{icon:"maki-car",fields:["name","operator","operator/type","capacity","address","opening_hours","lit"],moreFields:["website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"car_pooling"},name:"Car Pooling"},"amenity/car_rental":{icon:"maki-car-rental",fields:["name","operator","address","opening_hours","payment_multi"],moreFields:["brand","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"car_rental"},name:"Car Rental"},"amenity/car_sharing":{icon:"maki-car",fields:["name","operator","operator/type","capacity","address","payment_multi","supervised"],moreFields:["lit","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"car_sharing"},name:"Car Sharing"},"amenity/car_wash":{icon:"temaki-car_wash",fields:["name","operator","address","building_area","opening_hours","payment_multi","self_service"],moreFields:["website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"car_wash"},name:"Car Wash"},"amenity/casino":{icon:"maki-casino",fields:["name","operator","address","building_area","opening_hours","smoking"],moreFields:["air_conditioning","email","fax","internet_access","internet_access/fee","internet_access/ssid","payment_multi","phone","website","wheelchair"],geometry:["point","area"],terms:["gambling","roulette","craps","poker","blackjack"],tags:{amenity:"casino"},name:"Casino"},"amenity/charging_station":{icon:"fas-charging-station",fields:["name","operator","capacity","access_simple","fee","payment_multi_fee"],moreFields:["brand","covered","manufacturer"],geometry:["point"],tags:{amenity:"charging_station"},terms:["EV","Electric Vehicle","Supercharger"],name:"Charging Station"},"amenity/childcare":{icon:"fas-child",fields:["name","operator","operator/type","address","building_area","opening_hours"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["daycare","orphanage","playgroup"],tags:{amenity:"childcare"},name:"Nursery/Childcare"},"amenity/cinema":{icon:"maki-cinema",fields:["name","address","screen","building_area","opening_hours","payment_multi"],moreFields:["air_conditioning","email","fax","phone","website","wheelchair"],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","operator/type","healthcare/speciality","address","building_area","opening_hours"],moreFields:["air_conditioning","payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["medical","urgentcare"],tags:{amenity:"clinic"},addTags:{amenity:"clinic",healthcare:"clinic"},reference:{key:"amenity",value:"clinic"},name:"Clinic"},"amenity/clinic/abortion":{icon:"maki-hospital",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",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"],moreFields:["covered","height","indoor","lit","manufacturer"],geometry:["point","vertex"],terms:["time"],tags:{amenity:"clock"},name:"Clock"},"amenity/clock/sundial":{icon:"temaki-clock",fields:["name","support","visibility","inscription"],moreFields:[],geometry:["point","vertex"],terms:["gnomon","shadow"],tags:{amenity:"clock",display:"sundial"},reference:{key:"display",value:"sundial"},name:"Sundial"},"amenity/college":{icon:"maki-college",fields:["name","operator","operator/type","address","website","internet_access","internet_access/fee"],moreFields:["religion","denomination","internet_access/ssid","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["university","undergraduate school"],tags:{amenity:"college"},name:"College Grounds"},"amenity/community_centre":{icon:"maki-town-hall",fields:["name","operator","address","building_area"],moreFields:["air_conditioning","email","fax","phone","polling_station","website","wheelchair"],geometry:["point","area"],terms:["event","hall"],tags:{amenity:"community_centre"},name:"Community Center"},"amenity/community_centre/lgbtq":{icon:"maki-town-hall",geometry:["point","area"],terms:["lgbtq event","lgbtq hall","lgbt event","lgbt hall","lgb event","lgb hall"],tags:{amenity:"community_centre",lgbtq:"primary"},name:"LGBTQ+ Community Center"},"amenity/compressed_air":{icon:"maki-car",fields:["operator","access_simple","fee","payment_multi_fee","covered","lit"],moreFields:["brand","manufacturer"],geometry:["point","area"],tags:{amenity:"compressed_air"},name:"Compressed Air"},"amenity/conference_centre":{icon:"fas-user-tie",fields:["name","operator","building_area","address","website","internet_access"],moreFields:["air_conditioning","email","fax","internet_access/fee","internet_access/ssid","phone","smoking","wheelchair"],geometry:["point","area"],tags:{amenity:"conference_centre"},terms:["auditorium","conference","exhibition","exposition","lecture"],name:"Convention Center"},"amenity/courthouse":{icon:"fas-gavel",fields:["name","operator","address","building_area"],moreFields:["email","fax","phone","polling_station","smoking","website","wheelchair"],geometry:["point","area"],tags:{amenity:"courthouse"},name:"Courthouse"},"amenity/crematorium":{icon:"maki-cemetery",fields:["name","website","phone","opening_hours","wheelchair"],moreFields:["address","website","phone","email","fax","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"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["tooth","teeth"],tags:{amenity:"dentist"},addTags:{amenity:"dentist",healthcare:"dentist"},reference:{key:"amenity",value:"dentist"},name:"Dentist"},"amenity/dive_centre":{icon:"temaki-scuba_diving",fields:["name","operator","address","building_area","opening_hours","scuba_diving"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["diving","scuba"],tags:{amenity:"dive_centre"},name:"Dive Center"},"amenity/doctors":{icon:"maki-doctor",fields:["name","operator","healthcare/speciality","address","building_area","opening_hours"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["medic*","physician"],tags:{amenity:"doctors"},addTags:{amenity:"doctors",healthcare:"doctor"},reference:{key:"amenity",value:"doctors"},name:"Doctor"},"amenity/dojo":{icon:"maki-pitch",fields:["name","sport","address","building_area","opening_hours"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["martial arts","dojang"],tags:{amenity:"dojo"},name:"Dojo / Martial Arts Academy"},"amenity/drinking_water":{icon:"maki-drinking-water",fields:["operator","access_simple","fee","payment_multi_fee","wheelchair"],moreFields:["covered","indoor","lit"],geometry:["point"],tags:{amenity:"drinking_water"},terms:["potable water source","water fountain","drinking fountain","bubbler","water tap"],name:"Drinking Water"},"amenity/driving_school":{icon:"maki-car",fields:["name","operator","operator/type","address","building_area","opening_hours"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"driving_school"},name:"Driving School"},"amenity/events_venue":{icon:"fas-users",fields:["name","operator","building_area","address","website","internet_access"],moreFields:["air_conditioning","email","fax","internet_access/fee","internet_access/ssid","phone","smoking","wheelchair"],geometry:["point","area"],tags:{amenity:"events_venue"},terms:["banquet hall","baptism","Bar Mitzvah","Bat Mitzvah","birthdays","celebrations","conferences","confirmation","meetings","parties","party","quinceañera","reunions","weddings"],name:"Events Venue"},"amenity/fast_food":{icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","drive_through"],moreFields:["air_conditioning","opening_hours","diet_multi","takeaway","delivery","smoking","capacity","outdoor_seating","internet_access","internet_access/fee","internet_access/ssid","payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"fast_food"},terms:["restaurant","takeaway"],name:"Fast Food"},"amenity/fast_food/ice_cream":{icon:"fas-ice-cream",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"ice_cream"},reference:{key:"cuisine",value:"ice_cream"},name:"Ice Cream Fast Food",searchable:false},"amenity/fast_food/burger":{icon:"maki-fast-food",geometry:["point","area"],terms:["breakfast","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"fast_food",cuisine:"burger"},reference:{key:"cuisine",value:"burger"},name:"Burger Fast Food"},"amenity/fast_food/chicken":{icon:"fas-drumstick-bite",geometry:["point","area"],terms:["breakfast","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"fast_food",cuisine:"chicken"},reference:{key:"cuisine",value:"chicken"},name:"Chicken Fast Food"},"amenity/fast_food/donut":{icon:"temaki-donut",geometry:["point","area"],terms:["breakfast","brunch","cafe","canteen","coffee","dine","diner","donut","doughnut","dining","eat","lunch","table"],tags:{amenity:"fast_food",cuisine:"donut"},reference:{key:"cuisine",value:"donut"},name:"Donut Fast Food"},"amenity/fast_food/fish_and_chips":{icon:"fas-fish",geometry:["point","area"],terms:["breakfast","cafe","café","dine","dining","dinner","drive-in","eat","grill","lunch","table","french fries"],tags:{amenity:"fast_food",cuisine:"fish_and_chips"},reference:{key:"cuisine",value:"fish_and_chips"},name:"Fish & Chips Fast Food"},"amenity/fast_food/kebab":{icon:"maki-restaurant",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"fast_food",cuisine:"kebab"},reference:{key:"cuisine",value:"kebab"},name:"Kebab Fast Food"},"amenity/fast_food/mexican":{icon:"fas-pepper-hot",geometry:["point","area"],terms:["breakfast","dine","dining","dinner","drive-in","eat","grill","lunch","table","tacos","burritos","enchiladas","fajitas","nachos","tortillas","salsa","tamales","quesadillas"],tags:{amenity:"fast_food",cuisine:"mexican"},reference:{key:"cuisine",value:"mexican"},name:"Mexican Fast Food"},"amenity/fast_food/pizza":{icon:"maki-restaurant-pizza",geometry:["point","area"],terms:["dine","dining","dinner","drive-in","eat","lunch","table","deep dish","thin crust","slice"],tags:{amenity:"fast_food",cuisine:"pizza"},reference:{key:"cuisine",value:"pizza"},name:"Pizza Fast Food"},"amenity/fast_food/sandwich":{icon:"maki-restaurant",geometry:["point","area"],terms:["breakfast","cafe","café","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"fast_food",cuisine:"sandwich"},reference:{key:"cuisine",value:"sandwich"},name:"Sandwich Fast Food"},"amenity/fire_station":{icon:"maki-fire-station",fields:["name","operator","address","building_area"],moreFields:["email","fax","phone","polling_station","smoking","website","wheelchair"],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"],moreFields:["smoking","outdoor_seating","capacity","internet_access","internet_access/fee","internet_access/ssid","diet_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["fast food","restaurant","food"],tags:{amenity:"food_court"},name:"Food Court"},"amenity/fountain":{icon:"temaki-fountain",fields:["name","operator","height","lit"],moreFields:["covered","indoor","manufacturer"],geometry:["point","area"],tags:{amenity:"fountain"},name:"Fountain"},"amenity/fuel":{icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","self_service"],moreFields:["opening_hours","payment_multi","building","website","phone","email","fax","wheelchair"],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","address"],moreFields:["website","phone","email","fax"],geometry:["point","area"],tags:{amenity:"grave_yard"},name:"Graveyard"},"amenity/grit_bin":{icon:"fas-box",fields:["operator","access_simple","material","collection_times"],moreFields:["colour","height","lit"],geometry:["point","vertex"],tags:{amenity:"grit_bin"},terms:["salt","sand"],name:"Grit Bin"},"amenity/hospital":{icon:"maki-hospital",fields:["name","operator","operator/type","healthcare/speciality","address","emergency"],moreFields:["internet_access","internet_access/fee","internet_access/ssid","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["clinic","doctor","emergency room","health","infirmary","institution","sanatorium","sanitarium","sick","surgery","ward"],tags:{amenity:"hospital"},addTags:{amenity:"hospital",healthcare:"hospital"},reference:{key:"amenity",value:"hospital"},name:"Hospital Grounds"},"amenity/hunting_stand":{icon:"temaki-binoculars",fields:["access_simple"],geometry:["point","vertex","area"],terms:["game","gun","lookout","rifle","shoot*","wild","watch"],tags:{amenity:"hunting_stand"},name:"Hunting Stand"},"amenity/ice_cream":{icon:"fas-ice-cream",fields:["name","address","building_area","opening_hours","outdoor_seating"],moreFields:["takeaway","delivery","drive_through","internet_access","internet_access/fee","internet_access/ssid","diet_multi","payment_multi","website","phone","email","fax","wheelchair"],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","operator/type","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],moreFields:["air_conditioning","email","fax","opening_hours","outdoor_seating","payment_multi","phone","smoking","website","wheelchair"],geometry:["point","area"],terms:["cybercafe","taxiphone","teleboutique","coffee","cafe","net","lanhouse"],tags:{amenity:"internet_cafe"},name:"Internet Cafe"},"amenity/karaoke":{icon:"maki-karaoke",fields:["name","operator","address","building_area","opening_hours","website"],moreFields:["air_conditioning","email","fax","payment_multi","phone","smoking","wheelchair"],geometry:["point","area"],terms:["karaoke club","karaoke room","karaoke television","KTV"],tags:{amenity:"karaoke_box"},name:"Karaoke Box"},"amenity/kindergarten":{icon:"maki-school",fields:["name","operator","address"],moreFields:["opening_hours","payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["kindergarden","pre-school"],tags:{amenity:"kindergarten"},name:"Preschool/Kindergarten Grounds"},"amenity/language_school":{icon:"maki-school",fields:["name","operator","operator/type","address","building_area","opening_hours","language_multi"],moreFields:["email","fax","internet_access","internet_access/fee","internet_access/ssid","payment_multi","phone","website","wheelchair"],geometry:["point","area"],terms:["esl"],tags:{amenity:"language_school"},name:"Language School"},"amenity/library":{icon:"maki-library",fields:["name","operator","operator/type","building_area","address","ref/isil","internet_access","internet_access/fee","internet_access/ssid"],moreFields:["access_simple","air_conditioning","email","fax","opening_hours","payment_multi","phone","polling_station","website","wheelchair"],geometry:["point","area"],terms:["book"],tags:{amenity:"library"},name:"Library"},"amenity/love_hotel":{icon:"maki-heart",fields:["name","operator","address","building_area","rooms","internet_access","internet_access/fee"],moreFields:["smoking","payment_multi","internet_access/ssid","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"love_hotel"},name:"Love Hotel"},"amenity/marketplace":{icon:"maki-shop",fields:["name","operator","address","building","opening_hours"],moreFields:["website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"marketplace"},name:"Marketplace"},"amenity/monastery":{icon:"maki-place-of-worship",fields:["name","religion","denomination","address","building_area"],moreFields:["website","phone","email","fax","wheelchair"],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/money_transfer":{icon:"maki-bank",fields:["name","brand","address","building_area","payment_multi","currency_multi"],moreFields:["opening_hours","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["money order","check","bill","currency","finance","wire transfer","cable","person to person","cash to cash","exchange"],tags:{amenity:"money_transfer"},name:"Money Transfer Station"},"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","building_area","opening_hours"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],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"],moreFields:["air_conditioning","payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"nightclub"},terms:["disco*","night club","dancing","dance club"],name:"Nightclub"},"amenity/nightclub/lgbtq":{icon:"maki-bar",geometry:["point","area"],tags:{amenity:"nightclub",lgbtq:"primary"},terms:["gay nightclub","lesbian nightclub","lgbtq nightclub","lgbt nightclub","lgb nightclub"],name:"LGBTQ+ 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-car",fields:["operator","operator/type","parking","capacity","access_simple","fee","payment_multi_fee","surface"],moreFields:["address","covered","email","fax","maxstay","name","opening_hours","park_ride","phone","ref","supervised","website","wheelchair"],geometry:["point","vertex","area"],tags:{amenity:"parking"},terms:["automobile parking","car lot","car parking","rv parking","truck parking","vehicle parking"],name:"Parking Lot"},"amenity/parking/multi-storey":{icon:"maki-car",fields:["name","{amenity/parking}","building"],moreFields:["{amenity/parking}","levels","height"],geometry:["area"],tags:{amenity:"parking",parking:"multi-storey"},addTags:{building:"parking",amenity:"parking",parking:"multi-storey"},reference:{key:"parking",value:"multi-storey"},terms:["car","indoor parking","multistorey car park","parkade","parking building","parking deck","parking garage","parking ramp","parking structure"],name:"Multilevel Parking Garage"},"amenity/parking/underground":{icon:"maki-car",fields:["{amenity/parking}","layer"],geometry:["point","vertex","area"],tags:{amenity:"parking",parking:"underground"},addTags:{amenity:"parking",parking:"underground",layer:"-1"},reference:{key:"parking",value:"underground"},terms:["automobile parking","car lot","car parking","rv parking","subsurface parking","truck parking","vehicle parking"],name:"Underground Parking"},"amenity/payment_centre":{icon:"maki-bank",fields:["name","brand","address","building_area","opening_hours","payment_multi"],moreFields:["currency_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["check","tax pay","bill pay","currency","finance","cash","money"],tags:{amenity:"payment_centre"},name:"Payment Center"},"amenity/payment_terminal":{icon:"far-credit-card",fields:["name","brand","address","opening_hours","payment_multi"],moreFields:["currency_multi","wheelchair"],geometry:["point"],terms:["interactive kiosk","ekiosk","atm","bill pay","tax pay","phone pay","finance","cash","money transfer","card"],tags:{amenity:"payment_terminal"},name:"Payment Terminal"},"amenity/pharmacy":{icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","dispensing"],moreFields:["opening_hours","payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"pharmacy"},addTags:{amenity:"pharmacy",healthcare:"pharmacy"},reference:{key:"amenity",value:"pharmacy"},terms:["apothecary","drug store","drugstore","med*","prescription"],name:"Pharmacy Counter"},"amenity/photo_booth":{icon:"fas-person-booth",fields:["name","operator","payment_multi","wheelchair"],moreFields:["brand","indoor"],geometry:["point","area"],terms:["photobooth","photo","booth","kiosk","camera"],tags:{amenity:"photo_booth"},name:"Photo Booth"},"amenity/place_of_worship":{icon:"maki-place-of-worship",fields:["name","religion","denomination","address","building_area","service_times"],moreFields:["air_conditioning","email","fax","internet_access","internet_access/ssid","opening_hours","phone","polling_station","website","wheelchair"],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-religious-buddhist",fields:["name","religion","denomination","{amenity/place_of_worship}"],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","religion","denomination","{amenity/place_of_worship}"],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:"Christian Church"},"amenity/place_of_worship/christian/jehovahs_witness":{icon:"maki-place-of-worship",geometry:["point","area"],terms:["christian","church","house of God","house of prayer","house of worship"],tags:{amenity:"place_of_worship",religion:"christian",denomination:"jehovahs_witness"},reference:{key:"denomination",value:"jehovahs_witness"},name:"Kingdom Hall of Jehovah's Witnesses"},"amenity/place_of_worship/christian/la_luz_del_mundo":{icon:"maki-place-of-worship",geometry:["point","area"],terms:["christian","church","house of God","house of prayer","house of worship","the light of the world church"],tags:{amenity:"place_of_worship",religion:"christian",denomination:"la_luz_del_mundo"},reference:{key:"denomination",value:"la_luz_del_mundo"},name:"La Luz del Mundo Temple"},"amenity/place_of_worship/christian/quaker":{icon:"maki-place-of-worship",geometry:["point","area"],terms:["christian","church","house of God","house of prayer","house of worship"],tags:{amenity:"place_of_worship",religion:"christian",denomination:"quaker"},reference:{key:"denomination",value:"quaker"},name:"Quaker Friends Meeting House"},"amenity/place_of_worship/hindu":{icon:"temaki-hinduism",fields:["name","religion","denomination","{amenity/place_of_worship}"],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","religion","denomination","{amenity/place_of_worship}"],geometry:["point","area"],terms:["jewish"],tags:{amenity:"place_of_worship",religion:"jewish"},reference:{key:"amenity",value:"place_of_worship"},name:"Jewish Synagogue"},"amenity/place_of_worship/muslim":{icon:"maki-religious-muslim",fields:["name","religion","denomination","{amenity/place_of_worship}"],geometry:["point","area"],terms:["islam","islamic center","muslim"],tags:{amenity:"place_of_worship",religion:"muslim"},reference:{key:"amenity",value:"place_of_worship"},name:"Muslim Mosque"},"amenity/place_of_worship/shinto":{icon:"temaki-shinto",fields:["name","religion","denomination","{amenity/place_of_worship}"],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","religion","denomination","{amenity/place_of_worship}"],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","religion","denomination","{amenity/place_of_worship}"],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-globe",fields:["name","operator","address","building_area","opening_hours"],moreFields:["air_conditioning","fee","payment_multi_fee","website","phone","email","fax","wheelchair"],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"],moreFields:["email","fax","phone","polling_station","website","wheelchair"],geometry:["point","area"],terms:["badge","constable","constabulary","cop","detective","fed","law","enforcement","officer","patrol"],tags:{amenity:"police"},name:"Police"},"amenity/polling_station":{icon:"fas-vote-yea",fields:["name","ref","operator","address","opening_hours","building_area"],moreFields:["air_conditioning","email","fax","internet_access","internet_access/fee","internet_access/ssid","phone","website","wheelchair"],geometry:["point","area"],terms:["ballot box","ballot drop","democracy","elections","polling place","vote","voting booth","voting machine"],tags:{amenity:"polling_station"},addTags:{amenity:"polling_station",polling_station:"yes"},name:"Permanent Polling Place"},"amenity/post_box":{icon:"temaki-post_box",fields:["operator","collection_times","drive_through","ref"],moreFields:["access_simple","brand","covered","height","indoor","manufacturer","wheelchair"],geometry:["point","vertex"],tags:{amenity:"post_box"},terms:["letter drop","mail box","package drop","post box","postal box"],name:"Mailbox"},"amenity/post_office":{icon:"maki-post",fields:["name","operator","address","building_area","opening_hours"],moreFields:["email","fax","internet_access","internet_access/fee","internet_access/ssid","payment_multi","phone","polling_station","website","wheelchair"],geometry:["point","area"],terms:["letter","mail"],tags:{amenity:"post_office"},name:"Post Office"},"amenity/prep_school":{icon:"temaki-school",fields:["name","operator","address","building_area","opening_hours"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["academic","ACT","SAT","homework","math","reading","test prep","tutoring","writing"],tags:{amenity:"prep_school"},name:"Test Prep / Tutoring School"},"amenity/prison":{icon:"maki-prison",fields:["name","operator","operator/type","address"],moreFields:["website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["cell","jail","correction"],tags:{amenity:"prison"},name:"Prison Grounds"},"amenity/pub":{icon:"maki-beer",fields:["name","address","building_area","opening_hours","smoking","brewery"],moreFields:["air_conditioning","diet_multi","email","fax","internet_access","internet_access/fee","internet_access/ssid","microbrewery","outdoor_seating","payment_multi","phone","website","wheelchair"],geometry:["point","area"],tags:{amenity:"pub"},terms:["alcohol","drink","dive","beer","bier","booze"],name:"Pub"},"amenity/pub/lgbtq":{icon:"maki-beer",geometry:["point","area"],tags:{amenity:"pub",lgbtq:"primary"},terms:["gay pub","lesbian pub","lgbtq pub","lgbt pub","lgb pub"],name:"LGBTQ+ Pub"},"amenity/pub/microbrewery":{icon:"maki-beer",geometry:["point","area"],tags:{amenity:"pub",microbrewery:"yes"},reference:{key:"microbrewery"},terms:["alcohol","drink","dive","beer","bier","booze","craft brewery","microbrewery","small batch brewery"],name:"Brewpub"},"amenity/public_bath":{icon:"maki-water",fields:["name","bath/type","bath/open_air","bath/sand_bath","address","building_area","fee"],moreFields:["email","fax","internet_access","internet_access/fee","internet_access/ssid","opening_hours","payment_multi_fee","phone","website","wheelchair"],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","opening_hours","capacity","website","lit"],moreFields:["wheelchair","location","access_simple","brand","email","phone"],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"],moreFields:["email","fax","internet_access","internet_access/fee","internet_access/ssid","phone","website","wheelchair"],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","operator/type","address","building","opening_hours","recycling_accepts"],moreFields:["fee","payment_multi_fee","website","phone","email","fax","wheelchair"],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_container":{icon:"maki-recycling",fields:["operator","recycling_accepts","collection_times","material","colour"],moreFields:["covered","indoor","manufacturer"],geometry:["point","area"],terms:["bin","can","bottle","glass","garbage","rubbish","scrap","trash"],tags:{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","phone"],moreFields:["air_conditioning","bar","brewery","capacity","delivery","diet_multi","email","fax","internet_access","internet_access/fee","internet_access/ssid","microbrewery","outdoor_seating","reservation","smoking","stars","takeaway","website","wheelchair"],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/restaurant/american":{icon:"maki-restaurant",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","coffee","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"american"},reference:{key:"cuisine",value:"american"},name:"American Restaurant"},"amenity/restaurant/asian":{icon:"maki-restaurant-noodle",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"asian"},reference:{key:"cuisine",value:"asian"},name:"Asian Restaurant"},"amenity/restaurant/chinese":{icon:"maki-restaurant-noodle",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"chinese"},reference:{key:"cuisine",value:"chinese"},name:"Chinese Restaurant"},"amenity/restaurant/french":{icon:"maki-restaurant",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"french"},reference:{key:"cuisine",value:"french"},name:"French Restaurant"},"amenity/restaurant/german":{icon:"maki-restaurant",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"german"},reference:{key:"cuisine",value:"german"},name:"German Restaurant"},"amenity/restaurant/greek":{icon:"maki-restaurant",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table","gyros","pitas","olives"],tags:{amenity:"restaurant",cuisine:"greek"},reference:{key:"cuisine",value:"greek"},name:"Greek Restaurant"},"amenity/restaurant/indian":{icon:"maki-restaurant",geometry:["point","area"],terms:["bar","breakfast","dine","dining","dinner","drive-in","eat","grill","lunch","table","curry"],tags:{amenity:"restaurant",cuisine:"indian"},reference:{key:"cuisine",value:"indian"},name:"Indian Restaurant"},"amenity/restaurant/italian":{icon:"maki-restaurant",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table","pasta","pizza"],tags:{amenity:"restaurant",cuisine:"italian"},reference:{key:"cuisine",value:"italian"},name:"Italian Restaurant"},"amenity/restaurant/japanese":{icon:"maki-restaurant-noodle",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"japanese"},reference:{key:"cuisine",value:"japanese"},name:"Japanese Restaurant"},"amenity/restaurant/mexican":{icon:"fas-pepper-hot",geometry:["point","area"],terms:["bar","breakfast","dine","dining","dinner","drive-in","eat","grill","lunch","table","tacos","burritos","enchiladas","fajitas","nachos","tortillas","salsa","tamales","quesadillas"],tags:{amenity:"restaurant",cuisine:"mexican"},reference:{key:"cuisine",value:"mexican"},name:"Mexican Restaurant"},"amenity/restaurant/noodle":{icon:"maki-restaurant-noodle",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table","ramen noodles","soup","soba noodles","cellophane noodles","rice noodles"],tags:{amenity:"restaurant",cuisine:"noodle"},reference:{key:"cuisine",value:"noodle"},name:"Noodle Restaurant"},"amenity/restaurant/pizza":{icon:"maki-restaurant-pizza",geometry:["point","area"],terms:["bar","dine","dining","dinner","drive-in","eat","lunch","table","deep dish","thin crust","slice"],tags:{amenity:"restaurant",cuisine:"pizza"},reference:{key:"cuisine",value:"pizza"},name:"Pizza Restaurant"},"amenity/restaurant/seafood":{icon:"maki-restaurant-seafood",geometry:["point","area"],terms:["bar","breakfast","cafe","café","dine","dining","dinner","drive-in","eat","grill","lunch","table","fish","shellfish","molluscs","crustaceans","clams","oysters","lobsters","crab","shrimp","squid","octopus"],tags:{amenity:"restaurant",cuisine:"seafood"},reference:{key:"cuisine",value:"seafood"},name:"Seafood Restaurant"},"amenity/restaurant/steakhouse":{icon:"maki-slaughterhouse",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table","steak house","chop house","beef"],tags:{amenity:"restaurant",cuisine:"steak_house"},reference:{key:"cuisine",value:"steak_house"},name:"Steakhouse"},"amenity/restaurant/sushi":{icon:"fas-fish",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"sushi"},reference:{key:"cuisine",value:"sushi"},name:"Sushi Restaurant"},"amenity/restaurant/thai":{icon:"maki-restaurant-noodle",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"thai"},reference:{key:"cuisine",value:"thai"},name:"Thai Restaurant"},"amenity/restaurant/turkish":{icon:"maki-restaurant",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"turkish"},reference:{key:"cuisine",value:"turkish"},name:"Turkish Restaurant"},"amenity/restaurant/vietnamese":{icon:"maki-restaurant-noodle",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"vietnamese"},reference:{key:"cuisine",value:"vietnamese"},name:"Vietnamese Restaurant"},"amenity/sanitary_dump_station":{icon:"temaki-storage_tank",fields:["operator","access_simple","fee","payment_multi_fee","water_point"],moreFields:["opening_hours"],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","operator/type","address","religion","denomination","website"],moreFields:["email","fax","fee","internet_access","internet_access/ssid","phone","polling_station","wheelchair"],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"],moreFields:["lit","wheelchair"],geometry:["point","vertex","area"],terms:["lean-to","gazebo","picnic"],tags:{amenity:"shelter"},name:"Shelter"},"amenity/shelter/gazebo":{icon:"maki-shelter",fields:["name","building_area","bench","lit"],geometry:["point","area"],tags:{amenity:"shelter",shelter_type:"gazebo"},name:"Gazebo"},"amenity/shelter/lean_to":{icon:"maki-shelter",fields:["name","operator","building_area"],geometry:["point","area"],tags:{amenity:"shelter",shelter_type:"lean_to"},name:"Lean-To"},"amenity/shelter/picnic_shelter":{icon:"maki-shelter",fields:["name","shelter_type","building_area","lit","bin"],geometry:["point","area"],tags:{amenity:"shelter",shelter_type:"picnic_shelter"},reference:{key:"shelter_type",value:"picnic_shelter"},terms:["pavilion"],name:"Picnic Shelter"},"amenity/shelter/public_transport":{icon:"maki-shelter",fields:["name","shelter_type","building_area","bench","lit"],geometry:["point","area"],terms:["bus stop","metro stop","public transit shelter","public transport shelter","tram stop shelter","waiting"],tags:{amenity:"shelter",shelter_type:"public_transport"},reference:{key:"shelter_type",value:"public_transport"},name:"Transit Shelter"},"amenity/shower":{icon:"fas-shower",fields:["opening_hours","access_simple","fee","payment_multi_fee","supervised","building_area","wheelchair"],moreFields:["address","operator","gender"],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"],moreFields:["lit","wheelchair","covered"],geometry:["point","vertex","area"],terms:[],tags:{amenity:"smoking_area"},name:"Smoking Area"},"amenity/social_centre":{icon:"fas-handshake",fields:["name","brand","operator","operator/type","address","building_area"],moreFields:["air_conditioning","email","fax","internet_access","internet_access/fee","internet_access/ssid","phone","polling_station","website","wheelchair"],geometry:["point","area"],terms:["event","fraternal","fraternity","hall","organization","professional","society","sorority","union","vetern"],tags:{amenity:"social_centre"},name:"Social Center"},"amenity/social_facility":{icon:"temaki-social_facility",fields:["name","operator","operator/type","address","building_area","social_facility","social_facility_for"],moreFields:["email","fax","internet_access","internet_access/fee","internet_access/ssid","opening_hours","phone","website","wheelchair"],geometry:["point","area"],terms:[],tags:{amenity:"social_facility"},name:"Social Facility"},"amenity/social_facility/ambulatory_care":{icon:"maki-wheelchair",geometry:["point","area"],tags:{amenity:"social_facility",social_facility:"ambulatory_care"},reference:{key:"social_facility",value:"ambulatory_care"},name:"Ambulatory Care"},"amenity/social_facility/food_bank":{icon:"temaki-social_facility",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:["{amenity/social_facility}","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",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:["{amenity/social_facility}","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:"fas-microphone",fields:["name","studio","address","building_area"],moreFields:["internet_access","internet_access/fee","internet_access/ssid","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["recording","radio","television"],tags:{amenity:"studio"},name:"Studio"},"amenity/taxi":{icon:"fas-taxi",fields:["name","operator","capacity","address"],moreFields:["access_simple","brand","opening_hours","wheelchair"],geometry:["point","vertex","area"],terms:["cab"],tags:{amenity:"taxi"},name:"Taxi Stand"},"amenity/telephone":{icon:"maki-telephone",fields:["operator","phone","fee","payment_multi_fee","booth"],moreFields:["covered","indoor","lit","wheelchair"],geometry:["point","vertex"],tags:{amenity:"telephone"},terms:["phone"],name:"Telephone"},"amenity/theatre":{icon:"maki-theatre",fields:["name","operator","address","building_area"],moreFields:["air_conditioning","internet_access","internet_access/fee","internet_access/ssid","payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["theatre","performance","play","musical"],tags:{amenity:"theatre"},name:"Theater"},"amenity/theatre/type/amphi":{icon:"maki-theatre",fields:["name","operator","address","lit"],geometry:["point","area"],terms:["open air","outdoor","greek","ampi"],tags:{amenity:"theatre","theatre:type":"amphi"},name:"Amphitheatre"},"amenity/toilets":{icon:"maki-toilet",fields:["toilets/disposal","access_simple","gender","diaper","wheelchair","building_area"],moreFields:["fee","opening_hours","operator","payment_multi_fee","toilets/handwashing","toilets/position"],geometry:["point","vertex","area"],terms:["bathroom","restroom","outhouse","privy","head","lavatory","latrine","water closet","WC","W.C."],tags:{amenity:"toilets"},name:"Toilets"},"amenity/toilets/disposal/flush":{icon:"fas-toilet",fields:["toilets/disposal","{amenity/toilets}"],moreFields:["{amenity/toilets}"],geometry:["point","vertex","area"],terms:["bathroom","head","lavatory","privy","restroom","water closet","WC","W.C."],tags:{amenity:"toilets","toilets:disposal":"flush"},reference:{key:"toilets:disposal",value:"flush"},name:"Flush Toilets"},"amenity/toilets/disposal/pitlatrine":{icon:"tnp-2009541",fields:["toilets/disposal","{amenity/toilets}","toilets/handwashing"],moreFields:["{amenity/toilets}"],geometry:["point","vertex","area"],terms:["head","lavatory","long drop","outhouse","pit toilet","privy"],tags:{amenity:"toilets","toilets:disposal":"pitlatrine"},reference:{key:"toilets:disposal",value:"pitlatrine"},name:"Pit Latrine"},"amenity/townhall":{icon:"maki-town-hall",fields:["name","operator","address","building_area"],moreFields:["email","fax","phone","polling_station","smoking","website","wheelchair"],geometry:["point","area"],terms:["village","city","government","courthouse","municipal"],tags:{amenity:"townhall"},name:"Town Hall"},"amenity/toy_library":{icon:"fas-chess-knight",fields:["operator","address","building_area","opening_hours"],moreFields:["website","wheelchair"],geometry:["point","area"],terms:["game","toy"],tags:{amenity:"toy_library"},name:"Toy Library"},"amenity/university":{icon:"maki-college",fields:["{amenity/college}"],moreFields:["{amenity/college}"],geometry:["point","area"],terms:["college","graduate school","PhD program","master's degree program"],tags:{amenity:"university"},name:"University Grounds"},"amenity/vehicle_inspection":{icon:"maki-car",fields:["name","operator","address","building_area","opening_hours"],moreFields:["email","fax","payment_multi","phone","website","wheelchair"],geometry:["point","area"],terms:["car inspection"],tags:{amenity:"vehicle_inspection"},name:"Vehicle Inspection"},"amenity/vending_machine":{icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],moreFields:["brand","covered","height","indoor","manufacturer"],geometry:["point"],terms:[],tags:{amenity:"vending_machine"},matchScore:0.9,name:"Vending Machine"},"amenity/vending_machine/cigarettes":{icon:"temaki-vending_machine",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",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",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",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",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",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:["{amenity/vending_machine}"],geometry:["point"],terms:["excrement bags","poop","waste","dog","animal"],tags:{amenity:"vending_machine",vending:"excrement_bags"},reference:{key:"vending",value:"excrement_bags"},name:"Excrement Bag Dispenser"},"amenity/vending_machine/feminine_hygiene":{icon:"temaki-vending_machine",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",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",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",matchScore:0.5},"amenity/vending_machine/ice_cream":{icon:"temaki-vending_machine",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:"far-newspaper",fields:["vending","operator","fee","payment_multi_fee","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:["mail","parcel","pickup"],tags:{amenity:"vending_machine",vending:"parcel_pickup;parcel_mail_in"},reference:{key:"vending",value:"parcel_pickup;parcel_mail_in"},name:"Parcel Pickup/Dropoff Locker"},"amenity/vending_machine/parcel_pickup":{icon:"temaki-vending_machine",fields:["vending","operator"],geometry:["point"],terms:["amazon","locker","mail","parcel","pickup"],tags:{amenity:"vending_machine",vending:"parcel_pickup"},reference:{key:"vending",value:"parcel_pickup"},name:"Parcel Pickup Locker"},"amenity/vending_machine/parking_tickets":{icon:"temaki-vending_machine",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",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",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",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:"temaki-veterinary_care",fields:["name","operator","address","building_area","opening_hours"],moreFields:["fee","payment_multi_fee","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["pet clinic","veterinarian","animal hospital","pet doctor"],tags:{amenity:"veterinary"},name:"Veterinary"},"amenity/waste_basket":{icon:"maki-waste-basket",fields:["operator","collection_times","material","colour"],moreFields:["covered","indoor","manufacturer"],geometry:["point","vertex"],tags:{amenity:"waste_basket"},terms:["bin","garbage","rubbish","litter","trash"],name:"Waste Basket"},"amenity/waste_disposal":{icon:"fas-dumpster",fields:["operator","collection_times","access_simple"],moreFields:["brand","colour","height","manufacturer","material"],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","operator/type","address","opening_hours","fee","payment_multi_fee"],moreFields:["email","fax","phone","website","wheelchair"],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",fields:["operator","fee","payment_multi_fee","opening_hours"],geometry:["area","vertex","point"],tags:{amenity:"water_point"},name:"RV Drinking Water"},"amenity/watering_place":{icon:"maki-drinking-water",fields:["operator","fee","payment_multi_fee","opening_hours"],geometry:["area","vertex","point"],tags:{amenity:"watering_place"},name:"Animal Watering Place"},area:{fields:["name"],geometry:["area"],tags:{area:"yes"},terms:["polygon"],name:"Area",matchScore:0.1},"area/highway":{fields:["name","area/highway","surface"],geometry:["area"],terms:["area:highway","edge of pavement","highway area","highway shape","pavement","road shape","street area"],tags:{"area:highway":"*"},name:"Road Surface"},"attraction/amusement_ride":{icon:"maki-amusement-park",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:["amphibian","animal park","aquarium","bear","bird","fish","insect","lion","mammal","monkey","penguin","reptile","safari","theme park","tiger","zoo"],tags:{attraction:"animal"},name:"Animal Enclosure"},"attraction/big_wheel":{icon:"maki-amusement-park",fields:["{attraction}","height"],geometry:["point"],terms:["ferris wheel","theme park","amusement ride"],tags:{attraction:"big_wheel"},name:"Big Wheel"},"attraction/bumper_car":{icon:"maki-car",geometry:["point","area"],terms:["theme park","dodgem cars","autoscooter"],tags:{attraction:"bumper_car"},name:"Bumper Car"},"attraction/bungee_jumping":{icon:"maki-pitch",fields:["{attraction}","height"],geometry:["point","area"],terms:["theme park","bungy jumping","jumping platform"],tags:{attraction:"bungee_jumping"},name:"Bungee Jumping"},"attraction/carousel":{icon:"temaki-amusement_park",fields:["{attraction}","building_area"],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:["{attraction}","building_area"],geometry:["point","line","area"],terms:["theme park","ghost train"],tags:{attraction:"dark_ride"},name:"Dark Ride"},"attraction/drop_tower":{icon:"temaki-tower",fields:["{attraction}","height"],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",geometry:["point","area"],terms:["theme park","amusement ride","labyrinth"],tags:{attraction:"maze"},name:"Maze"},"attraction/pirate_ship":{icon:"maki-danger",geometry:["point"],terms:["theme park","carnival ride","amusement ride"],tags:{attraction:"pirate_ship"},name:"Pirate Ship"},"attraction/river_rafting":{icon:"maki-ferry",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",geometry:["point","area"],terms:["theme park","amusement ride"],tags:{attraction:"roller_coaster"},name:"Roller Coaster"},"attraction/summer_toboggan":{icon:"temaki-sledding",geometry:["line"],terms:["alpine slide","mountain coaster"],tags:{attraction:"summer_toboggan"},name:"Summer Toboggan"},"attraction/train":{icon:"maki-rail",fields:["{attraction}","fee"],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:"fas-swimmer",fields:["{attraction}","height"],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","material"],geometry:["point","vertex"],tags:{barrier:"block"},name:"Block"},"barrier/bollard":{icon:"maki-roadblock",fields:["access","material"],geometry:["point","vertex","line"],tags:{barrier:"bollard"},name:"Bollard"},"barrier/border_control":{icon:"maki-roadblock",fields:["access","building_area"],moreFields:["address","website","phone","email","fax"],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/chain":{icon:"maki-barrier",fields:["access"],geometry:["vertex","line"],tags:{barrier:"chain"},name:"Chain"},"barrier/city_wall":{icon:"temaki-wall",fields:["height","material"],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","material"],geometry:["line"],tags:{barrier:"fence"},name:"Fence",matchScore:0.25},"barrier/fence/railing":{icon:"temaki-railing",geometry:["line"],tags:{barrier:"fence",fence_type:"railing"},terms:["railing","handrail","guard rail"],name:"Railing",matchScore:0.5},"barrier/gate":{icon:"maki-barrier",fields:["access","opening_hours"],geometry:["vertex","line"],tags:{barrier:"gate"},name:"Gate"},"barrier/guard_rail":{icon:"temaki-guard_rail",fields:["material"],geometry:["line"],tags:{barrier:"guard_rail"},name:"Guard Rail",terms:["guardrail","traffic barrier","crash barrier","median barrier","roadside barrier","Armco barrier"],matchScore:0.75},"barrier/hedge":{fields:["height"],geometry:["line","area"],tags:{barrier:"hedge"},name:"Hedge",matchScore:0.25},"barrier/height_restrictor":{icon:"temaki-car_wash",fields:["maxheight"],geometry:["vertex"],tags:{barrier:"height_restrictor"},name:"Height Restrictor"},"barrier/kerb":{icon:"temaki-kerb-raised",fields:["kerb","tactile_paving","wheelchair"],moreFields:["material"],geometry:["vertex","line"],tags:{barrier:"kerb"},matchScore:0.8,name:"Curb"},"barrier/kerb/flush":{icon:"temaki-kerb-flush",fields:["kerb","{barrier/kerb}"],geometry:["vertex","line"],tags:{kerb:"flush"},addTags:{barrier:"kerb",kerb:"flush"},reference:{key:"kerb",value:"flush"},terms:["even curb","level curb","tactile curb"],matchScore:0.85,name:"Flush Curb"},"barrier/kerb/lowered":{icon:"temaki-kerb-lowered",fields:["kerb","{barrier/kerb}","kerb/height"],geometry:["vertex","line"],tags:{kerb:"lowered"},addTags:{barrier:"kerb",kerb:"lowered"},reference:{key:"kerb",value:"lowered"},terms:["curb cut","curb ramp","kerb ramp","dropped kerb","pram ramp"],matchScore:0.85,name:"Lowered Curb"},"barrier/kerb/raised":{icon:"temaki-kerb-raised",fields:["kerb","{barrier/kerb}","kerb/height"],geometry:["vertex","line"],tags:{kerb:"raised"},addTags:{barrier:"kerb",kerb:"raised"},reference:{key:"kerb",value:"raised"},terms:[],matchScore:0.85,name:"Raised Curb"},"barrier/kerb/rolled":{icon:"temaki-kerb-rolled",fields:["kerb","{barrier/kerb}","kerb/height"],geometry:["vertex","line"],tags:{kerb:"rolled"},addTags:{barrier:"kerb",kerb:"rolled"},reference:{key:"kerb",value:"rolled"},terms:["gutter"],matchScore:0.85,name:"Rolled Curb"},"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":{icon:"temaki-wall",fields:["height","material"],geometry:["line","area"],tags:{barrier:"retaining_wall"},name:"Retaining Wall"},"barrier/sally_port":{icon:"fas-dungeon",geometry:["vertex"],tags:{barrier:"sally_port"},terms:["Postern","castle side gate"],name:"Sally Port"},"barrier/stile":{icon:"maki-roadblock",fields:["access"],geometry:["vertex"],tags:{barrier:"stile"},name:"Stile"},"barrier/toll_booth":{icon:"maki-roadblock",fields:["access","building_area","payment_multi","currency_multi"],moreFields:["address","email","fax","opening_hours","phone","website"],geometry:["vertex","area"],tags:{barrier:"toll_booth"},name:"Toll Booth"},"barrier/turnstile":{icon:"maki-roadblock",fields:["access"],geometry:["vertex"],terms:["baffle gate","turnstyle"],tags:{barrier:"turnstile"},name:"Turnstile"},"barrier/wall":{icon:"temaki-wall",fields:["wall","height","material"],geometry:["line","area"],tags:{barrier:"wall"},name:"Wall",matchScore:0.25},"boundary/administrative":{fields:["name","admin_level"],geometry:["line"],tags:{boundary:"administrative"},name:"Administrative Boundary",matchScore:0.5},"bridge/support":{icon:"fas-archway",fields:["bridge/support"],moreFields:["material","seamark/type"],geometry:["point","vertex","area"],tags:{"bridge:support":"*"},name:"Bridge Support"},"bridge/support/pier":{icon:"fas-archway",fields:["bridge/support"],moreFields:["material","seamark/type"],geometry:["point","vertex","area"],tags:{"bridge:support":"pier"},name:"Bridge Pier"},building_part:{icon:"maki-building",fields:["levels","height","building/material","roof/colour"],moreFields:["layer"],geometry:["area"],tags:{"building:part":"*"},matchScore:0.5,terms:["roof","simple 3D buildings"],name:"Building Part"},building:{icon:"maki-home",fields:["name","building","levels","height","address"],moreFields:["architect","building/material","layer","operator","roof/colour","smoking","wheelchair"],geometry:["area"],tags:{building:"*"},matchScore:0.6,terms:[],name:"Building"},"building/bunker":{geometry:["area"],tags:{building:"bunker"},matchScore:0.5,name:"Bunker",searchable:false},"building/entrance":{icon:"maki-entrance-alt1",fields:[],moreFields:[],geometry:["vertex"],tags:{building:"entrance"},name:"Entrance/Exit",searchable:false},"building/train_station":{icon:"maki-building",geometry:["point","vertex","area"],tags:{building:"train_station"},matchScore:0.5,name:"Train Station Building",searchable:false},"building/apartments":{icon:"maki-building",geometry:["area"],tags:{building:"apartments"},matchScore:0.5,name:"Apartment Building"},"building/barn":{icon:"maki-farm",geometry:["area"],tags:{building:"barn"},matchScore:0.5,name:"Barn"},"building/boathouse":{icon:"maki-harbor",geometry:["area"],tags:{building:"boathouse"},matchScore:0.5,terms:[],name:"Boathouse"},"building/bungalow":{icon:"maki-home",geometry:["area"],tags:{building:"bungalow"},terms:["home","detached"],matchScore:0.5,name:"Bungalow"},"building/cabin":{icon:"maki-home",geometry:["area"],tags:{building:"cabin"},matchScore:0.5,name:"Cabin"},"building/carport":{icon:"fas-warehouse",fields:["{building}","capacity"],geometry:["area"],tags:{building:"carport"},matchScore:0.5,terms:["covered parking space","garage","car","porch"],name:"Carport"},"building/cathedral":{icon:"maki-place-of-worship",geometry:["area"],tags:{building:"cathedral"},matchScore:0.5,name:"Cathedral Building"},"building/chapel":{icon:"maki-place-of-worship",geometry:["area"],tags:{building:"chapel"},matchScore:0.5,name:"Chapel Building"},"building/church":{icon:"maki-place-of-worship",geometry:["area"],tags:{building:"church"},matchScore:0.5,name:"Church Building"},"building/civic":{icon:"maki-building",fields:["{building}","smoking"],moreFields:["{building}","polling_station"],geometry:["area"],tags:{building:"civic"},matchScore:0.5,name:"Civic Building"},"building/college":{icon:"maki-building",moreFields:["{building}","polling_station"],geometry:["area"],terms:["university"],tags:{building:"college"},matchScore:0.5,name:"College Building"},"building/commercial":{icon:"maki-suitcase",fields:["{building}","smoking"],geometry:["area"],tags:{building:"commercial"},matchScore:0.5,name:"Commercial Building"},"building/construction":{icon:"maki-building",geometry:["area"],tags:{building:"construction"},matchScore:0.5,name:"Building Under Construction"},"building/detached":{icon:"maki-home",geometry:["area"],tags:{building:"detached"},terms:["home","single","family","residence","dwelling"],matchScore:0.5,name:"Detached House"},"building/dormitory":{icon:"maki-building",fields:["{building}","smoking"],geometry:["area"],tags:{building:"dormitory"},matchScore:0.5,name:"Dormitory"},"building/farm_auxiliary":{icon:"maki-farm",geometry:["area"],tags:{building:"farm_auxiliary"},matchScore:0.5,name:"Farm Building"},"building/farm":{icon:"maki-farm",geometry:["area"],tags:{building:"farm"},matchScore:0.5,name:"Farm House"},"building/garage":{icon:"fas-warehouse",fields:["{building}","capacity"],geometry:["area"],tags:{building:"garage"},matchScore:0.5,name:"Garage"},"building/garages":{icon:"fas-warehouse",fields:["{building}","capacity"],geometry:["area"],tags:{building:"garages"},matchScore:0.5,name:"Garages"},"building/grandstand":{icon:"maki-building",geometry:["area"],tags:{building:"grandstand"},terms:["tribune","stand","stands","bleachers"],matchScore:0.5,name:"Grandstand"},"building/greenhouse":{icon:"maki-garden-centre",geometry:["area"],tags:{building:"greenhouse"},matchScore:0.5,name:"Greenhouse"},"building/hangar":{icon:"fas-warehouse",fields:["name"],geometry:["area"],tags:{building:"hangar"},matchScore:0.5,name:"Hangar Building"},"building/hospital":{icon:"maki-building",geometry:["area"],tags:{building:"hospital"},matchScore:0.5,name:"Hospital Building"},"building/hotel":{icon:"maki-building",fields:["{building}","smoking"],geometry:["area"],tags:{building:"hotel"},matchScore:0.5,name:"Hotel Building"},"building/house":{icon:"maki-home",geometry:["area"],tags:{building:"house"},terms:["home","family","residence","dwelling"],matchScore:0.5,name:"House"},"building/houseboat":{icon:"maki-home",geometry:["area"],tags:{building:"houseboat"},terms:["home","family","residence","dwelling"],matchScore:0.5,name:"Houseboat"},"building/hut":{icon:"maki-home",geometry:["area"],tags:{building:"hut"},matchScore:0.5,name:"Hut"},"building/industrial":{icon:"maki-industry",geometry:["area"],tags:{building:"industrial"},matchScore:0.5,name:"Industrial Building"},"building/kindergarten":{icon:"maki-building",geometry:["area"],terms:["kindergarden","pre-school"],tags:{building:"kindergarten"},matchScore:0.5,name:"Preschool/Kindergarten Building"},"building/mosque":{icon:"maki-place-of-worship",geometry:["area"],tags:{building:"mosque"},matchScore:0.5,name:"Mosque Building"},"building/pavilion":{icon:"maki-building",fields:["{building}","smoking"],geometry:["area"],terms:["sports"],tags:{building:"pavilion"},matchScore:0.5,name:"Pavilion Building"},"building/public":{icon:"maki-building",fields:["{building}","smoking"],moreFields:["{building}","polling_station"],geometry:["area"],tags:{building:"public"},matchScore:0.5,name:"Public Building"},"building/residential":{icon:"maki-residential-community",geometry:["area"],tags:{building:"residential"},matchScore:0.5,name:"Residential Building"},"building/retail":{icon:"maki-commercial",fields:["{building}","smoking"],geometry:["area"],tags:{building:"retail"},matchScore:0.5,name:"Retail Building"},"building/roof":{icon:"maki-shelter",fields:["{building}","layer"],geometry:["area"],tags:{building:"roof"},matchScore:0.5,name:"Roof"},"building/ruins":{icon:"temaki-ruins",geometry:["area"],tags:{building:"ruins"},matchScore:0.5,name:"Building Ruins"},"building/school":{icon:"maki-building",moreFields:["{building}","polling_station"],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",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",geometry:["area"],tags:{building:"service"},matchScore:0.5,name:"Service Building"},"building/shed":{icon:"maki-home",geometry:["area"],tags:{building:"shed"},matchScore:0.5,name:"Shed"},"building/stable":{icon:"maki-horse-riding",geometry:["area"],tags:{building:"stable"},matchScore:0.5,name:"Stable"},"building/stadium":{icon:"maki-stadium",fields:["{building}","smoking"],geometry:["area"],tags:{building:"stadium"},matchScore:0.5,name:"Stadium Building"},"building/static_caravan":{icon:"maki-home",geometry:["area"],tags:{building:"static_caravan"},matchScore:0.5,name:"Static Mobile Home"},"building/temple":{icon:"maki-place-of-worship",geometry:["area"],tags:{building:"temple"},matchScore:0.5,name:"Temple Building"},"building/terrace":{icon:"maki-building",geometry:["area"],tags:{building:"terrace"},terms:["home","terrace","brownstone","family","residence","dwelling"],matchScore:0.5,name:"Row Houses"},"building/transportation":{icon:"maki-building",fields:["{building}","smoking"],geometry:["area"],tags:{building:"transportation"},matchScore:0.5,name:"Transportation Building"},"building/university":{icon:"maki-building",moreFields:["{building}","polling_station"],geometry:["area"],terms:["college"],tags:{building:"university"},matchScore:0.5,name:"University Building"},"building/warehouse":{icon:"maki-warehouse",geometry:["area"],tags:{building:"warehouse"},matchScore:0.5,name:"Warehouse"},club:{icon:"fas-handshake",fields:["name","club","operator","address","building_area","opening_hours"],moreFields:["access_simple","building/levels_building","height_building","email","fax","internet_access","internet_access/fee","internet_access/ssid","phone","website","wheelchair"],geometry:["point","area"],tags:{club:"*"},terms:["social"],name:"Club"},"club/sport":{icon:"maki-pitch",fields:["name","sport","{club}"],geometry:["point","area"],tags:{club:"sport"},terms:["athletics club","sporting club","sports association","sports society"],name:"Sports Club"},craft:{icon:"temaki-tools",fields:["name","craft","operator","address","building_area","opening_hours"],moreFields:["air_conditioning","building/levels_building","height_building","email","fax","internet_access","internet_access/fee","internet_access/ssid","phone","product","website","wheelchair"],geometry:["point","area"],tags:{craft:"*"},terms:[],name:"Craft"},"craft/jeweler":{icon:"maki-marker-stroked",geometry:["point","area"],tags:{craft:"jeweler"},reference:{key:"shop",value:"jewelry"},name:"Jeweler",searchable:false,replacement:"shop/jewelry"},"craft/locksmith":{icon:"maki-marker-stroked",geometry:["point","area"],tags:{craft:"locksmith"},reference:{key:"shop",value:"locksmith"},name:"Locksmith",searchable:false},"craft/optician":{icon:"maki-marker-stroked",geometry:["point","area"],tags:{craft:"optician"},reference:{key:"shop",value:"optician"},name:"Optician",searchable:false,replacement:"shop/optician"},"craft/tailor":{icon:"maki-clothing-store",geometry:["point","area"],terms:["clothes","suit"],tags:{craft:"tailor"},reference:{key:"shop",value:"tailor"},name:"Tailor",searchable:false},"craft/agricultural_engines":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"agricultural_engines"},name:"Argricultural Engines Mechanic"},"craft/basket_maker":{icon:"maki-art-gallery",geometry:["point","area"],tags:{craft:"basket_maker"},name:"Basket Maker"},"craft/beekeeper":{icon:"maki-farm",geometry:["point","area"],tags:{craft:"beekeeper"},name:"Beekeeper"},"craft/blacksmith":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"blacksmith"},name:"Blacksmith"},"craft/boatbuilder":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"boatbuilder"},matchScore:0.4,name:"Boat Builder"},"craft/bookbinder":{icon:"maki-library",geometry:["point","area"],terms:["book repair"],tags:{craft:"bookbinder"},name:"Bookbinder"},"craft/brewery":{icon:"temaki-storage_tank",fields:["{craft}","product"],geometry:["point","area"],terms:["alcohol","beer","beverage","bier","booze","cider"],tags:{craft:"brewery"},name:"Brewery"},"craft/carpenter":{icon:"temaki-tools",geometry:["point","area"],terms:["woodworker"],tags:{craft:"carpenter"},name:"Carpenter"},"craft/carpet_layer":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"carpet_layer"},name:"Carpet Layer"},"craft/caterer":{icon:"maki-restaurant",fields:["name","cuisine","{craft}"],geometry:["point","area"],tags:{craft:"caterer"},name:"Caterer"},"craft/chimney_sweeper":{icon:"temaki-chimney",geometry:["point","area"],tags:{craft:"chimney_sweeper"},name:"Chimney Sweeper"},"craft/clockmaker":{icon:"temaki-clock",geometry:["point","area"],tags:{craft:"clockmaker"},name:"Clockmaker"},"craft/confectionery":{icon:"maki-confectionery",geometry:["point","area"],terms:["sweet","candy"],tags:{craft:"confectionery"},name:"Candy Maker"},"craft/distillery":{icon:"temaki-storage_tank",fields:["{craft}","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",geometry:["point","area"],terms:["seamstress"],tags:{craft:"dressmaker"},name:"Dressmaker"},"craft/electrician":{icon:"temaki-power",geometry:["point","area"],terms:["power","wire"],tags:{craft:"electrician"},name:"Electrician"},"craft/electronics_repair":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"electronics_repair"},name:"Electronics Repair Shop"},"craft/floorer":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"floorer"},name:"Floorer"},"craft/gardener":{icon:"maki-garden-centre",geometry:["point","area"],terms:["landscaper","grounds keeper"],tags:{craft:"gardener"},name:"Gardener"},"craft/glaziery":{icon:"temaki-window",geometry:["point","area"],terms:["glass","stained-glass","window"],tags:{craft:"glaziery"},name:"Glaziery"},"craft/handicraft":{icon:"maki-art-gallery",geometry:["point","area"],tags:{craft:"handicraft"},name:"Handicraft"},"craft/hvac":{icon:"temaki-tools",geometry:["point","area"],terms:["heat*","vent*","air conditioning"],tags:{craft:"hvac"},name:"HVAC"},"craft/insulator":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"insulation"},name:"Insulator"},"craft/joiner":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"joiner"},terms:["furniture"],name:"Joiner"},"craft/key_cutter":{icon:"fas-key",geometry:["point","area"],tags:{craft:"key_cutter"},name:"Key Cutter"},"craft/metal_construction":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"metal_construction"},name:"Metal Construction"},"craft/painter":{icon:"fas-paint-roller",geometry:["point","area"],tags:{craft:"painter"},name:"Painter"},"craft/parquet_layer":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"parquet_layer"},name:"Parquet Layer"},"craft/photographer":{icon:"maki-attraction",geometry:["point","area"],tags:{craft:"photographer"},name:"Photographer"},"craft/photographic_laboratory":{icon:"fas-film",geometry:["point","area"],terms:["film"],tags:{craft:"photographic_laboratory"},name:"Photographic Laboratory"},"craft/plasterer":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"plasterer"},name:"Plasterer"},"craft/plumber":{icon:"temaki-plumber",geometry:["point","area"],terms:["pipe"],tags:{craft:"plumber"},name:"Plumber"},"craft/pottery":{icon:"maki-art-gallery",geometry:["point","area"],terms:["ceramic"],tags:{craft:"pottery"},name:"Pottery"},"craft/rigger":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"rigger"},name:"Rigger"},"craft/roofer":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"roofer"},name:"Roofer"},"craft/saddler":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"saddler"},name:"Saddler"},"craft/sailmaker":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"sailmaker"},name:"Sailmaker"},"craft/sawmill":{icon:"maki-logging",geometry:["point","area"],terms:["lumber"],tags:{craft:"sawmill"},name:"Sawmill"},"craft/scaffolder":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"scaffolder"},name:"Scaffolder"},"craft/sculptor":{icon:"maki-art-gallery",geometry:["point","area"],tags:{craft:"sculptor"},name:"Sculptor"},"craft/shoemaker":{icon:"maki-shoe",geometry:["point","area"],terms:["cobbler"],tags:{craft:"shoemaker"},name:"Shoemaker"},"craft/signmaker":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"signmaker"},name:"Signmaker"},"craft/stonemason":{icon:"temaki-tools",geometry:["point","area"],terms:["masonry"],tags:{craft:"stonemason"},name:"Stonemason"},"craft/tiler":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"tiler"},name:"Tiler"},"craft/tinsmith":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"tinsmith"},name:"Tinsmith"},"craft/upholsterer":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"upholsterer"},name:"Upholsterer"},"craft/watchmaker":{icon:"maki-watch",geometry:["point","area"],tags:{craft:"watchmaker"},name:"Watchmaker"},"craft/window_construction":{icon:"temaki-window",geometry:["point","area"],terms:["glass"],tags:{craft:"window_construction"},name:"Window Construction"},"craft/winery":{icon:"maki-alcohol-shop",geometry:["point","area"],tags:{craft:"winery"},name:"Winery"},"emergency/designated":{fields:["emergency_combo"],geometry:["line"],tags:{emergency:"designated"},terms:[],name:"Emergency Access Designated",searchable:false,matchScore:0.01},"emergency/destination":{fields:["emergency_combo"],geometry:["line"],tags:{emergency:"destination"},terms:[],name:"Emergency Access Destination",searchable:false,matchScore:0.01},"emergency/no":{fields:["emergency_combo"],geometry:["line"],tags:{emergency:"no"},terms:[],name:"Emergency Access No",searchable:false,matchScore:0.01},"emergency/official":{fields:["emergency_combo"],geometry:["line"],tags:{emergency:"official"},terms:[],name:"Emergency Access Official",searchable:false,matchScore:0.01},"emergency/private":{fields:["emergency_combo"],geometry:["line"],tags:{emergency:"private"},terms:[],name:"Emergency Access Private",searchable:false,matchScore:0.01},"emergency/yes":{fields:["emergency_combo"],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"],moreFields:["website","phone","email","fax","wheelchair"],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_hose":{icon:"fas-fire-extinguisher",fields:["indoor","ref","operator"],geometry:["point","vertex"],tags:{emergency:"fire_hose"},name:"Fire Hose"},"emergency/fire_hydrant":{icon:"temaki-fire_hydrant",fields:["ref","fire_hydrant/type","colour","water_source","couplings"],moreFields:["fire_hydrant/pressure","fire_hydrant/diameter","water_volume","survey/date"],geometry:["point","vertex"],terms:["fire plug","fire water well","hydrant"],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"],terms:["entrance","exit","door"],tags:{entrance:"*"},fields:["entrance","door","access_simple","address"],matchScore:0.8,name:"Entrance/Exit"},ford:{icon:"temaki-pedestrian",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/cartpath":{icon:"temaki-golf_cart",fields:["{golf/path}","maxspeed"],geometry:["line"],tags:{golf:"cartpath"},addTags:{golf:"cartpath",golf_cart:"designated",highway:"service"},reference:{key:"golf",value:"cartpath"},name:"Golf Cartpath"},"golf/driving_range":{icon:"maki-golf",fields:["name","capacity"],geometry:["area"],tags:{golf:"driving_range",landuse:"grass"},reference:{key:"golf",value:"driving_range"},name:"Driving Range"},"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":{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/path":{icon:"maki-golf",fields:["name","surface","width","structure","incline"],geometry:["line"],tags:{golf:"path"},addTags:{golf:"path",highway:"path",foot:"designated"},reference:{key:"golf",value:"path"},name:"Golf Walking Path"},"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":{icon:"maki-golf",fields:["name"],geometry:["area"],tags:{golf:"water_hazard",natural:"water"},reference:{key:"golf",value:"water_hazard"},name:"Water Hazard"},healthcare:{icon:"maki-hospital",fields:["name","healthcare","operator","healthcare/speciality","address","building_area"],moreFields:["building/levels_building","height_building","opening_hours","payment_multi","brand","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{healthcare:"*"},terms:["clinic","doctor","disease","health","institution","sick","surgery","wellness"],name:"Healthcare Facility"},"healthcare/alternative":{icon:"maki-hospital",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",geometry:["point","area"],terms:["back","pain","spine"],tags:{healthcare:"alternative","healthcare:speciality":"chiropractic"},name:"Chiropractor"},"healthcare/audiologist":{icon:"maki-hospital",geometry:["point","area"],terms:["ear","hearing","sound"],tags:{healthcare:"audiologist"},name:"Audiologist"},"healthcare/birthing_center":{icon:"fas-baby",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:["{healthcare}","blood_components"],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/counselling":{icon:"fas-comments",geometry:["point","area"],tags:{healthcare:"counselling"},name:"Counselling Center"},"healthcare/hospice":{icon:"maki-hospital",geometry:["point","area"],terms:["terminal","illness"],tags:{healthcare:"hospice"},name:"Hospice"},"healthcare/laboratory":{icon:"fas-vial",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:"fas-baby",geometry:["point","area"],terms:["baby","childbirth","delivery","labour","labor","pregnancy"],tags:{healthcare:"midwife"},name:"Midwife"},"healthcare/occupational_therapist":{icon:"maki-hospital",geometry:["point","area"],terms:["therapist","therapy"],tags:{healthcare:"occupational_therapist"},name:"Occupational Therapist"},"healthcare/optometrist":{icon:"fas-eye",geometry:["point","area"],terms:["eye","glasses","lasik","lenses","vision"],tags:{healthcare:"optometrist"},name:"Optometrist"},"healthcare/physiotherapist":{icon:"temaki-physiotherapist",geometry:["point","area"],terms:["physical","therapist","therapy"],tags:{healthcare:"physiotherapist"},name:"Physiotherapist"},"healthcare/podiatrist":{icon:"maki-hospital",geometry:["point","area"],terms:["foot","feet","nails"],tags:{healthcare:"podiatrist"},name:"Podiatrist"},"healthcare/psychotherapist":{icon:"maki-hospital",geometry:["point","area"],terms:["anxiety","counselor","depression","mental health","mind","suicide","therapist","therapy"],tags:{healthcare:"psychotherapist"},name:"Psychotherapist"},"healthcare/rehabilitation":{icon:"maki-hospital",geometry:["point","area"],terms:["rehab","therapist","therapy"],tags:{healthcare:"rehabilitation"},name:"Rehabilitation Facility"},"healthcare/speech_therapist":{icon:"fas-comment",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"},matchScore:0.95,name:"Bus Stop",searchable:false,replacement:"public_transport/platform/bus_point"},"highway/crossing":{fields:["crossing"],geometry:["vertex"],tags:{highway:"crossing"},searchable:false,matchScore:0.95,name:"Crossing"},"highway/bridleway":{fields:["name","surface","width","structure","access","incline","horse_scale"],moreFields:["covered","dog","lit","maxweight_bridge","smoothness","wheelchair"],icon:"maki-horse-riding",geometry:["line"],tags:{highway:"bridleway"},terms:["bridleway","equestrian","horse","trail"],name:"Bridle Path"},"highway/bus_guideway":{icon:"maki-bus",fields:["name","operator","oneway","structure","covered"],moreFields:["trolley_wire"],geometry:["line"],tags:{highway:"bus_guideway"},addTags:{highway:"bus_guideway",access:"no",bus:"designated"},terms:[],name:"Bus Guideway"},"highway/construction":{icon:"maki-barrier",fields:["name","opening_date","check_date","note","oneway","structure","access"],geometry:["line"],tags:{highway:"construction",access:"no"},terms:["closed","closure","construction"],name:"Road Closed"},"highway/corridor":{icon:"temaki-pedestrian",fields:["name","width","level","access_simple","wheelchair"],moreFields:["covered","indoor","maxheight"],geometry:["line"],tags:{highway:"corridor"},addTags:{highway:"corridor",indoor:"yes"},terms:["gallery","hall","hallway","indoor","passage","passageway"],name:"Indoor Corridor"},"highway/crossing/zebra-raised":{icon:"temaki-pedestrian",fields:["crossing","tactile_paving"],geometry:["vertex"],tags:{highway:"crossing",crossing:"zebra",traffic_calming:"table"},reference:{key:"traffic_calming",value:"table"},terms:["zebra crossing","marked crossing","crosswalk","flat top","hump","speed","slow"],name:"Marked Crosswalk (Raised)",searchable:false},"highway/crossing/zebra":{icon:"temaki-pedestrian",fields:["crossing","tactile_paving"],geometry:["vertex"],tags:{highway:"crossing",crossing:"zebra"},reference:{key:"highway",value:"crossing"},terms:["zebra crossing","marked crossing","crosswalk"],name:"Marked Crosswalk",searchable:false},"highway/crossing/marked-raised":{icon:"temaki-pedestrian",fields:["crossing","tactile_paving"],geometry:["vertex"],tags:{highway:"crossing",crossing:"marked",traffic_calming:"table"},addTags:{highway:"crossing",crossing:"marked",traffic_calming:"table"},reference:{key:"traffic_calming",value:"table"},terms:["zebra crossing","marked crossing","crosswalk","flat top","hump","speed","slow"],name:"Marked Crosswalk (Raised)"},"highway/crossing/marked":{icon:"temaki-pedestrian",fields:["crossing","tactile_paving"],geometry:["vertex"],tags:{highway:"crossing",crossing:"marked"},addTags:{highway:"crossing",crossing:"marked"},reference:{key:"highway",value:"crossing"},terms:["zebra crossing","marked crossing","crosswalk"],name:"Marked Crosswalk"},"highway/crossing/unmarked-raised":{icon:"temaki-pedestrian",fields:["crossing","tactile_paving"],geometry:["vertex"],tags:{highway:"crossing",crossing:"unmarked",traffic_calming:"table"},reference:{key:"traffic_calming",value:"table"},terms:["flat top","hump","speed","slow"],name:"Unmarked Crossing (Raised)"},"highway/crossing/unmarked":{icon:"temaki-pedestrian",fields:["crossing","tactile_paving"],geometry:["vertex"],tags:{highway:"crossing",crossing:"unmarked"},addTags:{highway:"crossing",crossing:"unmarked"},reference:{key:"crossing",value:"unmarked"},terms:[],name:"Unmarked Crossing"},"highway/cycleway":{icon:"maki-bicycle",fields:["name","oneway","surface","width","structure","access","incline"],moreFields:["covered","dog","lit","maxspeed","maxweight_bridge","smoothness","wheelchair"],geometry:["line"],tags:{highway:"cycleway"},terms:["bike path","bicyle path"],matchScore:0.9,name:"Cycle Path"},"highway/cycleway/crossing":{icon:"maki-bicycle",fields:["crossing","access","surface","tactile_paving"],geometry:["line"],tags:{cycleway:"crossing"},addTags:{highway:"cycleway",cycleway:"crossing"},reference:{key:"cycleway",value:"crossing"},searchable:false,matchScore:0.95,name:"Cycle Crossing"},"highway/cycleway/bicycle_foot":{icon:"maki-bicycle",geometry:["line"],tags:{highway:"cycleway",foot:"designated"},addTags:{highway:"cycleway",foot:"designated",bicycle:"designated"},terms:["bicycle and foot path","bike and pedestrian path","green way","greenway","mixed-use trail","multi-use trail","segregated trail","rail trail"],matchScore:0.95,name:"Cycle & Foot Path"},"highway/cycleway/crossing/marked":{icon:"maki-bicycle",fields:["crossing","access","surface","tactile_paving"],geometry:["line"],tags:{cycleway:"crossing",crossing:"marked"},addTags:{highway:"cycleway",cycleway:"crossing",crossing:"marked"},reference:{key:"cycleway",value:"crossing"},terms:["cycle crosswalk","cycle path crossing","cycleway crossing","bicycle crossing","bike crossing"],name:"Marked Cycle Crossing"},"highway/cycleway/crossing/unmarked":{icon:"maki-bicycle",fields:["crossing","access","surface","tactile_paving"],geometry:["line"],tags:{cycleway:"crossing",crossing:"unmarked"},addTags:{highway:"cycleway",cycleway:"crossing",crossing:"unmarked"},reference:{key:"cycleway",value:"crossing"},terms:["cycle path crossing","cycleway crossing","bicycle crossing","bike crossing"],name:"Unmarked Cycle Crossing"},"highway/elevator":{icon:"temaki-elevator",fields:["access_simple","opening_hours","maxweight","ref","wheelchair"],moreFields:["maxheight"],geometry:["vertex"],tags:{highway:"elevator"},terms:["lift"],name:"Elevator"},"highway/emergency_bay":{icon:"maki-car",geometry:["vertex"],tags:{highway:"emergency_bay"},terms:["Highway Emergency Bay"],name:"Emergency Stopping Place"},"highway/footway":{icon:"temaki-pedestrian",fields:["name","surface","width","structure","access","incline"],moreFields:["covered","dog","lit","maxweight_bridge","smoothness","wheelchair"],geometry:["line"],terms:["hike","hiking","promenade","trackway","trail","walk"],tags:{highway:"footway"},matchScore:0.9,name:"Foot Path"},"highway/footway/crossing":{fields:["crossing","access","surface","tactile_paving"],geometry:["line"],tags:{footway:"crossing"},addTags:{highway:"footway",footway:"crossing"},reference:{key:"footway",value:"crossing"},matchScore:0.95,searchable:false,name:"Pedestrian Crossing"},"highway/footway/zebra-raised":{icon:"temaki-pedestrian",fields:["crossing","access","surface","tactile_paving"],geometry:["line"],tags:{highway:"footway",footway:"crossing",crossing:"zebra",traffic_calming:"table"},reference:{key:"traffic_calming",value:"table"},terms:["zebra crossing","marked crossing","crosswalk","flat top","hump","speed","slow"],name:"Marked Crosswalk (Raised)",searchable:false},"highway/footway/zebra":{icon:"temaki-pedestrian",fields:["crossing","access","surface","tactile_paving"],geometry:["line"],tags:{highway:"footway",footway:"crossing",crossing:"zebra"},reference:{key:"footway",value:"crossing"},terms:["zebra crossing","marked crossing","crosswalk"],name:"Marked Crosswalk",searchable:false},"highway/footway/conveying":{icon:"temaki-pedestrian",fields:["name","conveying","access_simple","lit","width","wheelchair"],geometry:["line"],terms:["moving sidewalk","autwalk","skywalk","travolator","travelator","travellator","conveyor"],tags:{highway:"footway",conveying:"*"},name:"Moving Walkway"},"highway/footway/marked-raised":{icon:"temaki-pedestrian",fields:["crossing","access","surface","tactile_paving"],geometry:["line"],tags:{footway:"crossing",crossing:"marked",traffic_calming:"table"},addTags:{highway:"footway",footway:"crossing",crossing:"marked",traffic_calming:"table"},reference:{key:"traffic_calming",value:"table"},terms:["zebra crossing","marked crossing","crosswalk","flat top","hump","speed","slow"],name:"Marked Crosswalk (Raised)"},"highway/footway/marked":{icon:"temaki-pedestrian",fields:["crossing","access","surface","tactile_paving"],geometry:["line"],tags:{footway:"crossing",crossing:"marked"},addTags:{highway:"footway",footway:"crossing",crossing:"marked"},reference:{key:"footway",value:"crossing"},terms:["marked foot path crossing","marked crossing","marked pedestrian crosswalk","zebra crossing"],name:"Marked Crosswalk"},"highway/footway/sidewalk":{icon:"temaki-pedestrian",geometry:["line"],tags:{footway:"sidewalk"},addTags:{highway:"footway",footway:"sidewalk"},reference:{key:"footway",value:"sidewalk"},terms:["pavement","sidepath"],name:"Sidewalk"},"highway/footway/unmarked-raised":{icon:"temaki-pedestrian",fields:["crossing","access","surface","tactile_paving"],geometry:["line"],tags:{footway:"crossing",crossing:"unmarked",traffic_calming:"table"},addTags:{highway:"footway",footway:"crossing",crossing:"unmarked",traffic_calming:"table"},reference:{key:"traffic_calming",value:"table"},terms:["flat top","hump","speed","slow"],name:"Unmarked Crossing (Raised)"},"highway/footway/unmarked":{icon:"temaki-pedestrian",fields:["crossing","access","surface","tactile_paving"],geometry:["line"],tags:{footway:"crossing",crossing:"unmarked"},addTags:{highway:"footway",footway:"crossing",crossing:"unmarked"},reference:{key:"footway",value:"crossing"},terms:["unmarked foot path crossing","unmarked crosswalk","unmarked pedestrian crossing"],name:"Unmarked Crossing"},"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","access"],moreFields:["covered","cycleway","flood_prone","junction_line","lit","maxheight","maxweight_bridge","oneway/bicycle","smoothness","trolley_wire"],geometry:["line"],tags:{highway:"living_street"},name:"Living Street"},"highway/milestone":{icon:"temaki-milestone",geometry:["point","vertex"],fields:["distance","direction_vertex"],tags:{highway:"milestone"},terms:["mile marker","mile post","mile stone","mileage marker","milemarker","milepost"],name:"Highway Milestone"},"highway/mini_roundabout":{icon:"maki-circle-stroked",geometry:["vertex"],terms:["traffic circle"],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:["destination_oneway","destination/ref_oneway","junction/ref_oneway","oneway","maxspeed","lanes","surface","structure","access"],moreFields:["covered","destination/symbol_oneway","incline","junction_line","lit","maxheight","maxspeed/advisory","maxweight_bridge","name","ref_road_number","smoothness","toll"],geometry:["line"],tags:{highway:"motorway_link"},addTags:{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","access"],moreFields:["covered","incline","junction_line","lit","maxheight","maxweight_bridge","minspeed","smoothness","toll"],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-other-line",fields:["name","surface","width","structure","access","incline"],moreFields:["wheelchair","lit","smoothness","trail_visibility","sac_scale","maxweight_bridge","mtb/scale","mtb/scale/uphill","mtb/scale/imba","horse_scale","covered","ref","dog"],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:"temaki-pedestrian",fields:["name","surface","lit","width","oneway","structure","access"],moreFields:["covered","incline","maxweight_bridge","smoothness"],geometry:["line"],tags:{highway:"pedestrian"},terms:["center","centre","plaza","quad","square","walkway"],name:"Pedestrian Street"},"highway/primary_link":{icon:"iD-highway-primary-link",fields:["destination_oneway","destination/ref_oneway","oneway","maxspeed","lanes","surface","structure","access"],moreFields:["covered","cycleway","destination/symbol_oneway","flood_prone","incline","junction/ref_oneway","junction_line","lit","maxheight","maxspeed/advisory","maxweight_bridge","name","oneway/bicycle","ref_road_number","smoothness","toll","trolley_wire"],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","ref_road_number","access"],moreFields:["covered","cycleway","flood_prone","incline","junction_line","lit","maxheight","maxspeed/advisory","maxweight_bridge","oneway/bicycle","smoothness","toll","trolley_wire"],geometry:["line"],tags:{highway:"primary"},terms:["road","street"],name:"Primary Road"},"highway/raceway":{icon:"fas-flag-checkered",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","access"],moreFields:["covered","cycleway","flood_prone","incline","junction_line","lit","oneway/bicycle","maxheight","maxspeed/advisory","maxweight_bridge","smoothness","trolley_wire"],geometry:["line"],tags:{highway:"residential"},terms:["road","street"],name:"Residential Road"},"highway/rest_area":{icon:"maki-car",fields:["name","operator","opening_hours"],moreFields:["address","website","phone","email","fax","wheelchair"],geometry:["point","vertex","area"],tags:{highway:"rest_area"},terms:["rest stop"],name:"Rest Area"},"highway/road":{icon:"iD-other-line",fields:["highway","{highway/residential}"],moreFields:["{highway/residential}"],geometry:["line"],tags:{highway:"road"},terms:["road","street"],name:"Unknown Road"},"highway/secondary_link":{icon:"iD-highway-secondary-link",fields:["{highway/primary_link}"],moreFields:["{highway/primary_link}"],geometry:["line"],tags:{highway:"secondary_link"},terms:["on ramp","off ramp","ramp","road","street"],name:"Secondary Link"},"highway/secondary":{icon:"iD-highway-secondary",fields:["{highway/primary}"],moreFields:["{highway/primary}"],geometry:["line"],tags:{highway:"secondary"},terms:["road","street"],name:"Secondary Road"},"highway/service":{icon:"iD-highway-service",fields:["name","service","oneway","maxspeed","surface","covered","structure","access"],moreFields:["flood_prone","incline","lanes","lit","maxheight","maxspeed/advisory","maxweight_bridge","oneway/bicycle","trolley_wire"],geometry:["line"],tags:{highway:"service"},terms:["road","street"],matchScore:0.9,name:"Service Road"},"highway/service/alley":{icon:"iD-highway-service",geometry:["line"],tags:{service:"alley"},addTags:{highway:"service",service:"alley"},reference:{key:"service",value:"alley"},name:"Alley"},"highway/service/drive-through":{icon:"iD-highway-service",geometry:["line"],tags:{service:"drive-through"},addTags:{highway:"service",service:"drive-through"},reference:{key:"service",value:"drive-through"},name:"Drive-Through"},"highway/service/driveway":{icon:"iD-highway-service",geometry:["line"],tags:{service:"driveway"},addTags:{highway:"service",service:"driveway"},reference:{key:"service",value:"driveway"},name:"Driveway"},"highway/service/emergency_access":{icon:"iD-highway-service",geometry:["line"],tags:{service:"emergency_access"},addTags:{highway:"service",service:"emergency_access"},reference:{key:"service",value:"emergency_access"},name:"Emergency Access"},"highway/service/parking_aisle":{icon:"iD-highway-service",geometry:["line"],tags:{service:"parking_aisle"},addTags:{highway:"service",service:"parking_aisle"},reference:{key:"service",value:"parking_aisle"},name:"Parking Aisle"},"highway/services":{icon:"maki-car",fields:["{highway/rest_area}"],moreFields:["{highway/rest_area}"],geometry:["point","vertex","area"],tags:{highway:"services"},terms:["services","travel plaza","service station"],name:"Service Area"},"highway/speed_camera":{icon:"temaki-security_camera",geometry:["point","vertex"],fields:["direction","ref","maxspeed"],tags:{highway:"speed_camera"},terms:[],name:"Speed Camera"},"highway/steps":{icon:"iD-highway-steps",fields:["incline_steps","handrail","step_count","surface","lit","width"],moreFields:["covered","dog","indoor"],geometry:["line"],tags:{highway:"steps"},terms:["stairs","staircase","stairway"],name:"Steps"},"highway/steps/conveying":{icon:"maki-entrance",fields:["name","incline_steps","conveying","access_simple","lit","width","handrail","step_count"],geometry:["line"],terms:["moving staircase","moving stairway","people mover"],tags:{highway:"steps",conveying:"*"},name:"Escalator"},"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:["{highway/primary_link}"],moreFields:["{highway/primary_link}"],geometry:["line"],tags:{highway:"tertiary_link"},terms:["on ramp","off ramp","ramp","road","street"],name:"Tertiary Link"},"highway/tertiary":{icon:"iD-highway-tertiary",fields:["{highway/primary}"],moreFields:["{highway/primary}"],geometry:["line"],tags:{highway:"tertiary"},terms:["road","street"],name:"Tertiary Road"},"highway/track":{icon:"fas-truck-monster",fields:["name","tracktype","surface","width","structure","access","incline","smoothness"],moreFields:["covered","flood_prone","horse_scale","maxweight_bridge","mtb/scale","mtb/scale/uphill","mtb/scale/imba"],geometry:["line"],tags:{highway:"track"},terms:["woods road","forest road","logging road","fire road","farm road","agricultural road","ranch road","carriage road","primitive","unmaintained","rut","offroad","4wd","4x4","four wheel drive","atv","quad","jeep","double track","two track"],name:"Unmaintained Track Road"},"highway/traffic_mirror":{icon:"maki-circle-stroked",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/trailhead":{icon:"fas-hiking",fields:["name","operator","elevation","address","access_simple","fee","payment_multi_fee"],moreFields:["opening_hours"],geometry:["vertex"],tags:{highway:"trailhead"},terms:["hiking","mile zero","mountain biking","mountaineering","trail endpoint","trail start","staging area","trekking"],name:"Trailhead"},"highway/trunk_link":{icon:"iD-highway-trunk-link",fields:["{highway/motorway_link}"],moreFields:["{highway/motorway_link}"],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","access"],moreFields:["covered","incline","junction_line","lit","maxheight","minspeed","maxweight_bridge","smoothness","toll"],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:["{highway/residential}"],moreFields:["{highway/residential}"],geometry:["line"],tags:{highway:"unclassified"},terms:["road","street"],name:"Minor/Unclassified Road"},historic:{icon:"temaki-ruins",fields:["historic","inscription"],geometry:["point","vertex","line","area"],tags:{historic:"*"},name:"Historic Site"},"historic/archaeological_site":{icon:"temaki-ruins",fields:["name","site_type","historic/civilization","inscription","access_simple"],geometry:["point","vertex","area"],tags:{historic:"archaeological_site"},name:"Archaeological Site"},"historic/boundary_stone":{icon:"temaki-milestone",fields:["name","inscription"],moreFields:["material"],geometry:["point","vertex"],tags:{historic:"boundary_stone"},name:"Boundary Stone"},"historic/castle":{icon:"maki-castle",fields:["name","castle_type","building_area","historic/civilization","access_simple","start_date"],geometry:["point","area"],tags:{historic:"castle"},name:"Castle"},"historic/castle/fortress":{icon:"maki-castle",fields:["name","building_area","access_simple","start_date"],geometry:["point","area"],reference:{key:"castle_type",value:"fortress"},tags:{historic:"castle",castle_type:"fortress"},terms:["citadel","military"],name:"Historic Fortress"},"historic/castle/palace":{icon:"fas-crown",fields:["name","building_area","access_simple","start_date"],geometry:["point","area"],reference:{key:"castle_type",value:"palace"},tags:{historic:"castle",castle_type:"palace"},terms:["Royal Residence","royal","king","queen"],name:"Palace"},"historic/castle/stately":{icon:"fas-crown",fields:["name","building_area","access_simple","start_date"],geometry:["point","area"],reference:{key:"castle_type",value:"stately"},tags:{historic:"castle",castle_type:"stately"},terms:["Historic Country House","Stately Home","nobility","gentry","representative"],name:"Château"},"historic/city_gate":{icon:"maki-castle",fields:["name","building_area","historic/civilization","start_date"],geometry:["point","area"],tags:{historic:"city_gate"},terms:["Town Gate"],name:"City Gate"},"historic/fort":{icon:"maki-castle",fields:["name","building_area","access_simple","start_date"],geometry:["point","area"],tags:{historic:"fort"},terms:["military"],name:"Historic Fort"},"historic/manor":{icon:"maki-castle",fields:["name","building_area","access_simple","start_date"],geometry:["point","area"],tags:{historic:"manor"},terms:["Mansion","gentry","nobility","estate"],name:"Manor House"},"historic/memorial":{icon:"maki-monument",fields:["name","memorial","inscription","material"],moreFields:["website"],geometry:["point","vertex","area"],terms:["dedicatory","epitaph","remember","remembrance","memory","monument","stolperstein"],tags:{historic:"memorial"},name:"Memorial"},"historic/memorial/plaque":{icon:"maki-monument",fields:["{historic/memorial}","direction"],geometry:["point","vertex"],terms:["dedicatory","epitaph","historical marker","remember","remembrance","memory"],tags:{historic:"memorial",memorial:"plaque"},reference:{key:"memorial",value:"plaque"},name:"Commemorative Plaque"},"historic/monument":{icon:"maki-monument",fields:["name","inscription","access_simple"],moreFields:["material"],geometry:["point","vertex","area"],tags:{historic:"monument"},name:"Monument"},"historic/ruins":{icon:"temaki-ruins",fields:["name","historic/civilization","inscription","access_simple"],geometry:["point","vertex","area"],tags:{historic:"ruins"},name:"Ruins"},"historic/tomb":{icon:"maki-cemetery",fields:["name","tomb","building_area","inscription","access_simple"],geometry:["point","area"],tags:{historic:"tomb"},name:"Tomb"},"historic/wayside_cross":{icon:"maki-religious-christian",fields:["name","inscription"],moreFields:["material"],geometry:["point","vertex","area"],tags:{historic:"wayside_cross"},name:"Wayside Cross"},"historic/wayside_shrine":{icon:"maki-landmark",fields:["name","religion","denomination","inscription","access_simple"],geometry:["point","vertex","area"],tags:{historic:"wayside_shrine"},name:"Wayside Shrine"},"historic/wreck":{icon:"temaki-ruins",fields:["name","access_simple","seamark/wreck/category","historic/wreck/date_sunk","historic/wreck/visible_at_low_tide","historic/wreck/visible_at_high_tide"],moreFields:["seamark/type"],geometry:["point","area"],tags:{historic:"wreck"},addTags:{historic:"wreck","seamark:type":"wreck"},terms:["hull","mast","maritime","remains","ship","boat"],name:"Shipwreck"},"indoor/corridor_line":{fields:["level","name"],geometry:["line"],tags:{indoor:"corridor"},searchable:false,matchScore:1.1,name:"Indoor Corridor",replacement:"highway/corridor"},"indoor/area":{fields:["level","name","ref_room_number","height"],geometry:["area"],tags:{indoor:"area"},terms:["indoor space"],matchScore:0.8,name:"Indoor Area"},"indoor/corridor":{icon:"temaki-pedestrian",fields:["level","name","ref","height"],geometry:["area"],tags:{indoor:"corridor"},terms:["concourse","foyer","hallway","passageway"],matchScore:0.8,name:"Indoor Corridor"},"indoor/door":{icon:"maki-entrance-alt1",fields:["level","ref","door_type","access_simple","width","height"],moreFields:["wheelchair"],geometry:["vertex"],tags:{indoor:"door"},addTags:{indoor:"door",door:"yes"},removeTags:{indoor:"door",door:"*"},terms:["doorframe","doorway","portal","room access","threshold"],name:"Indoor Door"},"indoor/room":{fields:["level","name","ref_room_number","room","height"],geometry:["area"],tags:{indoor:"room"},terms:["antechamber","anteroom","atrium","cell","chamber","concourse","foyer","indoor room","lobby","vestibule"],matchScore:0.8,name:"Room"},"indoor/wall":{icon:"temaki-wall",fields:["level","height"],geometry:["line"],tags:{indoor:"wall"},terms:["indoor barrier","room divider","room partition"],name:"Indoor Wall"},"internet_access/wlan":{icon:"fas-wifi",geometry:["point","area"],fields:["internet_access/fee","internet_access/ssid"],terms:["wi-fi","wifi","hotspot"],tags:{internet_access:"wlan"},matchScore:0.25,name:"Wi-Fi Hotspot"},junction:{icon:"temaki-junction",fields:["name"],geometry:["vertex","area"],tags:{junction:"yes"},name:"Junction"},"junction/circular":{geometry:["vertex","line"],fields:["name"],tags:{junction:"circular"},name:"Traffic Circle",searchable:false},"junction/jughandle":{geometry:["line"],fields:["name"],tags:{junction:"jughandle"},name:"Jughandle",searchable:false},"junction/roundabout":{geometry:["vertex","line"],fields:["name"],tags:{junction:"roundabout"},name:"Roundabout",searchable:false},"landuse/basin":{icon:"maki-water",fields:["name","basin","intermittent_yes"],geometry:["area"],tags:{landuse:"basin"},name:"Basin",searchable:false},"landuse/farm":{icon:"maki-farm",fields:["name","operator","crop"],geometry:["point","area"],tags:{landuse:"farm"},name:"Farmland",searchable:false},"landuse/pond":{icon:"maki-water",fields:["name","intermittent"],geometry:["area"],tags:{landuse:"pond"},name:"Pond",searchable:false},"landuse/reservoir":{icon:"maki-water",fields:["name","intermittent"],geometry:["area"],tags:{landuse:"reservoir"},name:"Reservoir",searchable:false},"landuse/allotments":{icon:"maki-garden-centre",geometry:["area"],fields:["name"],moreFields:["address","website","phone","email","fax"],tags:{landuse:"allotments"},terms:["allotment","garden"],name:"Community Garden"},"landuse/aquaculture":{icon:"maki-aquarium",fields:["name","operator","produce"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"aquaculture"},terms:["fish farm","crustacean","algae","aquafarming","shrimp farm","oyster farm","mariculture","algaculture"],name:"Aquaculture"},"landuse/brownfield":{geometry:["area"],fields:["name"],tags:{landuse:"brownfield"},terms:[],matchScore:0.9,name:"Brownfield"},"landuse/cemetery":{icon:"maki-cemetery",fields:["name","religion","denomination"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"cemetery"},terms:[],name:"Cemetery"},"landuse/churchyard":{icon:"maki-religious-christian",fields:["name","religion","denomination"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"churchyard"},terms:[],name:"Churchyard"},"landuse/commercial":{icon:"maki-suitcase",fields:["name"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"commercial"},terms:[],matchScore:0.9,name:"Commercial Area"},"landuse/construction":{icon:"temaki-tools",fields:["name","construction","operator","opening_date","check_date","note"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"construction"},terms:[],name:"Construction"},"landuse/farmland":{icon:"fas-tractor",fields:["name","operator","crop","produce"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"farmland"},terms:["crop","grow","plant"],name:"Farmland"},"landuse/farmyard":{icon:"maki-farm",fields:["name","operator","crop"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"farmyard"},terms:["crop","grow","plant"],name:"Farmyard"},"landuse/forest":{icon:"maki-park-alt1",fields:["name","leaf_type","leaf_cycle","produce"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"forest"},terms:["cut","forest","forestry","lumber","silviculture","tree"],name:"Managed Forest"},"landuse/garages":{icon:"fas-warehouse",geometry:["area"],fields:["name"],moreFields:["address","website","phone","email","fax"],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"],moreFields:["address","website","phone","email","fax"],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"],moreFields:["address","website","phone","email","fax"],geometry:["area"],terms:["boat"],tags:{landuse:"harbour"},name:"Harbor"},"landuse/industrial":{icon:"maki-industry",fields:["name","industrial"],moreFields:["address","website","phone","email","fax"],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"},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"},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"],moreFields:["address","website","phone","email","fax"],tags:{landuse:"landfill"},terms:["dump"],name:"Landfill"},"landuse/meadow":{icon:"maki-garden",geometry:["area"],fields:["name"],tags:{landuse:"meadow"},terms:["grazing","hay field","pasture"],name:"Meadow"},"landuse/military":{icon:"temaki-military",fields:["name"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"military"},terms:[],matchScore:0.9,name:"Military Area"},"landuse/military/airfield":{icon:"tnp-2009265",fields:["name","iata","icao"],geometry:["point","area"],tags:{military:"airfield"},addTags:{aeroway:"aerodrome",landuse:"military",military:"airfield"},reference:{key:"military",value:"airfield"},terms:["aerodrome","aeroway","air force","airplane","airport","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"},terms:["air force","army","base","fight","force","guard","marine","navy","troop","war"],name:"Barracks"},"landuse/military/danger_area":{icon:"maki-danger",fields:["name"],geometry:["point","vertex","area"],tags:{military:"danger_area"},addTags:{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"},terms:["base","fight","force","guard","marine","navy","ship","sub","troop","war"],name:"Naval Base"},"landuse/military/obstacle_course":{icon:"temaki-military",geometry:["point","area"],tags:{military:"obstacle_course"},addTags:{landuse:"military",military:"obstacle_course"},terms:["army","base","force","guard","marine","navy","troop","war"],name:"Obstacle Course"},"landuse/military/range":{icon:"temaki-military",fields:["name"],geometry:["point","area"],tags:{military:"range"},addTags:{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"},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",fields:["name","operator","trees"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"orchard"},terms:["fruit"],name:"Orchard"},"landuse/plant_nursery":{icon:"maki-garden",fields:["name","operator","plant"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"plant_nursery"},terms:["flower","garden","grow","vivero"],name:"Plant Nursery"},"landuse/quarry":{geometry:["area"],fields:["name","operator","resource"],moreFields:["address","website","phone","email","fax"],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"],moreFields:["address","website","phone","email","fax"],tags:{landuse:"recreation_ground"},terms:["playing fields"],name:"Recreation Ground"},"landuse/religious":{icon:"maki-place-of-worship",geometry:["area"],fields:["name","religion","denomination"],moreFields:["address","website","phone","email","fax"],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/residential/apartments":{icon:"maki-building",fields:["name","operator","address"],geometry:["point","area"],tags:{residential:"apartments"},addTags:{landuse:"residential",residential:"apartments"},reference:{key:"residential",value:"apartments"},terms:["flat","residence","tenement"],name:"Apartment Complex"},"landuse/retail":{icon:"maki-commercial",geometry:["area"],fields:["name"],moreFields:["address","website","phone","email","fax"],tags:{landuse:"retail"},matchScore:0.9,name:"Retail Area"},"landuse/vineyard":{fields:["name","operator","grape_variety"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"vineyard"},addTags:{landuse:"vineyard",crop:"grape"},removeTags:{landuse:"vineyard",crop:"grape",grape_variety:"*"},terms:["grape","wine"],name:"Vineyard"},"landuse/winter_sports":{icon:"fas-skiing",geometry:["area"],fields:["name","operator"],moreFields:["address","access_simple","opening_hours"],tags:{landuse:"winter_sports"},terms:["piste area","ski area","ski hill","ski mountain","ski resort","snow board area","snowboard area"],name:"Winter Sports Area"},"leisure/adult_gaming_centre":{icon:"temaki-casino",fields:["{amenity/casino}"],moreFields:["{amenity/casino}"],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"],moreFields:["air_conditioning","opening_hours","payment_multi","smoking","website","phone","email","fax"],geometry:["point","area"],terms:["pay-to-play games","video games","driving simulators","pinball machines"],tags:{leisure:"amusement_arcade"},name:"Amusement Arcade"},"leisure/bandstand":{icon:"maki-music",fields:["name","building_area","operator"],moreFields:["website"],geometry:["point","area"],tags:{leisure:"bandstand"},name:"Bandstand"},"leisure/beach_resort":{icon:"maki-beach",fields:["name","address","opening_hours","fee","payment_multi_fee"],moreFields:["smoking","website","phone","email","fax"],geometry:["point","area"],tags:{leisure:"beach_resort"},name:"Beach Resort"},"leisure/bird_hide":{icon:"temaki-binoculars",fields:["name","building_area","address","opening_hours"],moreFields:["website"],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"],moreFields:["air_conditioning","opening_hours","payment_multi","smoking","website","phone","email","fax"],geometry:["point","area"],terms:["bowling center"],tags:{leisure:"bowling_alley"},name:"Bowling Alley"},"leisure/common":{icon:"temaki-pedestrian",fields:["name"],moreFields:["website"],geometry:["point","area"],terms:["open space"],tags:{leisure:"common"},name:"Common"},"leisure/dance":{icon:"maki-music",fields:["name","operator","address","building_area","dance/style"],moreFields:["opening_hours","payment_multi","website","phone","email","fax"],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","building_area","dance/style"],moreFields:["opening_hours","payment_multi","website","phone","email","fax"],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/disc_golf_course":{icon:"temaki-disc_golf_basket",fields:["name","operator","access_simple","fee","payment_multi_fee","opening_hours"],moreFields:["address","dog","email","fax","lit","phone","website","wheelchair"],geometry:["point","area"],tags:{leisure:"disc_golf_course"},addTags:{leisure:"disc_golf_course",sport:"disc_golf"},terms:["disk golf","frisbee golf","flying disc golf","frolf","ultimate"],name:"Disc Golf Course"},"leisure/dog_park":{icon:"maki-dog-park",fields:["name"],moreFields:["website","phone","email","fax"],geometry:["point","area"],terms:[],tags:{leisure:"dog_park"},name:"Dog Park"},"leisure/escape_game":{icon:"fas-puzzle-piece",fields:["name","address","building_area","opening_hours","website","fee","payment_multi_fee","internet_access","internet_access/fee","internet_access/ssid"],moreFields:["air_conditioning","email","fax","phone","smoking","wheelchair"],geometry:["point","area"],terms:["escape game","escape the room","puzzle room","quest room"],tags:{leisure:"escape_game"},name:"Escape Room"},"leisure/firepit":{icon:"maki-fire-station",fields:["access_simple"],geometry:["point","area"],tags:{leisure:"firepit"},terms:["fireplace","campfire"],name:"Firepit"},"leisure/fishing":{icon:"fas-fish",fields:["name","access_simple","fishing"],geometry:["vertex","point","area"],tags:{leisure:"fishing"},terms:["angler"],name:"Fishing Spot"},"leisure/fitness_centre":{icon:"fas-dumbbell",fields:["name","sport","address","building_area"],moreFields:["opening_hours","fee","payment_multi","website","phone","email","fax"],geometry:["point","area"],tags:{leisure:"fitness_centre"},terms:["health","gym","leisure","studio"],name:"Gym / Fitness Center"},"leisure/fitness_centre/yoga":{icon:"maki-pitch",geometry:["point","area"],terms:["studio","asanas","modern yoga","meditation"],tags:{leisure:"fitness_centre",sport:"yoga"},reference:{key:"sport",value:"yoga"},name:"Yoga Studio"},"leisure/fitness_station":{icon:"maki-pitch",fields:["fitness_station","ref"],moreFields:["opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_station"},addTags:{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",geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"balance_beam"},addTags:{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",geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"box"},addTags:{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",geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"horizontal_bar"},addTags:{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",geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"horizontal_ladder"},addTags:{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",geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"hyperextension"},addTags:{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",geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"parallel_bars"},addTags:{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",geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"push-up"},addTags:{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",geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"rings"},addTags:{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",geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"sign"},addTags:{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",geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"sit-up"},addTags:{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",geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"stairs"},addTags:{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","operator","access_simple","fee","payment_multi_fee"],moreFields:["website","phone","email","fax"],geometry:["point","vertex","area"],tags:{leisure:"garden"},name:"Garden"},"leisure/golf_course":{icon:"maki-golf",fields:["name","operator","address","opening_hours"],moreFields:["payment_multi","website","phone","email","fax"],geometry:["point","area"],terms:["links"],tags:{leisure:"golf_course"},name:"Golf Course"},"leisure/hackerspace":{icon:"fas-code",fields:["name","address","building_area","opening_hours","website","fee","payment_multi_fee","internet_access","internet_access/fee","internet_access/ssid"],moreFields:["air_conditioning","email","fax","phone","smoking","wheelchair"],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"],moreFields:["opening_hours","payment_multi","website","phone","email","fax"],geometry:["point","area"],terms:["equestrian","stable"],tags:{leisure:"horse_riding"},name:"Horseback Riding Facility"},"leisure/ice_rink":{icon:"fas-skating",fields:["name","seasonal","sport_ice","operator","address","building"],moreFields:["opening_hours","payment_multi","website","phone","email","fax"],geometry:["point","area"],terms:["hockey","skating","curling"],tags:{leisure:"ice_rink"},name:"Ice Rink"},"leisure/marina":{icon:"tnp-2009223",fields:["name","operator","capacity","fee","payment_multi_fee","sanitary_dump_station","power_supply"],moreFields:["address","internet_access","internet_access/fee","internet_access/ssid","seamark/type","website","phone","email","fax"],geometry:["point","vertex","area"],terms:["boat"],tags:{leisure:"marina"},name:"Marina"},"leisure/miniature_golf":{icon:"maki-golf",fields:["name","operator","address","opening_hours","fee","payment_multi_fee"],moreFields:["website","phone","email","fax"],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","operator","address","opening_hours"],moreFields:["dog","website","phone","email","fax"],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",fields:["name","operator","address","opening_hours"],moreFields:["dog","smoking","website","phone","email","fax"],geometry:["point","area"],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",fields:["material","lit","bench"],geometry:["point"],tags:{leisure:"picnic_table"},terms:["bench"],name:"Picnic Table"},"leisure/picnic_table/chess":{icon:"fas-chess-pawn",geometry:["point"],tags:{leisure:"picnic_table",sport:"chess"},reference:{key:"sport",value:"chess"},terms:["bench","chess board","checkerboard","checkers","chequerboard","game table"],name:"Chess Table"},"leisure/pitch":{icon:"maki-pitch",fields:["name","sport","access_simple","surface","lit"],moreFields:["covered","fee","indoor","payment_multi_fee"],geometry:["point","area"],tags:{leisure:"pitch"},terms:["field"],name:"Sport Pitch"},"leisure/pitch/american_football":{icon:"maki-american-football",geometry:["point","area"],tags:{leisure:"pitch",sport:"american_football"},reference:{key:"sport",value:"american_football"},terms:["football","gridiron"],name:"American Football Field"},"leisure/pitch/australian_football":{icon:"maki-american-football",geometry:["point","area"],tags:{leisure:"pitch",sport:"australian_football"},reference:{key:"sport",value:"australian_football"},terms:["Aussie","AFL","football"],name:"Australian Football Field"},"leisure/pitch/badminton":{icon:"maki-tennis",fields:["{leisure/pitch}","access_simple"],geometry:["point","area"],tags:{leisure:"pitch",sport:"badminton"},reference:{key:"sport",value:"badminton"},terms:[],name:"Badminton Court"},"leisure/pitch/baseball":{icon:"maki-baseball",geometry:["point","area"],tags:{leisure:"pitch",sport:"baseball"},reference:{key:"sport",value:"baseball"},terms:[],name:"Baseball Field"},"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-volleyball",geometry:["point","area"],tags:{leisure:"pitch",sport:"beachvolleyball"},addTags:{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","{leisure/pitch}"],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",geometry:["point","area"],tags:{leisure:"pitch",sport:"bowls"},reference:{key:"sport",value:"bowls"},terms:[],name:"Bowling Green"},"leisure/pitch/cricket":{icon:"maki-cricket",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:["{leisure/pitch}","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/field_hockey":{icon:"maki-pitch",geometry:["point","area"],tags:{leisure:"pitch",sport:"field_hockey"},reference:{key:"sport",value:"field_hockey"},terms:["landhockey"],name:"Field Hockey Pitch"},"leisure/pitch/horseshoes":{icon:"temaki-horseshoes",geometry:["point","area"],tags:{leisure:"pitch",sport:"horseshoes"},reference:{key:"sport",value:"horseshoes"},terms:["horse shoes"],name:"Horseshoes Pit"},"leisure/pitch/netball":{icon:"maki-volleyball",geometry:["point","area"],tags:{leisure:"pitch",sport:"netball"},reference:{key:"sport",value:"netball"},terms:[],name:"Netball Court"},"leisure/pitch/rugby_league":{icon:"maki-american-football",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-american-football",geometry:["point","area"],tags:{leisure:"pitch",sport:"rugby_union"},reference:{key:"sport",value:"rugby_union"},terms:[],name:"Rugby Union Field"},"leisure/pitch/shuffleboard":{icon:"temaki-shuffleboard",geometry:["point","area"],tags:{leisure:"pitch",sport:"shuffleboard"},reference:{key:"sport",value:"shuffleboard"},terms:["deck shuffleboard","floor shuffleboard"],name:"Shuffleboard Court"},"leisure/pitch/skateboard":{icon:"maki-skateboard",geometry:["point","area"],tags:{leisure:"pitch",sport:"skateboard"},reference:{key:"sport",value:"skateboard"},terms:[],name:"Skate Park"},"leisure/pitch/soccer":{icon:"maki-soccer",geometry:["point","area"],tags:{leisure:"pitch",sport:"soccer"},reference:{key:"sport",value:"soccer"},terms:["football"],name:"Soccer Field"},"leisure/pitch/softball":{icon:"maki-baseball",geometry:["point","area"],tags:{leisure:"pitch",sport:"softball"},reference:{key:"sport",value:"softball"},terms:["softball","diamond"],name:"Softball 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:["{leisure/pitch}","access_simple"],geometry:["point","area"],tags:{leisure:"pitch",sport:"tennis"},reference:{key:"sport",value:"tennis"},terms:[],name:"Tennis Court"},"leisure/pitch/volleyball":{icon:"maki-volleyball",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","resort","address","opening_hours"],moreFields:["access_simple","email","fax","internet_access","internet_access/fee","internet_access/ssid","payment_multi","phone","website"],geometry:["point","area"],tags:{leisure:"resort"},terms:["recreation center","sanatorium","ski and snowboard resort","vacation resort","winter sports resort"],name:"Resort"},"leisure/sauna":{icon:"fas-thermometer-three-quarters",fields:["name","operator","address","opening_hours","access_simple","fee","payment_multi_fee"],moreFields:["website","phone","email","fax"],geometry:["point","area"],tags:{leisure:"sauna"},name:"Sauna"},"leisure/slipway_point":{icon:"maki-slipway",fields:["{leisure/slipway}"],moreFields:["{leisure/slipway}"],geometry:["point","vertex"],terms:["boat launch","boat ramp","boat landing"],tags:{leisure:"slipway"},name:"Slipway"},"leisure/slipway":{icon:"maki-slipway",fields:["name","surface","access_simple","fee","payment_multi_fee","lanes"],moreFields:["lit","opening_hours","seamark/type","width"],geometry:["line"],terms:["boat launch","boat ramp","boat landing"],tags:{leisure:"slipway"},addTags:{leisure:"slipway",highway:"service",service:"slipway"},matchScore:1.1,name:"Slipway"},"leisure/sports_centre":{icon:"maki-pitch",fields:["name","sport","building","address","fee","payment_multi_fee"],moreFields:["opening_hours","website","phone","email","fax"],geometry:["point","area"],tags:{leisure:"sports_centre"},terms:[],name:"Sports Center / Complex"},"leisure/sports_centre/climbing":{icon:"temaki-abseiling",geometry:["point","area"],terms:["abseiling","artificial climbing wall","belaying","bouldering","rock climbing facility","indoor rock wall","rappeling","rock gym","ropes"],tags:{leisure:"sports_centre",sport:"climbing"},reference:{key:"sport",value:"climbing"},name:"Climbing Gym"},"leisure/sports_centre/swimming":{icon:"fas-swimmer",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"],moreFields:["website","phone","email","fax"],geometry:["point","area"],tags:{leisure:"stadium"},name:"Stadium"},"leisure/swimming_area":{icon:"fas-swimmer",fields:["name","access_simple","supervised","fee","payment_multi_fee","lit"],moreFields:["opening_hours","operator"],geometry:["area"],terms:["dive","water","aquatics"],tags:{leisure:"swimming_area"},name:"Natural Swimming Area"},"leisure/swimming_pool":{icon:"fas-swimming-pool",fields:["name","access_simple","lit","location_pool","length","swimming_pool"],moreFields:["address","opening_hours","operator"],geometry:["point","area"],terms:["dive","water","aquatics"],tags:{leisure:"swimming_pool"},name:"Swimming Pool"},"leisure/track":{icon:"iD-other-line",fields:["surface","sport_racing_nonmotor","lit","width","lanes"],moreFields:["access","covered","indoor"],geometry:["point","line","area"],tags:{leisure:"track"},terms:["cycle","dog","greyhound","horse","race*","track"],name:"Racetrack (Non-Motorsport)"},"leisure/track/cycling_point":{icon:"maki-bicycle",fields:["{leisure/track/cycling}"],geometry:["point"],tags:{leisure:"track",sport:"cycling"},terms:["bicycle track","bicycling track","cycle racetrack","velodrome"],name:"Cycling Track"},"leisure/track/cycling":{icon:"maki-bicycle",fields:["name","surface","sport_racing_nonmotor","lit","width","lanes"],geometry:["line","area"],tags:{leisure:"track",sport:"cycling"},terms:["bicycle track","bicycling track","cycle racetrack","velodrome"],name:"Cycling Track"},"leisure/track/horse_racing_point":{icon:"maki-horse-riding",fields:["{leisure/track/horse_racing}"],geometry:["point"],tags:{leisure:"track",sport:"horse_racing"},terms:["equestrian race track","horse race betting","horseracing","horsetrack","horse racetrack"],name:"Horse Racing Track"},"leisure/track/horse_racing":{icon:"maki-horse-riding",fields:["name","surface","sport_racing_nonmotor","lit","width","lanes"],geometry:["line","area"],tags:{leisure:"track",sport:"horse_racing"},terms:["equestrian race track","horse race betting","horseracing","horsetrack","horse racetrack"],name:"Horse Racing Track"},"leisure/track/running_point":{icon:"maki-pitch",fields:["{leisure/track/running}"],geometry:["point"],tags:{leisure:"track",sport:"running"},terms:["athletics track","decathlon","foot race","long distance running","marathon","middle distance running","racetrack","running","sprint","track","walking"],name:"Running Track"},"leisure/track/running":{icon:"maki-pitch",fields:["name","surface","sport_racing_nonmotor","lit","width","lanes"],geometry:["line","area"],tags:{leisure:"track",sport:"running"},terms:["athletics track","decathlon","foot race","long distance running","marathon","middle distance running","racetrack","running","sprint","track","walking"],name:"Running Track"},"leisure/water_park":{icon:"fas-swimmer",fields:["name","operator","address"],moreFields:["payment_multi","brand","website","phone","email","fax"],geometry:["point","area"],terms:["swim","pool","dive"],tags:{leisure:"water_park"},name:"Water Park"},line:{fields:["name"],geometry:["line"],tags:{},terms:["polyline"],name:"Line",matchScore:0.1},"man_made/adit":{icon:"maki-triangle",geometry:["point","area"],fields:["name","operator","resource","direction"],terms:["cave","horizontal mine entrance","tunnel","underground"],tags:{man_made:"adit"},name:"Adit"},"man_made/antenna":{icon:"temaki-antenna",fields:["communication_multi","operator","manufacturer","height"],geometry:["point"],terms:["broadcast","cell phone","cell","communication","mobile phone","radio","television","transmission","tv"],tags:{man_made:"antenna"},name:"Antenna"},"man_made/beacon":{icon:"maki-communications-tower",fields:["name","height"],moreFields:["seamark/type"],geometry:["point","area"],tags:{man_made:"beacon"},name:"Beacon",matchScore:0.5},"man_made/beehive":{icon:"fas-archive",geometry:["point","area"],fields:["ref","operator","seasonal","height","colour"],moreFields:["manufacturer"],terms:["apiary","beekeeper","farm","honey","pollination"],tags:{man_made:"beehive"},name:"Beehive"},"man_made/breakwater":{fields:["material","seamark/type"],geometry:["line","area"],tags:{man_made:"breakwater"},name:"Breakwater"},"man_made/bridge":{icon:"maki-bridge",fields:["name","bridge","layer","maxweight"],moreFields:["manufacturer","material","seamark/type"],geometry:["area"],tags:{man_made:"bridge"},addTags:{man_made:"bridge",layer:"1"},removeTags:{man_made:"bridge",layer:"*"},reference:{key:"man_made",value:"bridge"},name:"Bridge",matchScore:0.85},"man_made/bunker_silo":{icon:"temaki-silo",fields:["content"],geometry:["point","area"],terms:["Silage","Storage"],tags:{man_made:"bunker_silo"},name:"Bunker Silo"},"man_made/cairn":{icon:"maki-triangle",geometry:["point","area"],terms:["rock pile","stone stack","stone pile","càrn"],tags:{man_made:"cairn"},name:"Cairn"},"man_made/chimney":{icon:"temaki-chimney",fields:["operator","material","height"],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","manufacturer","height","crane/type"],geometry:["point","line","vertex","area"],tags:{man_made:"crane"},name:"Crane"},"man_made/cross":{icon:"maki-religious-christian",fields:["name","material","height","elevation","inscription","direction"],geometry:["point","vertex"],tags:{man_made:"cross"},name:"Summit Cross"},"man_made/cutline":{icon:"maki-logging",geometry:["line"],tags:{man_made:"cutline"},name:"Cut line"},"man_made/dyke":{geometry:["line"],tags:{man_made:"dyke"},terms:["Dike","Dyke","Floodbank","Stopbank"],name:"Levee"},"man_made/embankment":{geometry:["line"],tags:{man_made:"embankment"},name:"Embankment"},"man_made/flagpole":{icon:"maki-embassy",fields:["operator","flag/type","country","lit","height"],moreFields:["manufacturer","material"],geometry:["point","vertex"],tags:{man_made:"flagpole"},name:"Flagpole"},"man_made/gasometer":{icon:"temaki-storage_tank",fields:["content","building_area"],geometry:["point","area"],terms:["gas holder"],tags:{man_made:"gasometer"},name:"Gasometer"},"man_made/groyne":{fields:["material","seamark/type"],geometry:["line","area"],tags:{man_made:"groyne"},name:"Groyne"},"man_made/lighthouse":{icon:"maki-lighthouse",fields:["name","operator","building_area","height"],moreFields:["address","email","fax","phone","seamark/type","website"],geometry:["point","area"],tags:{man_made:"lighthouse"},addTags:{man_made:"lighthouse","seamark:type":"light_major"},removeTags:{man_made:"lighthouse","seamark:type":"*"},name:"Lighthouse"},"man_made/mast":{icon:"maki-communications-tower",fields:["tower/type","tower/construction","height"],moreFields:["manufacturer","material","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/mast/communication":{icon:"maki-communications-tower",fields:["{man_made/mast}","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","tower:type":"communication"},reference:{key:"tower:type",value:"communication"},name:"Communication Mast"},"man_made/mast/communication/mobile_phone":{icon:"maki-communications-tower",geometry:["point"],terms:["antenna","cell mast","cell phone mast","cell phone tower","cell tower","communication mast","communication tower","guyed tower","mobile phone tower","transmission mast","transmission tower"],tags:{man_made:"mast","tower:type":"communication","communication:mobile_phone":"yes"},reference:{key:"communication:mobile_phone",value:"yes"},name:"Mobile Phone Mast"},"man_made/mast/communication/radio":{icon:"maki-communications-tower",geometry:["point"],terms:["antenna","broadcast tower","communication mast","communication tower","guyed tower","radio mast","radio tower","transmission mast","transmission tower"],tags:{man_made:"mast","tower:type":"communication","communication:radio":"yes"},reference:{key:"communication:radio",value:"yes"},name:"Radio Broadcast Mast"},"man_made/mast/communication/television":{icon:"maki-communications-tower",geometry:["point"],terms:["antenna","broadcast tower","communication mast","communication tower","guyed tower","television mast","television tower","transmission mast","transmission tower","tv mast","tv tower"],tags:{man_made:"mast","tower:type":"communication","communication:television":"yes"},reference:{key:"communication:television",value:"yes"},name:"Television Broadcast Mast"},"man_made/mineshaft":{icon:"maki-triangle",geometry:["point","area"],fields:["name","operator","resource"],terms:["cave","mine shaft","tunnel","underground","vertical mine entrance"],tags:{man_made:"mineshaft"},name:"Mineshaft"},"man_made/monitoring_station":{icon:"temaki-antenna",geometry:["point","vertex","area"],fields:["monitoring_multi","operator","manufacturer"],terms:["weather","earthquake","seismology","air","gps"],tags:{man_made:"monitoring_station"},name:"Monitoring Station"},"man_made/observatory":{fields:["name","operator","address","access_simple","building_area"],moreFields:["website","phone","email","fax"],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:"temaki-pedestrian",fields:["name","surface","floating","width","access","lit"],moreFields:["access","fishing","incline","{highway/footway}"],geometry:["line","area"],terms:["berth","dock","jetty","landing","promenade","wharf"],tags:{man_made:"pier"},name:"Pier"},"man_made/pier/floating":{icon:"temaki-pedestrian",geometry:["line","area"],terms:["berth","dock","jetty","landing","promenade","wharf"],tags:{man_made:"pier",floating:"yes"},addTags:{highway:"footway",man_made:"pier",floating:"yes"},name:"Floating Pier"},"man_made/pipeline":{icon:"iD-pipeline-line",fields:["operator","location","substance","layer","diameter"],geometry:["line"],terms:["oil","natural gas","water","sewer","sewage"],tags:{man_made:"pipeline"},name:"Pipeline"},"man_made/pipeline/underground":{icon:"iD-pipeline-line",geometry:["line"],terms:["oil","natural gas","water","sewer","sewage"],tags:{man_made:"pipeline",location:"underground"},addTags:{man_made:"pipeline",location:"underground",layer:"-1"},name:"Underground Pipeline"},"man_made/pipeline/valve":{geometry:["vertex"],fields:["ref","operator","valve","location","diameter"],moreFields:["colour","manufacturer","material"],terms:["oil","natural gas","water","sewer","sewage"],tags:{man_made:"pipeline",pipeline:"valve"},name:"Pipeline Valve"},"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:["crop","building_area"],geometry:["point","area"],terms:["grain","corn","wheat"],tags:{man_made:"silo"},name:"Silo"},"man_made/storage_tank":{icon:"temaki-storage_tank",fields:["content","operator","material","building_area","height","capacity"],moreFields:["layer","location","manufacturer"],geometry:["point","area"],terms:["water","oil","gas","petrol"],tags:{man_made:"storage_tank"},name:"Storage Tank"},"man_made/storage_tank/water":{icon:"temaki-storage_tank",geometry:["point","area"],terms:["cistern","water tower"],tags:{man_made:"storage_tank",content:"water"},name:"Water Tank"},"man_made/street_cabinet":{icon:"fas-door-closed",geometry:["point","area"],fields:["ref","operator","street_cabinet","height","colour"],terms:["cable tv","monitoring box","technical box","telecommunications","traffic signal controls"],tags:{man_made:"street_cabinet"},name:"Street Cabinet"},"man_made/surveillance":{icon:"temaki-security_camera",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/surveillance/camera":{icon:"temaki-security_camera",geometry:["point","vertex"],fields:["surveillance","surveillance/type","camera/type","camera/mount","camera/direction","surveillance/zone","contact/webcam"],moreFields:["manufacturer"],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/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/torii":{icon:"temaki-shinto",fields:["height","material","colour","lit"],moreFields:["name","operator","ref"],geometry:["point","vertex","line"],terms:["Japanese gate","Shinto shrine"],tags:{man_made:"torii"},name:"Torii"},"man_made/tower":{icon:"temaki-tower",fields:["tower/type","tower/construction","height","building_area"],moreFields:["architect"],geometry:["point","area"],tags:{man_made:"tower"},name:"Tower"},"man_made/tower/bell_tower":{icon:"fas-bell",moreFields:["{man_made/tower}","opening_hours"],geometry:["point","area"],terms:["belfry","bell gable","campanile","church tower","klockstapel"],tags:{man_made:"tower","tower:type":"bell_tower"},reference:{key:"tower:type",value:"bell_tower"},name:"Bell Tower"},"man_made/tower/communication":{icon:"temaki-tower",fields:["{man_made/tower}","communication_multi"],geometry:["point","area"],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:"tower","tower:type":"communication"},reference:{key:"tower:type",value:"communication"},name:"Communication Tower"},"man_made/tower/defensive":{icon:"maki-castle",geometry:["point","area"],tags:{man_made:"tower","tower:type":"defensive"},reference:{key:"tower:type",value:"defensive"},terms:["Defensive Tower","Castle Tower"],name:"Fortified Tower"},"man_made/tower/minaret":{icon:"temaki-tower",geometry:["point","area"],terms:["Islam","mosque","Muezzin","Muslim"],tags:{man_made:"tower","tower:type":"minaret"},reference:{key:"tower:type",value:"minaret"},name:"Minaret"},"man_made/tower/observation":{icon:"temaki-tower",moreFields:["{man_made/tower}","opening_hours"],geometry:["point","area"],terms:["lookout tower","fire tower"],tags:{man_made:"tower","tower:type":"observation"},reference:{key:"tower:type",value:"observation"},name:"Observation Tower"},"man_made/tunnel":{icon:"tnp-2009642",fields:["name","tunnel","layer","width","length","height"],geometry:["area"],tags:{man_made:"tunnel"},addTags:{man_made:"tunnel",layer:"-1"},removeTags:{man_made:"tunnel",layer:"*"},reference:{key:"man_made",value:"tunnel"},terms:["bore","dig","shaft","underground passage","underpass"],name:"Tunnel"},"man_made/wastewater_plant":{icon:"maki-water",fields:["name","operator","address"],moreFields:["website","phone","email","fax"],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","height"],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-watermill",fields:["building_area"],geometry:["point","area"],terms:["water","wheel","mill"],tags:{man_made:"watermill"},name:"Watermill"},"man_made/windmill":{icon:"maki-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"],moreFields:["website","phone","email","fax"],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:"*"},addTags:{man_made:"manhole",manhole:"*"},terms:["cover","hole","sewer","sewage","telecom"],name:"Manhole"},"manhole/drain":{icon:"maki-water",fields:["operator","ref"],geometry:["point","vertex"],tags:{manhole:"drain"},addTags:{man_made:"manhole",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"},addTags:{man_made:"manhole",manhole:"telecom"},terms:["cover","phone","hole","telecom","telephone","bt"],name:"Telecom Manhole"},"military/bunker":{icon:"temaki-military",fields:["name","bunker_type","building_area"],geometry:["point","area"],tags:{military:"bunker"},addTags:{building:"bunker",military:"bunker"},terms:["air force","army","base","fight","force","guard","marine","navy","troop","war"],name:"Military Bunker"},"military/checkpoint":{icon:"maki-barrier",fields:["name"],geometry:["point","vertex","area"],tags:{military:"checkpoint"},terms:["air force","army","base","force","guard","marine","navy","troop","war"],name:"Checkpoint"},"military/nuclear_explosion_site":{icon:"maki-danger",fields:["name"],geometry:["point","vertex","area"],tags:{military:"nuclear_explosion_site"},terms:["atom","blast","bomb","detonat*","nuke","site","test"],name:"Nuclear Explosion Site"},"military/office":{icon:"temaki-military",fields:["name","building_area"],geometry:["point","area"],tags:{military:"office"},terms:["air force","army","base","enlist","fight","force","guard","marine","navy","recruit","troop","war"],name:"Military Office"},"military/trench":{icon:"temaki-military",fields:["name","trench"],geometry:["point","line"],tags:{military:"trench"},terms:["dugout","firestep","fox hole","infantry trench","war trench"],name:"Military Trench"},"natural/bare_rock":{geometry:["area"],tags:{natural:"bare_rock"},terms:["rock"],name:"Bare Rock"},"natural/bay":{icon:"temaki-beach",geometry:["point","line","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/cape":{icon:"temaki-beach",fields:["name","elevation","description"],geometry:["point"],tags:{natural:"cape"},terms:["bay","coastline","erosion","headland","promontory"],name:"Cape"},"natural/cave_entrance":{icon:"maki-triangle",geometry:["point","area"],fields:["name","elevation","access_simple","direction","fee","payment_multi_fee"],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":{icon:"temaki-snow",geometry:["area"],tags:{natural:"glacier"},terms:["ice","snow"],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/rock":{icon:"temaki-boulder2",fields:["name"],geometry:["point","area"],tags:{natural:"rock"},terms:["boulder","stone","rock"],name:"Attached Rock / Boulder"},"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/shingle":{geometry:["area"],tags:{natural:"shingle"},terms:["beach","gravel","pebbles","riverbed","rounded rock fragments"],name:"Shingle"},"natural/spring":{icon:"maki-water",fields:["name","intermittent"],geometry:["point","vertex"],tags:{natural:"spring"},terms:[],name:"Spring"},"natural/stone":{icon:"temaki-boulder1",fields:["name"],geometry:["point","area"],tags:{natural:"stone"},terms:["boulder","stone","rock"],name:"Unattached Stone / Boulder"},"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","diameter"],geometry:["point","vertex"],tags:{natural:"tree"},terms:[],name:"Tree"},"natural/valley":{icon:"maki-triangle-stroked",fields:["name","elevation","description"],geometry:["vertex","point","line"],tags:{natural:"valley"},terms:["canyon","dale","dell","dene","depression","glen","gorge","gully","gulley","gultch","hollow","ravine","rift","vale"],name:"Valley"},"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:["name","water","intermittent"],moreFields:["fishing","salt","tidal"],geometry:["area"],tags:{natural:"water"},name:"Water"},"natural/water/basin":{icon:"maki-water",fields:["name","basin","intermittent_yes"],geometry:["area"],tags:{natural:"water",water:"basin"},reference:{key:"water",value:"basin"},terms:["detention","drain","overflow","rain","retention"],name:"Basin"},"natural/water/canal":{icon:"iD-waterway-canal",fields:["{natural/water}","salt"],geometry:["area"],tags:{natural:"water",water:"canal"},reference:{key:"water",value:"canal"},name:"Canal"},"natural/water/lake":{icon:"maki-water",fields:["{natural/water}","salt","tidal"],geometry:["area"],tags:{natural:"water",water:"lake"},reference:{key:"water",value:"lake"},terms:["lakelet","loch","mere"],name:"Lake"},"natural/water/moat":{icon:"maki-water",fields:["{natural/water}","salt"],geometry:["area"],tags:{natural:"water",water:"moat"},name:"Moat"},"natural/water/pond":{icon:"maki-water",fields:["{natural/water}","salt"],geometry:["area"],tags:{natural:"water",water:"pond"},reference:{key:"water",value:"pond"},terms:["lakelet","millpond","tarn","pool","mere"],name:"Pond"},"natural/water/reservoir":{icon:"maki-water",geometry:["area"],tags:{natural:"water",water:"reservoir"},reference:{key:"water",value:"reservoir"},name:"Reservoir"},"natural/water/river":{icon:"iD-waterway-river",fields:["{natural/water}","tidal"],geometry:["area"],tags:{natural:"water",water:"river"},reference:{key:"water",value:"river"},terms:["beck","branch","brook","course","creek","estuary","rill","riverbank","rivulet","run","runnel","stream","tributary","watercourse"],name:"River"},"natural/water/stream":{icon:"iD-waterway-stream",fields:["{natural/water}"],geometry:["area"],tags:{natural:"water",water:"stream"},reference:{key:"water",value:"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"],name:"Stream"},"natural/water/wastewater":{icon:"maki-water",geometry:["area"],tags:{natural:"water",water:"wastewater"},reference:{key:"water",value:"wastewater"},terms:["excrement","shit","sewage","wastewater","Settling Basin","Clarifier Basin"],name:"Wastewater Basin"},"natural/wetland":{icon:"maki-wetland",fields:["wetland","salt","tidal"],geometry:["point","area"],tags:{natural:"wetland"},terms:["bog","fen","marsh","mire","moor","muskeg","peatland","quagmire","reedbed","saltmarsh","swamp","tidalflat","wet meadow"],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"],moreFields:["air_conditioning","building/levels_building","height_building","email","fax","internet_access","internet_access/fee","internet_access/ssid","operator","phone","smoking","website","wheelchair"],geometry:["point","vertex","area"],tags:{office:"*"},terms:[],name:"Office"},"office/administrative":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"administrative"},terms:[],searchable:false,name:"Administrative Office"},"office/physician":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"physician"},searchable:false,name:"Physician"},"office/travel_agent":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"travel_agent"},reference:{key:"shop",value:"travel_agency"},terms:[],name:"Travel Agency",searchable:false},"office/accountant":{icon:"temaki-accounting",geometry:["point","area"],tags:{office:"accountant"},terms:[],name:"Accountant Office"},"office/adoption_agency":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"adoption_agency"},terms:[],name:"Adoption Agency"},"office/advertising_agency":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"advertising_agency"},terms:["ad","ad agency","advert agency","advertising","marketing"],name:"Advertising Agency"},"office/architect":{icon:"fas-drafting-compass",geometry:["point","area"],tags:{office:"architect"},terms:[],name:"Architect Office"},"office/association":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"association"},terms:["association","non-profit","nonprofit","organization","society"],name:"Nonprofit Organization Office"},"office/bail_bond_agent":{icon:"maki-bank",moreFields:["{office}","currency_multi","payment_multi"],geometry:["point","area"],tags:{office:"bail_bond_agent"},terms:["bail bond dealer","bail bond man","bail bondsman","bail bondsperson"],name:"Bail Bond Agent"},"office/charity":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"charity"},terms:["charitable organization"],name:"Charity Office"},"office/company":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"company"},terms:[],name:"Corporate Office"},"office/coworking":{icon:"maki-suitcase",fields:["{office}","internet_access"],moreFields:["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/diplomatic":{icon:"maki-embassy",fields:["name","diplomatic","country","target","diplomatic/services","{office}"],geometry:["point","area"],tags:{office:"diplomatic"},terms:[],name:"Diplomatic Office"},"office/diplomatic/consulate":{icon:"maki-embassy",fields:["name","consulate","{office/diplomatic}"],geometry:["point","area"],tags:{office:"diplomatic",diplomatic:"consulate"},reference:{key:"diplomatic",value:"consulate"},terms:[],name:"Consulate"},"office/diplomatic/embassy":{icon:"maki-embassy",fields:["name","embassy","{office/diplomatic}"],geometry:["point","area"],tags:{office:"diplomatic",diplomatic:"embassy"},reference:{key:"diplomatic",value:"embassy"},terms:[],name:"Embassy"},"office/diplomatic/liaison":{icon:"maki-embassy",fields:["name","liaison","{office/diplomatic}"],geometry:["point","area"],tags:{office:"diplomatic",diplomatic:"liaison"},reference:{key:"diplomatic",value:"liaison"},terms:[],name:"Liaison Office"},"office/educational_institution":{icon:"maki-school",geometry:["point","area"],tags:{office:"educational_institution"},terms:[],name:"Educational Institution"},"office/employment_agency":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"employment_agency"},terms:["job"],name:"Employment Agency"},"office/energy_supplier":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"energy_supplier"},terms:["electricity","energy company","energy utility","gas utility"],name:"Energy Supplier Office"},"office/estate_agent":{icon:"temaki-real_estate_agency",geometry:["point","area"],tags:{office:"estate_agent"},terms:["real estate"],name:"Real Estate Office"},"office/financial_advisor":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"financial_advisor"},terms:["401k","inheritance","savings","stocks","retirement","wealth management"],name:"Financial Advisor"},"office/financial":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"financial"},terms:[],name:"Financial Office"},"office/forestry":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"forestry"},terms:["forest","ranger"],name:"Forestry Office"},"office/foundation":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"foundation"},terms:[],name:"Foundation Office"},"office/government":{icon:"maki-town-hall",fields:["name","government","{office}"],geometry:["point","area"],tags:{office:"government"},terms:[],name:"Government Office"},"office/government/register_office":{icon:"maki-town-hall",fields:["{office}","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:["{office}","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",geometry:["point","area"],tags:{office:"guide"},terms:["dive guide","mountain guide","tour guide"],name:"Tour Guide Office"},"office/insurance":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"insurance"},terms:[],name:"Insurance Office"},"office/it":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"it"},terms:["computer","information","software","technology"],name:"Information Technology Office"},"office/lawyer":{icon:"fas-balance-scale",geometry:["point","area"],tags:{office:"lawyer"},terms:[],name:"Law Office"},"office/lawyer/notary":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"lawyer",lawyer:"notary"},reference:{key:"office",value:"notary"},searchable:false,name:"Notary Office"},"office/moving_company":{icon:"fas-people-carry",geometry:["point","area"],tags:{office:"moving_company"},terms:["relocation"],name:"Moving Company Office"},"office/newspaper":{icon:"fas-newspaper",geometry:["point","area"],tags:{office:"newspaper"},terms:[],name:"Newspaper Office"},"office/ngo":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"ngo"},terms:["ngo","non government","non-government","organization","organisation"],name:"NGO Office"},"office/notary":{icon:"fas-stamp",geometry:["point","area"],tags:{office:"notary"},terms:["clerk","deeds","estate","signature","wills"],name:"Notary Office"},"office/political_party":{icon:"maki-town-hall",geometry:["point","area"],tags:{office:"political_party"},terms:[],name:"Political Party"},"office/private_investigator":{icon:"fas-user-secret",geometry:["point","area"],tags:{office:"private_investigator"},terms:["PI","private eye","private detective"],name:"Private Investigator Office"},"office/quango":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"quango"},terms:["ngo","non government","non-government","organization","organisation","quasi autonomous","quasi-autonomous"],name:"Quasi-NGO Office"},"office/religion":{icon:"maki-suitcase",fields:["{office}","religion","denomination"],geometry:["point","area"],tags:{office:"religion"},terms:[],name:"Religious Office"},"office/research":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"research"},terms:[],name:"Research Office"},"office/surveyor":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"surveyor"},terms:[],name:"Surveyor Office"},"office/tax_advisor":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"tax_advisor"},terms:["tax","tax consultant"],name:"Tax Advisor Office"},"office/telecommunication":{icon:"maki-telephone",geometry:["point","area"],tags:{office:"telecommunication"},terms:["communication","internet","phone","voice"],name:"Telecom Office"},"office/therapist":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"therapist"},terms:["therapy"],name:"Therapist Office"},"office/water_utility":{icon:"maki-suitcase",fields:["{office}","operator"],geometry:["point","area"],tags:{office:"water_utility"},terms:["water board","utility"],name:"Water Utility Office"},"piste/downhill":{icon:"fas-skiing",fields:["name","piste/type","piste/difficulty_downhill","piste/grooming_downhill","oneway","lit"],geometry:["line","area"],terms:["ski","alpine","snowboard","downhill","piste"],tags:{"piste:type":"downhill"},name:"Downhill Piste/Ski Run"},"piste/downhill/halfpipe":{icon:"fas-snowboarding",geometry:["line","area"],terms:["ski","alpine","halfpipe","half pipe","snowboard","downhill","piste"],tags:{"piste:type":"downhill",man_made:"piste:halfpipe"},name:"Halfpipe"},"piste/hike":{icon:"temaki-snow_shoeing",fields:["name","piste/type","piste/difficulty","piste/grooming_hike","oneway","lit"],geometry:["line","area"],terms:["hike","winter hiking","snowshoe","snowshoeing","piste","ski"],tags:{"piste:type":"hike"},name:"Snowshoeing or Winter Hiking Trail"},"piste/ice_skate":{icon:"fas-skating",fields:["name","piste/type","sport_ice","oneway","lit"],geometry:["line","area"],terms:["ice","skating","ski","piste"],tags:{"piste:type":"ice_skate"},name:"Ice Skating Piste"},"piste/nordic":{icon:"fas-skiing-nordic",fields:["name","piste/type","piste/difficulty_nordic","piste/grooming_nordic","oneway","lit"],geometry:["line","area"],terms:["ski","nordic","crosscountry","skating","piste"],tags:{"piste:type":"nordic"},name:"Nordic or Crosscountry Piste/Ski Trail"},"piste/piste":{icon:"fas-skiing",fields:["name","piste/type","piste/difficulty","piste/grooming","oneway","lit"],geometry:["line","area"],terms:["ski","nordic","crosscountry","downhill","alpine","snowboard","skitour","ski touring","sled","luge","sleigh","sledge","ski-joring","husky","horse","winter hiking","snowshoe","snowshoeing","ice","skating"],tags:{"piste:type":"*"},name:"Winter Sport Trails"},"piste/skitour":{icon:"fas-skiing-nordic",fields:["name","piste/type","piste/difficulty_skitour","piste/grooming","oneway","lit"],geometry:["line","area"],terms:["ski","skitour","crosscountry","ski touring","piste"],tags:{"piste:type":"skitour"},name:"Ski Touring Trail"},"piste/sled":{icon:"temaki-sledding",fields:["name","piste/type","piste/difficulty","piste/grooming","oneway","lit"],geometry:["line","area"],terms:["ski","sled","luge","sleigh","sledge","piste"],tags:{"piste:type":"sled"},name:"Sled Piste"},"piste/sleigh":{icon:"fas-sleigh",fields:["name","piste/type","piste/difficulty","piste/grooming","oneway","lit"],geometry:["line","area"],terms:["ski","piste","sled","luge","sleigh","sledge","ski-joring","husky","horse"],tags:{"piste:type":"sleigh"},name:"Sleigh Piste"},"place/farm":{icon:"maki-farm",geometry:["point","area"],fields:["name"],tags:{place:"farm"},name:"Farm",searchable:false},"place/city_block":{icon:"maki-triangle-stroked",fields:["name"],moreFields:["website"],geometry:["point","area"],tags:{place:"city_block"},name:"City Block"},"place/city":{icon:"maki-city",fields:["name","population"],moreFields:["website"],geometry:["point","area"],tags:{place:"city"},name:"City"},"place/hamlet":{icon:"maki-triangle-stroked",fields:["name","population"],moreFields:["website"],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"],moreFields:["website"],fields:["name"],tags:{place:"locality"},name:"Locality"},"place/neighbourhood":{icon:"maki-triangle-stroked",fields:["name","population"],moreFields:["website"],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"],moreFields:["website"],geometry:["point","area"],tags:{place:"quarter"},terms:["boro","borough","quarter"],name:"Sub-Borough / Quarter"},"place/square":{icon:"temaki-pedestrian",geometry:["point","area"],fields:["name"],moreFields:["website"],tags:{place:"square"},name:"Square"},"place/suburb":{icon:"maki-triangle-stroked",fields:["name","population"],moreFields:["website"],geometry:["point","area"],tags:{place:"suburb"},terms:["boro","borough","quarter"],name:"Borough / Suburb"},"place/town":{icon:"maki-town",fields:["name","population"],moreFields:["website"],geometry:["point","area"],tags:{place:"town"},name:"Town"},"place/village":{icon:"maki-village",fields:["name","population"],moreFields:["website"],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:["capacity","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:["vertex","point"],tags:{},terms:["node","other","vertex","vertices"],name:"Point",matchScore:0.1},polling_station:{icon:"fas-vote-yea",fields:["name","ref","operator","address","opening_hours","building_area"],moreFields:["air_conditioning","email","fax","internet_access","internet_access/fee","internet_access/ssid","phone","website","wheelchair"],geometry:["point","area"],terms:["ballot box","ballot drop","democracy","elections","polling place","vote","voting booth","voting machine"],tags:{polling_station:"*"},matchScore:0.75,name:"Temporary Polling Place"},"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/cable/underground":{fields:["name","operator","voltage","ref","layer"],geometry:["line"],tags:{power:"cable",location:"underground"},addTags:{power:"cable",location:"underground",layer:"-1"},name:"Underground Power Cable"},"power/generator":{icon:"temaki-power",fields:["operator","generator/source","generator/method","generator/type","generator/output/electricity","ref"],moreFields:["manufacturer"],geometry:["point","vertex","area"],terms:["hydro","solar","turbine","wind"],tags:{power:"generator"},name:"Power Generator"},"power/generator/method/photovoltaic":{icon:"fas-solar-panel",fields:["operator","generator/output/electricity","ref"],moreFields:["manufacturer"],geometry:["point","vertex","area"],terms:["photovoltaic module","PV module","sunlight"],tags:{power:"generator","generator:method":"photovoltaic"},addTags:{power:"generator","generator:source":"solar","generator:method":"photovoltaic","generator:type":"solar_photovoltaic_panel","generator:output:electricity":"yes"},reference:{key:"generator:method",value:"photovoltaic"},name:"Solar Panel"},"power/generator/source/hydro":{icon:"temaki-power",fields:["operator","generator/method","generator/type","generator/output/electricity","ref"],moreFields:["height","manufacturer"],geometry:["point","vertex","area"],terms:["dam","generator","francis turbine","hydroelectricity","kaplan turbine","pelton turbine"],tags:{power:"generator","generator:source":"hydro"},addTags:{power:"generator","generator:source":"hydro","generator:output:electricity":"yes"},reference:{key:"generator:source",value:"hydro"},name:"Water Turbine"},"power/generator/source/nuclear":{icon:"temaki-radiation",fields:["operator","generator/source","generator/method","generator/type","generator/output/electricity","ref"],moreFields:["manufacturer"],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/type","generator/output/electricity","height","ref"],moreFields:["manufacturer"],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","layer"],geometry:["line"],tags:{power:"line"},name:"Power Line"},"power/minor_line":{icon:"iD-power-line",fields:["name","operator","voltage","ref","layer"],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"},terms:["coal","gas","generat*","hydro","nuclear","power","station"],name:"Power Station Grounds"},"power/pole":{fields:["ref","material","operator","manufacturer"],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"],tags:{power:"switch"},name:"Power Switch"},"power/tower":{fields:["design","ref","material","operator","manufacturer"],geometry:["point","vertex"],terms:["power"],tags:{power:"tower"},name:"High-Voltage Tower"},"power/transformer":{icon:"temaki-power",fields:["ref","operator","transformer","location","rating","devices","phases"],moreFields:["frequency","manufacturer","voltage/primary","voltage/secondary","voltage/tertiary","windings","windings/configuration"],geometry:["point","vertex","area"],tags:{power:"transformer"},name:"Transformer"},"public_transport/platform_point":{icon:"maki-rail",fields:["name","network","operator","departures_board","shelter"],moreFields:["bench","bin","lit","wheelchair"],geometry:["point"],tags:{public_transport:"platform"},terms:["platform","public transit","public transportation","transit","transportation"],name:"Transit Stop / Platform",matchScore:0.2},"public_transport/platform":{icon:"temaki-pedestrian",fields:["ref_platform","network","operator","departures_board","surface"],moreFields:["access","covered","indoor","layer","lit","wheelchair"],geometry:["line","area"],tags:{public_transport:"platform"},terms:["platform","public transit","public transportation","transit","transportation"],name:"Transit Platform",matchScore:0.2},"public_transport/platform/aerialway_point":{icon:"maki-aerialway",fields:["{public_transport/platform_point}"],moreFields:["{public_transport/platform_point}"],geometry:["point"],tags:{public_transport:"platform",aerialway:"yes"},reference:{key:"public_transport",value:"platform"},terms:["aerialway","cable car","platform","public transit","public transportation","transit","transportation"],searchable:false,name:"Aerialway Stop / Platform"},"public_transport/platform/ferry_point":{icon:"maki-ferry",fields:["{public_transport/platform_point}"],moreFields:["{public_transport/platform_point}"],geometry:["point"],tags:{public_transport:"platform",ferry:"yes"},reference:{key:"public_transport",value:"platform"},terms:["boat","dock","ferry","pier","platform","public transit","public transportation","transit","transportation"],searchable:false,name:"Ferry Stop / Platform"},"public_transport/platform/light_rail_point":{icon:"temaki-light_rail",fields:["{public_transport/platform_point}"],moreFields:["{public_transport/platform_point}"],geometry:["point"],tags:{public_transport:"platform",light_rail:"yes"},reference:{key:"railway",value:"platform"},terms:["electric","light rail","platform","public transit","public transportation","rail","track","tram","trolley","transit","transportation"],searchable:false,name:"Light Rail Stop / Platform"},"public_transport/platform/monorail_point":{icon:"temaki-monorail",fields:["{public_transport/platform_point}"],moreFields:["{public_transport/platform_point}"],geometry:["point"],tags:{public_transport:"platform",monorail:"yes"},reference:{key:"railway",value:"platform"},terms:["monorail","platform","public transit","public transportation","rail","transit","transportation"],searchable:false,name:"Monorail Stop / Platform"},"public_transport/platform/subway_point":{icon:"temaki-subway",fields:["{public_transport/platform_point}"],moreFields:["{public_transport/platform_point}"],geometry:["point"],tags:{public_transport:"platform",subway:"yes"},reference:{key:"railway",value:"platform"},terms:["metro","platform","public transit","public transportation","rail","subway","track","transit","transportation","underground"],searchable:false,name:"Subway Stop / Platform"},"public_transport/platform/train_point":{icon:"maki-rail",fields:["{public_transport/platform_point}"],moreFields:["{public_transport/platform_point}"],geometry:["point"],tags:{public_transport:"platform",train:"yes"},reference:{key:"railway",value:"platform"},terms:["platform","public transit","public transportation","rail","track","train","transit","transportation"],searchable:false,name:"Train Stop / Platform"},"public_transport/platform/tram_point":{icon:"temaki-tram",fields:["{public_transport/platform_point}"],moreFields:["{public_transport/platform_point}"],geometry:["point"],tags:{public_transport:"platform",tram:"yes"},reference:{key:"public_transport",value:"platform"},terms:["electric","light rail","platform","public transit","public transportation","rail","streetcar","track","tram","trolley","transit","transportation"],searchable:false,name:"Tram Stop / Platform"},"public_transport/platform/aerialway":{icon:"temaki-pedestrian",fields:["{public_transport/platform}"],moreFields:["{public_transport/platform}"],geometry:["line","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 Platform"},"public_transport/platform/bus_point":{icon:"maki-bus",fields:["{public_transport/platform_point}"],moreFields:["{public_transport/platform_point}"],geometry:["point","vertex"],tags:{public_transport:"platform",bus:"yes"},addTags:{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"},"public_transport/platform/bus":{icon:"temaki-pedestrian",fields:["{public_transport/platform}"],moreFields:["{public_transport/platform}"],geometry:["line","area"],tags:{public_transport:"platform",bus:"yes"},reference:{key:"public_transport",value:"platform"},terms:["bus","platform","public transit","public transportation","transit","transportation"],name:"Bus Platform"},"public_transport/platform/ferry":{icon:"temaki-pedestrian",fields:["{public_transport/platform}"],moreFields:["{public_transport/platform}"],geometry:["line","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 Platform"},"public_transport/platform/light_rail":{icon:"temaki-pedestrian",fields:["{public_transport/platform}"],moreFields:["{public_transport/platform}"],geometry:["line","area"],tags:{public_transport:"platform",light_rail:"yes"},addTags:{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 Platform"},"public_transport/platform/monorail":{icon:"temaki-pedestrian",fields:["{public_transport/platform}"],moreFields:["{public_transport/platform}"],geometry:["line","area"],tags:{public_transport:"platform",monorail:"yes"},addTags:{public_transport:"platform",monorail:"yes",railway:"platform"},reference:{key:"railway",value:"platform"},terms:["monorail","platform","public transit","public transportation","rail","transit","transportation"],name:"Monorail Platform"},"public_transport/platform/subway":{icon:"temaki-pedestrian",fields:["{public_transport/platform}"],moreFields:["{public_transport/platform}"],geometry:["line","area"],tags:{public_transport:"platform",subway:"yes"},addTags:{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 Platform"},"public_transport/platform/train":{icon:"temaki-pedestrian",fields:["{public_transport/platform}"],moreFields:["{public_transport/platform}"],geometry:["line","area"],tags:{public_transport:"platform",train:"yes"},addTags:{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 Platform"},"public_transport/platform/tram":{icon:"temaki-pedestrian",fields:["{public_transport/platform}"],moreFields:["{public_transport/platform}"],geometry:["line","area"],tags:{public_transport:"platform",tram:"yes"},addTags:{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 Platform"},"public_transport/platform/trolleybus_point":{icon:"temaki-trolleybus",fields:["{public_transport/platform_point}"],moreFields:["{public_transport/platform_point}"],geometry:["point","vertex"],tags:{public_transport:"platform",trolleybus:"yes"},addTags:{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"},"public_transport/platform/trolleybus":{icon:"temaki-pedestrian",fields:["{public_transport/platform}"],moreFields:["{public_transport/platform}"],geometry:["line","area"],tags:{public_transport:"platform",trolleybus:"yes"},reference:{key:"public_transport",value:"platform"},terms:["bus","electric","platform","public transit","public transportation","streetcar","trackless","tram","trolley","transit","transportation"],name:"Trolleybus Platform"},"public_transport/station_aerialway":{icon:"maki-aerialway",fields:["{public_transport/station}","aerialway/access","aerialway/summer/access"],moreFields:["{public_transport/station}"],geometry:["point","vertex","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:["{public_transport/station}"],moreFields:["{public_transport/station}"],geometry:["point","area"],tags:{public_transport:"station",bus:"yes"},addTags:{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:["{public_transport/station}"],moreFields:["{public_transport/station}"],geometry:["vertex","point","area"],tags:{public_transport:"station",ferry:"yes"},addTags:{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:["{public_transport/station}"],moreFields:["{public_transport/station}"],geometry:["point","area"],tags:{public_transport:"station",light_rail:"yes"},addTags:{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:["{public_transport/station}"],moreFields:["{public_transport/station}"],geometry:["point","area"],tags:{public_transport:"station",monorail:"yes"},addTags:{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:["{public_transport/station}"],moreFields:["{public_transport/station}"],geometry:["point","area"],tags:{public_transport:"station",subway:"yes"},addTags:{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:["{public_transport/station}"],moreFields:["{public_transport/station}"],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:["{public_transport/station}"],moreFields:["{public_transport/station}"],geometry:["vertex","point","area"],tags:{public_transport:"station",train:"yes"},addTags:{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:["{public_transport/station}"],moreFields:["{public_transport/station}"],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:["{public_transport/station}"],moreFields:["{public_transport/station}"],geometry:["point","area"],tags:{public_transport:"station",trolleybus:"yes"},addTags:{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"],moreFields:["air_conditioning","internet_access/fee","internet_access/ssid","website","phone","email","fax","wheelchair"],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:"iD-relation",fields:["name","ref","network","operator"],geometry:["relation"],tags:{type:"public_transport",public_transport:"stop_area"},reference:{key:"public_transport",value:"stop_area"},name:"Transit Stop Area"},"public_transport/stop_position_aerialway":{icon:"maki-aerialway",fields:["{public_transport/stop_position}"],moreFields:["{public_transport/stop_position}"],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:["{public_transport/stop_position}"],moreFields:["{public_transport/stop_position}"],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:["{public_transport/stop_position}"],moreFields:["{public_transport/stop_position}"],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:["{public_transport/stop_position}"],moreFields:["{public_transport/stop_position}"],geometry:["vertex"],tags:{public_transport:"stop_position",light_rail:"yes"},addTags:{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:["{public_transport/stop_position}"],moreFields:["{public_transport/stop_position}"],geometry:["vertex"],tags:{public_transport:"stop_position",monorail:"yes"},addTags:{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:["{public_transport/stop_position}"],moreFields:["{public_transport/stop_position}"],geometry:["vertex"],tags:{public_transport:"stop_position",subway:"yes"},addTags:{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:["{public_transport/stop_position}"],moreFields:["{public_transport/stop_position}"],geometry:["vertex"],tags:{public_transport:"stop_position",train:"yes"},addTags:{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:["{public_transport/stop_position}"],moreFields:["{public_transport/stop_position}"],geometry:["vertex"],tags:{public_transport:"stop_position",tram:"yes"},addTags:{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:["{public_transport/stop_position}"],moreFields:["{public_transport/stop_position}"],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:"temaki-pedestrian",fields:["name","ref_platform","surface","lit","shelter"],geometry:["line","area"],tags:{railway:"platform"},name:"Train Platform",searchable:false,replacement:"public_transport/platform/train"},"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"],matchScore:0.95,name:"Train Station",searchable:false,replacement:"public_transport/station_train"},"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"],moreFields:["covered"],geometry:["line"],tags:{railway:"abandoned"},terms:[],matchScore:0.85,name:"Abandoned Railway"},"railway/buffer_stop":{icon:"temaki-buffer_stop",geometry:["vertex"],tags:{railway:"buffer_stop"},terms:["stop","halt","buffer"],name:"Buffer Stop"},"railway/construction":{icon:"iD-railway-rail",fields:["name","opening_date","check_date","note","structure","gauge","electrified"],moreFields:["covered","frequency_electrified","highspeed","maxspeed","service_rail","usage_rail","voltage_electrified"],geometry:["line"],tags:{railway:"construction"},name:"Railway Under Construction"},"railway/crossing":{icon:"temaki-pedestrian",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:["operator","structure","service_rail","usage_rail"],moreFields:["covered"],geometry:["line"],tags:{railway:"disused"},terms:[],name:"Disused Railway"},"railway/funicular":{icon:"iD-railway-rail",fields:["name","operator","structure","gauge","service_rail"],moreFields:["covered"],geometry:["line"],terms:["venicular","cliff railway","cable car","cable railway","funicular railway"],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:"temaki-light_rail",fields:["{railway/rail}"],moreFields:["covered","frequency_electrified","maxspeed","voltage_electrified"],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","direction_vertex"],tags:{railway:"milestone"},terms:["milestone","marker"],name:"Railway Milestone"},"railway/miniature":{icon:"iD-railway-rail",fields:["name","structure","gauge","electrified","service_rail"],moreFields:["covered","frequency_electrified","maxspeed","voltage_electrified"],geometry:["line"],tags:{railway:"miniature"},terms:["rideable miniature railway","narrow gauge railway","minimum gauge railway"],name:"Miniature Railway"},"railway/monorail":{icon:"temaki-monorail",fields:["name","operator","structure","electrified","service_rail","usage_rail"],moreFields:["covered","frequency_electrified","maxspeed","voltage_electrified"],geometry:["line"],tags:{railway:"monorail"},terms:[],name:"Monorail"},"railway/narrow_gauge":{icon:"iD-railway-rail",fields:["{railway/rail}"],moreFields:["covered","frequency_electrified","maxspeed","voltage_electrified"],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","operator","structure","gauge","electrified","service_rail","usage_rail"],moreFields:["covered","frequency_electrified","highspeed","maxspeed","voltage_electrified"],geometry:["line"],tags:{railway:"rail"},terms:["rail line","railroad track","train track"],name:"Rail"},"railway/rail/highspeed":{icon:"iD-railway-rail",geometry:["line"],tags:{railway:"rail",highspeed:"yes"},reference:{key:"highspeed"},terms:["bullet train","fast rail","high speed rail","highspeed rail","HSR"],name:"High-Speed 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:"temaki-subway",fields:["{railway/rail}"],moreFields:["covered","frequency_electrified","maxspeed","voltage_electrified"],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:"temaki-tram",fields:["{railway/rail}"],moreFields:["covered","frequency_electrified","maxspeed","voltage_electrified"],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:"maki-ferry",geometry:["line"],fields:["name","operator","duration","access","to","from"],moreFields:["maxheight","maxweight","opening_hours","wheelchair"],tags:{route:"ferry"},name:"Ferry Route"},"seamark/beacon_isolated_danger":{fields:["ref","operator","seamark/beacon_isolated_danger/shape","seamark/type"],geometry:["point","vertex"],terms:["beacon isolated danger","isolated danger beacon","iala"],tags:{"seamark:type":"beacon_isolated_danger"},name:"Danger Beacon"},"seamark/beacon_lateral":{fields:["ref","operator","seamark/beacon_lateral/colour","seamark/beacon_lateral/category","seamark/beacon_lateral/shape","seamark/beacon_lateral/system","seamark/type"],geometry:["point","vertex"],terms:["lateral beacon","beacon lateral","cevni","channel marker","iala","lateral mark"],tags:{"seamark:type":"beacon_lateral"},name:"Channel Beacon"},"seamark/buoy_lateral":{fields:["ref","operator","seamark/buoy_lateral/colour","seamark/buoy_lateral/category","seamark/buoy_lateral/shape","seamark/buoy_lateral/system","seamark/type"],geometry:["point","vertex"],terms:["lateral buoy","buoy lateral","cevni","channel marker","iala","lateral mark"],tags:{"seamark:type":"buoy_lateral"},name:"Channel Buoy"},"seamark/buoy_lateral/green":{geometry:["point","vertex"],terms:["lateral buoy","buoy lateral","cevni","channel marker","iala","lateral mark"],tags:{"seamark:type":"buoy_lateral","seamark:buoy_lateral:colour":"green"},name:"Green Buoy"},"seamark/buoy_lateral/red":{geometry:["point","vertex"],terms:["lateral buoy","buoy lateral","cevni","channel marker","iala","lateral mark"],tags:{"seamark:type":"buoy_lateral","seamark:buoy_lateral:colour":"red"},name:"Red Buoy"},"seamark/mooring":{fields:["ref","operator","seamark/mooring/category","seamark/type"],geometry:["point"],terms:["dolphin","pile","bollard","buoy","post"],tags:{"seamark:type":"mooring"},name:"Mooring"},shop:{icon:"maki-shop",fields:["name","shop","operator","address","building_area","opening_hours","payment_multi"],moreFields:["air_conditioning","brand","building/levels_building","height_building","currency_multi","email","fax","internet_access","internet_access/fee","internet_access/ssid","phone","second_hand","website","wheelchair"],geometry:["point","area"],tags:{shop:"*"},terms:[],name:"Shop"},"shop/boutique":{icon:"maki-shop",fields:["name","clothes","{shop}"],geometry:["point","area"],tags:{shop:"boutique"},searchable:false,name:"Boutique"},"shop/fashion":{icon:"maki-shop",fields:["name","clothes","{shop}"],geometry:["point","area"],tags:{shop:"fashion"},searchable:false,name:"Fashion Store"},"shop/fishmonger":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"fishmonger"},reference:{key:"shop",value:"seafood"},name:"Fishmonger",searchable:false},"shop/furnace":{icon:"maki-shop",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:"fas-tractor",fields:["{shop}","agrarian"],geometry:["point","area"],terms:["agricultural inputs","agricultural machines","seeds","pesticides","fertilizer","agricultural tools"],tags:{shop:"agrarian"},name:"Farm Supply Shop"},"shop/alcohol":{icon:"fas-wine-bottle",fields:["{shop}","drive_through"],geometry:["point","area"],terms:["alcohol","beer","booze","wine"],tags:{shop:"alcohol"},name:"Liquor Store"},"shop/anime":{icon:"fas-dragon",geometry:["point","area"],tags:{shop:"anime"},terms:["manga","japan","cosplay","figurine","dakimakura"],name:"Anime Shop"},"shop/antiques":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"antiques"},name:"Antiques Shop"},"shop/appliance":{icon:"maki-shop",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",geometry:["point","area"],terms:["art*","exhibit*","gallery"],tags:{shop:"art"},name:"Art Store"},"shop/baby_goods":{icon:"fas-baby-carriage",geometry:["point","area"],tags:{shop:"baby_goods"},name:"Baby Goods Store"},"shop/bag":{icon:"fas-suitcase-rolling",geometry:["point","area"],terms:["handbag","purse"],tags:{shop:"bag"},name:"Bag/Luggage Store"},"shop/bakery":{icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery"},terms:["bread","cakes","rolls"],name:"Bakery"},"shop/bathroom_furnishing":{icon:"fas-bath",geometry:["point","area"],tags:{shop:"bathroom_furnishing"},name:"Bathroom Furnishing Store"},"shop/beauty":{icon:"maki-shop",fields:["{shop}","beauty"],geometry:["point","area"],terms:["spa","salon","tanning"],tags:{shop:"beauty"},name:"Beauty Shop"},"shop/beauty/nails":{icon:"maki-shop",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",geometry:["point","area"],tags:{shop:"beauty",beauty:"tanning"},reference:{key:"leisure",value:"tanning_salon"},name:"Tanning Salon"},"shop/bed":{icon:"maki-lodging",geometry:["point","area"],tags:{shop:"bed"},name:"Bedding/Mattress Store"},"shop/beverages":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"beverages"},terms:["drinks"],name:"Beverage Store"},"shop/bicycle":{icon:"maki-bicycle",fields:["{shop}","service/bicycle"],geometry:["point","area"],terms:["bike","repair","tricycle","unicycle"],tags:{shop:"bicycle"},name:"Bicycle Shop"},"shop/boat":{icon:"temaki-boating",geometry:["point","area"],terms:["fishing boat","jetski","motorboat","rowboat","sailboat","vessel","watercraft"],tags:{shop:"boat"},name:"Boat Store"},"shop/bookmaker":{icon:"maki-shop",geometry:["point","area"],terms:["betting","bookie"],tags:{shop:"bookmaker"},name:"Bookmaker"},"shop/books":{icon:"fas-book",fields:["{shop}","internet_access"],moreFields:["{shop}","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{shop:"books"},name:"Book Store"},"shop/butcher":{icon:"fas-bacon",geometry:["point","area"],terms:["chicken","beef","lamb","meat","pork"],tags:{shop:"butcher"},name:"Butcher"},"shop/candles":{icon:"fas-burn",geometry:["point","area"],tags:{shop:"candles"},terms:["wax"],name:"Candle Shop"},"shop/cannabis":{icon:"fas-cannabis",geometry:["point","area"],terms:["420","marijuana","pot","reefer","weed"],tags:{shop:"cannabis"},name:"Cannabis Shop"},"shop/car_parts":{icon:"fas-car-battery",geometry:["point","area"],terms:["automobile","automotive"],tags:{shop:"car_parts"},name:"Car Parts Store"},"shop/car_repair":{icon:"maki-car-repair",fields:["{shop}","service/vehicle"],geometry:["point","area"],terms:["automobile","automotive","garage","service"],tags:{shop:"car_repair"},name:"Car Repair Shop"},"shop/car":{icon:"maki-car",fields:["name","brand","{shop}","second_hand","service/vehicle"],geometry:["point","area"],terms:["automobile","automotive"],tags:{shop:"car"},name:"Car Dealership"},"shop/caravan":{icon:"temaki-rv_park",fields:["name","brand","{shop}","second_hand","service/vehicle"],geometry:["point","area"],tags:{shop:"caravan"},terms:["auto","camper","recreational vehicle"],name:"RV Dealership"},"shop/carpet":{icon:"maki-shop",geometry:["point","area"],terms:["rug"],tags:{shop:"carpet"},name:"Carpet Store"},"shop/catalogue":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"catalogue"},name:"Catalog Shop"},"shop/charity":{icon:"maki-shop",fields:["{shop}","second_hand"],geometry:["point","area"],terms:["thrift","op shop","nonprofit"],tags:{shop:"charity"},name:"Charity Store"},"shop/cheese":{icon:"fas-cheese",geometry:["point","area"],tags:{shop:"cheese"},name:"Cheese Store"},"shop/chemist":{icon:"fas-shopping-basket",geometry:["point","area"],tags:{shop:"chemist"},terms:["apothecary","beauty","drug store","drugstore","gift","hair","med*","pharmacy","prescription","tooth"],name:"Drugstore"},"shop/chocolate":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"chocolate"},terms:["cocoa"],name:"Chocolate Store"},"shop/clothes":{icon:"maki-clothing-store",fields:["name","clothes","{shop}"],geometry:["point","area"],tags:{shop:"clothes"},terms:["blouses","boutique","bras","clothes","dresses","fashion","pants","shirts","shorts","skirts","slacks","socks","suits","underwear"],name:"Clothing Store"},"shop/clothes/underwear":{icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes",clothes:"underwear"},reference:{key:"clothes",value:"underwear"},terms:["boutique","bras","brassieres","briefs","boxers","fashion","lingerie","panties","slips","socks","stockings","underclothes","undergarments","underpants","undies"],name:"Underwear Store"},"shop/coffee":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"coffee"},name:"Coffee Store"},"shop/computer":{icon:"fas-laptop",geometry:["point","area"],tags:{shop:"computer"},terms:["desktop","laptop","hardware","operating system","software"],name:"Computer Store"},"shop/confectionery":{icon:"maki-confectionery",geometry:["point","area"],terms:["sweet"],tags:{shop:"confectionery"},name:"Candy Store"},"shop/convenience":{icon:"fas-shopping-basket",geometry:["point","area"],tags:{shop:"convenience"},name:"Convenience Store"},"shop/copyshop":{icon:"fas-print",geometry:["point","area"],tags:{shop:"copyshop"},terms:["print","scan"],name:"Copy Store"},"shop/cosmetics":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"cosmetics"},terms:["make-up","makeup"],name:"Cosmetics Store"},"shop/country_store":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"country_store"},name:"Country Store"},"shop/craft":{icon:"fas-palette",geometry:["point","area"],tags:{shop:"craft"},terms:["art*","paint*","frame"],name:"Arts and Crafts Store"},"shop/curtain":{icon:"maki-shop",geometry:["point","area"],terms:["drape*","window"],tags:{shop:"curtain"},name:"Curtain Store"},"shop/dairy":{icon:"fas-cheese",geometry:["point","area"],terms:["milk","egg","cheese"],tags:{shop:"dairy"},name:"Dairy Store"},"shop/deli":{icon:"maki-restaurant",geometry:["point","area"],terms:["lunch","meat","sandwich"],tags:{shop:"deli"},name:"Deli"},"shop/department_store":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store"},name:"Department Store"},"shop/doityourself":{icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself"},name:"DIY Store"},"shop/dry_cleaning":{icon:"temaki-clothes_hanger",geometry:["point","area"],tags:{shop:"dry_cleaning"},name:"Dry Cleaner"},"shop/e-cigarette":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"e-cigarette"},terms:["electronic","vape","vaping","vapor"],name:"E-Cigarette Shop"},"shop/electronics":{icon:"fas-plug",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",geometry:["point","area"],terms:["sex","porn"],tags:{shop:"erotic"},name:"Erotic Store"},"shop/erotic/lgbtq":{icon:"maki-shop",geometry:["point","area"],terms:["sex","porn"],tags:{shop:"erotic",lgbtq:"primary"},name:"LGBTQ+ Erotic Store"},"shop/fabric":{icon:"fas-tape",geometry:["point","area"],terms:["sew"],tags:{shop:"fabric"},name:"Fabric Store"},"shop/farm":{icon:"maki-shop",geometry:["point","area"],terms:["farm shop","farm stand"],tags:{shop:"farm"},name:"Produce Stand"},"shop/fashion_accessories":{icon:"maki-shop",fields:["name","clothes","{shop}"],geometry:["point","area"],tags:{shop:"fashion_accessories"},terms:["bag","cologne","fragrance","hat","jewellery","purfume","purse","scarf","sunglasses","umbrella","wallet","watch"],name:"Fashion Accessories Store"},"shop/fireplace":{icon:"maki-shop",geometry:["point","area"],terms:["fireplace","stove","masonry heater"],tags:{shop:"fireplace"},name:"Fireplace Store"},"shop/fishing":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"fishing"},terms:["bait","fishing line","flies","fly","lure","reel","rod","tackle"],name:"Fishing Shop"},"shop/florist":{icon:"maki-florist",geometry:["point","area"],terms:["flower"],tags:{shop:"florist"},name:"Florist"},"shop/frame":{icon:"fas-vector-square",geometry:["point","area"],tags:{shop:"frame"},terms:["art*","paint*","photo*","frame"],name:"Framing Shop"},"shop/frozen_food":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"frozen_food"},name:"Frozen Food"},"shop/fuel":{icon:"maki-shop",fields:["{shop}","fuel_multi"],geometry:["point","area"],tags:{shop:"fuel"},name:"Fuel Shop",matchScore:0.5},"shop/funeral_directors":{icon:"maki-cemetery",fields:["{shop}","religion","denomination"],geometry:["point","area"],terms:["undertaker","memorial home"],tags:{shop:"funeral_directors"},name:"Funeral Home"},"shop/furniture":{icon:"fas-couch",geometry:["point","area"],terms:["chair","sofa","table"],tags:{shop:"furniture"},name:"Furniture Store"},"shop/games":{icon:"fas-dice",geometry:["point","area"],tags:{shop:"games"},terms:["board game","card game","dice game","game shop","live action role-playing game","miniatures wargame","strategy game"],name:"Tabletop Game Store"},"shop/garden_centre":{icon:"maki-garden-centre",geometry:["point","area"],terms:["landscape","mulch","shrub","tree"],tags:{shop:"garden_centre"},name:"Garden Center"},"shop/gas":{icon:"maki-shop",geometry:["point","area"],terms:["cng","lpg","natural gas","propane","refill","tank"],tags:{shop:"gas"},name:"Bottled Gas Shop"},"shop/general":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"general"},terms:["Village Shop"],name:"General Store"},"shop/gift":{icon:"maki-gift",geometry:["point","area"],terms:["souvenir"],tags:{shop:"gift"},name:"Gift Shop"},"shop/greengrocer":{icon:"fas-carrot",geometry:["point","area"],terms:["fruit","produce","vegetable"],tags:{shop:"greengrocer"},name:"Greengrocer"},"shop/hairdresser_supply":{icon:"maki-shop",geometry:["point","area"],terms:["barber","shampoo","conditioner"],tags:{shop:"hairdresser_supply"},name:"Hairdresser Supply Store"},"shop/hairdresser":{icon:"temaki-beauty_salon",geometry:["point","area"],terms:["barber"],tags:{shop:"hairdresser"},name:"Hairdresser"},"shop/hardware":{icon:"temaki-tools",geometry:["point","area"],tags:{shop:"hardware"},name:"Hardware Store"},"shop/health_food":{icon:"maki-shop",geometry:["point","area"],terms:["wholefood","vitamins","vegetarian","vegan"],tags:{shop:"health_food"},name:"Health Food Shop"},"shop/hearing_aids":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"hearing_aids"},name:"Hearing Aids Store"},"shop/herbalist":{icon:"fas-leaf",geometry:["point","area"],tags:{shop:"herbalist"},name:"Herbalist"},"shop/hifi":{icon:"maki-shop",geometry:["point","area"],terms:["audio","hi-fi","high fidelity","stereo","video"],tags:{shop:"hifi"},name:"Hifi Store"},"shop/hobby":{icon:"fas-dragon",geometry:["point","area"],tags:{shop:"hobby"},terms:["manga","figurine","model"],name:"Hobby Shop"},"shop/houseware":{icon:"fas-blender",geometry:["point","area"],terms:["home","household","kitchenware"],tags:{shop:"houseware"},name:"Houseware Store"},"shop/hunting":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"hunting"},terms:["arrows","bows","bullets","crossbows","rifles","traps"],name:"Hunting Shop"},"shop/interior_decoration":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"interior_decoration"},name:"Interior Decoration Store"},"shop/jewelry":{icon:"maki-jewelry-store",geometry:["point","area"],terms:["bracelet","diamond","earrings","gem","gold","jeweler","jewellery","jeweller","necklace","pins","ring","silver"],tags:{shop:"jewelry"},name:"Jewelry Store"},"shop/kiosk":{icon:"maki-shop",fields:["{shop}","levels"],geometry:["point","area"],tags:{shop:"kiosk"},name:"Kiosk"},"shop/kitchen":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"kitchen"},terms:["cabinets","countertops","sinks"],name:"Kitchen Design Store"},"shop/laundry":{icon:"maki-laundry",fields:["{shop}","self_service"],geometry:["point","area"],tags:{shop:"laundry"},name:"Laundry"},"shop/laundry/self_service":{icon:"maki-laundry",geometry:["point","area"],tags:{shop:"laundry",self_service:"yes"},terms:["Coin Laundry","Laundromat","Coin Wash","Launderette","Washateria"],name:"Self-Service Laundry"},"shop/leather":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"leather"},name:"Leather Store"},"shop/lighting":{icon:"far-lightbulb",geometry:["point","area"],terms:["fluorescent lighting","lamps","LEDs","light fixtures","lightbulbs"],tags:{shop:"lighting"},name:"Lighting Store"},"shop/locksmith":{icon:"fas-key",geometry:["point","area"],terms:["key","lockpick"],tags:{shop:"locksmith"},name:"Locksmith"},"shop/lottery":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"lottery"},name:"Lottery Shop"},"shop/mall":{icon:"maki-shop",geometry:["point","area"],terms:["shopping"],tags:{shop:"mall"},name:"Mall"},"shop/massage":{icon:"temaki-spa",geometry:["point","area"],tags:{shop:"massage"},name:"Massage Shop"},"shop/medical_supply":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"medical_supply"},name:"Medical Supply Store"},"shop/military_surplus":{icon:"temaki-military",geometry:["point","area"],terms:["armor","army-navy store","army surplus","navy surplus","tactical gear","war surplus shop","weapons"],tags:{shop:"military_surplus"},name:"Military Surplus Store"},"shop/mobile_phone":{icon:"fas-mobile-alt",geometry:["point","area"],tags:{shop:"mobile_phone"},name:"Mobile Phone Store"},"shop/money_lender":{icon:"maki-bank",fields:["{shop}","currency_multi"],geometry:["point","area"],tags:{shop:"money_lender"},name:"Money Lender"},"shop/motorcycle_repair":{icon:"fas-motorcycle",fields:["{shop}","service/vehicle"],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","brand","{shop}"],geometry:["point","area"],terms:["bike"],tags:{shop:"motorcycle"},name:"Motorcycle Dealership"},"shop/music":{icon:"fas-compact-disc",geometry:["point","area"],terms:["tape casettes","CDs","compact discs","vinyl records"],tags:{shop:"music"},name:"Music Store"},"shop/musical_instrument":{icon:"fas-guitar",geometry:["point","area"],terms:["guitar"],tags:{shop:"musical_instrument"},name:"Musical Instrument Store"},"shop/newsagent":{icon:"fas-newspaper",geometry:["point","area"],tags:{shop:"newsagent"},name:"Newspaper/Magazine Shop"},"shop/nutrition_supplements":{icon:"maki-shop",geometry:["point","area"],terms:["health","supplement","vitamin"],tags:{shop:"nutrition_supplements"},name:"Nutrition Supplements Store"},"shop/optician":{icon:"maki-optician",geometry:["point","area"],terms:["eye","glasses"],tags:{shop:"optician"},name:"Optician"},"shop/organic":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"supermarket",organic:"only"},name:"Organic Goods Store"},"shop/outdoor":{icon:"temaki-compass",fields:["{shop}","clothes"],geometry:["point","area"],terms:["camping","climbing","hiking","outfitter","outdoor equipment","outdoor supplies"],tags:{shop:"outdoor"},name:"Outdoors Store"},"shop/outpost":{icon:"maki-shop",geometry:["point","area"],terms:["online","pick up","pickup"],tags:{shop:"outpost"},name:"Online Retailer Outpost"},"shop/paint":{icon:"fas-paint-roller",geometry:["point","area"],tags:{shop:"paint"},name:"Paint Store"},"shop/party":{icon:"fas-mask",geometry:["point","area"],terms:["balloons","costumes","decorations","invitations"],tags:{shop:"party"},name:"Party Supply Store"},"shop/pastry":{icon:"maki-bakery",geometry:["point","area"],tags:{shop:"pastry"},terms:["patisserie","cake shop","cakery"],name:"Pastry Shop"},"shop/pawnbroker":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"pawnbroker"},name:"Pawn Shop"},"shop/perfumery":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"perfumery"},terms:["cologne","fragrance","purfume"],name:"Perfume Store"},"shop/pet_grooming":{icon:"maki-dog-park",geometry:["point","area"],terms:["cat","dog"],tags:{shop:"pet_grooming"},name:"Pet Grooming Store"},"shop/pet":{icon:"maki-dog-park",geometry:["point","area"],terms:["animal","cat","dog","fish","kitten","puppy","reptile"],tags:{shop:"pet"},name:"Pet Store"},"shop/photo":{icon:"fas-camera-retro",geometry:["point","area"],terms:["camera","film"],tags:{shop:"photo"},name:"Photography Store"},"shop/pyrotechnics":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"pyrotechnics"},terms:["fireworks"],name:"Fireworks Store"},"shop/radiotechnics":{icon:"fas-microchip",geometry:["point","area"],tags:{shop:"radiotechnics"},terms:["antenna","transistor"],name:"Radio/Electronic Component Store"},"shop/religion":{icon:"maki-shop",fields:["{shop}","religion","denomination"],geometry:["point","area"],tags:{shop:"religion"},name:"Religious Store"},"shop/scuba_diving":{icon:"temaki-scuba_diving",fields:["{shop}","scuba_diving"],geometry:["point","area"],terms:["diving","scuba"],tags:{shop:"scuba_diving"},name:"Scuba Diving Shop"},"shop/seafood":{icon:"maki-shop",geometry:["point","area"],terms:["fishmonger"],tags:{shop:"seafood"},name:"Seafood Shop"},"shop/second_hand":{icon:"maki-shop",fields:["{shop}","second_hand"],geometry:["point","area"],terms:["secondhand","second hand","resale","thrift","used"],tags:{shop:"second_hand"},name:"Consignment/Thrift Store"},"shop/sewing":{icon:"maki-shop",geometry:["point","area"],terms:["haberdashery"],tags:{shop:"sewing"},name:"Sewing Supply Shop"},"shop/shoes":{icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes"},terms:["boots","cleats","clogs","heels","loafers","oxfords","sneakers"],name:"Shoe Store"},"shop/sports":{icon:"fas-futbol",fields:["name","operator","sport","{shop}"],geometry:["point","area"],tags:{shop:"sports"},terms:["athletics"],name:"Sporting Goods Store"},"shop/stationery":{icon:"fas-paperclip",geometry:["point","area"],terms:["card","paper"],tags:{shop:"stationery"},name:"Stationery Store"},"shop/storage_rental":{icon:"fas-warehouse",geometry:["point","area"],tags:{shop:"storage_rental"},terms:["garages"],name:"Storage Rental"},"shop/supermarket":{icon:"maki-grocery",moreFields:["diet_multi","{shop}"],geometry:["point","area"],terms:["grocery","store","shop"],tags:{shop:"supermarket"},name:"Supermarket"},"shop/tailor":{icon:"maki-clothing-store",geometry:["point","area"],terms:["clothes","suit"],tags:{shop:"tailor"},name:"Tailor"},"shop/tattoo":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"tattoo"},terms:["ink"],name:"Tattoo Parlor"},"shop/tea":{icon:"maki-teahouse",geometry:["point","area"],tags:{shop:"tea"},name:"Tea Store"},"shop/ticket":{icon:"fas-ticket-alt",geometry:["point","area"],tags:{shop:"ticket"},terms:["box office"],name:"Ticket Seller"},"shop/tiles":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"tiles"},name:"Tile Shop"},"shop/tobacco":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"tobacco"},terms:["cigarettes","cigars"],name:"Tobacco Shop"},"shop/toys":{icon:"fas-space-shuttle",geometry:["point","area"],tags:{shop:"toys"},terms:["games"],name:"Toy Store"},"shop/trade":{icon:"maki-shop",fields:["name","trade","{shop}"],geometry:["point","area"],tags:{shop:"trade"},name:"Trade Shop"},"shop/travel_agency":{icon:"fas-suitcase",geometry:["point","area"],tags:{shop:"travel_agency"},name:"Travel Agency"},"shop/tyres":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"tyres"},name:"Tire Store"},"shop/vacuum_cleaner":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"vacuum_cleaner"},name:"Vacuum Cleaner Store"},"shop/variety_store":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"variety_store"},name:"Variety Store"},"shop/video_games":{icon:"maki-gaming",geometry:["point","area"],tags:{shop:"video_games"},name:"Video Game Store"},"shop/video":{icon:"temaki-movie_rental",geometry:["point","area"],terms:["DVD","VHS","video casette"],tags:{shop:"video"},name:"Video Store"},"shop/watches":{icon:"maki-watch",geometry:["point","area"],tags:{shop:"watches"},name:"Watches Shop"},"shop/water_sports":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"water_sports"},name:"Watersport/Swim Shop"},"shop/water":{icon:"tnp-2009234",geometry:["point","area"],tags:{shop:"water"},name:"Drinking Water Shop"},"shop/weapons":{icon:"maki-shop",geometry:["point","area"],terms:["ammo","gun","knife","knives"],tags:{shop:"weapons"},name:"Weapon Shop"},"shop/wholesale":{icon:"maki-warehouse",fields:["{shop}","wholesale"],geometry:["point","area"],terms:["warehouse club","cash and carry"],tags:{shop:"wholesale"},name:"Wholesale Store"},"shop/window_blind":{icon:"temaki-window",geometry:["point","area"],tags:{shop:"window_blind"},name:"Window Blind Store"},"shop/wine":{icon:"maki-alcohol-shop",geometry:["point","area"],tags:{shop:"wine"},name:"Wine Shop"},tactile_paving:{icon:"temaki-blind",fields:["colour","description"],geometry:["vertex","point","line","area"],tags:{tactile_paving:"*"},matchScore:0.25,terms:["blind path","detectable warning surfaces","tactile ground surface indicators","tactile walking surface indicators","truncated domes","visually impaired path"],name:"Tactile Paving"},"telecom/data_center":{icon:"fas-server",fields:["name","ref","operator","building_area"],moreFields:["address","phone","website"],geometry:["point","area"],tags:{telecom:"data_center"},terms:["computer systems storage","information technology","server farm","the cloud","telecommunications"],name:"Data Center"},"tourism/alpine_hut":{icon:"maki-lodging",fields:["name","operator","address","building_area","internet_access","internet_access/fee","fee","payment_multi_fee"],moreFields:["email","fax","internet_access/ssid","phone","reservation","website","wheelchair"],geometry:["point","area"],terms:["climbing hut"],tags:{tourism:"alpine_hut"},name:"Alpine Hut"},"tourism/apartment":{icon:"maki-lodging",fields:["name","operator","address","building_area","rooms","internet_access","internet_access/fee"],moreFields:["building/levels_building","height_building","email","fax","internet_access/ssid","payment_multi","phone","reservation","smoking","website","wheelchair"],geometry:["point","area"],tags:{tourism:"apartment"},name:"Guest Apartment / Condo"},"tourism/aquarium":{icon:"maki-aquarium",fields:["name","operator","address","building_area","opening_hours"],moreFields:["fee","internet_access","internet_access/fee","internet_access/ssid","payment_multi_fee","smoking","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["fish","sea","water"],tags:{tourism:"aquarium"},name:"Aquarium"},"tourism/artwork":{icon:"maki-art-gallery",fields:["name","artwork_type","artist"],moreFields:["material","website"],geometry:["point","vertex","line","area"],tags:{tourism:"artwork"},terms:["mural","sculpture","statue"],name:"Artwork"},"tourism/artwork/bust":{icon:"fas-user-alt",fields:["name","artist","material"],geometry:["point","vertex"],tags:{tourism:"artwork",artwork_type:"bust"},reference:{key:"artwork_type"},terms:["figure"],name:"Bust"},"tourism/artwork/graffiti":{icon:"maki-art-gallery",fields:["name","artist"],geometry:["point","vertex","line","area"],tags:{tourism:"artwork",artwork_type:"graffiti"},reference:{key:"artwork_type"},terms:["Street Artwork","Guerilla Artwork","Graffiti Artwork"],name:"Graffiti"},"tourism/artwork/installation":{icon:"maki-art-gallery",fields:["name","artist"],geometry:["point","vertex","line","area"],tags:{tourism:"artwork",artwork_type:"installation"},reference:{key:"artwork_type"},terms:["interactive art","intervention art","modern art"],name:"Art Installation"},"tourism/artwork/mural":{icon:"maki-art-gallery",fields:["name","artist"],geometry:["point","vertex","line","area"],tags:{tourism:"artwork",artwork_type:"mural"},reference:{key:"artwork_type",value:"mural"},terms:["fresco","wall painting"],name:"Mural"},"tourism/artwork/sculpture":{icon:"maki-art-gallery",fields:["name","artist","material"],geometry:["point","vertex","line","area"],tags:{tourism:"artwork",artwork_type:"sculpture"},reference:{key:"artwork_type",value:"sculpture"},terms:["statue","figure","carving"],name:"Sculpture"},"tourism/artwork/statue":{icon:"fas-female",fields:["name","artist","material"],geometry:["point","vertex","line","area"],tags:{tourism:"artwork",artwork_type:"statue"},reference:{key:"artwork_type",value:"statue"},terms:["sculpture","figure","carving"],name:"Statue"},"tourism/attraction":{icon:"maki-star",fields:["name","operator","address"],geometry:["point","vertex","line","area"],tags:{tourism:"attraction"},matchScore:0.75,name:"Tourist Attraction"},"tourism/camp_pitch":{icon:"maki-campsite",fields:["name","ref"],geometry:["point","area"],terms:["tent","rv"],tags:{torism:"camp_pitch"},name:"Camp Pitch"},"tourism/camp_site":{icon:"maki-campsite",fields:["name","operator","address","access_simple","capacity","fee","payment_multi_fee","internet_access","internet_access/fee"],moreFields:["email","fax","internet_access/ssid","phone","power_supply","reservation","sanitary_dump_station","website","wheelchair"],geometry:["point","vertex","area"],terms:["tent","rv"],tags:{tourism:"camp_site"},name:"Campground"},"tourism/caravan_site":{icon:"temaki-rv_park",fields:["name","address","capacity","sanitary_dump_station","power_supply","internet_access","internet_access/fee"],moreFields:["operator","fee","payment_multi_fee","internet_access/ssid","smoking","website","phone","email","fax","wheelchair","reservation"],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","internet_access","internet_access/fee"],moreFields:["air_conditioning","building/levels_building","height_building","smoking","payment_multi","internet_access/ssid","website","phone","email","fax","wheelchair","reservation"],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"],moreFields:["internet_access","internet_access/fee","internet_access/ssid","payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["art*","exhibit*","paint*","photo*","sculpt*"],tags:{tourism:"gallery"},name:"Art Gallery"},"tourism/guest_house":{icon:"maki-lodging",fields:["name","operator","guest_house","address","building_area","rooms","internet_access","internet_access/fee"],moreFields:["air_conditioning","building/levels_building","height_building","smoking","payment_multi","internet_access/ssid","website","phone","email","fax","wheelchair","reservation"],geometry:["point","area"],tags:{tourism:"guest_house"},terms:["B&B","Bed and Breakfast"],name:"Guest House"},"tourism/hostel":{icon:"maki-lodging",fields:["{tourism/guest_house}"],moreFields:["{tourism/guest_house}"],geometry:["point","area"],tags:{tourism:"hostel"},name:"Hostel"},"tourism/hotel":{icon:"fas-concierge-bell",fields:["{tourism/motel}"],moreFields:["{tourism/motel}","stars","bar"],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:"fas-map-signs",fields:["name","elevation","operator","ref"],moreFields:["material"],geometry:["point","vertex"],terms:["signpost"],tags:{tourism:"information",information:"guidepost"},reference:{key:"information",value:"guidepost"},name:"Guidepost"},"tourism/information/map":{icon:"fas-map",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","internet_access","internet_access/fee"],moreFields:["building/levels_building","height_building","email","fax","internet_access/ssid","phone","website","wheelchair"],geometry:["point","vertex","area"],tags:{tourism:"information",information:"office"},reference:{key:"information",value:"office"},name:"Tourist Information Office"},"tourism/information/route_marker":{icon:"maki-information",fields:["ref","operator","colour","material","elevation"],geometry:["point","vertex"],terms:["cairn","painted blaze","route flag","route marker","stone pile","trail blaze","trail post","way marker"],tags:{tourism:"information",information:"route_marker"},reference:{key:"information",value:"route_marker"},name:"Trail Marker"},"tourism/information/terminal":{icon:"maki-information",fields:["operator"],geometry:["point","vertex"],tags:{tourism:"information",information:"terminal"},reference:{key:"information",value:"terminal"},name:"Information Terminal"},"tourism/motel":{icon:"maki-lodging",fields:["name","brand","address","building_area","rooms","internet_access","internet_access/fee"],moreFields:["air_conditioning","building/levels_building","height_building","email","fax","internet_access/ssid","operator","payment_multi","phone","reservation","smoking","website","wheelchair"],geometry:["point","area"],tags:{tourism:"motel"},name:"Motel"},"tourism/museum":{icon:"temaki-museum",fields:["name","operator","operator/type","address","building_area","opening_hours"],moreFields:["air_conditioning","building/levels_building","height_building","fee","internet_access","internet_access/fee","internet_access/ssid","payment_multi","website","phone","email","fax","wheelchair"],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","access_simple","capacity"],moreFields:["internet_access","internet_access/fee","internet_access/ssid","smoking","fee","payment_multi_fee","phone","reservation","website","wheelchair"],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"],moreFields:["internet_access","internet_access/fee","internet_access/ssid","payment_multi","website","phone","email","fax","wheelchair"],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"],moreFields:["internet_access","internet_access/fee","internet_access/ssid","address","opening_hours","website","phone","email","fax"],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","fee","payment_multi_fee","fireplace"],moreFields:["internet_access","internet_access/fee","internet_access/ssid","reservation","wheelchair"],geometry:["point","area"],terms:["wilderness hut","backcountry hut","bothy"],tags:{tourism:"wilderness_hut"},name:"Wilderness Hut"},"tourism/zoo":{icon:"temaki-zoo",fields:["name","operator","address","opening_hours","fee"],moreFields:["internet_access","internet_access/fee","internet_access/ssid","payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["animal"],tags:{tourism:"zoo"},name:"Zoo"},"tourism/zoo/petting":{icon:"fas-horse",geometry:["point","area"],tags:{tourism:"zoo",zoo:"petting_zoo"},reference:{key:"zoo",value:"petting_zoo"},terms:["Children's Zoo","Children's Farm","Petting Farm","farm animals"],name:"Petting Zoo"},"tourism/zoo/safari":{icon:"temaki-zoo",geometry:["point","area"],tags:{tourism:"zoo",zoo:"safari_park"},reference:{key:"zoo",value:"safari_park"},terms:["Drive-Through Zoo","Drive-In Zoo"],name:"Safari Park"},"tourism/zoo/wildlife":{icon:"fas-frog",geometry:["point","area"],tags:{tourism:"zoo",zoo:"wildlife_park"},reference:{key:"zoo",value:"wildlife_park"},terms:["indigenous animals"],name:"Wildlife Park"},traffic_calming:{icon:"temaki-diamond",fields:["traffic_calming","surface","direction_vertex"],geometry:["vertex","line","area"],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:["surface","direction_vertex"],geometry:["vertex","line","area"],terms:["driveway link","speed","slow"],tags:{traffic_calming:"chicane"},name:"Traffic Chicane"},"traffic_calming/choker":{icon:"temaki-diamond",fields:["surface","direction_vertex"],geometry:["vertex","line","area"],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",fields:["surface"],geometry:["vertex","line","area"],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","direction_vertex"],geometry:["vertex"],tags:{traffic_calming:"table"},terms:["flat top","hump","speed","slow"],name:"Speed Table"},traffic_sign_vertex:{icon:"maki-square-stroked",fields:["traffic_sign","traffic_sign/direction"],geometry:["vertex"],tags:{traffic_sign:"*"},terms:["road","highway"],name:"Traffic Sign"},traffic_sign:{icon:"fas-directions",fields:["traffic_sign","direction"],geometry:["point"],tags:{traffic_sign:"*"},terms:["road","highway"],name:"Traffic Sign"},"traffic_sign/city_limit_vertex":{icon:"maki-square-stroked",fields:["traffic_sign","traffic_sign/direction","name"],geometry:["vertex"],tags:{traffic_sign:"city_limit"},terms:["town","village","hamlet","boundary","edge","border","road","highway"],name:"City Limit Sign"},"traffic_sign/city_limit":{icon:"maki-square-stroked",fields:["traffic_sign","direction","name"],geometry:["point"],tags:{traffic_sign:"city_limit"},terms:["town","village","hamlet","boundary","edge","border","road","highway"],name:"City Limit Sign"},"traffic_sign/maxspeed_vertex":{icon:"maki-square-stroked",fields:["traffic_sign","traffic_sign/direction","maxspeed"],geometry:["vertex"],tags:{traffic_sign:"maxspeed"},terms:["max speed","maximum speed","road","highway"],name:"Speed Limit Sign"},"traffic_sign/maxspeed":{icon:"maki-square-stroked",fields:["traffic_sign","direction","maxspeed"],geometry:["point"],tags:{traffic_sign:"maxspeed"},terms:["max speed","maximum speed","road","highway"],name:"Speed Limit Sign"},"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/enforcement":{icon:"iD-relation",fields:["name","enforcement"],geometry:["relation"],tags:{type:"enforcement"},name:"Enforcement"},"type/public_transport/stop_area_group":{icon:"iD-relation",fields:["name","ref","network","operator"],geometry:["relation"],tags:{type:"public_transport",public_transport:"stop_area_group"},reference:{key:"public_transport",value:"stop_area_group"},name:"Transit Stop Area Group"},"type/restriction":{icon:"iD-restriction",fields:["restriction","except"],geometry:["relation"],tags:{type:"restriction"},name:"Restriction"},"type/restriction/no_left_turn":{icon:"iD-restriction-no-left-turn",geometry:["relation"],tags:{type:"restriction",restriction:"no_left_turn"},name:"No Left Turn"},"type/restriction/no_right_turn":{icon:"iD-restriction-no-right-turn",geometry:["relation"],tags:{type:"restriction",restriction:"no_right_turn"},name:"No Right Turn"},"type/restriction/no_straight_on":{icon:"iD-restriction-no-straight-on",geometry:["relation"],tags:{type:"restriction",restriction:"no_straight_on"},name:"No Straight On"},"type/restriction/no_u_turn":{icon:"iD-restriction-no-u-turn",geometry:["relation"],tags:{type:"restriction",restriction:"no_u_turn"},name:"No U-turn"},"type/restriction/only_left_turn":{icon:"iD-restriction-only-left-turn",geometry:["relation"],tags:{type:"restriction",restriction:"only_left_turn"},name:"Only Left Turn"},"type/restriction/only_right_turn":{icon:"iD-restriction-only-right-turn",geometry:["relation"],tags:{type:"restriction",restriction:"only_right_turn"},name:"Only Right Turn"},"type/restriction/only_straight_on":{icon:"iD-restriction-only-straight-on",geometry:["relation"],tags:{type:"restriction",restriction:"only_straight_on"},name:"Only Straight On"},"type/restriction/only_u_turn":{icon:"iD-restriction-only-u-turn",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"],moreFields:["colour","interval","opening_hours","wheelchair"],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:"maki-bicycle",fields:["name","ref_route","network_bicycle","cycle_network","to","from"],geometry:["relation"],tags:{type:"route",route:"bicycle"},name:"Cycle Route"},"type/route/bus":{icon:"maki-bus",fields:["{type/route/train}"],moreFields:["{type/route/train}"],geometry:["relation"],tags:{type:"route",route:"bus"},name:"Bus Route"},"type/route/detour":{icon:"iD-route-detour",fields:["name","ref_route","to","from"],geometry:["relation"],tags:{type:"route",route:"detour"},name:"Detour Route"},"type/route/ferry":{icon:"maki-ferry",fields:["name","ref_route","operator","network","to","from"],moreFields:["interval","maxheight","maxweight","opening_hours","duration","wheelchair"],geometry:["relation"],tags:{type:"route",route:"ferry"},name:"Ferry Route"},"type/route/foot":{icon:"temaki-pedestrian",fields:["name","ref_route","operator","network_foot","to","from"],geometry:["relation"],tags:{type:"route",route:"foot"},name:"Foot Route"},"type/route/hiking":{icon:"fas-hiking",fields:["name","ref_route","operator","network_foot","description","distance","to","from"],geometry:["relation"],tags:{type:"route",route:"hiking"},name:"Hiking Route"},"type/route/horse":{icon:"maki-horse-riding",fields:["name","ref_route","operator","network_horse","description","distance","to","from"],geometry:["relation"],tags:{type:"route",route:"horse"},name:"Riding Route"},"type/route/light_rail":{icon:"temaki-light_rail",fields:["{type/route/train}"],moreFields:["{type/route/train}"],geometry:["relation"],tags:{type:"route",route:"light_rail"},name:"Light Rail Route"},"type/route/monorail":{icon:"temaki-monorail",fields:["{type/route/train}"],moreFields:["{type/route/train}"],geometry:["relation"],tags:{type:"route",route:"monorail"},name:"Monorail Route"},"type/route/pipeline":{icon:"iD-pipeline-line",fields:["name","ref_route","operator","to","from"],geometry:["relation"],tags:{type:"route",route:"pipeline"},name:"Pipeline Route"},"type/route/piste":{icon:"fas-skiing",fields:["name","piste/type","colour","ref_route","operator","to","from"],geometry:["relation"],tags:{type:"route",route:"piste"},name:"Piste/Ski Route"},"type/route/power":{icon:"iD-power-line",fields:["name","ref_route","operator","to","from"],geometry:["relation"],tags:{type:"route",route:"power"},name:"Power Route"},"type/route/road":{icon:"iD-highway-unclassified",fields:["name","ref_route","network_road","to","from"],geometry:["relation"],tags:{type:"route",route:"road"},name:"Road Route"},"type/route/subway":{icon:"temaki-subway",fields:["{type/route/train}"],moreFields:["{type/route/train}"],geometry:["relation"],tags:{type:"route",route:"subway"},name:"Subway Route"},"type/route/train":{icon:"iD-railway-rail",fields:["name","ref_route","operator","network","to","from"],moreFields:["colour","interval","opening_hours","duration","wheelchair"],geometry:["relation"],tags:{type:"route",route:"train"},name:"Train Route"},"type/route/tram":{icon:"temaki-tram",fields:["{type/route/train}"],moreFields:["{type/route/train}"],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-waterway-stream",fields:["name","waterway","ref"],geometry:["relation"],tags:{type:"waterway"},name:"Waterway"},"waterway/riverbank":{icon:"maki-water",geometry:["area"],tags:{waterway:"riverbank"},name:"Riverbank",searchable:false},"waterway/boatyard":{icon:"maki-harbor",fields:["name","operator"],moreFields:["address","website","phone","email","fax","wheelchair"],geometry:["area","vertex","point"],tags:{waterway:"boatyard"},name:"Boatyard"},"waterway/canal":{icon:"iD-waterway-canal",fields:["name","structure_waterway","width","intermittent","lock"],moreFields:["fishing","salt","tidal"],geometry:["line"],tags:{waterway:"canal"},name:"Canal"},"waterway/canal/lock":{icon:"iD-waterway-canal",fields:["name","width","lock"],moreFields:["intermittent","salt","tidal"],geometry:["line"],tags:{waterway:"canal",lock:"yes"},name:"Canal Lock"},"waterway/dam":{icon:"maki-dam",geometry:["point","vertex","line","area"],fields:["name"],moreFields:["website"],tags:{waterway:"dam"},name:"Dam"},"waterway/ditch":{icon:"iD-waterway-ditch",fields:["{waterway/drain}"],moreFields:["{waterway/drain}"],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"],moreFields:["covered"],geometry:["line"],tags:{waterway:"drain"},name:"Drain"},"waterway/fuel":{icon:"maki-fuel",fields:["name","operator","address","opening_hours","fuel_multi"],moreFields:["payment_multi","brand","seamark/type","building","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["petrol","gas","diesel","boat"],tags:{waterway:"fuel"},name:"Marine Fuel Station"},"waterway/lock_gate":{icon:"maki-dam",geometry:["vertex","line"],fields:["name","ref","height","material"],tags:{waterway:"lock_gate"},addTags:{waterway:"lock_gate","seamark:type":"gate"},terms:["canal"],name:"Lock Gate"},"waterway/milestone":{icon:"temaki-milestone",fields:["distance","direction_vertex"],moreFields:["seamark/type"],geometry:["point","vertex"],tags:{waterway:"milestone"},terms:["milestone","marker"],name:"Waterway Milestone"},"waterway/river":{icon:"iD-waterway-river",fields:["name","structure_waterway","width","intermittent","tidal"],moreFields:["covered","fishing","salt"],geometry:["line"],terms:["beck","branch","brook","course","creek","estuary","rill","rivulet","run","runnel","stream","tributary","watercourse"],tags:{waterway:"river"},name:"River"},"waterway/sanitary_dump_station":{icon:"temaki-storage_tank",fields:["name","operator","access_simple","fee","payment_multi_fee","water_point"],moreFields:["opening_hours","seamark/type"],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:["{waterway/stream}"],moreFields:["{waterway/stream}"],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"],moreFields:["covered","fishing","salt","tidal"],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-waterfall",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/bank/ABANCA":{name:"ABANCA",icon:"maki-bank",imageURL:"https://graph.facebook.com/SomosAbanca/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q9598744",amenity:"bank"},addTags:{amenity:"bank",brand:"ABANCA","brand:wikidata":"Q9598744","brand:wikipedia":"es:Abanca",name:"ABANCA",official_name:"ABANCA Corporación Bancaria"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/ABN AMRO":{name:"ABN AMRO",icon:"maki-bank",imageURL:"https://graph.facebook.com/abnamro/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q287471",amenity:"bank"},addTags:{amenity:"bank",brand:"ABN AMRO","brand:wikidata":"Q287471","brand:wikipedia":"en:ABN AMRO",name:"ABN AMRO",official_name:"ABN AMRO Bank N.V."},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"amenity/bank/ABSA":{name:"ABSA",icon:"maki-bank",imageURL:"https://graph.facebook.com/AbsaSouthAfrica/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q331688",amenity:"bank"},addTags:{amenity:"bank",brand:"ABSA","brand:wikidata":"Q331688","brand:wikipedia":"en:ABSA Group Limited",name:"ABSA"},countryCodes:["za"],terms:[],matchScore:2,suggestion:true},"amenity/bank/AIB":{name:"AIB",icon:"maki-bank",imageURL:"https://graph.facebook.com/aib/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1642179",amenity:"bank"},addTags:{amenity:"bank",brand:"AIB","brand:wikidata":"Q1642179","brand:wikipedia":"en:Allied Irish Banks",name:"AIB",official_name:"Allied Irish Banks"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"amenity/bank/ANZ":{name:"ANZ",icon:"maki-bank",imageURL:"https://graph.facebook.com/ANZAustralia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q714641",amenity:"bank"},addTags:{amenity:"bank",brand:"ANZ","brand:wikidata":"Q714641","brand:wikipedia":"en:Australia and New Zealand Banking Group",name:"ANZ",official_name:"Australia and New Zealand Banking Group Limited"},countryCodes:["au","nz"],terms:["anz bank"],matchScore:2,suggestion:true},"amenity/bank/ASB Bank":{name:"ASB Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/ASBBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q297214",amenity:"bank"},addTags:{amenity:"bank",brand:"ASB Bank","brand:wikidata":"Q297214","brand:wikipedia":"en:ASB Bank",name:"ASB Bank"},countryCodes:["nz"],terms:[],matchScore:2,suggestion:true},"amenity/bank/ATB Financial":{name:"ATB Financial",icon:"maki-bank",imageURL:"https://graph.facebook.com/ATBFinancial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q298762",amenity:"bank"},addTags:{amenity:"bank",brand:"ATB Financial","brand:wikidata":"Q298762","brand:wikipedia":"en:ATB Financial",name:"ATB Financial",official_name:"Alberta Treasury Branches"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/bank/AXA":{name:"AXA",icon:"maki-bank",imageURL:"https://graph.facebook.com/axainsurance/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q160054",amenity:"bank"},addTags:{amenity:"bank",brand:"AXA","brand:wikidata":"Q160054","brand:wikipedia":"en:AXA",name:"AXA"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Access Bank":{name:"Access Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/AccessBankPlc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4672418",amenity:"bank"},addTags:{amenity:"bank",brand:"Access Bank","brand:wikidata":"Q4672418","brand:wikipedia":"en:Access Bank plc",name:"Access Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Addiko Bank":{name:"Addiko Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/addiko.ba/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q27926559",amenity:"bank"},addTags:{amenity:"bank",brand:"Addiko Bank","brand:wikidata":"Q27926559","brand:wikipedia":"en:Addiko Bank",name:"Addiko Bank"},countryCodes:["ba","hr","me","rs","si"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Affinity Credit Union":{name:"Affinity Credit Union",icon:"maki-bank",imageURL:"https://graph.facebook.com/affinitycu/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4688969",amenity:"bank"},addTags:{amenity:"bank",brand:"Affinity Credit Union","brand:wikidata":"Q4688969","brand:wikipedia":"en:Affinity Credit Union",name:"Affinity Credit Union"},countryCodes:["ca"],terms:["affinity"],matchScore:2,suggestion:true},"amenity/bank/Agrani Bank Limited অগ্রণী ব্যাংক লিমিটেড":{name:"Agrani Bank Limited অগ্রণী ব্যাংক লিমিটেড",icon:"maki-bank",imageURL:"https://graph.facebook.com/AgraniBankLimited/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q517050",amenity:"bank"},addTags:{amenity:"bank",brand:"Agrani Bank Limited অগ্রণী ব্যাংক লিমিটেড","brand:wikidata":"Q517050","brand:wikipedia":"en:Agrani Bank",name:"Agrani Bank Limited অগ্রণী ব্যাংক লিমিটেড","name:en":"Agrani Bank Limited"},countryCodes:["bd"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Agribank (USA)":{name:"Agribank (USA)",icon:"maki-bank",imageURL:"https://graph.facebook.com/63806221089/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4693829",amenity:"bank"},addTags:{amenity:"bank",brand:"Agribank","brand:wikidata":"Q4693829","brand:wikipedia":"en:AgriBank",name:"Agribank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Agribank (Vietnam)":{name:"Agribank (Vietnam)",icon:"maki-bank",imageURL:"https://graph.facebook.com/AgribankVN/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1924723",amenity:"bank"},addTags:{amenity:"bank",brand:"Agribank","brand:wikidata":"Q1924723","brand:wikipedia":"vn:Ngân hàng Nông nghiệp và Phát triển Nông thôn Việt Nam",name:"Agribank",official_name:"Ngân hàng Nông nghiệp và Phát triển Nông thôn Việt Nam","official_name:en":"Vietnam Bank for Agriculture and Rural Development"},countryCodes:["vn"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Agribank (Zimbabwe)":{name:"Agribank (Zimbabwe)",icon:"maki-bank",imageURL:"https://graph.facebook.com/agribankzim/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4693887",amenity:"bank"},addTags:{amenity:"bank",brand:"Agribank","brand:wikidata":"Q4693887","brand:wikipedia":"en:Agricultural Development Bank of Zimbabwe",name:"Agribank"},countryCodes:["zw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Akbank":{name:"Akbank",icon:"maki-bank",imageURL:"https://graph.facebook.com/Akbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q416624",amenity:"bank"},addTags:{amenity:"bank",brand:"Akbank","brand:wikidata":"Q416624","brand:wikipedia":"en:Akbank",name:"Akbank"},countryCodes:["tr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Aktia":{name:"Aktia",icon:"maki-bank",imageURL:"https://graph.facebook.com/aktia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11850417",amenity:"bank"},addTags:{amenity:"bank",brand:"Aktia","brand:wikidata":"Q11850417","brand:wikipedia":"fi:Aktia",name:"Aktia"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Alior Bank":{name:"Alior Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/AliorBankSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q9148395",amenity:"bank"},addTags:{amenity:"bank",brand:"Alior Bank","brand:wikidata":"Q9148395","brand:wikipedia":"pl:Alior Bank",name:"Alior Bank"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Allahabad Bank":{name:"Allahabad Bank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/991552653015502848/xDR-OAbM_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q2018840",amenity:"bank"},addTags:{amenity:"bank",brand:"Allahabad Bank","brand:wikidata":"Q2018840","brand:wikipedia":"en:Allahabad Bank",name:"Allahabad Bank"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Allied Bank (Pakistan)":{name:"Allied Bank (Pakistan)",icon:"maki-bank",imageURL:"https://graph.facebook.com/alliedbankpk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4732553",amenity:"bank"},addTags:{amenity:"bank",brand:"Allied Bank","brand:wikidata":"Q4732553","brand:wikipedia":"en:Allied Bank Limited",name:"Allied Bank"},countryCodes:["pk"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Allied Bank (defunct bank in Philipiness)":{name:"Allied Bank (defunct bank in Philipiness)",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q4732555",amenity:"bank"},addTags:{amenity:"bank",brand:"Allied Bank","brand:wikidata":"Q4732555","brand:wikipedia":"en:Allied Banking Corporation",name:"Allied Bank"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Alpha Bank":{name:"Alpha Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/125297404838251/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q747394",amenity:"bank"},addTags:{amenity:"bank",brand:"Alpha Bank","brand:wikidata":"Q747394","brand:wikipedia":"en:Alpha Bank",name:"Alpha Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/America First Credit Union":{name:"America First Credit Union",icon:"maki-bank",imageURL:"https://graph.facebook.com/americafirstcu/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4742758",amenity:"bank"},addTags:{amenity:"bank",brand:"America First Credit Union","brand:wikidata":"Q4742758","brand:wikipedia":"en:America First Credit Union",name:"America First Credit Union",short_name:"AFCU"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Andhra Bank":{name:"Andhra Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/official.andhrabank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2003476",amenity:"bank"},addTags:{amenity:"bank",brand:"Andhra Bank","brand:wikidata":"Q2003476","brand:wikipedia":"en:Andhra Bank",name:"Andhra Bank"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Antonveneta":{name:"Antonveneta",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3633689",amenity:"bank"},addTags:{amenity:"bank",brand:"Antonveneta","brand:wikidata":"Q3633689","brand:wikipedia":"en:Banca Antonveneta",name:"Antonveneta"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Apple Bank":{name:"Apple Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/AppleBankfan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4781125",amenity:"bank"},addTags:{amenity:"bank",brand:"Apple Bank","brand:wikidata":"Q4781125","brand:wikipedia":"en:Apple Bank for Savings",name:"Apple Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Argenta":{name:"Argenta",icon:"maki-bank",imageURL:"https://graph.facebook.com/argenta/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q932856",amenity:"bank"},addTags:{amenity:"bank",brand:"Argenta","brand:wikidata":"Q932856","brand:wikipedia":"en:Argenta (bank)",name:"Argenta"},countryCodes:["be","lu","nl"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Arvest Bank":{name:"Arvest Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/ArvestBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4802393",amenity:"bank"},addTags:{amenity:"bank",brand:"Arvest Bank","brand:wikidata":"Q4802393","brand:wikipedia":"en:Arvest Bank",name:"Arvest Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Asia United Bank":{name:"Asia United Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/AUB.Official/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4806482",amenity:"bank"},addTags:{amenity:"bank",brand:"Asia United Bank","brand:wikidata":"Q4806482","brand:wikipedia":"en:Asia United Bank",name:"Asia United Bank"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Askari Bank":{name:"Askari Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/askaribankpakistan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4807137",amenity:"bank"},addTags:{amenity:"bank",brand:"Askari Bank","brand:wikidata":"Q4807137","brand:wikipedia":"en:Askari Bank",name:"Askari Bank"},countryCodes:["pk"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Associated Bank":{name:"Associated Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/associatedbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4809155",amenity:"bank"},addTags:{amenity:"bank",brand:"Associated Bank","brand:wikidata":"Q4809155","brand:wikipedia":"en:Associated Banc-Corp",name:"Associated Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Attijariwafa Bank":{name:"Attijariwafa Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/AttijariWB/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q758052",amenity:"bank"},addTags:{amenity:"bank",brand:"Attijariwafa Bank","brand:wikidata":"Q758052","brand:wikipedia":"en:Attijariwafa Bank",name:"Attijariwafa Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Axis Bank":{name:"Axis Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/axisbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2003549",amenity:"bank"},addTags:{amenity:"bank",brand:"Axis Bank","brand:wikidata":"Q2003549","brand:wikipedia":"en:Axis Bank",name:"Axis Bank"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BAC":{name:"BAC",icon:"maki-bank",imageURL:"https://graph.facebook.com/BACCredomaticSV/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5715556",amenity:"bank"},addTags:{amenity:"bank",brand:"BAC","brand:wikidata":"Q5715556","brand:wikipedia":"en:Banco de América Central",name:"BAC",official_name:"Banco de America Central"},terms:[],matchScore:2,suggestion:true},"amenity/bank/BAWAG PSK":{name:"BAWAG PSK",icon:"maki-bank",imageURL:"https://graph.facebook.com/bawag.psk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q379938",amenity:"bank"},addTags:{amenity:"bank",brand:"BAWAG PSK","brand:wikidata":"Q379938","brand:wikipedia":"en:BAWAG P.S.K.",name:"BAWAG PSK"},countryCodes:["at"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BB&T":{name:"BB&T",icon:"maki-bank",imageURL:"https://graph.facebook.com/BBTBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q795486",amenity:"bank"},addTags:{amenity:"bank",brand:"BB&T","brand:wikidata":"Q795486","brand:wikipedia":"en:BB&T",name:"BB&T",official_name:"Branch Banking and Trust Company"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BBBank":{name:"BBBank",icon:"maki-bank",imageURL:"https://graph.facebook.com/BBBank.de/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q795504",amenity:"bank"},addTags:{amenity:"bank",brand:"BBBank","brand:wikidata":"Q795504","brand:wikipedia":"en:BBBank",name:"BBBank"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BBVA":{name:"BBVA",icon:"maki-bank",imageURL:"https://graph.facebook.com/GrupoBBVA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q806189",amenity:"bank"},addTags:{amenity:"bank",brand:"BBVA","brand:wikidata":"Q806189","brand:wikipedia":"en:Banco Bilbao Vizcaya Argentaria",name:"BBVA",official_name:"Banco Bilbao Vizcaya Argentaria"},terms:[],matchScore:2,suggestion:true},"amenity/bank/BBVA Bancomer":{name:"BBVA Bancomer",icon:"maki-bank",imageURL:"https://graph.facebook.com/BBVASeguros.mx/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2876794",amenity:"bank"},addTags:{amenity:"bank",brand:"BBVA Bancomer","brand:wikidata":"Q2876794","brand:wikipedia":"en:BBVA Bancomer",name:"BBVA Bancomer"},countryCodes:["mx"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BBVA Compass":{name:"BBVA Compass",icon:"maki-bank",imageURL:"https://graph.facebook.com/bbvaintheusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4835088",amenity:"bank"},addTags:{amenity:"bank",brand:"BBVA Compass","brand:wikidata":"Q4835088","brand:wikipedia":"en:BBVA Compass",name:"BBVA Compass",official_name:"BBVA Compass Bancshares"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BBVA Continental":{name:"BBVA Continental",icon:"maki-bank",imageURL:"https://graph.facebook.com/BBVAenPeru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4835089",amenity:"bank"},addTags:{amenity:"bank",brand:"BBVA Continental","brand:wikidata":"Q4835089","brand:wikipedia":"en:BBVA Continental",name:"BBVA Continental"},countryCodes:["pe"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BBVA Francés":{name:"BBVA Francés",icon:"maki-bank",imageURL:"https://graph.facebook.com/bbva.argentina/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2876788",amenity:"bank"},addTags:{amenity:"bank",brand:"BBVA Francés","brand:en":"BBVA France","brand:fr":"BBVA France","brand:wikidata":"Q2876788","brand:wikipedia":"en:BBVA Francés",name:"BBVA Francés","name:en":"BBVA France","name:fr":"BBVA Francés"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BCA":{name:"BCA",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/608231074435440640/GlPmkzgL_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q806626",amenity:"bank"},addTags:{amenity:"bank",brand:"BCA","brand:wikidata":"Q806626","brand:wikipedia":"id:Bank Central Asia",name:"BCA",official_name:"Bank Central Asia"},terms:["bank bca"],matchScore:2,suggestion:true},"amenity/bank/BCI":{name:"BCI",icon:"maki-bank",imageURL:"https://graph.facebook.com/BancoBci/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2882083",amenity:"bank"},addTags:{amenity:"bank",brand:"BCI","brand:wikidata":"Q2882083","brand:wikipedia":"es:Banco de Crédito e Inversiones",name:"BCI",official_name:"Banco de Crédito e Inversiones","official_name:en":"Bank of Credit and Investments","official_name:es":"Banco de Crédito e Inversiones"},terms:["banco bci"],matchScore:2,suggestion:true},"amenity/bank/BCP (Bolivia)":{name:"BCP (Bolivia)",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/841417123339616257/leTBJ_Ls_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q16826675",amenity:"bank"},addTags:{amenity:"bank",brand:"BCP","brand:wikidata":"Q16826675","brand:wikipedia":"es:Banco de Crédito de Bolivia",name:"BCP",official_name:"Banco de Crédito de Bolivia","official_name:en":"Credit Bank of Bolivia","official_name:es":"Banco de Crédito de Bolivia"},countryCodes:["bo"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BCP (France)":{name:"BCP (France)",icon:"maki-bank",imageURL:"https://graph.facebook.com/MaisMillennium/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q118581",amenity:"bank"},addTags:{amenity:"bank",brand:"BCP","brand:wikidata":"Q118581","brand:wikipedia":"pt:Banco Comercial Português",name:"BCP"},countryCodes:["fr"],terms:["banque bcp","bcp"],matchScore:2,suggestion:true},"amenity/bank/BCP (Luxembourg)":{name:"BCP (Luxembourg)",icon:"maki-bank",imageURL:"https://graph.facebook.com/MaisMillennium/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q118581",amenity:"bank"},addTags:{amenity:"bank",brand:"BCP","brand:wikidata":"Q118581","brand:wikipedia":"pt:Banco Comercial Português",name:"BCP"},countryCodes:["lu"],terms:["banque bcp","bcp"],matchScore:2,suggestion:true},"amenity/bank/BCP (Peru)":{name:"BCP (Peru)",icon:"maki-bank",imageURL:"https://graph.facebook.com/bancodecreditobcp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4854124",amenity:"bank"},addTags:{amenity:"bank",brand:"BCP","brand:wikidata":"Q4854124","brand:wikipedia":"es:Banco de Crédito del Perú",name:"BCP"},countryCodes:["pe"],terms:["banco de crédito del perú"],matchScore:2,suggestion:true},"amenity/bank/BCR (Banca Comercială Română)":{name:"BCR (Banca Comercială Română)",icon:"maki-bank",imageURL:"https://graph.facebook.com/BCRRomania/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q806149",amenity:"bank"},addTags:{amenity:"bank",brand:"BCR","brand:wikidata":"Q806149","brand:wikipedia":"en:Banca Comercială Română",name:"BCR",official_name:"Banca Comercială Română","official_name:en":"Romanian Commercial Bank","official_name:ro":"Banca Comercială Română"},countryCodes:["ro"],terms:["banca comercială română"],matchScore:2,suggestion:true},"amenity/bank/BCR (Costa Rica)":{name:"BCR (Costa Rica)",icon:"maki-bank",imageURL:"https://graph.facebook.com/BancoBCR/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6951632",amenity:"bank"},addTags:{amenity:"bank",brand:"BCR","brand:wikidata":"Q6951632","brand:wikipedia":"es:Banco de Costa Rica",name:"BCR",official_name:"Banco de Costa Rica","official_name:en":"Bank of Costa Rica","official_name:es":"Banco de Costa Rica"},countryCodes:["cr"],terms:["banco de costa rica"],matchScore:2,suggestion:true},"amenity/bank/BDO":{name:"BDO",icon:"maki-bank",imageURL:"https://graph.facebook.com/BancoBCR/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4854129",amenity:"bank"},addTags:{amenity:"bank",brand:"BDO","brand:wikidata":"Q4854129","brand:wikipedia":"en:Banco de Oro",name:"BDO",official_name:"Banco de Oro","official_name:en":"Gold Bank","official_name:es":"Banco de Oro"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BGŻ BNP Paribas":{name:"BGŻ BNP Paribas",icon:"maki-bank",imageURL:"https://graph.facebook.com/BNPParibasBankPolska/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q20744004",amenity:"bank"},addTags:{amenity:"bank",brand:"BGŻ BNP Paribas","brand:wikidata":"Q20744004","brand:wikipedia":"pl:BNP Paribas Bank Polska",name:"BGŻ BNP Paribas"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BIAT":{name:"BIAT",icon:"maki-bank",imageURL:"https://graph.facebook.com/BanqueInternationaleArabedeTunisie/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q690739",amenity:"bank"},addTags:{amenity:"bank",brand:"BIAT","brand:wikidata":"Q690739","brand:wikipedia":"en:Banque Internationale Arabe de Tunisie",name:"BIAT"},countryCodes:["tn"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BMCE Bank":{name:"BMCE Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/BMCEBankOfAfrica/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2300433",amenity:"bank"},addTags:{amenity:"bank",brand:"BMCE Bank","brand:wikidata":"Q2300433","brand:wikipedia":"ar:البنك المغربي للتجارة الخارجية",name:"BMCE Bank"},countryCodes:["ma"],terms:["bmce"],matchScore:2,suggestion:true},"amenity/bank/BMCI":{name:"BMCI",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/793836106156507137/6hm9zrfV_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q2883409",amenity:"bank"},addTags:{amenity:"bank",brand:"BMCI","brand:wikidata":"Q2883409","brand:wikipedia":"ar:البنك المغربي للتجارة والصناعة",name:"BMCI"},countryCodes:["ma"],terms:["bmci bank"],matchScore:2,suggestion:true},"amenity/bank/BMN":{name:"BMN",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBMN%20nuevo%20logo.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q3754900",amenity:"bank"},addTags:{amenity:"bank",brand:"BMN","brand:wikidata":"Q3754900","brand:wikipedia":"es:Banco Mare Nostrum",name:"BMN",official_name:"Banco Mare Nostrum"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BMO":{name:"BMO",icon:"maki-bank",imageURL:"https://graph.facebook.com/BMOcommunity/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q806693",amenity:"bank"},addTags:{amenity:"bank",brand:"BMO","brand:wikidata":"Q806693","brand:wikipedia":"en:Bank of Montreal",name:"BMO",official_name:"Bank of Montreal"},countryCodes:["ca","us"],terms:["bmo bank of montreal"],matchScore:2,suggestion:true},"amenity/bank/BMO Harris Bank":{name:"BMO Harris Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/bmoharrisbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4835981",amenity:"bank"},addTags:{amenity:"bank",brand:"BMO Harris Bank","brand:wikidata":"Q4835981","brand:wikipedia":"en:BMO Harris Bank",name:"BMO Harris Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BNA (Algeria)":{name:"BNA (Algeria)",icon:"maki-bank",imageURL:"https://graph.facebook.com/bnalgerie/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2883410",amenity:"bank"},addTags:{amenity:"bank",brand:"BNA","brand:wikidata":"Q2883410","brand:wikipedia":"fr:Banque nationale d'Algérie",name:"BNA",official_name:"Banque nationale d'Algérie","official_name:en":"National Bank of Algeria","official_name:fr":"Banque nationale d'Algérie"},countryCodes:["dz"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BNA (Tunisia)":{name:"BNA (Tunisia)",icon:"maki-bank",imageURL:"https://graph.facebook.com/BanqueNationaleAgricole/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2883413",amenity:"bank"},addTags:{amenity:"bank",brand:"BNA","brand:wikidata":"Q2883413","brand:wikipedia":"fr:Banque nationale agricole",name:"BNA"},countryCodes:["tn"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BNI":{name:"BNI",icon:"maki-bank",imageURL:"https://graph.facebook.com/BNI/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2882611",amenity:"bank"},addTags:{amenity:"bank",brand:"BNI","brand:wikidata":"Q2882611","brand:wikipedia":"id:Bank Negara Indonesia",name:"BNI",official_name:"Bank Negara Indonesia","official_name:en":"State Bank of Indonesia","official_name:id":"Bank Negara Indonesia"},terms:["bank bni"],matchScore:2,suggestion:true},"amenity/bank/BNL":{name:"BNL",icon:"maki-bank",imageURL:"https://graph.facebook.com/BNLBNPParibas/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2201225",amenity:"bank"},addTags:{amenity:"bank",brand:"BNL","brand:wikidata":"Q2201225","brand:wikipedia":"en:Banca Nazionale del Lavoro",name:"BNL",official_name:"Banca Nazionale del Lavoro","official_name:en":"National Labor Bank","official_name:it":"Banca Nazionale del Lavoro"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BNP Paribas":{name:"BNP Paribas",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1143209323503542272/sJdUcI3G_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q499707",amenity:"bank"},addTags:{amenity:"bank",brand:"BNP Paribas","brand:wikidata":"Q499707","brand:wikipedia":"en:BNP Paribas",name:"BNP Paribas"},terms:[],matchScore:2,suggestion:true},"amenity/bank/BNP Paribas Fortis":{name:"BNP Paribas Fortis",icon:"maki-bank",imageURL:"https://graph.facebook.com/BNPParibasFortisBelgique/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q796827",amenity:"bank"},addTags:{amenity:"bank",brand:"BNP Paribas Fortis","brand:wikidata":"Q796827","brand:wikipedia":"en:BNP Paribas Fortis",name:"BNP Paribas Fortis"},countryCodes:["be"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BOC":{name:"BOC",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FChinese%20Bank%20of%20China.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q790068",amenity:"bank"},addTags:{amenity:"bank",brand:"BOC","brand:wikidata":"Q790068","brand:wikipedia":"en:Bank of China",name:"BOC",official_name:"Bank of China"},terms:[],matchScore:2,suggestion:true},"amenity/bank/BOQ":{name:"BOQ",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/458816630949019649/ggOeeSFX_bigger.jpeg",geometry:["point","area"],tags:{"brand:wikidata":"Q4856173",amenity:"bank"},addTags:{amenity:"bank",brand:"BOQ","brand:wikidata":"Q4856173","brand:wikipedia":"en:Bank of Queensland",name:"BOQ",official_name:"Bank of Queensland"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BPI":{name:"BPI",icon:"maki-bank",imageURL:"https://graph.facebook.com/bpi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2501256",amenity:"bank"},addTags:{amenity:"bank",brand:"BPI","brand:wikidata":"Q2501256","brand:wikipedia":"en:Bank of the Philippine Islands",name:"BPI",official_name:"Bank of the Philippine Islands"},terms:["bpi family savings bank"],matchScore:2,suggestion:true},"amenity/bank/BRD":{name:"BRD",icon:"maki-bank",imageURL:"https://graph.facebook.com/BRDGroupeSocieteGenerale/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q796927",amenity:"bank"},addTags:{amenity:"bank",brand:"BRD","brand:wikidata":"Q796927","brand:wikipedia":"ro:BRD - Groupe Société Générale",name:"BRD"},countryCodes:["ro"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BRED":{name:"BRED",icon:"maki-bank",imageURL:"https://graph.facebook.com/BRED.Banque.Populaire/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2877455",amenity:"bank"},addTags:{amenity:"bank",brand:"BRED","brand:wikidata":"Q2877455","brand:wikipedia":"fr:BRED Banque populaire",name:"BRED",official_name:"Banque régionale d'escompte et de dépôts","official_name:en":"Regional Discount and Deposit Bank","official_name:fr":"Banque régionale d'escompte et de dépôts"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BRI":{name:"BRI",icon:"maki-bank",imageURL:"https://graph.facebook.com/BRIofficialpage/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q623042",amenity:"bank"},addTags:{amenity:"bank",brand:"BRI","brand:wikidata":"Q623042","brand:wikipedia":"id:Bank Rakyat Indonesia",name:"BRI",official_name:"Bank Rakyat Indonesia","official_name:en":"People's Bank of Indonesia","official_name:id":"Bank Rakyat Indonesia"},countryCodes:["id"],terms:["bank bri"],matchScore:2,suggestion:true},"amenity/bank/BTN":{name:"BTN",icon:"maki-bank",imageURL:"https://graph.facebook.com/www.btn.co.id/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12474534",amenity:"bank"},addTags:{amenity:"bank",brand:"BTN","brand:en":"BTN","brand:id":"BTN","brand:wikidata":"Q12474534","brand:wikipedia":"id:Bank Tabungan Negara",name:"BTN","name:en":"BTN","name:id":"BTN",official_name:"Bank Tabungan Negara","official_name:en":"State Savings Bank","official_name:id":"Bank Tabungan Negara"},countryCodes:["id"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BW-Bank":{name:"BW-Bank",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBaden-W%C3%BCrttembergische%20Bank%20text%20logo%20black.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q798891",amenity:"bank"},addTags:{amenity:"bank",brand:"BW-Bank","brand:de":"BW-Bank","brand:en":"BW-Bank","brand:wikidata":"Q798891","brand:wikipedia":"de:Baden-Württembergische Bank",name:"BW-Bank","name:de":"BW-Bank","name:en":"BW-Bank"},countryCodes:["de"],terms:["baden-württembergische bank"],matchScore:2,suggestion:true},"amenity/bank/Banamex":{name:"Banamex",icon:"maki-bank",imageURL:"https://graph.facebook.com/Citibanamex/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q749474",amenity:"bank"},addTags:{amenity:"bank",brand:"Banamex","brand:wikidata":"Q749474","brand:wikipedia":"en:Grupo Financiero Banamex",name:"Banamex",official_name:"Grupo Financiero Banamex","official_name:en":"Banamex Financial Group","official_name:es":"Grupo Financiero Banamex"},countryCodes:["mx"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banca Intesa":{name:"Banca Intesa",icon:"maki-bank",imageURL:"https://graph.facebook.com/bancaintesa.rs/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q647092",amenity:"bank"},addTags:{amenity:"bank",brand:"Banca Intesa","brand:wikidata":"Q647092","brand:wikipedia":"en:Banca Intesa",name:"Banca Intesa","name:en":"Intesa Bank","name:it":"Banca Intesa"},countryCodes:["it","rs"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banca March":{name:"Banca March",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/529243270367309824/JFWCTY94_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q578252",amenity:"bank"},addTags:{amenity:"bank",brand:"Banca March","brand:wikidata":"Q578252","brand:wikipedia":"en:Banca March",name:"Banca March"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banca Popolare di Milano":{name:"Banca Popolare di Milano",icon:"maki-bank",imageURL:"https://graph.facebook.com/BancoBPM/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q806154",amenity:"bank"},addTags:{amenity:"bank",brand:"Banca Popolare di Milano","brand:en":"Popular Bank of Milan","brand:it":"Banca Popolare di Milano","brand:wikidata":"Q806154","brand:wikipedia":"en:Banca Popolare di Milano",name:"Banca Popolare di Milano","name:en":"Popular Bank of Milan","name:it":"Banca Popolare di Milano"},countryCodes:["it"],terms:["bpm"],matchScore:2,suggestion:true},"amenity/bank/Banca Popolare di Novara":{name:"Banca Popolare di Novara",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3633742",amenity:"bank"},addTags:{amenity:"bank",brand:"Banca Popolare di Novara","brand:en":"Popular Bank of Novara","brand:it":"Banca Popolare di Novara","brand:wikidata":"Q3633742","brand:wikipedia":"en:Banca Popolare di Novara",name:"Banca Popolare di Novara","name:en":"Popular Bank of Novara","name:it":"Banca Popolare di Novara"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banca Popolare di Sondrio":{name:"Banca Popolare di Sondrio",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q686176",amenity:"bank"},addTags:{amenity:"bank",brand:"Banca Popolare di Sondrio","brand:en":"Popular Bank of Sandrio","brand:it":"Banca Popolare di Sondrio","brand:wikidata":"Q686176","brand:wikipedia":"en:Banca Popolare di Sondrio",name:"Banca Popolare di Sondrio","name:en":"Popular Bank of Sandrio","name:it":"Banca Popolare di Sondrio"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banca Popolare di Verona":{name:"Banca Popolare di Verona",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3167468",amenity:"bank"},addTags:{amenity:"bank",brand:"Banca Popolare di Verona","brand:en":"Popular Bank of Verona","brand:it":"Banca Popolare di Verona","brand:wikidata":"Q3167468","brand:wikipedia":"en:Banca Popolare di Verona",name:"Banca Popolare di Verona","name:en":"Popular Bank of Verona","name:it":"Banca Popolare di Verona"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banca Popolare di Vicenza":{name:"Banca Popolare di Vicenza",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3127200",amenity:"bank"},addTags:{amenity:"bank",brand:"Banca Popolare di Vicenza","brand:en":"Popular Bank of Vicenza","brand:it":"Banca Popolare di Vicenza","brand:wikidata":"Q3127200","brand:wikipedia":"en:Banca Popolare di Vicenza",name:"Banca Popolare di Vicenza","name:en":"Popular Bank of Vicena","name:it":"Banca Popolare di Vicenza"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banca Românească":{name:"Banca Românească",icon:"maki-bank",imageURL:"https://graph.facebook.com/BancaRomaneascaOficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4854052",amenity:"bank"},addTags:{amenity:"bank",brand:"Banca Românească","brand:en":"Romanian Bank","brand:ro":"Banca Românească","brand:wikidata":"Q4854052","brand:wikipedia":"ro:Banca Românească",name:"Banca Românească","name:en":"Popular Bank of Vicena","name:ro":"Banca Românească"},countryCodes:["ro"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banca Sella":{name:"Banca Sella",icon:"maki-bank",imageURL:"https://graph.facebook.com/bancasella/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3633749",amenity:"bank"},addTags:{amenity:"bank",brand:"Banca Sella","brand:en":"Sella Bank","brand:it":"Banca Sella","brand:wikidata":"Q3633749","brand:wikipedia":"en:Banca Sella Group",name:"Banca Sella","name:en":"Sella Bank","name:it":"Banca Sella"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banca Transilvania":{name:"Banca Transilvania",icon:"maki-bank",imageURL:"https://graph.facebook.com/BancaTransilvania/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q806161",amenity:"bank"},addTags:{amenity:"bank",brand:"Banca Transilvania","brand:en":"Transilvania Bank","brand:ro":"Banca Transilvania","brand:wikidata":"Q806161","brand:wikipedia":"en:Banca Transilvania",name:"Banca Transilvania","name:en":"Transilvania Bank","name:ro":"Banca Transilvania"},countryCodes:["ro"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bancaribe":{name:"Bancaribe",icon:"maki-bank",imageURL:"https://graph.facebook.com/Bancaribe/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5717827",amenity:"bank"},addTags:{amenity:"bank",brand:"Bancaribe","brand:wikidata":"Q5717827","brand:wikipedia":"en:Bancaribe",name:"Bancaribe"},countryCodes:["ve"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco AV Villas":{name:"Banco AV Villas",icon:"maki-bank",imageURL:"https://graph.facebook.com/AVVillas/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4854068",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco AV Villas","brand:en":"Bank of Villas","brand:es":"Banco AV Villas","brand:wikidata":"Q4854068","brand:wikipedia":"en:Banco AV Villas",name:"Banco AV Villas","name:en":"Bank of Villas","name:es":"Banco AV Villas"},countryCodes:["co"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Agrario":{name:"Banco Agrario",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBanco%20Agrario%20de%20Colombia%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q20013358",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Agrario","brand:en":"Agrarian Bank","brand:wikidata":"Q20013358","brand:wikipedia":"es:Banco Agrario de Colombia",name:"Banco Agrario","name:en":"Agrarian Bank","name:es":"Banco Agrario",official_name:"Banco Agrario de Colombia","official_name:en":"Agrarian Bank of Colombia","official_name:es":"Banco Agrario de Colombia"},countryCodes:["co"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Azteca":{name:"Banco Azteca",icon:"maki-bank",imageURL:"https://graph.facebook.com/BancoAzteca/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4854076",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Azteca","brand:en":"Aztec Bank","brand:es":"Banco Azteca","brand:wikidata":"Q4854076","brand:wikipedia":"en:Banco Azteca",name:"Banco Azteca","name:en":"Aztec Bank","name:es":"Banco Azteca"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco BPM":{name:"Banco BPM",icon:"maki-bank",imageURL:"https://graph.facebook.com/BancoBPM/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q27331643",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco BPM","brand:en":"BPM Bank","brand:es":"Banco BPM","brand:wikidata":"Q27331643","brand:wikipedia":"en:Banco BPM",name:"Banco BPM","name:en":"BPM Bank","name:es":"Banco BPM"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Caja Social":{name:"Banco Caja Social",icon:"maki-bank",imageURL:"https://graph.facebook.com/BancoCajaSocial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5717869",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Caja Social","brand:en":"Social Housing Bank","brand:es":"Banco Caja Social","brand:wikidata":"Q5717869","brand:wikipedia":"es:Banco Caja Social",name:"Banco Caja Social","name:en":"Social Housing Bank","name:es":"Banco Caja Social"},countryCodes:["co"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Ciudad":{name:"Banco Ciudad",icon:"maki-bank",imageURL:"https://graph.facebook.com/bancociudad/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4856204",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Ciudad","brand:en":"City Bank","brand:es":"Banco Ciudad","brand:wikidata":"Q4856204","brand:wikipedia":"en:Bank of the City of Buenos Aires",name:"Banco Ciudad","name:en":"City Bank","name:es":"Banco Ciudad",official_name:"Banco Ciudad de Buenos Aires","official_name:en":"Bank of the City of Buenos Aires","official_name:es":"Banco Ciudad de Buenos Aires"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Continental (Paraguay)":{name:"Banco Continental (Paraguay)",icon:"maki-bank",imageURL:"https://graph.facebook.com/bcontinentalpy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62054564",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Continental","brand:en":"Continental Bank","brand:es":"Banco Continental","brand:wikidata":"Q62054564",name:"Banco Continental","name:en":"Continental Bank","name:es":"Banco Continental"},countryCodes:["py"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Continental (Peru)":{name:"Banco Continental (Peru)",icon:"maki-bank",imageURL:"https://graph.facebook.com/BBVAenPeru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4835089",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Continental","brand:en":"Continental Bank","brand:es":"Banco Continental","brand:wikidata":"Q4835089","brand:wikipedia":"en:BBVA Continental",name:"Banco Continental","name:en":"Continental Bank","name:es":"Banco Continental"},countryCodes:["pe"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Estado":{name:"Banco Estado",icon:"maki-bank",imageURL:"https://graph.facebook.com/BancoEstado/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5718188",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Estado","brand:en":"State Bank","brand:es":"Banco Estado","brand:wikidata":"Q5718188","brand:wikipedia":"es:Banco del Estado de Chile",name:"Banco Estado","name:en":"State Bank","name:es":"Banco Estado",official_name:"Banco del Estado de Chile","official_name:en":"Bank of the State of Chile","official_name:es":"Banco del Estado de Chile"},countryCodes:["cl"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Falabella":{name:"Banco Falabella",icon:"maki-bank",imageURL:"https://graph.facebook.com/bancofalabella/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4854088",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Falabella","brand:en":"Falabella Bank","brand:es":"Banco Falabella","brand:wikidata":"Q4854088","brand:wikipedia":"en:Banco Falabella",name:"Banco Falabella","name:en":"Falabella Bank","name:es":"Banco Falabella"},countryCodes:["cl","co","pe"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Fassil":{name:"Banco Fassil",icon:"maki-bank",imageURL:"https://graph.facebook.com/bancofassil/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62118592",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Fassil","brand:en":"Fassil Bank","brand:es":"Banco Fassil","brand:wikidata":"Q62118592",name:"Banco Fassil","name:en":"Fassil Bank","name:es":"Banco Fassil"},countryCodes:["bo"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco G&T Continental":{name:"Banco G&T Continental",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1086265271898202112/jhjR8vK2_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q5717949",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco G&T Continental","brand:en":"G&T Continental Bank","brand:es":"Banco G&T Continental","brand:wikidata":"Q5717949","brand:wikipedia":"es:Banco GYT Continental, S.A.",name:"Banco G&T Continental","name:en":"G&T Continental Bank","name:es":"Banco G&T Continental"},countryCodes:["gt","sv"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco General":{name:"Banco General",icon:"maki-bank",imageURL:"https://graph.facebook.com/bancogeneral/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q27618271",amenity:"bank"},addTags:{amenity:"bank",brand:"BW-Bank","brand:en":"BW-Bank","brand:es":"BW-Bank","brand:wikidata":"Q27618271","brand:wikipedia":"es:Banco General (Panamá)",name:"Banco General","name:en":"General Bank","name:es":"Banco General"},countryCodes:["cr","pa"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Industrial":{name:"Banco Industrial",icon:"maki-bank",imageURL:"https://graph.facebook.com/bindARG/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16489444",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Industrial","brand:en":"Industrial Bank","brand:es":"Banco Industrial","brand:wikidata":"Q16489444","brand:wikipedia":"es:Banco Industrial",name:"Banco Industrial","name:en":"Industrial Bank","name:es":"Banco Industrial"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Internacional (Chile)":{name:"Banco Internacional (Chile)",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/438324350148571136/fCNvpo-F_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q56605586",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Internacional","brand:en":"International Bank","brand:es":"Banco Internacional","brand:wikidata":"Q56605586","brand:wikipedia":"es:Banco Internacional (Chile)",name:"Banco Internacional","name:en":"International Bank","name:es":"Banco Internacional"},countryCodes:["cl"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Internacional (Ecuador)":{name:"Banco Internacional (Ecuador)",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/986297558493487104/4Y3z4QEF_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q806187",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Internacional","brand:en":"International Bank","brand:es":"Banco Internacional","brand:wikidata":"Q806187","brand:wikipedia":"es:Banco Internacional",name:"Banco Internacional","name:en":"International Bank","name:es":"Banco Internacional"},countryCodes:["ec"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Metropolitano":{name:"Banco Metropolitano",icon:"maki-bank",imageURL:"https://graph.facebook.com/BanmetCuba/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62118612",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Metropolitano","brand:en":"Metroplitan Bank","brand:es":"Banco Metropolitano","brand:wikidata":"Q62118612",name:"Banco Metropolitano","name:en":"Metropolitan Bank","name:es":"Banco Metropolitano"},countryCodes:["cu"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Nacional":{name:"Banco Nacional",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q4854104",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Nacional","brand:en":"National Bank","brand:es":"Banco Nacional","brand:wikidata":"Q4854104","brand:wikipedia":"en:Banco Nacional",name:"Banco Nacional","name:en":"National Bank","name:es":"Banco Nacional"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Nación":{name:"Banco Nación",icon:"maki-bank",imageURL:"https://graph.facebook.com/banconacion/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2883376",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Nación","brand:en":"Nation Bank","brand:es":"Banco Nación","brand:wikidata":"Q2883376","brand:wikipedia":"en:Banco de la Nación Argentina",name:"Banco Nación","name:en":"Nation Bank","name:es":"Banco Nación",official_name:"Banco de la Nación Argentina","official_name:en":"Bank of the Argentine Nation","official_name:es":"Banco de la Nación Argentina"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Pastor":{name:"Banco Pastor",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20pastor168x78.gif%3Bpv91c0cc0e0080a771.gif&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q806193",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Pastor","brand:en":"Shepherd Bank","brand:es":"Banco Pastor","brand:wikidata":"Q806193","brand:wikipedia":"en:Banco Pastor",name:"Banco Pastor","name:en":"Shepherd Bank","name:es":"Banco Pastor",official_name:"Banco Popular Pastor","official_name:en":"Popular Shepherd Bank","official_name:es":"Banco Popular Pastor"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Pichincha":{name:"Banco Pichincha",icon:"maki-bank",imageURL:"https://graph.facebook.com/BancoPichinchaEcuador/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4854135",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Pichincha","brand:en":"Pichincha Bank","brand:es":"Banco Pichincha","brand:wikidata":"Q4854135","brand:wikipedia":"en:Banco Pichincha",name:"Banco Pichincha","name:en":"Pichincha Bank","name:es":"Banco Pichincha"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Popular":{name:"Banco Popular",icon:"maki-bank",imageURL:"https://graph.facebook.com/grupobancopopular/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q537259",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Popular","brand:en":"Popular Bank","brand:es":"Banco Popular","brand:wikidata":"Q537259","brand:wikipedia":"es:Banco Popular Español",name:"Banco Popular","name:en":"Popular Bank","name:es":"Banco Popular",official_name:"Banco Popular Español","official_name:en":"Spanish Popular Bank","official_name:es":"Banco Popular Español"},countryCodes:["us","vi"],terms:["popular"],matchScore:2,suggestion:true},"amenity/bank/Banco Popular de Ahorro":{name:"Banco Popular de Ahorro",icon:"maki-bank",imageURL:"https://graph.facebook.com/bpa.cu/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62118626",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Popular de Ahorro","brand:en":"Popular Saving Bank","brand:es":"Banco Popular de Ahorro","brand:wikidata":"Q62118626",name:"Banco Popular de Ahorro","name:en":"Popular Saving Bank","name:es":"Banco Popular de Ahorro"},countryCodes:["cu"],terms:["bpa"],matchScore:2,suggestion:true},"amenity/bank/Banco Provincia":{name:"Banco Provincia",icon:"maki-bank",imageURL:"https://graph.facebook.com/bancoprovincia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4856209",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Provincia","brand:en":"Province Bank","brand:es":"Banco Provincia","brand:wikidata":"Q4856209","brand:wikipedia":"es:Banco de la Provincia de Buenos Aires",name:"Banco Provincia","name:en":"Province Bank","name:es":"Banco Provincia",official_name:"Banco de la Provincia de Buenos Aires","official_name:en":"Bank of the Province of Buenos Aires","official_name:es":"Banco de la Provincia de Buenos Aires"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Sabadell":{name:"Banco Sabadell",icon:"maki-bank",imageURL:"https://graph.facebook.com/bancosabadell/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q762330",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Sabadell","brand:en":"Sabadell Bank","brand:es":"Banco Sabadell","brand:wikidata":"Q762330","brand:wikipedia":"es:Banco Sabadell",name:"Banco Sabadell","name:en":"Sabadell Bank","name:es":"Banco Sabadell"},countryCodes:["es"],terms:["banc sabadell","sabadell"],matchScore:2,suggestion:true},"amenity/bank/Banco Santa Fe":{name:"Banco Santa Fe",icon:"maki-bank",imageURL:"https://graph.facebook.com/BancoSantaFe/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6046871",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Santa Fe","brand:en":"Santa Fe Bank","brand:es":"Banco Santa Fe","brand:wikidata":"Q6046871","brand:wikipedia":"es:Nuevo Banco de Santa Fe",name:"Banco Santa Fe","name:en":"Santa Fe Bank","name:es":"Banco Santa Fe",official_name:"Nuevo Banco de Santa Fe","official_name:en":"New Bank of Santa Fe","official_name:es":"Nuevo Banco de Santa Fe"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Santander":{name:"Banco Santander",icon:"maki-bank",imageURL:"https://graph.facebook.com/bancosantander/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6496310",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Santander","brand:en":"Santander Bank","brand:es":"Banco Santander","brand:wikidata":"Q6496310","brand:wikipedia":"es:Banco Santander",name:"Banco Santander","name:en":"Santander Bank","name:es":"Banco Santander",official_name:"Santander Group"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Sol (Angola)":{name:"Banco Sol (Angola)",icon:"maki-bank",imageURL:"https://graph.facebook.com/bancosolangola/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62118744",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Sol","brand:en":"Sol Bank","brand:pt":"Banco Sol","brand:wikidata":"Q62118744",name:"Banco Sol","name:en":"Sol Bank","name:pt":"Banco Sol"},countryCodes:["ao"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Sol (Bolivia)":{name:"Banco Sol (Bolivia)",icon:"maki-bank",imageURL:"https://graph.facebook.com/BancoSolidarioBolivia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62118746",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Sol","brand:en":"Sol Bank","brand:pt":"Banco Sol","brand:wikidata":"Q62118746",name:"Banco Sol","name:en":"Sol Bank","name:pt":"Banco Sol"},countryCodes:["bo"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco de Bogotá":{name:"Banco de Bogotá",icon:"maki-bank",imageURL:"https://graph.facebook.com/BancodeBogota/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4854122",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco de Bogotá","brand:en":"Bank of Bogota","brand:es":"Banco de Bogotá","brand:wikidata":"Q4854122","brand:wikipedia":"es:Banco de Bogotá",name:"Banco de Bogotá","name:en":"Bank of Bogota","name:es":"Banco de Bogotá"},countryCodes:["co"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco de Chile":{name:"Banco de Chile",icon:"maki-bank",imageURL:"https://graph.facebook.com/bancochile.cl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2882085",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco de Chile","brand:en":"Bank of Chile","brand:es":"Banco de Chile","brand:wikidata":"Q2882085","brand:wikipedia":"es:Banco de Chile",name:"Banco de Chile","name:en":"Bank of Chile","name:es":"Banco de Chile"},countryCodes:["cl"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco de Desarrollo Banrural":{name:"Banco de Desarrollo Banrural",icon:"maki-bank",imageURL:"https://graph.facebook.com/BanruralHonduras/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5719130",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco de Desarrollo Banrural","brand:en":"Bank of Banrural Development","brand:es":"Banco de Desarrollo Banrural","brand:wikidata":"Q5719130","brand:wikipedia":"es:Banrural",name:"Banco de Desarrollo Banrural","name:en":"Bank of Banrural Development","name:es":"Banco de Desarrollo Banrural"},countryCodes:["gt"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco de Fomento Angola (BFA)":{name:"Banco de Fomento Angola (BFA)",icon:"maki-bank",imageURL:"https://graph.facebook.com/Banco.BFA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q806197",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco de Fomento Angola (BFA)","brand:en":"Angola Development Bank (BFA)","brand:es":"Banco de Fomento Angola (BFA)","brand:wikidata":"Q806197","brand:wikipedia":"de:Banco de Fomento Angola",name:"Banco de Fomento Angola (BFA)","name:en":"Angola Development Bank (BFA)","name:es":"Banco de Fomento Angola (BFA)"},countryCodes:["ao"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco de Occidente":{name:"Banco de Occidente",icon:"maki-bank",imageURL:"https://graph.facebook.com/BcoOccidente/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4854127",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco de Occidente","brand:wikidata":"Q4854127","brand:wikipedia":"es:Banco de Occidente (Colombia)",name:"Banco de Occidente"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco de Venezuela":{name:"Banco de Venezuela",icon:"maki-bank",imageURL:"https://graph.facebook.com/BancodeVenezuelaOficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q517093",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco de Venezuela","brand:wikidata":"Q517093","brand:wikipedia":"es:Banco de Venezuela",name:"Banco de Venezuela"},countryCodes:["ve"],terms:["de venezuela"],matchScore:2,suggestion:true},"amenity/bank/Banco de la Nación (Argentina)":{name:"Banco de la Nación (Argentina)",icon:"maki-bank",imageURL:"https://graph.facebook.com/banconacion/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2883376",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco de la Nación","brand:wikidata":"Q2883376","brand:wikipedia":"en:Banco de la Nación Argentina",name:"Banco de la Nación"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco de la Nación (Peru)":{name:"Banco de la Nación (Peru)",icon:"maki-bank",imageURL:"https://graph.facebook.com/BancodelaNacion/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4856206",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco de la Nación","brand:wikidata":"Q4856206","brand:wikipedia":"en:Bank of the Nation (Peru)",name:"Banco de la Nación"},countryCodes:["pe"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco del Austro":{name:"Banco del Austro",icon:"maki-bank",imageURL:"https://graph.facebook.com/bancodelaustro/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62122344",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco del Austro","brand:wikidata":"Q62122344",name:"Banco del Austro"},countryCodes:["ec"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco di Napoli":{name:"Banco di Napoli",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3633835",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco di Napoli","brand:wikidata":"Q3633835","brand:wikipedia":"en:Banco di Napoli",name:"Banco di Napoli"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco di Sardegna":{name:"Banco di Sardegna",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q806205",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco di Sardegna","brand:wikidata":"Q806205","brand:wikipedia":"en:Banco di Sardegna",name:"Banco di Sardegna"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco do Brasil":{name:"Banco do Brasil",icon:"maki-bank",imageURL:"https://graph.facebook.com/bancodobrasil/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q610817",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco do Brasil","brand:wikidata":"Q610817","brand:wikipedia":"en:Banco do Brasil",name:"Banco do Brasil"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco do Nordeste":{name:"Banco do Nordeste",icon:"maki-bank",imageURL:"https://graph.facebook.com/bancodonordeste/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4854137",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco do Nordeste","brand:wikidata":"Q4854137","brand:wikipedia":"en:Banco do Nordeste",name:"Banco do Nordeste"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bancolombia":{name:"Bancolombia",icon:"maki-bank",imageURL:"https://graph.facebook.com/bancolombia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q806206",amenity:"bank"},addTags:{amenity:"bank",brand:"Bancolombia","brand:wikidata":"Q806206","brand:wikipedia":"en:Bancolombia",name:"Bancolombia"},countryCodes:["co"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bancomer":{name:"Bancomer",icon:"maki-bank",imageURL:"https://graph.facebook.com/BBVASeguros.mx/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2876794",amenity:"bank"},addTags:{amenity:"bank",brand:"Bancomer","brand:wikidata":"Q2876794","brand:wikipedia":"en:BBVA Bancomer",name:"Bancomer"},countryCodes:["mx"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bancpost":{name:"Bancpost",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q4854143",amenity:"bank"},addTags:{amenity:"bank",brand:"Bancpost","brand:wikidata":"Q4854143","brand:wikipedia":"ro:Bancpost",name:"Bancpost"},countryCodes:["ro"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banesco":{name:"Banesco",icon:"maki-bank",imageURL:"https://graph.facebook.com/BanescoBancoUniversal/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4854841",amenity:"bank"},addTags:{amenity:"bank",brand:"Banesco","brand:wikidata":"Q4854841","brand:wikipedia":"en:Banesco",name:"Banesco"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Bangkok Bank":{name:"Bangkok Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/371998329537690/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q806483",amenity:"bank"},addTags:{amenity:"bank",brand:"Bangkok Bank","brand:wikidata":"Q806483","brand:wikipedia":"en:Bangkok Bank",name:"Bangkok Bank"},countryCodes:["th"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank Al Habib":{name:"Bank Al Habib",icon:"maki-bank",imageURL:"https://graph.facebook.com/bankalhabiblimited/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4034833",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank Al Habib","brand:wikidata":"Q4034833","brand:wikipedia":"ur:بينک الحبيب لمیٹڈ",name:"Bank Al Habib"},countryCodes:["pk"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank Alfalah":{name:"Bank Alfalah",icon:"maki-bank",imageURL:"https://graph.facebook.com/BankAlfalahOfficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4855895",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank Alfalah","brand:wikidata":"Q4855895","brand:wikipedia":"en:Bank Alfalah",name:"Bank Alfalah"},countryCodes:["pk"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank Austria":{name:"Bank Austria",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/941602537043525632/UALD6dxn_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q697619",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank Austria","brand:wikidata":"Q697619","brand:wikipedia":"en:Bank Austria",name:"Bank Austria"},countryCodes:["at"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank Danamon":{name:"Bank Danamon",icon:"maki-bank",imageURL:"https://graph.facebook.com/DanamonIndonesia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4855913",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank Danamon","brand:wikidata":"Q4855913","brand:wikipedia":"en:Bank Danamon",name:"Bank Danamon"},countryCodes:["id"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank Mandiri":{name:"Bank Mandiri",icon:"maki-bank",imageURL:"https://graph.facebook.com/bankmandiricare/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q806639",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank Mandiri","brand:wikidata":"Q806639","brand:wikipedia":"en:Bank Mandiri",name:"Bank Mandiri"},countryCodes:["id"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank Mandiri Syariah":{name:"Bank Mandiri Syariah",icon:"maki-bank",imageURL:"https://graph.facebook.com/syariahmandiri/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12474533",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank Mandiri Syariah","brand:wikidata":"Q12474533","brand:wikipedia":"id:Bank Syariah Mandiri",name:"Bank Mandiri Syariah"},countryCodes:["id"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank Mega":{name:"Bank Mega",icon:"maki-bank",imageURL:"https://graph.facebook.com/BankMegaID/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12474504",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank Mega","brand:wikidata":"Q12474504","brand:wikipedia":"id:Bank Mega",name:"Bank Mega"},countryCodes:["id"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank Muamalat":{name:"Bank Muamalat",icon:"maki-bank",imageURL:"https://graph.facebook.com/BankMuamalatIndonesia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4855949",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank Muamalat","brand:wikidata":"Q4855949","brand:wikipedia":"en:Bank Muamalat",name:"Bank Muamalat"},countryCodes:["id","my"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank Pekao":{name:"Bank Pekao",icon:"maki-bank",imageURL:"https://graph.facebook.com/bankpekaosa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q806642",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank Pekao","brand:wikidata":"Q806642","brand:wikipedia":"pl:Bank Polska Kasa Opieki",name:"Bank Pekao"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank Rakyat":{name:"Bank Rakyat",icon:"maki-bank",imageURL:"https://graph.facebook.com/myBANKRAKYAT/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4855964",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank Rakyat","brand:wikidata":"Q4855964","brand:wikipedia":"ms:Bank Rakyat",name:"Bank Rakyat"},countryCodes:["my"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank of Africa":{name:"Bank of Africa",icon:"maki-bank",imageURL:"https://graph.facebook.com/bankofafrica/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2882627",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank of Africa","brand:wikidata":"Q2882627","brand:wikipedia":"en:Bank of Africa Group",name:"Bank of Africa",short_name:"BOA"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank of America":{name:"Bank of America",icon:"maki-bank",imageURL:"https://graph.facebook.com/BankofAmerica/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q487907",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank of America","brand:wikidata":"Q487907","brand:wikipedia":"en:Bank of America",name:"Bank of America"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank of Baroda":{name:"Bank of Baroda",icon:"maki-bank",imageURL:"https://graph.facebook.com/bankofbaroda/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2003797",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank of Baroda","brand:wikidata":"Q2003797","brand:wikipedia":"en:Bank of Baroda",name:"Bank of Baroda"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank of Ceylon":{name:"Bank of Ceylon",icon:"maki-bank",imageURL:"https://graph.facebook.com/BANKOFCEYLON/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2882652",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank of Ceylon","brand:wikidata":"Q2882652","brand:wikipedia":"en:Bank of Ceylon",name:"Bank of Ceylon"},countryCodes:["lk"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank of Commerce":{name:"Bank of Commerce",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q4856092",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank of Commerce","brand:wikidata":"Q4856092","brand:wikipedia":"en:Bank of Commerce",name:"Bank of Commerce"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank of Cyprus":{name:"Bank of Cyprus",icon:"maki-bank",imageURL:"https://graph.facebook.com/BankofCyprusOfficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q806678",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank of Cyprus","brand:wikidata":"Q806678","brand:wikipedia":"en:Bank of Cyprus",name:"Bank of Cyprus"},countryCodes:["cy","gr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank of India":{name:"Bank of India",icon:"maki-bank",imageURL:"https://graph.facebook.com/BankOfIndia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2004439",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank of India","brand:wikidata":"Q2004439","brand:wikipedia":"en:Bank of India",name:"Bank of India"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank of Ireland":{name:"Bank of Ireland",icon:"maki-bank",imageURL:"https://graph.facebook.com/BankofIreland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q806689",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank of Ireland","brand:wikidata":"Q806689","brand:wikipedia":"en:Bank of Ireland",name:"Bank of Ireland"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank of Maharashtra":{name:"Bank of Maharashtra",icon:"maki-bank",imageURL:"https://graph.facebook.com/BOM1685/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2004304",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank of Maharashtra","brand:wikidata":"Q2004304","brand:wikipedia":"en:Bank of Maharashtra",name:"Bank of Maharashtra"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank of New Zealand":{name:"Bank of New Zealand",icon:"maki-bank",imageURL:"https://graph.facebook.com/BNZBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q806687",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank of New Zealand","brand:wikidata":"Q806687","brand:wikipedia":"en:Bank of New Zealand",name:"Bank of New Zealand"},countryCodes:["nz"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank of Scotland":{name:"Bank of Scotland",icon:"maki-bank",imageURL:"https://graph.facebook.com/bankofscotland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q627381",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank of Scotland","brand:wikidata":"Q627381","brand:wikipedia":"en:Bank of Scotland",name:"Bank of Scotland"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank of the West":{name:"Bank of the West",icon:"maki-bank",imageURL:"https://graph.facebook.com/BankoftheWest/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2881919",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank of the West","brand:wikidata":"Q2881919","brand:wikipedia":"en:Bank of the West",name:"Bank of the West"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bankia":{name:"Bankia",icon:"maki-bank",imageURL:"https://graph.facebook.com/bankia.es/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q806807",amenity:"bank"},addTags:{amenity:"bank",brand:"Bankia","brand:wikidata":"Q806807","brand:wikipedia":"en:Bankia",name:"Bankia"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bankinter":{name:"Bankinter",icon:"maki-bank",imageURL:"https://graph.facebook.com/bankinter/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q806808",amenity:"bank"},addTags:{amenity:"bank",brand:"Bankinter","brand:wikidata":"Q806808","brand:wikipedia":"es:Bankinter",name:"Bankinter"},countryCodes:["es","pt"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bankwest":{name:"Bankwest",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q4856817",amenity:"bank"},addTags:{amenity:"bank",brand:"Bankwest","brand:wikidata":"Q4856817","brand:wikipedia":"en:Bankwest",name:"Bankwest"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banner Bank":{name:"Banner Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/bannerbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4856910",amenity:"bank"},addTags:{amenity:"bank",brand:"Banner Bank","brand:wikidata":"Q4856910","brand:wikipedia":"en:Banner Bank",name:"Banner Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banorte":{name:"Banorte",icon:"maki-bank",imageURL:"https://graph.facebook.com/banorte/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q806914",amenity:"bank"},addTags:{amenity:"bank",brand:"Banorte","brand:wikidata":"Q806914","brand:wikipedia":"en:Banorte",name:"Banorte"},countryCodes:["mx"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banque Atlantique":{name:"Banque Atlantique",icon:"maki-bank",imageURL:"https://graph.facebook.com/BqAtlantiqueOfficiel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2882890",amenity:"bank"},addTags:{amenity:"bank",brand:"Banque Atlantique","brand:wikidata":"Q2882890","brand:wikipedia":"en:Atlantic Bank Group",name:"Banque Atlantique"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Banque Laurentienne":{name:"Banque Laurentienne",icon:"maki-bank",imageURL:"https://graph.facebook.com/BLaurentienne/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1360087",amenity:"bank"},addTags:{amenity:"bank",brand:"Banque Laurentienne","brand:wikidata":"Q1360087","brand:wikipedia":"en:Laurentian Bank of Canada",name:"Banque Laurentienne"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banque Nationale (Canada)":{name:"Banque Nationale (Canada)",icon:"maki-bank",imageURL:"https://graph.facebook.com/banquenationale/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q634298",amenity:"bank"},addTags:{amenity:"bank",brand:"Banque Nationale","brand:wikidata":"Q634298","brand:wikipedia":"en:National Bank of Canada",name:"Banque Nationale"},countryCodes:["ca"],terms:["banque nationale du canada","national bank of canada"],matchScore:2,suggestion:true},"amenity/bank/Banque Populaire":{name:"Banque Populaire",icon:"maki-bank",imageURL:"https://graph.facebook.com/PopulaireEtDigitale/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2883441",amenity:"bank"},addTags:{amenity:"bank",brand:"Banque Populaire","brand:wikidata":"Q2883441","brand:wikipedia":"en:Banque Populaire du Maroc",name:"Banque Populaire"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Banrisul":{name:"Banrisul",icon:"maki-bank",imageURL:"https://graph.facebook.com/banrisul/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4857098",amenity:"bank"},addTags:{amenity:"bank",brand:"Banrisul","brand:wikidata":"Q4857098","brand:wikipedia":"en:Banrisul",name:"Banrisul"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banrural":{name:"Banrural",icon:"maki-bank",imageURL:"https://graph.facebook.com/BanruralHonduras/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5719130",amenity:"bank"},addTags:{amenity:"bank",brand:"Banrural","brand:wikidata":"Q5719130","brand:wikipedia":"es:Banrural",name:"Banrural"},countryCodes:["gt","hn"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Barclays":{name:"Barclays",icon:"maki-bank",imageURL:"https://graph.facebook.com/BarclaysUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q245343",amenity:"bank"},addTags:{amenity:"bank",brand:"Barclays","brand:wikidata":"Q245343","brand:wikipedia":"en:Barclays",name:"Barclays"},terms:["barclays bank"],matchScore:2,suggestion:true},"amenity/bank/Bcc":{name:"Bcc",icon:"maki-bank",imageURL:"https://graph.facebook.com/BCCRomaOfficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q25060394",amenity:"bank"},addTags:{amenity:"bank",brand:"Bcc","brand:wikidata":"Q25060394","brand:wikipedia":"en:Banca di Credito Cooperativo di Roma",name:"Bcc"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Belfius":{name:"Belfius",icon:"maki-bank",imageURL:"https://graph.facebook.com/belfius/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1956014",amenity:"bank"},addTags:{amenity:"bank",brand:"Belfius","brand:wikidata":"Q1956014","brand:wikipedia":"en:Belfius",name:"Belfius"},countryCodes:["be"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bendigo Bank":{name:"Bendigo Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/BendigoBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4887077",amenity:"bank"},addTags:{amenity:"bank",brand:"Bendigo Bank","brand:wikidata":"Q4887077","brand:wikipedia":"en:Bendigo and Adelaide Bank",name:"Bendigo Bank"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Berliner Volksbank":{name:"Berliner Volksbank",icon:"maki-bank",imageURL:"https://graph.facebook.com/BerlinerVolksbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q821855",amenity:"bank"},addTags:{amenity:"bank",brand:"Berliner Volksbank","brand:wikidata":"Q821855","brand:wikipedia":"de:Berliner Volksbank",name:"Berliner Volksbank"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bicentenario":{name:"Bicentenario",icon:"maki-bank",imageURL:"https://graph.facebook.com/BicentenarioBU/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5728123",amenity:"bank"},addTags:{amenity:"bank",brand:"Bicentenario","brand:wikidata":"Q5728123","brand:wikipedia":"es:Bicentenario Banco Universal",name:"Bicentenario"},countryCodes:["ve"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bicici":{name:"Bicici",icon:"maki-bank",imageURL:"https://graph.facebook.com/BICICIGroupeBNPParibas/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1667302",amenity:"bank"},addTags:{amenity:"bank",brand:"Bicici","brand:wikidata":"Q1667302","brand:wikipedia":"fr:Banque internationale pour le commerce et l'industrie de la Côte d'Ivoire",name:"Bicici"},countryCodes:["ci"],terms:["agence bicici"],matchScore:2,suggestion:true},"amenity/bank/Bradesco":{name:"Bradesco",icon:"maki-bank",imageURL:"https://graph.facebook.com/bradesco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q806181",amenity:"bank"},addTags:{amenity:"bank",brand:"Bradesco","brand:wikidata":"Q806181","brand:wikipedia":"en:Banco Bradesco",name:"Bradesco"},countryCodes:["br"],terms:["banco bradesco"],matchScore:2,suggestion:true},"amenity/bank/Budapest Bank":{name:"Budapest Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/budapestbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q27493463",amenity:"bank"},addTags:{amenity:"bank",brand:"Budapest Bank","brand:wikidata":"Q27493463","brand:wikipedia":"en:Budapest Bank",name:"Budapest Bank"},countryCodes:["hu"],terms:[],matchScore:2,suggestion:true},"amenity/bank/CBAO":{name:"CBAO",icon:"maki-bank",imageURL:"https://graph.facebook.com/161410284020244/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q532104",amenity:"bank"},addTags:{amenity:"bank",brand:"CBAO","brand:wikidata":"Q532104","brand:wikipedia":"fr:CBAO Groupe Attijariwafa bank",name:"CBAO"},countryCodes:["sn"],terms:[],matchScore:2,suggestion:true},"amenity/bank/CEC Bank":{name:"CEC Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q1023306",amenity:"bank"},addTags:{amenity:"bank",brand:"CEC Bank","brand:wikidata":"Q1023306","brand:wikipedia":"en:CEC Bank",name:"CEC Bank"},countryCodes:["ro"],terms:[],matchScore:2,suggestion:true},"amenity/bank/CIB Bank":{name:"CIB Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/with.cib.hu/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q839566",amenity:"bank"},addTags:{amenity:"bank",brand:"CIB Bank","brand:wikidata":"Q839566","brand:wikipedia":"en:CIB Bank",name:"CIB Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/CIBC":{name:"CIBC",icon:"maki-bank",imageURL:"https://graph.facebook.com/CIBC/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q666694",amenity:"bank"},addTags:{amenity:"bank",brand:"CIBC","brand:wikidata":"Q666694","brand:wikipedia":"en:Canadian Imperial Bank of Commerce",name:"CIBC"},countryCodes:["ca"],terms:["cibc banking centre"],matchScore:2,suggestion:true},"amenity/bank/CIC":{name:"CIC",icon:"maki-bank",imageURL:"https://graph.facebook.com/cic/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q746525",amenity:"bank"},addTags:{amenity:"bank",brand:"CIC","brand:wikidata":"Q746525","brand:wikipedia":"en:Crédit Industriel et Commercial",name:"CIC"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/CIH Bank":{name:"CIH Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/cihbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3006220",amenity:"bank"},addTags:{amenity:"bank",brand:"CIH Bank","brand:wikidata":"Q3006220","brand:wikipedia":"en:CIH Bank",name:"CIH Bank"},countryCodes:["ma"],terms:[],matchScore:2,suggestion:true},"amenity/bank/CIMB Bank":{name:"CIMB Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/CIMBMalaysia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3045976",amenity:"bank"},addTags:{amenity:"bank",brand:"CIMB Bank","brand:wikidata":"Q3045976","brand:wikipedia":"en:CIMB",name:"CIMB Bank"},countryCodes:["my"],terms:[],matchScore:2,suggestion:true},"amenity/bank/CIMB Niaga":{name:"CIMB Niaga",icon:"maki-bank",imageURL:"https://graph.facebook.com/CIMBIndonesia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5011747",amenity:"bank"},addTags:{amenity:"bank",brand:"CIMB Niaga","brand:wikidata":"Q5011747","brand:wikipedia":"en:CIMB Niaga",name:"CIMB Niaga"},countryCodes:["id"],terms:[],matchScore:2,suggestion:true},"amenity/bank/CNEP":{name:"CNEP",icon:"maki-bank",imageURL:"https://graph.facebook.com/CNEPOfficielle/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2931752",amenity:"bank"},addTags:{amenity:"bank",brand:"CNEP","brand:wikidata":"Q2931752","brand:wikipedia":"fr:CNEP-Banque",name:"CNEP"},countryCodes:["dz"],terms:[],matchScore:2,suggestion:true},"amenity/bank/CRDB Bank":{name:"CRDB Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/crdbbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5013848",amenity:"bank"},addTags:{amenity:"bank",brand:"CRDB Bank","brand:wikidata":"Q5013848","brand:wikipedia":"en:CRDB Bank",name:"CRDB Bank"},countryCodes:["tz"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Caisse Desjardins":{name:"Caisse Desjardins",icon:"maki-bank",imageURL:"https://graph.facebook.com/desjardins/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2933350",amenity:"bank"},addTags:{amenity:"bank",brand:"Caisse Desjardins","brand:wikidata":"Q2933350","brand:wikipedia":"en:Desjardins Group",name:"Caisse Desjardins"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Caisse d'Épargne":{name:"Caisse d'Épargne",icon:"maki-bank",imageURL:"https://graph.facebook.com/Caisse.Epargne/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1547738",amenity:"bank"},addTags:{amenity:"bank",brand:"Caisse d'Épargne","brand:wikidata":"Q1547738","brand:wikipedia":"en:Groupe Caisse d'Épargne",name:"Caisse d'Épargne"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Caixa Econômica Federal (Brazil)":{name:"Caixa Econômica Federal (Brazil)",icon:"maki-bank",imageURL:"https://graph.facebook.com/caixa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q835283",amenity:"bank"},addTags:{amenity:"bank",brand:"Caixa Econômica Federal","brand:wikidata":"Q835283","brand:wikipedia":"pt:Caixa Econômica Federal",name:"Caixa Econômica Federal"},countryCodes:["br"],terms:["caixa","caixabank"],matchScore:2,suggestion:true},"amenity/bank/Caixa Geral de Depósitos":{name:"Caixa Geral de Depósitos",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCaixa%20Geral%20de%20Dep%C3%B3sitos%20logo.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1026044",amenity:"bank"},addTags:{amenity:"bank",brand:"Caixa Geral de Depósitos","brand:wikidata":"Q1026044","brand:wikipedia":"pt:Caixa Geral de Depósitos",name:"Caixa Geral de Depósitos"},countryCodes:["es","fr","pt"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Caixabank (Spain)":{name:"Caixabank (Spain)",icon:"maki-bank",imageURL:"https://graph.facebook.com/CaixaBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q847225",amenity:"bank"},addTags:{amenity:"bank",brand:"Caixabank","brand:wikidata":"Q847225","brand:wikipedia":"en:CaixaBank",name:"Caixabank"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Caja Duero":{name:"Caja Duero",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3821055",amenity:"bank"},addTags:{amenity:"bank",brand:"Caja Duero","brand:wikidata":"Q3821055","brand:wikipedia":"es:Caja Duero",name:"Caja Duero"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Caja España":{name:"Caja España",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q966985",amenity:"bank"},addTags:{amenity:"bank",brand:"Caja España","brand:wikidata":"Q966985","brand:wikipedia":"es:Caja España",name:"Caja España"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Caja Rural":{name:"Caja Rural",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCaja%20Rural.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q3649971",amenity:"bank"},addTags:{amenity:"bank",brand:"Caja Rural","brand:wikidata":"Q3649971","brand:wikipedia":"es:Caja Rural",name:"Caja Rural"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Caja Rural de Jaén":{name:"Caja Rural de Jaén",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCaja%20Rural.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q18720350",amenity:"bank"},addTags:{amenity:"bank",brand:"Caja Rural de Jaén","brand:wikidata":"Q18720350","brand:wikipedia":"es:Caja Rural de Jaén",name:"Caja Rural de Jaén"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/CajaSur":{name:"CajaSur",icon:"maki-bank",imageURL:"https://graph.facebook.com/Cajasur/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3751637",amenity:"bank"},addTags:{amenity:"bank",brand:"CajaSur","brand:wikidata":"Q3751637","brand:wikipedia":"en:CajaSur",name:"CajaSur"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Cajamar":{name:"Cajamar",icon:"maki-bank",imageURL:"https://graph.facebook.com/cajamar/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q8254971",amenity:"bank"},addTags:{amenity:"bank",brand:"Cajamar","brand:wikidata":"Q8254971","brand:wikipedia":"es:Cajamar",name:"Cajamar"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Canara Bank":{name:"Canara Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/canarabank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2003777",amenity:"bank"},addTags:{amenity:"bank",brand:"Canara Bank","brand:wikidata":"Q2003777","brand:wikipedia":"en:Canara Bank",name:"Canara Bank"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Capital Bank":{name:"Capital Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5035481",amenity:"bank"},addTags:{amenity:"bank",brand:"Capital Bank","brand:wikidata":"Q5035481","brand:wikipedia":"en:Capital Bank Financial",name:"Capital Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Capital One":{name:"Capital One",icon:"maki-bank",imageURL:"https://graph.facebook.com/capitalone/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1034654",amenity:"bank"},addTags:{amenity:"bank",brand:"Capital One","brand:wikidata":"Q1034654","brand:wikipedia":"en:Capital One",name:"Capital One"},countryCodes:["us"],terms:["capital one bank"],matchScore:2,suggestion:true},"amenity/bank/Carige":{name:"Carige",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/608212417395499008/oUMlcP6e_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q3633695",amenity:"bank"},addTags:{amenity:"bank",brand:"Carige","brand:wikidata":"Q3633695","brand:wikipedia":"en:Banca Carige",name:"Carige"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Cariparma":{name:"Cariparma",icon:"maki-bank",imageURL:"https://graph.facebook.com/CreditAgricoleItalia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2938832",amenity:"bank"},addTags:{amenity:"bank",brand:"Cariparma","brand:wikidata":"Q2938832","brand:wikipedia":"en:Crédit Agricole Italia",name:"Cariparma"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Carisbo":{name:"Carisbo",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3661937",amenity:"bank"},addTags:{amenity:"bank",brand:"Carisbo","brand:wikidata":"Q3661937","brand:wikipedia":"en:Cassa di Risparmio in Bologna",name:"Carisbo"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Cassa di Risparmio del Veneto":{name:"Cassa di Risparmio del Veneto",icon:"maki-bank",imageURL:"https://graph.facebook.com/CassadiRisparmiodelVeneto/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3661909",amenity:"bank"},addTags:{amenity:"bank",brand:"Cassa di Risparmio del Veneto","brand:wikidata":"Q3661909","brand:wikipedia":"en:Cassa di Risparmio del Veneto",name:"Cassa di Risparmio del Veneto"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/CatalunyaCaixa":{name:"CatalunyaCaixa",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20cx%20original.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q3750952",amenity:"bank"},addTags:{amenity:"bank",brand:"CatalunyaCaixa","brand:wikidata":"Q3750952","brand:wikipedia":"en:CatalunyaCaixa",name:"CatalunyaCaixa"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Cathay Bank":{name:"Cathay Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/cathaybank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4189507",amenity:"bank"},addTags:{amenity:"bank",brand:"Cathay Bank","brand:wikidata":"Q4189507","brand:wikipedia":"en:Cathay Bank",name:"Cathay Bank"},countryCodes:["cn","tw","us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Central Bank of India":{name:"Central Bank of India",icon:"maki-bank",imageURL:"https://graph.facebook.com/CentralBankofIndia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2007090",amenity:"bank"},addTags:{amenity:"bank",brand:"Central Bank of India","brand:wikidata":"Q2007090","brand:wikipedia":"en:Central Bank of India",name:"Central Bank of India"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Chase":{name:"Chase",icon:"maki-bank",imageURL:"https://graph.facebook.com/chase/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q524629",amenity:"bank"},addTags:{amenity:"bank",brand:"Chase","brand:wikidata":"Q524629","brand:wikipedia":"en:Chase Bank",name:"Chase"},terms:["chase bank"],matchScore:2,suggestion:true},"amenity/bank/China Bank":{name:"China Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/chinabank.ph/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5100080",amenity:"bank"},addTags:{amenity:"bank",brand:"China Bank","brand:wikidata":"Q5100080","brand:wikipedia":"en:Chinabank",name:"China Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/China Bank Savings":{name:"China Bank Savings",icon:"maki-bank",imageURL:"https://graph.facebook.com/cbschinabanksavings/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q18387359",amenity:"bank"},addTags:{amenity:"bank",brand:"China Bank Savings","brand:wikidata":"Q18387359","brand:wikipedia":"en:China Bank Savings",name:"China Bank Savings"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/bank/China Construction Bank":{name:"China Construction Bank",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FChina%20Construction%20Bank%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q26299",amenity:"bank"},addTags:{amenity:"bank",brand:"China Construction Bank","brand:wikidata":"Q26299","brand:wikipedia":"en:China Construction Bank",name:"China Construction Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Citibank":{name:"Citibank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1138902469201801216/kIpfpW_m_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q857063",amenity:"bank"},addTags:{amenity:"bank",brand:"Citibank","brand:wikidata":"Q857063","brand:wikipedia":"en:Citibank",name:"Citibank",short_name:"Citi"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Citizens Bank (Eastern USA)":{name:"Citizens Bank (Eastern USA)",icon:"maki-bank",imageURL:"https://graph.facebook.com/citizensbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5122694",amenity:"bank"},addTags:{amenity:"bank",brand:"Citizens Bank","brand:wikidata":"Q5122694","brand:wikipedia":"en:Citizens Financial Group",name:"Citizens Bank",short_name:"Citizens"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Citizens Bank (Kentucky)":{name:"Citizens Bank (Kentucky)",icon:"maki-bank",imageURL:"https://graph.facebook.com/citizensbankofkentucky/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5122711",amenity:"bank"},addTags:{alt_name:"Citizens Bank of Kentucky",amenity:"bank",brand:"Citizens Bank","brand:wikidata":"Q5122711","brand:wikipedia":"en:Citizens National Bank (Eastern Kentucky)",name:"Citizens Bank",official_name:"Citizens National Bank",short_name:"Citizens"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Citizens Bank (Nepal)":{name:"Citizens Bank (Nepal)",icon:"maki-bank",imageURL:"https://graph.facebook.com/ctznbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q13186934",amenity:"bank"},addTags:{amenity:"bank",brand:"Citizens Bank International","brand:wikidata":"Q13186934","brand:wikipedia":"en:Citizens Bank International",name:"Citizens Bank",official_name:"Citizens Bank International Ltd.",short_name:"Citizens"},countryCodes:["np"],terms:[],matchScore:2,suggestion:true},"amenity/bank/City National Bank (California)":{name:"City National Bank (California)",icon:"maki-bank",imageURL:"https://graph.facebook.com/CityNationalBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5123314",amenity:"bank"},addTags:{amenity:"bank",brand:"City National Bank","brand:wikidata":"Q5123314","brand:wikipedia":"en:City National Bank (California)",name:"City National Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/City National Bank (Florida)":{name:"City National Bank (Florida)",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1098260637703172096/um-tzWqP_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q16958644",amenity:"bank"},addTags:{amenity:"bank",brand:"City National Bank","brand:wikidata":"Q16958644","brand:wikipedia":"en:City National Bank of Florida",name:"City National Bank",official_name:"City National Bank of Florida"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Clydesdale Bank":{name:"Clydesdale Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/clydesdalebank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q971680",amenity:"bank"},addTags:{amenity:"bank",brand:"Clydesdale Bank","brand:wikidata":"Q971680","brand:wikipedia":"en:Clydesdale Bank",name:"Clydesdale Bank"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Coast Capital Savings":{name:"Coast Capital Savings",icon:"maki-bank",imageURL:"https://graph.facebook.com/coastcapitalsavings/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5138088",amenity:"bank"},addTags:{amenity:"bank",brand:"Coast Capital Savings","brand:wikidata":"Q5138088","brand:wikipedia":"en:Coast Capital Savings",name:"Coast Capital Savings",official_name:"Coast Capital Savings Federal Credit Union"},countryCodes:["ca"],terms:["coast capital","coast capital savings credit union"],matchScore:2,suggestion:true},"amenity/bank/Columbia Bank (New Jersey)":{name:"Columbia Bank (New Jersey)",icon:"maki-bank",imageURL:"https://graph.facebook.com/columbiabank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62084096",amenity:"bank"},addTags:{amenity:"bank",brand:"Columbia Bank","brand:wikidata":"Q62084096",name:"Columbia Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Columbia Bank (Washington)":{name:"Columbia Bank (Washington)",icon:"maki-bank",imageURL:"https://graph.facebook.com/columbiastatebank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62084089",amenity:"bank"},addTags:{amenity:"bank",brand:"Columbia Bank","brand:wikidata":"Q62084089",name:"Columbia Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Comerica Bank":{name:"Comerica Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/comerica/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1114148",amenity:"bank"},addTags:{amenity:"bank",brand:"Comerica Bank","brand:wikidata":"Q1114148","brand:wikipedia":"en:Comerica",name:"Comerica Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Commercial Bank of Ceylon PLC":{name:"Commercial Bank of Ceylon PLC",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5152468",amenity:"bank"},addTags:{amenity:"bank",brand:"Commercial Bank of Ceylon PLC","brand:wikidata":"Q5152468","brand:wikipedia":"en:Commercial Bank of Ceylon",name:"Commercial Bank of Ceylon PLC"},countryCodes:["lk"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Commerzbank":{name:"Commerzbank",icon:"maki-bank",imageURL:"https://graph.facebook.com/commerzbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q157617",amenity:"bank"},addTags:{amenity:"bank",brand:"Commerzbank","brand:wikidata":"Q157617","brand:wikipedia":"en:Commerzbank",name:"Commerzbank"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Commonwealth Bank":{name:"Commonwealth Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/commonwealthbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q285328",amenity:"bank"},addTags:{amenity:"bank",brand:"Commonwealth Bank","brand:wikidata":"Q285328","brand:wikipedia":"en:Commonwealth Bank",name:"Commonwealth Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Community Bank":{name:"Community Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/communitybankna/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5154635",amenity:"bank"},addTags:{amenity:"bank",brand:"Community Bank","brand:wikidata":"Q5154635","brand:wikipedia":"en:Community Bank, N.A.",name:"Community Bank"},countryCodes:["de","us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Corporation Bank":{name:"Corporation Bank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1041960346926440448/31ZynavT_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q2003387",amenity:"bank"},addTags:{amenity:"bank",brand:"Corporation Bank","brand:wikidata":"Q2003387","brand:wikipedia":"en:Corporation Bank",name:"Corporation Bank"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Credem":{name:"Credem",icon:"maki-bank",imageURL:"https://graph.facebook.com/credem/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3696881",amenity:"bank"},addTags:{amenity:"bank",brand:"Credem","brand:wikidata":"Q3696881","brand:wikipedia":"en:Credito Emiliano",name:"Credem"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Credicoop":{name:"Credicoop",icon:"maki-bank",imageURL:"https://graph.facebook.com/bancocredicoopcl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4854086",amenity:"bank"},addTags:{amenity:"bank",brand:"Credicoop","brand:wikidata":"Q4854086","brand:wikipedia":"en:Banco Credicoop",name:"Credicoop"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Credit Suisse":{name:"Credit Suisse",icon:"maki-bank",imageURL:"https://graph.facebook.com/creditsuisse/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q372657",amenity:"bank"},addTags:{amenity:"bank",brand:"Credit Suisse","brand:wikidata":"Q372657","brand:wikipedia":"en:Credit Suisse",name:"Credit Suisse"},countryCodes:["ch"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Credito Valtellinese":{name:"Credito Valtellinese",icon:"maki-bank",imageURL:"https://graph.facebook.com/Creval/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3696888",amenity:"bank"},addTags:{amenity:"bank",brand:"Credito Valtellinese","brand:wikidata":"Q3696888","brand:wikipedia":"en:Credito Valtellinese",name:"Credito Valtellinese"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Crelan":{name:"Crelan",icon:"maki-bank",imageURL:"https://graph.facebook.com/Crelan.Banque/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q389872",amenity:"bank"},addTags:{amenity:"bank",brand:"Crelan","brand:wikidata":"Q389872","brand:wikipedia":"en:Crelan",name:"Crelan"},countryCodes:["be"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Crédit Agricole":{name:"Crédit Agricole",icon:"maki-bank",imageURL:"https://graph.facebook.com/CreditAgricole/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q590952",amenity:"bank"},addTags:{amenity:"bank",brand:"Crédit Agricole","brand:wikidata":"Q590952","brand:wikipedia":"fr:Crédit agricole",name:"Crédit Agricole"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Crédit Maritime":{name:"Crédit Maritime",icon:"maki-bank",imageURL:"https://graph.facebook.com/CreditMaritimeGrandOuest/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17176866",amenity:"bank"},addTags:{amenity:"bank",brand:"Crédit Maritime","brand:wikidata":"Q17176866","brand:wikipedia":"fr:Crédit maritime",name:"Crédit Maritime"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Crédit Mutuel":{name:"Crédit Mutuel",icon:"maki-bank",imageURL:"https://graph.facebook.com/creditmutuel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q642627",amenity:"bank"},addTags:{amenity:"bank",brand:"Crédit Mutuel","brand:wikidata":"Q642627","brand:wikipedia":"en:Crédit Mutuel",name:"Crédit Mutuel"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Crédit Mutuel de Bretagne":{name:"Crédit Mutuel de Bretagne",icon:"maki-bank",imageURL:"https://graph.facebook.com/GroupeArkea/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3006236",amenity:"bank"},addTags:{amenity:"bank",brand:"Crédit Mutuel de Bretagne","brand:wikidata":"Q3006236","brand:wikipedia":"fr:Crédit mutuel Arkéa",name:"Crédit Mutuel de Bretagne"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Crédit du Nord":{name:"Crédit du Nord",icon:"maki-bank",imageURL:"https://graph.facebook.com/creditdunord/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3006209",amenity:"bank"},addTags:{amenity:"bank",brand:"Crédit du Nord","brand:wikidata":"Q3006209","brand:wikipedia":"en:Crédit du Nord",name:"Crédit du Nord"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Crédito Agrícola":{name:"Crédito Agrícola",icon:"maki-bank",imageURL:"https://graph.facebook.com/grupocreditoagricola/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10262017",amenity:"bank"},addTags:{amenity:"bank",brand:"Crédito Agrícola","brand:wikidata":"Q10262017","brand:wikipedia":"pt:Crédito Agrícola",name:"Crédito Agrícola"},countryCodes:["pt"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Danske Bank":{name:"Danske Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/DanskeBankDanmark/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1636974",amenity:"bank"},addTags:{amenity:"bank",brand:"Danske Bank","brand:wikidata":"Q1636974","brand:wikipedia":"en:Danske Bank",name:"Danske Bank"},countryCodes:["dk","fi","gb","lt","no","se"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Davivienda":{name:"Davivienda",icon:"maki-bank",imageURL:"https://graph.facebook.com/BancoDavivienda/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5242054",amenity:"bank"},addTags:{amenity:"bank",brand:"Davivienda","brand:wikidata":"Q5242054","brand:wikipedia":"en:Davivienda",name:"Davivienda"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Denizbank":{name:"Denizbank",icon:"maki-bank",imageURL:"https://graph.facebook.com/DenizBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1115064",amenity:"bank"},addTags:{amenity:"bank",brand:"Denizbank","brand:wikidata":"Q1115064","brand:wikipedia":"en:DenizBank",name:"Denizbank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Desjardins":{name:"Desjardins",icon:"maki-bank",imageURL:"https://graph.facebook.com/desjardins/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2933350",amenity:"bank"},addTags:{amenity:"bank",brand:"Desjardins","brand:wikidata":"Q2933350","brand:wikipedia":"en:Desjardins Group",name:"Desjardins"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Deutsche Bank":{name:"Deutsche Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/DeutscheBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q66048",amenity:"bank"},addTags:{amenity:"bank",brand:"Deutsche Bank","brand:wikidata":"Q66048","brand:wikipedia":"en:Deutsche Bank",name:"Deutsche Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Dollar Bank":{name:"Dollar Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/dollarbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5289205",amenity:"bank"},addTags:{amenity:"bank",brand:"Dollar Bank","brand:wikidata":"Q5289205","brand:wikipedia":"en:Dollar Bank",name:"Dollar Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Dubai Islamic Bank":{name:"Dubai Islamic Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/dib.uae/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5310570",amenity:"bank"},addTags:{amenity:"bank",brand:"Dubai Islamic Bank","brand:wikidata":"Q5310570","brand:wikipedia":"en:Dubai Islamic Bank",name:"Dubai Islamic Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/EastWest Bank":{name:"EastWest Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/EastWestBanker/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5327595",amenity:"bank"},addTags:{amenity:"bank",brand:"EastWest Bank","brand:wikidata":"Q5327595","brand:wikipedia":"en:EastWest Bank",name:"EastWest Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/EastWest Unibank":{name:"EastWest Unibank",icon:"maki-bank",imageURL:"https://graph.facebook.com/EastWestBanker/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5327595",amenity:"bank"},addTags:{amenity:"bank",brand:"EastWest Unibank","brand:wikidata":"Q5327595","brand:wikipedia":"en:EastWest Bank",name:"EastWest Unibank"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Ecobank":{name:"Ecobank",icon:"maki-bank",imageURL:"https://graph.facebook.com/EcobankGroup/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q930225",amenity:"bank"},addTags:{amenity:"bank",brand:"Ecobank","brand:wikidata":"Q930225","brand:wikipedia":"en:Ecobank",name:"Ecobank"},terms:["agence ecobank"],matchScore:2,suggestion:true},"amenity/bank/Emigrant Savings Bank":{name:"Emigrant Savings Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5371104",amenity:"bank"},addTags:{amenity:"bank",brand:"Emigrant Savings Bank","brand:wikidata":"Q5371104","brand:wikipedia":"en:Emigrant Savings Bank",name:"Emigrant Savings Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Emirates NBD":{name:"Emirates NBD",icon:"maki-bank",imageURL:"https://graph.facebook.com/EmiratesNBD/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5372575",amenity:"bank"},addTags:{amenity:"bank",brand:"Emirates NBD","brand:wikidata":"Q5372575","brand:wikipedia":"en:Emirates NBD",name:"Emirates NBD"},countryCodes:["ae"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Equity Bank (Congo)":{name:"Equity Bank (Congo)",icon:"maki-bank",imageURL:"https://graph.facebook.com/www.equitybank.cd/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q21178738",amenity:"bank"},addTags:{amenity:"bank",brand:"Equity Bank","brand:wikidata":"Q21178738","brand:wikipedia":"en:Equity Bank Congo",name:"Equity Bank"},countryCodes:["cd"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Equity Bank (Kenya)":{name:"Equity Bank (Kenya)",icon:"maki-bank",imageURL:"https://graph.facebook.com/KeEquityBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5384664",amenity:"bank"},addTags:{amenity:"bank",brand:"Equity Bank","brand:wikidata":"Q5384664","brand:wikipedia":"en:Equity Bank Kenya Limited",name:"Equity Bank"},countryCodes:["ke"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Equity Bank (Rwanda)":{name:"Equity Bank (Rwanda)",icon:"maki-bank",imageURL:"https://graph.facebook.com/RwEquityBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5384665",amenity:"bank"},addTags:{amenity:"bank",brand:"Equity Bank","brand:wikidata":"Q5384665","brand:wikipedia":"en:Equity Bank Rwanda Limited",name:"Equity Bank"},countryCodes:["rw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Equity Bank (South Sudan)":{name:"Equity Bank (South Sudan)",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5384666",amenity:"bank"},addTags:{amenity:"bank",brand:"Equity Bank","brand:wikidata":"Q5384666","brand:wikipedia":"en:Equity Bank South Sudan Limited",name:"Equity Bank"},countryCodes:["ss"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Equity Bank (Tanzania)":{name:"Equity Bank (Tanzania)",icon:"maki-bank",imageURL:"https://graph.facebook.com/TzEquityBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5384667",amenity:"bank"},addTags:{amenity:"bank",brand:"Equity Bank","brand:wikidata":"Q5384667","brand:wikipedia":"en:Equity Bank Tanzania Limited",name:"Equity Bank"},countryCodes:["tz"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Equity Bank (USA)":{name:"Equity Bank (USA)",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/624655695741366272/12-izccG_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q62260414",amenity:"bank"},addTags:{amenity:"bank",brand:"Equity Bank","brand:wikidata":"Q62260414",name:"Equity Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Equity Bank (Uganda)":{name:"Equity Bank (Uganda)",icon:"maki-bank",imageURL:"https://graph.facebook.com/UgEquityBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5384668",amenity:"bank"},addTags:{amenity:"bank",brand:"Equity Bank","brand:wikidata":"Q5384668","brand:wikipedia":"en:Equity Bank Uganda Limited",name:"Equity Bank"},countryCodes:["ug"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Erste Bank":{name:"Erste Bank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1008639007046107136/-MtFGuJT_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q696867",amenity:"bank"},addTags:{amenity:"bank",brand:"Erste Bank","brand:wikidata":"Q696867","brand:wikipedia":"de:Erste Bank",name:"Erste Bank"},countryCodes:["at","hr","hu"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Eurobank (Greece)":{name:"Eurobank (Greece)",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/928963286518910976/KZD7wKh9_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q951850",amenity:"bank"},addTags:{amenity:"bank",brand:"Eurobank","brand:wikidata":"Q951850","brand:wikipedia":"el:Eurobank",name:"Eurobank"},countryCodes:["gr"],terms:["eurobank ergasias"],matchScore:2,suggestion:true},"amenity/bank/Eurobank (Poland)":{name:"Eurobank (Poland)",icon:"maki-bank",imageURL:"https://graph.facebook.com/eurobanksa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q9256201",amenity:"bank"},addTags:{amenity:"bank",brand:"Eurobank","brand:wikidata":"Q9256201","brand:wikipedia":"pl:Euro Bank",name:"Eurobank"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Eurobank (Serbia)":{name:"Eurobank (Serbia)",icon:"maki-bank",imageURL:"https://graph.facebook.com/EurobankSrbija/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5411684",amenity:"bank"},addTags:{amenity:"bank",brand:"Eurobank","brand:wikidata":"Q5411684","brand:wikipedia":"sr:Eurobanka",name:"Eurobank"},countryCodes:["rs"],terms:[],matchScore:2,suggestion:true},"amenity/bank/FNB (South Africa)":{name:"FNB (South Africa)",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3072956",amenity:"bank"},addTags:{amenity:"bank",brand:"FNB","brand:wikidata":"Q3072956","brand:wikipedia":"en:First National Bank (South Africa)",name:"FNB",official_name:"First National Bank"},countryCodes:["bw","mz","na","us","za","zm"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Faysal Bank":{name:"Faysal Bank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1006473636620963842/3eFmAKr3_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q5439099",amenity:"bank"},addTags:{amenity:"bank",brand:"Faysal Bank","brand:wikidata":"Q5439099","brand:wikipedia":"en:Faysal Bank",name:"Faysal Bank"},countryCodes:["pk"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Federal Bank":{name:"Federal Bank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/2181568914/527318_348483655208805_236502029740302_986925_830235027_n_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q2044983",amenity:"bank"},addTags:{amenity:"bank",brand:"Federal Bank","brand:wikidata":"Q2044983","brand:wikipedia":"en:Federal Bank",name:"Federal Bank"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Fidelity Bank (Ghana)":{name:"Fidelity Bank (Ghana)",icon:"maki-bank",imageURL:"https://graph.facebook.com/fidelitybankgh/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5446778",amenity:"bank"},addTags:{amenity:"bank",brand:"Fidelity Bank","brand:wikidata":"Q5446778","brand:wikipedia":"en:Fidelity Bank Ghana",name:"Fidelity Bank"},countryCodes:["gh"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Fidelity Bank (Nigeria)":{name:"Fidelity Bank (Nigeria)",icon:"maki-bank",imageURL:"https://graph.facebook.com/FidelityBankplc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5446777",amenity:"bank"},addTags:{amenity:"bank",brand:"Fidelity Bank","brand:wikidata":"Q5446777","brand:wikipedia":"en:Fidelity Bank Nigeria",name:"Fidelity Bank"},countryCodes:["ng"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Fidelity Bank (USA)":{name:"Fidelity Bank (USA)",icon:"maki-bank",imageURL:"https://graph.facebook.com/fidelityinvestments/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1411292",amenity:"bank"},addTags:{amenity:"bank",brand:"Fidelity Bank","brand:wikidata":"Q1411292","brand:wikipedia":"en:Fidelity Investments",name:"Fidelity Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Fifth Third Bank":{name:"Fifth Third Bank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1135542453543550977/MGMFDH7x_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q1411810",amenity:"bank"},addTags:{amenity:"bank",brand:"Fifth Third Bank","brand:wikidata":"Q1411810","brand:wikipedia":"en:Fifth Third Bank",name:"Fifth Third Bank",short_name:"5/3 Bank"},countryCodes:["us"],terms:["5/3"],matchScore:2,suggestion:true},"amenity/bank/Finansbank":{name:"Finansbank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/815922892869423108/PEISbMWQ_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q1416237",amenity:"bank"},addTags:{amenity:"bank",brand:"Finansbank","brand:wikidata":"Q1416237","brand:wikipedia":"en:Finansbank",name:"Finansbank"},countryCodes:["tr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/First Bank (Western USA)":{name:"First Bank (Western USA)",icon:"maki-bank",imageURL:"https://graph.facebook.com/efirstbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5452217",amenity:"bank"},addTags:{amenity:"bank",brand:"First Bank","brand:wikidata":"Q5452217","brand:wikipedia":"en:FirstBank Holding Co",name:"First Bank",short_name:"1STBank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/First Citizens Bank (Trinidad and Tobago)":{name:"First Citizens Bank (Trinidad and Tobago)",icon:"maki-bank",imageURL:"https://graph.facebook.com/FirstCitizens/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5452734",amenity:"bank"},addTags:{amenity:"bank",brand:"First Citizens Bank","brand:wikidata":"Q5452734","brand:wikipedia":"en:First Citizens Bank (Trinidad and Tobago)",name:"First Citizens Bank"},countryCodes:["bb","tt"],terms:["1st citizens bank"],matchScore:2,suggestion:true},"amenity/bank/First Citizens Bank (USA)":{name:"First Citizens Bank (USA)",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/913797195782148096/Gps3Vaqp_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q5452733",amenity:"bank"},addTags:{amenity:"bank",brand:"First Citizens Bank","brand:wikidata":"Q5452733","brand:wikipedia":"en:First Citizens BancShares",name:"First Citizens Bank"},countryCodes:["us"],terms:["1st citizens bank"],matchScore:2,suggestion:true},"amenity/bank/First Financial Bank":{name:"First Financial Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/FirstFinancialBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5453009",amenity:"bank"},addTags:{amenity:"bank",brand:"First Financial Bank","brand:wikidata":"Q5453009","brand:wikipedia":"en:First Financial Bank (Ohio)",name:"First Financial Bank"},countryCodes:["us"],terms:["1st financial bank"],matchScore:2,suggestion:true},"amenity/bank/First Midwest Bank":{name:"First Midwest Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/FirstMidwest/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5453331",amenity:"bank"},addTags:{amenity:"bank",brand:"First Midwest Bank","brand:wikidata":"Q5453331","brand:wikipedia":"en:First Midwest Bank",name:"First Midwest Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/First National Bank (USA)":{name:"First National Bank (USA)",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5426765",amenity:"bank"},addTags:{amenity:"bank",brand:"First National Bank","brand:wikidata":"Q5426765","brand:wikipedia":"en:F.N.B. Corporation",name:"First National Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/First West Credit Union":{name:"First West Credit Union",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/2620760877/6gtc0ga7q8q9srd7tjvg_bigger.jpeg",geometry:["point","area"],tags:{"brand:wikidata":"Q5454073",amenity:"bank"},addTags:{alt_name:"First West",amenity:"bank",brand:"First West Credit Union","brand:wikidata":"Q5454073","brand:wikipedia":"en:First West Credit Union",name:"First West Credit Union"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Frost Bank":{name:"Frost Bank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1030111772605173762/949xGWES_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q5506152",amenity:"bank"},addTags:{amenity:"bank",brand:"Frost Bank","brand:wikidata":"Q5506152","brand:wikipedia":"en:Frost Bank",name:"Frost Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Fulton Bank":{name:"Fulton Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q16976594",amenity:"bank"},addTags:{amenity:"bank",brand:"Fulton Bank","brand:wikidata":"Q16976594",name:"Fulton Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/GCB Bank":{name:"GCB Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q1521346",amenity:"bank"},addTags:{amenity:"bank",brand:"GCB Bank","brand:wikidata":"Q1521346","brand:wikipedia":"en:GCB Bank",name:"GCB Bank"},countryCodes:["gh"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Galicia":{name:"Galicia",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBanco%20galicia%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q5717952",amenity:"bank"},addTags:{amenity:"bank",brand:"Galicia","brand:wikidata":"Q5717952","brand:wikipedia":"es:Banco Galicia",name:"Galicia"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Garanti":{name:"Garanti",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBBVA%202019.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q322962",amenity:"bank"},addTags:{amenity:"bank",brand:"Garanti","brand:wikidata":"Q322962","brand:wikipedia":"en:Garanti Bank",name:"Garanti"},countryCodes:["tr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Garanti Bankası":{name:"Garanti Bankası",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBBVA%202019.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q322962",amenity:"bank"},addTags:{amenity:"bank",brand:"Garanti Bankası","brand:wikidata":"Q322962","brand:wikipedia":"en:Garanti Bank",name:"Garanti Bankası"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Getin Bank":{name:"Getin Bank",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FGetin%20Bank%20Logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q9267646",amenity:"bank"},addTags:{amenity:"bank",brand:"Getin Bank","brand:wikidata":"Q9267646","brand:wikipedia":"pl:Getin Bank",name:"Getin Bank"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Golden 1 Credit Union":{name:"Golden 1 Credit Union",icon:"maki-bank",imageURL:"https://graph.facebook.com/golden1cu/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7736976",amenity:"bank"},addTags:{amenity:"bank",brand:"Golden 1 Credit Union","brand:wikidata":"Q7736976","brand:wikipedia":"en:Golden 1 Credit Union",name:"Golden 1 Credit Union"},countryCodes:["us"],terms:["golden 1","golden one","golden one credit union","the golden 1 credit union","the golden one credit union"],matchScore:2,suggestion:true},"amenity/bank/Great Western Bank":{name:"Great Western Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5600185",amenity:"bank"},addTags:{amenity:"bank",brand:"Great Western Bank","brand:wikidata":"Q5600185","brand:wikipedia":"en:Great Western Bank (1907–present)",name:"Great Western Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Groupama":{name:"Groupama",icon:"maki-bank",imageURL:"https://graph.facebook.com/groupama/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3083531",amenity:"bank"},addTags:{amenity:"bank",brand:"Groupama","brand:wikidata":"Q3083531","brand:wikipedia":"en:Groupama",name:"Groupama"},terms:[],matchScore:2,suggestion:true},"amenity/bank/HBL Bank":{name:"HBL Bank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/895259332107010050/pB7ruENL_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q1566843",amenity:"bank"},addTags:{amenity:"bank",brand:"HBL Bank","brand:wikidata":"Q1566843","brand:wikipedia":"ur:ایچ بی ایل پاکستان",name:"HBL Bank"},countryCodes:["pk"],terms:["hbl"],matchScore:2,suggestion:true},"amenity/bank/HDFC Bank":{name:"HDFC Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/HDFC.bank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q631047",amenity:"bank"},addTags:{amenity:"bank",brand:"HDFC Bank","brand:wikidata":"Q631047","brand:wikipedia":"en:HDFC Bank",name:"HDFC Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/HNB":{name:"HNB",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3532080",amenity:"bank"},addTags:{amenity:"bank",brand:"HNB","brand:wikidata":"Q3532080","brand:wikipedia":"en:Hatton National Bank",name:"HNB"},terms:[],matchScore:2,suggestion:true},"amenity/bank/HSBC UK (UK)":{name:"HSBC UK (UK)",icon:"maki-bank",imageURL:"https://graph.facebook.com/hsbcuk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64767453",amenity:"bank"},addTags:{amenity:"bank",brand:"HSBC UK","brand:wikidata":"Q64767453",name:"HSBC UK"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/bank/HSBC (Global)":{name:"HSBC (Global)",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1140640353546113025/0bHt3YUI_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q190464",amenity:"bank"},addTags:{amenity:"bank",brand:"HSBC","brand:wikidata":"Q190464","brand:wikipedia":"en:HSBC",name:"HSBC"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Halifax":{name:"Halifax",icon:"maki-bank",imageURL:"https://graph.facebook.com/halifax/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3310164",amenity:"bank"},addTags:{amenity:"bank",brand:"Halifax","brand:wikidata":"Q3310164","brand:wikipedia":"en:Halifax (bank)",name:"Halifax"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Halkbank":{name:"Halkbank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3593818",amenity:"bank"},addTags:{amenity:"bank",brand:"Halkbank","brand:wikidata":"Q3593818","brand:wikipedia":"en:Halkbank a.d.",name:"Halkbank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Handelsbanken":{name:"Handelsbanken",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FHandelsbanken.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1421630",amenity:"bank"},addTags:{amenity:"bank",brand:"Handelsbanken","brand:wikidata":"Q1421630","brand:wikipedia":"en:Handelsbanken",name:"Handelsbanken"},countryCodes:["dk","fi","gb","no","se"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Heritage Bank":{name:"Heritage Bank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1826329346/Heritage_Bank_logo_Square_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q5738690",amenity:"bank"},addTags:{amenity:"bank",brand:"Heritage Bank","brand:wikidata":"Q5738690","brand:wikipedia":"en:Heritage Bank",name:"Heritage Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Hong Leong Bank":{name:"Hong Leong Bank",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FHong%20Leong%20Bank.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q4383943",amenity:"bank"},addTags:{amenity:"bank",brand:"Hong Leong Bank","brand:wikidata":"Q4383943","brand:wikipedia":"en:Hong Leong Bank",name:"Hong Leong Bank"},countryCodes:["my"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Hrvatska poštanska banka":{name:"Hrvatska poštanska banka",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5923981",amenity:"bank"},addTags:{amenity:"bank",brand:"Hrvatska poštanska banka","brand:wikidata":"Q5923981","brand:wikipedia":"en:Hrvatska poštanska banka",name:"Hrvatska poštanska banka"},countryCodes:["hr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Huntington Bank":{name:"Huntington Bank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1136005142858424321/MvHrZYI8_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q798819",amenity:"bank"},addTags:{amenity:"bank",brand:"Huntington Bank","brand:wikidata":"Q798819","brand:wikipedia":"en:Huntington Bancshares",name:"Huntington Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/HypoVereinsbank":{name:"HypoVereinsbank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/950681154906095618/sFON4jIk_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q220189",amenity:"bank"},addTags:{amenity:"bank",brand:"HypoVereinsbank","brand:wikidata":"Q220189","brand:wikipedia":"en:HypoVereinsbank",name:"HypoVereinsbank"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/bank/ICBC":{name:"ICBC",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FICBC%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q26463",amenity:"bank"},addTags:{amenity:"bank",brand:"ICBC","brand:wikidata":"Q26463","brand:wikipedia":"en:Industrial and Commercial Bank of China",name:"ICBC"},terms:[],matchScore:2,suggestion:true},"amenity/bank/ICICI Bank":{name:"ICICI Bank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1121403488292851713/XrMDErhB_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q1653258",amenity:"bank"},addTags:{amenity:"bank",brand:"ICICI Bank","brand:wikidata":"Q1653258","brand:wikipedia":"en:ICICI Bank",name:"ICICI Bank"},countryCodes:["ca","gb","in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/IDBI Bank":{name:"IDBI Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/IDBIBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3633485",amenity:"bank"},addTags:{amenity:"bank",brand:"IDBI Bank","brand:wikidata":"Q3633485","brand:wikipedia":"en:IDBI Bank",name:"IDBI Bank"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/ING":{name:"ING",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FING%20Group%20N.V.%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q645708",amenity:"bank"},addTags:{amenity:"bank",brand:"ING","brand:wikidata":"Q645708","brand:wikipedia":"en:ING Group",name:"ING"},terms:["ing bank"],matchScore:2,suggestion:true},"amenity/bank/ING Bank Śląski":{name:"ING Bank Śląski",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/735066633992065024/1b4aJQUq_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q1410383",amenity:"bank"},addTags:{amenity:"bank",brand:"ING Bank Śląski","brand:wikidata":"Q1410383","brand:wikipedia":"pl:ING Bank Śląski",name:"ING Bank Śląski"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Ibercaja":{name:"Ibercaja",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5907815",amenity:"bank"},addTags:{amenity:"bank",brand:"Ibercaja","brand:wikidata":"Q5907815","brand:wikipedia":"es:Ibercaja",name:"Ibercaja"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Indian Bank":{name:"Indian Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q2003789",amenity:"bank"},addTags:{amenity:"bank",brand:"Indian Bank","brand:wikidata":"Q2003789","brand:wikipedia":"en:Indian Bank",name:"Indian Bank"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Indian Overseas Bank":{name:"Indian Overseas Bank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/940112386027147264/uciMr62n_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q2003611",amenity:"bank"},addTags:{amenity:"bank",brand:"Indian Overseas Bank","brand:wikidata":"Q2003611","brand:wikipedia":"en:Indian Overseas Bank",name:"Indian Overseas Bank"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Interbank":{name:"Interbank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/690239152504307712/41xwql8A_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q2835558",amenity:"bank"},addTags:{amenity:"bank",brand:"Interbank","brand:wikidata":"Q2835558","brand:wikipedia":"es:Banco Interbank",name:"Interbank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Intesa Sanpaolo":{name:"Intesa Sanpaolo",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20Sanpaolo.gif&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1343118",amenity:"bank"},addTags:{amenity:"bank",brand:"Intesa Sanpaolo","brand:wikidata":"Q1343118","brand:wikipedia":"it:Intesa Sanpaolo",name:"Intesa Sanpaolo"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Investors Bank":{name:"Investors Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/Investorsbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q15109896",amenity:"bank"},addTags:{amenity:"bank",brand:"Investors Bank","brand:wikidata":"Q15109896","brand:wikipedia":"en:Investors Bank",name:"Investors Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Itaú (Brazil)":{name:"Itaú (Brazil)",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1142053208396898305/G07ex464_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q1424293",amenity:"bank"},addTags:{amenity:"bank",brand:"Itaú Unibanco","brand:wikidata":"Q1424293","brand:wikipedia":"pt:Itaú Unibanco",name:"Itaú"},countryCodes:["br"],terms:["banco itau"],matchScore:2,suggestion:true},"amenity/bank/Itaú (Chile)":{name:"Itaú (Chile)",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FItau.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2423252",amenity:"bank"},addTags:{amenity:"bank",brand:"Itaú Corpbanca","brand:wikidata":"Q2423252","brand:wikipedia":"en:Itaú Corpbanca",name:"Itaú"},countryCodes:["cl"],terms:["banco itau"],matchScore:2,suggestion:true},"amenity/bank/JS Bank":{name:"JS Bank",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FJS%20Bank%20-%20New%20logo%202011%20-%20Copy.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q6108986",amenity:"bank"},addTags:{amenity:"bank",brand:"JS Bank","brand:wikidata":"Q6108986","brand:wikipedia":"en:JS Bank",name:"JS Bank"},countryCodes:["pk"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Janata Bank Limited জনতা ব্যাংক লিমিটেড":{name:"Janata Bank Limited জনতা ব্যাংক লিমিটেড",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3347028",amenity:"bank"},addTags:{amenity:"bank",brand:"জনতা ব্যাংক লিমিটেড","brand:bn":"জনতা ব্যাংক লিমিটেড","brand:en":"Janata Bank Limited","brand:wikidata":"Q3347028","brand:wikipedia":"en:Janata Bank",name:"জনতা ব্যাংক লিমিটেড","name:bn":"জনতা ব্যাংক লিমিটেড","name:en":"Janata Bank Limited"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Jyske Bank":{name:"Jyske Bank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1062308131567517702/0I4wgGmc_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q136672",amenity:"bank"},addTags:{amenity:"bank",brand:"Jyske Bank","brand:wikidata":"Q136672","brand:wikipedia":"en:Jyske Bank",name:"Jyske Bank"},countryCodes:["dk"],terms:[],matchScore:2,suggestion:true},"amenity/bank/K&H Bank":{name:"K&H Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/dontsokosan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6393834",amenity:"bank"},addTags:{amenity:"bank",brand:"K&H Bank","brand:wikidata":"Q6393834","brand:wikipedia":"en:K&H Bank",name:"K&H Bank"},countryCodes:["hu"],terms:[],matchScore:2,suggestion:true},"amenity/bank/KBC":{name:"KBC",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/117198928/KBC_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q941020",amenity:"bank"},addTags:{amenity:"bank",brand:"KBC","brand:wikidata":"Q941020","brand:wikipedia":"en:KBC Bank",name:"KBC"},countryCodes:["be","ie"],terms:[],matchScore:2,suggestion:true},"amenity/bank/KBZ Bank":{name:"KBZ Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q6360949",amenity:"bank"},addTags:{amenity:"bank",brand:"KBZ Bank","brand:wikidata":"Q6360949","brand:wikipedia":"en:Kanbawza Bank",name:"KBZ Bank"},countryCodes:["mm"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Karnataka Bank":{name:"Karnataka Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q2042632",amenity:"bank"},addTags:{amenity:"bank",brand:"Karnataka Bank","brand:wikidata":"Q2042632","brand:wikipedia":"en:Karnataka Bank",name:"Karnataka Bank"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Kasa Stefczyka":{name:"Kasa Stefczyka",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q57624461",amenity:"bank"},addTags:{amenity:"bank",brand:"Kasa Stefczyka","brand:wikidata":"Q57624461",name:"Kasa Stefczyka"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"amenity/bank/KeyBank":{name:"KeyBank",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FKeyBank.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1740314",amenity:"bank"},addTags:{amenity:"bank",brand:"KeyBank","brand:wikidata":"Q1740314","brand:wikipedia":"en:KeyBank",name:"KeyBank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Komerční banka":{name:"Komerční banka",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1131535603777060867/lwDe8P5N_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q1541079",amenity:"bank"},addTags:{amenity:"bank",brand:"Komerční banka","brand:wikidata":"Q1541079","brand:wikipedia":"en:Komerční banka",name:"Komerční banka"},countryCodes:["cz"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Kotak Mahindra Bank":{name:"Kotak Mahindra Bank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1110433478343053314/J_fxuytW_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q2040404",amenity:"bank"},addTags:{amenity:"bank",brand:"Kotak Mahindra Bank","brand:wikidata":"Q2040404","brand:wikipedia":"en:Kotak Mahindra Bank",name:"Kotak Mahindra Bank"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Kutxabank":{name:"Kutxabank",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FKutxabank.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q5139377",amenity:"bank"},addTags:{amenity:"bank",brand:"Kutxabank","brand:wikidata":"Q5139377","brand:wikipedia":"en:Kutxabank",name:"Kutxabank"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Kuveyt Türk":{name:"Kuveyt Türk",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q6036058",amenity:"bank"},addTags:{amenity:"bank",brand:"Kuveyt Türk","brand:wikidata":"Q6036058","brand:wikipedia":"tr:Kuveyt Türk",name:"Kuveyt Türk"},countryCodes:["tr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/LCL":{name:"LCL",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/899663758662017024/JLvGAjAM_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q779722",amenity:"bank"},addTags:{amenity:"bank",brand:"LCL","brand:wikidata":"Q779722","brand:wikipedia":"en:Crédit Lyonnais",name:"LCL"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/La Banque Postale":{name:"La Banque Postale",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/877443340551282689/fZlNq46c_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q3206431",amenity:"bank"},addTags:{amenity:"bank",brand:"La Banque Postale","brand:wikidata":"Q3206431","brand:wikipedia":"en:La Banque postale",name:"La Banque Postale"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/La Caixa":{name:"La Caixa",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FFundaci%C3%B3n%20bancaria%20la%20caixa.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q287753",amenity:"bank"},addTags:{amenity:"bank",brand:"La Caixa","brand:wikidata":"Q287753","brand:wikipedia":"en:La Caixa",name:"La Caixa"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Laboral Kutxa":{name:"Laboral Kutxa",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/935069892683927552/gCjeXHBh_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q12052386",amenity:"bank"},addTags:{amenity:"bank",brand:"Laboral Kutxa","brand:wikidata":"Q12052386","brand:wikipedia":"en:Laboral Kutxa",name:"Laboral Kutxa"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Lake Michigan Credit Union":{name:"Lake Michigan Credit Union",icon:"maki-bank",imageURL:"https://graph.facebook.com/LakeMichiganCreditUnion/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6476906",amenity:"bank"},addTags:{amenity:"bank",brand:"Lake Michigan Credit Union","brand:wikidata":"Q6476906","brand:wikipedia":"en:Lake Michigan Credit Union",name:"Lake Michigan Credit Union",short_name:"LMCU"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Landbank":{name:"Landbank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q6483872",amenity:"bank"},addTags:{amenity:"bank",brand:"Landbank","brand:wikidata":"Q6483872","brand:wikipedia":"en:Land Bank of the Philippines",name:"Landbank"},countryCodes:["ph"],terms:["bangko sa lupa ng pilipinas","land bank of the philippines","lbp"],matchScore:2,suggestion:true},"amenity/bank/Leeds Building Society":{name:"Leeds Building Society",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/882560751629742082/qQgEeneD_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q6515848",amenity:"bank"},addTags:{amenity:"bank",brand:"Leeds Building Society","brand:wikidata":"Q6515848","brand:wikipedia":"en:Leeds Building Society",name:"Leeds Building Society"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Liberbank":{name:"Liberbank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1113761969448865792/ni1LBvk__bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q2891018",amenity:"bank"},addTags:{amenity:"bank",brand:"Liberbank","brand:wikidata":"Q2891018","brand:wikipedia":"en:Liberbank",name:"Liberbank"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Lloyds Bank":{name:"Lloyds Bank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1136639701056655360/qxTpE9Do_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q1152847",amenity:"bank"},addTags:{amenity:"bank",brand:"Lloyds Bank","brand:wikidata":"Q1152847","brand:wikipedia":"en:Lloyds Bank",name:"Lloyds Bank"},countryCodes:["gb","im"],terms:["lloyds","lloyds tsb"],matchScore:2,suggestion:true},"amenity/bank/M&T Bank":{name:"M&T Bank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1096422949081341953/zTOinsUb_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q3272257",amenity:"bank"},addTags:{amenity:"bank",brand:"M&T Bank","brand:wikidata":"Q3272257","brand:wikipedia":"en:M&T Bank",name:"M&T Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/MCB":{name:"MCB",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q15982510",amenity:"bank"},addTags:{amenity:"bank",brand:"MCB","brand:wikidata":"Q15982510","brand:wikipedia":"ur:ایم سی بی بینک لمیٹڈ",name:"MCB"},terms:["mcb bank"],matchScore:2,suggestion:true},"amenity/bank/MONETA Money Bank":{name:"MONETA Money Bank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/726534904452931588/E4dnojuF_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q24282966",amenity:"bank"},addTags:{amenity:"bank",brand:"MONETA Money Bank","brand:wikidata":"Q24282966","brand:wikipedia":"cs:Moneta Money Bank",name:"MONETA Money Bank"},countryCodes:["cz"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Macro":{name:"Macro",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20Banco%20Macro.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2335199",amenity:"bank"},addTags:{amenity:"bank",brand:"Macro","brand:wikidata":"Q2335199","brand:wikipedia":"en:Banco Macro",name:"Macro"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Maybank":{name:"Maybank",icon:"maki-bank",imageURL:"https://graph.facebook.com/Maybank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1364018",amenity:"bank"},addTags:{amenity:"bank",brand:"Maybank","brand:wikidata":"Q1364018","brand:wikipedia":"en:Maybank",name:"Maybank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Meezan Bank":{name:"Meezan Bank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1035410125601886208/2TiXmDhB_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q6807934",amenity:"bank"},addTags:{amenity:"bank",brand:"Meezan Bank","brand:wikidata":"Q6807934","brand:wikipedia":"en:Meezan Bank",name:"Meezan Bank"},countryCodes:["pk"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Mercantil":{name:"Mercantil",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q6818004",amenity:"bank"},addTags:{amenity:"bank",brand:"Mercantil","brand:wikidata":"Q6818004","brand:wikipedia":"en:Mercantil Servicios Financieros",name:"Mercantil"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Meridian Credit Union":{name:"Meridian Credit Union",icon:"maki-bank",imageURL:"https://graph.facebook.com/MeridianCreditUnion/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6819303",amenity:"bank"},addTags:{alt_name:"Meridian",amenity:"bank",brand:"Meridian Credit Union","brand:wikidata":"Q6819303","brand:wikipedia":"en:Meridian Credit Union",name:"Meridian Credit Union"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Metro Bank (UK)":{name:"Metro Bank (UK)",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/864061345330855936/lBp9CKv7_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q6824499",amenity:"bank"},addTags:{amenity:"bank",brand:"Metro Bank","brand:wikidata":"Q6824499","brand:wikipedia":"en:Metro Bank (United Kingdom)",name:"Metro Bank"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Metrobank (Philippines)":{name:"Metrobank (Philippines)",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FMetropolitan%20Bank%20and%20Trust%20Company.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1925799",amenity:"bank"},addTags:{amenity:"bank",brand:"Metrobank","brand:wikidata":"Q1925799","brand:wikipedia":"en:Metrobank (Philippines)",name:"Metrobank"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Mibanco":{name:"Mibanco",icon:"maki-bank",imageURL:"https://graph.facebook.com/MibancoOficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5558589",amenity:"bank"},addTags:{amenity:"bank",brand:"Mibanco","brand:wikidata":"Q5558589","brand:wikipedia":"es:MiBanco",name:"Mibanco"},countryCodes:["pe"],terms:[],matchScore:2,suggestion:true},"amenity/bank/MidFirst Bank":{name:"MidFirst Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q17081131",amenity:"bank"},addTags:{amenity:"bank",brand:"MidFirst Bank","brand:wikidata":"Q17081131","brand:wikipedia":"en:MidFirst Bank",name:"MidFirst Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Millennium Bank":{name:"Millennium Bank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/684026097688817664/fg1i7QVc_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q4855947",amenity:"bank"},addTags:{amenity:"bank",brand:"Millennium Bank","brand:wikidata":"Q4855947","brand:wikipedia":"pl:Bank Millennium",name:"Millennium Bank"},countryCodes:["pl"],terms:["bank millennium"],matchScore:2,suggestion:true},"amenity/bank/Millennium bcp":{name:"Millennium bcp",icon:"maki-bank",imageURL:"https://graph.facebook.com/MaisMillennium/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q118581",amenity:"bank"},addTags:{amenity:"bank",brand:"Millennium bcp","brand:wikidata":"Q118581","brand:wikipedia":"pt:Banco Comercial Português",name:"Millennium bcp",official_name:"Banco Comercial Português","official_name:en":"Portuguese Commercial Bank","official_name:es":"Banco Comercial Português"},countryCodes:["pt"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Monte dei Paschi di Siena":{name:"Monte dei Paschi di Siena",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q46730",amenity:"bank"},addTags:{amenity:"bank",brand:"Monte dei Paschi di Siena","brand:wikidata":"Q46730","brand:wikipedia":"en:Banca Monte dei Paschi di Siena",name:"Monte dei Paschi di Siena"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Montepio":{name:"Montepio",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q1946091",amenity:"bank"},addTags:{amenity:"bank",brand:"Montepio","brand:wikidata":"Q1946091","brand:wikipedia":"en:Montepio (bank)",name:"Montepio"},countryCodes:["pt"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Mountain America Credit Union":{name:"Mountain America Credit Union",icon:"maki-bank",imageURL:"https://graph.facebook.com/MountainAmerica/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6924862",amenity:"bank"},addTags:{amenity:"bank",brand:"Mountain America Credit Union","brand:wikidata":"Q6924862","brand:wikipedia":"en:Mountain America Credit Union",name:"Mountain America Credit Union"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/NAB":{name:"NAB",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1086907839820398592/h_bUA0T6_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q1430985",amenity:"bank"},addTags:{amenity:"bank",brand:"NAB","brand:wikidata":"Q1430985","brand:wikipedia":"en:National Australia Bank",name:"NAB"},terms:[],matchScore:2,suggestion:true},"amenity/bank/NSB":{name:"NSB",icon:"maki-bank",imageURL:"https://graph.facebook.com/NSBSLOfficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12500189",amenity:"bank"},addTags:{amenity:"bank",brand:"NSB","brand:wikidata":"Q12500189","brand:wikipedia":"en:National Savings Bank (Sri Lanka)",name:"NSB"},countryCodes:["lk"],terms:["national savings bank"],matchScore:2,suggestion:true},"amenity/bank/NatWest":{name:"NatWest",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1134723716364013569/KL1GTzee_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q2740021",amenity:"bank"},addTags:{amenity:"bank",brand:"NatWest","brand:wikidata":"Q2740021","brand:wikipedia":"en:NatWest",name:"NatWest"},countryCodes:["gb","gg"],terms:[],matchScore:2,suggestion:true},"amenity/bank/National Bank":{name:"National Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/banquenationale/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q634298",amenity:"bank"},addTags:{amenity:"bank",brand:"National Bank","brand:wikidata":"Q634298","brand:wikipedia":"en:National Bank of Canada",name:"National Bank",official_name:"National Bank of Canada"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Nationwide":{name:"Nationwide",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1139126037676285952/ODyln4C0_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q846735",amenity:"bank"},addTags:{amenity:"bank",brand:"Nationwide","brand:wikidata":"Q846735","brand:wikipedia":"en:Nationwide Building Society",name:"Nationwide"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Navy Federal Credit Union":{name:"Navy Federal Credit Union",icon:"maki-bank",imageURL:"https://graph.facebook.com/NavyFederal/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6982632",amenity:"bank"},addTags:{amenity:"bank",brand:"Navy Federal Credit Union","brand:wikidata":"Q6982632","brand:wikipedia":"en:Navy Federal Credit Union",name:"Navy Federal Credit Union"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Nedbank":{name:"Nedbank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q2751701",amenity:"bank"},addTags:{amenity:"bank",brand:"Nedbank","brand:wikidata":"Q2751701","brand:wikipedia":"en:Nedbank",name:"Nedbank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Nordea":{name:"Nordea",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/729590013856382976/KEp-3zPj_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q1123823",amenity:"bank"},addTags:{amenity:"bank",brand:"Nordea","brand:wikidata":"Q1123823","brand:wikipedia":"en:Nordea",name:"Nordea"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Novo Banco":{name:"Novo Banco",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogotipo%20Novo%20Banco.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q17488861",amenity:"bank"},addTags:{amenity:"bank",brand:"Novo Banco","brand:wikidata":"Q17488861","brand:wikipedia":"en:Novo Banco",name:"Novo Banco"},countryCodes:["es","pt"],terms:[],matchScore:2,suggestion:true},"amenity/bank/OLB":{name:"OLB",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FOldenburgische%20landesbank%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q879591",amenity:"bank"},addTags:{amenity:"bank",brand:"OLB","brand:wikidata":"Q879591","brand:wikipedia":"en:Oldenburgische Landesbank",name:"OLB"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/bank/OTP":{name:"OTP",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FOtp%20bank%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q912778",amenity:"bank"},addTags:{amenity:"bank",brand:"OTP","brand:wikidata":"Q912778","brand:wikipedia":"en:OTP Bank",name:"OTP"},terms:["otp bank"],matchScore:2,suggestion:true},"amenity/bank/Oberbank":{name:"Oberbank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/599117673033637888/dxClM7lU_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q2009139",amenity:"bank"},addTags:{amenity:"bank",brand:"Oberbank","brand:wikidata":"Q2009139","brand:wikipedia":"de:Oberbank",name:"Oberbank"},countryCodes:["at","cz","de","hu"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Occidental de Descuento":{name:"Occidental de Descuento",icon:"maki-bank",imageURL:"https://graph.facebook.com/1086400904717496/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4854108",amenity:"bank"},addTags:{amenity:"bank",brand:"Occidental de Descuento","brand:wikidata":"Q4854108","brand:wikipedia":"en:Banco Occidental de Descuento",name:"Occidental de Descuento"},countryCodes:["ve"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Oldenburgische Landesbank":{name:"Oldenburgische Landesbank",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FOldenburgische%20landesbank%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q879591",amenity:"bank"},addTags:{amenity:"bank",brand:"Oldenburgische Landesbank","brand:wikidata":"Q879591","brand:wikipedia":"en:Oldenburgische Landesbank",name:"Oldenburgische Landesbank"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/bank/One Network Bank":{name:"One Network Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q7093019",amenity:"bank"},addTags:{amenity:"bank",brand:"One Network Bank","brand:wikidata":"Q7093019","brand:wikipedia":"en:One Network Bank",name:"One Network Bank"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Oriental Bank of Commerce":{name:"Oriental Bank of Commerce",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/887244088378052608/L2VNwfzZ_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q367008",amenity:"bank"},addTags:{amenity:"bank",brand:"Oriental Bank of Commerce","brand:wikidata":"Q367008","brand:wikipedia":"en:Oriental Bank of Commerce",name:"Oriental Bank of Commerce"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Osuuspankki":{name:"Osuuspankki",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/550208070584786944/XIkH6cRe_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q4045597",amenity:"bank"},addTags:{amenity:"bank",brand:"Osuuspankki","brand:wikidata":"Q4045597","brand:wikipedia":"fi:OP (finanssiryhmä)",name:"Osuuspankki"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"amenity/bank/PBZ":{name:"PBZ",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q7246343",amenity:"bank"},addTags:{amenity:"bank",brand:"PBZ","brand:wikidata":"Q7246343","brand:wikipedia":"en:Privredna banka Zagreb",name:"PBZ"},countryCodes:["hr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/PKO BP":{name:"PKO BP",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogotyp%20PKO%20BP.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q578832",amenity:"bank"},addTags:{amenity:"bank",brand:"PKO BP","brand:wikidata":"Q578832","brand:wikipedia":"pl:Powszechna Kasa Oszczędności Bank Polski",name:"PKO BP"},countryCodes:["pl"],terms:["pko bank polski"],matchScore:2,suggestion:true},"amenity/bank/PNB":{name:"PNB",icon:"maki-bank",imageURL:"https://graph.facebook.com/PNBph/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1657971",amenity:"bank"},addTags:{amenity:"bank",brand:"PNB","brand:wikidata":"Q1657971","brand:wikipedia":"en:Philippine National Bank",name:"PNB",official_name:"Philippine National Bank"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/bank/PNC Bank":{name:"PNC Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/pncbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q38928",amenity:"bank"},addTags:{amenity:"bank",brand:"PNC Bank","brand:wikidata":"Q38928","brand:wikipedia":"en:PNC Financial Services",name:"PNC Bank"},countryCodes:["us"],terms:["pnc"],matchScore:2,suggestion:true},"amenity/bank/PSBank":{name:"PSBank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/701620751019827200/E4JWcIfp_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q7185203",amenity:"bank"},addTags:{amenity:"bank",brand:"PSBank","brand:wikidata":"Q7185203","brand:wikipedia":"en:Philippine Savings Bank",name:"PSBank"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Panin Bank":{name:"Panin Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q12502751",amenity:"bank"},addTags:{amenity:"bank",brand:"Panin Bank","brand:wikidata":"Q12502751","brand:wikipedia":"id:Panin Bank",name:"Panin Bank"},countryCodes:["id"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Patagonia":{name:"Patagonia",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1064714176596254720/afM24Gwn_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q2882078",amenity:"bank"},addTags:{amenity:"bank",brand:"Patagonia","brand:wikidata":"Q2882078","brand:wikipedia":"en:Banco Patagonia",name:"Patagonia"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Pekao SA":{name:"Pekao SA",icon:"maki-bank",imageURL:"https://graph.facebook.com/bankpekaosa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q806642",amenity:"bank"},addTags:{amenity:"bank",brand:"Pekao SA","brand:wikidata":"Q806642","brand:wikipedia":"pl:Bank Polska Kasa Opieki",name:"Pekao SA"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"amenity/bank/PenFed Credit Union":{name:"PenFed Credit Union",icon:"maki-bank",imageURL:"https://graph.facebook.com/PenFed/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3374885",amenity:"bank"},addTags:{alt_name:"Pentagon Federal Credit Union",amenity:"bank",brand:"PenFed Credit Union","brand:wikidata":"Q3374885","brand:wikipedia":"en:Pentagon Federal Credit Union",name:"PenFed Credit Union",short_name:"PenFed"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/People's United Bank":{name:"People's United Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q7165802",amenity:"bank"},addTags:{amenity:"bank",brand:"People's United Bank","brand:wikidata":"Q7165802","brand:wikipedia":"en:People's United Financial",name:"People's United Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Peoples Bank":{name:"Peoples Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q7166050",amenity:"bank"},addTags:{amenity:"bank",brand:"Peoples Bank","brand:wikidata":"Q7166050","brand:wikipedia":"en:Peoples Bank",name:"Peoples Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Piraeus Bank":{name:"Piraeus Bank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/956878317642289152/3eKgkDXU_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q3312",amenity:"bank"},addTags:{amenity:"bank",brand:"Piraeus Bank","brand:wikidata":"Q3312","brand:wikipedia":"en:Piraeus Bank",name:"Piraeus Bank"},countryCodes:["bg","cy","gr","ro","ua"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Postbank (Bulgaria)":{name:"Postbank (Bulgaria)",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q7234083",amenity:"bank"},addTags:{amenity:"bank",brand:"Postbank","brand:wikidata":"Q7234083","brand:wikipedia":"en:Bulgarian Postbank",name:"Postbank"},countryCodes:["bg"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Postbank (Germany)":{name:"Postbank (Germany)",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/908269765227053056/0zk6Mfhc_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q708835",amenity:"bank"},addTags:{amenity:"bank",brand:"Postbank","brand:wikidata":"Q708835","brand:wikipedia":"en:Deutsche Postbank",name:"Postbank"},countryCodes:["de"],terms:["postbank finanzcenter"],matchScore:2,suggestion:true},"amenity/bank/Prima banka":{name:"Prima banka",icon:"maki-bank",imageURL:"https://graph.facebook.com/primabankaslovensko/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q13538661",amenity:"bank"},addTags:{amenity:"bank",brand:"Prima banka","brand:wikidata":"Q13538661","brand:wikipedia":"sk:Prima banka Slovensko",name:"Prima banka"},countryCodes:["sk"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Provincial":{name:"Provincial",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/894046729062027264/48n7ij3E_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q4835087",amenity:"bank"},addTags:{amenity:"bank",brand:"Provincial","brand:wikidata":"Q4835087","brand:wikipedia":"es:BBVA Provincial",name:"Provincial"},countryCodes:["ve"],terms:["bbva provincial"],matchScore:2,suggestion:true},"amenity/bank/Public Bank (Malaysia)":{name:"Public Bank (Malaysia)",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3046561",amenity:"bank"},addTags:{amenity:"bank",brand:"Public Bank","brand:wikidata":"Q3046561","brand:wikipedia":"en:Public Bank Berhad",name:"Public Bank"},terms:["public bank berhad"],matchScore:2,suggestion:true},"amenity/bank/Punjab National Bank":{name:"Punjab National Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/pnbindia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2743499",amenity:"bank"},addTags:{amenity:"bank",brand:"Punjab National Bank","brand:wikidata":"Q2743499","brand:wikipedia":"en:Punjab National Bank",name:"Punjab National Bank"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/RBC":{name:"RBC",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1135532386949763072/NdPhjrB6_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q735261",amenity:"bank"},addTags:{amenity:"bank",brand:"RBC","brand:wikidata":"Q735261","brand:wikipedia":"en:Royal Bank of Canada",name:"RBC",official_name:"Royal Bank of Canada"},terms:["rbc financial group","rbc royal bank","royal bank"],matchScore:2,suggestion:true},"amenity/bank/RBS":{name:"RBS",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1134724783931887616/h5bixsdB_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q160126",amenity:"bank"},addTags:{amenity:"bank",brand:"RBS","brand:wikidata":"Q160126","brand:wikipedia":"en:Royal Bank of Scotland",name:"RBS",official_name:"Royal Bank of Scotland"},countryCodes:["gb","je","ro"],terms:[],matchScore:2,suggestion:true},"amenity/bank/RCBC":{name:"RCBC",icon:"maki-bank",imageURL:"https://graph.facebook.com/RCBCGroup/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7339070",amenity:"bank"},addTags:{amenity:"bank",brand:"RCBC","brand:wikidata":"Q7339070","brand:wikipedia":"en:Rizal Commercial Banking Corporation",name:"RCBC",official_name:"Rizal Commercial Banking Corporation"},countryCodes:["ph"],terms:["rcbc savings bank"],matchScore:2,suggestion:true},"amenity/bank/Rabobank":{name:"Rabobank",icon:"maki-bank",imageURL:"https://graph.facebook.com/rabobank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q252004",amenity:"bank"},addTags:{amenity:"bank",brand:"Rabobank","brand:wikidata":"Q252004","brand:wikipedia":"en:Rabobank",name:"Rabobank"},countryCodes:["au","id","nl","nz","us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Raiffeisen Polbank":{name:"Raiffeisen Polbank",icon:"maki-bank",imageURL:"https://graph.facebook.com/BNPParibasBankPolska/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q9303218",amenity:"bank"},addTags:{amenity:"bank",brand:"Raiffeisen Polbank","brand:wikidata":"Q9303218","brand:wikipedia":"pl:Raiffeisen Bank Polska",name:"Raiffeisen Polbank"},countryCodes:["de","pl"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Raiffeisenbank":{name:"Raiffeisenbank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q24282825",amenity:"bank"},addTags:{amenity:"bank",brand:"Raiffeisenbank","brand:wikidata":"Q24282825","brand:wikipedia":"cs:Raiffeisenbank",name:"Raiffeisenbank"},terms:["raiffeisen","raiffeisenkasse"],matchScore:2,suggestion:true},"amenity/bank/Regions Bank":{name:"Regions Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/RegionsBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q917131",amenity:"bank"},addTags:{amenity:"bank",brand:"Regions Bank","brand:wikidata":"Q917131","brand:wikipedia":"en:Regions Financial Corporation",name:"Regions Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Republic Bank (Eastern Caribbean)":{name:"Republic Bank (Eastern Caribbean)",icon:"maki-bank",imageURL:"https://graph.facebook.com/republicbanktnt/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7314386",amenity:"bank"},addTags:{amenity:"bank",brand:"Republic Bank","brand:wikidata":"Q7314386","brand:wikipedia":"en:Republic Bank",name:"Republic Bank"},countryCodes:["bb","gd","gy","tt"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Republic Bank (USA)":{name:"Republic Bank (USA)",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q7314387",amenity:"bank"},addTags:{amenity:"bank",brand:"Republic Bank","brand:wikidata":"Q7314387","brand:wikipedia":"en:Republic Bank & Trust Company",name:"Republic Bank",official_name:"Republic Bank & Trust Company"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/República":{name:"República",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q4077337",amenity:"bank"},addTags:{amenity:"bank",brand:"República","brand:wikidata":"Q4077337","brand:wikipedia":"en:Banco de la República Oriental del Uruguay",name:"República"},countryCodes:["uy"],terms:[],matchScore:2,suggestion:true},"amenity/bank/S-Pankki":{name:"S-Pankki",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1098603227333959687/q1wdK2sL_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q7387053",amenity:"bank"},addTags:{amenity:"bank",brand:"S-Pankki","brand:wikidata":"Q7387053","brand:wikipedia":"fi:S-Pankki",name:"S-Pankki"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"amenity/bank/SC제일은행":{name:"SC제일은행",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q625531",amenity:"bank"},addTags:{amenity:"bank",brand:"SC제일은행","brand:ko":"SC제일은행","brand:wikidata":"Q625531","brand:wikipedia":"en:Standard Chartered Korea",name:"SC제일은행","name:ko":"SC제일은행"},countryCodes:["kr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/SEB":{name:"SEB",icon:"maki-bank",imageURL:"https://graph.facebook.com/sebsverige/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q975655",amenity:"bank"},addTags:{amenity:"bank",brand:"SEB","brand:wikidata":"Q975655","brand:wikipedia":"en:SEB Group",name:"SEB"},countryCodes:["de","ee","lt","lv","se"],terms:[],matchScore:2,suggestion:true},"amenity/bank/SGBCI":{name:"SGBCI",icon:"maki-bank",imageURL:"https://graph.facebook.com/societegenerale/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3488360",amenity:"bank"},addTags:{amenity:"bank",brand:"SGBCI","brand:wikidata":"Q3488360","brand:wikipedia":"fr:Société générale de banques en Côte d'Ivoire",name:"SGBCI"},countryCodes:["ci"],terms:["agence sgbci"],matchScore:2,suggestion:true},"amenity/bank/SNS Bank":{name:"SNS Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/devolksbanknl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1857899",amenity:"bank"},addTags:{amenity:"bank",brand:"SNS Bank","brand:wikidata":"Q1857899","brand:wikipedia":"en:De Volksbank",name:"SNS Bank"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Sampath Bank":{name:"Sampath Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/Sampathbankplc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7410095",amenity:"bank"},addTags:{amenity:"bank",brand:"Sampath Bank","brand:wikidata":"Q7410095","brand:wikipedia":"en:Sampath Bank",name:"Sampath Bank"},countryCodes:["lk"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Santander":{name:"Santander",icon:"maki-bank",imageURL:"https://graph.facebook.com/SantanderBankUS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5835668",amenity:"bank"},addTags:{amenity:"bank",brand:"Santander","brand:wikidata":"Q5835668","brand:wikipedia":"en:Santander Bank",name:"Santander"},terms:["santander consumer bank"],matchScore:2,suggestion:true},"amenity/bank/Santander Río":{name:"Santander Río",icon:"maki-bank",imageURL:"https://graph.facebook.com/Santander.Ar/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3385268",amenity:"bank"},addTags:{amenity:"bank",brand:"Santander Río","brand:wikidata":"Q3385268","brand:wikipedia":"es:Banco Santander Río",name:"Santander Río"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Santander Totta":{name:"Santander Totta",icon:"maki-bank",imageURL:"https://graph.facebook.com/santanderpt/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4854116",amenity:"bank"},addTags:{amenity:"bank",brand:"Santander Totta","brand:wikidata":"Q4854116","brand:wikipedia":"pt:Banco Santander Portugal",name:"Santander Totta"},countryCodes:["pt"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Sberbank":{name:"Sberbank",icon:"maki-bank",imageURL:"https://graph.facebook.com/sberbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q205012",amenity:"bank"},addTags:{amenity:"bank",brand:"Sberbank","brand:wikidata":"Q205012","brand:wikipedia":"en:Sberbank of Russia",name:"Sberbank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Scotiabank":{name:"Scotiabank",icon:"maki-bank",imageURL:"https://graph.facebook.com/scotiabank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q451476",amenity:"bank"},addTags:{amenity:"bank",brand:"Scotiabank","brand:wikidata":"Q451476","brand:wikipedia":"en:Scotiabank",name:"Scotiabank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Security Bank":{name:"Security Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/SecurityBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7444945",amenity:"bank"},addTags:{amenity:"bank",brand:"Security Bank","brand:wikidata":"Q7444945","brand:wikipedia":"en:Security Bank",name:"Security Bank"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Security Service Federal Credit Union":{name:"Security Service Federal Credit Union",icon:"maki-bank",imageURL:"https://graph.facebook.com/ssfcu/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7444993",amenity:"bank"},addTags:{amenity:"bank",brand:"Security Service Federal Credit Union","brand:wikidata":"Q7444993","brand:wikipedia":"en:Security Service Federal Credit Union",name:"Security Service Federal Credit Union",short_name:"SSFCU"},countryCodes:["us"],terms:["security service fcu"],matchScore:2,suggestion:true},"amenity/bank/Service Credit Union":{name:"Service Credit Union",icon:"maki-bank",imageURL:"https://graph.facebook.com/ServiceCreditUnion/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7455675",amenity:"bank"},addTags:{amenity:"bank",brand:"Service Credit Union","brand:wikidata":"Q7455675","brand:wikipedia":"en:Service Credit Union",name:"Service Credit Union"},countryCodes:["de","us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Servus Credit Union":{name:"Servus Credit Union",icon:"maki-bank",imageURL:"https://graph.facebook.com/ServusCU/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2274396",amenity:"bank"},addTags:{alt_name:"Servus",amenity:"bank",brand:"Servus Credit Union","brand:wikidata":"Q2274396","brand:wikipedia":"en:Servus Credit Union",name:"Servus Credit Union"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Seylan Bank":{name:"Seylan Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/SeylanBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3532083",amenity:"bank"},addTags:{amenity:"bank",brand:"Seylan Bank","brand:wikidata":"Q3532083","brand:wikipedia":"en:Seylan Bank",name:"Seylan Bank"},countryCodes:["lk"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Siam Commercial Bank":{name:"Siam Commercial Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/scb.thailand/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2038986",amenity:"bank"},addTags:{amenity:"bank",brand:"Siam Commercial Bank","brand:wikidata":"Q2038986","brand:wikipedia":"en:Siam Commercial Bank",name:"Siam Commercial Bank"},countryCodes:["th"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Sicoob":{name:"Sicoob",icon:"maki-bank",imageURL:"https://graph.facebook.com/sicooboficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q28679754",amenity:"bank"},addTags:{amenity:"bank",brand:"Sicoob","brand:wikidata":"Q28679754","brand:wikipedia":"pt:Sistema de Cooperativas de Crédito do Brasil",name:"Sicoob"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Sicredi":{name:"Sicredi",icon:"maki-bank",imageURL:"https://graph.facebook.com/Sicredi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3483060",amenity:"bank"},addTags:{amenity:"bank",brand:"Sicredi","brand:wikidata":"Q3483060","brand:wikipedia":"pt:Sistema de Crédito Cooperativo",name:"Sicredi"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Simmons Bank":{name:"Simmons Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/simmonsbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q28402389",amenity:"bank"},addTags:{amenity:"bank",brand:"Simmons Bank","brand:wikidata":"Q28402389","brand:wikipedia":"en:Simmons Bank",name:"Simmons Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Slovenská sporiteľňa":{name:"Slovenská sporiteľňa",icon:"maki-bank",imageURL:"https://graph.facebook.com/SlovenskaSporitelna/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7541907",amenity:"bank"},addTags:{amenity:"bank",brand:"Slovenská sporiteľňa","brand:wikidata":"Q7541907","brand:wikipedia":"en:Slovenská sporiteľňa",name:"Slovenská sporiteľňa"},countryCodes:["sk"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Société Générale":{name:"Société Générale",icon:"maki-bank",imageURL:"https://graph.facebook.com/societegenerale/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q270363",amenity:"bank"},addTags:{amenity:"bank",brand:"Société Générale","brand:wikidata":"Q270363","brand:wikipedia":"en:Société Générale",name:"Société Générale"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Société Marseillaise de Crédit":{name:"Société Marseillaise de Crédit",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3488479",amenity:"bank"},addTags:{amenity:"bank",brand:"Société Marseillaise de Crédit","brand:wikidata":"Q3488479","brand:wikipedia":"fr:Société marseillaise de crédit",name:"Société Marseillaise de Crédit"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Sonali Bank":{name:"Sonali Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/sb.ltd.bd/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3350382",amenity:"bank"},addTags:{amenity:"bank",brand:"Sonali Bank","brand:wikidata":"Q3350382","brand:wikipedia":"en:Sonali Bank",name:"Sonali Bank"},countryCodes:["bd"],terms:["sonali bank limited","sonali bank limited সোনালী ব্যাংক লিমিটেড"],matchScore:2,suggestion:true},"amenity/bank/South Indian Bank":{name:"South Indian Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/thesouthindianbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2044973",amenity:"bank"},addTags:{amenity:"bank",brand:"South Indian Bank","brand:wikidata":"Q2044973","brand:wikipedia":"en:South Indian Bank",name:"South Indian Bank"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/South State Bank":{name:"South State Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/SouthStateBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q55633597",amenity:"bank"},addTags:{amenity:"bank",brand:"South State Bank","brand:wikidata":"Q55633597","brand:wikipedia":"en:South State Bank",name:"South State Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Sparda-Bank":{name:"Sparda-Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/spardabankmuenchen/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2307136",amenity:"bank"},addTags:{amenity:"bank",brand:"Sparda-Bank","brand:wikidata":"Q2307136","brand:wikipedia":"en:Sparda-Bank",name:"Sparda-Bank"},countryCodes:["at","de"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Stanbic Bank":{name:"Stanbic Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/StanbicBankGhana/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7597999",amenity:"bank"},addTags:{amenity:"bank",brand:"Stanbic Bank","brand:wikidata":"Q7597999","brand:wikipedia":"en:Stanbic Bank",name:"Stanbic Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Standard Bank":{name:"Standard Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/standardbankgrp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1576610",amenity:"bank"},addTags:{amenity:"bank",brand:"Standard Bank","brand:wikidata":"Q1576610","brand:wikipedia":"en:Standard Bank",name:"Standard Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Standard Chartered":{name:"Standard Chartered",icon:"maki-bank",imageURL:"https://graph.facebook.com/StandardChartered/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q548278",amenity:"bank"},addTags:{amenity:"bank",brand:"Standard Chartered","brand:wikidata":"Q548278","brand:wikipedia":"en:Standard Chartered",name:"Standard Chartered"},terms:["standard chartered bank"],matchScore:2,suggestion:true},"amenity/bank/State Bank of India":{name:"State Bank of India",icon:"maki-bank",imageURL:"https://graph.facebook.com/StateBankOfIndia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1340361",amenity:"bank"},addTags:{amenity:"bank",brand:"State Bank of India","brand:wikidata":"Q1340361","brand:wikipedia":"en:State Bank of India",name:"State Bank of India"},terms:[],matchScore:2,suggestion:true},"amenity/bank/State Employees Credit Union":{name:"State Employees Credit Union",icon:"maki-bank",imageURL:"https://graph.facebook.com/stateemployeescreditunion/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7603196",amenity:"bank"},addTags:{amenity:"bank",brand:"State Employees Credit Union","brand:wikidata":"Q7603196","brand:wikipedia":"en:State Employees Credit Union",name:"State Employees Credit Union",short_name:"SECU"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Summit Bank":{name:"Summit Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/SummitBankPK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7637775",amenity:"bank"},addTags:{amenity:"bank",brand:"Summit Bank","brand:wikidata":"Q7637775","brand:wikipedia":"en:Summit Bank",name:"Summit Bank"},countryCodes:["pk"],terms:[],matchScore:2,suggestion:true},"amenity/bank/SunTrust":{name:"SunTrust",icon:"maki-bank",imageURL:"https://graph.facebook.com/suntrust/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q181507",amenity:"bank"},addTags:{amenity:"bank",brand:"SunTrust","brand:wikidata":"Q181507","brand:wikipedia":"en:SunTrust Banks",name:"SunTrust"},countryCodes:["us"],terms:["suntrust bank"],matchScore:2,suggestion:true},"amenity/bank/Suncorp":{name:"Suncorp",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q24189567",amenity:"bank"},addTags:{amenity:"bank",brand:"Suncorp","brand:wikidata":"Q24189567","brand:wikipedia":"en:Suncorp Bank",name:"Suncorp"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Supervielle":{name:"Supervielle",icon:"maki-bank",imageURL:"https://graph.facebook.com/BancoSupervielle/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5718035",amenity:"bank"},addTags:{amenity:"bank",brand:"Supervielle","brand:wikidata":"Q5718035","brand:wikipedia":"es:Banco Supervielle",name:"Supervielle"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Swedbank":{name:"Swedbank",icon:"maki-bank",imageURL:"https://graph.facebook.com/swedbanksverige/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1145493",amenity:"bank"},addTags:{amenity:"bank",brand:"Swedbank","brand:wikidata":"Q1145493","brand:wikipedia":"en:Swedbank",name:"Swedbank"},countryCodes:["ee","lt","lv","se"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Syndicate Bank":{name:"Syndicate Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/syndicatebank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2004088",amenity:"bank"},addTags:{amenity:"bank",brand:"Syndicate Bank","brand:wikidata":"Q2004088","brand:wikipedia":"en:Syndicate Bank",name:"Syndicate Bank"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/TCF Bank":{name:"TCF Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/TCFbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7669687",amenity:"bank"},addTags:{amenity:"bank",brand:"TCF Bank","brand:wikidata":"Q7669687","brand:wikipedia":"en:TCF Bank",name:"TCF Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/TD Bank":{name:"TD Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/TDBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7669891",amenity:"bank"},addTags:{amenity:"bank",brand:"TD Bank","brand:wikidata":"Q7669891","brand:wikipedia":"en:TD Bank, N.A.",name:"TD Bank"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/TD Canada Trust":{name:"TD Canada Trust",icon:"maki-bank",imageURL:"https://graph.facebook.com/TDBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1080670",amenity:"bank"},addTags:{amenity:"bank",brand:"TD Canada Trust","brand:wikidata":"Q1080670","brand:wikipedia":"en:TD Canada Trust",name:"TD Canada Trust"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/bank/TEB":{name:"TEB",icon:"maki-bank",imageURL:"https://graph.facebook.com/teb/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7862447",amenity:"bank"},addTags:{amenity:"bank",brand:"TEB","brand:wikidata":"Q7862447","brand:wikipedia":"en:Türk Ekonomi Bankası",name:"TEB"},countryCodes:["tr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/TSB":{name:"TSB",icon:"maki-bank",imageURL:"https://graph.facebook.com/TSBbankUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7671560",amenity:"bank"},addTags:{amenity:"bank",brand:"TSB","brand:wikidata":"Q7671560","brand:wikipedia":"en:TSB Bank (United Kingdom)",name:"TSB"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Takarékszövetkezet":{name:"Takarékszövetkezet",icon:"maki-bank",imageURL:"https://graph.facebook.com/takarekcsoport/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q30324674",amenity:"bank"},addTags:{amenity:"bank",brand:"Takarékszövetkezet","brand:wikidata":"Q30324674","brand:wikipedia":"en:TakarékBank",name:"Takarékszövetkezet"},countryCodes:["hu"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Targobank":{name:"Targobank",icon:"maki-bank",imageURL:"https://graph.facebook.com/targobank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1455437",amenity:"bank"},addTags:{amenity:"bank",brand:"Targobank","brand:wikidata":"Q1455437","brand:wikipedia":"en:Targobank",name:"Targobank"},countryCodes:["de","es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Tatra banka":{name:"Tatra banka",icon:"maki-bank",imageURL:"https://graph.facebook.com/tatrabanka/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1718069",amenity:"bank"},addTags:{amenity:"bank",brand:"Tatra banka","brand:wikidata":"Q1718069","brand:wikipedia":"en:Tatra banka",name:"Tatra banka"},countryCodes:["sk"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Türkiye İş Bankası":{name:"Türkiye İş Bankası",icon:"maki-bank",imageURL:"https://graph.facebook.com/isbankasi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q909613",amenity:"bank"},addTags:{amenity:"bank",brand:"Türkiye İş Bankası","brand:wikidata":"Q909613","brand:wikipedia":"en:Türkiye İş Bankası",name:"Türkiye İş Bankası"},terms:[],matchScore:2,suggestion:true},"amenity/bank/U.S. Bank":{name:"U.S. Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/usbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q739084",amenity:"bank"},addTags:{amenity:"bank",brand:"U.S. Bank","brand:wikidata":"Q739084","brand:wikipedia":"en:U.S. Bancorp",name:"U.S. Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/UBA":{name:"UBA",icon:"maki-bank",imageURL:"https://graph.facebook.com/ubagroup/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q513457",amenity:"bank"},addTags:{amenity:"bank",brand:"UBA","brand:wikidata":"Q513457","brand:wikipedia":"en:United Bank for Africa",name:"UBA"},terms:[],matchScore:2,suggestion:true},"amenity/bank/UBI Banca":{name:"UBI Banca",icon:"maki-bank",imageURL:"https://graph.facebook.com/UBIBanca/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1476162",amenity:"bank"},addTags:{amenity:"bank",brand:"UBI Banca","brand:wikidata":"Q1476162","brand:wikipedia":"en:UBI Banca",name:"UBI Banca"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/UBL":{name:"UBL",icon:"maki-bank",imageURL:"https://graph.facebook.com/UBLUnitedBankLtd/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7887504",amenity:"bank"},addTags:{amenity:"bank",brand:"UBL","brand:en":"United Bank Limited Pakistan","brand:wikidata":"Q7887504","brand:wikipedia":"ur:یونائیٹڈ بینک (پاکستان)",name:"UBL","name:en":"United Bank Limited Pakistan"},countryCodes:["pk"],terms:["ubl bank"],matchScore:2,suggestion:true},"amenity/bank/UBS":{name:"UBS",icon:"maki-bank",imageURL:"https://graph.facebook.com/UBSglobal/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q193199",amenity:"bank"},addTags:{amenity:"bank",brand:"UBS","brand:wikidata":"Q193199","brand:wikipedia":"en:UBS",name:"UBS"},terms:[],matchScore:2,suggestion:true},"amenity/bank/UCO Bank":{name:"UCO Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/official.ucobank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2005310",amenity:"bank"},addTags:{amenity:"bank",brand:"UCO Bank","brand:wikidata":"Q2005310","brand:wikipedia":"en:UCO Bank",name:"UCO Bank"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/UCPB":{name:"UCPB",icon:"maki-bank",imageURL:"https://graph.facebook.com/UCPB.Connect/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7887615",amenity:"bank"},addTags:{amenity:"bank",brand:"UCPB","brand:wikidata":"Q7887615","brand:wikipedia":"en:United Coconut Planters Bank",name:"UCPB"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/bank/UIB":{name:"UIB",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q18636687",amenity:"bank"},addTags:{amenity:"bank",brand:"UIB","brand:wikidata":"Q18636687","brand:wikipedia":"en:United Industrial Bank",name:"UIB"},terms:[],matchScore:2,suggestion:true},"amenity/bank/UNI":{name:"UNI",icon:"maki-bank",imageURL:"https://graph.facebook.com/unicooperation/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2933348",amenity:"bank"},addTags:{amenity:"bank",brand:"UNI","brand:wikidata":"Q2933348","brand:wikipedia":"fr:UNI Coopération financière",name:"UNI",official_name:"UNI Coopération financière"},countryCodes:["ca"],terms:["caisse populaire","caisse populaire acadienne"],matchScore:2,suggestion:true},"amenity/bank/UOB":{name:"UOB",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FUOB%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2064074",amenity:"bank"},addTags:{amenity:"bank",brand:"UOB","brand:wikidata":"Q2064074","brand:wikipedia":"en:United Overseas Bank",name:"UOB"},terms:[],matchScore:2,suggestion:true},"amenity/bank/USAA":{name:"USAA",icon:"maki-bank",imageURL:"https://graph.facebook.com/USAA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7865722",amenity:"bank"},addTags:{amenity:"bank",brand:"USAA","brand:wikidata":"Q7865722","brand:wikipedia":"en:USAA",name:"USAA",official_name:"United Services Automobile Association"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Ulster Bank":{name:"Ulster Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q2613366",amenity:"bank"},addTags:{amenity:"bank",brand:"Ulster Bank","brand:wikidata":"Q2613366","brand:wikipedia":"en:Ulster Bank",name:"Ulster Bank"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Umpqua Bank":{name:"Umpqua Bank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1137216537289302016/nDiuFr0P_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q7881772",amenity:"bank"},addTags:{amenity:"bank",brand:"Umpqua Bank","brand:wikidata":"Q7881772","brand:wikipedia":"en:Umpqua Holdings Corporation",name:"Umpqua Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/UniCredit Bank":{name:"UniCredit Bank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/938454142338596864/uYxN76cQ_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q45568",amenity:"bank"},addTags:{amenity:"bank",brand:"UniCredit Bank","brand:wikidata":"Q45568","brand:wikipedia":"en:UniCredit",name:"UniCredit Bank"},terms:["unicredit","unicredit banca"],matchScore:2,suggestion:true},"amenity/bank/Unicaja Banco":{name:"Unicaja Banco",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1054637020713234432/c1iwfyOm_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q2543704",amenity:"bank"},addTags:{amenity:"bank",brand:"Unicaja Banco","brand:wikidata":"Q2543704","brand:wikipedia":"en:Unicaja",name:"Unicaja Banco",short_name:"Unicaja"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Union Bank of India":{name:"Union Bank of India",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FUnion%20Bank%20of%20India%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2004078",amenity:"bank"},addTags:{amenity:"bank",brand:"Union Bank of India","brand:wikidata":"Q2004078","brand:wikipedia":"en:Union Bank of India",name:"Union Bank of India"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Union Bank (USA)":{name:"Union Bank (USA)",icon:"maki-bank",imageURL:"https://graph.facebook.com/unionbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1442804",amenity:"bank"},addTags:{alt_name:"UnionBank",amenity:"bank",brand:"Union Bank","brand:wikidata":"Q1442804","brand:wikipedia":"en:MUFG Union Bank",name:"Union Bank"},countryCodes:["us"],terms:["mufg union bank","union bank of california"],matchScore:2,suggestion:true},"amenity/bank/UnionBank (Philippines)":{name:"UnionBank (Philippines)",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FUnionBankPH.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q7885403",amenity:"bank"},addTags:{amenity:"bank",brand:"UnionBank","brand:wikidata":"Q7885403","brand:wikipedia":"en:Union Bank of the Philippines",name:"UnionBank"},countryCodes:["ph"],terms:["union bank of the philippines"],matchScore:2,suggestion:true},"amenity/bank/United Bank (Connecticut)":{name:"United Bank (Connecticut)",icon:"maki-bank",imageURL:"https://graph.facebook.com/bankatunited/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64825157",amenity:"bank"},addTags:{amenity:"bank",brand:"United Bank","brand:wikidata":"Q64825157",name:"United Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/United Bank (WestVirginia)":{name:"United Bank (WestVirginia)",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FUnited%20Bank%20(West%20Virginia)%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q16920636",amenity:"bank"},addTags:{amenity:"bank",brand:"United Bank","brand:wikidata":"Q16920636","brand:wikipedia":"en:United Bank (West Virginia)",name:"United Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Vakıfbank":{name:"Vakıfbank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1116607604568940545/27IKknhk_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q1148521",amenity:"bank"},addTags:{amenity:"bank",brand:"Vakıfbank","brand:wikidata":"Q1148521","brand:wikipedia":"en:VakıfBank",name:"Vakıfbank"},countryCodes:["tr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Vancity":{name:"Vancity",icon:"maki-bank",imageURL:"https://graph.facebook.com/Vancity/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7914085",amenity:"bank"},addTags:{amenity:"bank",brand:"Vancity","brand:wikidata":"Q7914085","brand:wikipedia":"en:Vancity",name:"Vancity",official_name:"Vancouver City Savings Credit Union"},countryCodes:["ca"],terms:["vancouver city savings"],matchScore:2,suggestion:true},"amenity/bank/Veneto Banca":{name:"Veneto Banca",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3127221",amenity:"bank"},addTags:{amenity:"bank",brand:"Veneto Banca","brand:wikidata":"Q3127221","brand:wikipedia":"en:Veneto Banca",name:"Veneto Banca"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Vijaya Bank":{name:"Vijaya Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q2003171",amenity:"bank"},addTags:{amenity:"bank",brand:"Vijaya Bank","brand:wikidata":"Q2003171","brand:wikipedia":"en:Vijaya Bank",name:"Vijaya Bank"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Volksbank Köln Bonn eG":{name:"Volksbank Köln Bonn eG",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q41680844",amenity:"bank"},addTags:{amenity:"bank",brand:"Volksbank Köln Bonn eG","brand:wikidata":"Q41680844","brand:wikipedia":"de:Volksbank Köln Bonn",name:"Volksbank Köln Bonn eG"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/bank/VÚB":{name:"VÚB",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FVUB.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q12778981",amenity:"bank"},addTags:{amenity:"bank",brand:"VÚB","brand:wikidata":"Q12778981","brand:wikipedia":"en:Všeobecná úverová banka",name:"VÚB"},countryCodes:["sk"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Washington Federal":{name:"Washington Federal",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FWashington%20Federal%20Logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q7971859",amenity:"bank"},addTags:{amenity:"bank",brand:"Washington Federal","brand:wikidata":"Q7971859","brand:wikipedia":"en:Washington Federal",name:"Washington Federal"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Wells Fargo":{name:"Wells Fargo",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1088877344624758784/OH8VFkEY_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q744149",amenity:"bank"},addTags:{amenity:"bank",brand:"Wells Fargo","brand:wikidata":"Q744149","brand:wikipedia":"en:Wells Fargo",name:"Wells Fargo"},countryCodes:["us"],terms:["wells fargo bank"],matchScore:2,suggestion:true},"amenity/bank/WesBanco":{name:"WesBanco",icon:"maki-bank",imageURL:"https://graph.facebook.com/WesBanco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7983629",amenity:"bank"},addTags:{amenity:"bank",brand:"WesBanco","brand:wikidata":"Q7983629","brand:wikipedia":"en:WesBanco",name:"WesBanco"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Western Union":{name:"Western Union",icon:"maki-bank",imageURL:"https://graph.facebook.com/WesternUnion/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q861042",amenity:"bank"},addTags:{amenity:"bank",brand:"Western Union","brand:wikidata":"Q861042","brand:wikipedia":"en:Western Union",name:"Western Union"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Westpac":{name:"Westpac",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1135693176243597312/mE_lUXFY_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q2031726",amenity:"bank"},addTags:{amenity:"bank",brand:"Westpac","brand:wikidata":"Q2031726","brand:wikipedia":"en:Westpac",name:"Westpac"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Yapı Kredi":{name:"Yapı Kredi",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q8049138",amenity:"bank"},addTags:{amenity:"bank",brand:"Yapı Kredi","brand:wikidata":"Q8049138","brand:wikipedia":"en:Yapı ve Kredi Bankası",name:"Yapı Kredi"},countryCodes:["tr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Yorkshire Bank":{name:"Yorkshire Bank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/875682560315097088/YOR4LIIO_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q8055678",amenity:"bank"},addTags:{amenity:"bank",brand:"Yorkshire Bank","brand:wikidata":"Q8055678","brand:wikipedia":"en:Yorkshire Bank",name:"Yorkshire Bank"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Yorkshire Building Society":{name:"Yorkshire Building Society",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1135930358636134407/TypmFPcO_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q12073381",amenity:"bank"},addTags:{amenity:"bank",brand:"Yorkshire Building Society","brand:wikidata":"Q12073381","brand:wikipedia":"en:Yorkshire Building Society",name:"Yorkshire Building Society"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Zagrebačka banka":{name:"Zagrebačka banka",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FZagreba%C4%8Dka-banka-Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q140381",amenity:"bank"},addTags:{amenity:"bank",brand:"Zagrebačka banka","brand:wikidata":"Q140381","brand:wikipedia":"en:Zagrebačka banka",name:"Zagrebačka banka"},countryCodes:["hr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Zenith Bank":{name:"Zenith Bank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/880350862647980032/mvRee-i3_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q5978240",amenity:"bank"},addTags:{amenity:"bank",brand:"Zenith Bank","brand:wikidata":"Q5978240","brand:wikipedia":"en:Zenith Bank",name:"Zenith Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Ziraat Bankası":{name:"Ziraat Bankası",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/796327044867100672/6kVcx5hR_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q696003",amenity:"bank"},addTags:{amenity:"bank",brand:"Ziraat Bankası","brand:wikidata":"Q696003","brand:wikipedia":"en:Ziraat Bankası",name:"Ziraat Bankası"},terms:[],matchScore:2,suggestion:true},"amenity/bank/mBank":{name:"mBank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/978550505856225280/lx2kkb1A_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q1160928",amenity:"bank"},addTags:{amenity:"bank",brand:"mBank","brand:wikidata":"Q1160928","brand:wikipedia":"en:MBank",name:"mBank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/st.george":{name:"st.george",icon:"maki-bank",imageURL:"https://graph.facebook.com/stgeorgebankaus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1606050",amenity:"bank"},addTags:{amenity:"bank",brand:"st.george","brand:wikidata":"Q1606050","brand:wikipedia":"en:St.George Bank",name:"st.george"},countryCodes:["au"],terms:["st.george bank"],matchScore:2,suggestion:true},"amenity/bank/Ålandsbanken":{name:"Ålandsbanken",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FAlandsbanken-logotype.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q4349236",amenity:"bank"},addTags:{amenity:"bank",brand:"Ålandsbanken","brand:wikidata":"Q4349236","brand:wikipedia":"sv:Ålandsbanken",name:"Ålandsbanken"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"amenity/bank/ČSOB":{name:"ČSOB",icon:"maki-bank",imageURL:"https://graph.facebook.com/csob/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q340135",amenity:"bank"},addTags:{amenity:"bank",brand:"ČSOB","brand:wikidata":"Q340135","brand:wikipedia":"en:Československá obchodní banka",name:"ČSOB"},countryCodes:["cz","sk"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Česká spořitelna":{name:"Česká spořitelna",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1129037135598804996/t6sH0DmI_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q341100",amenity:"bank"},addTags:{amenity:"bank",brand:"Česká spořitelna","brand:wikidata":"Q341100","brand:wikipedia":"en:Česká spořitelna",name:"Česká spořitelna"},countryCodes:["cz"],terms:[],matchScore:2,suggestion:true},"amenity/bank/İş Bankası":{name:"İş Bankası",icon:"maki-bank",imageURL:"https://graph.facebook.com/isbankasi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q909613",amenity:"bank"},addTags:{amenity:"bank",brand:"İş Bankası","brand:wikidata":"Q909613","brand:wikipedia":"en:Türkiye İş Bankası",name:"İş Bankası"},countryCodes:["tr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Εθνική Τράπεζα":{name:"Εθνική Τράπεζα",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/889398220853522432/S7AkARZ9_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q1816028",amenity:"bank"},addTags:{amenity:"bank",brand:"Εθνική Τράπεζα","brand:el":"Εθνική Τράπεζα","brand:en":"National Bank of Greece","brand:wikidata":"Q1816028","brand:wikipedia":"en:National Bank of Greece",name:"Εθνική Τράπεζα","name:el":"Εθνική Τράπεζα","name:en":"National Bank of Greece"},countryCodes:["gr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Τράπεζα Πειραιώς":{name:"Τράπεζα Πειραιώς",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/956878317642289152/3eKgkDXU_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q3312",amenity:"bank"},addTags:{amenity:"bank",brand:"Τράπεζα Πειραιώς","brand:el":"Τράπεζα Πειραιώς","brand:en":"Piraeus Bank","brand:wikidata":"Q3312","brand:wikipedia":"en:Piraeus Bank",name:"Τράπεζα Πειραιώς","name:el":"Τράπεζα Πειραιώς","name:en":"Piraeus Bank"},countryCodes:["gr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/А-Банк":{name:"А-Банк",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q28705400",amenity:"bank"},addTags:{amenity:"bank",brand:"А-Банк","brand:wikidata":"Q28705400","brand:wikipedia":"uk:А-Банк",name:"А-Банк"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Авангард":{name:"Авангард",icon:"maki-bank",imageURL:"https://graph.facebook.com/bankavangard/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62122617",amenity:"bank"},addTags:{amenity:"bank",brand:"Авангард","brand:wikidata":"Q62122617",name:"Авангард"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Альфа-Банк":{name:"Альфа-Банк",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1126053531507621888/L60raYv6_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q1377835",amenity:"bank"},addTags:{amenity:"bank",brand:"Альфа-Банк","brand:en":"Alfa-Bank","brand:ru":"Альфа-Банк","brand:wikidata":"Q1377835","brand:wikipedia":"ru:Альфа-банк",name:"Альфа-Банк","name:en":"Alfa-Bank","name:ru":"Альфа-Банк"},countryCodes:["by","kz","ru","ua"],terms:[],matchScore:2,suggestion:true},"amenity/bank/БПС-Сбербанк":{name:"БПС-Сбербанк",icon:"maki-bank",imageURL:"https://graph.facebook.com/sberbank.bps/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2074915",amenity:"bank"},addTags:{amenity:"bank",brand:"БПС-Сбербанк","brand:wikidata":"Q2074915","brand:wikipedia":"be:БПС-Сбербанк",name:"БПС-Сбербанк"},countryCodes:["by"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Банк Дабрабыт":{name:"Банк Дабрабыт",icon:"maki-bank",imageURL:"https://graph.facebook.com/bank.dabrabyt/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63981850",amenity:"bank"},addTags:{amenity:"bank",brand:"Банк Дабрабыт","brand:wikidata":"Q63981850",name:"Банк Дабрабыт"},countryCodes:["by"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Банка ДСК":{name:"Банка ДСК",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5206146",amenity:"bank"},addTags:{amenity:"bank",brand:"Банка ДСК","brand:bg":"Банка ДСК","brand:en":"DSK Bank","brand:wikidata":"Q5206146","brand:wikipedia":"en:DSK Bank",name:"Банка ДСК","name:bg":"Банка ДСК","name:en":"DSK Bank"},countryCodes:["bg"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Белагропромбанк":{name:"Белагропромбанк",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/818408470319865857/4hE0A76d_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q1991373",amenity:"bank"},addTags:{amenity:"bank",brand:"Белагропромбанк","brand:en":"Belagroprom Bank","brand:wikidata":"Q1991373","brand:wikipedia":"be:Белаграпрамбанк",name:"Белагропромбанк","name:en":"Belagroprom Bank"},countryCodes:["by"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Беларусбанк":{name:"Беларусбанк",icon:"maki-bank",imageURL:"https://graph.facebook.com/asb.belarusbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1997334",amenity:"bank"},addTags:{amenity:"bank",brand:"Беларусбанк","brand:en":"Belarusbank","brand:wikidata":"Q1997334","brand:wikipedia":"en:Belarusbank",name:"Беларусбанк","name:en":"Belarusbank"},countryCodes:["by"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Белинвестбанк":{name:"Белинвестбанк",icon:"maki-bank",imageURL:"https://graph.facebook.com/belinvestbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4081940",amenity:"bank"},addTags:{amenity:"bank",brand:"Белинвестбанк","brand:wikidata":"Q4081940","brand:wikipedia":"ru:Белинвестбанк",name:"Белинвестбанк"},countryCodes:["by"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Бинбанк":{name:"Бинбанк",icon:"maki-bank",imageURL:"https://graph.facebook.com/binbank.ru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4086829",amenity:"bank"},addTags:{amenity:"bank",brand:"Бинбанк","brand:en":"B&N Bank","brand:wikidata":"Q4086829","brand:wikipedia":"en:B&N Bank",name:"Бинбанк","name:en":"B&N Bank"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/bank/ВТБ":{name:"ВТБ",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1054295031916453888/lvi_M_Cc_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q1549389",amenity:"bank"},addTags:{amenity:"bank",brand:"ВТБ","brand:en":"VTB Bank","brand:wikidata":"Q1549389","brand:wikipedia":"en:VTB Bank",name:"ВТБ","name:en":"VTB Bank"},countryCodes:["ru","ua"],terms:["втб банк москвы"],matchScore:2,suggestion:true},"amenity/bank/Возрождение":{name:"Возрождение",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q4114952",amenity:"bank"},addTags:{amenity:"bank",brand:"Возрождение","brand:wikidata":"Q4114952","brand:wikipedia":"ru:Возрождение (банк)",name:"Возрождение"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Газпромбанк":{name:"Газпромбанк",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FGazprombank.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1924338",amenity:"bank"},addTags:{amenity:"bank",brand:"Газпромбанк","brand:en":"Gazprombank","brand:wikidata":"Q1924338","brand:wikipedia":"en:Gazprombank",name:"Газпромбанк","name:en":"Gazprombank"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Генбанк":{name:"Генбанк",icon:"maki-bank",imageURL:"https://graph.facebook.com/GENBANK.Crimea/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62122630",amenity:"bank"},addTags:{amenity:"bank",brand:"Генбанк","brand:wikidata":"Q62122630",name:"Генбанк"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Казкоммерцбанк":{name:"Казкоммерцбанк",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FQazkom%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1168179",amenity:"bank"},addTags:{amenity:"bank",brand:"Казкоммерцбанк","brand:en":"Kazkommertsbank","brand:wikidata":"Q1168179","brand:wikipedia":"en:Kazkommertsbank",name:"Казкоммерцбанк","name:en":"Kazkommertsbank"},countryCodes:["kz"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Московский индустриальный банк":{name:"Московский индустриальный банк",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q4304145",amenity:"bank"},addTags:{amenity:"bank",brand:"Московский индустриальный банк","brand:en":"Moscow Industrial Bank","brand:wikidata":"Q4304145","brand:wikipedia":"ru:Московский индустриальный банк",name:"Московский индустриальный банк","name:en":"Moscow Industrial Bank"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Мособлбанк":{name:"Мособлбанк",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q4304446",amenity:"bank"},addTags:{amenity:"bank",brand:"Мособлбанк","brand:en":"Mosobl Bank","brand:wikidata":"Q4304446","brand:wikipedia":"ru:Мособлбанк",name:"Мособлбанк","name:en":"Mosobl Bank"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Народный банк":{name:"Народный банк",icon:"maki-bank",imageURL:"https://graph.facebook.com/halykbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1046186",amenity:"bank"},addTags:{amenity:"bank",brand:"Народный банк","brand:wikidata":"Q1046186","brand:wikipedia":"kk:Қазақстан Халық банкі",name:"Народный банк"},countryCodes:["kg","kz","uz"],terms:[],matchScore:2,suggestion:true},"amenity/bank/ОТП Банк":{name:"ОТП Банк",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FOtp%20bank%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q912778",amenity:"bank"},addTags:{amenity:"bank",brand:"ОТП Банк","brand:en":"OTP Bank","brand:wikidata":"Q912778","brand:wikipedia":"en:OTP Bank",name:"ОТП Банк","name:en":"OTP Bank"},countryCodes:["ru","ua"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Обединена Българска Банка":{name:"Обединена Българска Банка",icon:"maki-bank",imageURL:"https://graph.facebook.com/UnitedBulgarianBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7887555",amenity:"bank"},addTags:{amenity:"bank",brand:"Обединена Българска Банка","brand:en":"United Bulgarian Bank","brand:wikidata":"Q7887555","brand:wikipedia":"en:United Bulgarian Bank",name:"Обединена Българска Банка","name:en":"United Bulgarian Bank"},countryCodes:["bg"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Открытие":{name:"Открытие",icon:"maki-bank",imageURL:"https://graph.facebook.com/otkritie/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4327204",amenity:"bank"},addTags:{amenity:"bank",brand:"Открытие","brand:wikidata":"Q4327204","brand:wikipedia":"ru:Банк «Финансовая корпорация Открытие»",name:"Открытие"},countryCodes:["ru"],terms:["банк открытие"],matchScore:2,suggestion:true},"amenity/bank/Ощадбанк":{name:"Ощадбанк",icon:"maki-bank",imageURL:"https://graph.facebook.com/oschadbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4340839",amenity:"bank"},addTags:{amenity:"bank",brand:"Ощадбанк","brand:en":"State Savings Bank of Ukraine","brand:wikidata":"Q4340839","brand:wikipedia":"uk:Ощадбанк",name:"Ощадбанк","name:en":"State Savings Bank of Ukraine"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"amenity/bank/ПУМБ":{name:"ПУМБ",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1085114991370485762/D3vO4DSe_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q4341156",amenity:"bank"},addTags:{amenity:"bank",brand:"ПУМБ","brand:en":"First Ukrainian International Bank","brand:wikidata":"Q4341156","brand:wikipedia":"en:First Ukrainian International Bank",name:"ПУМБ","name:en":"First Ukrainian International Bank"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Почта Банк":{name:"Почта Банк",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1054324676284112896/8hNCP82s_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q24930461",amenity:"bank"},addTags:{amenity:"bank",brand:"Почта Банк","brand:en":"Post Bank","brand:wikidata":"Q24930461","brand:wikipedia":"en:Post Bank (Russia)",name:"Почта Банк","name:en":"Post Bank"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Пощенска банка":{name:"Пощенска банка",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q7234083",amenity:"bank"},addTags:{amenity:"bank",brand:"Пощенска банка","brand:wikidata":"Q7234083","brand:wikipedia":"bg:Пощенска банка",name:"Пощенска банка","name:en":"Postbank"},countryCodes:["bg"],terms:[],matchScore:2,suggestion:true},"amenity/bank/ПриватБанк":{name:"ПриватБанк",icon:"maki-bank",imageURL:"https://graph.facebook.com/privatbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1515015",amenity:"bank"},addTags:{amenity:"bank",brand:"ПриватБанк","brand:en":"PrivatBank","brand:wikidata":"Q1515015","brand:wikipedia":"uk:ПриватБанк",name:"ПриватБанк","name:en":"PrivatBank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Приднестровский Сбербанк":{name:"Приднестровский Сбербанк",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q4378147",amenity:"bank"},addTags:{amenity:"bank",brand:"Приднестровский Сбербанк","brand:en":"Pridnestrovian Savings Bank","brand:ru":"Приднестровский Сбербанк","brand:wikidata":"Q4378147","brand:wikipedia":"ru:Приднестровский Сбербанк",name:"Приднестровский Сбербанк","name:en":"Pridnestrovian Savings Bank","name:ru":"Приднестровский Сбербанк"},countryCodes:["md"],terms:["приднестровский cбербанк"],matchScore:2,suggestion:true},"amenity/bank/Приорбанк":{name:"Приорбанк",icon:"maki-bank",imageURL:"https://graph.facebook.com/Priorbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3919658",amenity:"bank"},addTags:{amenity:"bank",brand:"Приорбанк","brand:en":"PriorBank","brand:wikidata":"Q3919658","brand:wikipedia":"be:Пріорбанк",name:"Приорбанк","name:en":"PriorBank"},countryCodes:["by"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Промсвязьбанк":{name:"Промсвязьбанк",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1141277923082723328/OXpPm2xv_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q649100",amenity:"bank"},addTags:{amenity:"bank",brand:"Промсвязьбанк","brand:en":"Promsvyazbank","brand:wikidata":"Q649100","brand:wikipedia":"en:Promsvyazbank",name:"Промсвязьбанк","name:en":"Promsvyazbank"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/bank/РНКБ":{name:"РНКБ",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1089811715519365120/cq5jOtOD_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q16912944",amenity:"bank"},addTags:{amenity:"bank",brand:"РНКБ","brand:wikidata":"Q16912944","brand:wikipedia":"en:Russian National Commercial Bank",name:"РНКБ"},countryCodes:["ru","ua"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Райффайзен":{name:"Райффайзен",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1136158344052379648/wQYX1AVH_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q4389244",amenity:"bank"},addTags:{amenity:"bank",brand:"Райффайзен","brand:en":"Raiffeisenbank","brand:wikidata":"Q4389244","brand:wikipedia":"en:Raiffeisenbank (Russia)",name:"Райффайзен","name:en":"Raiffeisenbank"},countryCodes:["ru","ua"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Райффайзен Банк Аваль":{name:"Райффайзен Банк Аваль",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/880303932081352704/d66pHime_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q4389243",amenity:"bank"},addTags:{amenity:"bank",brand:"Райффайзен Банк Аваль","brand:en":"Raiffeisen Bank Aval","brand:wikidata":"Q4389243","brand:wikipedia":"en:Raiffeisen Bank Aval",name:"Райффайзен Банк Аваль","name:en":"Raiffeisen Bank Aval"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Росбанк":{name:"Росбанк",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1061886098891292672/qw4qUcW2_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q1119857",amenity:"bank"},addTags:{amenity:"bank",brand:"Росбанк","brand:en":"Rosbank","brand:wikidata":"Q1119857","brand:wikipedia":"en:Rosbank",name:"Росбанк","name:en":"Rosbank"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Россельхозбанк":{name:"Россельхозбанк",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/952899724914446336/9itJSe9x_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q3920226",amenity:"bank"},addTags:{amenity:"bank",brand:"Россельхозбанк","brand:en":"Rosselkhozbank","brand:wikidata":"Q3920226","brand:wikipedia":"en:Russian Agricultural Bank",name:"Россельхозбанк","name:en":"Rosselkhozbank"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Русский Стандарт":{name:"Русский Стандарт",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1014466369105158144/UyZ584fr_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q4400854",amenity:"bank"},addTags:{amenity:"bank",brand:"Русский Стандарт","brand:en":"Russian Standard Bank","brand:wikidata":"Q4400854","brand:wikipedia":"en:Russian Standard Bank",name:"Русский Стандарт","name:en":"Russian Standard Bank"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Сбербанк":{name:"Сбербанк",icon:"maki-bank",imageURL:"https://graph.facebook.com/sberbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q205012",amenity:"bank"},addTags:{amenity:"bank",brand:"Сбербанк","brand:en":"Sberbank","brand:ru":"Сбербанк","brand:wikidata":"Q205012","brand:wikipedia":"en:Sberbank of Russia",name:"Сбербанк","name:en":"Sberbank","name:ru":"Сбербанк"},countryCodes:["kz","ru"],terms:["cбербанк","cбербанк россии","сбербанк россии"],matchScore:2,suggestion:true},"amenity/bank/Совкомбанк":{name:"Совкомбанк",icon:"maki-bank",imageURL:"https://graph.facebook.com/sovcombank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4426566",amenity:"bank"},addTags:{amenity:"bank",brand:"Совкомбанк","brand:en":"Sovcom Bank","brand:wikidata":"Q4426566","brand:wikipedia":"ru:Совкомбанк",name:"Совкомбанк","name:en":"Sovcom Bank"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/bank/УкрСиббанк":{name:"УкрСиббанк",icon:"maki-bank",imageURL:"https://graph.facebook.com/UKRSIBBANK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1976290",amenity:"bank"},addTags:{amenity:"bank",brand:"УкрСиббанк","brand:en":"UkrSibbank","brand:wikidata":"Q1976290","brand:wikipedia":"en:UkrSibbank",name:"УкрСиббанк","name:en":"UkrSibbank"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Укргазбанк":{name:"Укргазбанк",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FUkrgasbank%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q4470692",amenity:"bank"},addTags:{amenity:"bank",brand:"Укргазбанк","brand:en":"Ukrgasbank","brand:wikidata":"Q4470692","brand:wikipedia":"ru:Укргазбанк",name:"Укргазбанк","name:en":"Ukrgasbank"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Укрсоцбанк":{name:"Укрсоцбанк",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3547885",amenity:"bank"},addTags:{amenity:"bank",brand:"Укрсоцбанк","brand:en":"Ukrsotsbank","brand:wikidata":"Q3547885","brand:wikipedia":"en:Ukrsotsbank",name:"Укрсоцбанк","name:en":"Ukrsotsbank"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Уралсиб":{name:"Уралсиб",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q4476693",amenity:"bank"},addTags:{amenity:"bank",brand:"Уралсиб","brand:en":"Uralsib bank","brand:wikidata":"Q4476693","brand:wikipedia":"ru:Уралсиб (банк)",name:"Уралсиб","name:en":"Uralsib bank"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Хаан банк":{name:"Хаан банк",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q25632240",amenity:"bank"},addTags:{amenity:"bank",brand:"Хаан банк","brand:wikidata":"Q25632240","brand:wikipedia":"mn:ХААН банк",name:"Хаан банк"},countryCodes:["mn"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Хоум Кредит":{name:"Хоум Кредит",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1058027651502366720/Pi8dYujA_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q4500466",amenity:"bank"},addTags:{amenity:"bank",brand:"Хоум Кредит","brand:en":"Home Credit & Finance Bank","brand:wikidata":"Q4500466","brand:wikipedia":"en:Home Credit & Finance Bank",name:"Хоум Кредит","name:en":"Home Credit & Finance Bank"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/bank/בנק אגוד":{name:"בנק אגוד",icon:"maki-bank",imageURL:"https://graph.facebook.com/igudbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2903265",amenity:"bank"},addTags:{"alt_name:en":"Bank Igud",amenity:"bank",brand:"בנק אגוד","brand:en":"Union Bank of Israel","brand:he":"בנק אגוד","brand:wikidata":"Q2903265","brand:wikipedia":"en:Union Bank of Israel",name:"בנק אגוד","name:en":"Union Bank of Israel","name:he":"בנק אגוד"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/bank/בנק אוצר החייל":{name:"בנק אוצר החייל",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FOtsarLogoHE.gif&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2900674",amenity:"bank"},addTags:{amenity:"bank",brand:"בנק אוצר החייל","brand:en":"Bank Otsar Ha-Hayal","brand:he":"בנק אוצר החייל","brand:wikidata":"Q2900674","brand:wikipedia":"en:Bank Otsar Ha-Hayal",name:"בנק אוצר החייל","name:en":"Bank Otsar Ha-Hayal","name:he":"בנק אוצר החייל"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/bank/בנק דיסקונט":{name:"בנק דיסקונט",icon:"maki-bank",imageURL:"https://graph.facebook.com/discountbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q250362",amenity:"bank"},addTags:{amenity:"bank",brand:"בנק דיסקונט לישראל","brand:en":"Israel Discount Bank","brand:he":"בנק דיסקונט לישראל","brand:wikidata":"Q250362","brand:wikipedia":"en:Israel Discount Bank",name:"בנק דיסקונט","name:en":"Bank Discount","name:he":"בנק דיסקונט"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/bank/בנק הפועלים":{name:"בנק הפועלים",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/950970103667052544/Ymilo1Mp_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q2666775",amenity:"bank"},addTags:{amenity:"bank",brand:"בנק הפועלים","brand:en":"Bank Hapoalim","brand:he":"בנק הפועלים","brand:wikidata":"Q2666775","brand:wikipedia":"en:Bank Hapoalim",name:"בנק הפועלים","name:en":"Bank Hapoalim","name:he":"בנק הפועלים"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/bank/בנק יהד":{name:"בנק יהד",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q7187611",amenity:"bank"},addTags:{amenity:"bank",brand:"בנק יהד","brand:en":"Bank Yahav","brand:he":"בנק יהד","brand:wikidata":"Q7187611","brand:wikipedia":"he:בנק יהב",name:"בנק יהד","name:en":"Bank Yahav","name:he":"בנק יהד"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/bank/בנק ירושלים":{name:"בנק ירושלים",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q2900227",amenity:"bank"},addTags:{amenity:"bank",brand:"בנק ירושלים","brand:en":"Bank of Jerusalem","brand:he":"בנק ירושלים","brand:wikidata":"Q2900227","brand:wikipedia":"en:Bank of Jerusalem",name:"בנק ירושלים","name:en":"Bank of Jerusalem","name:he":"בנק ירושלים"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/bank/בנק לאומי":{name:"בנק לאומי",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q806641",amenity:"bank"},addTags:{amenity:"bank",brand:"בנק לאומי","brand:en":"Bank Leumi","brand:he":"בנק לאומי","brand:wikidata":"Q806641","brand:wikipedia":"en:Bank Leumi",name:"בנק לאומי","name:en":"Bank Leumi","name:he":"בנק לאומי"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/bank/בנק מסד":{name:"בנק מסד",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q7187667",amenity:"bank"},addTags:{amenity:"bank",brand:"בנק מסד","brand:en":"Bank Massad","brand:he":"בנק מסד","brand:wikidata":"Q7187667","brand:wikipedia":"en:Bank Massad",name:"בנק מסד","name:en":"Bank Massad","name:he":"בנק מסד"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/bank/הבנק הבינלאומי":{name:"הבנק הבינלאומי",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FHaBank%20Hbinleumi%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2777497",amenity:"bank"},addTags:{amenity:"bank",brand:"הבנק הבינלאומי","brand:en":"First International Bank of Israel","brand:he":"הבנק הבינלאומי","brand:wikidata":"Q2777497","brand:wikipedia":"en:First International Bank of Israel",name:"הבנק הבינלאומי","name:en":"First International Bank of Israel","name:he":"הבנק הבינלאומי"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/bank/מזרחי טפחות":{name:"מזרחי טפחות",icon:"maki-bank",imageURL:"https://graph.facebook.com/bank.mizrahi.tefahot/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2777129",amenity:"bank"},addTags:{amenity:"bank",brand:"מזרחי טפחות","brand:en":"Mizrahi-Tefahot","brand:he":"מזרחי טפחות","brand:wikidata":"Q2777129","brand:wikipedia":"en:Bank Mizrahi-Tefahot",name:"בנק מזרחי טפחות","name:en":"Bank Mizrahi-Tefahot","name:he":"בנק מזרחי טפחות"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/bank/بانک آینده":{name:"بانک آینده",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5938144",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک آینده","brand:en":"Ayandeh Bank","brand:wikidata":"Q5938144","brand:wikipedia":"en:Ayandeh Bank",name:"بانک آینده","name:en":"Ayandeh Bank"},countryCodes:["ir"],terms:[],matchScore:2,suggestion:true},"amenity/bank/بانک اقتصاد نوین":{name:"بانک اقتصاد نوین",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5323768",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک اقتصاد نوین","brand:en":"EN Bank","brand:wikidata":"Q5323768","brand:wikipedia":"en:EN Bank",name:"بانک اقتصاد نوین","name:en":"EN Bank"},countryCodes:["ir"],terms:[],matchScore:2,suggestion:true},"amenity/bank/بانک انصار":{name:"بانک انصار",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5862675",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک انصار","brand:wikidata":"Q5862675","brand:wikipedia":"fa:بانک انصار",name:"بانک انصار"},countryCodes:["ir"],terms:[],matchScore:2,suggestion:true},"amenity/bank/بانک ایران زمین":{name:"بانک ایران زمین",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5934423",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک ایران زمین","brand:wikidata":"Q5934423","brand:wikipedia":"en:Iran Zamin Bank",name:"بانک ایران زمین"},countryCodes:["ir"],terms:[],matchScore:2,suggestion:true},"amenity/bank/بانک تجارت":{name:"بانک تجارت",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2F%D9%84%D9%88%DA%AF%D9%88%DB%8C%20%D8%A8%D8%A7%D9%86%DA%A9%20%D8%AA%D8%AC%D8%A7%D8%B1%D8%AA.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q7695198",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک تجارت","brand:wikidata":"Q7695198","brand:wikipedia":"en:Tejarat Bank",name:"بانک تجارت"},countryCodes:["ir"],terms:[],matchScore:2,suggestion:true},"amenity/bank/بانک توسعه تعاون":{name:"بانک توسعه تعاون",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5684450",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک توسعه تعاون","brand:wikidata":"Q5684450","brand:wikipedia":"fa:بانک توسعه تعاون",name:"بانک توسعه تعاون"},countryCodes:["ir"],terms:[],matchScore:2,suggestion:true},"amenity/bank/بانک رفاه":{name:"بانک رفاه",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FRefah-Bank-Logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q7307083",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک رفاه","brand:en":"Refah Bank","brand:wikidata":"Q7307083","brand:wikipedia":"en:Refah Bank",name:"بانک رفاه","name:en":"Refah Bank"},countryCodes:["ir"],terms:["بانک رفاه کارگران"],matchScore:2,suggestion:true},"amenity/bank/بانک سامان":{name:"بانک سامان",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q4117676",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک سامان","brand:en":"Saman Bank","brand:wikidata":"Q4117676","brand:wikipedia":"en:Saman Bank",name:"بانک سامان","name:en":"Saman Bank"},countryCodes:["ir"],terms:[],matchScore:2,suggestion:true},"amenity/bank/بانک سرمایه":{name:"بانک سرمایه",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q7424291",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک سرمایه","brand:en":"Sarmayeh Bank","brand:wikidata":"Q7424291","brand:wikipedia":"en:Sarmayeh Bank",name:"بانک سرمایه","name:en":"Sarmayeh Bank"},countryCodes:["ir"],terms:[],matchScore:2,suggestion:true},"amenity/bank/بانک سپه":{name:"بانک سپه",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q2882624",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک سپه","brand:en":"Bank Sepah","brand:wikidata":"Q2882624","brand:wikipedia":"en:Bank Sepah",name:"بانک سپه","name:en":"Bank Sepah"},countryCodes:["ir"],terms:[],matchScore:2,suggestion:true},"amenity/bank/بانک سینا":{name:"بانک سینا",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q10860246",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک سینا","brand:en":"Sina Bank","brand:wikidata":"Q10860246","brand:wikipedia":"en:Sina Bank",name:"بانک سینا","name:en":"Sina Bank"},countryCodes:["ir"],terms:[],matchScore:2,suggestion:true},"amenity/bank/بانک شهر":{name:"بانک شهر",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5941033",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک شهر","brand:en":"Shahr Bank","brand:wikidata":"Q5941033","brand:wikipedia":"fa:بانک شهر",name:"بانک شهر","name:en":"Shahr Bank"},countryCodes:["ir"],terms:[],matchScore:2,suggestion:true},"amenity/bank/بانک صادرات":{name:"بانک صادرات",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBank%20Saderat%20Iran%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2882608",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک صادرات","brand:en":"Bank Saderat Iran","brand:wikidata":"Q2882608","brand:wikipedia":"en:Bank Saderat Iran",name:"بانک صادرات","name:en":"Bank Saderat Iran"},countryCodes:["ir"],terms:["بانک صادرات ایران","صادرات"],matchScore:2,suggestion:true},"amenity/bank/بانک قوامین":{name:"بانک قوامین",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q10860253",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک قوامین","brand:en":"Ghavamin Bank","brand:wikidata":"Q10860253","brand:wikipedia":"en:Ghavamin Bank",name:"بانک قوامین","name:en":"Ghavamin Bank"},countryCodes:["ir"],terms:[],matchScore:2,suggestion:true},"amenity/bank/بانک مسکن":{name:"بانک مسکن",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBank%20maskan.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q4855942",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک مسکن","brand:en":"Bank Maskan","brand:wikidata":"Q4855942","brand:wikipedia":"en:Bank Maskan",name:"بانک مسکن","name:en":"Bank Maskan"},countryCodes:["ir"],terms:[],matchScore:2,suggestion:true},"amenity/bank/بانک ملت":{name:"بانک ملت",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q4855944",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک ملت","brand:en":"Bank Mellat","brand:wikidata":"Q4855944","brand:wikipedia":"en:Bank Mellat",name:"بانک ملت","name:en":"Bank Mellat"},countryCodes:["ir"],terms:[],matchScore:2,suggestion:true},"amenity/bank/بانک ملی":{name:"بانک ملی",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FMelli%20Bank%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q806640",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک ملی","brand:en":"Bank Melli Iran","brand:wikidata":"Q806640","brand:wikipedia":"en:Bank Melli Iran",name:"بانک ملی","name:en":"Bank Melli Iran"},countryCodes:["ir"],terms:["بانک ملی ایران","ملی"],matchScore:2,suggestion:true},"amenity/bank/بانک مهر اقتصاد":{name:"بانک مهر اقتصاد",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5942921",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک مهر اقتصاد","brand:wikidata":"Q5942921","brand:wikipedia":"fa:بانک مهر اقتصاد",name:"بانک مهر اقتصاد","name:en":"Mehr Eqtesad Bank"},countryCodes:["ir"],terms:[],matchScore:2,suggestion:true},"amenity/bank/بانک پارسیان":{name:"بانک پارسیان",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q2410404",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک پارسیان","brand:en":"Parsian Bank","brand:wikidata":"Q2410404","brand:wikipedia":"en:Parsian Bank",name:"بانک پارسیان","name:en":"Parsian Bank"},countryCodes:["ir"],terms:[],matchScore:2,suggestion:true},"amenity/bank/بانک پاسارگاد":{name:"بانک پاسارگاد",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q4855962",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک پاسارگاد","brand:en":"Bank Pasargad","brand:wikidata":"Q4855962","brand:wikipedia":"en:Bank Pasargad",name:"بانک پاسارگاد","name:en":"Bank Pasargad"},countryCodes:["ir"],terms:[],matchScore:2,suggestion:true},"amenity/bank/بانک کشاورزی":{name:"بانک کشاورزی",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q6395007",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک کشاورزی","brand:en":"Bank Keshavarzi Iran","brand:wikidata":"Q6395007","brand:wikipedia":"en:Bank Keshavarzi Iran",name:"بانک کشاورزی","name:en":"Bank Keshavarzi Iran"},countryCodes:["ir"],terms:[],matchScore:2,suggestion:true},"amenity/bank/پست بانک":{name:"پست بانک",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q7233625",amenity:"bank"},addTags:{amenity:"bank",brand:"پست بانک","brand:en":"Post Bank of Iran","brand:wikidata":"Q7233625","brand:wikipedia":"en:Post Bank of Iran",name:"پست بانک","name:en":"Post Bank of Iran"},countryCodes:["ir"],terms:[],matchScore:2,suggestion:true},"amenity/bank/অগ্রণী ব্যাংক লিমিটেড":{name:"অগ্রণী ব্যাংক লিমিটেড",icon:"maki-bank",imageURL:"https://graph.facebook.com/AgraniBankLimited/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q517050",amenity:"bank"},addTags:{amenity:"bank",brand:"অগ্রণী ব্যাংক লিমিটেড","brand:wikidata":"Q517050","brand:wikipedia":"en:Agrani Bank",name:"অগ্রণী ব্যাংক লিমিটেড","name:en":"Agrani Bank"},countryCodes:["bd"],terms:[],matchScore:2,suggestion:true},"amenity/bank/গ্রামীণ ব্যাংক":{name:"গ্রামীণ ব্যাংক",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q188567",amenity:"bank"},addTags:{amenity:"bank",brand:"গ্রামীণ ব্যাংক","brand:wikidata":"Q188567","brand:wikipedia":"en:Grameen Bank",name:"গ্রামীণ ব্যাংক","name:en":"Grameen Bank"},countryCodes:["bd"],terms:[],matchScore:2,suggestion:true},"amenity/bank/বাংলাদেশ কৃষি ব্যাংক":{name:"বাংলাদেশ কৃষি ব্যাংক",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q16345932",amenity:"bank"},addTags:{amenity:"bank",brand:"বাংলাদেশ কৃষি ব্যাংক","brand:wikidata":"Q16345932","brand:wikipedia":"en:Bangladesh Krishi Bank",name:"বাংলাদেশ কৃষি ব্যাংক","name:en":"Bangladesh Krishi Bank"},countryCodes:["bd"],terms:[],matchScore:2,suggestion:true},"amenity/bank/ธนาคารกรุงเทพ":{name:"ธนาคารกรุงเทพ",icon:"maki-bank",imageURL:"https://graph.facebook.com/371998329537690/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q806483",amenity:"bank"},addTags:{amenity:"bank",brand:"ธนาคารกรุงเทพ","brand:en":"Bangkok Bank","brand:th":"ธนาคารกรุงเทพ","brand:wikidata":"Q806483","brand:wikipedia":"en:Bangkok Bank",name:"ธนาคารกรุงเทพ","name:en":"Bangkok Bank","name:th":"ธนาคารกรุงเทพ"},countryCodes:["th"],terms:[],matchScore:2,suggestion:true},"amenity/bank/ธนาคารกรุงไทย":{name:"ธนาคารกรุงไทย",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1100959964040814599/Wv9V7iMd_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q962865",amenity:"bank"},addTags:{amenity:"bank",brand:"ธนาคารกรุงไทย","brand:en":"Krung Thai Bank","brand:th":"ธนาคารกรุงไทย","brand:wikidata":"Q962865","brand:wikipedia":"en:Krung Thai Bank",name:"ธนาคารกรุงไทย","name:en":"Krung Thai Bank","name:th":"ธนาคารกรุงไทย"},countryCodes:["th"],terms:[],matchScore:2,suggestion:true},"amenity/bank/ธนาคารกสิกรไทย":{name:"ธนาคารกสิกรไทย",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1135574794030555137/jPG1Vsfu_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q276557",amenity:"bank"},addTags:{amenity:"bank",brand:"ธนาคารกสิกรไทย","brand:en":"en:Kasikornbank","brand:th":"ธนาคารกสิกรไทย","brand:wikidata":"Q276557","brand:wikipedia":"en:Kasikornbank",name:"ธนาคารกสิกรไทย","name:en":"en:Kasikornbank","name:th":"ธนาคารกสิกรไทย"},countryCodes:["th"],terms:[],matchScore:2,suggestion:true},"amenity/bank/ธนาคารออมสิน":{name:"ธนาคารออมสิน",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q6579041",amenity:"bank"},addTags:{amenity:"bank",brand:"ธนาคารออมสิน","brand:en":"Government Savings Bank","brand:th":"ธนาคารออมสิน","brand:wikidata":"Q6579041","brand:wikipedia":"en:Government Savings Bank (Thailand)",name:"ธนาคารออมสิน","name:en":"Government Savings Bank","name:th":"ธนาคารออมสิน"},countryCodes:["th"],terms:[],matchScore:2,suggestion:true},"amenity/bank/ธนาคารไทยพาณิชย์":{name:"ธนาคารไทยพาณิชย์",icon:"maki-bank",imageURL:"https://graph.facebook.com/scb.thailand/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2038986",amenity:"bank"},addTags:{amenity:"bank",brand:"ธนาคารไทยพาณิชย์","brand:en":"Siam Commercial Bank","brand:th":"ธนาคารไทยพาณิชย์","brand:wikidata":"Q2038986","brand:wikipedia":"en:Siam Commercial Bank",name:"ธนาคารไทยพาณิชย์","name:en":"Siam Commercial Bank","name:th":"ธนาคารไทยพาณิชย์"},countryCodes:["th"],terms:[],matchScore:2,suggestion:true},"amenity/bank/みずほ銀行":{name:"みずほ銀行",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/902036508672106496/L8rp7WY6_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q2882956",amenity:"bank"},addTags:{amenity:"bank",brand:"みずほ銀行","brand:en":"Mizuho Bank","brand:ja":"みずほ銀行","brand:wikidata":"Q2882956","brand:wikipedia":"en:Mizuho Bank",name:"みずほ銀行","name:en":"Mizuho Bank","name:ja":"みずほ銀行"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/bank/ゆうちょ銀行":{name:"ゆうちょ銀行",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FJapan%20Post%20Bank%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q907103",amenity:"bank"},addTags:{amenity:"bank",brand:"ゆうちょ銀行","brand:en":"Japan Post Bank","brand:ja":"ゆうちょ銀行","brand:wikidata":"Q907103","brand:wikipedia":"ja:ゆうちょ銀行",name:"ゆうちょ銀行","name:en":"Japan Post Bank","name:ja":"ゆうちょ銀行"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/bank/りそな銀行":{name:"りそな銀行",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FResona%20Bank%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q11281447",amenity:"bank"},addTags:{amenity:"bank",brand:"りそな銀行","brand:en":"Resona Bank","brand:ja":"りそな銀行","brand:wikidata":"Q11281447","brand:wikipedia":"ja:りそな銀行",name:"りそな銀行","name:en":"Resona Bank","name:ja":"りそな銀行"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/bank/三井住友銀行":{name:"三井住友銀行",icon:"maki-bank",imageURL:"https://graph.facebook.com/smbc.jp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2660418",amenity:"bank"},addTags:{amenity:"bank",brand:"三井住友銀行","brand:en":"Sumitomo Mitsui Banking Corporation","brand:wikidata":"Q2660418","brand:wikipedia":"en:Sumitomo Mitsui Banking Corporation",name:"三井住友銀行","name:en":"Sumitomo Mitsui Banking Corporation"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/bank/三菱東京UFJ銀行":{name:"三菱東京UFJ銀行",icon:"maki-bank",imageURL:"https://graph.facebook.com/bk.mufg.jp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q988284",amenity:"bank"},addTags:{amenity:"bank",brand:"三菱東京UFJ銀行","brand:en":"MUFG Bank","brand:wikidata":"Q988284","brand:wikipedia":"en:MUFG Bank",name:"三菱東京UFJ銀行","name:en":"MUFG Bank"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/bank/上海商業儲蓄銀行":{name:"上海商業儲蓄銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q4207208",amenity:"bank"},addTags:{amenity:"bank",brand:"上海商業儲蓄銀行","brand:en":"Shanghai Commercial and Savings Bank","brand:wikidata":"Q4207208","brand:wikipedia":"en:Shanghai Commercial and Savings Bank",name:"上海商業儲蓄銀行","name:en":"Shanghai Commercial and Savings Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/东亚银行":{name:"东亚银行",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBank%20of%20East%20Asia%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q806679",amenity:"bank"},addTags:{amenity:"bank",brand:"东亚银行","brand:wikidata":"Q806679","brand:wikipedia":"en:Bank of East Asia",name:"东亚银行","name:en":"Bank of East Asia"},countryCodes:["cn"],terms:[],matchScore:2,suggestion:true},"amenity/bank/中信银行":{name:"中信银行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q38960",amenity:"bank"},addTags:{amenity:"bank",brand:"中信银行","brand:en":"China CITIC Bank","brand:wikidata":"Q38960","brand:wikipedia":"en:China CITIC Bank",name:"中信银行"},countryCodes:["cn"],terms:[],matchScore:2,suggestion:true},"amenity/bank/中国农业银行":{name:"中国农业银行",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FAgricultural%20Bank%20of%20China%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q26298",amenity:"bank"},addTags:{amenity:"bank",brand:"中国农业银行","brand:en":"Agricultural Bank of China","brand:wikidata":"Q26298","brand:wikipedia":"en:Agricultural Bank of China",name:"中国农业银行","name:en":"Agricultural Bank of China"},countryCodes:["cn"],terms:[],matchScore:2,suggestion:true},"amenity/bank/中国工商银行":{name:"中国工商银行",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FICBC%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q26463",amenity:"bank"},addTags:{amenity:"bank",brand:"中国工商银行","brand:en":"Industrial and Commercial Bank of China","brand:wikidata":"Q26463","brand:wikipedia":"en:Industrial and Commercial Bank of China",name:"中国工商银行","name:en":"Industrial and Commercial Bank of China"},countryCodes:["cn"],terms:[],matchScore:2,suggestion:true},"amenity/bank/中国建设银行":{name:"中国建设银行",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FChina%20Construction%20Bank%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q26299",amenity:"bank"},addTags:{amenity:"bank",brand:"中国建设银行","brand:en":"China Construction Bank","brand:wikidata":"Q26299","brand:wikipedia":"en:China Construction Bank",name:"中国建设银行","name:en":"China Construction Bank"},countryCodes:["cn"],terms:[],matchScore:2,suggestion:true},"amenity/bank/中国民生银行":{name:"中国民生银行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q911543",amenity:"bank"},addTags:{amenity:"bank",brand:"中国民生银行","brand:en":"China Minsheng Bank","brand:wikidata":"Q911543","brand:wikipedia":"en:China Minsheng Bank",name:"中国民生银行","name:en":"China Minsheng Bank"},countryCodes:["cn"],terms:[],matchScore:2,suggestion:true},"amenity/bank/中国邮政储蓄银行":{name:"中国邮政储蓄银行",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FPostal%20Savings%20Bank%20of%20China%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q986744",amenity:"bank"},addTags:{amenity:"bank",brand:"中国邮政储蓄银行","brand:en":"Postal Savings Bank of China","brand:wikidata":"Q986744","brand:wikipedia":"en:Postal Savings Bank of China",name:"中国邮政储蓄银行","name:en":"Postal Savings Bank of China"},countryCodes:["cn"],terms:[],matchScore:2,suggestion:true},"amenity/bank/中国银行":{name:"中国银行",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FChinese%20Bank%20of%20China.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q790068",amenity:"bank"},addTags:{amenity:"bank",brand:"中国银行","brand:en":"Bank of China","brand:wikidata":"Q790068","brand:wikipedia":"en:Bank of China",name:"中国银行","name:en":"Bank of China"},countryCodes:["cn"],terms:[],matchScore:2,suggestion:true},"amenity/bank/中國信託商業銀行":{name:"中國信託商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5100191",amenity:"bank"},addTags:{amenity:"bank",brand:"中國信託商業銀行","brand:en":"CTBC Bank","brand:wikidata":"Q5100191","brand:wikipedia":"en:CTBC Bank",name:"中國信託商業銀行","name:en":"CTBC Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/交通银行":{name:"交通银行",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBank%20of%20Communications%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q806680",amenity:"bank"},addTags:{amenity:"bank",brand:"交通银行","brand:en":"Bank of Communications","brand:wikidata":"Q806680","brand:wikipedia":"en:Bank of Communications",name:"交通银行","name:en":"Bank of Communications"},countryCodes:["cn"],terms:[],matchScore:2,suggestion:true},"amenity/bank/京城商業銀行":{name:"京城商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q10883132",amenity:"bank"},addTags:{amenity:"bank",brand:"京城商業銀行","brand:wikidata":"Q10883132","brand:wikipedia":"zh:京城商業銀行",name:"京城商業銀行"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/京都中央信用金庫":{name:"京都中央信用金庫",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q11374844",amenity:"bank"},addTags:{amenity:"bank",brand:"京都中央信用金庫","brand:en":"Kyoto Chuo Shinkin Bank","brand:wikidata":"Q11374844","brand:wikipedia":"ja:京都中央信用金庫",name:"京都中央信用金庫","name:en":"Kyoto Chuo Shinkin Bank"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/bank/京都銀行":{name:"京都銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q11375713",amenity:"bank"},addTags:{amenity:"bank",brand:"京都銀行","brand:en":"Bank of Kyoto","brand:wikidata":"Q11375713","brand:wikipedia":"en:Bank of Kyoto",name:"京都銀行","name:en":"Bank of Kyoto"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/bank/元大商業銀行":{name:"元大商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q10889602",amenity:"bank"},addTags:{amenity:"bank",brand:"元大商業銀行","brand:en":"Yuanta Commercial Bank","brand:wikidata":"Q10889602","brand:wikipedia":"zh:元大商業銀行",name:"元大商業銀行","name:en":"Yuanta Commercial Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/兆豐國際商業銀行":{name:"兆豐國際商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q709757",amenity:"bank"},addTags:{amenity:"bank",brand:"兆豐國際商業銀行","brand:en":"Mega International Commercial Bank","brand:wikidata":"Q709757","brand:wikipedia":"en:Mega International Commercial Bank",name:"兆豐國際商業銀行","name:en":"Mega International Commercial Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/农业银行":{name:"农业银行",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FAgricultural%20Bank%20of%20China%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q26298",amenity:"bank"},addTags:{amenity:"bank",brand:"农业银行","brand:wikidata":"Q26298","brand:wikipedia":"zh:中国农业银行",name:"农业银行"},countryCodes:["cn"],terms:[],matchScore:2,suggestion:true},"amenity/bank/北洋銀行":{name:"北洋銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q11402354",amenity:"bank"},addTags:{amenity:"bank",brand:"北洋銀行","brand:en":"North Pacific Bank","brand:wikidata":"Q11402354","brand:wikipedia":"ja:北洋銀行",name:"北洋銀行","name:en":"North Pacific Bank"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/bank/北海道銀行":{name:"北海道銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5878076",amenity:"bank"},addTags:{amenity:"bank",brand:"北海道銀行","brand:en":"Hokkaido Bank","brand:wikidata":"Q5878076","brand:wikipedia":"en:Hokkaido Bank",name:"北海道銀行","name:en":"Hokkaido Bank"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/bank/台中商業銀行":{name:"台中商業銀行",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FTcbbank%20headoffice.JPG&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q6136958",amenity:"bank"},addTags:{amenity:"bank",brand:"台中商業銀行","brand:en":"Taichung Bank","brand:wikidata":"Q6136958","brand:wikipedia":"en:Taichung Bank",name:"台中商業銀行","name:en":"Taichung Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/台北富邦商業銀行":{name:"台北富邦商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q697293",amenity:"bank"},addTags:{amenity:"bank",brand:"台北富邦商業銀行","brand:en":"Taipei Fubon Bank","brand:wikidata":"Q697293","brand:wikipedia":"en:Taipei Fubon Bank",name:"台北富邦商業銀行","name:en":"Taipei Fubon Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/台新國際商業銀行":{name:"台新國際商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q7676420",amenity:"bank"},addTags:{amenity:"bank",brand:"台新國際商業銀行","brand:en":"Taishin International Bank","brand:wikidata":"Q7676420","brand:wikipedia":"en:Taishin International Bank",name:"台新國際商業銀行","name:en":"Taishin International Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/合作金庫商業銀行":{name:"合作金庫商業銀行",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FDepartment%20of%20Business%2C%20Taiwan%20Cooperative%20Bank%2020171216.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q701540",amenity:"bank"},addTags:{amenity:"bank",brand:"合作金庫商業銀行","brand:en":"Taiwan Cooperative Bank","brand:wikidata":"Q701540","brand:wikipedia":"en:Taiwan Cooperative Bank",name:"合作金庫商業銀行","name:en":"Taiwan Cooperative Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/國泰世華商業銀行":{name:"國泰世華商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q702656",amenity:"bank"},addTags:{amenity:"bank",brand:"國泰世華商業銀行","brand:en":"Cathay United Bank","brand:wikidata":"Q702656","brand:wikipedia":"en:Cathay United Bank",name:"國泰世華商業銀行","name:en":"Cathay United Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/大眾商業銀行":{name:"大眾商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q10937047",amenity:"bank"},addTags:{amenity:"bank",brand:"大眾商業銀行","brand:en":"Ta Chong Commercial Bank","brand:wikidata":"Q10937047","brand:wikipedia":"zh:大眾商業銀行",name:"大眾商業銀行","name:en":"Ta Chong Commercial Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/安泰商業銀行":{name:"安泰商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q10946952",amenity:"bank"},addTags:{amenity:"bank",brand:"安泰商業銀行","brand:en":"Entie Commercial Bank","brand:wikidata":"Q10946952","brand:wikipedia":"zh:安泰商業銀行",name:"安泰商業銀行","name:en":"Entie Commercial Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/工商银行":{name:"工商银行",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FICBC%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q26463",amenity:"bank"},addTags:{amenity:"bank",brand:"工商银行","brand:en":"Industrial and Commercial Bank of China","brand:wikidata":"Q26463","brand:wikipedia":"en:Industrial and Commercial Bank of China",name:"工商银行","name:en":"Industrial and Commercial Bank of China"},countryCodes:["cn"],terms:[],matchScore:2,suggestion:true},"amenity/bank/常陽銀行":{name:"常陽銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q6297774",amenity:"bank"},addTags:{amenity:"bank",brand:"常陽銀行","brand:wikidata":"Q6297774","brand:wikipedia":"en:Joyo Bank",name:"常陽銀行"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/bank/建设银行":{name:"建设银行",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FChina%20Construction%20Bank%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q26299",amenity:"bank"},addTags:{amenity:"bank",brand:"建设银行","brand:wikidata":"Q26299","brand:wikipedia":"zh:中国建设银行",name:"建设银行"},countryCodes:["cn"],terms:[],matchScore:2,suggestion:true},"amenity/bank/彰化商業銀行":{name:"彰化商業銀行",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCentral%20Branch%2C%20Chang%20Hwa%20Bank%2020101213.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q5071627",amenity:"bank"},addTags:{amenity:"bank",brand:"彰化商業銀行","brand:en":"Chang Hwa Bank","brand:wikidata":"Q5071627","brand:wikipedia":"en:Chang Hwa Bank",name:"彰化商業銀行","name:en":"Chang Hwa Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/招商银行":{name:"招商银行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q1073327",amenity:"bank"},addTags:{amenity:"bank",brand:"招商银行","brand:en":"China Merchants Bank","brand:wikidata":"Q1073327","brand:wikipedia":"en:China Merchants Bank",name:"招商银行","name:en":"China Merchants Bank"},countryCodes:["cn"],terms:[],matchScore:2,suggestion:true},"amenity/bank/日本銀行":{name:"日本銀行",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1695643374/medama_moji_en_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q333101",amenity:"bank"},addTags:{amenity:"bank",brand:"日本銀行","brand:en":"Bank of Japan","brand:wikidata":"Q333101","brand:wikipedia":"ja:日本銀行",name:"日本銀行","name:en":"Bank of Japan"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/bank/東亞銀行":{name:"東亞銀行",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBank%20of%20East%20Asia%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q806679",amenity:"bank"},addTags:{amenity:"bank",brand:"東亞銀行","brand:en":"Bank of East Asia","brand:wikidata":"Q806679","brand:wikipedia":"zh:東亞銀行","brand:zh-Hans":"东亚银行","brand:zh-Hant":"東亞銀行",name:"東亞銀行 BEA","name:en":"Bank of East Asia","name:zh-Hans":"东亚银行","name:zh-Hant":"東亞銀行"},countryCodes:["hk"],terms:[],matchScore:2,suggestion:true},"amenity/bank/板信商業銀行":{name:"板信商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q11104946",amenity:"bank"},addTags:{amenity:"bank",brand:"板信商業銀行","brand:en":"Bank of Panshin","brand:wikidata":"Q11104946","brand:wikipedia":"zh:板信商業銀行",name:"板信商業銀行","name:en":"Bank of Panshin"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/横浜銀行":{name:"横浜銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q2744340",amenity:"bank"},addTags:{amenity:"bank",brand:"横浜銀行","brand:en":"Bank of Yokohama","brand:wikidata":"Q2744340","brand:wikipedia":"en:Bank of Yokohama",name:"横浜銀行","name:en":"Bank of Yokohama"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/bank/永豐商業銀行":{name:"永豐商業銀行",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBank%20SinoPac%20logo%2020121103.gif&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q4855976",amenity:"bank"},addTags:{amenity:"bank",brand:"永豐商業銀行","brand:en":"Bank SinoPac","brand:wikidata":"Q4855976","brand:wikipedia":"en:Bank SinoPac",name:"永豐商業銀行","name:en":"Bank SinoPac"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/渣打國際商業銀行":{name:"渣打國際商業銀行",icon:"maki-bank",imageURL:"https://graph.facebook.com/StandardCharteredTW/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62267023",amenity:"bank"},addTags:{amenity:"bank",brand:"渣打國際商業銀行","brand:wikidata":"Q62267023",name:"渣打國際商業銀行"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/玉山商業銀行":{name:"玉山商業銀行",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FE.SUN%20Bank.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q5321663",amenity:"bank"},addTags:{amenity:"bank",brand:"玉山商業銀行","brand:en":"E.SUN Commercial Bank","brand:wikidata":"Q5321663","brand:wikipedia":"en:E.SUN Commercial Bank",name:"玉山商業銀行","name:en":"E.SUN Commercial Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/第一商業銀行":{name:"第一商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q11602128",amenity:"bank"},addTags:{amenity:"bank",brand:"第一商業銀行","brand:en":"First Commercial Bank","brand:wikidata":"Q11602128","brand:wikipedia":"zh:第一商業銀行",name:"第一商業銀行","name:en":"First Commercial Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/聯邦商業銀行":{name:"聯邦商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q15927195",amenity:"bank"},addTags:{amenity:"bank",brand:"聯邦商業銀行","brand:en":"Union Bank of Taiwan","brand:wikidata":"Q15927195","brand:wikipedia":"zh:聯邦商業銀行",name:"聯邦商業銀行","name:en":"Union Bank of Taiwan"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/臺灣中小企業銀行":{name:"臺灣中小企業銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q15913812",amenity:"bank"},addTags:{amenity:"bank",brand:"臺灣中小企業銀行","brand:en":"Taiwan Business Bank","brand:wikidata":"Q15913812","brand:wikipedia":"zh:臺灣中小企業銀行",name:"臺灣中小企業銀行","name:en":"Taiwan Business Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/臺灣土地銀行":{name:"臺灣土地銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q717592",amenity:"bank"},addTags:{amenity:"bank",brand:"臺灣土地銀行","brand:en":"Land Bank of Taiwan","brand:wikidata":"Q717592","brand:wikipedia":"en:Land Bank of Taiwan",name:"臺灣土地銀行","name:en":"Land Bank of Taiwan"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/臺灣新光商業銀行":{name:"臺灣新光商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q15909616",amenity:"bank"},addTags:{amenity:"bank",brand:"臺灣新光商業銀行","brand:en":"Shin Kong Commercial Bank","brand:wikidata":"Q15909616","brand:wikipedia":"zh:臺灣新光商業銀行",name:"臺灣新光商業銀行","name:en":"Shin Kong Commercial Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/臺灣銀行":{name:"臺灣銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q706533",amenity:"bank"},addTags:{amenity:"bank",brand:"臺灣銀行","brand:en":"Bank of Taiwan","brand:wikidata":"Q706533","brand:wikipedia":"en:Bank of Taiwan",name:"臺灣銀行","name:en":"Bank of Taiwan"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/華南商業銀行":{name:"華南商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q11620043",amenity:"bank"},addTags:{amenity:"bank",brand:"華南商業銀行","brand:en":"Hua Nan Commercial Bank","brand:wikidata":"Q11620043","brand:wikipedia":"zh:華南銀行",name:"華南商業銀行","name:en":"Hua Nan Commercial Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/遠東國際商業銀行":{name:"遠東國際商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q15911143",amenity:"bank"},addTags:{amenity:"bank",brand:"遠東國際商業銀行","brand:en":"Far Eastern International Bank","brand:wikidata":"Q15911143","brand:wikipedia":"zh:遠東國際商業銀行",name:"遠東國際商業銀行","name:en":"Far Eastern International Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/陽信商業銀行":{name:"陽信商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q11658759",amenity:"bank"},addTags:{amenity:"bank",brand:"陽信商業銀行","brand:en":"Sunny Commercial Bank","brand:wikidata":"Q11658759","brand:wikipedia":"zh:陽信商業銀行",name:"陽信商業銀行","name:en":"Sunny Commercial Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/静岡銀行":{name:"静岡銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q7499501",amenity:"bank"},addTags:{amenity:"bank",brand:"静岡銀行","brand:en":"Shizuoka Bank","brand:wikidata":"Q7499501","brand:wikipedia":"en:Shizuoka Bank",name:"静岡銀行","name:en":"Shizuoka Bank"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/bank/국민은행":{name:"국민은행",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FKB%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q496606",amenity:"bank"},addTags:{amenity:"bank",brand:"국민은행","brand:en":"KB Kookmin Bank","brand:ko":"국민은행","brand:wikidata":"Q496606","brand:wikipedia":"en:KB Financial Group Inc",name:"국민은행","name:en":"KB Kookmin Bank","name:ko":"국민은행"},countryCodes:["kr"],terms:["국민은행 (gungmin bank)"],matchScore:2,suggestion:true},"amenity/bank/기업은행":{name:"기업은행",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q483855",amenity:"bank"},addTags:{amenity:"bank",brand:"기업은행","brand:en":"Industrial Bank of Korea","brand:ko":"기업은행","brand:wikidata":"Q483855","brand:wikipedia":"en:Industrial Bank of Korea",name:"기업은행","name:en":"Industrial Bank of Korea","name:ko":"기업은행"},countryCodes:["kr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/농협":{name:"농협",icon:"maki-bank",imageURL:"https://graph.facebook.com/nhnonghyupbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q15283673",amenity:"bank"},addTags:{amenity:"bank",brand:"농협","brand:en":"NH","brand:ko":"농협","brand:wikidata":"Q15283673","brand:wikipedia":"ko:NH농협은행",name:"농협","name:en":"NH","name:ko":"농협"},countryCodes:["kr"],terms:["nh농협은행"],matchScore:2,suggestion:true},"amenity/bank/새마을금고":{name:"새마을금고",icon:"maki-bank",imageURL:"https://graph.facebook.com/kfcc.kr/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12600614",amenity:"bank"},addTags:{amenity:"bank",brand:"새마을금고","brand:ko":"새마을금고","brand:wikidata":"Q12600614","brand:wikipedia":"ko:새마을금고",name:"새마을금고","name:ko":"새마을금고"},countryCodes:["kr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/신한은행":{name:"신한은행",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q487230",amenity:"bank"},addTags:{amenity:"bank",brand:"신한은행","brand:en":"Sinhan Bank","brand:ko":"신한은행","brand:wikidata":"Q487230","brand:wikipedia":"en:Shinhan Bank",name:"신한은행","name:en":"Sinhan Bank","name:ko":"신한은행"},countryCodes:["kr"],terms:["신한은행 (sinhan bank)"],matchScore:2,suggestion:true},"amenity/bank/우리은행":{name:"우리은행",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/2838394455/1686ad262e3d37918e0830b9479d6aea_bigger.jpeg",geometry:["point","area"],tags:{"brand:wikidata":"Q494369",amenity:"bank"},addTags:{amenity:"bank",brand:"우리은행","brand:en":"Woori Bank","brand:ko":"우리은행","brand:wikidata":"Q494369","brand:wikipedia":"en:Woori Bank",name:"우리은행","name:en":"Woori Bank","name:ko":"우리은행"},countryCodes:["kr"],terms:["우리은행 (uri bank)"],matchScore:2,suggestion:true},"amenity/bank/하나은행":{name:"하나은행",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/894461767065128960/SK5wN3DO_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q484047",amenity:"bank"},addTags:{amenity:"bank",brand:"하나은행","brand:en":"Korea Exchange Bank","brand:ko":"하나은행","brand:wikidata":"Q484047","brand:wikipedia":"en:Korea Exchange Bank",name:"하나은행","name:en":"Korea Exchange Bank","name:ko":"하나은행"},countryCodes:["kr"],terms:[],matchScore:2,suggestion:true},"amenity/bar/All Bar One":{name:"All Bar One",icon:"maki-bar",imageURL:"https://pbs.twimg.com/profile_images/717013484467306497/vjG-lkGe_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q4728624",amenity:"bar"},addTags:{amenity:"bar",brand:"All Bar One","brand:wikidata":"Q4728624","brand:wikipedia":"en:All Bar One",name:"All Bar One"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/bar/Revolución de Cuba":{name:"Revolución de Cuba",icon:"maki-bar",imageURL:"https://pbs.twimg.com/profile_images/1001476884482396160/3NEm7OnI_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q64024691",amenity:"bar"},addTags:{amenity:"bar",brand:"Revolución de Cuba","brand:wikidata":"Q64024691",name:"Revolución de Cuba"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/bar/Revolution":{name:"Revolution",icon:"maki-bar",imageURL:"https://graph.facebook.com/revolutionbars/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64024398",amenity:"bar"},addTags:{amenity:"bar",brand:"Revolution","brand:wikidata":"Q64024398",name:"Revolution"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/bicycle_rental/Call a Bike":{name:"Call a Bike",icon:"maki-bicycle",imageURL:"https://graph.facebook.com/callabikesharing/picture?type=large",geometry:["point","vertex","area"],tags:{"brand:wikidata":"Q1060525",amenity:"bicycle_rental"},addTags:{amenity:"bicycle_rental",brand:"Call a Bike","brand:wikidata":"Q1060525","brand:wikipedia":"en:Call a Bike",name:"Call a Bike"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/bicycle_rental/Grid":{name:"Grid",icon:"maki-bicycle",imageURL:"https://graph.facebook.com/Gridbikes/picture?type=large",geometry:["point","vertex","area"],tags:{"brand:wikidata":"Q62104168",amenity:"bicycle_rental"},addTags:{amenity:"bicycle_rental",brand:"Grid","brand:wikidata":"Q62104168",name:"Grid"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bicycle_rental/MiBici":{name:"MiBici",icon:"maki-bicycle",imageURL:"https://graph.facebook.com/MiBiciPublica/picture?type=large",geometry:["point","vertex","area"],tags:{"brand:wikidata":"Q60966987",amenity:"bicycle_rental"},addTags:{amenity:"bicycle_rental",brand:"MiBici","brand:wikidata":"Q60966987","brand:wikipedia":"es:MiBici",name:"MiBici"},countryCodes:["mx"],terms:[],matchScore:2,suggestion:true},"amenity/bicycle_rental/Swapfiets":{name:"Swapfiets",icon:"maki-bicycle",imageURL:"https://graph.facebook.com/Swapfiets/picture?type=large",geometry:["point","vertex","area"],tags:{"brand:wikidata":"Q62104374",amenity:"bicycle_rental"},addTags:{amenity:"bicycle_rental",brand:"Swapfiets","brand:wikidata":"Q62104374",name:"Swapfiets"},countryCodes:["be","de","dk","nl"],terms:[],matchScore:2,suggestion:true},"amenity/bicycle_rental/metropolradruhr":{name:"metropolradruhr",icon:"maki-bicycle",imageURL:"https://graph.facebook.com/nextbike/picture?type=large",geometry:["point","vertex","area"],tags:{"brand:wikidata":"Q62104274",amenity:"bicycle_rental"},addTags:{amenity:"bicycle_rental",brand:"metropolradruhr","brand:wikidata":"Q62104274",name:"metropolradruhr"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/bicycle_rental/nextbike":{name:"nextbike",icon:"maki-bicycle",imageURL:"https://graph.facebook.com/nextbike/picture?type=large",geometry:["point","vertex","area"],tags:{"brand:wikidata":"Q2351279",amenity:"bicycle_rental"},addTags:{amenity:"bicycle_rental",brand:"nextbike","brand:wikidata":"Q2351279","brand:wikipedia":"de:Nextbike",name:"nextbike"},countryCodes:["at","de"],terms:[],matchScore:2,suggestion:true},"amenity/bureau_de_change/CADECA":{name:"CADECA",icon:"maki-bank",imageURL:"https://graph.facebook.com/CadecaCasasdeCambioOficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62122716",amenity:"bureau_de_change"},addTags:{amenity:"bureau_de_change",brand:"CADECA","brand:wikidata":"Q62122716",name:"CADECA"},countryCodes:["cu"],terms:[],matchScore:2,suggestion:true},"amenity/bureau_de_change/Travelex":{name:"Travelex",icon:"maki-bank",imageURL:"https://graph.facebook.com/TravelexUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2337964",amenity:"bureau_de_change"},addTags:{amenity:"bureau_de_change",brand:"Travelex","brand:wikidata":"Q2337964","brand:wikipedia":"en:Travelex",name:"Travelex"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/85°C":{name:"85°C",icon:"maki-cafe",imageURL:"https://graph.facebook.com/85CBakeryCafe/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4644852",amenity:"cafe"},addTags:{alt_name:"85C",amenity:"cafe",brand:"85°C","brand:wikidata":"Q4644852","brand:wikipedia":"en:85C Bakery Cafe",cuisine:"coffee_shop;chinese",name:"85°C",takeaway:"yes"},countryCodes:["au","us"],terms:["85 cafe","85 degrees","85 degrees c","85 degrees celsius","85c bakery cafe","85c daily cafe","85oc"],matchScore:2,suggestion:true},"amenity/cafe/85度C":{name:"85度C",icon:"maki-cafe",imageURL:"https://graph.facebook.com/85CBakeryCafe/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4644852",amenity:"cafe"},addTags:{amenity:"cafe",brand:"85度C","brand:en":"85C Bakery Cafe","brand:wikidata":"Q4644852","brand:wikipedia":"en:85C Bakery Cafe",cuisine:"coffee_shop",name:"85度C","name:en":"85C Bakery Cafe",takeaway:"yes"},countryCodes:["cn","tw"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Barista":{name:"Barista",icon:"maki-cafe",imageURL:"https://graph.facebook.com/BaristaCoffeeCompany/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q644735",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Barista","brand:wikidata":"Q644735","brand:wikipedia":"en:Barista (company)",cuisine:"coffee_shop",name:"Barista",takeaway:"yes"},countryCodes:["in","lk","mv","np"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Beck's Coffe Shop":{name:"Beck's Coffe Shop",icon:"maki-cafe",geometry:["point","area"],tags:{"brand:wikidata":"Q11191008",amenity:"cafe"},addTags:{alt_name:"ベックス・コーヒーショップ",amenity:"cafe",brand:"Beck's Coffe Shop","brand:wikidata":"Q11191008","brand:wikipedia":"ja:Beck's Coffe Shop",cuisine:"coffee_shop",name:"Beck's Coffe Shop",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Black Rock Coffee":{name:"Black Rock Coffee",icon:"maki-cafe",imageURL:"https://pbs.twimg.com/profile_images/705857382715293696/SEQJftR7_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q64225934",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Black Rock Coffee","brand:wikidata":"Q64225934",cuisine:"coffee_shop",name:"Black Rock Coffee",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Bonafide":{name:"Bonafide",icon:"maki-cafe",imageURL:"https://graph.facebook.com/BonafideArgentina/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62122746",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Bonafide","brand:wikidata":"Q62122746",cuisine:"coffee_shop",name:"Bonafide",takeaway:"yes"},countryCodes:["ar","cl"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Cafe Coffee Day":{name:"Cafe Coffee Day",icon:"maki-cafe",imageURL:"https://graph.facebook.com/cafecoffeeday/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5017235",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Cafe Coffee Day","brand:wikidata":"Q5017235","brand:wikipedia":"en:Café Coffee Day",cuisine:"coffee_shop",name:"Cafe Coffee Day",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/Caffè Nero":{name:"Caffè Nero",icon:"maki-cafe",imageURL:"https://graph.facebook.com/caffenerous/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q675808",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Caffè Nero","brand:wikidata":"Q675808","brand:wikipedia":"en:Caffè Nero",cuisine:"coffee_shop",name:"Caffè Nero",takeaway:"yes"},countryCodes:["gb","ie","tr","us"],terms:["cafe nero"],matchScore:2,suggestion:true},"amenity/cafe/Café Amazon":{name:"Café Amazon",icon:"maki-cafe",imageURL:"https://graph.facebook.com/cafeamazonofficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q43247503",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Café Amazon","brand:wikidata":"Q43247503","brand:wikipedia":"en:Café Amazon",cuisine:"coffee_shop",name:"Café Amazon",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/Café Martínez":{name:"Café Martínez",icon:"maki-cafe",imageURL:"https://graph.facebook.com/CafeMartinezSitioOficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16540032",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Café Martínez","brand:wikidata":"Q16540032","brand:wikipedia":"es:Café Martínez",cuisine:"coffee_shop",name:"Café Martínez",takeaway:"yes"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Caribou Coffee":{name:"Caribou Coffee",icon:"maki-cafe",imageURL:"https://graph.facebook.com/cariboucoffee/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5039494",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Caribou Coffee","brand:wikidata":"Q5039494","brand:wikipedia":"en:Caribou Coffee",cuisine:"coffee_shop",name:"Caribou Coffee",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/Chatime":{name:"Chatime",icon:"maki-cafe",imageURL:"https://graph.facebook.com/ChatimeCanada/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16829306",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Chatime","brand:en":"Chatime","brand:wikidata":"Q16829306","brand:wikipedia":"en:Chatime","brand:zh":"日出茶太",cuisine:"bubble_tea",name:"Chatime","name:en":"Chatime","name:zh":"日出茶太",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/CoCo":{name:"CoCo",icon:"maki-cafe",geometry:["point","area"],tags:{"brand:wikidata":"Q64827025",amenity:"cafe"},addTags:{amenity:"cafe",brand:"CoCo","brand:wikidata":"Q64827025",cuisine:"bubble_tea",name:"Coco",takeaway:"yes"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Coffee Fellows":{name:"Coffee Fellows",icon:"maki-cafe",imageURL:"https://graph.facebook.com/CoffeeFellowsDeutschland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q23461429",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Coffee Fellows","brand:wikidata":"Q23461429","brand:wikipedia":"en:Coffee Fellows",cuisine:"coffee_shop",name:"Coffee Fellows",takeaway:"yes"},countryCodes:["de","lu","nl"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Coffee House (Finland)":{name:"Coffee House (Finland)",icon:"maki-cafe",imageURL:"https://graph.facebook.com/raflaamo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11855430",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Coffee House","brand:wikidata":"Q11855430","brand:wikipedia":"fi:Coffee House",cuisine:"coffee_shop",name:"Coffee House",takeaway:"yes"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Coffee Island":{name:"Coffee Island",icon:"maki-cafe",imageURL:"https://graph.facebook.com/CoffeeIslandUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q60867333",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Coffee Island","brand:wikidata":"Q60867333","brand:wikipedia":"en:Coffee Island",cuisine:"coffee_shop",name:"Coffee Island",takeaway:"yes"},countryCodes:["cy","gr"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Coffee Time":{name:"Coffee Time",icon:"maki-cafe",imageURL:"https://graph.facebook.com/CoffeeTimeCanada/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5140932",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Coffee Time","brand:wikidata":"Q5140932","brand:wikipedia":"en:Coffee Time",cuisine:"coffee_shop",name:"Coffee Time",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/Cofix":{name:"Cofix",icon:"maki-cafe",imageURL:"https://graph.facebook.com/Cofix.co.il/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16132717",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Cofix","brand:en":"Cofix","brand:he":"קפויקס","brand:wikidata":"Q16132717","brand:wikipedia":"he:קופיקס",cuisine:"coffee_shop",name:"Cofix","name:en":"Cofix","name:he":"קופיקס",takeaway:"yes"},countryCodes:["il","ru"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Cofizz":{name:"Cofizz",icon:"maki-cafe",geometry:["point","area"],tags:{"brand:wikidata":"Q64606270",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Cofizz","brand:en":"Cofizz","brand:he":"קופיז","brand:wikidata":"Q64606270",cuisine:"coffee_shop",name:"Cofizz","name:en":"Cofizz","name:he":"קופיז",takeaway:"yes"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Costa":{name:"Costa",icon:"maki-cafe",imageURL:"https://graph.facebook.com/costacoffee/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q608845",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Costa","brand:wikidata":"Q608845","brand:wikipedia":"en:Costa Coffee",cuisine:"coffee_shop",name:"Costa",takeaway:"yes"},terms:["costa coffee"],matchScore:2,suggestion:true},"amenity/cafe/Country Style":{name:"Country Style",icon:"maki-cafe",imageURL:"https://graph.facebook.com/CountryStyleCDN/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5177435",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Country Style","brand:wikidata":"Q5177435","brand:wikipedia":"en:Country Style",cuisine:"coffee_shop",name:"Country Style",takeaway:"yes"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Cộng Cà Phê":{name:"Cộng Cà Phê",icon:"maki-cafe",imageURL:"https://graph.facebook.com/congcaphe/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63864181",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Cộng Cà Phê","brand:wikidata":"Q63864181",cuisine:"coffee_shop;vietnamese",name:"Cộng Cà Phê","name:vi":"Cộng Cà Phê",takeaway:"yes"},countryCodes:["kr","vn"],terms:["cong"],matchScore:2,suggestion:true},"amenity/cafe/Dutch Bros. Coffee":{name:"Dutch Bros. Coffee",icon:"maki-cafe",imageURL:"https://graph.facebook.com/dutchbros/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5317253",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Dutch Bros. Coffee","brand:wikidata":"Q5317253","brand:wikipedia":"en:Dutch Bros. Coffee",cuisine:"coffee_shop",name:"Dutch Bros. Coffee",takeaway:"only"},countryCodes:["us"],terms:["dutch bros","dutch brothers"],matchScore:2,suggestion:true},"amenity/cafe/Espresso House":{name:"Espresso House",icon:"maki-cafe",imageURL:"https://graph.facebook.com/EspressoHouse/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10489162",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Espresso House","brand:wikidata":"Q10489162","brand:wikipedia":"en:Espresso House",cuisine:"coffee_shop",name:"Espresso House",takeaway:"yes"},countryCodes:["dk","fi","no","se"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Fran's Café":{name:"Fran's Café",icon:"maki-cafe",imageURL:"https://graph.facebook.com/franscafeoficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62075645",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Fran's Café","brand:website":"http://www.franscafe.com.br","brand:wikidata":"Q62075645",cuisine:"coffee_shop",name:"Fran's Café",takeaway:"yes"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Gong Cha (Vietnam)":{name:"Gong Cha (Vietnam)",icon:"maki-cafe",imageURL:"https://graph.facebook.com/GongChaTaiwan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5581670",amenity:"cafe"},addTags:{"alt_name:vi":"Cống Trà",amenity:"cafe",brand:"Gong Cha","brand:vi":"Gong Cha","brand:wikidata":"Q5581670","brand:wikipedia":"vi:Gong Cha","brand:zh":"貢茶",cuisine:"bubble_tea",name:"Gong Cha","name:vi":"Gong Cha","name:zh":"貢茶",takeaway:"yes"},countryCodes:["vn"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Gong Cha (worldwide)":{name:"Gong Cha (worldwide)",icon:"maki-cafe",imageURL:"https://graph.facebook.com/GongChaTaiwan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5581670",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Gong Cha","brand:wikidata":"Q5581670","brand:wikipedia":"en:Gong Cha","brand:zh":"貢茶",cuisine:"bubble_tea",int_name:"Gong Cha",name:"Gong Cha","name:zh":"貢茶",takeaway:"yes"},countryCodes:["au","bn","ca","mm","mo","my","nz","ph","sg","us"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Havanna":{name:"Havanna",icon:"maki-cafe",imageURL:"https://graph.facebook.com/HavannaUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2900869",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Havanna","brand:wikidata":"Q2900869","brand:wikipedia":"es:Havanna",cuisine:"coffee_shop",name:"Havanna",takeaway:"yes"},countryCodes:["ar","pe"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Highlands Coffee":{name:"Highlands Coffee",icon:"maki-cafe",imageURL:"https://graph.facebook.com/highlandscoffeevietnam/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5759361",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Highlands Coffee","brand:wikidata":"Q5759361","brand:wikipedia":"vi:Highlands Coffee",cuisine:"coffee_shop;vietnamese",name:"Highlands Coffee","name:en":"Highlands Coffee",takeaway:"yes"},countryCodes:["vn"],terms:["highlands"],matchScore:2,suggestion:true},"amenity/cafe/Insomnia":{name:"Insomnia",icon:"maki-cafe",imageURL:"https://graph.facebook.com/InsomniaCoffeeCo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6038271",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Insomnia","brand:wikidata":"Q6038271","brand:wikipedia":"en:Insomnia Coffee Company",cuisine:"coffee_shop",name:"Insomnia",takeaway:"yes"},countryCodes:["ie"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Joe & The Juice":{name:"Joe & The Juice",icon:"maki-cafe",imageURL:"https://graph.facebook.com/joeandthejuice/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q26221514",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Joe & The Juice","brand:wikidata":"Q26221514","brand:wikipedia":"en:Joe & The Juice",cuisine:"coffee_shop",name:"Joe & The Juice",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/Le Pain Quotidien":{name:"Le Pain Quotidien",icon:"maki-cafe",imageURL:"https://graph.facebook.com/lepainquotidienusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2046903",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Le Pain Quotidien","brand:wikidata":"Q2046903","brand:wikipedia":"en:Le Pain Quotidien",cuisine:"coffee_shop",name:"Le Pain Quotidien",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/Mado":{name:"Mado",icon:"maki-cafe",imageURL:"https://graph.facebook.com/MADOglobal/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17116336",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Mado","brand:wikidata":"Q17116336","brand:wikipedia":"en:Mado (food company)",cuisine:"coffee_shop",name:"Mado",takeaway:"yes"},countryCodes:["tr"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/McCafé":{name:"McCafé",icon:"maki-cafe",imageURL:"https://graph.facebook.com/276517512552782/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3114287",amenity:"cafe"},addTags:{amenity:"cafe",brand:"McCafé","brand:wikidata":"Q3114287","brand:wikipedia":"en:McCafé",cuisine:"coffee_shop",name:"McCafé",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/Patisserie Valerie":{name:"Patisserie Valerie",icon:"maki-cafe",imageURL:"https://graph.facebook.com/patisserievalerie/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q22101966",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Patisserie Valerie","brand:wikidata":"Q22101966","brand:wikipedia":"en:Patisserie Valerie",cuisine:"coffee_shop",name:"Patisserie Valerie",takeaway:"yes"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Peet's Coffee":{name:"Peet's Coffee",icon:"maki-cafe",imageURL:"https://graph.facebook.com/peets/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1094101",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Peet's Coffee","brand:wikidata":"Q1094101","brand:wikipedia":"en:Peet's Coffee",cuisine:"coffee_shop",name:"Peet's Coffee",takeaway:"yes"},countryCodes:["us"],terms:["peets","peets coffee & tea","peets coffee and tea"],matchScore:2,suggestion:true},"amenity/cafe/Prime":{name:"Prime",icon:"maki-cafe",imageURL:"https://graph.facebook.com/PRIMENATURALFOOD/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62122839",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Prime","brand:wikidata":"Q62122839",cuisine:"coffee_shop",name:"Prime",takeaway:"yes"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Pronto":{name:"Pronto",icon:"maki-cafe",imageURL:"https://pbs.twimg.com/profile_images/1002458417733120000/lQc9dDWQ_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q11336224",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Pronto","brand:wikidata":"Q11336224","brand:wikipedia":"ja:プロントコーポレーション",cuisine:"coffee_shop",name:"Pronto","name:ja":"プロント",takeaway:"yes"},countryCodes:["jp"],terms:["プロント"],matchScore:2,suggestion:true},"amenity/cafe/Pumpkin":{name:"Pumpkin",icon:"maki-cafe",geometry:["point","area"],tags:{"brand:wikidata":"Q27825961",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Pumpkin","brand:wikidata":"Q27825961","brand:wikipedia":"en:Pumpkin Café Shop",cuisine:"coffee_shop",name:"Pumpkin",takeaway:"yes"},countryCodes:["gb"],terms:["pumpkin cafe","pumpkin cafe shop"],matchScore:2,suggestion:true},"amenity/cafe/Quickly":{name:"Quickly",icon:"maki-cafe",imageURL:"https://graph.facebook.com/quicklyphilippines/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3771463",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Quickly","brand:en":"Quickly","brand:wikidata":"Q3771463","brand:wikipedia":"en:Quickly","brand:zh":"快可立",cuisine:"bubble_tea",name:"Quickly","name:en":"Quickly","name:zh":"快可立",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/Second Cup":{name:"Second Cup",icon:"maki-cafe",imageURL:"https://graph.facebook.com/SecondCup/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q862180",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Second Cup","brand:wikidata":"Q862180","brand:wikipedia":"en:Second Cup",cuisine:"coffee_shop",name:"Second Cup",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/Segafredo":{name:"Segafredo",icon:"maki-cafe",imageURL:"https://graph.facebook.com/SegafredoZanettiItalia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q21282762",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Segafredo","brand:wikidata":"Q21282762","brand:wikipedia":"it:Segafredo Zanetti",cuisine:"coffee_shop",name:"Segafredo",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/Sharetea":{name:"Sharetea",icon:"maki-cafe",geometry:["point","area"],tags:{"brand:wikidata":"Q64827032",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Sharetea","brand:wikidata":"Q64827032",cuisine:"bubble_tea",name:"Sharetea","name:en":"Sharetea","name:zh":"歇腳亭",takeaway:"yes"},countryCodes:["au","us"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Starbucks":{name:"Starbucks",icon:"maki-cafe",imageURL:"https://graph.facebook.com/Starbucks/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q37158",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"en:Starbucks",cuisine:"coffee_shop",name:"Starbucks",official_name:"Starbucks Coffee",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/The Coffee Bean & Tea Leaf":{name:"The Coffee Bean & Tea Leaf",icon:"maki-cafe",imageURL:"https://graph.facebook.com/thecoffeebean/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1141384",amenity:"cafe"},addTags:{amenity:"cafe",brand:"The Coffee Bean & Tea Leaf","brand:wikidata":"Q1141384","brand:wikipedia":"en:The Coffee Bean & Tea Leaf",cuisine:"coffee_shop",name:"The Coffee Bean & Tea Leaf",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/The Coffee Club":{name:"The Coffee Club",icon:"maki-cafe",imageURL:"https://graph.facebook.com/tccau/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7726599",amenity:"cafe"},addTags:{amenity:"cafe",brand:"The Coffee Club","brand:wikidata":"Q7726599","brand:wikipedia":"en:The Coffee Club",cuisine:"coffee_shop",name:"The Coffee Club",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/The Coffee House (Vietnam)":{name:"The Coffee House (Vietnam)",icon:"maki-cafe",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FThe%20Coffee%20House%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q60775742",amenity:"cafe"},addTags:{amenity:"cafe",brand:"The Coffee House","brand:wikidata":"Q60775742","brand:wikipedia":"en:The Coffee House (coffeehouse chain)",cuisine:"coffee_shop;vietnamese",name:"The Coffee House","name:en":"The Coffee House",takeaway:"yes"},countryCodes:["vn"],terms:["coffee house"],matchScore:2,suggestion:true},"amenity/cafe/The Human Bean":{name:"The Human Bean",icon:"maki-cafe",imageURL:"https://graph.facebook.com/HumanBeanNoCo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7740821",amenity:"cafe"},addTags:{amenity:"cafe",brand:"The Human Bean","brand:wikidata":"Q7740821","brand:wikipedia":"en:The Human Bean",cuisine:"coffee_shop",name:"The Human Bean",takeaway:"yes"},countryCodes:["us"],terms:["human bean"],matchScore:2,suggestion:true},"amenity/cafe/Tim Hortons":{name:"Tim Hortons",icon:"maki-cafe",imageURL:"https://graph.facebook.com/TimHortonsUS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q175106",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Tim Hortons","brand:wikidata":"Q175106","brand:wikipedia":"en:Tim Hortons",cuisine:"coffee_shop",name:"Tim Hortons",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/Traveler's Coffee":{name:"Traveler's Coffee",icon:"maki-cafe",geometry:["point","area"],tags:{"brand:wikidata":"Q4051716",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Traveler's Coffee","brand:wikidata":"Q4051716","brand:wikipedia":"ru:Traveler’s Coffee",cuisine:"coffee_shop",name:"Traveler's Coffee",takeaway:"yes"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Trung Nguyên Coffee":{name:"Trung Nguyên Coffee",icon:"maki-cafe",imageURL:"https://graph.facebook.com/trungnguyenlegend/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3541154",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Trung Nguyên","brand:wikidata":"Q3541154","brand:wikipedia":"vi:Trung Nguyên (công ty)",cuisine:"coffee_shop;vietnamese",name:"Trung Nguyên Coffee","name:en":"Trung Nguyen Coffee","name:vi":"Cà phê Trung Nguyên",takeaway:"yes"},countryCodes:["vn"],terms:["trung nguyen"],matchScore:2,suggestion:true},"amenity/cafe/Wayne's Coffee":{name:"Wayne's Coffee",icon:"maki-cafe",imageURL:"https://graph.facebook.com/WaynesCoffeeInternational/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2637272",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Wayne's Coffee","brand:wikidata":"Q2637272","brand:wikipedia":"en:Wayne's Coffee",cuisine:"coffee_shop",name:"Wayne's Coffee",takeaway:"yes"},countryCodes:["fi","no","se"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Wild Bean Cafe":{name:"Wild Bean Cafe",icon:"maki-cafe",geometry:["point","area"],tags:{"brand:wikidata":"Q61804826",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Wild Bean Cafe","brand:wikidata":"Q61804826",cuisine:"coffee_shop",name:"Wild Bean Cafe",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/Даблби":{name:"Даблби",icon:"maki-cafe",imageURL:"https://graph.facebook.com/DoubleBCoffeeTea/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62501686",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Даблби","brand:en":"Double B","brand:wikidata":"Q62501686",cuisine:"coffee_shop",name:"Даблби","name:en":"Double B",takeaway:"yes"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Старбакс":{name:"Старбакс",icon:"maki-cafe",imageURL:"https://graph.facebook.com/Starbucks/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q37158",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Старбакс","brand:en":"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"en:Starbucks",cuisine:"coffee_shop",name:"Старбакс","name:en":"Starbucks",takeaway:"yes"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Шоколадница":{name:"Шоколадница",icon:"maki-cafe",imageURL:"https://graph.facebook.com/shoko.ru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q30891188",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Шоколадница","brand:en":"Chocolate","brand:wikidata":"Q30891188","brand:wikipedia":"ru:Шоколадница (сеть кофеен)",cuisine:"coffee_shop",name:"Шоколадница","name:en":"Chocolate",takeaway:"yes"},countryCodes:["ru"],terms:["шоколад"],matchScore:2,suggestion:true},"amenity/cafe/Штолле":{name:"Штолле",icon:"maki-cafe",imageURL:"https://graph.facebook.com/stollerussia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62502236",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Штолле","brand:en":"Stolle","brand:wikidata":"Q62502236",cuisine:"coffee_shop",name:"Штолле","name:en":"Stolle",takeaway:"yes"},countryCodes:["by","ru","ua"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/ארומה":{name:"ארומה",icon:"maki-cafe",imageURL:"https://graph.facebook.com/Israel.Aroma/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2909872",amenity:"cafe"},addTags:{amenity:"cafe",brand:"ארומה","brand:en":"Aroma Espresso Bar","brand:he":"ארומה","brand:wikidata":"Q2909872","brand:wikipedia":"en:Aroma Espresso Bar",cuisine:"coffee_shop",name:"ארומה","name:en":"Aroma Espresso Bar","name:he":"ארומה",takeaway:"yes"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/לנדוור":{name:"לנדוור",icon:"maki-cafe",imageURL:"https://graph.facebook.com/cafelandwer/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6485288",amenity:"cafe"},addTags:{amenity:"cafe",brand:"קפה לנדוור","brand:en":"Landwer Coffee","brand:he":"קפה לנדוור","brand:wikidata":"Q6485288","brand:wikipedia":"he:קפה לנדוור",cuisine:"coffee_shop",name:"לנדוור","name:en":"Landwer","name:he":"לנדוור",takeaway:"yes"},countryCodes:["il"],terms:["קפה לדנוור"],matchScore:2,suggestion:true},"amenity/cafe/סי קפה":{name:"סי קפה",icon:"maki-cafe",imageURL:"https://graph.facebook.com/242590255775924/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64606227",amenity:"cafe"},addTags:{alt_name:"סי אספרסו","alt_name:en":"Si Espresso","alt_name:he":"סי אספרסו",amenity:"cafe",brand:"סי קפה","brand:en":"Si Cafe","brand:he":"סי קפה","brand:wikidata":"Q64606227",cuisine:"coffee_shop",name:"סי קפה","name:en":"Si Cafe","name:he":"סי קפה",takeaway:"yes"},countryCodes:["il"],terms:["si cafe","si espresso"],matchScore:2,suggestion:true},"amenity/cafe/קפה ג'ו":{name:"קפה ג'ו",icon:"maki-cafe",imageURL:"https://graph.facebook.com/cafejoe/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6774425",amenity:"cafe"},addTags:{alt_name:"קפה Joe",amenity:"cafe",brand:"קפה ג'ו","brand:en":"Cafe Joe","brand:he":"קפה ג'ו","brand:wikidata":"Q6774425","brand:wikipedia":"he:קפה ג'ו",cuisine:"coffee_shop",name:"קפה ג'ו","name:en":"Cafe Joe","name:he":"קפה ג'ו",takeaway:"yes"},countryCodes:["il"],terms:["ג'ו קפה"],matchScore:2,suggestion:true},"amenity/cafe/קפה גרג":{name:"קפה גרג",icon:"maki-cafe",imageURL:"https://graph.facebook.com/gregcafe/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q43295499",amenity:"cafe"},addTags:{amenity:"cafe",brand:"קפה גרג","brand:en":"Greg Cafe","brand:he":"קפה גרג","brand:wikidata":"Q43295499","brand:wikipedia":"he:קפה גרג",cuisine:"coffee_shop",name:"קפה גרג","name:en":"Greg Cafe","name:he":"קפה גרג",takeaway:"yes"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/קפה נמרוד":{name:"קפה נמרוד",icon:"maki-cafe",imageURL:"https://graph.facebook.com/cafenimrod/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64606192",amenity:"cafe"},addTags:{amenity:"cafe",brand:"קפה נמרוד","brand:en":"Cafe Nimrod","brand:he":"קפה נמרוד","brand:wikidata":"Q64606192",cuisine:"coffee_shop",name:"קפה נמרוד","name:en":"Cafe Nimrod","name:he":"קפה נמרוד",takeaway:"yes"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/קפה קפה":{name:"קפה קפה",icon:"maki-cafe",imageURL:"https://graph.facebook.com/cafe.cafe.il/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5017233",amenity:"cafe"},addTags:{amenity:"cafe",brand:"קפה קפה","brand:en":"Cafe Cafe","brand:he":"קפה קפה","brand:wikidata":"Q5017233","brand:wikipedia":"he:קפה קפה",cuisine:"coffee_shop",name:"קפה קפה","name:en":"Cafe Cafe","name:he":"קפה קפה",takeaway:"yes"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/רולדין":{name:"רולדין",icon:"maki-cafe",geometry:["point","area"],tags:{"brand:wikidata":"Q18390972",amenity:"cafe"},addTags:{amenity:"cafe",brand:"רולדין","brand:en":"Roladin","brand:he":"רולדין","brand:wikidata":"Q18390972","brand:wikipedia":"he:רולדין",cuisine:"coffee_shop",name:"רולדין","name:en":"Roladin","name:he":"רולדין",takeaway:"yes"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/คาเฟ่ อเมซอน":{name:"คาเฟ่ อเมซอน",icon:"maki-cafe",imageURL:"https://graph.facebook.com/cafeamazonofficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q43247503",amenity:"cafe"},addTags:{amenity:"cafe",brand:"คาเฟ่ อเมซอน","brand:en":"Café Amazon","brand:th":"คาเฟ่ อเมซอน","brand:wikidata":"Q43247503","brand:wikipedia":"en:Café Amazon",cuisine:"coffee_shop",name:"คาเฟ่ อเมซอน","name:en":"Café Amazon","name:th":"คาเฟ่ อเมซอน",takeaway:"yes"},countryCodes:["th"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/エクセルシオール カフェ":{name:"エクセルシオール カフェ",icon:"maki-cafe",geometry:["point","area"],tags:{"brand:wikidata":"Q11289828",amenity:"cafe"},addTags:{amenity:"cafe",brand:"エクセルシオール カフェ","brand:en":"EXCELSIOR CAFFÉ","brand:ja":"エクセルシオール カフェ","brand:wikidata":"Q11289828","brand:wikipedia":"ja:エクセルシオール カフェ",cuisine:"coffee_shop",name:"エクセルシオール カフェ","name:ja":"エクセルシオール カフェ",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/カフェ・ド・クリエ":{name:"カフェ・ド・クリエ",icon:"maki-cafe",imageURL:"https://graph.facebook.com/pokkacreate/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17219077",amenity:"cafe"},addTags:{amenity:"cafe",brand:"カフェ・ド・クリエ","brand:en":"Cafe de CRIE","brand:ja":"カフェ・ド・クリエ","brand:wikidata":"Q17219077","brand:wikipedia":"ja:ポッカクリエイト",cuisine:"coffee_shop",name:"カフェ・ド・クリエ","name:en":"Cafe de CRIE","name:ja":"カフェ・ド・クリエ",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/カフェ・ベローチェ":{name:"カフェ・ベローチェ",icon:"maki-cafe",imageURL:"https://graph.facebook.com/ChatnoirCo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11294597",amenity:"cafe"},addTags:{amenity:"cafe",brand:"カフェ・ベローチェ","brand:en":"CAFFÈ VELOCE","brand:ja":"カフェ・ベローチェ","brand:wikidata":"Q11294597","brand:wikipedia":"ja:カフェ・ベローチェ",cuisine:"coffee_shop",name:"カフェ・ベローチェ","name:en":"CAFFÈ VELOCE","name:ja":"カフェ・ベローチェ",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/コメダ珈琲店":{name:"コメダ珈琲店",icon:"maki-cafe",imageURL:"https://graph.facebook.com/komeda.coffee/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11302679",amenity:"cafe"},addTags:{amenity:"cafe",brand:"コメダ珈琲店","brand:en":"Komeda Coffee Shop","brand:ja":"コメダ珈琲店","brand:wikidata":"Q11302679","brand:wikipedia":"ja:コメダ",cuisine:"coffee_shop",name:"コメダ珈琲店","name:en":"Komeda Coffee Shop","name:ja":"コメダ珈琲店",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/サンマルクカフェ":{name:"サンマルクカフェ",icon:"maki-cafe",geometry:["point","area"],tags:{"brand:wikidata":"Q11305989",amenity:"cafe"},addTags:{"alt_name:en":"Saint Marc Café",amenity:"cafe",brand:"サンマルクカフェ","brand:en":"ST.MARC CAFÉ","brand:ja":"サンマルクカフェ","brand:wikidata":"Q11305989","brand:wikipedia":"ja:サンマルクホールディングス",cuisine:"coffee_shop",name:"サンマルクカフェ","name:en":"ST.MARC CAFÉ","name:ja":"サンマルクカフェ",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/スターバックス":{name:"スターバックス",icon:"maki-cafe",imageURL:"https://graph.facebook.com/Starbucks/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q37158",amenity:"cafe"},addTags:{amenity:"cafe",brand:"スターバックス","brand:en":"Starbucks","brand:ja":"スターバックス","brand:wikidata":"Q37158","brand:wikipedia":"ja:スターバックス",cuisine:"coffee_shop",name:"スターバックス","name:en":"Starbucks","name:ja":"スターバックス",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/タリーズコーヒー":{name:"タリーズコーヒー",icon:"maki-cafe",imageURL:"https://graph.facebook.com/TullysCoffeeShops/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3541983",amenity:"cafe"},addTags:{amenity:"cafe",brand:"タリーズコーヒー","brand:en":"Tully's Coffee","brand:ja":"タリーズコーヒー","brand:wikidata":"Q3541983","brand:wikipedia":"en:Tully's Coffee",cuisine:"coffee_shop",name:"タリーズコーヒー","name:en":"Tully's Coffee","name:ja":"タリーズコーヒー",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/ドトールコーヒーショップ":{name:"ドトールコーヒーショップ",icon:"maki-cafe",imageURL:"https://graph.facebook.com/Fun.Doutor.Fan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11322732",amenity:"cafe"},addTags:{amenity:"cafe",brand:"ドトールコーヒーショップ","brand:en":"Doutor","brand:ja":"ドトールコーヒーショップ","brand:wikidata":"Q11322732","brand:wikipedia":"ja:ドトールコーヒーショップ",cuisine:"coffee_shop",name:"ドトールコーヒーショップ","name:en":"Doutor Coffee Shop","name:ja":"ドトールコーヒーショップ",takeaway:"yes"},countryCodes:["jp"],terms:["ドトールコーヒー"],matchScore:2,suggestion:true},"amenity/cafe/快可立":{name:"快可立",icon:"maki-cafe",imageURL:"https://graph.facebook.com/quicklyphilippines/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3771463",amenity:"cafe"},addTags:{amenity:"cafe",brand:"快可立","brand:en":"Quickly","brand:wikidata":"Q3771463","brand:wikipedia":"zh:快可立","brand:zh":"快可立",cuisine:"bubble_tea",name:"快可立","name:en":"Quickly","name:zh":"快可立",takeaway:"yes"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/日出茶太":{name:"日出茶太",icon:"maki-cafe",imageURL:"https://graph.facebook.com/ChatimeCanada/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16829306",amenity:"cafe"},addTags:{amenity:"cafe",brand:"日出茶太","brand:en":"Chatime","brand:wikidata":"Q16829306","brand:wikipedia":"zh:日出茶太","brand:zh":"日出茶太",cuisine:"bubble_tea",name:"日出茶太","name:en":"Chatime","name:zh":"日出茶太",takeaway:"yes"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/星巴克":{name:"星巴克",icon:"maki-cafe",imageURL:"https://graph.facebook.com/Starbucks/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q37158",amenity:"cafe"},addTags:{amenity:"cafe",brand:"星巴克","brand:en":"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"zh:星巴克","brand:zh":"星巴克",cuisine:"coffee_shop",name:"星巴克","name:en":"Starbucks","name:zh":"星巴克",takeaway:"yes"},countryCodes:["cn","tw"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/珈琲館":{name:"珈琲館",icon:"maki-cafe",imageURL:"https://graph.facebook.com/kohikancorporation/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11573290",amenity:"cafe"},addTags:{amenity:"cafe",brand:"珈琲館","brand:en":"Kohikan","brand:ja":"珈琲館","brand:wikidata":"Q11573290","brand:wikipedia":"ja:珈琲館",cuisine:"coffee_shop",name:"珈琲館","name:en":"Kohikan","name:ja":"珈琲館",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/貢茶 Gong Cha":{name:"貢茶 Gong Cha",icon:"maki-cafe",imageURL:"https://graph.facebook.com/GongChaTaiwan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5581670",amenity:"cafe"},addTags:{amenity:"cafe",brand:"貢茶 Gong Cha","brand:en":"Gong Cha","brand:wikidata":"Q5581670","brand:wikipedia":"zh:貢茶 (連鎖店)","brand:zh":"貢茶",cuisine:"bubble_tea",name:"貢茶 Gong Cha","name:en":"Gong Cha","name:zh":"貢茶",takeaway:"yes"},countryCodes:["hk"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/貢茶 (Japan)":{name:"貢茶 (Japan)",icon:"maki-cafe",imageURL:"https://graph.facebook.com/GongChaTaiwan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5581670",amenity:"cafe"},addTags:{amenity:"cafe",brand:"貢茶","brand:ja":"貢茶","brand:wikidata":"Q5581670","brand:wikipedia":"ja:貢茶","brand:zh":"貢茶",cuisine:"bubble_tea",int_name:"Gong Cha",name:"貢茶","name:ja":"貢茶","name:zh":"貢茶",takeaway:"yes"},countryCodes:["ja"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/貢茶 (Taiwan)":{name:"貢茶 (Taiwan)",icon:"maki-cafe",imageURL:"https://graph.facebook.com/GongChaTaiwan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5581670",amenity:"cafe"},addTags:{amenity:"cafe",brand:"貢茶","brand:wikidata":"Q5581670","brand:wikipedia":"zh:貢茶 (連鎖店)",cuisine:"bubble_tea",int_name:"Gong Cha",name:"貢茶","name:zh":"貢茶",takeaway:"yes"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/贡茶 (China)":{name:"贡茶 (China)",icon:"maki-cafe",imageURL:"https://graph.facebook.com/GongChaTaiwan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5581670",amenity:"cafe"},addTags:{amenity:"cafe",brand:"贡茶","brand:wikidata":"Q5581670","brand:wikipedia":"zh:贡茶 (连锁店)","brand:zh-Hans":"贡茶","brand:zh-Hant":"貢茶",cuisine:"bubble_tea",int_name:"Gong Cha",name:"贡茶","name:zh-Hans":"贡茶","name:zh-Hant":"貢茶",takeaway:"yes"},countryCodes:["cn"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/공차":{name:"공차",icon:"maki-cafe",imageURL:"https://graph.facebook.com/GongChaTaiwan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5581670",amenity:"cafe"},addTags:{amenity:"cafe",brand:"공차","brand:ko":"공차","brand:wikidata":"Q5581670","brand:wikipedia":"ko:공차","brand:zh":"貢茶",cuisine:"bubble_tea",int_name:"Gong Cha",name:"공차","name:ko":"공차","name:zh":"貢茶",takeaway:"yes"},countryCodes:["kr"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/스타벅스":{name:"스타벅스",icon:"maki-cafe",imageURL:"https://graph.facebook.com/Starbucks/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q37158",amenity:"cafe"},addTags:{amenity:"cafe",brand:"스타벅스","brand:en":"Starbucks","brand:ko":"스타벅스","brand:wikidata":"Q37158","brand:wikipedia":"ko:스타벅스",cuisine:"coffee_shop",name:"스타벅스","name:en":"Starbucks","name:ko":"스타벅스",takeaway:"yes"},countryCodes:["kr"],terms:[],matchScore:2,suggestion:true},"amenity/car_rental/Alamo":{name:"Alamo",icon:"maki-car-rental",imageURL:"https://graph.facebook.com/AlamoRentACar/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1429287",amenity:"car_rental"},addTags:{amenity:"car_rental",brand:"Alamo","brand:wikidata":"Q1429287","brand:wikipedia":"en:Alamo Rent a Car",name:"Alamo"},terms:[],matchScore:2,suggestion:true},"amenity/car_rental/Avis":{name:"Avis",icon:"maki-car-rental",imageURL:"https://graph.facebook.com/avis/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q791136",amenity:"car_rental"},addTags:{amenity:"car_rental",brand:"Avis","brand:wikidata":"Q791136","brand:wikipedia":"en:Avis Car Rental",name:"Avis"},terms:["avis car rental"],matchScore:2,suggestion:true},"amenity/car_rental/Budget":{name:"Budget",icon:"maki-car-rental",imageURL:"https://graph.facebook.com/Budget/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1001437",amenity:"car_rental"},addTags:{amenity:"car_rental",brand:"Budget","brand:wikidata":"Q1001437","brand:wikipedia":"en:Budget Rent a Car",name:"Budget",official_name:"Budget Rent a Car"},terms:["budget car rental"],matchScore:2,suggestion:true},"amenity/car_rental/Dollar":{name:"Dollar",icon:"maki-car-rental",imageURL:"https://graph.facebook.com/DollarCarRental/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1235661",amenity:"car_rental"},addTags:{amenity:"car_rental",brand:"Dollar","brand:wikidata":"Q1235661","brand:wikipedia":"en:Dollar Rent A Car",name:"Dollar",official_name:"Dollar Rent A Car"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/car_rental/Enterprise":{name:"Enterprise",icon:"maki-car-rental",imageURL:"https://graph.facebook.com/Enterprise/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17085454",amenity:"car_rental"},addTags:{amenity:"car_rental",brand:"Enterprise","brand:wikidata":"Q17085454","brand:wikipedia":"en:Enterprise Rent-A-Car",name:"Enterprise",official_name:"Enterprise Rent-A-Car"},terms:["enterprise car rental"],matchScore:2,suggestion:true},"amenity/car_rental/Europcar":{name:"Europcar",icon:"maki-car-rental",imageURL:"https://graph.facebook.com/europcar/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1376256",amenity:"car_rental"},addTags:{amenity:"car_rental",brand:"Europcar","brand:wikidata":"Q1376256","brand:wikipedia":"en:Europcar",name:"Europcar"},terms:[],matchScore:2,suggestion:true},"amenity/car_rental/Hertz":{name:"Hertz",icon:"maki-car-rental",imageURL:"https://graph.facebook.com/hertz/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1543874",amenity:"car_rental"},addTags:{amenity:"car_rental",brand:"Hertz","brand:wikidata":"Q1543874","brand:wikipedia":"en:The Hertz Corporation",name:"Hertz"},terms:["hertz car rental"],matchScore:2,suggestion:true},"amenity/car_rental/Localiza":{name:"Localiza",icon:"maki-car-rental",imageURL:"https://graph.facebook.com/localizahertz/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10319490",amenity:"car_rental"},addTags:{amenity:"car_rental",brand:"Localiza","brand:wikidata":"Q10319490","brand:wikipedia":"en:Localiza",name:"Localiza"},terms:[],matchScore:2,suggestion:true},"amenity/car_rental/National":{name:"National",icon:"maki-car-rental",imageURL:"https://graph.facebook.com/NationalCarRental/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1424142",amenity:"car_rental"},addTags:{amenity:"car_rental",brand:"National","brand:wikidata":"Q1424142","brand:wikipedia":"en:National Car Rental",name:"National",official_name:"National Car Rental"},countryCodes:["ca","gb","us"],terms:[],matchScore:2,suggestion:true},"amenity/car_rental/Sixt":{name:"Sixt",icon:"maki-car-rental",imageURL:"https://graph.facebook.com/sixt.rentacar.usa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q705664",amenity:"car_rental"},addTags:{amenity:"car_rental",brand:"Sixt","brand:wikidata":"Q705664","brand:wikipedia":"en:Sixt",name:"Sixt"},terms:[],matchScore:2,suggestion:true},"amenity/car_rental/Thrifty":{name:"Thrifty",icon:"maki-car-rental",imageURL:"https://graph.facebook.com/ThriftyCarRental/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2429546",amenity:"car_rental"},addTags:{amenity:"car_rental",brand:"Thrifty","brand:wikidata":"Q2429546","brand:wikipedia":"en:Thrifty Car Rental",name:"Thrifty"},terms:["thrifty car rental"],matchScore:2,suggestion:true},"amenity/car_rental/U-Haul":{name:"U-Haul",icon:"maki-car-rental",imageURL:"https://graph.facebook.com/uhaul/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7862902",amenity:"car_rental"},addTags:{amenity:"car_rental",brand:"U-Haul","brand:wikidata":"Q7862902","brand:wikipedia":"en:U-Haul",name:"U-Haul"},countryCodes:["ca","us"],terms:["uhaul neighborhood dealer"],matchScore:2,suggestion:true},"amenity/car_rental/オリックスレンタカー":{name:"オリックスレンタカー",icon:"maki-car-rental",imageURL:"https://graph.facebook.com/227957351080226/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11123021",amenity:"car_rental"},addTags:{amenity:"car_rental",brand:"オリックスレンタカー","brand:en":"ORIX Car Rental","brand:ja":"オリックスレンタカー","brand:wikidata":"Q11123021","brand:wikipedia":"ja:オリックスレンタカー",name:"オリックスレンタカー","name:en":"ORIX Car Rental","name:ja":"オリックスレンタカー"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/car_rental/トヨタレンタカー":{name:"トヨタレンタカー",icon:"maki-car-rental",imageURL:"https://graph.facebook.com/rentacarjapan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11321580",amenity:"car_rental"},addTags:{amenity:"car_rental",brand:"トヨタレンタカー","brand:en":"Toyota Rental Car","brand:ja":"トヨタレンタカー","brand:wikidata":"Q11321580","brand:wikipedia":"ja:トヨタレンタリース",name:"トヨタレンタカー","name:en":"Toyota Rental Car","name:ja":"トヨタレンタカー"},countryCodes:["jp"],terms:["トヨタレンタリース"],matchScore:2,suggestion:true},"amenity/car_rental/ニッポンレンタカー":{name:"ニッポンレンタカー",icon:"maki-car-rental",imageURL:"https://graph.facebook.com/115494788561573/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11086533",amenity:"car_rental"},addTags:{amenity:"car_rental",brand:"ニッポンレンタカー","brand:en":"Nippon Car Rental","brand:ja":"ニッポンレンタカー","brand:wikidata":"Q11086533","brand:wikipedia":"ja:ニッポンレンタカー",name:"ニッポンレンタカー","name:en":"Nippon Car Rental","name:ja":"ニッポンレンタカー"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/car_rental/日産レンタカー":{name:"日産レンタカー",icon:"maki-car-rental",imageURL:"https://graph.facebook.com/231926140196841/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11086838",amenity:"car_rental"},addTags:{amenity:"car_rental",brand:"日産レンタカー","brand:en":"Nissan Car Rental","brand:ja":"日産レンタカー","brand:wikidata":"Q11086838","brand:wikipedia":"ja:日産レンタカー",name:"日産レンタカー","name:en":"Nissan Car Rental","name:ja":"日産レンタカー"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/car_sharing/Bluely":{name:"Bluely",icon:"maki-car",imageURL:"https://graph.facebook.com/bluely.eu/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16039715",amenity:"car_sharing"},addTags:{amenity:"car_sharing",brand:"Bluely","brand:wikidata":"Q16039715","brand:wikipedia":"fr:Bluely",name:"Bluely"},countryCodes:["fr"],terms:["station bluely"],matchScore:2,suggestion:true},"amenity/car_sharing/Enterprise Car Club":{name:"Enterprise Car Club",icon:"maki-car",imageURL:"https://graph.facebook.com/EnterpriseCarClub/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5123055",amenity:"car_sharing"},addTags:{amenity:"car_sharing",brand:"Enterprise Car Club","brand:wikidata":"Q5123055","brand:wikipedia":"en:Enterprise Car Club",name:"Enterprise Car Club"},countryCodes:["gb"],terms:["city car club"],matchScore:2,suggestion:true},"amenity/car_sharing/Greenwheels":{name:"Greenwheels",icon:"maki-car",imageURL:"https://graph.facebook.com/Greenwheels.nl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q316782",amenity:"car_sharing"},addTags:{amenity:"car_sharing",brand:"Greenwheels","brand:wikidata":"Q316782","brand:wikipedia":"en:Greenwheels",name:"Greenwheels"},countryCodes:["de","nl"],terms:[],matchScore:2,suggestion:true},"amenity/car_sharing/Zipcar":{name:"Zipcar",icon:"maki-car",imageURL:"https://graph.facebook.com/zipcar/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1069924",amenity:"car_sharing"},addTags:{amenity:"car_sharing",brand:"Zipcar","brand:wikidata":"Q1069924","brand:wikipedia":"en:Zipcar",name:"Zipcar"},terms:[],matchScore:2,suggestion:true},"amenity/car_sharing/stadtmobil":{name:"stadtmobil",icon:"maki-car",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FStadtmobil%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2327629",amenity:"car_sharing"},addTags:{amenity:"car_sharing",brand:"stadtmobil","brand:wikidata":"Q2327629","brand:wikipedia":"en:Stadtmobil",name:"stadtmobil"},countryCodes:["de"],terms:["stadtmobil carsharing-station"],matchScore:2,suggestion:true},"amenity/car_sharing/teilAuto":{name:"teilAuto",icon:"maki-car",imageURL:"https://graph.facebook.com/teilauto/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2400658",amenity:"car_sharing"},addTags:{amenity:"car_sharing",brand:"teilAuto","brand:wikidata":"Q2400658","brand:wikipedia":"de:TeilAuto",name:"teilAuto"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/charging_station/Blink":{name:"Blink",icon:"fas-charging-station",imageURL:"https://graph.facebook.com/blinknetwork/picture?type=large",geometry:["point"],tags:{"brand:wikidata":"Q62065645",amenity:"charging_station"},addTags:{amenity:"charging_station",brand:"Blink","brand:wikidata":"Q62065645",name:"Blink"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/charging_station/ChargePoint":{name:"ChargePoint",icon:"fas-charging-station",imageURL:"https://graph.facebook.com/ChargePoint/picture?type=large",geometry:["point"],tags:{"brand:wikidata":"Q5176149",amenity:"charging_station"},addTags:{amenity:"charging_station",brand:"ChargePoint","brand:wikidata":"Q5176149","brand:wikipedia":"en:ChargePoint",name:"ChargePoint"},terms:[],matchScore:2,suggestion:true},"amenity/charging_station/E-WALD":{name:"E-WALD",icon:"fas-charging-station",imageURL:"https://graph.facebook.com/E.WALD.emobility/picture?type=large",geometry:["point"],tags:{"brand:wikidata":"Q61804335",amenity:"charging_station"},addTags:{amenity:"charging_station",brand:"E-WALD","brand:wikidata":"Q61804335",name:"E-WALD"},countryCodes:["de"],terms:["e-wald ladestation"],matchScore:2,suggestion:true},"amenity/charging_station/Enel":{name:"Enel",icon:"fas-charging-station",imageURL:"https://graph.facebook.com/enelsharing/picture?type=large",geometry:["point"],tags:{"brand:wikidata":"Q651222",amenity:"charging_station"},addTags:{amenity:"charging_station",brand:"Enel","brand:wikidata":"Q651222","brand:wikipedia":"en:Enel",name:"Enel"},countryCodes:["it"],terms:["enel - stazione di ricarica"],matchScore:2,suggestion:true},"amenity/charging_station/Source London":{name:"Source London",icon:"fas-charging-station",imageURL:"https://graph.facebook.com/SourceLondon/picture?type=large",geometry:["point"],tags:{"brand:wikidata":"Q7565133",amenity:"charging_station"},addTags:{amenity:"charging_station",brand:"Source London","brand:wikidata":"Q7565133","brand:wikipedia":"en:Source London",name:"Source London"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/charging_station/Tesla Supercharger":{name:"Tesla Supercharger",icon:"fas-charging-station",imageURL:"https://pbs.twimg.com/profile_images/489192650474414080/4RxZxsud_bigger.png",geometry:["point"],tags:{"brand:wikidata":"Q17089620",amenity:"charging_station"},addTags:{amenity:"charging_station",brand:"Tesla Supercharger","brand:wikidata":"Q17089620","brand:wikipedia":"en:Tesla Supercharger",name:"Tesla Supercharger"},terms:[],matchScore:2,suggestion:true},"amenity/charging_station/eVgo":{name:"eVgo",icon:"fas-charging-station",imageURL:"https://pbs.twimg.com/profile_images/1072541771777888256/E1Ma7jGm_bigger.jpg",geometry:["point"],tags:{"brand:wikidata":"Q61803820",amenity:"charging_station"},addTags:{amenity:"charging_station",brand:"eVgo","brand:wikidata":"Q61803820",name:"eVgo"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/childcare/YMCA Child Care":{name:"YMCA Child Care",icon:"fas-child",imageURL:"https://graph.facebook.com/YMCA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q157169",amenity:"childcare"},addTags:{amenity:"childcare",brand:"YMCA","brand:wikidata":"Q157169","brand:wikipedia":"en:YMCA",name:"YMCA Child Care"},countryCodes:["us"],terms:["ymca","ymca child care center"],matchScore:2,suggestion:true},"amenity/cinema/109シネマズ":{name:"109シネマズ",icon:"maki-cinema",imageURL:"https://graph.facebook.com/438297009664571/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10854269",amenity:"cinema"},addTags:{amenity:"cinema",brand:"109シネマズ","brand:en":"109 Cinemas","brand:ja":"109シネマズ","brand:wikidata":"Q10854269","brand:wikipedia":"ja:109シネマズ",name:"109シネマズ","name:en":"109 Cinemas","name:ja":"109シネマズ"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/cinema/AMC":{name:"AMC",icon:"maki-cinema",imageURL:"https://graph.facebook.com/amctheatres/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q294721",amenity:"cinema"},addTags:{amenity:"cinema",brand:"AMC","brand:wikidata":"Q294721","brand:wikipedia":"en:AMC Theatres",name:"AMC"},countryCodes:["us"],terms:["amc cinema","amc cinemas","amc theater","amc theaters","amc theatre","amc theatres"],matchScore:2,suggestion:true},"amenity/cinema/B&B Theatres":{name:"B&B Theatres",icon:"maki-cinema",imageURL:"https://pbs.twimg.com/profile_images/796752289859969025/6La-tnNc_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q4833576",amenity:"cinema"},addTags:{amenity:"cinema",brand:"B&B Theatres","brand:wikidata":"Q4833576","brand:wikipedia":"en:B&B Theatres",name:"B&B Theatres",short_name:"B&B"},countryCodes:["us"],terms:["b and b","b and b theatres","b&b theaters"],matchScore:2,suggestion:true},"amenity/cinema/Century Theatres":{name:"Century Theatres",icon:"maki-cinema",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCentury%20Theater.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2946307",amenity:"cinema"},addTags:{amenity:"cinema",brand:"Century Theatres","brand:wikidata":"Q2946307","brand:wikipedia":"en:Century Theatres",name:"Century Theatres",short_name:"Century"},countryCodes:["us"],terms:["century theater","century theaters","century theatre"],matchScore:2,suggestion:true},"amenity/cinema/CineStar":{name:"CineStar",icon:"maki-cinema",imageURL:"https://graph.facebook.com/CineStarDE/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q321889",amenity:"cinema"},addTags:{amenity:"cinema",brand:"CineStar","brand:wikidata":"Q321889","brand:wikipedia":"de:Cinestar",name:"CineStar"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/cinema/Cinema City":{name:"Cinema City",icon:"maki-cinema",imageURL:"https://graph.facebook.com/CinemaCityPoland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q543651",amenity:"cinema"},addTags:{amenity:"cinema",brand:"Cinema City","brand:wikidata":"Q543651","brand:wikipedia":"en:Cinema City International",name:"Cinema City"},countryCodes:["cz","hu","pl","ro"],terms:[],matchScore:2,suggestion:true},"amenity/cinema/Cinemark":{name:"Cinemark",icon:"maki-cinema",imageURL:"https://graph.facebook.com/cinemarkoficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q707530",amenity:"cinema"},addTags:{amenity:"cinema",brand:"Cinemark","brand:wikidata":"Q707530","brand:wikipedia":"en:Cinemark Theatres",name:"Cinemark"},terms:[],matchScore:2,suggestion:true},"amenity/cinema/Cinemaxx (Europe)":{name:"Cinemaxx (Europe)",icon:"maki-cinema",imageURL:"https://graph.facebook.com/cinemaxx/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q881860",amenity:"cinema"},addTags:{amenity:"cinema",brand:"Cinemaxx","brand:wikidata":"Q881860","brand:wikipedia":"de:CinemaxX",name:"Cinemaxx"},countryCodes:["de","dk"],terms:[],matchScore:2,suggestion:true},"amenity/cinema/Cinemaxx (Indonesia)":{name:"Cinemaxx (Indonesia)",icon:"maki-cinema",imageURL:"https://graph.facebook.com/cinemaxxtheater/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q19942740",amenity:"cinema"},addTags:{amenity:"cinema",brand:"Cinemaxx","brand:wikidata":"Q19942740","brand:wikipedia":"id:Cinemaxx",name:"Cinemaxx"},countryCodes:["id"],terms:[],matchScore:2,suggestion:true},"amenity/cinema/Cinemex":{name:"Cinemex",icon:"maki-cinema",imageURL:"https://graph.facebook.com/Cinemex/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3333072",amenity:"cinema"},addTags:{amenity:"cinema",brand:"Cinemex","brand:wikidata":"Q3333072","brand:wikipedia":"en:Cinemex",name:"Cinemex"},countryCodes:["mx"],terms:[],matchScore:2,suggestion:true},"amenity/cinema/Cineplanet":{name:"Cineplanet",icon:"maki-cinema",imageURL:"https://graph.facebook.com/cineplanet/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5769680",amenity:"cinema"},addTags:{amenity:"cinema",brand:"Cineplanet","brand:wikidata":"Q5769680","brand:wikipedia":"es:Cineplanet",name:"Cineplanet"},countryCodes:["cl","pe"],terms:[],matchScore:2,suggestion:true},"amenity/cinema/Cineplexx":{name:"Cineplexx",icon:"maki-cinema",imageURL:"https://pbs.twimg.com/profile_images/1125406971023306754/aVpG7gAl_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q873340",amenity:"cinema"},addTags:{amenity:"cinema",brand:"Cineplexx","brand:wikidata":"Q873340","brand:wikipedia":"en:Cineplexx Cinemas",name:"Cineplexx"},countryCodes:["at","si"],terms:[],matchScore:2,suggestion:true},"amenity/cinema/Cinepolis":{name:"Cinepolis",icon:"maki-cinema",imageURL:"https://graph.facebook.com/cinepolisbrasil/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5686673",amenity:"cinema"},addTags:{amenity:"cinema",brand:"Cinepolis","brand:wikidata":"Q5686673","brand:wikipedia":"en:Cinépolis",name:"Cinepolis"},terms:[],matchScore:2,suggestion:true},"amenity/cinema/Cineworld":{name:"Cineworld",icon:"maki-cinema",imageURL:"https://graph.facebook.com/cineworld/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5120901",amenity:"cinema"},addTags:{amenity:"cinema",brand:"Cineworld","brand:wikidata":"Q5120901","brand:wikipedia":"en:Cineworld",name:"Cineworld"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/cinema/Event":{name:"Event",icon:"maki-cinema",imageURL:"https://pbs.twimg.com/profile_images/1130630166344945664/zjkVbEAk_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q5416698",amenity:"cinema"},addTags:{amenity:"cinema",brand:"Event","brand:wikidata":"Q5416698","brand:wikipedia":"en:Event Cinemas",name:"Event",official_name:"Event Cinemas"},countryCodes:["au","nz"],terms:["event cinema"],matchScore:2,suggestion:true},"amenity/cinema/Harkins Theatres":{name:"Harkins Theatres",icon:"maki-cinema",imageURL:"https://graph.facebook.com/harkinstheatres/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5658199",amenity:"cinema"},addTags:{amenity:"cinema",brand:"Harkins Theatres","brand:wikidata":"Q5658199","brand:wikipedia":"en:Harkins Theatres",name:"Harkins Theatres",short_name:"Harkins"},countryCodes:["us"],terms:["harkins theater","harkins theaters","harkins theatre"],matchScore:2,suggestion:true},"amenity/cinema/Hoyts":{name:"Hoyts",icon:"maki-cinema",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FHOYTS%20LOGO%20RED-01.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q5922976",amenity:"cinema"},addTags:{amenity:"cinema",brand:"Hoyts","brand:wikidata":"Q5922976","brand:wikipedia":"en:Hoyts",name:"Hoyts"},countryCodes:["au","nz"],terms:[],matchScore:2,suggestion:true},"amenity/cinema/Landmark Theatres":{name:"Landmark Theatres",icon:"maki-cinema",imageURL:"https://graph.facebook.com/LandmarkTheatres/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6484805",amenity:"cinema"},addTags:{amenity:"cinema",brand:"Landmark Theatres","brand:wikidata":"Q6484805","brand:wikipedia":"en:Landmark Theatres",name:"Landmark Theatres",short_name:"Landmark"},countryCodes:["us"],terms:["landmark theater","landmark theaters","landmark theatre"],matchScore:2,suggestion:true},"amenity/cinema/MOVIX":{name:"MOVIX",icon:"maki-cinema",geometry:["point","area"],tags:{"brand:wikidata":"Q11532184",amenity:"cinema"},addTags:{amenity:"cinema",brand:"MOVIX","brand:wikidata":"Q11532184","brand:wikipedia":"ja:松竹マルチプレックスシアターズ",name:"MOVIX",official_name:"松竹マルチプレックスシアターズ","official_name:en":"Shochiku Multiplex Theatres"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/cinema/Marcus Cinema":{name:"Marcus Cinema",icon:"maki-cinema",imageURL:"https://graph.facebook.com/marcustheatres/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64083352",amenity:"cinema"},addTags:{amenity:"cinema",brand:"Marcus Cinema","brand:wikidata":"Q64083352",name:"Marcus Cinema",short_name:"Marcus"},countryCodes:["us"],terms:["marcus cinemas","marcus theater","marcus theaters","marcus theatre","marcus theatres"],matchScore:2,suggestion:true},"amenity/cinema/Movie Tavern":{name:"Movie Tavern",icon:"maki-cinema",imageURL:"https://graph.facebook.com/movietavern/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64083534",amenity:"cinema"},addTags:{amenity:"cinema",brand:"Movie Tavern","brand:wikidata":"Q64083534",name:"Movie Tavern"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/cinema/Multikino":{name:"Multikino",icon:"maki-cinema",imageURL:"https://graph.facebook.com/MultikinoPolska/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1144802",amenity:"cinema"},addTags:{amenity:"cinema",brand:"Multikino","brand:wikidata":"Q1144802","brand:wikipedia":"pl:Multikino",name:"Multikino"},countryCodes:["lt","lv","pl"],terms:[],matchScore:2,suggestion:true},"amenity/cinema/Odeon":{name:"Odeon",icon:"maki-cinema",imageURL:"https://graph.facebook.com/ODEON/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6127470",amenity:"cinema"},addTags:{amenity:"cinema",brand:"Odeon","brand:wikidata":"Q6127470","brand:wikipedia":"en:Odeon Cinemas",name:"Odeon"},countryCodes:["gb","gr","ie","it"],terms:["odeon cinema"],matchScore:2,suggestion:true},"amenity/cinema/Regal Cinemas":{name:"Regal Cinemas",icon:"maki-cinema",imageURL:"https://graph.facebook.com/RegalMovies/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q835638",amenity:"cinema"},addTags:{amenity:"cinema",brand:"Regal Cinemas","brand:wikidata":"Q835638","brand:wikipedia":"en:Regal Cinemas",name:"Regal Cinemas",short_name:"Regal"},countryCodes:["us"],terms:["regal cinema"],matchScore:2,suggestion:true},"amenity/cinema/Showcase Cinemas":{name:"Showcase Cinemas",icon:"maki-cinema",imageURL:"https://graph.facebook.com/ShowcaseUS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7503170",amenity:"cinema"},addTags:{amenity:"cinema",brand:"Showcase Cinemas","brand:wikidata":"Q7503170","brand:wikipedia":"en:Showcase Cinemas",name:"Showcase Cinemas",short_name:"Showcase"},countryCodes:["ar","gb","us"],terms:["showcase cinema"],matchScore:2,suggestion:true},"amenity/cinema/TOHOシネマズ":{name:"TOHOシネマズ",icon:"maki-cinema",geometry:["point","area"],tags:{"brand:wikidata":"Q11235261",amenity:"cinema"},addTags:{amenity:"cinema",brand:"TOHOシネマズ","brand:en":"TOHO CINEMAS","brand:ja":"TOHOシネマズ","brand:wikidata":"Q11235261","brand:wikipedia":"ja:TOHOシネマズ",name:"TOHOシネマズ","name:en":"Toho Cinemas","name:ja":"TOHOシネマズ",short_name:"TOHO"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/cinema/The Space Cinema":{name:"The Space Cinema",icon:"maki-cinema",imageURL:"https://graph.facebook.com/TheSpaceCinema/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3989406",amenity:"cinema"},addTags:{amenity:"cinema",brand:"The Space Cinema","brand:wikidata":"Q3989406","brand:wikipedia":"it:The Space Cinema",name:"The Space Cinema"},countryCodes:["it"],terms:["the space"],matchScore:2,suggestion:true},"amenity/cinema/Vue (IrelandAndUK)":{name:"Vue (IrelandAndUK)",icon:"maki-cinema",imageURL:"https://graph.facebook.com/VueCinemas/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2535134",amenity:"cinema"},addTags:{amenity:"cinema",brand:"Vue","brand:wikidata":"Q2535134","brand:wikipedia":"en:Vue Cinemas",name:"Vue"},countryCodes:["gb","ie"],terms:["vue cinema","vue cinemas"],matchScore:2,suggestion:true},"amenity/cinema/Vue (Netherlands)":{name:"Vue (Netherlands)",icon:"maki-cinema",imageURL:"https://graph.facebook.com/vuecinemasnl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2421690",amenity:"cinema"},addTags:{amenity:"cinema",brand:"Vue","brand:wikidata":"Q2421690","brand:wikipedia":"nl:Vue (bioscoopketen)",name:"Vue"},countryCodes:["nl"],terms:["vue cinema"],matchScore:2,suggestion:true},"amenity/cinema/イオンシネマ":{name:"イオンシネマ",icon:"maki-cinema",geometry:["point","area"],tags:{"brand:wikidata":"Q17192792",amenity:"cinema"},addTags:{amenity:"cinema",brand:"イオンシネマ","brand:en":"AEON Cinema","brand:ja":"イオンシネマ","brand:wikidata":"Q17192792","brand:wikipedia":"ja:イオンエンターテイメント",name:"イオンシネマ","name:en":"AEON Cinema","name:ja":"イオンシネマ"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/cinema/ユナイテッド・シネマ":{name:"ユナイテッド・シネマ",icon:"maki-cinema",imageURL:"https://graph.facebook.com/unitedcinemasgroup/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11345629",amenity:"cinema"},addTags:{amenity:"cinema",brand:"ユナイテッド・シネマ","brand:en":"United Cinemas","brand:ja":"ユナイテッド・シネマ","brand:wikidata":"Q11345629","brand:wikipedia":"ja:ユナイテッド・シネマ",name:"ユナイテッド・シネマ","name:en":"United Cinemas","name:ja":"ユナイテッド・シネマ"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/clinic/DaVita Dialysis":{name:"DaVita Dialysis",icon:"maki-doctor",imageURL:"https://graph.facebook.com/davitakidneycare/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5207184",amenity:"clinic"},addTags:{amenity:"clinic",brand:"DaVita Dialysis","brand:wikidata":"Q5207184",healthcare:"dialysis","healthcare:speciality":"dialysis",name:"DaVita Dialysis"},reference:{key:"amenity",value:"clinic"},countryCodes:["us"],terms:["davita","davita kidney care"],matchScore:2,suggestion:true},"amenity/clinic/Dialysis Clinic":{name:"Dialysis Clinic",icon:"maki-doctor",imageURL:"https://graph.facebook.com/DialysisClinicInc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5270633",amenity:"clinic"},addTags:{amenity:"clinic",brand:"Dialysis Clinic","brand:wikidata":"Q5270633","brand:wikipedia":"en:Dialysis Clinic, Inc.",healthcare:"dialysis","healthcare:speciality":"dialysis",name:"Dialysis Clinic",short_name:"DCI"},reference:{key:"amenity",value:"clinic"},countryCodes:["us"],terms:["dialysis clinic inc"],matchScore:2,suggestion:true},"amenity/clinic/Fresenius Kidney Care":{name:"Fresenius Kidney Care",icon:"maki-doctor",imageURL:"https://graph.facebook.com/freseniuskidneycare/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q650259",amenity:"clinic"},addTags:{amenity:"clinic",brand:"Fresenius Kidney Care","brand:wikidata":"Q650259","brand:wikipedia":"en:Fresenius Medical Care",healthcare:"dialysis","healthcare:speciality":"dialysis",name:"Fresenius Kidney Care"},reference:{key:"amenity",value:"clinic"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/clinic/Fresenius Medical Care":{name:"Fresenius Medical Care",icon:"maki-doctor",imageURL:"https://graph.facebook.com/freseniuskidneycare/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q650259",amenity:"clinic"},addTags:{amenity:"clinic",brand:"Fresenius Medical Care","brand:wikidata":"Q650259","brand:wikipedia":"en:Fresenius Medical Care",healthcare:"dialysis","healthcare:speciality":"dialysis",name:"Fresenius Medical Care"},reference:{key:"amenity",value:"clinic"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/clinic/Satellite Healthcare":{name:"Satellite Healthcare",icon:"maki-doctor",imageURL:"https://graph.facebook.com/satellitehealthcare/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q50039787",amenity:"clinic"},addTags:{amenity:"clinic",brand:"Satellite Healthcare","brand:wikidata":"Q50039787",healthcare:"dialysis","healthcare:speciality":"dialysis",name:"Satellite Healthcare"},reference:{key:"amenity",value:"clinic"},countryCodes:["us"],terms:["satellite","satellite dialysis"],matchScore:2,suggestion:true},"amenity/clinic/Terveystalo":{name:"Terveystalo",icon:"maki-doctor",imageURL:"https://graph.facebook.com/Terveystalo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11897034",amenity:"clinic"},addTags:{amenity:"clinic",brand:"Terveystalo","brand:wikidata":"Q11897034","brand:wikipedia":"fi:Terveystalo",healthcare:"clinic",name:"Terveystalo"},reference:{key:"amenity",value:"clinic"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"amenity/dentist/Aspen Dental":{name:"Aspen Dental",icon:"maki-dentist",imageURL:"https://graph.facebook.com/AspenDental/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4807808",amenity:"dentist"},addTags:{amenity:"dentist",brand:"Aspen Dental","brand:wikidata":"Q4807808","brand:wikipedia":"en:Aspen Dental",healthcare:"dentist",name:"Aspen Dental"},reference:{key:"amenity",value:"dentist"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/dentist/Comfort Dental":{name:"Comfort Dental",icon:"maki-dentist",imageURL:"https://graph.facebook.com/comfortdental/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q22079521",amenity:"dentist"},addTags:{amenity:"dentist",brand:"Comfort Dental","brand:wikidata":"Q22079521","brand:wikipedia":"en:Comfort Dental",healthcare:"dentist",name:"Comfort Dental"},reference:{key:"amenity",value:"dentist"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/dentist/Kool Smiles":{name:"Kool Smiles",icon:"maki-dentist",imageURL:"https://graph.facebook.com/MyKoolSmiles/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6430587",amenity:"dentist"},addTags:{amenity:"dentist",brand:"Kool Smiles","brand:wikidata":"Q6430587","brand:wikipedia":"en:Kool Smiles",healthcare:"dentist",name:"Kool Smiles"},reference:{key:"amenity",value:"dentist"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/dentist/Western Dental":{name:"Western Dental",icon:"maki-dentist",imageURL:"https://graph.facebook.com/WesternDental/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64211989",amenity:"dentist"},addTags:{alt_name:"Western Dental & Orthodontics",amenity:"dentist",brand:"Western Dental","brand:wikidata":"Q64211989","brand:wikipedia":"en:Western Dental",healthcare:"dentist",name:"Western Dental"},reference:{key:"amenity",value:"dentist"},countryCodes:["us"],terms:["western dental and orthodontics"],matchScore:2,suggestion:true},"amenity/doctors/MinuteClinic":{name:"MinuteClinic",icon:"maki-doctor",imageURL:"https://graph.facebook.com/minuteclinic/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6871141",amenity:"doctors"},addTags:{amenity:"doctors",brand:"MinuteClinic","brand:wikidata":"Q6871141","brand:wikipedia":"en:MinuteClinic",healthcare:"doctor","healthcare:speciality":"community",name:"MinuteClinic"},reference:{key:"amenity",value:"doctors"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/doctors/RediClinic":{name:"RediClinic",icon:"maki-doctor",imageURL:"https://graph.facebook.com/RediClinic/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64138408",amenity:"doctors"},addTags:{amenity:"doctors",brand:"RediClinic","brand:wikidata":"Q64138408",healthcare:"doctor","healthcare:speciality":"community",name:"RediClinic"},reference:{key:"amenity",value:"doctors"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/doctors/The Little Clinic":{name:"The Little Clinic",icon:"maki-doctor",imageURL:"https://graph.facebook.com/thelittleclinic/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64138262",amenity:"doctors"},addTags:{amenity:"doctors",brand:"The Little Clinic","brand:wikidata":"Q64138262",healthcare:"doctor","healthcare:speciality":"community",name:"The Little Clinic"},reference:{key:"amenity",value:"doctors"},countryCodes:["us"],terms:["little clinic"],matchScore:2,suggestion:true},"amenity/doctors/Walgreens Healthcare Clinic":{name:"Walgreens Healthcare Clinic",icon:"maki-doctor",imageURL:"https://graph.facebook.com/walgreens/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1591889",amenity:"doctors"},addTags:{amenity:"doctors",brand:"Walgreens","brand:wikidata":"Q1591889",healthcare:"doctor","healthcare:speciality":"community",name:"Walgreens Healthcare Clinic"},reference:{key:"amenity",value:"doctors"},countryCodes:["us"],terms:["healthcare clinic","takecare","takecare clinic","walgreens"],matchScore:2,suggestion:true},"amenity/fast_food/burger/A&W (Canada)":{name:"A&W (Canada)",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/405801939456462/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2818848",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"A&W","brand:wikidata":"Q2818848","brand:wikipedia":"en:A&W (Canada)",cuisine:"burger",name:"A&W",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/A&W (USA)":{name:"A&W (USA)",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/awrestaurants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q277641",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"A&W","brand:wikidata":"Q277641","brand:wikipedia":"en:A&W Restaurants",cuisine:"burger",name:"A&W",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/chicken/Andok's":{name:"Andok's",icon:"fas-drumstick-bite",imageURL:"https://graph.facebook.com/andokslitsonmanok/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62267166",amenity:"fast_food",cuisine:"chicken"},addTags:{amenity:"fast_food",brand:"Andok's","brand:wikidata":"Q62267166",cuisine:"chicken",name:"Andok's",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Angel's Burger":{name:"Angel's Burger",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/angburgerngbayan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62267228",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Angel's Burger","brand:wikidata":"Q62267228",cuisine:"burger",name:"Angel's Burger",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Arby's":{name:"Arby's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/arbys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q630866",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Arby's","brand:wikidata":"Q630866","brand:wikipedia":"en:Arby's",cuisine:"sandwich",name:"Arby's",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["ca","tr","us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Au Bon Pain":{name:"Au Bon Pain",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/aubonpain/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4818942",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Au Bon Pain","brand:wikidata":"Q4818942","brand:wikipedia":"en:Au Bon Pain",cuisine:"sandwich",name:"Au Bon Pain",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["in","th","us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Auntie Anne's":{name:"Auntie Anne's",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/auntieannespretzels/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4822010",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Auntie Anne's","brand:wikidata":"Q4822010","brand:wikipedia":"en:Auntie Anne's",cuisine:"pretzel",name:"Auntie Anne's",takeaway:"yes"},countryCodes:["us"],terms:["auntie annes pretzels"],matchScore:2,suggestion:true},"amenity/fast_food/mexican/Baja Fresh":{name:"Baja Fresh",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/bajafresh/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2880019",amenity:"fast_food",cuisine:"mexican"},addTags:{amenity:"fast_food",brand:"Baja Fresh","brand:wikidata":"Q2880019","brand:wikipedia":"en:Baja Fresh",cuisine:"mexican",name:"Baja Fresh",takeaway:"yes"},reference:{key:"cuisine",value:"mexican"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/mexican/Barburrito":{name:"Barburrito",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/BarburritoUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16983668",amenity:"fast_food",cuisine:"mexican"},addTags:{amenity:"fast_food",brand:"Barburrito","brand:wikidata":"Q16983668","brand:wikipedia":"en:Barburrito",cuisine:"mexican",name:"Barburrito",takeaway:"yes"},reference:{key:"cuisine",value:"mexican"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Bembos":{name:"Bembos",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/bembos/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q466971",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Bembos","brand:wikidata":"Q466971","brand:wikipedia":"en:Bembos",cuisine:"burger",name:"Bembos",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["pe"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Blimpie":{name:"Blimpie",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/Blimpie/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4926479",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Blimpie","brand:wikidata":"Q4926479","brand:wikipedia":"en:Blimpie",cuisine:"sandwich",name:"Blimpie",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Bob's":{name:"Bob's",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/bobsbrasil/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1392113",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Bob's","brand:wikidata":"Q1392113","brand:wikipedia":"en:Bob's",cuisine:"burger",name:"Bob's",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["ao","br","cl","pt"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/chicken/Bojangles'":{name:"Bojangles'",icon:"fas-drumstick-bite",imageURL:"https://graph.facebook.com/Bojangles1977/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q891163",amenity:"fast_food",cuisine:"chicken"},addTags:{amenity:"fast_food",brand:"Bojangles'","brand:wikidata":"Q891163","brand:wikipedia":"en:Bojangles' Famous Chicken 'n Biscuits",cuisine:"chicken",name:"Bojangles'",official_name:"Bojangles' Famous Chicken 'n Biscuits",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Booster Juice":{name:"Booster Juice",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/boosterjuice/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4943796",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Booster Juice","brand:wikidata":"Q4943796","brand:wikipedia":"en:Booster Juice",cuisine:"juice",name:"Booster Juice",takeaway:"yes"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Boston Market":{name:"Boston Market",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/BostonMarket/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q603617",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Boston Market","brand:wikidata":"Q603617","brand:wikipedia":"en:Boston Market",cuisine:"american",name:"Boston Market",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/ice_cream/Braum's":{name:"Braum's",icon:"fas-ice-cream",imageURL:"https://graph.facebook.com/BraumsIceCreamandDairyStores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4958263",amenity:"fast_food",cuisine:"ice_cream"},addTags:{amenity:"fast_food",brand:"Braum's","brand:wikidata":"Q4958263","brand:wikipedia":"en:Braum's",cuisine:"ice_cream",name:"Braum's",shop:"dairy",takeaway:"yes"},reference:{key:"cuisine",value:"ice_cream"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Bruegger's Bagels":{name:"Bruegger's Bagels",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/Brueggers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4978656",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Bruegger's Bagels","brand:wikidata":"Q4978656","brand:wikipedia":"en:Bruegger's",cuisine:"bagel",name:"Bruegger's Bagels",short_name:"Bruegger's",takeaway:"yes"},countryCodes:["us"],terms:["breuger's","breugger's","bruger's","brugger's"],matchScore:2,suggestion:true},"amenity/fast_food/burger/Burger King":{name:"Burger King",icon:"maki-fast-food",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBurger%20King%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q177054",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Burger King","brand:wikidata":"Q177054","brand:wikipedia":"en:Burger King",cuisine:"burger",name:"Burger King",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},terms:["burguer king"],matchScore:2,suggestion:true},"amenity/fast_food/burger/Burger Machine":{name:"Burger Machine",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/burgermachineofficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4998549",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Burger Machine","brand:wikidata":"Q4998549","brand:wikipedia":"en:Burger Machine",cuisine:"burger",name:"Burger Machine",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/BurgerFi":{name:"BurgerFi",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/BurgerFi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q39045496",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"BurgerFi","brand:wikidata":"Q39045496","brand:wikipedia":"en:BurgerFi",cuisine:"burger",name:"BurgerFi",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Burgerim":{name:"Burgerim",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/iBurgerim/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64760354",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Burgerim","brand:en":"Burgerim","brand:he":"בורגרים","brand:wikidata":"Q64760354",cuisine:"burger",name:"Burgerim","name:en":"Burgerim","name:he":"בורגרים",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Burgers Bar":{name:"Burgers Bar",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/BurgersBarIL/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64760337",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Burgers Bar","brand:en":"Burgers Bar","brand:he":"בורגרס בר","brand:wikidata":"Q64760337",cuisine:"burger","diet:kosher":"yes",name:"Burgers Bar","name:en":"Burgers Bar","name:he":"בורגרס בר",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Burgerville":{name:"Burgerville",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/burgerville/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4998570",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Burgerville","brand:wikidata":"Q4998570","brand:wikipedia":"en:Burgerville",cuisine:"burger",name:"Burgerville",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Captain D's":{name:"Captain D's",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/CaptainDs/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5036616",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Captain D's","brand:wikidata":"Q5036616","brand:wikipedia":"en:Captain D's",cuisine:"seafood",name:"Captain D's",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Carl's Jr.":{name:"Carl's Jr.",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/carlsjr/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1043486",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Carl's Jr.","brand:wikidata":"Q1043486","brand:wikipedia":"en:Carl's Jr.",cuisine:"burger",name:"Carl's Jr.",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Charleys Philly Steaks":{name:"Charleys Philly Steaks",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/CharleysPhillySteaks/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1066777",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Charleys Philly Steaks","brand:wikidata":"Q1066777","brand:wikipedia":"en:Charleys Philly Steaks",cuisine:"sandwich",name:"Charleys Philly Steaks",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["us"],terms:["charleys"],matchScore:2,suggestion:true},"amenity/fast_food/burger/Checkers":{name:"Checkers",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/checkersrallys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63919315",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Checkers","brand:wikidata":"Q63919315",cuisine:"burger",name:"Checkers",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/chicken/Chick-fil-A":{name:"Chick-fil-A",icon:"fas-drumstick-bite",imageURL:"https://graph.facebook.com/ChickfilA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q491516",amenity:"fast_food",cuisine:"chicken"},addTags:{amenity:"fast_food",brand:"Chick-fil-A","brand:wikidata":"Q491516","brand:wikipedia":"en:Chick-fil-A",cuisine:"chicken",name:"Chick-fil-A",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/chicken/Chicken Express":{name:"Chicken Express",icon:"fas-drumstick-bite",imageURL:"https://graph.facebook.com/chickenexpress/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5096235",amenity:"fast_food",cuisine:"chicken"},addTags:{amenity:"fast_food",brand:"Chicken Express","brand:wikidata":"Q5096235","brand:wikipedia":"en:Chicken Express",cuisine:"chicken",name:"Chicken Express",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},countryCodes:["gb","us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/China Wok":{name:"China Wok",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/ChinaWokPeru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5766542",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"China Wok","brand:wikidata":"Q5766542","brand:wikipedia":"es:China Wok",cuisine:"chinese",name:"China Wok",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/mexican/Chipotle":{name:"Chipotle",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/chipotle/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q465751",amenity:"fast_food",cuisine:"mexican"},addTags:{amenity:"fast_food",brand:"Chipotle","brand:wikidata":"Q465751","brand:wikipedia":"en:Chipotle Mexican Grill",cuisine:"mexican",name:"Chipotle",official_name:"Chipotle Mexican Grill",takeaway:"yes"},reference:{key:"cuisine",value:"mexican"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Chopt":{name:"Chopt",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/choptsalad/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17509305",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Chopt","brand:wikidata":"Q17509305","brand:wikipedia":"en:Chopt",cuisine:"salad",name:"Chopt",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Chowking":{name:"Chowking",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/chowkingph/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1076816",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Chowking","brand:wikidata":"Q1076816","brand:wikipedia":"en:Chowking",cuisine:"asian",name:"Chowking",takeaway:"yes"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/chicken/Church's Chicken":{name:"Church's Chicken",icon:"fas-drumstick-bite",imageURL:"https://graph.facebook.com/churchschicken/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1089932",amenity:"fast_food",cuisine:"chicken"},addTags:{amenity:"fast_food",brand:"Church's Chicken","brand:wikidata":"Q1089932","brand:wikipedia":"en:Church's Chicken",cuisine:"chicken",name:"Church's Chicken",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Cinnabon":{name:"Cinnabon",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/Cinnabon/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1092539",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Cinnabon","brand:website":"https://www.cinnabon.com/","brand:wikidata":"Q1092539","brand:wikipedia":"en:Cinnabon",cuisine:"dessert",name:"Cinnabon",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/CoCo壱番屋":{name:"CoCo壱番屋",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/cocoichicurry/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5986105",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"CoCo壱番屋","brand:en":"CoCo Ichibanya","brand:ja":"CoCo壱番屋","brand:wikidata":"Q5986105","brand:wikipedia":"en:Ichibanya",cuisine:"japanese",name:"CoCo壱番屋","name:en":"CoCo Ichibanya","name:ja":"CoCo壱番屋",takeaway:"yes"},countryCodes:["cn","jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Cook Out":{name:"Cook Out",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/CookOut/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5166992",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Cook Out","brand:wikidata":"Q5166992","brand:wikipedia":"en:Cook Out (restaurant)",cuisine:"american",name:"Cook Out",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Così":{name:"Così",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/getcosi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5175243",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Così","brand:wikidata":"Q5175243","brand:wikipedia":"en:Così (restaurant)",cuisine:"sandwich",name:"Così",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Culver's":{name:"Culver's",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/culvers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1143589",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Culver's","brand:wikidata":"Q1143589","brand:wikipedia":"en:Culver's",cuisine:"burger",name:"Culver's",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/ice_cream/DQ Grill & Chill":{name:"DQ Grill & Chill",icon:"fas-ice-cream",imageURL:"https://graph.facebook.com/dairyqueen/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1141226",amenity:"fast_food",cuisine:"ice_cream;burger"},addTags:{amenity:"fast_food",brand:"DQ Grill & Chill","brand:wikidata":"Q1141226","brand:wikipedia":"en:Dairy Queen",cuisine:"ice_cream;burger",name:"DQ Grill & Chill",takeaway:"yes"},reference:{key:"cuisine",value:"ice_cream"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/ice_cream/Dairy Queen":{name:"Dairy Queen",icon:"fas-ice-cream",imageURL:"https://graph.facebook.com/dairyqueen/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1141226",amenity:"fast_food",cuisine:"ice_cream;burger"},addTags:{amenity:"fast_food",brand:"Dairy Queen","brand:wikidata":"Q1141226","brand:wikipedia":"en:Dairy Queen",cuisine:"ice_cream;burger",name:"Dairy Queen",takeaway:"yes"},reference:{key:"cuisine",value:"ice_cream"},terms:["dq"],matchScore:2,suggestion:true},"amenity/fast_food/donut/Daylight Donuts":{name:"Daylight Donuts",icon:"temaki-donut",imageURL:"https://graph.facebook.com/DaylightDonutFlourCo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q48970508",amenity:"fast_food",cuisine:"donut"},addTags:{amenity:"fast_food",brand:"Daylight Donuts","brand:wikidata":"Q48970508","brand:wikipedia":"en:Daylight Donuts",cuisine:"donut",name:"Daylight Donuts",takeaway:"yes"},reference:{key:"cuisine",value:"donut"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/mexican/Del Taco":{name:"Del Taco",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/deltaco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1183818",amenity:"fast_food",cuisine:"mexican"},addTags:{amenity:"fast_food",brand:"Del Taco","brand:wikidata":"Q1183818","brand:wikipedia":"en:Del Taco",cuisine:"mexican",name:"Del Taco",takeaway:"yes"},reference:{key:"cuisine",value:"mexican"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Dig Inn":{name:"Dig Inn",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/diginnmarket/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q28226241",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Dig Inn","brand:wikidata":"Q28226241","brand:wikipedia":"en:Dig Inn",cuisine:"regional",name:"Dig Inn",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/Domino's Pizza":{name:"Domino's Pizza",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/Dominos/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q839466",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"Domino's Pizza","brand:wikidata":"Q839466","brand:wikipedia":"en:Domino's Pizza",cuisine:"pizza",name:"Domino's Pizza",short_name:"Domino's",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/donut/Dunkin' Donuts":{name:"Dunkin' Donuts",icon:"temaki-donut",imageURL:"https://graph.facebook.com/DunkinUS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q847743",amenity:"fast_food",cuisine:"donut;coffee"},addTags:{amenity:"fast_food",brand:"Dunkin' Donuts","brand:wikidata":"Q847743","brand:wikipedia":"en:Dunkin' Donuts",cuisine:"donut;coffee",name:"Dunkin' Donuts",takeaway:"yes"},reference:{key:"cuisine",value:"donut"},terms:["dunkin doughnuts"],matchScore:2,suggestion:true},"amenity/fast_food/Einstein Bros. Bagels":{name:"Einstein Bros. Bagels",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/einsteinbros/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5349788",amenity:"fast_food"},addTags:{alt_name:"Einstein Brothers Bagels",amenity:"fast_food",brand:"Einstein Bros. Bagels","brand:wikidata":"Q5349788","brand:wikipedia":"en:Einstein Bros. Bagels",cuisine:"bagel",name:"Einstein Bros. Bagels",takeaway:"yes"},countryCodes:["us"],terms:["einstein bros","einstein brothers"],matchScore:2,suggestion:true},"amenity/fast_food/mexican/El Pollo Loco":{name:"El Pollo Loco",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/ElPolloLoco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2353849",amenity:"fast_food",cuisine:"mexican"},addTags:{amenity:"fast_food",brand:"El Pollo Loco","brand:wikidata":"Q2353849","brand:wikipedia":"en:El Pollo Loco",cuisine:"mexican",name:"El Pollo Loco",takeaway:"yes"},reference:{key:"cuisine",value:"mexican"},countryCodes:["mx","us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Everest":{name:"Everest",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/everest.gr/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62273299",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Everest","brand:wikidata":"Q62273299",cuisine:"burger",name:"Everest",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["gr"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Extreme Pita":{name:"Extreme Pita",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/TheExtremePita/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5422367",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Extreme Pita","brand:wikidata":"Q5422367","brand:wikipedia":"en:Extreme Pita",cuisine:"pita",name:"Extreme Pita",takeaway:"yes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Fazoli's":{name:"Fazoli's",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/Fazolis/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1399195",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Fazoli's","brand:wikidata":"Q1399195","brand:wikipedia":"en:Fazoli's",cuisine:"italian",name:"Fazoli's",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Firehouse Subs":{name:"Firehouse Subs",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/firehousesubs/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5451873",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Firehouse Subs","brand:wikidata":"Q5451873","brand:wikipedia":"en:Firehouse Subs",cuisine:"sandwich",name:"Firehouse Subs",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Five Guys":{name:"Five Guys",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/fiveguys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1131810",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Five Guys","brand:wikidata":"Q1131810","brand:wikipedia":"en:Five Guys",cuisine:"burger",name:"Five Guys",official_name:"Five Guys Burgers and Fries",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/ice_cream/Freddy's":{name:"Freddy's",icon:"fas-ice-cream",imageURL:"https://graph.facebook.com/FreddysUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5496837",amenity:"fast_food",cuisine:"ice_cream;burger"},addTags:{amenity:"fast_food",brand:"Freddy's","brand:wikidata":"Q5496837","brand:wikipedia":"en:Freddy's Frozen Custard & Steakburgers",cuisine:"ice_cream;burger",name:"Freddy's",takeaway:"yes"},reference:{key:"cuisine",value:"ice_cream"},countryCodes:["us"],terms:["freddys frozen custard & steakburgers","freddys frozen custard and steakburgers"],matchScore:2,suggestion:true},"amenity/fast_food/mexican/Freebirds":{name:"Freebirds",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/freebirdsworldburrito/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5500367",amenity:"fast_food",cuisine:"mexican"},addTags:{amenity:"fast_food",brand:"Freebirds","brand:wikidata":"Q5500367","brand:wikipedia":"en:Freebirds World Burrito",cuisine:"mexican",name:"Freebirds",takeaway:"yes"},reference:{key:"cuisine",value:"mexican"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/Gabriel Pizza":{name:"Gabriel Pizza",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/gabrielpizza/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5515791",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"Gabriel Pizza","brand:wikidata":"Q5515791","brand:wikipedia":"en:Gabriel Pizza",cuisine:"pizza",name:"Gabriel Pizza",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/Gino's Pizza":{name:"Gino's Pizza",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{"brand:wikidata":"Q5563205",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"Gino's Pizza","brand:wikidata":"Q5563205","brand:wikipedia":"en:Gino's Pizza and Spaghetti",cuisine:"pizza",name:"Gino's Pizza",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Gold Star Chili":{name:"Gold Star Chili",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/goldstarchili/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16994254",amenity:"fast_food"},addTags:{alt_name:"Gold Star",amenity:"fast_food",brand:"Gold Star Chili","brand:wikidata":"Q16994254","brand:wikipedia":"en:Gold Star Chili",cuisine:"chili",name:"Gold Star Chili",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Golden Krust Caribbean Bakery & Grill":{name:"Golden Krust Caribbean Bakery & Grill",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/GoldenKrust/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5579615",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Golden Krust Caribbean Bakery & Grill","brand:wikidata":"Q5579615","brand:wikipedia":"en:Golden Krust Caribbean Bakery & Grill",cuisine:"caribbean",name:"Golden Krust",takeaway:"yes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Great American Cookies":{name:"Great American Cookies",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/greatamericancookies/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5598629",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Great American Cookies","brand:wikidata":"Q5598629","brand:wikipedia":"en:Great American Cookies",cuisine:"cookies",name:"Great American Cookies",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/Greenwich":{name:"Greenwich",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/GreenwichPizza/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2691308",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"Greenwich","brand:wikidata":"Q2691308","brand:wikipedia":"en:Greenwich Pizza",cuisine:"pizza",name:"Greenwich",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Habib's":{name:"Habib's",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/habibsoficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2504930",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Habib's","brand:wikidata":"Q2504930","brand:wikipedia":"en:Habib's",cuisine:"middle_eastern",name:"Habib's",takeaway:"yes"},countryCodes:["br","mx"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/Hallo Pizza":{name:"Hallo Pizza",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/Hallo.Pizza.Deutschland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1571798",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"Hallo Pizza","brand:wikidata":"Q1571798","brand:wikipedia":"de:Hallo Pizza",cuisine:"pizza",name:"Hallo Pizza",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Hardee's":{name:"Hardee's",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/hardees/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1585088",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Hardee's","brand:wikidata":"Q1585088","brand:wikipedia":"en:Hardee's",cuisine:"burger",name:"Hardee's",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Harvey's":{name:"Harvey's",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/HarveysCanada/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1466184",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Harvey's","brand:wikidata":"Q1466184","brand:wikipedia":"en:Harvey's",cuisine:"burger",name:"Harvey's",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Hesburger":{name:"Hesburger",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/hesburger/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1276832",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Hesburger","brand:wikidata":"Q1276832","brand:wikipedia":"en:Hesburger",cuisine:"burger",name:"Hesburger",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Hot Dog on a Stick":{name:"Hot Dog on a Stick",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/HotDogonaStick/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5909922",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Hot Dog on a Stick","brand:wikidata":"Q5909922","brand:wikipedia":"en:Hot Dog on a Stick",cuisine:"hot_dog",name:"Hot Dog on a Stick",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/mexican/Hot Head Burritos":{name:"Hot Head Burritos",icon:"fas-pepper-hot",imageURL:"https://pbs.twimg.com/profile_images/956274820035022853/SBuliAdo_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q5910008",amenity:"fast_food",cuisine:"mexican"},addTags:{amenity:"fast_food",brand:"Hot Head Burritos","brand:wikidata":"Q5910008","brand:wikipedia":"en:Hot Head Burritos",cuisine:"mexican",name:"Hot Head Burritos",short_name:"Hot Head",takeaway:"yes"},reference:{key:"cuisine",value:"mexican"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/Hungry Howie's":{name:"Hungry Howie's",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/hungryhowies/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16985303",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"Hungry Howie's","brand:wikidata":"Q16985303","brand:wikipedia":"en:Hungry Howie's Pizza",cuisine:"pizza",name:"Hungry Howie's",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},countryCodes:["us"],terms:["hungry howies pizza"],matchScore:2,suggestion:true},"amenity/fast_food/burger/Hungry Jacks":{name:"Hungry Jacks",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/HungryJacks/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3036373",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Hungry Jacks","brand:wikidata":"Q3036373","brand:wikipedia":"en:Hungry Jack's",cuisine:"burger",name:"Hungry Jacks",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/In-N-Out Burger":{name:"In-N-Out Burger",icon:"maki-fast-food",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FInNOut.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1205312",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"In-N-Out Burger","brand:wikidata":"Q1205312","brand:wikipedia":"en:In-N-Out Burger",cuisine:"burger",name:"In-N-Out Burger",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Jack in the Box":{name:"Jack in the Box",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/jackinthebox/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1538507",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Jack in the Box","brand:wikidata":"Q1538507","brand:wikipedia":"en:Jack in the Box",cuisine:"burger",name:"Jack in the Box",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Jamba Juice":{name:"Jamba Juice",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/jambajuice/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3088784",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Jamba Juice","brand:wikidata":"Q3088784","brand:wikipedia":"en:Jamba Juice",cuisine:"juice",name:"Jamba Juice",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Jersey Mike's Subs":{name:"Jersey Mike's Subs",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/jerseymikes/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6184897",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Jersey Mike's Subs","brand:wikidata":"Q6184897","brand:wikipedia":"en:Jersey Mike's Subs",cuisine:"sandwich",name:"Jersey Mike's Subs",short_name:"Jersey Mike's",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Jimmy John's":{name:"Jimmy John's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/jimmyjohns/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1689380",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Jimmy John's","brand:wikidata":"Q1689380","brand:wikipedia":"en:Jimmy John's",cuisine:"sandwich",name:"Jimmy John's",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Jollibee":{name:"Jollibee",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/JollibeePhilippines/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q37614",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Jollibee","brand:wikidata":"Q37614","brand:wikipedia":"en:Jollibee",cuisine:"burger",name:"Jollibee",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Just Salad":{name:"Just Salad",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/justsalad/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q23091823",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Just Salad","brand:wikidata":"Q23091823","brand:wikipedia":"en:Just Salad",cuisine:"salad",name:"Just Salad",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/chicken/KFC":{name:"KFC",icon:"fas-drumstick-bite",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FKFC%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q524757",amenity:"fast_food",cuisine:"chicken"},addTags:{alt_name:"Kentucky Fried Chicken",amenity:"fast_food",brand:"KFC","brand:wikidata":"Q524757","brand:wikipedia":"en:KFC",cuisine:"chicken",name:"KFC",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Kochlöffel":{name:"Kochlöffel",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/Kochloeffel.Deutschland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q315539",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Kochlöffel","brand:wikidata":"Q315539","brand:wikipedia":"en:Kochlöffel",cuisine:"burger",name:"Kochlöffel",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["de","tr"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/Kotipizza":{name:"Kotipizza",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/kotipizza/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1628625",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"Kotipizza","brand:wikidata":"Q1628625","brand:wikipedia":"en:Kotipizza",cuisine:"pizza",name:"Kotipizza",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/donut/Krispy Kreme":{name:"Krispy Kreme",icon:"temaki-donut",imageURL:"https://graph.facebook.com/KrispyKreme/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1192805",amenity:"fast_food",cuisine:"donut"},addTags:{amenity:"fast_food",brand:"Krispy Kreme","brand:wikidata":"Q1192805","brand:wikipedia":"en:Krispy Kreme",cuisine:"donut",name:"Krispy Kreme",takeaway:"yes"},reference:{key:"cuisine",value:"donut"},terms:["krispy kreme doughnuts"],matchScore:2,suggestion:true},"amenity/fast_food/burger/Krystal":{name:"Krystal",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/Krystal/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q472195",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Krystal","brand:wikidata":"Q472195","brand:wikipedia":"en:Krystal (restaurant)",cuisine:"burger",name:"Krystal",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/L&L Drive-Inn (Hawaii)":{name:"L&L Drive-Inn (Hawaii)",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/hawaiianbarbecue/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6455441",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"L&L Drive-Inn","brand:wikidata":"Q6455441","brand:wikipedia":"en:L&L Hawaiian Barbecue",cuisine:"hawaiian",name:"L&L Drive-Inn",takeaway:"yes"},countryCodes:["us"],terms:["l&l","l&l drive-in"],matchScore:2,suggestion:true},"amenity/fast_food/L&L Hawaiian Barbecue":{name:"L&L Hawaiian Barbecue",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/hawaiianbarbecue/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6455441",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"L&L Hawaiian Barbecue","brand:wikidata":"Q6455441","brand:wikipedia":"en:L&L Hawaiian Barbecue",cuisine:"hawaiian",name:"L&L Hawaiian Barbecue",takeaway:"yes"},countryCodes:["us"],terms:["l&l","l&l hawaiian bbq"],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Lee's Sandwiches":{name:"Lee's Sandwiches",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/LeesSandwiches/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6512823",amenity:"fast_food",cuisine:"vietnamese;sandwich"},addTags:{amenity:"fast_food",brand:"Lee's Sandwiches","brand:wikidata":"Q6512823","brand:wikipedia":"en:Lee's Sandwiches",cuisine:"vietnamese;sandwich",name:"Lee's Sandwiches",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/Little Caesars":{name:"Little Caesars",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/LittleCaesars/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1393809",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"Little Caesars","brand:wikidata":"Q1393809","brand:wikipedia":"en:Little Caesars",cuisine:"pizza",name:"Little Caesars",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},terms:["little caesars pizza"],matchScore:2,suggestion:true},"amenity/fast_food/Long John Silver's":{name:"Long John Silver's",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/LongJohnSilvers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1535221",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Long John Silver's","brand:wikidata":"Q1535221","brand:wikipedia":"en:Long John Silver's",cuisine:"seafood",name:"Long John Silver's",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Lotteria":{name:"Lotteria",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/ilovelotteria/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q249525",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Lotteria","brand:wikidata":"Q249525","brand:wikipedia":"en:Lotteria",cuisine:"burger",name:"Lotteria",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/MOD Pizza":{name:"MOD Pizza",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/MODPizza/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q19903469",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"MOD Pizza","brand:wikidata":"Q19903469","brand:wikipedia":"en:MOD Pizza",cuisine:"pizza",name:"MOD Pizza",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Manchu Wok":{name:"Manchu Wok",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/ManchuWOKRestaurants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6747622",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Manchu Wok","brand:wikidata":"Q6747622","brand:wikipedia":"en:Manchu Wok",cuisine:"chinese",name:"Manchu Wok",takeaway:"yes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Mang Inasal":{name:"Mang Inasal",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/MangInasalPhilippines/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6748573",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Mang Inasal","brand:wikidata":"Q6748573","brand:wikipedia":"en:Mang Inasal",cuisine:"barbecue",name:"Mang Inasal",takeaway:"yes"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Manhattan Bagel":{name:"Manhattan Bagel",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/ManhattanBagel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64517333",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Manhattan Bagel","brand:wikidata":"Q64517333",cuisine:"bagel",name:"Manhattan Bagel",takeaway:"yes"},countryCodes:["us"],terms:["manhattan bagels"],matchScore:2,suggestion:true},"amenity/fast_food/burger/Max":{name:"Max",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/maxburgers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1912172",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Max","brand:wikidata":"Q1912172","brand:wikipedia":"en:Max Hamburgers",cuisine:"burger",name:"Max",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["se"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/McDonald's":{name:"McDonald's",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/mcdonalds/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q38076",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"en:McDonald's",cuisine:"burger",name:"McDonald's",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/mexican/Mighty Taco":{name:"Mighty Taco",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/MyMightyTaco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6844210",amenity:"fast_food",cuisine:"mexican"},addTags:{amenity:"fast_food",brand:"Mighty Taco","brand:wikidata":"Q6844210","brand:wikipedia":"en:Mighty Taco",cuisine:"mexican",name:"Mighty Taco",takeaway:"yes"},reference:{key:"cuisine",value:"mexican"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Minute Burger":{name:"Minute Burger",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/MinuteBurger/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62273503",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Minute Burger","brand:wikidata":"Q62273503",cuisine:"burger",name:"Minute Burger",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/mexican/Moe's Southwest Grill":{name:"Moe's Southwest Grill",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/MoesSouthwestGrill/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6889938",amenity:"fast_food",cuisine:"mexican"},addTags:{amenity:"fast_food",brand:"Moe's Southwest Grill","brand:wikidata":"Q6889938","brand:wikipedia":"en:Moe's Southwest Grill",cuisine:"mexican",name:"Moe's Southwest Grill",short_name:"Moe's",takeaway:"yes"},reference:{key:"cuisine",value:"mexican"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Mr. Sub":{name:"Mr. Sub",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/mrsub/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6929225",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Mr. Sub","brand:wikidata":"Q6929225","brand:wikipedia":"en:Mr. Sub",cuisine:"sandwich",name:"Mr. Sub",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/New York Fries":{name:"New York Fries",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/NewYorkFries/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7013558",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"New York Fries","brand:wikidata":"Q7013558","brand:wikipedia":"en:New York Fries",cuisine:"fries",name:"New York Fries",takeaway:"yes"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/New York Pizza":{name:"New York Pizza",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/newyorkpizza.nl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2639128",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"New York Pizza","brand:wikidata":"Q2639128","brand:wikipedia":"nl:New York Pizza",cuisine:"pizza",name:"New York Pizza",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Noah's Bagels":{name:"Noah's Bagels",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/NoahsBagels/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64517373",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Noah's Bagels","brand:wikidata":"Q64517373",cuisine:"bagel",name:"Noah's Bagels",official_name:"Noah's New York Bagels",takeaway:"yes"},countryCodes:["us"],terms:["noahs ny bagels"],matchScore:2,suggestion:true},"amenity/fast_food/Nordsee":{name:"Nordsee",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/NORDSEEDeutschland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q74866",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Nordsee","brand:wikidata":"Q74866","brand:wikipedia":"en:Nordsee",cuisine:"seafood",name:"Nordsee",takeaway:"yes"},countryCodes:["at","ch","de"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Num Pang":{name:"Num Pang",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/NumPangKitchen/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62079702",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Num Pang","brand:wikidata":"Q62079702","brand:wikipedia":"en:Num Pang",cuisine:"cambodian, sandwich",name:"Num Pang",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/mexican/O'Tacos":{name:"O'Tacos",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/Otacos.France/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q28494040",amenity:"fast_food",cuisine:"mexican"},addTags:{amenity:"fast_food",brand:"O'Tacos","brand:wikidata":"Q28494040","brand:wikipedia":"en:O'Tacos",cuisine:"mexican",name:"O'Tacos",takeaway:"yes"},reference:{key:"cuisine",value:"mexican"},countryCodes:["be","fr"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Oporto":{name:"Oporto",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/Oportos/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4412342",amenity:"fast_food",cuisine:"burger;chicken"},addTags:{amenity:"fast_food",brand:"Oporto","brand:wikidata":"Q4412342","brand:wikipedia":"en:Oporto (restaurant)",cuisine:"burger;chicken",name:"Oporto",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Orange Julius":{name:"Orange Julius",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/OrangeJulius/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3355059",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Orange Julius","brand:wikidata":"Q3355059","brand:wikipedia":"en:Orange Julius",cuisine:"juice",name:"Orange Julius",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Pal's":{name:"Pal's",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/Palsweb/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7126094",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Pal's","brand:wikidata":"Q7126094","brand:wikipedia":"en:Pal's",cuisine:"burger",name:"Pal's",official_name:"Pal's Sudden Service",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/Panago":{name:"Panago",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/panago/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17111672",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"Panago","brand:wikidata":"Q17111672","brand:wikipedia":"en:Panago",cuisine:"pizza",name:"Panago",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Panda Express":{name:"Panda Express",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/PandaExpress/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1358690",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Panda Express","brand:wikidata":"Q1358690","brand:wikipedia":"en:Panda Express",cuisine:"chinese",name:"Panda Express",takeaway:"yes"},terms:["panda"],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Panera Bread":{name:"Panera Bread",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/panerabread/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7130852",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Panera Bread","brand:wikidata":"Q7130852","brand:wikipedia":"en:Panera Bread",cuisine:"sandwich",name:"Panera Bread",short_name:"Panera",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/Papa John's":{name:"Papa John's",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/papajohns/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2759586",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"Papa John's","brand:wikidata":"Q2759586","brand:wikipedia":"en:Papa John's Pizza",cuisine:"pizza",name:"Papa John's",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},terms:["papa john","papa john pizza","papa johns pizza"],matchScore:2,suggestion:true},"amenity/fast_food/pizza/Papa Murphy's":{name:"Papa Murphy's",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/papamurphyspizza/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7132349",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"Papa Murphy's","brand:wikidata":"Q7132349","brand:wikipedia":"en:Papa Murphy's",cuisine:"pizza",name:"Papa Murphy's",official_name:"Papa Murphy's Take 'N' Bake Pizza",takeaway:"only"},reference:{key:"cuisine",value:"pizza"},countryCodes:["ca","us"],terms:["papa murphy","papa murphy pizza","papa murphys pizza"],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Penn Station":{name:"Penn Station",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/pennstation/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7163311",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Penn Station","brand:wikidata":"Q7163311","brand:wikipedia":"en:Penn Station (restaurant)",cuisine:"sandwich",name:"Penn Station",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Philly Pretzel Factory":{name:"Philly Pretzel Factory",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/PhillyPretzel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q60097339",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Philly Pretzel Factory","brand:wikidata":"Q60097339",cuisine:"pretzel",name:"Philly Pretzel Factory",takeaway:"yes"},countryCodes:["us"],terms:["philadelphia pretzel factory","philadelphia soft pretzel factory","philly soft pretzel factory"],matchScore:2,suggestion:true},"amenity/fast_food/chicken/Pinulito":{name:"Pinulito",icon:"fas-drumstick-bite",imageURL:"https://graph.facebook.com/elsabordenuestragente/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62273613",amenity:"fast_food",cuisine:"chicken"},addTags:{amenity:"fast_food",brand:"Pinulito","brand:wikidata":"Q62273613",cuisine:"chicken",name:"Pinulito",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},countryCodes:["gt"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Pita Pit":{name:"Pita Pit",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/pitapitusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7757289",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Pita Pit","brand:wikidata":"Q7757289","brand:wikipedia":"en:Pita Pit",cuisine:"pita",name:"Pita Pit",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/Pizza Hut Delivery":{name:"Pizza Hut Delivery",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/pizzahutus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q191615",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"Pizza Hut","brand:wikidata":"Q191615","brand:wikipedia":"en:Pizza Hut",cuisine:"pizza",name:"Pizza Hut Delivery",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/Pizza Hut Express":{name:"Pizza Hut Express",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/pizzahutus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q191615",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"Pizza Hut","brand:wikidata":"Q191615","brand:wikipedia":"en:Pizza Hut",cuisine:"pizza",name:"Pizza Hut Express",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/Pizza Nova":{name:"Pizza Nova",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/PizzaNova/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7199971",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"Pizza Nova","brand:wikidata":"Q7199971","brand:wikipedia":"en:Pizza Nova",cuisine:"pizza",name:"Pizza Nova",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/Pizza Pizza":{name:"Pizza Pizza",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/PizzaPizzaCanada/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1194143",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"Pizza Pizza","brand:wikidata":"Q1194143","brand:wikipedia":"en:Pizza Pizza",cuisine:"pizza",name:"Pizza Pizza",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/chicken/Pollo Campero":{name:"Pollo Campero",icon:"fas-drumstick-bite",imageURL:"https://graph.facebook.com/CamperoUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q942741",amenity:"fast_food",cuisine:"chicken"},addTags:{amenity:"fast_food",brand:"Pollo Campero","brand:wikidata":"Q942741","brand:wikipedia":"en:Pollo Campero",cuisine:"chicken",name:"Pollo Campero",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/chicken/Pollo Granjero (Costa Rica)":{name:"Pollo Granjero (Costa Rica)",icon:"fas-drumstick-bite",imageURL:"https://graph.facebook.com/PolloGranjeroCostaRica/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62273665",amenity:"fast_food",cuisine:"chicken"},addTags:{amenity:"fast_food",brand:"Pollo Granjero","brand:wikidata":"Q62273665",cuisine:"chicken",name:"Pollo Granjero",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},countryCodes:["cr"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/chicken/Pollo Granjero (Guatemala)":{name:"Pollo Granjero (Guatemala)",icon:"fas-drumstick-bite",imageURL:"https://graph.facebook.com/PolloGranjeroGuatemala/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62273652",amenity:"fast_food",cuisine:"chicken"},addTags:{amenity:"fast_food",brand:"Pollo Granjero","brand:wikidata":"Q62273652",cuisine:"chicken",name:"Pollo Granjero",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},countryCodes:["gt"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/chicken/Pollo Tropical":{name:"Pollo Tropical",icon:"fas-drumstick-bite",imageURL:"https://graph.facebook.com/PolloTropical/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3395356",amenity:"fast_food",cuisine:"chicken"},addTags:{amenity:"fast_food",brand:"Pollo Tropical","brand:wikidata":"Q3395356","brand:wikipedia":"en:Pollo Tropical",cuisine:"chicken",name:"Pollo Tropical",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/chicken/Popeyes":{name:"Popeyes",icon:"fas-drumstick-bite",imageURL:"https://graph.facebook.com/PopeyesLouisianaKitchen/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1330910",amenity:"fast_food",cuisine:"chicken"},addTags:{amenity:"fast_food",brand:"Popeyes","brand:wikidata":"Q1330910","brand:wikipedia":"en:Popeyes",cuisine:"chicken",name:"Popeyes",official_name:"Popeyes Louisiana Kitchen",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Potbelly":{name:"Potbelly",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/potbellysandwichshop/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7234777",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Potbelly","brand:wikidata":"Q7234777","brand:wikipedia":"en:Potbelly Sandwich Shop",cuisine:"sandwich",name:"Potbelly",official_name:"Potbelly Sandwich Works",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["us"],terms:["potbelly sandwich shop"],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Pret A Manger":{name:"Pret A Manger",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/pretamangerusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2109109",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Pret A Manger","brand:wikidata":"Q2109109","brand:wikipedia":"en:Pret a Manger",cuisine:"sandwich",name:"Pret A Manger",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["gb","us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Pretzelmaker":{name:"Pretzelmaker",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/pretzelmaker/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7242321",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Pretzelmaker","brand:wikidata":"Q7242321","brand:wikipedia":"en:Pretzelmaker",cuisine:"pretzel",name:"Pretzelmaker",takeaway:"yes"},countryCodes:["us"],terms:["pretzel time"],matchScore:2,suggestion:true},"amenity/fast_food/mexican/Qdoba":{name:"Qdoba",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/qdoba/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1363885",amenity:"fast_food",cuisine:"mexican"},addTags:{amenity:"fast_food",brand:"Qdoba","brand:wikidata":"Q1363885","brand:wikipedia":"en:Qdoba",cuisine:"mexican",name:"Qdoba",official_name:"Qdoba Mexican Grill",takeaway:"yes"},reference:{key:"cuisine",value:"mexican"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Quick":{name:"Quick",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/QuickBelgium/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q286494",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Quick","brand:wikidata":"Q286494","brand:wikipedia":"en:Quick (restaurant)",cuisine:"burger",name:"Quick",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["be","fr","lu"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Quiznos":{name:"Quiznos",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/Quiznos/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1936229",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Quiznos","brand:wikidata":"Q1936229","brand:wikipedia":"en:Quiznos",cuisine:"sandwich",name:"Quiznos",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},terms:["quiznos sub","quiznos subs"],matchScore:2,suggestion:true},"amenity/fast_food/chicken/Raising Cane's":{name:"Raising Cane's",icon:"fas-drumstick-bite",imageURL:"https://graph.facebook.com/RaisingCanesChickenFingers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7285144",amenity:"fast_food",cuisine:"chicken"},addTags:{amenity:"fast_food",brand:"Raising Cane's","brand:wikidata":"Q7285144","brand:wikipedia":"en:Raising Cane's Chicken Fingers",cuisine:"chicken",name:"Raising Cane's",official_name:"Raising Cane's Chicken Fingers",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Rally's":{name:"Rally's",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/checkersrallys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63919323",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Rally's","brand:wikidata":"Q63919323",cuisine:"burger",name:"Rally's",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/chicken/Red Rooster":{name:"Red Rooster",icon:"fas-drumstick-bite",imageURL:"https://graph.facebook.com/RedRoosterAU/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q376466",amenity:"fast_food",cuisine:"chicken"},addTags:{amenity:"fast_food",brand:"Red Rooster","brand:wikidata":"Q376466","brand:wikipedia":"en:Red Rooster",cuisine:"chicken",name:"Red Rooster",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Roy Rogers":{name:"Roy Rogers",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/RoyRogersRestaurants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7373311",amenity:"fast_food",cuisine:"burger;sandwich;chicken"},addTags:{amenity:"fast_food",brand:"Roy Rogers","brand:wikidata":"Q7373311","brand:wikipedia":"en:Roy Rogers Restaurants",cuisine:"burger;sandwich;chicken",name:"Roy Rogers",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/mexican/Rubio's":{name:"Rubio's",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/rubios/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7376154",amenity:"fast_food",cuisine:"mexican"},addTags:{amenity:"fast_food",brand:"Rubio's","brand:wikidata":"Q7376154","brand:wikipedia":"en:Rubio's Coastal Grill",cuisine:"mexican",name:"Rubio's",official_name:"Rubio's Coastal Grill",takeaway:"yes"},reference:{key:"cuisine",value:"mexican"},countryCodes:["us"],terms:["rubios fresh mexican grill"],matchScore:2,suggestion:true},"amenity/fast_food/burger/SUSU & Sons":{name:"SUSU & Sons",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/susuandsons/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64760081",amenity:"fast_food",cuisine:"burger"},addTags:{alt_name:"SUSU and Sons","alt_name:en":"SUSU and Sons","alt_name:he":"סוסו ובניו",amenity:"fast_food",brand:"SUSU & Sons","brand:en":"SUSU & Sons","brand:he":"סוסו אנד סאנס","brand:wikidata":"Q64760081",cuisine:"burger",name:"SUSU & Sons","name:en":"SUSU & Sons","name:he":"סוסו אנד סאנס",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Sarku Japan":{name:"Sarku Japan",icon:"maki-fast-food",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSarku%20Japan%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q7424243",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Sarku Japan","brand:wikidata":"Q7424243",cuisine:"japanese",name:"Sarku Japan",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/Sbarro":{name:"Sbarro",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/Sbarro/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2589409",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"Sbarro","brand:wikidata":"Q2589409","brand:wikipedia":"en:Sbarro",cuisine:"pizza",name:"Sbarro",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},terms:["Sbarro Pizzeria"],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Schlotzsky's":{name:"Schlotzsky's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/Schlotzskys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2244796",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Schlotzsky's","brand:wikidata":"Q2244796","brand:wikipedia":"en:Schlotzsky's",cuisine:"sandwich",name:"Schlotzsky's",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["us"],terms:["schlotzskys deli"],matchScore:2,suggestion:true},"amenity/fast_food/burger/Shake Shack":{name:"Shake Shack",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/shakeshack/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1058722",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Shake Shack","brand:wikidata":"Q1058722","brand:wikipedia":"en:Shake Shack",cuisine:"burger",name:"Shake Shack",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["gb","us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Sibylla":{name:"Sibylla",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/sibyllasverige/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q488643",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Sibylla","brand:wikidata":"Q488643","brand:wikipedia":"en:Sibylla (fast food)",cuisine:"burger",name:"Sibylla",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["fi","se"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Smashburger":{name:"Smashburger",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/smashburger/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17061332",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Smashburger","brand:wikidata":"Q17061332","brand:wikipedia":"en:Smashburger",cuisine:"burger",name:"Smashburger",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Smoothie King":{name:"Smoothie King",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/SmoothieKing/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5491421",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Smoothie King","brand:wikidata":"Q5491421","brand:wikipedia":"en:Smoothie King",cuisine:"juice",name:"Smoothie King",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Sonic":{name:"Sonic",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/sonicdrivein/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7561808",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Sonic","brand:wikidata":"Q7561808","brand:wikipedia":"en:Sonic Drive-In",cuisine:"burger",name:"Sonic",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},terms:["sonic drive in"],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Specialty's":{name:"Specialty's",icon:"maki-restaurant",geometry:["point","area"],tags:{"brand:wikidata":"Q64339210",amenity:"fast_food",cuisine:"sandwich;bakery"},addTags:{amenity:"fast_food",brand:"Specialty's","brand:wikidata":"Q64339210",cuisine:"sandwich;bakery",name:"Specialty's",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Steak Escape":{name:"Steak Escape",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/steakescape/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7605235",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Steak Escape","brand:wikidata":"Q7605235","brand:wikipedia":"en:Steak Escape",cuisine:"sandwich",name:"Steak Escape",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Steers":{name:"Steers",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/OfficialSteers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q56599145",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Steers","brand:wikidata":"Q56599145","brand:wikipedia":"en:Steers",cuisine:"burger",name:"Steers",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Subway":{name:"Subway",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/subway/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q244457",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Subway","brand:wikidata":"Q244457","brand:wikipedia":"en:Subway (restaurant)",cuisine:"sandwich",name:"Subway",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},terms:["subway sandwiches"],matchScore:2,suggestion:true},"amenity/fast_food/burger/Supermac's":{name:"Supermac's",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/supermacsofficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7643750",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Supermac's","brand:wikidata":"Q7643750","brand:wikipedia":"en:Supermac's",cuisine:"burger",name:"Supermac's",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Sushi Shop":{name:"Sushi Shop",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/sushishopboutique/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64840990",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Sushi Shop","brand:wikidata":"Q64840990",cuisine:"sushi",name:"Sushi Shop",takeaway:"yes"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/TCBY":{name:"TCBY",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/tcby/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7669631",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"TCBY","brand:wikidata":"Q7669631","brand:wikipedia":"en:TCBY",cuisine:"frozen_yogurt",name:"TCBY",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Taco Bell":{name:"Taco Bell",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/tacobell/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q752941",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Taco Bell","brand:wikidata":"Q752941","brand:wikipedia":"en:Taco Bell",cuisine:"tex-mex",name:"Taco Bell",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/mexican/Taco Bueno":{name:"Taco Bueno",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/buenoheadquarters/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7673958",amenity:"fast_food",cuisine:"mexican"},addTags:{amenity:"fast_food",brand:"Taco Bueno","brand:wikidata":"Q7673958","brand:wikipedia":"en:Taco Bueno",cuisine:"mexican",name:"Taco Bueno",takeaway:"yes"},reference:{key:"cuisine",value:"mexican"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/mexican/Taco Cabana":{name:"Taco Cabana",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/TacoCabana/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12070488",amenity:"fast_food",cuisine:"mexican"},addTags:{amenity:"fast_food",brand:"Taco Cabana","brand:wikidata":"Q12070488","brand:wikipedia":"en:Taco Cabana",cuisine:"mexican",name:"Taco Cabana",takeaway:"yes"},reference:{key:"cuisine",value:"mexican"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/mexican/Taco Del Mar":{name:"Taco Del Mar",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/tacodelmarcorp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7673972",amenity:"fast_food",cuisine:"mexican"},addTags:{amenity:"fast_food",brand:"Taco Del Mar","brand:wikidata":"Q7673972","brand:wikipedia":"en:Taco del Mar",cuisine:"mexican",name:"Taco Del Mar",takeaway:"yes"},reference:{key:"cuisine",value:"mexican"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/mexican/Taco John's":{name:"Taco John's",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/tacojohns/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7673962",amenity:"fast_food",cuisine:"mexican"},addTags:{amenity:"fast_food",brand:"Taco John's","brand:wikidata":"Q7673962","brand:wikipedia":"en:Taco John's",cuisine:"mexican",name:"Taco John's",takeaway:"yes"},reference:{key:"cuisine",value:"mexican"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/mexican/Taco Time":{name:"Taco Time",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/tacotime/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7673969",amenity:"fast_food",cuisine:"mexican"},addTags:{amenity:"fast_food",brand:"Taco Time","brand:wikidata":"Q7673969","brand:wikipedia":"en:Taco Time",cuisine:"mexican",name:"Taco Time",takeaway:"yes"},reference:{key:"cuisine",value:"mexican"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Ted's Hot Dogs":{name:"Ted's Hot Dogs",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/TedsHotDogs/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7692930",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Ted's Hot Dogs","brand:wikidata":"Q7692930","brand:wikipedia":"en:Ted's Hot Dogs",cuisine:"sausage",name:"Ted's Hot Dogs",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/Telepizza":{name:"Telepizza",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/telepizza/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2699863",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"Telepizza","brand:wikidata":"Q2699863","brand:wikipedia":"en:Telepizza",cuisine:"pizza",name:"Telepizza",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Thai Express (Singapore)":{name:"Thai Express (Singapore)",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/ThaiExpressSG/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7709119",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Thai Express","brand:wikidata":"Q7709119","brand:wikipedia":"en:Thai Express",cuisine:"thai",name:"Thai Express",takeaway:"yes"},countryCodes:["sg"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Thaï Express (North America)":{name:"Thaï Express (North America)",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/EatThaiExpress/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7711610",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Thaï Express","brand:wikidata":"Q7711610","brand:wikipedia":"en:Thaï Express",cuisine:"thai",name:"Thaï Express",takeaway:"yes"},countryCodes:["ca","us"],terms:["thai express"],matchScore:2,suggestion:true},"amenity/fast_food/burger/The Habit Burger Grill":{name:"The Habit Burger Grill",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/habitburger/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q18158741",amenity:"fast_food",cuisine:"burger"},addTags:{alt_name:"Habit Burger Grill",amenity:"fast_food",brand:"The Habit Burger Grill","brand:wikidata":"Q18158741","brand:wikipedia":"en:The Habit Burger Grill",cuisine:"burger",name:"The Habit Burger Grill",short_name:"Habit Burger",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["us"],terms:["the habit burger"],matchScore:2,suggestion:true},"amenity/fast_food/pizza/The Pizza Company":{name:"The Pizza Company",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/thepizzacompany/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2413520",amenity:"fast_food",cuisine:"pizza"},addTags:{alt_name:"Pizza Company",amenity:"fast_food",brand:"The Pizza Company","brand:wikidata":"Q2413520","brand:wikipedia":"en:The Pizza Company",cuisine:"pizza",name:"The Pizza Company",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Togo's":{name:"Togo's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/togossandwiches/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3530375",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Togo's","brand:wikidata":"Q3530375","brand:wikipedia":"en:Togo's",cuisine:"sandwich",name:"Togo's",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Tropical Smoothie Cafe":{name:"Tropical Smoothie Cafe",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/tropicalsmoothiecafe/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7845817",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Tropical Smoothie Cafe","brand:wikidata":"Q7845817","brand:wikipedia":"en:Tropical Smoothie Cafe",cuisine:"juice",name:"Tropical Smoothie Cafe",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Veggie Grill":{name:"Veggie Grill",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/veggiegrill/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q18636427",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Veggie Grill","brand:wikidata":"Q18636427","brand:wikipedia":"en:Veggie Grill",cuisine:"american","diet:vegan":"only",name:"Veggie Grill",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Wahoo's Fish Taco":{name:"Wahoo's Fish Taco",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/WahoosFishTaco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7959827",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Wahoo's Fish Taco","brand:wikidata":"Q7959827","brand:wikipedia":"en:Wahoo's Fish Taco",cuisine:"seafood",name:"Wahoo's Fish Taco",short_name:"Wahoo's",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Wendy's":{name:"Wendy's",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/wendys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q550258",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Wendy's","brand:wikidata":"Q550258","brand:wikipedia":"en:Wendy's",cuisine:"burger",name:"Wendy's",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Whataburger":{name:"Whataburger",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/whataburger/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q376627",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Whataburger","brand:wikidata":"Q376627","brand:wikipedia":"en:Whataburger",cuisine:"burger",name:"Whataburger",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Which Wich?":{name:"Which Wich?",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/whichwich/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7993556",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Which Wich?","brand:wikidata":"Q7993556","brand:wikipedia":"en:Which Wich?",cuisine:"sandwich",name:"Which Wich?",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["ae","gb","gt","mx","om","qa","sa","us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/White Castle":{name:"White Castle",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/WhiteCastle/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1244034",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"White Castle","brand:wikidata":"Q1244034","brand:wikipedia":"en:White Castle (restaurant)",cuisine:"burger",name:"White Castle",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Wienerschnitzel":{name:"Wienerschnitzel",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/Wienerschnitzel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q324679",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Wienerschnitzel","brand:wikidata":"Q324679","brand:wikipedia":"en:Wienerschnitzel",cuisine:"hot_dog",name:"Wienerschnitzel",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Wimpy":{name:"Wimpy",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/wimpyrestaurants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2811992",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Wimpy","brand:wikidata":"Q2811992","brand:wikipedia":"en:Wimpy (restaurant)",cuisine:"burger",name:"Wimpy",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Xi'an Famous Foods":{name:"Xi'an Famous Foods",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/xianfoods/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q8044020",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Xi'an Famous Foods","brand:wikidata":"Q8044020","brand:wikipedia":"en:Xi'an Famous Foods",cuisine:"chinese",name:"Xi'an Famous Foods",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/chicken/Zaxby's":{name:"Zaxby's",icon:"fas-drumstick-bite",imageURL:"https://graph.facebook.com/Zaxbys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q8067525",amenity:"fast_food",cuisine:"chicken"},addTags:{amenity:"fast_food",brand:"Zaxby's","brand:wikidata":"Q8067525","brand:wikipedia":"en:Zaxby's",cuisine:"chicken",name:"Zaxby's",official_name:"Zaxby's Chicken Fingers & Buffalo Wings",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Zoës Kitchen":{name:"Zoës Kitchen",icon:"maki-fast-food",imageURL:"https://pbs.twimg.com/profile_images/955840927968280576/pAowOseE_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q8074747",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Zoës Kitchen","brand:wikidata":"Q8074747","brand:wikipedia":"en:Zoës Kitchen",cuisine:"mediterranean",name:"Zoës Kitchen",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/immergrün":{name:"immergrün",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/mein.immergruen/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62589254",amenity:"fast_food",cuisine:"sandwich;salad;juice"},addTags:{amenity:"fast_food",brand:"immergrün","brand:wikidata":"Q62589254",cuisine:"sandwich;salad;juice",name:"immergün",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["de"],terms:["immergün"],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Γρηγόρης":{name:"Γρηγόρης",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/gregorys.gr/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62273834",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Γρηγόρης","brand:el":"Γρηγόρης","brand:en":"Gregorys","brand:wikidata":"Q62273834",cuisine:"sandwich",name:"Γρηγόρης","name:el":"Γρηγόρης","name:en":"Gregorys",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["gr"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Бургер Кинг":{name:"Бургер Кинг",icon:"maki-fast-food",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBurger%20King%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q177054",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Бургер Кинг","brand:en":"Burger King","brand:ru":"Бургер Кинг","brand:wikidata":"Q177054","brand:wikipedia":"en:Burger King",cuisine:"burger",name:"Бургер Кинг","name:en":"Burger King","name:ru":"Бургер Кинг",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["by","kz","ru"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Домино'c Пицца":{name:"Домино'c Пицца",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/Dominos/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q839466",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Домино'c Пицца","brand:en":"Domino's Pizza","brand:ru":"Домино'c Пицца","brand:wikidata":"Q839466","brand:wikipedia":"ru:Domino’s Pizza",name:"Домино'c Пицца","name:en":"Domino's Pizza","name:ru":"Домино'c Пицца",short_name:"Домино'c","short_name:en":"Domino's","short_name:ru":"Домино'c",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Крошка Картошка":{name:"Крошка Картошка",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/kartoshka.moscow/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4241838",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Крошка Картошка","brand:en":"Kroshka Kartoshka","brand:ru":"Крошка Картошка","brand:wikidata":"Q4241838","brand:wikipedia":"ru:Крошка Картошка",cuisine:"potato",name:"Крошка Картошка","name:en":"Kroshka Kartoshka","name:ru":"Крошка Картошка",takeaway:"yes"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Макдоналдс":{name:"Макдоналдс",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/mcdonalds/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q38076",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Макдоналдс","brand:en":"McDonald's","brand:ru":"Макдоналдс","brand:wikidata":"Q38076","brand:wikipedia":"en:McDonald's",cuisine:"burger",name:"Макдоналдс","name:en":"McDonald's","name:ru":"Макдоналдс",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/Папа Джонс":{name:"Папа Джонс",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/papajohns/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2759586",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"Папа Джонс","brand:en":"Papa John's","brand:ru":"Папа Джонс","brand:wikidata":"Q2759586","brand:wikipedia":"ru:Papa John’s",cuisine:"pizza",name:"Папа Джонс","name:en":"Papa John's","name:ru":"Папа Джонс",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},countryCodes:["by","ru"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Робин Сдобин":{name:"Робин Сдобин",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/robinsdobin/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62273880",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Робин Сдобин","brand:en":"Robins Dobin","brand:ru":"Робин Сдобин","brand:wikidata":"Q62273880",cuisine:"burger",name:"Робин Сдобин","name:en":"Robins Dobin","name:ru":"Робин Сдобин",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Русский Аппетит":{name:"Русский Аппетит",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/1502979646622576/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62086063",amenity:"fast_food",cuisine:"sandwich;salad;regional"},addTags:{amenity:"fast_food",brand:"Русский Аппетит","brand:en":"Russkiy Appetit","brand:ru":"Русский Аппетит","brand:wikidata":"Q62086063",cuisine:"sandwich;salad;regional",name:"Русский Аппетит","name:en":"Russkiy Appetit","name:ru":"Русский Аппетит",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Стардог!s":{name:"Стардог!s",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/StardogsOfficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4439856",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Стардог!s","brand:en":"Stardog!s","brand:ru":"Стардог!s","brand:wikidata":"Q4439856","brand:wikipedia":"ru:Стардогс",cuisine:"sausage",name:"Стардог!s","name:en":"Stardog!s","name:ru":"Стардог!s",takeaway:"yes"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Суши Wok":{name:"Суши Wok",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/sushiwokofficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q25444754",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Суши Wok","brand:en":"Sushi Wok","brand:ru":"Суши Wok","brand:wikidata":"Q25444754","brand:wikipedia":"uk:Суши Wok (мережа магазинів)",cuisine:"asian",name:"Суши Wok","name:en":"Sushi Wok","name:ru":"Суши Wok",takeaway:"yes"},countryCodes:["ru","ua"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Теремок":{name:"Теремок",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/teremok/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4455593",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Теремок","brand:en":"Teremok","brand:ru":"Теремок","brand:wikidata":"Q4455593","brand:wikipedia":"ru:Теремок (сеть быстрого питания)",cuisine:"crepe;russian",name:"Теремок","name:en":"Teremok","name:ru":"Теремок",takeaway:"yes"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/אגדיר":{name:"אגדיר",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/agadirburger/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64760070",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"אגדיר","brand:en":"Agadir","brand:he":"אגדיר","brand:wikidata":"Q64760070",cuisine:"burger",name:"אגדיר","name:en":"Agadir","name:he":"אגדיר",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/מקדונלד'ס":{name:"מקדונלד'ס",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/McDonalds/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12061542",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"מקדונלד'ס","brand:en":"McDonald's","brand:he":"מקדונלד'ס","brand:wikidata":"Q12061542","brand:wikipedia":"en:McDonald's Israel",cuisine:"burger",name:"מקדונלד'ס","name:en":"McDonald's","name:he":"מקדונלד'ס",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/עד העצם אקספרס":{name:"עד העצם אקספרס",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/adhatzemexpress/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64760165",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"עד העצם אקספרס","brand:en":"Ad Haetzem Express","brand:he":"עד העצם אקספרס","brand:wikidata":"Q64760165",cuisine:"burger",name:"עד העצם אקספרס","name:en":"Ad Haetzem Express","name:he":"עד העצם אקספרס",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/chicken/دجاج كنتاكي":{name:"دجاج كنتاكي",icon:"fas-drumstick-bite",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FKFC%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q524757",amenity:"fast_food",cuisine:"chicken"},addTags:{amenity:"fast_food",brand:"دجاج كنتاكي","brand:ar":"دجاج كنتاكي","brand:en":"KFC","brand:wikidata":"Q524757","brand:wikipedia":"ar:دجاج كنتاكي",cuisine:"chicken",name:"دجاج كنتاكي","name:ar":"دجاج كنتاكي","name:en":"KFC",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/ماكدونالدز":{name:"ماكدونالدز",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/mcdonalds/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q38076",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"ماكدونالدز","brand:ar":"ماكدونالدز","brand:en":"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"ar:ماكدونالدز",cuisine:"burger",name:"ماكدونالدز","name:ar":"ماكدونالدز","name:en":"McDonald's",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/かっぱ寿司":{name:"かっぱ寿司",icon:"maki-fast-food",imageURL:"https://abs.twimg.com/sticky/default_profile_images/default_profile_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q11263916",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"かっぱ寿司","brand:en":"Kappazushi","brand:ja":"かっぱ寿司","brand:wikidata":"Q11263916","brand:wikipedia":"ja:かっぱ寿司",cuisine:"sushi",name:"かっぱ寿司","name:en":"Kappazushi","name:ja":"かっぱ寿司",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/かつや":{name:"かつや",icon:"maki-fast-food",imageURL:"https://pbs.twimg.com/profile_images/1125940338793693184/GAXNsHP4_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q2855257",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"かつや","brand:en":"Katsuya","brand:ja":"かつや","brand:wikidata":"Q2855257","brand:wikipedia":"ja:かつや",cuisine:"fried_food",name:"かつや","name:en":"Katsuya","name:ja":"かつや","name:ko":"카쯔야","name:zh":"吉豚屋",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/くら寿司":{name:"くら寿司",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/Kurasushi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6445491",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"くら寿司","brand:en":"Kurazushi","brand:ja":"くら寿司","brand:wikidata":"Q6445491","brand:wikipedia":"ja:くら寿司",cuisine:"sushi",name:"くら寿司","name:en":"Kurazushi","name:ja":"くら寿司",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/すき家":{name:"すき家",icon:"maki-fast-food",imageURL:"https://pbs.twimg.com/profile_images/1074928090885672960/nTgKn0jh_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q6137375",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"すき家","brand:en":"Sukiya","brand:ja":"すき家","brand:wikidata":"Q6137375","brand:wikipedia":"ja:すき家",cuisine:"beef_bowl",name:"すき家","name:en":"Sukiya","name:ja":"すき家",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/てんや":{name:"てんや",icon:"maki-fast-food",geometry:["point","area"],tags:{"brand:wikidata":"Q11319830",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"てんや","brand:en":"Tenya","brand:ja":"てんや","brand:wikidata":"Q11319830","brand:wikipedia":"jp:テンコーポレーション",cuisine:"fries",name:"てんや","name:en":"Tenya","name:ja":"てんや",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/なか卯":{name:"なか卯",icon:"maki-fast-food",imageURL:"https://pbs.twimg.com/profile_images/999109688582008832/evpixQ34_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q11274132",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"なか卯","brand:en":"Nakau","brand:ja":"なか卯","brand:wikidata":"Q11274132","brand:wikipedia":"ja:なか卯",cuisine:"udon",name:"なか卯","name:en":"Nakau","name:ja":"なか卯",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/はま寿司":{name:"はま寿司",icon:"maki-fast-food",geometry:["point","area"],tags:{"brand:wikidata":"Q17220385",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"はま寿司","brand:en":"Hamazushi","brand:ja":"はま寿司","brand:wikidata":"Q17220385","brand:wikipedia":"ja:はま寿司",cuisine:"sushi",name:"はま寿司","name:en":"Hamazushi","name:ja":"はま寿司",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/ほっかほっか亭":{name:"ほっかほっか亭",icon:"maki-fast-food",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FHokka-Hokka%20Tei%20logo.gif&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q5878035",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"ほっかほっか亭","brand:en":"Hokka Hokka Tei","brand:ja":"ほっかほっか亭","brand:wikidata":"Q5878035","brand:wikipedia":"ja:ほっかほっか亭",cuisine:"japanese",name:"ほっかほっか亭","name:en":"Hokka Hokka Tei","name:ja":"ほっかほっか亭",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/ほっともっと":{name:"ほっともっと",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/hottomotto/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10850949",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"ほっともっと","brand:en":"Hotto Motto","brand:ja":"ほっともっと","brand:wikidata":"Q10850949","brand:wikipedia":"ja:ほっともっと",cuisine:"japanese",name:"ほっともっと","name:en":"Hotto Motto","name:ja":"ほっともっと",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/ゆで太郎":{name:"ゆで太郎",icon:"maki-fast-food",geometry:["point","area"],tags:{"brand:wikidata":"Q11280824",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"ゆで太郎","brand:en":"Yudetaro","brand:ja":"ゆで太郎","brand:wikidata":"Q11280824","brand:wikipedia":"ja:ゆで太郎",cuisine:"noodle",name:"ゆで太郎","name:en":"Yudetaro","name:ja":"ゆで太郎",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/ウェンディーズ":{name:"ウェンディーズ",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/wendys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q550258",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"ウェンディーズ","brand:en":"Wendy's","brand:ja":"ウェンディーズ","brand:wikidata":"Q550258","brand:wikipedia":"en:Wendy's",cuisine:"burger",name:"ウェンディーズ","name:en":"Wendy's","name:ja":"ウェンディーズ",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/オリジン弁当":{name:"オリジン弁当",icon:"maki-fast-food",geometry:["point","area"],tags:{"brand:wikidata":"Q11292632",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"オリジン弁当","brand:en":"Origin Bentō","brand:ja":"オリジン弁当","brand:wikidata":"Q11292632","brand:wikipedia":"ja:オリジン東秀",cuisine:"japanese",name:"オリジン弁当","name:en":"Origin Bentō","name:ja":"オリジン弁当",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/chicken/ケンタッキーフライドチキン":{name:"ケンタッキーフライドチキン",icon:"fas-drumstick-bite",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FKFC%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q524757",amenity:"fast_food",cuisine:"chicken"},addTags:{amenity:"fast_food",brand:"ケンタッキーフライドチキン","brand:en":"KFC","brand:ja":"ケンタッキーフライドチキン","brand:wikidata":"Q524757","brand:wikipedia":"ja:KFCコーポレーション",cuisine:"chicken",name:"ケンタッキーフライドチキン","name:en":"KFC","name:ja":"ケンタッキーフライドチキン",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/サブウェイ":{name:"サブウェイ",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/subway/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q244457",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"サブウェイ","brand:en":"Subway","brand:ja":"サブウェイ","brand:wikidata":"Q244457","brand:wikipedia":"ja:サブウェイ",cuisine:"sandwich",name:"サブウェイ","name:en":"Subway","name:ja":"サブウェイ",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/スシロー":{name:"スシロー",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/akindosushiro/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11257037",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"スシロー","brand:en":"Sushiro","brand:ja":"スシロー","brand:wikidata":"Q11257037","brand:wikipedia":"ja:あきんどスシロー",cuisine:"sushi",name:"スシロー","name:en":"Sushiro","name:ja":"スシロー","name:zh":"壽司郎",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/ドミノ・ピザ":{name:"ドミノ・ピザ",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/Dominos/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q839466",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"ドミノ・ピザ","brand:en":"Domino's Pizza","brand:ja":"ドミノ・ピザ","brand:wikidata":"Q839466","brand:wikipedia":"ja:ドミノ・ピザ",cuisine:"pizza",name:"ドミノ・ピザ","name:en":"Domino's Pizza","name:ja":"ドミノ・ピザ",short_name:"ドミノ","short_name:en":"Domino's","short_name:ja":"ドミノ",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/バーガーキング":{name:"バーガーキング",icon:"maki-fast-food",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBurger%20King%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q177054",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"バーガーキング","brand:en":"Burger King","brand:ja":"バーガーキング","brand:wikidata":"Q177054","brand:wikipedia":"en:Burger King",cuisine:"burger",name:"バーガーキング","name:en":"Burger King","name:ja":"バーガーキング",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/ピザハット":{name:"ピザハット",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/pizzahutus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q191615",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"ピザハット","brand:en":"Pizza Hut","brand:ja":"ピザハット","brand:wikidata":"Q191615","brand:wikipedia":"ja:ピザハット",cuisine:"pizza",name:"ピザハット","name:en":"Pizza Hut","name:ja":"ピザハット",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/ピザ・カリフォルニア":{name:"ピザ・カリフォルニア",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{"brand:wikidata":"Q75324",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"ピザ・カリフォルニア","brand:en":"Pizza California","brand:ja":"ピザ・カリフォルニア","brand:wikidata":"Q75324","brand:wikipedia":"ja:ピザ・カリフォルニア",cuisine:"pizza",name:"ピザ・カリフォルニア","name:en":"Pizza California","name:ja":"ピザ・カリフォルニア",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/ピザーラ":{name:"ピザーラ",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/pizzala.jp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7199948",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"ピザーラ","brand:en":"Pizza-La","brand:ja":"ピザーラ","brand:wikidata":"Q7199948","brand:wikipedia":"ja:ピザーラ",cuisine:"pizza",name:"ピザーラ","name:en":"Pizza-La","name:ja":"ピザーラ",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/ファーストキッチン":{name:"ファーストキッチン",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{"brand:wikidata":"Q5453133",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"ファーストキッチン","brand:en":"First Kitchen","brand:ja":"ファーストキッチン","brand:wikidata":"Q5453133","brand:wikipedia":"ja:ファーストキッチン",cuisine:"pizza",name:"ファーストキッチン","name:en":"First Kitchen","name:ja":"ファーストキッチン",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/フレッシュネスバーガー":{name:"フレッシュネスバーガー",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/freshness.burger.official/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5503087",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"フレッシュネスバーガー","brand:en":"Freshness Burger","brand:ja":"フレッシュネスバーガー","brand:wikidata":"Q5503087","brand:wikipedia":"ja:フレッシュネスバーガー",cuisine:"burger",name:"フレッシュネスバーガー","name:en":"Freshness Burger","name:ja":"フレッシュネスバーガー",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/マクドナルド":{name:"マクドナルド",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/mcdonalds/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q38076",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"マクドナルド","brand:en":"McDonald's","brand:ja":"マクドナルド","brand:wikidata":"Q38076","brand:wikipedia":"ja:マクドナルド",cuisine:"burger",name:"マクドナルド","name:en":"McDonald's","name:ja":"マクドナルド",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/donut/ミスタードーナツ":{name:"ミスタードーナツ",icon:"temaki-donut",imageURL:"https://graph.facebook.com/misdo.jp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1065819",amenity:"fast_food",cuisine:"donut"},addTags:{amenity:"fast_food",brand:"ミスタードーナツ","brand:en":"Mister Donut","brand:ja":"ミスタードーナツ","brand:wikidata":"Q1065819","brand:wikipedia":"en:Mister Donut",cuisine:"donut",name:"ミスタードーナツ","name:en":"Mister Donut","name:ja":"ミスタードーナツ",takeaway:"yes"},reference:{key:"cuisine",value:"donut"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/モスバーガー":{name:"モスバーガー",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/mosburger/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1204169",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"モスバーガー","brand:en":"MOS Burger","brand:ja":"モスバーガー","brand:wikidata":"Q1204169","brand:wikipedia":"ja:モスバーガー",cuisine:"burger",name:"モスバーガー","name:en":"MOS Burger","name:ja":"モスバーガー",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/ラーメン二郎":{name:"ラーメン二郎",icon:"maki-fast-food",geometry:["point","area"],tags:{"brand:wikidata":"Q11347765",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"ラーメン二郎","brand:en":"Ramen Jiro","brand:ja":"ラーメン二郎","brand:wikidata":"Q11347765","brand:wikipedia":"ja:ラーメン二郎",cuisine:"ramen",name:"ラーメン二郎","name:en":"Ramen Jiro","name:ja":"ラーメン二郎",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/ロッテリア":{name:"ロッテリア",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/ilovelotteria/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q249525",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"ロッテリア","brand:en":"Lotteria","brand:ja":"ロッテリア","brand:wikidata":"Q249525","brand:wikipedia":"ja:ロッテリア",cuisine:"burger",name:"ロッテリア","name:en":"Lotteria","name:ja":"ロッテリア",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/吉野家":{name:"吉野家",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/tw.yoshinoya/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q776272",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"吉野家","brand:en":"Yoshinoya","brand:ja":"吉野家","brand:wikidata":"Q776272","brand:wikipedia":"ja:吉野家",cuisine:"beef_bowl",name:"吉野家","name:en":"Yoshinoya","name:ja":"吉野家",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/富士そば":{name:"富士そば",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/fujisoba/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11414722",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"富士そば","brand:en":"Fuji Soba","brand:ja":"富士そば","brand:wikidata":"Q11414722","brand:wikipedia":"ja:名代富士そば",cuisine:"soba",name:"富士そば","name:en":"Fuji Soba","name:ja":"富士そば",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/幸楽苑":{name:"幸楽苑",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/Kourakuen/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11484003",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"幸楽苑","brand:en":"Kourakuen","brand:ja":"幸楽苑","brand:wikidata":"Q11484003","brand:wikipedia":"ja:幸楽苑",cuisine:"ramen",name:"幸楽苑","name:en":"Kourakuen","name:ja":"幸楽苑",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/摩斯漢堡":{name:"摩斯漢堡",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/mosburger/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1204169",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"摩斯漢堡","brand:en":"MOS Burger","brand:wikidata":"Q1204169","brand:wikipedia":"zh:摩斯漢堡","brand:zh":"摩斯漢堡",cuisine:"burger",name:"摩斯漢堡","name:en":"MOS Burger","name:zh":"摩斯漢堡",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["cn","hk","mo","sg","tw"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/日高屋":{name:"日高屋",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/hidakayavietnam/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11326050",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"日高屋","brand:en":"Hidakaya","brand:wikidata":"Q11326050","brand:wikipedia":"ja:ハイデイ日高",cuisine:"noodle",name:"日高屋","name:en":"Hidakaya",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/松屋":{name:"松屋",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/matsuyafoods.matsuya/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q848773",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"松屋","brand:en":"Matsuya","brand:ja":"松屋","brand:wikidata":"Q848773","brand:wikipedia":"ja:松屋フーズ",cuisine:"japanese",name:"松屋","name:en":"Matsuya","name:ja":"松屋",official_name:"松屋フーズ","official_name:en":"Matsuya Foods","official_name:ja":"松屋フーズ",takeaway:"yes"},countryCodes:["cn","hk","jp","mo","sg","tw"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/箱根そば":{name:"箱根そば",icon:"maki-fast-food",geometry:["point","area"],tags:{"brand:wikidata":"Q11603345",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"箱根そば","brand:en":"Hakone Soba","brand:ja":"箱根そば","brand:wikidata":"Q11603345","brand:wikipedia":"ja:箱根そば",cuisine:"soba",name:"箱根そば","name:en":"Hakone Soba","name:ja":"箱根そば",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/築地銀だこ":{name:"築地銀だこ",icon:"maki-fast-food",geometry:["point","area"],tags:{"brand:wikidata":"Q11603490",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"築地銀だこ","brand:en":"HotLand","brand:ja":"築地銀だこ","brand:wikidata":"Q11603490","brand:wikipedia":"ja:築地銀だこ",cuisine:"japanese",name:"築地銀だこ","name:en":"HotLand","name:ja":"築地銀だこ",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/chicken/肯德基":{name:"肯德基",icon:"fas-drumstick-bite",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FKFC%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q524757",amenity:"fast_food",cuisine:"chicken"},addTags:{amenity:"fast_food",brand:"肯德基","brand:en":"KFC","brand:wikidata":"Q524757","brand:wikipedia":"zh:肯德基",cuisine:"chicken",name:"肯德基","name:en":"KFC",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},countryCodes:["cn","hk","mo","sg","tw"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/麥當勞":{name:"麥當勞",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/mcdonalds/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q38076",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"麥當勞","brand:en":"McDonald's","brand:lzh":"麥當勞","brand:wikidata":"Q38076","brand:wikipedia":"zh_classical:麥當勞",cuisine:"burger",name:"麥當勞","name:en":"McDonald's","name:lzh":"麥當勞",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["hk","mo","tw"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/麦当劳":{name:"麦当劳",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/mcdonalds/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q38076",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"麦当劳","brand:en":"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"zh:麦当劳","brand:zh":"麦当劳",cuisine:"burger",name:"麦当劳","name:en":"McDonald's","name:zh":"麦当劳",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["cn","sg"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/롯데리아":{name:"롯데리아",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/ilovelotteria/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q249525",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"롯데리아","brand:en":"Lotteria","brand:ko":"롯데리아","brand:wikidata":"Q249525","brand:wikipedia":"ko:롯데리아",cuisine:"burger",name:"롯데리아","name:en":"Lotteria","name:ko":"롯데리아",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["kr"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/맘스터치":{name:"맘스터치",icon:"maki-fast-food",geometry:["point","area"],tags:{"brand:wikidata":"Q23044856",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"맘스터치","brand:ko":"맘스터치","brand:wikidata":"Q23044856","brand:wikipedia":"en:Mom's Touch",cuisine:"burger",name:"맘스터치","name:ko":"맘스터치",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["kr"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/맥도날드":{name:"맥도날드",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/mcdonalds/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q38076",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"맥도날드","brand:en":"McDonald's","brand:ko":"맥도날드","brand:wikidata":"Q38076","brand:wikipedia":"ko:맥도날드",cuisine:"burger",name:"맥도날드","name:en":"McDonald's","name:ko":"맥도날드",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["kr"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/1-2-3":{name:"1-2-3",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q4545742",amenity:"fuel"},addTags:{amenity:"fuel",brand:"1-2-3","brand:wikidata":"Q4545742","brand:wikipedia":"en:1-2-3 (fuel station)",name:"1-2-3"},countryCodes:["dk","pl"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/7-Eleven":{name:"7-Eleven",icon:"maki-fuel",imageURL:"https://graph.facebook.com/7ElevenMexico/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q259340",amenity:"fuel"},addTags:{amenity:"fuel",brand:"7-Eleven","brand:wikidata":"Q259340","brand:wikipedia":"en:7-Eleven",name:"7-Eleven"},terms:["7-11","seven eleven"],matchScore:2,suggestion:true},"amenity/fuel/76":{name:"76",icon:"maki-fuel",imageURL:"https://graph.facebook.com/76gas/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1658320",amenity:"fuel"},addTags:{amenity:"fuel",brand:"76","brand:wikidata":"Q1658320","brand:wikipedia":"en:76 (gas station)",name:"76"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/ABC":{name:"ABC",icon:"maki-fuel",imageURL:"https://graph.facebook.com/abcasemat/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10397504",amenity:"fuel"},addTags:{amenity:"fuel",brand:"ABC","brand:wikidata":"Q10397504","brand:wikipedia":"fi:ABC-ketju",name:"ABC"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/ADNOC":{name:"ADNOC",icon:"maki-fuel",imageURL:"https://graph.facebook.com/ADNOCDistribution/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q166729",amenity:"fuel"},addTags:{amenity:"fuel",brand:"ADNOC","brand:wikidata":"Q166729","brand:wikipedia":"en:Abu Dhabi National Oil Company",name:"ADNOC"},countryCodes:["ae"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Aegean":{name:"Aegean",icon:"maki-fuel",imageURL:"https://graph.facebook.com/AegeanOil.Official/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q28146598",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Aegean","brand:wikidata":"Q28146598","brand:wikipedia":"el:Aegean Oil",name:"Aegean"},countryCodes:["gr"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Afriquia":{name:"Afriquia",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q2829178",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Afriquia","brand:wikidata":"Q2829178","brand:wikipedia":"en:Akwa Group",name:"Afriquia"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Agip":{name:"Agip",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q377915",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Agip","brand:wikidata":"Q377915","brand:wikipedia":"en:Agip",name:"Agip"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Agrola":{name:"Agrola",icon:"maki-fuel",imageURL:"https://graph.facebook.com/AGROLA.AG/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q397351",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Agrola","brand:wikidata":"Q397351","brand:wikipedia":"de:Agrola",name:"Agrola"},countryCodes:["ch"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Alon":{name:"Alon",icon:"maki-fuel",imageURL:"https://graph.facebook.com/alonbrands/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62274304",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Alon","brand:wikidata":"Q62274304",name:"Alon"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Alpet":{name:"Alpet",icon:"maki-fuel",imageURL:"https://graph.facebook.com/ALPETtr/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62131561",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Alpet","brand:wikidata":"Q62131561",name:"Alpet"},countryCodes:["al","tr"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Api":{name:"Api",icon:"maki-fuel",imageURL:"https://graph.facebook.com/TheAmericanPetroleumInstitute/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q466043",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Api","brand:wikidata":"Q466043","brand:wikipedia":"en:American Petroleum Institute",name:"Api"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Aral":{name:"Aral",icon:"maki-fuel",imageURL:"https://graph.facebook.com/araldeutschland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q565734",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Aral","brand:wikidata":"Q565734","brand:wikipedia":"en:Aral AG",name:"Aral"},countryCodes:["de"],terms:["aral tankstelle"],matchScore:2,suggestion:true},"amenity/fuel/Arco":{name:"Arco",icon:"maki-fuel",imageURL:"https://graph.facebook.com/arco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q304769",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Arco","brand:wikidata":"Q304769","brand:wikipedia":"en:ARCO",name:"Arco"},countryCodes:["mx","us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Asda":{name:"Asda",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Asda/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q297410",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Asda","brand:wikidata":"Q297410","brand:wikipedia":"en:Asda",name:"Asda"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Atem":{name:"Atem",icon:"maki-fuel",imageURL:"https://graph.facebook.com/postosatem/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62332255",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Atem","brand:wikidata":"Q62332255",name:"Atem"},countryCodes:["br"],terms:["posto atem"],matchScore:2,suggestion:true},"amenity/fuel/Auchan":{name:"Auchan",icon:"maki-fuel",imageURL:"https://graph.facebook.com/auchan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q758603",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Auchan","brand:wikidata":"Q758603","brand:wikipedia":"en:Auchan",name:"Auchan"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Avanti":{name:"Avanti",icon:"maki-fuel",imageURL:"https://graph.facebook.com/OMV/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q168238",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Avanti","brand:wikidata":"Q168238","brand:wikipedia":"en:OMV",name:"Avanti"},countryCodes:["at"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Avia":{name:"Avia",icon:"maki-fuel",imageURL:"https://pbs.twimg.com/profile_images/1069532667018993664/9AUsuTdx_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q300147",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Avia","brand:wikidata":"Q300147","brand:wikipedia":"de:Avia International",name:"Avia"},terms:["station avia"],matchScore:2,suggestion:true},"amenity/fuel/Avin":{name:"Avin",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q19903165",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Avin","brand:wikidata":"Q19903165","brand:wikipedia":"en:Avin International",name:"Avin"},countryCodes:["gr"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Axion":{name:"Axion",icon:"maki-fuel",imageURL:"https://graph.facebook.com/AXIONenergyOficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62131749",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Axion","brand:wikidata":"Q62131749",name:"Axion"},countryCodes:["ar","py","uy"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Aytemiz":{name:"Aytemiz",icon:"maki-fuel",imageURL:"https://graph.facebook.com/AytemizOfficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62274352",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Aytemiz","brand:wikidata":"Q62274352",name:"Aytemiz"},countryCodes:["tr"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/BEBECO":{name:"BEBECO",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q62274373",amenity:"fuel"},addTags:{amenity:"fuel",brand:"BEBECO","brand:wikidata":"Q62274373",name:"BEBECO"},countryCodes:["ch"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/BHPetrol":{name:"BHPetrol",icon:"maki-fuel",imageURL:"https://graph.facebook.com/BHP.Petrol/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62274381",amenity:"fuel"},addTags:{amenity:"fuel",brand:"BHPetrol","brand:wikidata":"Q62274381",name:"BHPetrol"},countryCodes:["my"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/BP":{name:"BP",icon:"maki-fuel",imageURL:"https://graph.facebook.com/bp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q152057",amenity:"fuel"},addTags:{amenity:"fuel",brand:"BP","brand:wikidata":"Q152057","brand:wikipedia":"en:BP",name:"BP"},terms:["BP Gas Station"],matchScore:2,suggestion:true},"amenity/fuel/BR":{name:"BR",icon:"maki-fuel",imageURL:"https://graph.facebook.com/postospetrobras/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4836468",amenity:"fuel"},addTags:{amenity:"fuel",brand:"BR","brand:wikidata":"Q4836468","brand:wikipedia":"pt:Petrobras Distribuidora",name:"BR"},countryCodes:["br"],terms:["br petrobras","petrobras","posto br"],matchScore:2,suggestion:true},"amenity/fuel/Bangchak":{name:"Bangchak",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Bangchak/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6579719",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Bangchak","brand:wikidata":"Q6579719","brand:wikipedia":"zh:曼差石油股份",name:"Bangchak"},countryCodes:["th"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Bharat Petroleum":{name:"Bharat Petroleum",icon:"maki-fuel",imageURL:"https://graph.facebook.com/BharatPetroleumcorporation/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q854826",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Bharat Petroleum","brand:wikidata":"Q854826","brand:wikipedia":"en:Bharat Petroleum",name:"Bharat Petroleum"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Biomax":{name:"Biomax",icon:"maki-fuel",imageURL:"https://graph.facebook.com/BiomaxColombia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62274413",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Biomax","brand:wikidata":"Q62274413",name:"Biomax"},countryCodes:["co"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Bliska":{name:"Bliska",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q4016378",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Bliska","brand:wikidata":"Q4016378","brand:wikipedia":"pl:Bliska",name:"Bliska"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/CAMPSA":{name:"CAMPSA",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q1031623",amenity:"fuel"},addTags:{amenity:"fuel",brand:"CAMPSA","brand:wikidata":"Q1031623","brand:wikipedia":"en:Campsa",name:"CAMPSA"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/CEPSA":{name:"CEPSA",icon:"maki-fuel",imageURL:"https://graph.facebook.com/CEPSAespana/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q608819",amenity:"fuel"},addTags:{amenity:"fuel",brand:"CEPSA","brand:wikidata":"Q608819","brand:wikipedia":"en:Cepsa",name:"CEPSA"},countryCodes:["es","pt"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Caltex":{name:"Caltex",icon:"maki-fuel",imageURL:"https://pbs.twimg.com/profile_images/582354948345634816/nzfEGDG1_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q277470",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Caltex","brand:wikidata":"Q277470","brand:wikipedia":"en:Caltex",name:"Caltex"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Canadian Tire Gas+":{name:"Canadian Tire Gas+",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Canadiantire/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1032400",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Canadian Tire","brand:wikidata":"Q1032400","brand:wikipedia":"en:Canadian Tire",name:"Canadian Tire"},terms:["canadian tire","canadian tire gas bar"],matchScore:2,suggestion:true},"amenity/fuel/Carrefour":{name:"Carrefour",icon:"maki-fuel",imageURL:"https://graph.facebook.com/carrefour/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q217599",amenity:"fuel"},addTags:{brand:"Carrefour","brand:wikidata":"Q217599","brand:wikipedia":"fr:Carrefour (enseigne)",name:"Carrefour"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Carrefour Market":{name:"Carrefour Market",icon:"maki-fuel",imageURL:"https://graph.facebook.com/carrefour/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q217599",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Carrefour Market","brand:wikidata":"Q217599","brand:wikipedia":"en:Carrefour",name:"Carrefour Market"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Casey's General Store":{name:"Casey's General Store",icon:"maki-fuel",imageURL:"https://graph.facebook.com/caseys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2940968",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Casey's General Store","brand:wikidata":"Q2940968","brand:wikipedia":"en:Casey's General Stores",name:"Casey's General Store"},terms:["caseys"],matchScore:2,suggestion:true},"amenity/fuel/Cenex":{name:"Cenex",icon:"maki-fuel",imageURL:"https://graph.facebook.com/CenexStores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5011381",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Cenex","brand:wikidata":"Q5011381","brand:wikipedia":"en:CHS Inc.",name:"Cenex"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Ceypetco":{name:"Ceypetco",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q5065795",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Ceypetco","brand:wikidata":"Q5065795","brand:wikipedia":"en:Ceylon Petroleum Corporation",name:"Ceypetco"},countryCodes:["lk"],terms:["lanka filling station"],matchScore:2,suggestion:true},"amenity/fuel/Chevron":{name:"Chevron",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Chevron/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q319642",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Chevron","brand:wikidata":"Q319642","brand:wikipedia":"en:Chevron Corporation",name:"Chevron"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Circle K":{name:"Circle K",icon:"maki-fuel",imageURL:"https://graph.facebook.com/circlekireland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3268010",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Circle K","brand:wikidata":"Q3268010","brand:wikipedia":"en:Circle K",name:"Circle K"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Citgo":{name:"Citgo",icon:"maki-fuel",imageURL:"https://graph.facebook.com/CITGOPetroleumCorporation/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2974437",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Citgo","brand:wikidata":"Q2974437","brand:wikipedia":"en:Citgo",name:"Citgo"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Clark":{name:"Clark",icon:"maki-fuel",imageURL:"https://graph.facebook.com/ClarkCrownBrands/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5127157",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Clark","brand:wikidata":"Q5127157","brand:wikipedia":"en:Clark Brands",name:"Clark"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Co-op (Canada)":{name:"Co-op (Canada)",icon:"maki-fuel",imageURL:"https://graph.facebook.com/CoopCRS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5440676",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Federated Co-operatives","brand:wikidata":"Q5440676","brand:wikipedia":"en:Federated Co-operatives",name:"Co-op"},countryCodes:["ca"],terms:["coop"],matchScore:2,suggestion:true},"amenity/fuel/Coles Express":{name:"Coles Express",icon:"maki-fuel",imageURL:"https://graph.facebook.com/ColesExpress/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5144653",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Coles Express","brand:wikidata":"Q5144653","brand:wikipedia":"en:Coles Express",name:"Coles Express"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Conoco":{name:"Conoco",icon:"maki-fuel",imageURL:"https://graph.facebook.com/conoco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1126518",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Conoco","brand:wikidata":"Q1126518","brand:wikipedia":"en:Conoco",name:"Conoco"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Copec":{name:"Copec",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q11681461",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Copec","brand:wikidata":"Q11681461","brand:wikipedia":"en:Empresas Copec",name:"Copec"},countryCodes:["cl"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Copetrol":{name:"Copetrol",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Copetrol/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62274431",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Copetrol","brand:wikidata":"Q62274431",name:"Copetrol"},countryCodes:["py"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Cosmo":{name:"Cosmo",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCosmo%20Oil%20company%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2498318",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Cosmo","brand:wikidata":"Q2498318","brand:wikipedia":"en:Cosmo Oil Company",name:"Cosmo"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Costco Gasoline":{name:"Costco Gasoline",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Costco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q715583",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Costco Gasoline","brand:wikidata":"Q715583","brand:wikipedia":"en:Costco",name:"Costco Gasoline"},countryCodes:["au","ca","mx","us"],terms:["costco","costco gas","costco wholesale"],matchScore:2,suggestion:true},"amenity/fuel/Couche-Tard":{name:"Couche-Tard",icon:"maki-fuel",imageURL:"https://graph.facebook.com/CoucheTardQc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2836957",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Couche-Tard","brand:wikidata":"Q2836957","brand:wikipedia":"en:Alimentation Couche-Tard",name:"Couche-Tard"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Crevier":{name:"Crevier",icon:"maki-fuel",imageURL:"https://graph.facebook.com/GroupeCrevier/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61743451",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Crevier","brand:wikidata":"Q61743451",name:"Crevier"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Crodux":{name:"Crodux",icon:"maki-fuel",imageURL:"https://graph.facebook.com/croduxhr/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62274622",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Crodux","brand:wikidata":"Q62274622",name:"Crodux"},countryCodes:["hr"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Cumberland Farms":{name:"Cumberland Farms",icon:"maki-fuel",imageURL:"https://graph.facebook.com/CumberlandFarms/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1143685",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Cumberland Farms","brand:wikidata":"Q1143685","brand:wikipedia":"en:Cumberland Farms",name:"Cumberland Farms"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Delta (Panama & Costa Rica)":{name:"Delta (Panama & Costa Rica)",icon:"maki-fuel",imageURL:"https://graph.facebook.com/PetroleosDelta/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62274638",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Delta","brand:wikidata":"Q62274638",name:"Delta"},countryCodes:["cr","us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Delta (USA)":{name:"Delta (USA)",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q62274661",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Delta","brand:wikidata":"Q62274661",name:"Delta"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Diamond Shamrock":{name:"Diamond Shamrock",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q16973722",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Diamond Shamrock","brand:wikidata":"Q16973722","brand:wikipedia":"en:Diamond Shamrock",name:"Diamond Shamrock"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Domo":{name:"Domo",icon:"maki-fuel",imageURL:"https://pbs.twimg.com/profile_images/924850916536107008/9ZCP6jwR_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q5291326",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Domo","brand:wikidata":"Q5291326","brand:wikipedia":"en:Domo Gasoline",name:"Domo"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/EKO (Canada)":{name:"EKO (Canada)",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q3045934",amenity:"fuel"},addTags:{amenity:"fuel",brand:"EKO","brand:wikidata":"Q3045934","brand:wikipedia":"fr:EKO",name:"EKO"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/EKO (Greece)":{name:"EKO (Greece)",icon:"maki-fuel",imageURL:"https://graph.facebook.com/HELPEgroup/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q903198",amenity:"fuel"},addTags:{amenity:"fuel",brand:"EKO","brand:wikidata":"Q903198","brand:wikipedia":"el:Ελληνικά Πετρέλαια",name:"EKO"},countryCodes:["bg","cy","gr","me","mk","rs"],terms:["εκο"],matchScore:2,suggestion:true},"amenity/fuel/ENEOS":{name:"ENEOS",icon:"maki-fuel",imageURL:"https://graph.facebook.com/eneos.jp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1640290",amenity:"fuel"},addTags:{amenity:"fuel",brand:"ENEOS","brand:wikidata":"Q1640290","brand:wikipedia":"en:JXTG Nippon Oil & Energy",name:"ENEOS"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Elan":{name:"Elan",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q57980752",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Elan","brand:wikidata":"Q57980752",name:"Elan"},countryCodes:["de","fr","nl"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Engen":{name:"Engen",icon:"maki-fuel",imageURL:"https://pbs.twimg.com/profile_images/1014490248112373760/rL8smOvY_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q3054251",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Engen","brand:wikidata":"Q3054251","brand:wikipedia":"en:Engen Petroleum",name:"Engen"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Eni":{name:"Eni",icon:"maki-fuel",imageURL:"https://pbs.twimg.com/profile_images/875644564459012097/fsDlSI7T_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q565594",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Eni","brand:wikidata":"Q565594","brand:wikipedia":"en:Eni",name:"Eni"},countryCodes:["at","ch","fr","it"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Erg":{name:"Erg",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FERG%20logo2018.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q739503",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Erg","brand:wikidata":"Q739503","brand:wikipedia":"it:ERG (azienda)",name:"Erg"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Esso":{name:"Esso",icon:"maki-fuel",imageURL:"https://graph.facebook.com/EssoGB/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q867662",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Esso","brand:wikidata":"Q867662","brand:wikipedia":"en:Esso",name:"Esso"},terms:["station esso"],matchScore:2,suggestion:true},"amenity/fuel/Esso Express":{name:"Esso Express",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q2350336",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Esso Express","brand:wikidata":"Q2350336","brand:wikipedia":"nl:Esso Express",name:"Esso Express"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Exxon":{name:"Exxon",icon:"maki-fuel",imageURL:"https://graph.facebook.com/ExxonandMobilStations/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4781944",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Exxon","brand:wikidata":"Q4781944","brand:wikipedia":"en:Exxon",name:"Exxon"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/F24":{name:"F24",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q12310853",amenity:"fuel"},addTags:{amenity:"fuel",brand:"F24","brand:wikidata":"Q12310853","brand:wikipedia":"da:F24",name:"F24"},countryCodes:["dk"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Fas Gas":{name:"Fas Gas",icon:"maki-fuel",imageURL:"https://graph.facebook.com/FasGasPlusCorporate/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61743505",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Fas Gas","brand:wikidata":"Q61743505","brand:wikipedia":"en:Parkland Fuel",name:"Fas Gas"},countryCodes:["ca"],terms:["fas gas plus"],matchScore:2,suggestion:true},"amenity/fuel/Firezone":{name:"Firezone",icon:"maki-fuel",imageURL:"https://graph.facebook.com/FirezoneNL/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q14628080",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Firezone","brand:wikidata":"Q14628080","brand:wikipedia":"nl:Firezone",name:"Firezone"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Flying J":{name:"Flying J",icon:"maki-fuel",imageURL:"https://graph.facebook.com/pilottravelcenters/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64130592",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Flying J","brand:wikidata":"Q64130592",name:"Flying J"},countryCodes:["ca","us"],terms:["flying j travel plaza"],matchScore:2,suggestion:true},"amenity/fuel/Flying V":{name:"Flying V",icon:"maki-fuel",imageURL:"https://graph.facebook.com/OfficialFlyingV/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62275048",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Flying V","brand:wikidata":"Q62275048",name:"Flying V"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Freie Tankstelle":{name:"Freie Tankstelle",icon:"maki-fuel",imageURL:"https://graph.facebook.com/768624663275807/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1009104",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Freie Tankstelle","brand:wikidata":"Q1009104","brand:wikipedia":"de:Bundesverband freier Tankstellen",name:"Freie Tankstelle"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/GALP":{name:"GALP",icon:"maki-fuel",imageURL:"https://graph.facebook.com/468503569977955/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1492739",amenity:"fuel"},addTags:{amenity:"fuel",brand:"GALP","brand:wikidata":"Q1492739","brand:wikipedia":"en:Galp Energia",name:"GALP"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Gazel":{name:"Gazel",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q62529885",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Gazel","brand:wikidata":"Q62529885",name:"Gazel"},countryCodes:["co","mx","pe"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Gazprom":{name:"Gazprom",icon:"maki-fuel",imageURL:"https://graph.facebook.com/GazpromNewsEn/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q102673",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Gazprom","brand:wikidata":"Q102673","brand:wikipedia":"en:Gazprom",name:"Gazprom"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/GetGo":{name:"GetGo",icon:"maki-fuel",imageURL:"https://graph.facebook.com/GiantEagleGetGo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5553766",amenity:"fuel"},addTags:{amenity:"fuel",brand:"GetGo","brand:wikidata":"Q5553766","brand:wikipedia":"en:GetGo",name:"GetGo"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Glusco":{name:"Glusco",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Glusco.Ukraine/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62284719",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Glusco","brand:wikidata":"Q62284719",name:"Glusco"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Goil":{name:"Goil",icon:"maki-fuel",imageURL:"https://graph.facebook.com/GOIL.Official/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5555383",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Goil","brand:wikidata":"Q5555383","brand:wikipedia":"en:Ghana Oil Company",name:"Goil"},countryCodes:["gh"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Gulf":{name:"Gulf",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FGulf%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1296860",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Gulf","brand:wikidata":"Q1296860","brand:wikipedia":"en:Gulf Oil",name:"Gulf"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Gull":{name:"Gull",icon:"maki-fuel",imageURL:"https://graph.facebook.com/GullNZ/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5617739",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Gull","brand:wikidata":"Q5617739","brand:wikipedia":"en:Gull Petroleum",name:"Gull"},countryCodes:["au","nz"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/H-E-B Fuel":{name:"H-E-B Fuel",icon:"maki-fuel",imageURL:"https://graph.facebook.com/HEB/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q830621",amenity:"fuel"},addTags:{amenity:"fuel",brand:"H-E-B Fuel","brand:wikidata":"Q830621","brand:wikipedia":"en:H-E-B",name:"H-E-B Fuel"},countryCodes:["us"],terms:["h-e-b gas"],matchScore:2,suggestion:true},"amenity/fuel/HEM":{name:"HEM",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FTamoil.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1563517",amenity:"fuel"},addTags:{amenity:"fuel",brand:"HEM","brand:wikidata":"Q1563517","brand:wikipedia":"de:Deutsche Tamoil",name:"HEM"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/HP":{name:"HP",icon:"maki-fuel",imageURL:"https://graph.facebook.com/hpcl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1619375",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Hindustan Petroleum","brand:wikidata":"Q1619375","brand:wikipedia":"en:Hindustan Petroleum",name:"HP",official_name:"Hindustan Petroleum"},countryCodes:["in"],terms:["hp petrol pump"],matchScore:2,suggestion:true},"amenity/fuel/Harnois":{name:"Harnois",icon:"maki-fuel",imageURL:"https://graph.facebook.com/harnoisenergies/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61743558",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Harnois","brand:wikidata":"Q61743558",name:"Harnois"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Hess":{name:"Hess",icon:"maki-fuel",imageURL:"https://graph.facebook.com/HessCorporation/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1615684",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Hess","brand:wikidata":"Q1615684","brand:wikipedia":"en:Hess Corporation",name:"Hess"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Hofer":{name:"Hofer",icon:"maki-fuel",imageURL:"https://graph.facebook.com/HOFER.AT/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q15815751",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Hofer","brand:wikidata":"Q15815751","brand:wikipedia":"de:Hofer KG",name:"Hofer"},countryCodes:["at","si"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Holiday":{name:"Holiday",icon:"maki-fuel",imageURL:"https://graph.facebook.com/holidaystations/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5880490",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Holiday","brand:wikidata":"Q5880490","brand:wikipedia":"en:Holiday Stationstores",name:"Holiday"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Husky":{name:"Husky",icon:"maki-fuel",imageURL:"https://graph.facebook.com/huskyenergy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q702049",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Husky","brand:wikidata":"Q702049","brand:wikipedia":"en:Husky Energy",name:"Husky"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/IES":{name:"IES",icon:"maki-fuel",imageURL:"https://pbs.twimg.com/profile_images/512948242925891586/WqYuXs0m_bigger.jpeg",geometry:["point","area"],tags:{"brand:wikidata":"Q62287387",amenity:"fuel"},addTags:{amenity:"fuel",brand:"IES","brand:wikidata":"Q62287387",name:"IES"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/IP":{name:"IP",icon:"maki-fuel",imageURL:"https://graph.facebook.com/IPperlitalia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q646807",amenity:"fuel"},addTags:{amenity:"fuel",brand:"IP","brand:wikidata":"Q646807","brand:wikipedia":"en:Anonima Petroli Italiana",name:"IP"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Indian Oil":{name:"Indian Oil",icon:"maki-fuel",imageURL:"https://graph.facebook.com/IndianOilCorpLimited/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1289348",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Indian Oil","brand:wikidata":"Q1289348","brand:wikipedia":"en:Indian Oil Corporation",name:"Indian Oil"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Ingo":{name:"Ingo",icon:"maki-fuel",imageURL:"https://graph.facebook.com/ingosverige/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17048617",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Ingo","brand:wikidata":"Q17048617","brand:wikipedia":"en:Ingo (brand)",name:"Ingo"},countryCodes:["dk","se"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Intermarché":{name:"Intermarché",icon:"maki-fuel",imageURL:"https://graph.facebook.com/tousuniscontrelaviechere/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3153200",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Intermarché","brand:wikidata":"Q3153200","brand:wikipedia":"fr:Intermarché",name:"Intermarché"},terms:["intermarché super"],matchScore:2,suggestion:true},"amenity/fuel/Ipiranga":{name:"Ipiranga",icon:"maki-fuel",imageURL:"https://graph.facebook.com/ipirangaoficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2081136",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Ipiranga","brand:wikidata":"Q2081136","brand:wikipedia":"pt:Ipiranga (empresa)",name:"Ipiranga"},countryCodes:["br"],terms:["posto ipiranga"],matchScore:2,suggestion:true},"amenity/fuel/Irving":{name:"Irving",icon:"maki-fuel",imageURL:"https://graph.facebook.com/irvingoil/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1673286",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Irving","brand:wikidata":"Q1673286","brand:wikipedia":"en:Irving Oil",name:"Irving"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/JA-SS":{name:"JA-SS",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q11225213",amenity:"fuel"},addTags:{amenity:"fuel",brand:"JA-SS","brand:wikidata":"Q11225213","brand:wikipedia":"ja:JA-SS",name:"JA-SS"},countryCodes:["jp"],terms:["ja"],matchScore:2,suggestion:true},"amenity/fuel/Jet":{name:"Jet",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q568940",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Jet","brand:wikidata":"Q568940","brand:wikipedia":"en:Jet (brand)",name:"Jet"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Jetti":{name:"Jetti",icon:"maki-fuel",imageURL:"https://graph.facebook.com/drivewithjetti/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62288720",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Jetti","brand:wikidata":"Q62288720",name:"Jetti"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Kangaroo Express":{name:"Kangaroo Express",icon:"maki-fuel",imageURL:"https://graph.facebook.com/KangarooExpress/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61747408",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Kangaroo Express","brand:wikidata":"Q61747408",name:"Kangaroo Express",short_name:"Kangaroo"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Kobil":{name:"Kobil",icon:"maki-fuel",imageURL:"https://graph.facebook.com/kenolkobil/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q22906119",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Kobil","brand:wikidata":"Q22906119","brand:wikipedia":"en:KenolKobil",name:"Kobil"},countryCodes:["bi","et","ke","rw","tz","ug","zm"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Kroger":{name:"Kroger",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Kroger/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q153417",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Kroger","brand:wikidata":"Q153417","brand:wikipedia":"en:Kroger",name:"Kroger"},terms:["kroger fuel"],matchScore:2,suggestion:true},"amenity/fuel/Kum & Go":{name:"Kum & Go",icon:"maki-fuel",imageURL:"https://graph.facebook.com/kumandgo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6443340",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Kum & Go","brand:wikidata":"Q6443340","brand:wikipedia":"en:Kum & Go",name:"Kum & Go"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Kwik Trip":{name:"Kwik Trip",icon:"maki-fuel",imageURL:"https://graph.facebook.com/KwikTrip/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6450420",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Kwik Trip","brand:wikidata":"Q6450420","brand:wikipedia":"en:Kwik Trip",name:"Kwik Trip"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Lotos":{name:"Lotos",icon:"maki-fuel",imageURL:"https://graph.facebook.com/GrupaLOTOS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1256909",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Lotos","brand:wikidata":"Q1256909","brand:wikipedia":"pl:Grupa Lotos",name:"Lotos"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Lotos Optima":{name:"Lotos Optima",icon:"maki-fuel",imageURL:"https://graph.facebook.com/GrupaLOTOS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1256909",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Lotos Optima","brand:wikidata":"Q1256909","brand:wikipedia":"pl:Grupa Lotos",name:"Lotos Optima"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Love's":{name:"Love's",icon:"maki-fuel",imageURL:"https://graph.facebook.com/lovestravelstops/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1872496",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Love's","brand:wikidata":"Q1872496","brand:wikipedia":"en:Love's Travel Stops & Country Stores",name:"Love's"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Lukoil":{name:"Lukoil",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Lukoil.en/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q329347",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Lukoil","brand:wikidata":"Q329347","brand:wikipedia":"en:Lukoil",name:"Lukoil"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/MEROIL":{name:"MEROIL",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q62292559",amenity:"fuel"},addTags:{amenity:"fuel",brand:"MEROIL","brand:wikidata":"Q62292559",name:"MEROIL"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/MOL":{name:"MOL",icon:"maki-fuel",imageURL:"https://graph.facebook.com/molcesko/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q549181",amenity:"fuel"},addTags:{amenity:"fuel",brand:"MOL","brand:wikidata":"Q549181","brand:wikipedia":"en:MOL (company)",name:"MOL"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/MRS":{name:"MRS",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q56274919",amenity:"fuel"},addTags:{amenity:"fuel",brand:"MRS","brand:wikidata":"Q56274919","brand:wikipedia":"en:MRS Oil Nigeria Plc",name:"MRS"},countryCodes:["ng"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Mac's":{name:"Mac's",icon:"maki-fuel",imageURL:"https://pbs.twimg.com/profile_images/918945400538714112/bRGd_5pv_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q4043527",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Mac's","brand:wikidata":"Q4043527","brand:wikipedia":"en:Mac's Convenience Stores",name:"Mac's"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/MacEwen":{name:"MacEwen",icon:"maki-fuel",imageURL:"https://graph.facebook.com/MacEwenServiceStation/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61740335",amenity:"fuel"},addTags:{amenity:"fuel",brand:"MacEwen","brand:wikidata":"Q61740335",name:"MacEwen"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Marathon":{name:"Marathon",icon:"maki-fuel",imageURL:"https://graph.facebook.com/MarathonPetroleumCorporation/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q458363",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Marathon","brand:wikidata":"Q458363","brand:wikipedia":"en:Marathon Petroleum",name:"Marathon"},terms:["Marathon Gas"],matchScore:2,suggestion:true},"amenity/fuel/Maverik":{name:"Maverik",icon:"maki-fuel",imageURL:"https://graph.facebook.com/maverikadventure/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64149010",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Maverik","brand:wikidata":"Q64149010","brand:wikipedia":"en:Maverik, Inc.",name:"Maverik"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Maxol":{name:"Maxol",icon:"maki-fuel",imageURL:"https://pbs.twimg.com/profile_images/684702839143317504/DqCgzXbW_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q3302837",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Maxol","brand:wikidata":"Q3302837","brand:wikipedia":"en:Maxol",name:"Maxol"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Metano":{name:"Metano",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q62294765",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Metano","brand:wikidata":"Q62294765",name:"Metano"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Migrol":{name:"Migrol",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20Migrol.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1747771",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Migrol","brand:wikidata":"Q1747771","brand:wikipedia":"de:Migrol",name:"Migrol"},countryCodes:["ch"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Mobil":{name:"Mobil",icon:"maki-fuel",imageURL:"https://graph.facebook.com/ExxonandMobilStations/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3088656",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Mobil","brand:wikidata":"Q3088656","brand:wikipedia":"en:Mobil",name:"Mobil"},terms:["mobile"],matchScore:2,suggestion:true},"amenity/fuel/Moil":{name:"Moil",icon:"maki-fuel",imageURL:"https://graph.facebook.com/milanpetrol/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62296914",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Moil","brand:wikidata":"Q62296914",name:"Moil"},countryCodes:["tr"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Morrisons":{name:"Morrisons",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Morrisons/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q922344",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Morrisons","brand:wikidata":"Q922344","brand:wikipedia":"en:Morrisons",name:"Morrisons"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Moya":{name:"Moya",icon:"maki-fuel",imageURL:"https://graph.facebook.com/moyastacja/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62297700",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Moya","brand:wikidata":"Q62297700",name:"Moya"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Murphy USA":{name:"Murphy USA",icon:"maki-fuel",imageURL:"https://graph.facebook.com/MurphyUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q19604459",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Murphy USA","brand:wikidata":"Q19604459","brand:wikipedia":"en:Murphy USA",name:"Murphy USA"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/NP":{name:"NP",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q7842382",amenity:"fuel"},addTags:{amenity:"fuel",brand:"NP","brand:wikidata":"Q7842382","brand:wikipedia":"en:Trinidad & Tobago National Petroleum Marketing Company Limited",name:"NP"},countryCodes:["tt"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Neste":{name:"Neste",icon:"maki-fuel",imageURL:"https://graph.facebook.com/NesteUS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q616376",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Neste","brand:wikidata":"Q616376","brand:wikipedia":"en:Neste",name:"Neste"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/OIL!":{name:"OIL!",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20OIL!.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2007561",amenity:"fuel"},addTags:{amenity:"fuel",brand:"OIL!","brand:wikidata":"Q2007561","brand:wikipedia":"de:OIL! Tankstellen",name:"OIL!"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/OK":{name:"OK",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q12329785",amenity:"fuel"},addTags:{amenity:"fuel",brand:"OK","brand:wikidata":"Q12329785","brand:wikipedia":"da:OK a.m.b.a.",name:"OK"},countryCodes:["dk"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/OKQ8":{name:"OKQ8",icon:"maki-fuel",imageURL:"https://graph.facebook.com/OKQ8/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1634762",amenity:"fuel"},addTags:{amenity:"fuel",brand:"OKQ8","brand:wikidata":"Q1634762","brand:wikipedia":"en:Kuwait Petroleum Corporation",name:"OKQ8"},countryCodes:["se"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/OMV":{name:"OMV",icon:"maki-fuel",imageURL:"https://graph.facebook.com/OMV/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q168238",amenity:"fuel"},addTags:{amenity:"fuel",brand:"OMV","brand:wikidata":"Q168238","brand:wikipedia":"en:OMV",name:"OMV"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Oilibya":{name:"Oilibya",icon:"maki-fuel",imageURL:"https://graph.facebook.com/OilibyaMisr/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7081491",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Oilibya","brand:wikidata":"Q7081491","brand:wikipedia":"en:Oilibya",name:"Oilibya","name:ar":"أويليبيا"},terms:["oilibia","oilibiya","oillibia","oilliby","oillibya","oillybia","oilybia","olibya","olybia"],matchScore:2,suggestion:true},"amenity/fuel/Opet":{name:"Opet",icon:"maki-fuel",imageURL:"https://graph.facebook.com/opet/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7072824",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Opet","brand:wikidata":"Q7072824","brand:wikipedia":"en:Opet",name:"Opet"},countryCodes:["tr"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Orlen":{name:"Orlen",icon:"maki-fuel",imageURL:"https://graph.facebook.com/ORLENOfficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q971649",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Orlen","brand:wikidata":"Q971649","brand:wikipedia":"en:PKN Orlen",name:"Orlen"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Oxxo":{name:"Oxxo",icon:"maki-fuel",imageURL:"https://graph.facebook.com/OXXOTiendas/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1342538",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Oxxo","brand:wikidata":"Q1342538","brand:wikipedia":"es:Oxxo",name:"Oxxo"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/PSO":{name:"PSO",icon:"maki-fuel",imageURL:"https://graph.facebook.com/PSOCL/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2741455",amenity:"fuel"},addTags:{amenity:"fuel",brand:"PSO","brand:wikidata":"Q2741455","brand:wikipedia":"en:Pakistan State Oil",name:"PSO"},countryCodes:["pk"],terms:["pso petrol pump"],matchScore:2,suggestion:true},"amenity/fuel/PT":{name:"PT",icon:"maki-fuel",imageURL:"https://graph.facebook.com/ptstation/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62298612",amenity:"fuel"},addTags:{amenity:"fuel",brand:"PT","brand:wikidata":"Q62298612",name:"PT"},countryCodes:["th"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/PTT":{name:"PTT",icon:"maki-fuel",imageURL:"https://graph.facebook.com/PTTNews/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1810389",amenity:"fuel"},addTags:{amenity:"fuel",brand:"PTT","brand:wikidata":"Q1810389","brand:wikipedia":"en:PTT Public Company Limited",name:"PTT"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/PV Oil":{name:"PV Oil",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q2089536",amenity:"fuel"},addTags:{amenity:"fuel",brand:"PV Oil","brand:wikidata":"Q2089536","brand:wikipedia":"en:Petrovietnam",name:"PV Oil"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Pacific Pride":{name:"Pacific Pride",icon:"maki-fuel",imageURL:"https://graph.facebook.com/PacificPrideUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7122637",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Pacific Pride","brand:wikidata":"Q7122637","brand:wikipedia":"en:Pacific Pride",name:"Pacific Pride"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Pecsa":{name:"Pecsa",icon:"maki-fuel",imageURL:"https://graph.facebook.com/PecsaPeru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62299262",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Pecsa","brand:wikidata":"Q62299262",name:"Pecsa"},countryCodes:["pe"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Pemex":{name:"Pemex",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Pemex/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q871308",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Pemex","brand:wikidata":"Q871308","brand:wikipedia":"en:Pemex",name:"Pemex"},countryCodes:["mx"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Pertamina":{name:"Pertamina",icon:"maki-fuel",imageURL:"https://graph.facebook.com/pertamina/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1641044",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Pertamina","brand:wikidata":"Q1641044","brand:wikipedia":"en:Pertamina",name:"Pertamina"},countryCodes:["id"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Petro":{name:"Petro",icon:"maki-fuel",imageURL:"https://graph.facebook.com/TravelCentersOfAmerica/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64051305",amenity:"fuel"},addTags:{alt_name:"Petro Stopping Centers",amenity:"fuel",brand:"Petro","brand:wikidata":"Q64051305",name:"Petro"},countryCodes:["ca","us"],terms:["petro stopping center"],matchScore:2,suggestion:true},"amenity/fuel/Petro-Canada":{name:"Petro-Canada",icon:"maki-fuel",imageURL:"https://graph.facebook.com/petrocanada/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1208279",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Petro-Canada","brand:wikidata":"Q1208279","brand:wikipedia":"en:Petro-Canada",name:"Petro-Canada"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Petro-T":{name:"Petro-T",icon:"maki-fuel",imageURL:"https://graph.facebook.com/115786179112919/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61743540",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Petro-T","brand:wikidata":"Q61743540",name:"Petro-T"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/PetroPerú":{name:"PetroPerú",icon:"maki-fuel",imageURL:"https://graph.facebook.com/petroperu/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2506390",amenity:"fuel"},addTags:{amenity:"fuel",brand:"PetroPerú","brand:wikidata":"Q2506390","brand:wikipedia":"es:Petroperú",name:"PetroPerú"},countryCodes:["pe"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Petrochina":{name:"Petrochina",icon:"maki-fuel",imageURL:"https://graph.facebook.com/PetroChina.Ltd/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q503182",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Petrochina","brand:wikidata":"Q503182","brand:wikipedia":"en:PetroChina",name:"Petrochina"},countryCodes:["cn"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Petroecuador":{name:"Petroecuador",icon:"maki-fuel",imageURL:"https://graph.facebook.com/PetroecuadorEP/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1812822",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Petroecuador","brand:wikidata":"Q1812822","brand:wikipedia":"en:Petroecuador",name:"Petroecuador"},countryCodes:["ec"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Petrol Ofisi":{name:"Petrol Ofisi",icon:"maki-fuel",imageURL:"https://graph.facebook.com/petrolofisi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1278087",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Petrol Ofisi","brand:wikidata":"Q1278087","brand:wikipedia":"en:Petrol Ofisi",name:"Petrol Ofisi"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Petrolimex":{name:"Petrolimex",icon:"maki-fuel",imageURL:"https://graph.facebook.com/tapdoanxangdauvietnam/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10831598",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Petrolimex","brand:wikidata":"Q10831598","brand:wikipedia":"en:Petrolimex",name:"Petrolimex"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Petrolina":{name:"Petrolina",icon:"maki-fuel",imageURL:"https://graph.facebook.com/petrolinaholdings/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17013948",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Petrolina","brand:wikidata":"Q17013948","brand:wikipedia":"en:Petrolina (company)",name:"Petrolina"},countryCodes:["cy"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Petrom":{name:"Petrom",icon:"maki-fuel",imageURL:"https://graph.facebook.com/PetromRo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1755034",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Petrom","brand:wikidata":"Q1755034","brand:wikipedia":"en:Petrom",name:"Petrom"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Petron":{name:"Petron",icon:"maki-fuel",imageURL:"https://graph.facebook.com/PetronCorporation/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7179011",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Petron","brand:wikidata":"Q7179011","brand:wikipedia":"en:Petron Corporation",name:"Petron"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Petronas":{name:"Petronas",icon:"maki-fuel",imageURL:"https://graph.facebook.com/petronas/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q221692",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Petronas","brand:wikidata":"Q221692","brand:wikipedia":"en:Petronas",name:"Petronas"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Petronor":{name:"Petronor",icon:"maki-fuel",imageURL:"https://graph.facebook.com/info.petronor/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1726547",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Petronor","brand:wikidata":"Q1726547","brand:wikipedia":"es:Petronor",name:"Petronor"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Phillips 66":{name:"Phillips 66",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Phillips66Co/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1656230",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Phillips 66","brand:wikidata":"Q1656230","brand:wikipedia":"en:Phillips 66",name:"Phillips 66"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Phoenix":{name:"Phoenix",icon:"maki-fuel",imageURL:"https://graph.facebook.com/phoenixfuels.ph/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7186949",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Phoenix","brand:wikidata":"Q7186949","brand:wikipedia":"en:Phoenix Petroleum",name:"Phoenix"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Pilot":{name:"Pilot",icon:"maki-fuel",imageURL:"https://graph.facebook.com/pilottravelcenters/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64128179",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Pilot","brand:wikidata":"Q64128179",name:"Pilot"},countryCodes:["ca","us"],terms:["pilot travel centers"],matchScore:2,suggestion:true},"amenity/fuel/Pioneer":{name:"Pioneer",icon:"maki-fuel",imageURL:"https://graph.facebook.com/PioneerEnergy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7196684",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Pioneer","brand:wikidata":"Q7196684","brand:wikipedia":"en:Pioneer Energy",name:"Pioneer"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Preem":{name:"Preem",icon:"maki-fuel",imageURL:"https://graph.facebook.com/preem/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q598835",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Preem","brand:wikidata":"Q598835","brand:wikipedia":"en:Preem",name:"Preem"},countryCodes:["pl","se"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Primax (Ecuador)":{name:"Primax (Ecuador)",icon:"maki-fuel",imageURL:"https://graph.facebook.com/PrimaxEcuador/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62332857",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Primax","brand:wikidata":"Q62332857",name:"Primax"},countryCodes:["ec"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Primax (Peru)":{name:"Primax (Peru)",icon:"maki-fuel",imageURL:"https://graph.facebook.com/PrimaxPeru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62332638",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Primax","brand:wikidata":"Q62332638",name:"Primax"},countryCodes:["pe"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Prio":{name:"Prio",icon:"maki-fuel",imageURL:"https://graph.facebook.com/PrioEnergy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62530421",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Prio","brand:wikidata":"Q62530421",name:"Prio"},countryCodes:["pt"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Puma":{name:"Puma",icon:"maki-fuel",imageURL:"https://graph.facebook.com/PumaEnergy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7259769",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Puma","brand:wikidata":"Q7259769","brand:wikipedia":"en:Puma Energy",name:"Puma"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Q1":{name:"Q1",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Q1EnergieAG/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62086498",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Q1","brand:wikidata":"Q62086498",name:"Q1"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Q8":{name:"Q8",icon:"maki-fuel",imageURL:"https://graph.facebook.com/OKQ8/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1634762",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Q8","brand:wikidata":"Q1634762","brand:wikipedia":"en:Kuwait Petroleum Corporation",name:"Q8"},countryCodes:["be","dk","es","it","lu","nl","pt"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Q8 Easy":{name:"Q8 Easy",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Q8italia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1806948",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Q8 Easy","brand:wikidata":"Q1806948","brand:wikipedia":"nl:Q8 Easy",name:"Q8 Easy"},countryCodes:["be","it"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Qstar":{name:"Qstar",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q10647961",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Qstar","brand:wikidata":"Q10647961","brand:wikipedia":"sv:Qstar",name:"Qstar"},countryCodes:["se"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/QuikTrip":{name:"QuikTrip",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Quiktrip/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7271953",amenity:"fuel"},addTags:{amenity:"fuel",brand:"QuikTrip","brand:wikidata":"Q7271953","brand:wikipedia":"en:QuikTrip",name:"QuikTrip"},terms:["qt"],matchScore:2,suggestion:true},"amenity/fuel/RaceTrac":{name:"RaceTrac",icon:"maki-fuel",imageURL:"https://graph.facebook.com/RaceTrac/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q735942",amenity:"fuel"},addTags:{amenity:"fuel",brand:"RaceTrac","brand:wikidata":"Q735942","brand:wikipedia":"en:RaceTrac",name:"RaceTrac"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Repsol":{name:"Repsol",icon:"maki-fuel",imageURL:"https://graph.facebook.com/repsol/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q174747",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Repsol","brand:wikidata":"Q174747","brand:wikipedia":"es:Repsol",name:"Repsol"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Revoil":{name:"Revoil",icon:"maki-fuel",imageURL:"https://graph.facebook.com/revoil/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62530755",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Revoil","brand:wikidata":"Q62530755",name:"Revoil"},countryCodes:["gr"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Rompetrol":{name:"Rompetrol",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Rompetrol.Romania/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1788862",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Rompetrol","brand:wikidata":"Q1788862","brand:wikipedia":"en:Rompetrol",name:"Rompetrol"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Royal Farms":{name:"Royal Farms",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Royalfarmsstores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7374169",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Royal Farms","brand:wikidata":"Q7374169","brand:wikipedia":"en:Royal Farms",name:"Royal Farms"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Rubis":{name:"Rubis",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q3446514",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Rubis","brand:wikidata":"Q3446514","brand:wikipedia":"en:Rubis (company)",name:"Rubis"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Safeway":{name:"Safeway",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Safeway/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1508234",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Safeway","brand:wikidata":"Q1508234","brand:wikipedia":"en:Safeway Inc.",name:"Safeway"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Sainsbury's":{name:"Sainsbury's",icon:"maki-fuel",imageURL:"https://graph.facebook.com/sainsburys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q152096",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Sainsbury's","brand:wikidata":"Q152096","brand:wikipedia":"en:Sainsbury's",name:"Sainsbury's"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Sam's Club":{name:"Sam's Club",icon:"maki-fuel",imageURL:"https://graph.facebook.com/samsclub/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1972120",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Sam's Club","brand:wikidata":"Q1972120","brand:wikipedia":"en:Sam's Club",name:"Sam's Club"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Sasol":{name:"Sasol",icon:"maki-fuel",imageURL:"https://graph.facebook.com/SasolSACareers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q905998",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Sasol","brand:wikidata":"Q905998","brand:wikipedia":"en:Sasol",name:"Sasol"},countryCodes:["za"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Sea Oil":{name:"Sea Oil",icon:"maki-fuel",imageURL:"https://graph.facebook.com/SEAOIL/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7389549",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Sea Oil","brand:wikidata":"Q7389549","brand:wikipedia":"en:Seaoil Philippines",name:"Sea Oil"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Sheetz":{name:"Sheetz",icon:"maki-fuel",imageURL:"https://graph.facebook.com/sheetz/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7492551",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Sheetz","brand:wikidata":"Q7492551","brand:wikipedia":"en:Sheetz",name:"Sheetz"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Shell":{name:"Shell",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Shell/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q154950",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Shell","brand:wikidata":"Q154950","brand:wikipedia":"en:Royal Dutch Shell",name:"Shell"},terms:["posto shell","shell gas station","shell petrol station","shell station","station shell"],matchScore:2,suggestion:true},"amenity/fuel/Shell Express":{name:"Shell Express",icon:"maki-fuel",imageURL:"https://graph.facebook.com/shell/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2289188",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Shell Express","brand:wikidata":"Q2289188","brand:wikipedia":"nl:Shell Express",name:"Shell Express"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Sinclair":{name:"Sinclair",icon:"maki-fuel",imageURL:"https://graph.facebook.com/SinclairOilCorp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1290900",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Sinclair","brand:wikidata":"Q1290900","brand:wikipedia":"en:Sinclair Oil Corporation",name:"Sinclair"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Sinopec":{name:"Sinopec",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Sinopec/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q831445",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Sinopec","brand:wikidata":"Q831445","brand:wikipedia":"en:Sinopec","brand:zh":"中国石化",name:"Sinopec","name:zh":"中国石化"},countryCodes:["cn"],terms:["sinopec fuel"],matchScore:2,suggestion:true},"amenity/fuel/Slovnaft":{name:"Slovnaft",icon:"maki-fuel",imageURL:"https://graph.facebook.com/MySlovnaft/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1587563",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Slovnaft","brand:wikidata":"Q1587563","brand:wikipedia":"en:Slovnaft",name:"Slovnaft"},countryCodes:["cz","pl","sk"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Socar":{name:"Socar",icon:"maki-fuel",imageURL:"https://graph.facebook.com/SOCARofficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1622293",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Socar","brand:wikidata":"Q1622293","brand:wikipedia":"en:SOCAR",name:"Socar"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Sokimex":{name:"Sokimex",icon:"maki-fuel",imageURL:"https://graph.facebook.com/SokimexGroup/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1149575",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Sokimex","brand:wikidata":"Q1149575","brand:wikipedia":"en:Sokimex",name:"Sokimex"},countryCodes:["kh"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Speedway":{name:"Speedway",icon:"maki-fuel",imageURL:"https://graph.facebook.com/SpeedwayStores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7575683",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Speedway","brand:wikidata":"Q7575683","brand:wikipedia":"en:Speedway LLC",name:"Speedway"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Sprint":{name:"Sprint",icon:"maki-fuel",imageURL:"https://graph.facebook.com/SprintTankstelle/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q57588452",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Sprint","brand:wikidata":"Q57588452",name:"Sprint"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/St1":{name:"St1",icon:"maki-fuel",imageURL:"https://graph.facebook.com/st1suomi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7592214",amenity:"fuel"},addTags:{amenity:"fuel",brand:"St1","brand:wikidata":"Q7592214","brand:wikipedia":"en:St1",name:"St1"},countryCodes:["fi","se"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Star":{name:"Star",icon:"maki-fuel",imageURL:"https://graph.facebook.com/123909017686285/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2031095",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Star","brand:wikidata":"Q2031095","brand:wikipedia":"de:Orlen Deutschland",name:"Star"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Station Service E. Leclerc":{name:"Station Service E. Leclerc",icon:"maki-fuel",imageURL:"https://graph.facebook.com/E.Leclerc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1273376",amenity:"fuel"},addTags:{amenity:"fuel",brand:"E.Leclerc","brand:wikidata":"Q1273376","brand:wikipedia":"fr:E.Leclerc",name:"Station Service E. Leclerc"},terms:["e. leclerc"],matchScore:2,suggestion:true},"amenity/fuel/Statoil":{name:"Statoil",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Equinor/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1776022",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Statoil","brand:wikidata":"Q1776022","brand:wikipedia":"en:Equinor",name:"Statoil"},countryCodes:["dk","ee","ie","pl","ru","se"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Stewart's":{name:"Stewart's",icon:"maki-fuel",imageURL:"https://graph.facebook.com/YourStewarts/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7615690",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Stewart's","brand:wikidata":"Q7615690","brand:wikipedia":"en:Stewart's Shops",name:"Stewart's"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Sunoco":{name:"Sunoco",icon:"maki-fuel",imageURL:"https://graph.facebook.com/GoSunoco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1423218",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Sunoco","brand:wikidata":"Q1423218","brand:wikipedia":"en:Sunoco",name:"Sunoco"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Super U":{name:"Super U",icon:"maki-fuel",imageURL:"https://graph.facebook.com/ULesCommercants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2529029",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Super U","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Super U"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/TA":{name:"TA",icon:"maki-fuel",imageURL:"https://graph.facebook.com/TravelCentersOfAmerica/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7835892",amenity:"fuel"},addTags:{amenity:"fuel",brand:"TA","brand:wikidata":"Q7835892","brand:wikipedia":"en:TravelCenters of America",name:"TA"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Tamoil":{name:"Tamoil",icon:"maki-fuel",imageURL:"https://graph.facebook.com/TamoilNederland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q706793",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Tamoil","brand:wikidata":"Q706793","brand:wikipedia":"en:Tamoil",name:"Tamoil"},countryCodes:["ch","de","es","fr","it","nl"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Tango":{name:"Tango",icon:"maki-fuel",imageURL:"https://graph.facebook.com/TangoTankstations/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2423920",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Tango","brand:wikidata":"Q2423920","brand:wikipedia":"nl:Tango CV",name:"Tango"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Tanka":{name:"Tanka",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q10690640",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Tanka","brand:wikidata":"Q10690640","brand:wikipedia":"sv:Tanka (bensinstationskedja)",name:"Tanka"},countryCodes:["se"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Teboil":{name:"Teboil",icon:"maki-fuel",imageURL:"https://graph.facebook.com/teboil.fi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7692079",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Teboil","brand:wikidata":"Q7692079","brand:wikipedia":"en:Teboil",name:"Teboil"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Tela":{name:"Tela",icon:"maki-fuel",imageURL:"https://graph.facebook.com/TelaCompany/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62534875",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Tela","brand:wikidata":"Q62534875",name:"Tela"},countryCodes:["kh"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Tempo":{name:"Tempo",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q62535175",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Tempo","brand:wikidata":"Q62535175",name:"Tempo"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Terpel":{name:"Terpel",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Terpel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7703003",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Terpel","brand:wikidata":"Q7703003","brand:wikipedia":"en:Terpel",name:"Terpel"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Tesco":{name:"Tesco",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q17145596",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Tesco","brand:wikidata":"Q17145596","brand:wikipedia":"en:Tesco Corporation",name:"Tesco"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Texaco":{name:"Texaco",icon:"maki-fuel",imageURL:"https://graph.facebook.com/TexacoWithTechron/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q775060",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Texaco","brand:wikidata":"Q775060","brand:wikipedia":"en:Texaco",name:"Texaco"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Tinq":{name:"Tinq",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q2132028",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Tinq","brand:wikidata":"Q2132028","brand:wikipedia":"nl:Tinq",name:"Tinq"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Topaz":{name:"Topaz",icon:"maki-fuel",imageURL:"https://pbs.twimg.com/profile_images/1039514449244114945/evpJUxKM_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q7824764",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Topaz","brand:wikidata":"Q7824764","brand:wikipedia":"en:Topaz Energy",name:"Topaz"},countryCodes:["ie"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Total":{name:"Total",icon:"maki-fuel",imageURL:"https://graph.facebook.com/TotalUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q154037",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Total","brand:wikidata":"Q154037","brand:wikipedia":"fr:Total (entreprise)",name:"Total"},terms:["station total"],matchScore:2,suggestion:true},"amenity/fuel/Total Access":{name:"Total Access",icon:"maki-fuel",imageURL:"https://graph.facebook.com/TotalUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q154037",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Total Access","brand:wikidata":"Q154037","brand:wikipedia":"fr:Total (entreprise)",name:"Total Access"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/TotalErg":{name:"TotalErg",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FTotalerg%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q3995933",amenity:"fuel"},addTags:{amenity:"fuel",brand:"TotalErg","brand:wikidata":"Q3995933","brand:wikipedia":"it:TotalErg",name:"TotalErg"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Turkey Hill":{name:"Turkey Hill",icon:"maki-fuel",imageURL:"https://graph.facebook.com/turkeyhillmm/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q42376970",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Turkey Hill","brand:wikidata":"Q42376970","brand:wikipedia":"en:Turkey Hill Minit Markets",name:"Turkey Hill"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Turmöl":{name:"Turmöl",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Turmoel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1473279",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Turmöl","brand:wikidata":"Q1473279","brand:wikipedia":"de:Turmöl",name:"Turmöl"},countryCodes:["at"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/UDF Fuel":{name:"UDF Fuel",icon:"maki-fuel",imageURL:"https://graph.facebook.com/UnitedDairyFarmers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7887677",amenity:"fuel"},addTags:{amenity:"fuel",brand:"United Dairy Farmers","brand:wikidata":"Q7887677","brand:wikipedia":"en:United Dairy Farmers",name:"UDF Fuel",short_name:"UDF"},countryCodes:["us"],terms:["udf fuels","united dairy farmers"],matchScore:2,suggestion:true},"amenity/fuel/Ultramar":{name:"Ultramar",icon:"maki-fuel",imageURL:"https://graph.facebook.com/190502784374269/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3548078",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Ultramar","brand:wikidata":"Q3548078","brand:wikipedia":"en:Ultramar",name:"Ultramar"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/United":{name:"United",icon:"maki-fuel",imageURL:"https://graph.facebook.com/unitedpetroleum/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q28224393",amenity:"fuel"},addTags:{amenity:"fuel",brand:"United","brand:wikidata":"Q28224393","brand:wikipedia":"en:United Petroleum",name:"United"},terms:["united petroleum"],matchScore:2,suggestion:true},"amenity/fuel/Uno":{name:"Uno",icon:"maki-fuel",imageURL:"https://graph.facebook.com/UnoGasolineras/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62535574",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Uno","brand:wikidata":"Q62535574",name:"Uno"},countryCodes:["bz","cr","gt","hn","ni","sv"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Uno-X":{name:"Uno-X",icon:"maki-fuel",imageURL:"https://graph.facebook.com/unoxdanmark/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3362746",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Uno-X","brand:wikidata":"Q3362746","brand:wikipedia":"en:Uno-X",name:"Uno-X"},countryCodes:["dk"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Valero":{name:"Valero",icon:"maki-fuel",imageURL:"https://graph.facebook.com/valeroenergy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1283291",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Valero","brand:wikidata":"Q1283291","brand:wikipedia":"en:Valero Energy",name:"Valero"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Viada":{name:"Viada",icon:"maki-fuel",imageURL:"https://graph.facebook.com/ViadaLietuva/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12663942",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Viada","brand:wikidata":"Q12663942","brand:wikipedia":"en:Lukoil Baltija",name:"Viada"},countryCodes:["lt","lv"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Vito":{name:"Vito",icon:"maki-fuel",imageURL:"https://graph.facebook.com/VITOCORSICA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62536473",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Vito","brand:wikidata":"Q62536473",name:"Vito"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/WOG":{name:"WOG",icon:"maki-fuel",imageURL:"https://graph.facebook.com/azsWOG/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12072939",amenity:"fuel"},addTags:{amenity:"fuel",brand:"WOG","brand:wikidata":"Q12072939","brand:wikipedia":"en:WOG (gas stations)",name:"WOG"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Walmart":{name:"Walmart",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Walmart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62606411",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Walmart","brand:wikidata":"Q62606411","brand:wikipedia":"en:Walmart",name:"Walmart"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Wawa":{name:"Wawa",icon:"maki-fuel",imageURL:"https://graph.facebook.com/wawa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5936320",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Wawa","brand:wikidata":"Q5936320","brand:wikipedia":"en:Wawa (company)",name:"Wawa"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Westfalen":{name:"Westfalen",icon:"maki-fuel",imageURL:"https://graph.facebook.com/WestfalenAG/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1411209",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Westfalen","brand:wikidata":"Q1411209","brand:wikipedia":"en:Westfalen AG",name:"Westfalen"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Woolworths Petrol":{name:"Woolworths Petrol",icon:"maki-fuel",imageURL:"https://graph.facebook.com/woolworths/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5023980",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Caltex","brand:wikidata":"Q5023980","brand:wikipedia":"en:Caltex Woolworths",name:"Woolworths Petrol"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/XTR":{name:"XTR",icon:"maki-fuel",imageURL:"https://pbs.twimg.com/profile_images/1849683826/XTRASlogo_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q62537250",amenity:"fuel"},addTags:{amenity:"fuel",brand:"XTR","brand:wikidata":"Q62537250",name:"XTR"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/YPF":{name:"YPF",icon:"maki-fuel",imageURL:"https://graph.facebook.com/YPFoficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2006989",amenity:"fuel"},addTags:{amenity:"fuel",brand:"YPF","brand:wikidata":"Q2006989","brand:wikipedia":"en:YPF",name:"YPF"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Z":{name:"Z",icon:"maki-fuel",imageURL:"https://graph.facebook.com/zenergynz/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q8063337",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Z","brand:wikidata":"Q8063337","brand:wikipedia":"en:Z Energy",name:"Z"},countryCodes:["nz"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/bft":{name:"bft",icon:"maki-fuel",imageURL:"https://graph.facebook.com/768624663275807/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1009104",amenity:"fuel"},addTags:{amenity:"fuel",brand:"bft","brand:wikidata":"Q1009104","brand:wikipedia":"de:Bundesverband freier Tankstellen",name:"bft"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/din-X":{name:"din-X",icon:"maki-fuel",imageURL:"https://graph.facebook.com/bensinbolagettvartom/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10472858",amenity:"fuel"},addTags:{amenity:"fuel",brand:"din-X","brand:wikidata":"Q10472858","brand:wikipedia":"sv:Din-X",name:"din-X"},countryCodes:["se"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Авіас":{name:"Авіас",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q12122687",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Авіас","brand:wikidata":"Q12122687","brand:wikipedia":"uk:Мережа АЗС Приват",name:"Авіас"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/БРСМ-Нафта":{name:"БРСМ-Нафта",icon:"maki-fuel",imageURL:"https://graph.facebook.com/BRSM.NAFTA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q56356523",amenity:"fuel"},addTags:{amenity:"fuel",brand:"БРСМ-Нафта","brand:wikidata":"Q56356523","brand:wikipedia":"uk:БРСМ-Нафта",name:"БРСМ-Нафта"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Башнефть":{name:"Башнефть",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Bashneft/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q809985",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Башнефть","brand:en":"Bashneft","brand:wikidata":"Q809985","brand:wikipedia":"en:Bashneft",name:"Башнефть","name:en":"Bashneft"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Белоруснефть":{name:"Белоруснефть",icon:"maki-fuel",imageURL:"https://graph.facebook.com/belorusneft/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4082693",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Белоруснефть","brand:wikidata":"Q4082693","brand:wikipedia":"ru:Белоруснефть",name:"Белоруснефть"},countryCodes:["by"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Газпромнефть":{name:"Газпромнефть",icon:"maki-fuel",imageURL:"https://graph.facebook.com/gazprom.neft/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1461799",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Газпромнефть","brand:wikidata":"Q1461799","brand:wikipedia":"en:Gazprom Neft",name:"Газпромнефть"},countryCodes:["by","kg","kz","ru","tj"],terms:["газпром"],matchScore:2,suggestion:true},"amenity/fuel/Гелиос":{name:"Гелиос",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q62286471",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Гелиос","brand:en":"Helios","brand:wikidata":"Q62286471",name:"Гелиос","name:en":"Helios"},countryCodes:["kz"],terms:["helios"],matchScore:2,suggestion:true},"amenity/fuel/ЕКА":{name:"ЕКА",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q62543029",amenity:"fuel"},addTags:{amenity:"fuel",brand:"ЕКА","brand:wikidata":"Q62543029",name:"ЕКА"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/КЛО":{name:"КЛО",icon:"maki-fuel",imageURL:"https://graph.facebook.com/klo.oil/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q60966526",amenity:"fuel"},addTags:{amenity:"fuel",brand:"КЛО","brand:en":"Klo","brand:wikidata":"Q60966526","brand:wikipedia":"ru:КЛО (сеть АЗС)",name:"КЛО","name:en":"Klo"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/КазМунайГаз":{name:"КазМунайГаз",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q1417227",amenity:"fuel"},addTags:{amenity:"fuel",brand:"КазМунайГаз","brand:wikidata":"Q1417227","brand:wikipedia":"en:KazMunayGas",name:"КазМунайГаз"},countryCodes:["kz"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Лукойл":{name:"Лукойл",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Lukoil.en/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q329347",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Лукойл","brand:wikidata":"Q329347","brand:wikipedia":"ru:Лукойл",name:"Лукойл"},terms:["лукоил"],matchScore:2,suggestion:true},"amenity/fuel/Макпетрол":{name:"Макпетрол",icon:"maki-fuel",imageURL:"https://graph.facebook.com/makpetrol.ultra/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1886438",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Макпетрол","brand:wikidata":"Q1886438","brand:wikipedia":"en:Makpetrol",name:"Макпетрол"},countryCodes:["mk"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/НК Альянс":{name:"НК Альянс",icon:"maki-fuel",imageURL:"https://graph.facebook.com/AllianceOilUkraine/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4063700",amenity:"fuel"},addTags:{amenity:"fuel",brand:"НК Альянс","brand:en":"Alliance Oil","brand:ru":"НК Альянс","brand:wikidata":"Q4063700","brand:wikipedia":"ru:Альянс (компания)",name:"НК Альянс","name:en":"Alliance Oil","name:ru":"НК Альянс"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Нефтьмагистраль":{name:"Нефтьмагистраль",icon:"maki-fuel",imageURL:"https://graph.facebook.com/neftm.ru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62544323",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Нефтьмагистраль","brand:en":"Neftmagistral","brand:wikidata":"Q62544323",name:"Нефтьмагистраль","name:en":"Neftmagistral"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/ОККО":{name:"ОККО",icon:"maki-fuel",imageURL:"https://graph.facebook.com/okkoua/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7072617",amenity:"fuel"},addTags:{amenity:"fuel",brand:"ОККО","brand:en":"OKKO","brand:wikidata":"Q7072617","brand:wikipedia":"en:OKKO",name:"ОККО","name:en":"OKKO"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/ОМВ":{name:"ОМВ",icon:"maki-fuel",imageURL:"https://graph.facebook.com/OMV/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q168238",amenity:"fuel"},addTags:{amenity:"fuel",brand:"ОМВ","brand:wikidata":"Q168238","brand:wikipedia":"en:OMV",name:"ОМВ"},countryCodes:["bg","rs"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/ПТК":{name:"ПТК",icon:"maki-fuel",imageURL:"https://graph.facebook.com/ptk.ru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4360193",amenity:"fuel"},addTags:{amenity:"fuel",brand:"ПТК","brand:en":"The Petersburg Fuel Company","brand:wikidata":"Q4360193","brand:wikipedia":"en:Petersburg Fuel Company",name:"ПТК","name:en":"The Petersburg Fuel Company"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Петрол":{name:"Петрол",icon:"maki-fuel",imageURL:"https://graph.facebook.com/PetrolAD/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q24315",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Петрол","brand:en":"Petrol AD","brand:wikidata":"Q24315","brand:wikipedia":"en:Petrol AD",name:"Петрол","name:en":"Petrol AD"},countryCodes:["bg"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Роснефть":{name:"Роснефть",icon:"maki-fuel",imageURL:"https://graph.facebook.com/RosneftRu/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1141123",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Роснефть","brand:en":"Rosneft","brand:wikidata":"Q1141123","brand:wikipedia":"en:Rosneft",name:"Роснефть","name:en":"Rosneft"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Сургутнефтегаз":{name:"Сургутнефтегаз",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSng2.gif&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q680776",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Сургутнефтегаз","brand:en":"Surgutneftegas","brand:wikidata":"Q680776","brand:wikipedia":"en:Surgutneftegas",name:"Сургутнефтегаз","name:en":"Surgutneftegas"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/ТНК":{name:"ТНК",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q2298901",amenity:"fuel"},addTags:{amenity:"fuel",brand:"ТНК","brand:wikidata":"Q2298901","brand:wikipedia":"en:TNK-BP",name:"ТНК"},countryCodes:["ru","ua"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Татнефть":{name:"Татнефть",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FTatneft%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1616858",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Татнефть","brand:en":"Tatneft","brand:wikidata":"Q1616858","brand:wikipedia":"en:Tatneft",name:"Татнефть","name:en":"Tatneft"},countryCodes:["ru","ua"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Укрнафта":{name:"Укрнафта",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FUkrnafta.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2447961",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Укрнафта","brand:en":"Ukrnafta","brand:wikidata":"Q2447961","brand:wikipedia":"en:Ukrnafta",name:"Укрнафта","name:en":"Ukrnafta"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/דור אלון":{name:"דור אלון",icon:"maki-fuel",imageURL:"https://graph.facebook.com/dor.alon.il/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16130352",amenity:"fuel"},addTags:{amenity:"fuel",brand:"דור אלון","brand:en":"Dor Alon","brand:he":"דור אלון","brand:wikidata":"Q16130352","brand:wikipedia":"he:דור אלון אנרגיה בישראל (1988)",name:"דור אלון","name:en":"Dor Alon","name:he":"דור אלון"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/סונול":{name:"סונול",icon:"maki-fuel",imageURL:"https://graph.facebook.com/sonolsogood/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3701622",amenity:"fuel"},addTags:{amenity:"fuel",brand:"סונול","brand:en":"Sonol","brand:he":"סונול","brand:wikidata":"Q3701622","brand:wikipedia":"en:Sonol",name:"סונול","name:en":"Sonol","name:he":"סונול"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/פז":{name:"פז",icon:"maki-fuel",imageURL:"https://graph.facebook.com/YellowPaz/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2211731",amenity:"fuel"},addTags:{amenity:"fuel",brand:"פז","brand:en":"Paz","brand:he":"פז","brand:wikidata":"Q2211731","brand:wikipedia":"en:Paz Oil Company",name:"פז","name:en":"Paz","name:he":"פז"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/ادنوك":{name:"ادنوك",icon:"maki-fuel",imageURL:"https://graph.facebook.com/ADNOCDistribution/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q166729",amenity:"fuel"},addTags:{amenity:"fuel",brand:"ادنوك","brand:ar":"ادنوك","brand:en":"ADNOC","brand:wikidata":"Q166729","brand:wikipedia":"en:Abu Dhabi National Oil Company",name:"ادنوك","name:ar":"ادنوك","name:en":"ADNOC"},countryCodes:["ae"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/บางจาก":{name:"บางจาก",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Bangchak/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6579719",amenity:"fuel"},addTags:{amenity:"fuel",brand:"บางจาก","brand:en":"Bangchak","brand:th":"บางจาก","brand:wikidata":"Q6579719","brand:wikipedia":"th:บางจาก คอร์ปอเรชัน",name:"บางจาก","name:en":"Bangchak","name:th":"บางจาก"},countryCodes:["th"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/ป.ต.ท.":{name:"ป.ต.ท.",icon:"maki-fuel",imageURL:"https://graph.facebook.com/PTTNews/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1810389",amenity:"fuel"},addTags:{amenity:"fuel",brand:"ป.ต.ท.","brand:en":"PTT","brand:th":"ป.ต.ท.","brand:wikidata":"Q1810389","brand:wikipedia":"th:ปตท.",name:"ป.ต.ท.","name:en":"PTT","name:th":"ป.ต.ท."},countryCodes:["th"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/เชลล์":{name:"เชลล์",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Shell/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q154950",amenity:"fuel"},addTags:{amenity:"fuel",brand:"เชลล์","brand:en":"Shell","brand:th":"เชลล์","brand:wikidata":"Q154950","brand:wikipedia":"en:Royal Dutch Shell",name:"เชลล์","name:en":"Shell","name:th":"เชลล์"},countryCodes:["th"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/เอสโซ่":{name:"เอสโซ่",icon:"maki-fuel",imageURL:"https://graph.facebook.com/EssoGB/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q867662",amenity:"fuel"},addTags:{amenity:"fuel",brand:"เอสโซ่","brand:en":"Esso","brand:th":"เอสโซ่","brand:wikidata":"Q867662","brand:wikipedia":"en:Esso",name:"เอสโซ่","name:en":"Esso","name:th":"เอสโซ่"},countryCodes:["th"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/エッソ":{name:"エッソ",icon:"maki-fuel",imageURL:"https://graph.facebook.com/EssoGB/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q867662",amenity:"fuel"},addTags:{amenity:"fuel",brand:"エッソ","brand:en":"Esso","brand:ja":"エッソ","brand:wikidata":"Q867662","brand:wikipedia":"en:Esso",name:"エッソ","name:en":"Esso","name:ja":"エッソ"},countryCodes:["jp"],terms:["エッソ石油"],matchScore:2,suggestion:true},"amenity/fuel/エネオス":{name:"エネオス",icon:"maki-fuel",imageURL:"https://graph.facebook.com/eneos.jp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1640290",amenity:"fuel"},addTags:{amenity:"fuel",brand:"エネオス","brand:en":"JXTG Nippon Oil & Energy","brand:ja":"エネオス","brand:wikidata":"Q1640290","brand:wikipedia":"en:JXTG Nippon Oil & Energy",name:"エネオス","name:en":"JXTG Nippon Oil & Energy","name:ja":"エネオス"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/コスモ石油":{name:"コスモ石油",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCosmo%20Oil%20company%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2498318",amenity:"fuel"},addTags:{amenity:"fuel",brand:"コスモ石油","brand:en":"Cosmo Oil Company","brand:ja":"コスモ石油","brand:wikidata":"Q2498318","brand:wikipedia":"en:Cosmo Oil Company",name:"コスモ石油","name:en":"Cosmo Oil Company","name:ja":"コスモ石油"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/ゼネラル":{name:"ゼネラル",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FTonenGeneral.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q11528048",amenity:"fuel"},addTags:{amenity:"fuel",brand:"ゼネラル","brand:en":"Tonen General","brand:ja":"ゼネラル","brand:wikidata":"Q11528048","brand:wikipedia":"ja:東燃ゼネラル石油",name:"ゼネラル","name:en":"Tonen General","name:ja":"ゼネラル"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/中国石化":{name:"中国石化",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Sinopec/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q831445",amenity:"fuel"},addTags:{amenity:"fuel",brand:"中国石化","brand:en":"Sinopec","brand:wikidata":"Q831445","brand:wikipedia":"en:Sinopec",name:"中国石化","name:en":"Sinopec"},countryCodes:["cn"],terms:["中国石化 Sinopec"],matchScore:2,suggestion:true},"amenity/fuel/中国石油":{name:"中国石油",icon:"maki-fuel",imageURL:"https://graph.facebook.com/PetroChina.Ltd/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q503182",amenity:"fuel"},addTags:{amenity:"fuel",brand:"中国石油","brand:en":"PetroChina","brand:wikidata":"Q503182","brand:wikipedia":"en:PetroChina",name:"中国石油","name:en":"PetroChina"},countryCodes:["cn"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/出光":{name:"出光",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q2216770",amenity:"fuel"},addTags:{amenity:"fuel",brand:"出光","brand:en":"Idemitsu Kosan","brand:wikidata":"Q2216770","brand:wikipedia":"en:Idemitsu Kosan",name:"出光","name:en":"Idemitsu Kosan"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/台灣中油":{name:"台灣中油",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q21527177",amenity:"fuel"},addTags:{amenity:"fuel",brand:"台灣中油","brand:en":"CPC Corporation, Taiwan","brand:wikidata":"Q21527177","brand:wikipedia":"en:CPC Corporation, Taiwan",name:"台灣中油","name:en":"CPC Corporation, Taiwan"},countryCodes:["tw"],terms:["中油"],matchScore:2,suggestion:true},"amenity/fuel/昭和シェル":{name:"昭和シェル",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q277115",amenity:"fuel"},addTags:{amenity:"fuel",brand:"昭和シェル","brand:en":"Showa Shell Sekiyu","brand:ja":"昭和シェル","brand:wikidata":"Q277115","brand:wikipedia":"en:Showa Shell Sekiyu",name:"昭和シェル","name:en":"Showa Shell Sekiyu","name:ja":"昭和シェル"},countryCodes:["jp"],terms:["昭和シェル石油"],matchScore:2,suggestion:true},"amenity/ice_cream/Baskin-Robbins":{name:"Baskin-Robbins",icon:"fas-ice-cream",imageURL:"https://graph.facebook.com/baskinrobbinsUS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q584601",amenity:"ice_cream"},addTags:{amenity:"ice_cream",brand:"Baskin-Robbins","brand:wikidata":"Q584601","brand:wikipedia":"en:Baskin-Robbins",cuisine:"ice_cream",name:"Baskin-Robbins"},terms:[],matchScore:2,suggestion:true},"amenity/ice_cream/Ben & Jerry's":{name:"Ben & Jerry's",icon:"fas-ice-cream",imageURL:"https://graph.facebook.com/BenandJerryAustralia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q816412",amenity:"ice_cream"},addTags:{amenity:"ice_cream",brand:"Ben & Jerry's","brand:wikidata":"Q816412","brand:wikipedia":"en:Ben & Jerry's",cuisine:"ice_cream",name:"Ben & Jerry's"},terms:["ben and jerrys"],matchScore:2,suggestion:true},"amenity/ice_cream/Bruster's Ice Cream":{name:"Bruster's Ice Cream",icon:"fas-ice-cream",imageURL:"https://graph.facebook.com/BrustersRealIceCream/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4979810",amenity:"ice_cream"},addTags:{amenity:"ice_cream",brand:"Bruster's Ice Cream","brand:wikidata":"Q4979810","brand:wikipedia":"en:Bruster's Ice Cream",cuisine:"ice_cream",name:"Bruster's Ice Cream"},countryCodes:["us"],terms:["brusters"],matchScore:2,suggestion:true},"amenity/ice_cream/Cold Stone Creamery":{name:"Cold Stone Creamery",icon:"fas-ice-cream",imageURL:"https://graph.facebook.com/coldstonecreamery/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1094923",amenity:"ice_cream"},addTags:{amenity:"ice_cream",brand:"Cold Stone Creamery","brand:wikidata":"Q1094923","brand:wikipedia":"en:Cold Stone Creamery",cuisine:"ice_cream",name:"Cold Stone Creamery"},countryCodes:["ng","us"],terms:["cold stone"],matchScore:2,suggestion:true},"amenity/ice_cream/D'Onofrio":{name:"D'Onofrio",icon:"fas-ice-cream",imageURL:"https://graph.facebook.com/DonofrioDOficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5203166",amenity:"ice_cream"},addTags:{amenity:"ice_cream",brand:"D'Onofrio","brand:wikidata":"Q5203166","brand:wikipedia":"es:D'Onofrio",cuisine:"ice_cream",name:"D'Onofrio"},countryCodes:["pe"],terms:[],matchScore:2,suggestion:true},"amenity/ice_cream/Freddo":{name:"Freddo",icon:"fas-ice-cream",imageURL:"https://graph.facebook.com/FreddoUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q28823999",amenity:"ice_cream"},addTags:{amenity:"ice_cream",brand:"Freddo","brand:wikidata":"Q28823999","brand:wikipedia":"es:Freddo",cuisine:"ice_cream",name:"Freddo"},terms:[],matchScore:2,suggestion:true},"amenity/ice_cream/Graeter's":{name:"Graeter's",icon:"fas-ice-cream",imageURL:"https://graph.facebook.com/Graeters/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5592430",amenity:"ice_cream"},addTags:{amenity:"ice_cream",brand:"Graeter's","brand:wikidata":"Q5592430","brand:wikipedia":"en:Graeter's",cuisine:"ice_cream",name:"Graeter's",takeaway:"yes"},countryCodes:["us"],terms:["greaters"],matchScore:2,suggestion:true},"amenity/ice_cream/Grido":{name:"Grido",icon:"fas-ice-cream",imageURL:"https://graph.facebook.com/GridoHelados/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5885724",amenity:"ice_cream"},addTags:{amenity:"ice_cream",brand:"Grido","brand:wikidata":"Q5885724","brand:wikipedia":"es:Grido Helado",cuisine:"ice_cream",name:"Grido"},countryCodes:["ar"],terms:["grido helado"],matchScore:2,suggestion:true},"amenity/ice_cream/La Michoacana":{name:"La Michoacana",icon:"fas-ice-cream",imageURL:"https://graph.facebook.com/LaMichoacana.sv/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17118857",amenity:"ice_cream"},addTags:{amenity:"ice_cream",brand:"La Michoacana","brand:wikidata":"Q17118857","brand:wikipedia":"en:Paletería La Michoacana",name:"La Michoacana"},countryCodes:["mx"],terms:["paleteria la michoacana"],matchScore:2,suggestion:true},"amenity/ice_cream/Marble Slab Creamery":{name:"Marble Slab Creamery",icon:"fas-ice-cream",imageURL:"https://graph.facebook.com/marbleslabcreamery/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17020087",amenity:"ice_cream"},addTags:{amenity:"ice_cream",brand:"Marble Slab Creamery","brand:wikidata":"Q17020087","brand:wikipedia":"en:Marble Slab Creamery",cuisine:"ice_cream",name:"Marble Slab Creamery"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"amenity/ice_cream/Menchie's":{name:"Menchie's",icon:"fas-ice-cream",imageURL:"https://graph.facebook.com/MyMenchies/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6816528",amenity:"ice_cream"},addTags:{amenity:"ice_cream",brand:"Menchie's","brand:wikidata":"Q6816528","brand:wikipedia":"en:Menchie's Frozen Yogurt",cuisine:"frozen_yogurt",name:"Menchie's"},countryCodes:["ae","bh","bs","ca","cn","gb","in","jp","kw","qa","sa","us"],terms:["menchie's frozen yoghurt","menchie's frozen yogurt"],matchScore:2,suggestion:true},"amenity/ice_cream/Ralph's Italian Ices":{name:"Ralph's Italian Ices",icon:"fas-ice-cream",imageURL:"https://graph.facebook.com/RalphsFamous/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62576909",amenity:"ice_cream"},addTags:{amenity:"ice_cream",brand:"Ralph's Italian Ices","brand:wikidata":"Q62576909",cuisine:"ice_cream",name:"Ralph's Italian Ices",official_name:"Ralph's Famous Italian Ices"},countryCodes:["us"],terms:["ralphs famous italian ices & ice cream","ralphs famous italian ices and ice cream","ralphs italian ice","ralphs italian ices & ice cream","ralphs italian ices and ice cream"],matchScore:2,suggestion:true},"amenity/ice_cream/Rita's Italian Ice":{name:"Rita's Italian Ice",icon:"fas-ice-cream",imageURL:"https://graph.facebook.com/RitasItalianIceCompany/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7336456",amenity:"ice_cream"},addTags:{amenity:"ice_cream",brand:"Rita's Italian Ice","brand:wikidata":"Q7336456","brand:wikipedia":"en:Rita's Italian Ice",cuisine:"ice_cream",name:"Rita's Italian Ice"},countryCodes:["us"],terms:["ritas","ritas water ice"],matchScore:2,suggestion:true},"amenity/ice_cream/Yogurtland":{name:"Yogurtland",icon:"fas-ice-cream",imageURL:"https://graph.facebook.com/yogurtland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q8054428",amenity:"ice_cream"},addTags:{amenity:"ice_cream",brand:"Yogurtland","brand:wikidata":"Q8054428","brand:wikipedia":"en:Yogurtland",cuisine:"frozen_yogurt",name:"Yogurtland",takeaway:"yes"},countryCodes:["ae","au","sg","th","us","ve"],terms:[],matchScore:2,suggestion:true},"amenity/ice_cream/sweetFrog":{name:"sweetFrog",icon:"fas-ice-cream",imageURL:"https://graph.facebook.com/sweetfrogfroyo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16952110",amenity:"ice_cream"},addTags:{amenity:"ice_cream",brand:"sweetFrog","brand:wikidata":"Q16952110","brand:wikipedia":"en:Sweet Frog",cuisine:"frozen_yogurt",name:"sweetFrog"},countryCodes:["us"],terms:["sweetfrog frozen yogurt","sweetfrog premium frozen yogurt"],matchScore:2,suggestion:true},"amenity/ice_cream/サーティワンアイスクリーム":{name:"サーティワンアイスクリーム",icon:"fas-ice-cream",imageURL:"https://graph.facebook.com/baskinrobbinsUS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q584601",amenity:"ice_cream"},addTags:{amenity:"ice_cream",brand:"バスキン・ロビンス","brand:en":"Baskin-Robbins","brand:ja":"バスキン・ロビンス","brand:wikidata":"Q584601","brand:wikipedia":"ja:バスキン・ロビンス",cuisine:"ice_cream",name:"サーティワンアイスクリーム","name:en":"Baskin-Robbins","name:ja":"サーティワンアイスクリーム"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/kindergarten/Children's Learning Adventure":{name:"Children's Learning Adventure",icon:"maki-school",imageURL:"https://graph.facebook.com/Childrenslearningadventure/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64821213",amenity:"kindergarten"},addTags:{after_school:"yes",amenity:"kindergarten",brand:"Children's Learning Adventure","brand:wikidata":"Q64821213","brand:wikipedia":"en:Children's Learning Adventure",fee:"yes","isced:level":"0",name:"Children's Learning Adventure",nursery:"yes",preschool:"yes",short_name:"CLA"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/kindergarten/Childtime":{name:"Childtime",icon:"maki-school",imageURL:"https://graph.facebook.com/Childtime/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64877793",amenity:"kindergarten"},addTags:{amenity:"kindergarten",brand:"Childtime","brand:wikidata":"Q64877793",fee:"yes","isced:level":"0",name:"Childtime",nursery:"yes",preschool:"yes"},countryCodes:["us"],terms:["childtime learning center","childtime learning centers"],matchScore:2,suggestion:true},"amenity/kindergarten/KinderCare":{name:"KinderCare",icon:"maki-school",imageURL:"https://graph.facebook.com/kindercare/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6410551",amenity:"kindergarten"},addTags:{after_school:"yes",alt_name:"KinderCare Learning Center",amenity:"kindergarten",brand:"KinderCare","brand:wikidata":"Q6410551","brand:wikipedia":"en:KinderCare Learning Centers",fee:"yes","isced:level":"0",max_age:"12",min_age:"6 weeks",name:"KinderCare",nursery:"yes",preschool:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/kindergarten/La Petite Academy":{name:"La Petite Academy",icon:"maki-school",imageURL:"https://graph.facebook.com/LaPetiteAcademy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64877784",amenity:"kindergarten"},addTags:{amenity:"kindergarten",brand:"La Petite Academy","brand:wikidata":"Q64877784",fee:"yes","isced:level":"0",name:"La Petite Academy",nursery:"yes",preschool:"yes"},countryCodes:["us"],terms:["la petite"],matchScore:2,suggestion:true},"amenity/kindergarten/New Horizon Academy":{name:"New Horizon Academy",icon:"maki-school",imageURL:"https://pbs.twimg.com/profile_images/778681004206592001/ZQF3Eurh_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q64821306",amenity:"kindergarten"},addTags:{after_school:"yes",amenity:"kindergarten",brand:"New Horizon Academy","brand:wikidata":"Q64821306",fee:"yes","isced:level":"0",name:"New Horizon Academy",nursery:"yes",preschool:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/kindergarten/The Children's Courtyard":{name:"The Children's Courtyard",icon:"maki-school",imageURL:"https://graph.facebook.com/ChildrensCourtyard/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64877852",amenity:"kindergarten"},addTags:{amenity:"kindergarten",brand:"The Children's Courtyard","brand:wikidata":"Q64877852",fee:"yes","isced:level":"0",name:"The Children's Courtyard",nursery:"yes",preschool:"yes"},countryCodes:["us"],terms:["children's courtyard"],matchScore:2,suggestion:true},"amenity/kindergarten/Tutor Time":{name:"Tutor Time",icon:"maki-school",imageURL:"https://graph.facebook.com/TutorTime/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64877826",amenity:"kindergarten"},addTags:{amenity:"kindergarten",brand:"Tutor Time","brand:wikidata":"Q64877826",fee:"yes","isced:level":"0",name:"Tutor Time",nursery:"yes",preschool:"yes"},countryCodes:["us"],terms:["tutor time child care","tutor time child care learning center","tutor time learning center","tutor time learning centers"],matchScore:2,suggestion:true},"amenity/money_transfer/Express Union":{name:"Express Union",icon:"maki-bank",imageURL:"https://graph.facebook.com/ExpressUnionFinance/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3062276",amenity:"money_transfer"},addTags:{amenity:"money_transfer",brand:"Express Union","brand:wikidata":"Q3062276","brand:wikipedia":"fr:Express Union",name:"Express Union"},countryCodes:["td"],terms:[],matchScore:2,suggestion:true},"amenity/money_transfer/MoneyGram":{name:"MoneyGram",icon:"maki-bank",imageURL:"https://graph.facebook.com/moneygram/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1944412",amenity:"money_transfer"},addTags:{amenity:"money_transfer",brand:"MoneyGram","brand:wikidata":"Q1944412","brand:wikipedia":"en:MoneyGram",name:"MoneyGram"},countryCodes:["de","fr","gr"],terms:[],matchScore:2,suggestion:true},"amenity/money_transfer/Orange Money":{name:"Orange Money",icon:"maki-bank",imageURL:"https://graph.facebook.com/orange/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16668220",amenity:"money_transfer"},addTags:{amenity:"money_transfer",brand:"Orange Money","brand:wikidata":"Q16668220","brand:wikipedia":"en:Orange Money",name:"Orange Money"},countryCodes:["ml"],terms:[],matchScore:2,suggestion:true},"amenity/money_transfer/Western Union":{name:"Western Union",icon:"maki-bank",imageURL:"https://graph.facebook.com/WesternUnion/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q861042",amenity:"money_transfer"},addTags:{amenity:"money_transfer",brand:"Western Union","brand:wikidata":"Q861042","brand:wikipedia":"en:Western Union",name:"Western Union"},terms:[],matchScore:2,suggestion:true},"amenity/parking/SP+":{name:"SP+",icon:"maki-car",imageURL:"https://graph.facebook.com/sppluscorp/picture?type=large",geometry:["point","vertex","area"],tags:{"brand:wikidata":"Q7598289",amenity:"parking"},addTags:{alt_name:"SP Plus",amenity:"parking",brand:"SP+","brand:wikidata":"Q7598289","brand:wikipedia":"en:SP Plus Corporation",fee:"yes",name:"SP+"},countryCodes:["ca","us"],terms:["central parking","central parking system","standard parking"],matchScore:2,suggestion:true},"amenity/payment_centre/Abitab":{name:"Abitab",icon:"maki-bank",imageURL:"https://graph.facebook.com/Abitaboficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16488129",amenity:"payment_centre"},addTags:{amenity:"payment_centre",brand:"Abitab","brand:wikidata":"Q16488129","brand:wikipedia":"es:Abitab",name:"Abitab"},countryCodes:["uy"],terms:[],matchScore:2,suggestion:true},"amenity/payment_centre/Rapipago":{name:"Rapipago",icon:"maki-bank",imageURL:"https://graph.facebook.com/Rapipago/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6100413",amenity:"payment_centre"},addTags:{amenity:"payment_centre",brand:"Rapipago","brand:wikidata":"Q6100413","brand:wikipedia":"es:Rapipago",name:"Rapipago"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"amenity/payment_terminal/Qiwi":{name:"Qiwi",icon:"far-credit-card",imageURL:"https://graph.facebook.com/qiwirussia/picture?type=large",geometry:["point"],tags:{"brand:wikidata":"Q4047736",amenity:"payment_terminal"},addTags:{amenity:"payment_terminal",brand:"Qiwi","brand:wikidata":"Q4047736","brand:wikipedia":"en:Qiwi",name:"Qiwi"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/payment_terminal/ПриватБанк":{name:"ПриватБанк",icon:"far-credit-card",imageURL:"https://graph.facebook.com/privatbank/picture?type=large",geometry:["point"],tags:{"brand:wikidata":"Q1515015",amenity:"payment_terminal"},addTags:{amenity:"payment_terminal",brand:"ПриватБанк","brand:wikidata":"Q1515015","brand:wikipedia":"en:PrivatBank",name:"ПриватБанк"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"amenity/payment_terminal/Элекснет":{name:"Элекснет",icon:"far-credit-card",imageURL:"https://graph.facebook.com/elecsnet/picture?type=large",geometry:["point"],tags:{"brand:wikidata":"Q4530795",amenity:"payment_terminal"},addTags:{amenity:"payment_terminal",brand:"Элекснет","brand:wikidata":"Q4530795","brand:wikipedia":"ru:Элекснет",name:"Элекснет"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/36,6":{name:"36,6",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/apteka366/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q226889",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"36,6","brand:wikidata":"Q226889","brand:wikipedia":"ru:36,6 (аптечная сеть)",healthcare:"pharmacy",name:"36,6"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ru"],terms:["аптека 36,6"],matchScore:2,suggestion:true},"amenity/pharmacy/Amcal":{name:"Amcal",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/AmcalAustralia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63367373",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Amcal","brand:wikidata":"Q63367373",healthcare:"pharmacy",name:"Amcal"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["au"],terms:["amcal pharmacy"],matchScore:2,suggestion:true},"amenity/pharmacy/Apollo Pharmacy":{name:"Apollo Pharmacy",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/ApolloPharmacy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62562612",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Apollo Pharmacy","brand:wikidata":"Q62562612",healthcare:"pharmacy",name:"Apollo Pharmacy"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Apotek Hjärtat":{name:"Apotek Hjärtat",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/apotekhjartat/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10416114",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Apotek Hjärtat","brand:wikidata":"Q10416114","brand:wikipedia":"sv:Apotek Hjärtat",healthcare:"pharmacy",name:"Apotek Hjärtat"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["se"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Bartell Drugs":{name:"Bartell Drugs",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/BartellDrugs/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4865152",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Bartell Drugs","brand:wikidata":"Q4865152","brand:wikipedia":"en:Bartell Drugs",healthcare:"pharmacy",name:"Bartell Drugs"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Benavides":{name:"Benavides",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/FarmaciasBenavides/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5435613",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Benavides","brand:wikidata":"Q5435613","brand:wikipedia":"en:Farmacias Benavides",healthcare:"pharmacy",name:"Benavides"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["mx"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Benu":{name:"Benu",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/PharmaciesBENUSwitzerland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62562792",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Benu","brand:wikidata":"Q62562792",healthcare:"pharmacy",name:"Benu"},reference:{key:"amenity",value:"pharmacy"},terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Blooms The Chemist":{name:"Blooms The Chemist",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/BloomsTheChemistPharmacy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63367543",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Blooms The Chemist","brand:wikidata":"Q63367543",healthcare:"pharmacy",name:"Blooms The Chemist",shop:"chemist"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Boots":{name:"Boots",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/bootsuk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6123139",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Boots","brand:wikidata":"Q6123139","brand:wikipedia":"en:Boots UK",healthcare:"pharmacy",name:"Boots"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["gb"],terms:["boots pharmacy"],matchScore:2,suggestion:true},"amenity/pharmacy/Boticas y Salud":{name:"Boticas y Salud",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/844038768993601/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62563126",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Boticas y Salud","brand:wikidata":"Q62563126",healthcare:"pharmacy",name:"Boticas y Salud"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["pe"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Brookshire Brothers Pharmacy":{name:"Brookshire Brothers Pharmacy",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/BrookshireBros/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4975084",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Brookshire Brothers Pharmacy","brand:wikidata":"Q4975084","brand:wikipedia":"en:Brookshire Brothers",healthcare:"pharmacy",name:"Brookshire Brothers Pharmacy"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/CVS":{name:"CVS",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/CVS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2078880",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"CVS","brand:wikidata":"Q2078880","brand:wikipedia":"en:CVS Pharmacy",healthcare:"pharmacy",name:"CVS"},reference:{key:"amenity",value:"pharmacy"},terms:["cvs pharmacy"],matchScore:2,suggestion:true},"amenity/pharmacy/Camelia":{name:"Camelia",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/camelia.vaistine/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q15867413",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Camelia","brand:wikidata":"Q15867413","brand:wikipedia":"lt:Nemuno vaistinė",healthcare:"pharmacy",name:"Camelia"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["lt"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Catena":{name:"Catena",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/FarmaciaCatena/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q24035728",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Catena","brand:wikidata":"Q24035728","brand:wikipedia":"ro:Farmacia Catena",healthcare:"pharmacy",name:"Catena"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ro"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Chemist King Discount Pharmacy":{name:"Chemist King Discount Pharmacy",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/ChemistKingDiscountPharmacy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63367667",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Chemist King Discount Pharmacy","brand:wikidata":"Q63367667",healthcare:"pharmacy",name:"Chemist King Discount Pharmacy"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["au"],terms:["chemist king","chemist king discount pharmacies"],matchScore:2,suggestion:true},"amenity/pharmacy/Chemist Warehouse":{name:"Chemist Warehouse",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/ChemistWarehouse/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q48782120",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Chemist Warehouse","brand:wikidata":"Q48782120","brand:wikipedia":"en:Chemist Warehouse",healthcare:"pharmacy",name:"Chemist Warehouse"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["au","nz"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Clicks":{name:"Clicks",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/ClicksSouthAfrica/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62563622",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Clicks","brand:wikidata":"Q62563622",healthcare:"pharmacy",name:"Clicks"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["za"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Costco Pharmacy":{name:"Costco Pharmacy",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/Costco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q715583",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Costco Pharmacy","brand:wikidata":"Q715583","brand:wikipedia":"en:Costco",healthcare:"pharmacy",name:"Costco Pharmacy"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Cruz Azul":{name:"Cruz Azul",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/CruzAzul.Farmacias/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62108219",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Cruz Azul","brand:wikidata":"Q62108219",healthcare:"pharmacy",name:"Cruz Azul"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ec"],terms:["farmacias cruz azul"],matchScore:2,suggestion:true},"amenity/pharmacy/Cruz Verde":{name:"Cruz Verde",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/FarmaciasCruzVerde1/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5856071",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Cruz Verde","brand:wikidata":"Q5856071","brand:wikipedia":"es:Farmacias Cruz Verde",healthcare:"pharmacy",name:"Cruz Verde"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["cl"],terms:["farmacias cruz verde"],matchScore:2,suggestion:true},"amenity/pharmacy/Day Lewis Pharmacy":{name:"Day Lewis Pharmacy",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/DayLewisPharmacy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62563772",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Day Lewis Pharmacy","brand:wikidata":"Q62563772",healthcare:"pharmacy",name:"Day Lewis Pharmacy"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Dbam o Zdrowie":{name:"Dbam o Zdrowie",icon:"maki-pharmacy",imageURL:"https://pbs.twimg.com/profile_images/725613555530133504/f2lYAu0M_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q62563833",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Dbam o Zdrowie","brand:wikidata":"Q62563833",healthcare:"pharmacy",name:"Dbam o Zdrowie"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Dr. Max":{name:"Dr. Max",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/lekarnadrmax/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q56317371",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Dr. Max","brand:wikidata":"Q56317371","brand:wikipedia":"fr:Dr.Max",healthcare:"pharmacy",name:"Dr. Max"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["cz","pl","sk"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Droga Raia":{name:"Droga Raia",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/DrogaRaia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10357101",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Droga Raia","brand:wikidata":"Q10357101","brand:wikipedia":"pt:RaiaDrogasil",healthcare:"pharmacy",name:"Droga Raia"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Drogaria São Paulo":{name:"Drogaria São Paulo",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/DrogariaSaoPaulo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5308184",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Drogaria São Paulo","brand:wikidata":"Q5308184","brand:wikipedia":"en:Grupo DPSP",healthcare:"pharmacy",name:"Drogaria São Paulo"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Drogasil":{name:"Drogasil",icon:"maki-pharmacy",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FDrogazil.logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q5308185",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Drogasil","brand:wikidata":"Q5308185","brand:wikipedia":"pt:Drogasil",healthcare:"pharmacy",name:"Drogasil",wheelchair:"yes"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Duane Reade":{name:"Duane Reade",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/duanereade/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5310380",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Duane Reade","brand:wikidata":"Q5310380","brand:wikipedia":"en:Duane Reade",healthcare:"pharmacy",name:"Duane Reade"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Eurovaistinė":{name:"Eurovaistinė",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q267205",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Eurovaistinė","brand:wikidata":"Q267205","brand:wikipedia":"en:Euroapotheca",healthcare:"pharmacy",name:"Eurovaistinė"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["lt"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Extrafarma":{name:"Extrafarma",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/Extrafarma/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q20055480",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Extrafarma","brand:wikidata":"Q20055480","brand:wikipedia":"pt:Extrafarma",healthcare:"pharmacy",name:"Extrafarma"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Familiprix":{name:"Familiprix",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/Familiprix/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3064881",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Familiprix","brand:wikidata":"Q3064881","brand:wikipedia":"en:Familiprix",healthcare:"pharmacy",name:"Familiprix"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Farmacenter (Colombia)":{name:"Farmacenter (Colombia)",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/FarmacenterCo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62563928",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Farmacenter","brand:wikidata":"Q62563928",healthcare:"pharmacy",name:"Farmacenter"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["co"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Farmacia Benavides":{name:"Farmacia Benavides",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/FarmaciasBenavides/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5435613",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Farmacia Benavides","brand:wikidata":"Q5435613","brand:wikipedia":"en:Farmacias Benavides",healthcare:"pharmacy",name:"Farmacia Benavides"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["mx"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Farmacia Guadalajara":{name:"Farmacia Guadalajara",icon:"maki-pharmacy",imageURL:"https://pbs.twimg.com/profile_images/1748872266/avatar_Twitter_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q5435609",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Farmacia Guadalajara","brand:wikidata":"Q5435609","brand:wikipedia":"en:Farmacias Guadalajara",healthcare:"pharmacy",name:"Farmacia Guadalajara"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["mx"],terms:["farmacias guadalajara"],matchScore:2,suggestion:true},"amenity/pharmacy/Farmacias Ahumada":{name:"Farmacias Ahumada",icon:"maki-pharmacy",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FFarmacias%20ahumada.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q5856069",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Farmacias Ahumada","brand:wikidata":"Q5856069","brand:wikipedia":"es:Farmacias Ahumada",healthcare:"pharmacy",name:"Farmacias Ahumada"},reference:{key:"amenity",value:"pharmacy"},terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Farmacias Económicas (Ecuador)":{name:"Farmacias Económicas (Ecuador)",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/FarmaciasEconomicasEc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62108380",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Farmacias Económicas","brand:wikidata":"Q62108380",healthcare:"pharmacy",name:"Farmacias Económicas"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ec"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Farmacias Económicas (El Salvador)":{name:"Farmacias Económicas (El Salvador)",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/FarmaciasEconomicas/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62108397",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Farmacias Económicas","brand:wikidata":"Q62108397",healthcare:"pharmacy",name:"Farmacias Económicas"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["sv"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Farmacias Similares":{name:"Farmacias Similares",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/DrSimiChile/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62564610",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Farmacias Similares","brand:wikidata":"Q62564610",healthcare:"pharmacy",name:"Farmacias Similares"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["cl","gt","mx"],terms:["similares"],matchScore:2,suggestion:true},"amenity/pharmacy/Farmacias del Ahorro":{name:"Farmacias del Ahorro",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/FAhorro/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62086647",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Farmacias del Ahorro","brand:wikidata":"Q62086647",healthcare:"pharmacy",name:"Farmacias del Ahorro"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["mx"],terms:["farmacia del ahorro"],matchScore:2,suggestion:true},"amenity/pharmacy/Farmacias del Dr. Simi":{name:"Farmacias del Dr. Simi",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/DrSimiChile/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62564610",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Farmacias del Dr. Simi","brand:wikidata":"Q62564610",healthcare:"pharmacy",name:"Farmacias del Dr. Simi"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["cl","gt","mx"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Farmacity":{name:"Farmacity",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/Farmacity/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5856076",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Farmacity","brand:wikidata":"Q5856076","brand:wikipedia":"es:Farmacity",healthcare:"pharmacy",name:"Farmacity"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ra"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Farmahorro":{name:"Farmahorro",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/FarmahorroVe/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q20015002",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Farmahorro","brand:wikidata":"Q20015002","brand:wikipedia":"es:Farmahorro",healthcare:"pharmacy",name:"Farmahorro"},reference:{key:"amenity",value:"pharmacy"},terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Farmatodo":{name:"Farmatodo",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/farmatodovenezuela/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5856092",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Farmatodo","brand:wikidata":"Q5856092","brand:wikipedia":"es:Farmatodo",healthcare:"pharmacy",name:"Farmatodo"},reference:{key:"amenity",value:"pharmacy"},terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Felicia":{name:"Felicia",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/farmaciafelicia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62564805",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Felicia","brand:wikidata":"Q62564805",healthcare:"pharmacy",name:"Felicia"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["md"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Fybeca":{name:"Fybeca",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/fybeca/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62564822",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Fybeca","brand:wikidata":"Q62564822",healthcare:"pharmacy",name:"Fybeca"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ec"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Generika":{name:"Generika",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/GenerikaDrugstorePH/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62564876",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Generika","brand:wikidata":"Q62564876",healthcare:"pharmacy",name:"Generika"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ph"],terms:["generika drugstore"],matchScore:2,suggestion:true},"amenity/pharmacy/Gintarinė vaistinė":{name:"Gintarinė vaistinė",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/Gintarine.Vaistine/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q15857801",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Gintarinė vaistinė","brand:wikidata":"Q15857801","brand:wikipedia":"lt:Gintarinė vaistinė",healthcare:"pharmacy",name:"Gintarinė vaistinė"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["lt"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Guardian (Asia)":{name:"Guardian (Asia)",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/Guardianmy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63371124",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Guardian","brand:wikidata":"Q63371124",healthcare:"pharmacy",name:"Guardian"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["bn","id","kh","my","sg","vn"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Guardian (Australia)":{name:"Guardian (Australia)",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/GuardianAustralia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63367814",amenity:"pharmacy"},addTags:{brand:"Guardian","brand:wikidata":"Q63367814",healthcare:"pharmacy",name:"Guardian"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["au"],terms:["guardian pharmacies","guardian pharmacy"],matchScore:2,suggestion:true},"amenity/pharmacy/H-E-B Pharmacy":{name:"H-E-B Pharmacy",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/HEB/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q830621",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"H-E-B Pharmacy","brand:wikidata":"Q830621","brand:wikipedia":"en:H-E-B",healthcare:"pharmacy",name:"H-E-B Pharmacy"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Health Mart":{name:"Health Mart",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/HealthMart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5690597",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Health Mart","brand:wikidata":"Q5690597","brand:wikipedia":"en:Health Mart",healthcare:"pharmacy",name:"Health Mart"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["us"],terms:["health mart pharmacy"],matchScore:2,suggestion:true},"amenity/pharmacy/Hy-Vee Pharmacy":{name:"Hy-Vee Pharmacy",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/HyVee/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1639719",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Hy-Vee Pharmacy","brand:wikidata":"Q1639719","brand:wikipedia":"en:Hy-Vee",healthcare:"pharmacy",name:"Hy-Vee Pharmacy"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Inkafarma":{name:"Inkafarma",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/inkafarmaperu/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10997748",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Inkafarma","brand:wikidata":"Q10997748","brand:wikipedia":"es:Inkafarma",healthcare:"pharmacy",name:"Inkafarma"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["pe"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Jean Coutu":{name:"Jean Coutu",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/JeanCoutu/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3117457",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Jean Coutu","brand:wikidata":"Q3117457","brand:wikipedia":"en:Jean Coutu Group",healthcare:"pharmacy",name:"Jean Coutu"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Kimia Farma":{name:"Kimia Farma",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/KimiaFarmaCare/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11264892",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Kimia Farma","brand:wikidata":"Q11264892","brand:wikipedia":"en:Kimia Farma",healthcare:"pharmacy",name:"Kimia Farma"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["id"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Kinney Drugs":{name:"Kinney Drugs",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/kinneydrugs/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6414090",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Kinney Drugs","brand:wikidata":"Q6414090","brand:wikipedia":"en:Kinney Drugs",healthcare:"pharmacy",name:"Kinney Drugs"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Lloyds Pharmacy":{name:"Lloyds Pharmacy",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/lloydspharmacy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6662870",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Lloyds Pharmacy","brand:wikidata":"Q6662870","brand:wikipedia":"en:LloydsPharmacy",healthcare:"pharmacy",name:"Lloyds Pharmacy"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["be","gb","ie","im"],terms:["lloyds"],matchScore:2,suggestion:true},"amenity/pharmacy/London Drugs":{name:"London Drugs",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/LondonDrugs/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3258955",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"London Drugs","brand:wikidata":"Q3258955","brand:wikipedia":"en:London Drugs",healthcare:"pharmacy",name:"London Drugs"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Longs Drugs (Hawaii)":{name:"Longs Drugs (Hawaii)",icon:"maki-pharmacy",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLongs%20Drugs%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q16931196",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Longs Drugs","brand:wikidata":"Q16931196","brand:wikipedia":"en:Longs Drugs",healthcare:"pharmacy",name:"Longs Drugs",short_name:"Longs"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Mannings":{name:"Mannings",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/manningshongkong/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q13646560",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Mannings","brand:wikidata":"Q13646560","brand:wikipedia":"en:Mannings",healthcare:"pharmacy",name:"Mannings"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["cn","hk","mo"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Marc's Pharmacy":{name:"Marc's Pharmacy",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/MarcsStores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17080259",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Marc's","brand:wikidata":"Q17080259","brand:wikipedia":"en:Marc's",healthcare:"pharmacy",name:"Marc's Pharmacy"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Mercury Drug":{name:"Mercury Drug",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/mercurydrugph/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6818610",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Mercury Drug","brand:wikidata":"Q6818610","brand:wikipedia":"en:Mercury Drug",healthcare:"pharmacy",name:"Mercury Drug"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Mifarma":{name:"Mifarma",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/MifarmaPeru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62564998",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Mifarma","brand:wikidata":"Q62564998",healthcare:"pharmacy",name:"Mifarma"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["pe"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Multipharma":{name:"Multipharma",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/Multipharma.be/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62565018",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Multipharma","brand:wikidata":"Q62565018",healthcare:"pharmacy",name:"Multipharma"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["be"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Mēness aptieka":{name:"Mēness aptieka",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/MenessAptieka/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q57583051",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Mēness aptieka","brand:wikidata":"Q57583051",healthcare:"pharmacy",name:"Mēness aptieka"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["lv"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Pague Menos":{name:"Pague Menos",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/farmaciaspaguemenos/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7124466",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Pague Menos","brand:wikidata":"Q7124466","brand:wikipedia":"pt:Pague Menos",healthcare:"pharmacy",name:"Pague Menos"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["br"],terms:["farmácia pague menos"],matchScore:2,suggestion:true},"amenity/pharmacy/PharmaSave (Australia)":{name:"PharmaSave (Australia)",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/PharmasaveBrentfordSquare/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63367906",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"PharmaSave","brand:wikidata":"Q63367906",healthcare:"pharmacy",name:"PharmaSave"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Pharmacie Principale":{name:"Pharmacie Principale",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/PharmaciePrincipale/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1547749",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Pharmacie Principale","brand:wikidata":"Q1547749","brand:wikipedia":"fr:Groupe PP Holding",healthcare:"pharmacy",name:"Pharmacie Principale"},reference:{key:"amenity",value:"pharmacy"},terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Pharmacy 4 Less":{name:"Pharmacy 4 Less",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/pharmacy4less/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63367608",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Pharmacy 4 Less","brand:wikidata":"Q63367608",healthcare:"pharmacy",name:"Pharmacy 4 Less"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Pharmaprix":{name:"Pharmaprix",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/shoppersdrugmart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1820137",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Pharmaprix","brand:wikidata":"Q1820137","brand:wikipedia":"en:Shoppers Drug Mart",healthcare:"pharmacy",name:"Pharmaprix"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Pharmasave (Canada)":{name:"Pharmasave (Canada)",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/PharmasaveAtlantic/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17093822",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Pharmasave","brand:wikidata":"Q17093822","brand:wikipedia":"en:Pharmasave",healthcare:"pharmacy",name:"Pharmasave"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Priceline Pharmacy":{name:"Priceline Pharmacy",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/PricelineAustralia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7242652",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Priceline Pharmacy","brand:wikidata":"Q7242652","brand:wikipedia":"en:Priceline (Australia)",healthcare:"pharmacy",name:"Priceline Pharmacy"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["au"],terms:["priceline"],matchScore:2,suggestion:true},"amenity/pharmacy/Punto Farma (Colombia)":{name:"Punto Farma (Colombia)",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q62595271",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Punto Farma","brand:wikidata":"Q62595271",healthcare:"pharmacy",name:"Punto Farma"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["co"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Punto Farma (Honduras)":{name:"Punto Farma (Honduras)",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/FarmaciasPuntoFarma/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62595229",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Punto Farma","brand:wikidata":"Q62595229",healthcare:"pharmacy",name:"Punto Farma"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["hn"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Punto Farma (Paraguay)":{name:"Punto Farma (Paraguay)",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/Puntofarmapy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62595220",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Punto Farma","brand:wikidata":"Q62595220",healthcare:"pharmacy",name:"Punto Farma"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["py"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Rexall":{name:"Rexall",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/Rexall/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7319360",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Rexall","brand:wikidata":"Q7319360","brand:wikipedia":"en:Rexall",healthcare:"pharmacy",name:"Rexall"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Rite Aid":{name:"Rite Aid",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/riteaid/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3433273",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Rite Aid","brand:wikidata":"Q3433273","brand:wikipedia":"en:Rite Aid",healthcare:"pharmacy",name:"Rite Aid"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["us"],terms:["rite aid pharmacy"],matchScore:2,suggestion:true},"amenity/pharmacy/Rose Pharmacy":{name:"Rose Pharmacy",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/RosePharmacyInc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62663208",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Rose Pharmacy","brand:wikidata":"Q62663208",healthcare:"pharmacy",name:"Rose Pharmacy"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Rowlands Pharmacy":{name:"Rowlands Pharmacy",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/RowlandsPharmacy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62663235",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Rowlands Pharmacy","brand:wikidata":"Q62663235",healthcare:"pharmacy",name:"Rowlands Pharmacy"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/SalcoBrand":{name:"SalcoBrand",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/Salcobrand/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2877054",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"SalcoBrand","brand:wikidata":"Q2877054","brand:wikipedia":"es:Farmacias Salcobrand",healthcare:"pharmacy",name:"SalcoBrand"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["cl"],terms:["farmacias salcobrand"],matchScore:2,suggestion:true},"amenity/pharmacy/Sana Sana":{name:"Sana Sana",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/FarmaciasSanaSanaEc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62564499",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Sana Sana","brand:wikidata":"Q62564499",healthcare:"pharmacy",name:"Sana Sana"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ec"],terms:["farmacias sana sana"],matchScore:2,suggestion:true},"amenity/pharmacy/Sensiblu":{name:"Sensiblu",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/Sensiblu/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12740640",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Sensiblu","brand:wikidata":"Q12740640","brand:wikipedia":"ro:Sensiblu",healthcare:"pharmacy",name:"Sensiblu"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ro"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Shoppers Drug Mart":{name:"Shoppers Drug Mart",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/shoppersdrugmart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1820137",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Shoppers Drug Mart","brand:wikidata":"Q1820137","brand:wikipedia":"en:Shoppers Drug Mart",healthcare:"pharmacy",name:"Shoppers Drug Mart"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/South Star Drug":{name:"South Star Drug",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/southstardrugph/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7568544",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"South Star Drug","brand:wikidata":"Q7568544","brand:wikipedia":"en:South Star Drug",healthcare:"pharmacy",name:"South Star Drug"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Superdrug":{name:"Superdrug",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/Superdrug/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7643261",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Superdrug","brand:wikidata":"Q7643261","brand:wikipedia":"en:Superdrug",healthcare:"pharmacy",name:"Superdrug"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/São João":{name:"São João",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/farmaciassaojoao/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62663306",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"São João","brand:wikidata":"Q62663306",healthcare:"pharmacy",name:"São João"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/TGP":{name:"TGP",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/tgpthegenericspharmacy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61948677",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"The Generics Pharmacy","brand:wikidata":"Q61948677",healthcare:"pharmacy",name:"TGP",official_name:"The Generics Pharmacy"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/TerryWhite Chemmart":{name:"TerryWhite Chemmart",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/terrywhitechemmart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q24089773",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"TerryWhite Chemmart","brand:wikidata":"Q24089773","brand:wikipedia":"en:Terry White Chemmart",healthcare:"pharmacy",name:"TerryWhite Chemmart"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["au"],terms:["terrywhite","terrywhite chemist","terrywhite chemists"],matchScore:2,suggestion:true},"amenity/pharmacy/UFS":{name:"UFS",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/ufsdispensaries/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63367573",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"UFS","brand:wikidata":"Q63367573",healthcare:"pharmacy",name:"UFS"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["au"],terms:["ufs dispensaries"],matchScore:2,suggestion:true},"amenity/pharmacy/Unichem Pharmacy":{name:"Unichem Pharmacy",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/UnichemNZ/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62663379",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Unichem Pharmacy","brand:wikidata":"Q62663379",healthcare:"pharmacy",name:"Unichem Pharmacy"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["nz"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Uniprix":{name:"Uniprix",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/uniprix/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q683265",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Uniprix","brand:wikidata":"Q683265","brand:wikipedia":"en:Uniprix",healthcare:"pharmacy",name:"Uniprix"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Walgreens":{name:"Walgreens",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/walgreens/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1591889",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Walgreens","brand:wikidata":"Q1591889","brand:wikipedia":"en:Walgreens",healthcare:"pharmacy",name:"Walgreens"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["us"],terms:["walgreens pharmacy"],matchScore:2,suggestion:true},"amenity/pharmacy/Walmart Pharmacy":{name:"Walmart Pharmacy",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/walmart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q483551",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"en:Walmart",healthcare:"pharmacy",name:"Walmart Pharmacy"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Watsons":{name:"Watsons",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/WatsonsPH/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7974785",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Watsons","brand:wikidata":"Q7974785","brand:wikipedia":"en:Watsons",healthcare:"pharmacy",name:"Watsons"},reference:{key:"amenity",value:"pharmacy"},terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Well Pharmacy":{name:"Well Pharmacy",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/PharmacyWell/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7726524",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Well Pharmacy","brand:wikidata":"Q7726524","brand:wikipedia":"en:Well Pharmacy",healthcare:"pharmacy",name:"Well Pharmacy"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["gb"],terms:["well"],matchScore:2,suggestion:true},"amenity/pharmacy/Ziko Apteka":{name:"Ziko Apteka",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/ZikoUrodaiZdrowie/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63432892",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Ziko Apteka","brand:wikidata":"Q63432892",healthcare:"pharmacy",name:"Ziko Apteka",short_name:"Ziko"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/А5":{name:"А5",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/apteka5/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62663476",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"А5","brand:wikidata":"Q62663476",healthcare:"pharmacy",name:"А5"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Бережная аптека":{name:"Бережная аптека",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/BereznayaApteka/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62664194",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Бережная аптека","brand:wikidata":"Q62664194",healthcare:"pharmacy",name:"Бережная аптека"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Ригла":{name:"Ригла",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/rigla.ru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4394431",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Ригла","brand:wikidata":"Q4394431","brand:wikipedia":"ru:Ригла",healthcare:"pharmacy",name:"Ригла"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/סופר-פארם":{name:"סופר-פארם",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/super.pharm.co.il/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q13220217",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"סופר-פארם","brand:he":"סופר-פארם","brand:wikidata":"Q13220217","brand:wikipedia":"en:Super-Pharm",healthcare:"pharmacy",name:"סופר-פארם","name:he":"סופר-פארם"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/くすりの福太郎":{name:"くすりの福太郎",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/kusurinofukutaro/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17214460",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"くすりの福太郎","brand:en":"Kusurino FUKUTARO","brand:ja":"くすりの福太郎","brand:wikidata":"Q17214460","brand:wikipedia":"ja:くすりの福太郎",healthcare:"pharmacy",name:"くすりの福太郎","name:en":"Kusurino Fukutaro","name:ja":"くすりの福太郎"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/ウェルパーク":{name:"ウェルパーク",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q11288610",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"ウェルパーク","brand:ja":"ウェルパーク","brand:wikidata":"Q11288610","brand:wikipedia":"ja:ウェルパーク",healthcare:"pharmacy",name:"ウェルパーク","name:en":"Welpark","name:ja":"ウェルパーク"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/ウエルシア":{name:"ウエルシア",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/WelciaBHG.SG/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11288684",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"ウエルシア","brand:en":"Welcia","brand:ja":"ウエルシア","brand:wikidata":"Q11288684","brand:wikipedia":"ja:ウエルシアホールディングス",healthcare:"pharmacy",name:"ウエルシア","name:en":"Welcia","name:ja":"ウエルシア"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/ウエルシア薬局":{name:"ウエルシア薬局",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q11288687",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"ウエルシア薬局","brand:en":"Welcia Yakkyoku","brand:ja":"ウエルシア薬局","brand:wikidata":"Q11288687","brand:wikipedia":"ja:ウエルシア薬局",healthcare:"pharmacy",name:"ウエルシア薬局","name:en":"Welcia Yakkyoku","name:ja":"ウエルシア薬局"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/カワチ薬品":{name:"カワチ薬品",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q11295397",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"カワチ薬品","brand:en":"Cawachi","brand:ja":"カワチ薬品","brand:wikidata":"Q11295397","brand:wikipedia":"ja:カワチ薬品",healthcare:"pharmacy",name:"カワチ薬品","name:en":"Cawachi","name:ja":"カワチ薬品"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/キリン堂":{name:"キリン堂",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q11297751",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"キリン堂","brand:en":"Kirindo","brand:ja":"キリン堂","brand:wikidata":"Q11297751","brand:wikipedia":"ja:キリン堂",healthcare:"pharmacy",name:"キリン堂","name:en":"Kirindo","name:ja":"キリン堂"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/クリエイト":{name:"クリエイト",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q11299163",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"クリエイト","brand:en":"Create","brand:ja":"クリエイト","brand:wikidata":"Q11299163","brand:wikipedia":"ja:クリエイトSDホールディングス",healthcare:"pharmacy",name:"クリエイト","name:en":"Create","name:ja":"クリエイト"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/ココカラファイン":{name:"ココカラファイン",icon:"maki-pharmacy",imageURL:"https://pbs.twimg.com/profile_images/1050257672753229825/lhBcsYat_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q11301948",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"ココカラファイン","brand:ja":"ココカラファイン","brand:wikidata":"Q11301948","brand:wikipedia":"ja:ココカラファイン",healthcare:"pharmacy",name:"ココカラファイン","name:en":"Cocokara Fine","name:ja":"ココカラファイン"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/サンドラッグ":{name:"サンドラッグ",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q11305867",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"サンドラッグ","brand:ja":"サンドラッグ","brand:wikidata":"Q11305867","brand:wikipedia":"ja:サンドラッグ",healthcare:"pharmacy",name:"サンドラッグ","name:en":"Sundrug","name:ja":"サンドラッグ"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/スギ薬局":{name:"スギ薬局",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q11311460",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"スギ薬局","brand:en":"Sugi Pharmacy","brand:ja":"スギ薬局","brand:wikidata":"Q11311460","brand:wikipedia":"ja:スギ薬局",healthcare:"pharmacy",name:"スギ薬局","name:en":"Sugi Pharmacy","name:ja":"スギ薬局"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/セイジョー":{name:"セイジョー",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q11314133",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"セイジョー","brand:en":"Seijo","brand:ja":"セイジョー","brand:wikidata":"Q11314133","brand:wikipedia":"ja:セイジョー",healthcare:"pharmacy",name:"セイジョー","name:en":"Seijo","name:ja":"セイジョー"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/ダイコクドラッグ":{name:"ダイコクドラッグ",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q11316754",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"ダイコクドラッグ","brand:en":"Daikoku Drug","brand:ja":"ダイコクドラッグ","brand:wikidata":"Q11316754","brand:wikipedia":"ja:ダイコク",healthcare:"pharmacy",name:"ダイコクドラッグ","name:en":"Daikoku Drug","name:ja":"ダイコクドラッグ"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/ツルハドラッグ":{name:"ツルハドラッグ",icon:"maki-pharmacy",imageURL:"https://pbs.twimg.com/profile_images/1061863510546640898/j9crJ6gs_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q11318826",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"ツルハドラッグ","brand:en":"Tsuruha","brand:ja":"ツルハドラッグ","brand:wikidata":"Q11318826","brand:wikipedia":"ja:ツルハ",healthcare:"pharmacy",name:"ツルハドラッグ","name:en":"Tsuruha","name:ja":"ツルハドラッグ"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/トモズ":{name:"トモズ",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q7820097",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"トモズ","brand:en":"Tomod's","brand:ja":"トモズ","brand:wikidata":"Q7820097","brand:wikipedia":"ja:トモズ",healthcare:"pharmacy",name:"トモズ","name:en":"Tomod's","name:ja":"トモズ"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["jp"],terms:["トモズエキスプレス"],matchScore:2,suggestion:true},"amenity/pharmacy/マツモトキヨシ":{name:"マツモトキヨシ",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q8014776",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"マツモトキヨシ","brand:en":"Matsukiyo","brand:ja":"マツモトキヨシ","brand:wikidata":"Q8014776","brand:wikipedia":"ja:マツモトキヨシ",healthcare:"pharmacy",name:"マツモトキヨシ","name:en":"Matsukiyo","name:ja":"マツモトキヨシ"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/post_box/Canada Post":{name:"Canada Post",icon:"temaki-post_box",imageURL:"https://graph.facebook.com/canadapost/picture?type=large",geometry:["point","vertex"],tags:{"brand:wikidata":"Q1032001",amenity:"post_box"},addTags:{amenity:"post_box",brand:"Canada Post","brand:wikidata":"Q1032001","brand:wikipedia":"en:Canada Post",name:"Canada Post"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/post_box/Deutsche Post":{name:"Deutsche Post",icon:"temaki-post_box",imageURL:"https://graph.facebook.com/deutschepost/picture?type=large",geometry:["point","vertex"],tags:{"brand:wikidata":"Q157645",amenity:"post_box"},addTags:{amenity:"post_box",brand:"Deutsche Post","brand:wikidata":"Q157645","brand:wikipedia":"en:Deutsche Post",name:"Deutsche Post"},countryCodes:["de"],terms:["deutsche post ag"],matchScore:2,suggestion:true},"amenity/post_box/FedEx":{name:"FedEx",icon:"temaki-post_box",imageURL:"https://graph.facebook.com/FedEx/picture?type=large",geometry:["point","vertex"],tags:{"brand:wikidata":"Q459477",amenity:"post_box"},addTags:{amenity:"post_box",brand:"FedEx","brand:wikidata":"Q459477","brand:wikipedia":"en:FedEx",name:"FedEx"},terms:[],matchScore:2,suggestion:true},"amenity/post_box/UPS":{name:"UPS",icon:"temaki-post_box",imageURL:"https://graph.facebook.com/ups/picture?type=large",geometry:["point","vertex"],tags:{"brand:wikidata":"Q155026",amenity:"post_box"},addTags:{amenity:"post_box",brand:"UPS","brand:wikidata":"Q155026","brand:wikipedia":"en:United Parcel Service",name:"UPS"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"amenity/post_box/USPS":{name:"USPS",icon:"temaki-post_box",imageURL:"https://graph.facebook.com/USPS/picture?type=large",geometry:["point","vertex"],tags:{"brand:wikidata":"Q668687",amenity:"post_box"},addTags:{amenity:"post_box",brand:"USPS","brand:wikidata":"Q668687","brand:wikipedia":"en:United States Postal Service",name:"USPS"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/Australia Post":{name:"Australia Post",icon:"maki-post",imageURL:"https://graph.facebook.com/australiapost/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1142936",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Australia Post","brand:wikidata":"Q1142936","brand:wikipedia":"en:Australia Post",name:"Australia Post"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/CTT":{name:"CTT",icon:"maki-post",imageURL:"https://graph.facebook.com/109452512407680/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q909429",amenity:"post_office"},addTags:{amenity:"post_office",brand:"CTT","brand:wikidata":"Q909429","brand:wikipedia":"en:CTT (Macau)",name:"CTT"},countryCodes:["mo"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/Canada Post":{name:"Canada Post",icon:"maki-post",imageURL:"https://graph.facebook.com/canadapost/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1032001",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Canada Post","brand:wikidata":"Q1032001","brand:wikipedia":"en:Canada Post",name:"Canada Post"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/Correios":{name:"Correios",icon:"maki-post",imageURL:"https://graph.facebook.com/correios/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3375004",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Correios","brand:wikidata":"Q3375004","brand:wikipedia":"en:Correios",name:"Correios"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/Correo Argentino":{name:"Correo Argentino",icon:"maki-post",imageURL:"https://graph.facebook.com/CorreoOficialSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4036566",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Correo Argentino","brand:wikidata":"Q4036566","brand:wikipedia":"en:Correo Argentino",name:"Correo Argentino"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/Correos de Chile":{name:"Correos de Chile",icon:"maki-post",imageURL:"https://graph.facebook.com/correoschile/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5172893",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Correos de Chile","brand:wikidata":"Q5172893","brand:wikipedia":"en:Correos de Chile",name:"Correos de Chile"},countryCodes:["cl"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/Correos de Costa Rica":{name:"Correos de Costa Rica",icon:"maki-post",imageURL:"https://graph.facebook.com/CorreosdeCostaRica/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5172894",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Correos de Costa Rica","brand:wikidata":"Q5172894","brand:wikipedia":"en:Correos de Costa Rica",name:"Correos de Costa Rica"},countryCodes:["cr"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/Correos de México":{name:"Correos de México",icon:"maki-post",imageURL:"https://graph.facebook.com/CorreosdeMexico.Mexpost/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5172898",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Correos de México","brand:wikidata":"Q5172898","brand:wikipedia":"en:Correos de México",name:"Correos de México"},countryCodes:["mx"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/DHL":{name:"DHL",icon:"maki-post",imageURL:"https://graph.facebook.com/dhl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q489815",amenity:"post_office"},addTags:{amenity:"post_office",brand:"DHL","brand:wikidata":"Q489815","brand:wikipedia":"en:DHL Express",name:"DHL"},terms:["dhl paketshop"],matchScore:2,suggestion:true},"amenity/post_office/DPD Paketshop":{name:"DPD Paketshop",icon:"maki-post",imageURL:"https://graph.facebook.com/350375105088695/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q541030",amenity:"post_office"},addTags:{amenity:"post_office",brand:"DPD Paketshop","brand:wikidata":"Q541030","brand:wikipedia":"en:DPDgroup",name:"DPD Paketshop"},countryCodes:["at","de","pl"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/Deutsche Post":{name:"Deutsche Post",icon:"maki-post",imageURL:"https://graph.facebook.com/deutschepost/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q157645",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Deutsche Post","brand:wikidata":"Q157645","brand:wikipedia":"en:Deutsche Post",name:"Deutsche Post"},countryCodes:["de"],terms:["deutsche post ag","deutsche post filiale"],matchScore:2,suggestion:true},"amenity/post_office/Fancourier":{name:"Fancourier",icon:"maki-post",imageURL:"https://graph.facebook.com/FANCourier/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12727984",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Fancourier","brand:wikidata":"Q12727984","brand:wikipedia":"ro:FAN Courier Express",name:"Fancourier"},countryCodes:["ro"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/FedEx":{name:"FedEx",icon:"maki-post",imageURL:"https://graph.facebook.com/FedEx/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q459477",amenity:"post_office"},addTags:{amenity:"post_office",brand:"FedEx","brand:wikidata":"Q459477","brand:wikipedia":"en:FedEx",name:"FedEx"},terms:[],matchScore:2,suggestion:true},"amenity/post_office/Hermes Paketshop":{name:"Hermes Paketshop",icon:"maki-post",imageURL:"https://graph.facebook.com/Hermesparcels/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1613532",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Hermes Paketshop","brand:wikidata":"Q1613532","brand:wikipedia":"en:Hermes Group",name:"Hermes Paketshop"},countryCodes:["de"],terms:["hermes"],matchScore:2,suggestion:true},"amenity/post_office/LBC":{name:"LBC",icon:"maki-post",imageURL:"https://graph.facebook.com/LBCexpress/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17075584",amenity:"post_office"},addTags:{amenity:"post_office",brand:"LBC","brand:wikidata":"Q17075584","brand:wikipedia":"en:LBC Express",name:"LBC"},countryCodes:["ph"],terms:["lbc express"],matchScore:2,suggestion:true},"amenity/post_office/La Poste":{name:"La Poste",icon:"maki-post",imageURL:"https://graph.facebook.com/laposte/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q373724",amenity:"post_office"},addTags:{amenity:"post_office",brand:"La Poste","brand:wikidata":"Q373724","brand:wikipedia":"fr:La Poste (entreprise française)",name:"La Poste"},terms:[],matchScore:2,suggestion:true},"amenity/post_office/MRW":{name:"MRW",icon:"maki-post",imageURL:"https://graph.facebook.com/mrwespana/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q23767821",amenity:"post_office"},addTags:{amenity:"post_office",brand:"MRW","brand:wikidata":"Q23767821","brand:wikipedia":"es:MRW",name:"MRW"},terms:[],matchScore:2,suggestion:true},"amenity/post_office/Oficina de Correos":{name:"Oficina de Correos",icon:"maki-post",imageURL:"https://graph.facebook.com/correos.es/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q776605",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Oficina de Correos","brand:wikidata":"Q776605","brand:wikipedia":"es:Correos (España)",name:"Oficina de Correos"},terms:["correos"],matchScore:2,suggestion:true},"amenity/post_office/Poczta Polska":{name:"Poczta Polska",icon:"maki-post",imageURL:"https://graph.facebook.com/pocztapolska/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q168833",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Poczta Polska","brand:wikidata":"Q168833","brand:wikipedia":"pl:Poczta Polska",name:"Poczta Polska"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/PostalAnnex":{name:"PostalAnnex",icon:"maki-post",imageURL:"https://graph.facebook.com/PostalAnnex/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61960357",amenity:"post_office"},addTags:{amenity:"post_office",brand:"PostalAnnex","brand:wikidata":"Q61960357",name:"PostalAnnex"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/Poste Italiane":{name:"Poste Italiane",icon:"maki-post",imageURL:"https://graph.facebook.com/PosteItaliane/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q495026",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Poste Italiane","brand:wikidata":"Q495026","brand:wikipedia":"en:Poste italiane",name:"Poste Italiane"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/Serpost":{name:"Serpost",icon:"maki-post",imageURL:"https://graph.facebook.com/428188863953059/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q19521863",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Serpost","brand:wikidata":"Q19521863","brand:wikipedia":"es:Servicios Postales del Perú",name:"Serpost"},countryCodes:["pe"],terms:["servicios postales del perú"],matchScore:2,suggestion:true},"amenity/post_office/Slovenská pošta":{name:"Slovenská pošta",icon:"maki-post",imageURL:"https://graph.facebook.com/slovenskaposta/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1191849",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Slovenská pošta","brand:wikidata":"Q1191849","brand:wikipedia":"en:Slovenská pošta",name:"Slovenská pošta"},countryCodes:["sk"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/The UPS Store":{name:"The UPS Store",icon:"maki-post",imageURL:"https://graph.facebook.com/theupsstore/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7771029",amenity:"post_office"},addTags:{amenity:"post_office",brand:"The UPS Store","brand:wikidata":"Q7771029","brand:wikipedia":"en:The UPS Store",name:"The UPS Store",short_name:"UPS"},countryCodes:["ca","us"],terms:["ups store"],matchScore:2,suggestion:true},"amenity/post_office/United States Post Office":{name:"United States Post Office",icon:"maki-post",imageURL:"https://graph.facebook.com/USPS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q668687",amenity:"post_office"},addTags:{amenity:"post_office",brand:"United States Post Office","brand:wikidata":"Q668687","brand:wikipedia":"en:United States Postal Service",name:"United States Post Office"},countryCodes:["us"],terms:["united states postal service","us post office","us postal service","usps"],matchScore:2,suggestion:true},"amenity/post_office/ΕΛΤΑ":{name:"ΕΛΤΑ",icon:"maki-post",imageURL:"https://graph.facebook.com/HellenicPostELTA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1275135",amenity:"post_office"},addTags:{amenity:"post_office",brand:"ΕΛΤΑ","brand:wikidata":"Q1275135","brand:wikipedia":"el:Ελληνικά Ταχυδρομεία",name:"ΕΛΤΑ"},countryCodes:["gr"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/Белпошта":{name:"Белпошта",icon:"maki-post",imageURL:"https://graph.facebook.com/belpost.by/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2662336",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Белпошта","brand:be":"Белпошта","brand:en":"Belposhta","brand:ru":"Белпочта","brand:wikidata":"Q2662336","brand:wikipedia":"be:Белпошта",name:"Белпошта","name:be":"Белпошта","name:en":"Belposhta","name:ru":"Белпочта"},countryCodes:["by"],terms:["белпочта"],matchScore:2,suggestion:true},"amenity/post_office/Казпочта":{name:"Казпочта",icon:"maki-post",imageURL:"https://graph.facebook.com/Kazpost/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q746263",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Казпочта","brand:wikidata":"Q746263","brand:wikipedia":"ru:Казпочта",name:"Казпочта"},countryCodes:["kz"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/Нова Пошта":{name:"Нова Пошта",icon:"maki-post",imageURL:"https://graph.facebook.com/nova.poshta.official/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12133863",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Нова Пошта","brand:wikidata":"Q12133863","brand:wikipedia":"uk:Нова пошта",name:"Нова Пошта"},countryCodes:["ua"],terms:["Нова Пошта №1","Нова Пошта №2","Нова Пошта №3","Нова Пошта №4"],matchScore:2,suggestion:true},"amenity/post_office/Почта России":{name:"Почта России",icon:"maki-post",imageURL:"https://graph.facebook.com/ruspost/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1502763",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Почта России","brand:wikidata":"Q1502763","brand:wikipedia":"ru:Почта России",name:"Почта России"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/СДЭК":{name:"СДЭК",icon:"maki-post",imageURL:"https://graph.facebook.com/edostavka/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q28665980",amenity:"post_office"},addTags:{amenity:"post_office",brand:"СДЭК","brand:wikidata":"Q28665980","brand:wikipedia":"ru:СДЭК",name:"СДЭК"},countryCodes:["ru","ua"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/Укрпошта":{name:"Укрпошта",icon:"maki-post",imageURL:"https://graph.facebook.com/ukrposhta/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2470783",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Укрпошта","brand:wikidata":"Q2470783","brand:wikipedia":"en:Ukrposhta",name:"Укрпошта"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/中国邮政":{name:"中国邮政",icon:"maki-post",geometry:["point","area"],tags:{"brand:wikidata":"Q1066476",amenity:"post_office"},addTags:{amenity:"post_office",brand:"中国邮政","brand:en":"China Post","brand:wikidata":"Q1066476","brand:wikipedia":"en:China Post",name:"中国邮政","name:en":"China Post"},countryCodes:["cn"],terms:[],matchScore:2,suggestion:true},"amenity/prep_school/Huntington Learning Center":{name:"Huntington Learning Center",icon:"temaki-school",imageURL:"https://graph.facebook.com/HuntingtonHelps/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5945399",amenity:"prep_school"},addTags:{amenity:"prep_school",brand:"Huntington Learning Center","brand:wikidata":"Q5945399","brand:wikipedia":"en:Huntington Learning Center",name:"Huntington Learning Center"},countryCodes:["us"],terms:["huntington"],matchScore:2,suggestion:true},"amenity/prep_school/KUMON (Japan)":{name:"KUMON (Japan)",icon:"temaki-school",imageURL:"https://graph.facebook.com/kumon/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q142054",amenity:"prep_school"},addTags:{amenity:"prep_school",brand:"KUMON","brand:wikidata":"Q142054","brand:wikipedia":"ja:日本公文教育研究会",name:"KUMON","name:ja":"公文","name:ja-Hira":"くもん","name:ja-Latn":"KUMON"},countryCodes:["jp"],terms:["くもん","公文"],matchScore:2,suggestion:true},"amenity/prep_school/Kumon (International)":{name:"Kumon (International)",icon:"temaki-school",imageURL:"https://graph.facebook.com/kumon/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q142054",amenity:"prep_school"},addTags:{amenity:"prep_school",brand:"Kumon","brand:wikidata":"Q142054","brand:wikipedia":"en:Kumon",name:"Kumon"},countryCodes:[],terms:["kumon learning center"],matchScore:2,suggestion:true},"amenity/prep_school/Mathnasium":{name:"Mathnasium",icon:"temaki-school",imageURL:"https://graph.facebook.com/mathnasium/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6787302",amenity:"prep_school"},addTags:{amenity:"prep_school",brand:"Mathnasium","brand:wikidata":"Q6787302","brand:wikipedia":"en:Mathnasium",name:"Mathnasium"},countryCodes:["us"],terms:["mathnasium learning center"],matchScore:2,suggestion:true},"amenity/prep_school/Russian School of Mathematics":{name:"Russian School of Mathematics",icon:"temaki-school",imageURL:"https://graph.facebook.com/RussianMath/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7382122",amenity:"prep_school"},addTags:{amenity:"prep_school",brand:"Russian School of Mathematics","brand:wikidata":"Q7382122","brand:wikipedia":"en:Russian School of Mathematics",name:"Russian School of Mathematics"},countryCodes:["us"],terms:["rsm","russian school of math"],matchScore:2,suggestion:true},"amenity/prep_school/Sylvan":{name:"Sylvan",icon:"temaki-school",imageURL:"https://graph.facebook.com/SylvanLearning/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7660663",amenity:"prep_school"},addTags:{alt_name:"Sylvan Learning Center",amenity:"prep_school",brand:"Sylvan","brand:wikidata":"Q7660663","brand:wikipedia":"en:Sylvan Learning",name:"Sylvan"},countryCodes:["us"],terms:["sylvan learning"],matchScore:2,suggestion:true},"amenity/public_bookcase/Little Free Library":{name:"Little Free Library",icon:"maki-library",imageURL:"https://graph.facebook.com/LittleFreeLibrary/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6650101",amenity:"public_bookcase"},addTags:{amenity:"public_bookcase",brand:"Little Free Library","brand:wikidata":"Q6650101","brand:wikipedia":"en:Little Free Library",name:"Little Free Library"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/100 Montaditos":{name:"100 Montaditos",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/100MontaditosSpain/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q8355805",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"100 Montaditos","brand:wikidata":"Q8355805","brand:wikipedia":"en:Cervecería 100 Montaditos",cuisine:"sandwich",name:"100 Montaditos"},countryCodes:["es","it","pt"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/italian/ASK Italian":{name:"ASK Italian",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/ASKItalian/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4807056",amenity:"restaurant",cuisine:"italian"},addTags:{amenity:"restaurant",brand:"ASK Italian","brand:wikidata":"Q4807056","brand:wikipedia":"en:ASK Italian",cuisine:"italian",name:"ASK Italian"},reference:{key:"cuisine",value:"italian"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Applebee's":{name:"Applebee's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/Applebeesmundoe/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q621532",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Applebee's Neighborhood Grill & Bar","brand:wikidata":"Q621532","brand:wikipedia":"en:Applebee's",cuisine:"american",name:"Applebee's",official_name:"Applebee's Neighborhood Grill & Bar"},reference:{key:"cuisine",value:"american"},terms:["applebees bar & grill","applebees bar and grill","applebees grill & bar","applebees grill and bar","applebees neighborhood bar & grill","applebees neighborhood bar and grill","applebees neighborhood grill and bar"],matchScore:2,suggestion:true},"amenity/restaurant/Autogrill":{name:"Autogrill",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/AutogrillOfficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q786790",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Autogrill","brand:wikidata":"Q786790","brand:wikipedia":"en:Autogrill",name:"Autogrill"},countryCodes:["at","es","fr","it"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/BBB":{name:"BBB",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/BurgusBurgerBar/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64760094",amenity:"restaurant"},addTags:{alt_name:"Burgus Burger Bar","alt_name:en":"Burgus Burger Bar",amenity:"restaurant",brand:"Burgus Burger Bar","brand:en":"Burgus Burger Bar","brand:wikidata":"Q64760094",cuisine:"burger",name:"BBB","name:en":"BBB"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/BJ's":{name:"BJ's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/BJsRestaurants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4835755",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"BJ's","brand:wikidata":"Q4835755","brand:wikipedia":"en:BJ's Restaurants",cuisine:"american",name:"BJ's",official_name:"BJ's Restaurant & Brewhouse"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:["bjs restaurant and brewhouse"],matchScore:2,suggestion:true},"amenity/restaurant/italian/Bella Italia":{name:"Bella Italia",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/bellaitalia.co.uk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4883362",amenity:"restaurant",cuisine:"italian"},addTags:{amenity:"restaurant",brand:"Bella Italia","brand:wikidata":"Q4883362","brand:wikipedia":"en:Bella Italia",cuisine:"italian",name:"Bella Italia"},reference:{key:"cuisine",value:"italian"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/japanese/Benihana":{name:"Benihana",icon:"maki-restaurant-noodle",imageURL:"https://graph.facebook.com/Benihana/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4887996",amenity:"restaurant",cuisine:"japanese;teppanyaki;steak"},addTags:{amenity:"restaurant",brand:"Benihana","brand:wikidata":"Q4887996","brand:wikipedia":"en:Benihana",cuisine:"japanese;teppanyaki;steak",name:"Benihana"},reference:{key:"cuisine",value:"japanese"},countryCodes:["aw","br","ca","pa","sv","us"],terms:["benihana of tokyo"],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Bertucci's":{name:"Bertucci's",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/Bertuccis/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4895917",amenity:"restaurant",cuisine:"pizza;italian"},addTags:{amenity:"restaurant",brand:"Bertucci's","brand:wikidata":"Q4895917","brand:wikipedia":"en:Bertucci's",cuisine:"pizza;italian",name:"Bertucci's"},reference:{key:"cuisine",value:"pizza"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Big Boy":{name:"Big Boy",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/bigboyrestaurants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4386779",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Big Boy","brand:wikidata":"Q4386779","brand:wikipedia":"en:Big Boy Restaurants",cuisine:"burger",name:"Big Boy",official_name:"Big Boy Restaurant & Bakery"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Black":{name:"Black",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/blackbarnburger/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64760158",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Black Bar Burger","brand:en":"Black Bar Burger","brand:he":"בלאק בורגר","brand:wikidata":"Q64760158",cuisine:"burger",name:"Black","name:en":"Black","name:he":"בלאק"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Black Bear Diner":{name:"Black Bear Diner",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/BlackBearDiner/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4920343",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Black Bear Diner","brand:wikidata":"Q4920343","brand:wikipedia":"en:Black Bear Diner",cuisine:"american",name:"Black Bear Diner"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Blaze Pizza":{name:"Blaze Pizza",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/BlazePizza/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q23016666",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Blaze Pizza","brand:wikidata":"Q23016666","brand:wikipedia":"en:Blaze Pizza",cuisine:"pizza",name:"Blaze Pizza"},reference:{key:"cuisine",value:"pizza"},countryCodes:["bh","ca","kw","sa","us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Bob Evans":{name:"Bob Evans",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/bobevans/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4932386",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Bob Evans","brand:wikidata":"Q4932386","brand:wikipedia":"en:Bob Evans Restaurants",cuisine:"american",name:"Bob Evans"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Bonanza Steakhouse":{name:"Bonanza Steakhouse",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/ponbonsteakhouses/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64045992",amenity:"restaurant",cuisine:"american;steak;buffet"},addTags:{amenity:"restaurant",brand:"Bonanza Steakhouse","brand:wikidata":"Q64045992",cuisine:"american;steak;buffet",name:"Bonanza Steakhouse"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:["bonanza"],matchScore:2,suggestion:true},"amenity/restaurant/seafood/Bonefish Grill":{name:"Bonefish Grill",icon:"maki-restaurant-seafood",imageURL:"https://graph.facebook.com/bonefishgrill/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4941599",amenity:"restaurant",cuisine:"seafood"},addTags:{amenity:"restaurant",brand:"Bonefish Grill","brand:wikidata":"Q4941599","brand:wikipedia":"en:Bonefish Grill",cuisine:"seafood",name:"Bonefish Grill"},reference:{key:"cuisine",value:"seafood"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Boston Pizza":{name:"Boston Pizza",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/BostonPizza/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q894578",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Boston Pizza","brand:wikidata":"Q894578","brand:wikipedia":"en:Boston Pizza",cuisine:"pizza",name:"Boston Pizza"},reference:{key:"cuisine",value:"pizza"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/italian/Bravo":{name:"Bravo",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/bravoitalian/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64055574",amenity:"restaurant",cuisine:"italian"},addTags:{alt_name:"Bravo Cucina Italiana",amenity:"restaurant",brand:"Bravo","brand:wikidata":"Q64055574",cuisine:"italian",name:"Bravo"},reference:{key:"cuisine",value:"italian"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/italian/Brio":{name:"Brio",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/brioitalian/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64055835",amenity:"restaurant",cuisine:"italian"},addTags:{alt_name:"Brio Tuscan Grille",amenity:"restaurant",brand:"Brio","brand:wikidata":"Q64055835",cuisine:"italian",name:"Brio"},reference:{key:"cuisine",value:"italian"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/italian/Buca di Beppo":{name:"Buca di Beppo",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/bucadibeppo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4982340",amenity:"restaurant",cuisine:"italian"},addTags:{amenity:"restaurant",brand:"Buca di Beppo","brand:wikidata":"Q4982340","brand:wikipedia":"en:Buca di Beppo",cuisine:"italian",name:"Buca di Beppo"},reference:{key:"cuisine",value:"italian"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Buffalo Grill":{name:"Buffalo Grill",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/buffalogrill/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q944655",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Buffalo Grill","brand:wikidata":"Q944655","brand:wikipedia":"en:Buffalo Grill",cuisine:"steak_house",name:"Buffalo Grill"},countryCodes:["es","fr"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Buffalo Wild Wings":{name:"Buffalo Wild Wings",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/BuffaloWildWings/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q509255",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Buffalo Wild Wings","brand:wikidata":"Q509255","brand:wikipedia":"en:Buffalo Wild Wings",cuisine:"wings",name:"Buffalo Wild Wings"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Buffalo Wings & Rings":{name:"Buffalo Wings & Rings",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/wingsandrings/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4985900",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Buffalo Wings & Rings","brand:wikidata":"Q4985900","brand:wikipedia":"en:Buffalo Wings & Rings",cuisine:"wings",name:"Buffalo Wings & Rings",takeaway:"yes"},countryCodes:["us"],terms:["buffalo wings and rings"],matchScore:2,suggestion:true},"amenity/restaurant/mexican/Cafe Rio":{name:"Cafe Rio",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/CafeRio/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5017108",amenity:"restaurant",cuisine:"mexican"},addTags:{amenity:"restaurant",brand:"Cafe Rio","brand:wikidata":"Q5017108","brand:wikipedia":"en:Cafe Rio",cuisine:"mexican",name:"Cafe Rio"},reference:{key:"cuisine",value:"mexican"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/California Pizza Kitchen":{name:"California Pizza Kitchen",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/californiapizzakitchen/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q15109854",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"California Pizza Kitchen","brand:wikidata":"Q15109854","brand:wikipedia":"en:California Pizza Kitchen",cuisine:"pizza",name:"California Pizza Kitchen"},reference:{key:"cuisine",value:"pizza"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/italian/Carluccio's":{name:"Carluccio's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/carluccios/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q25111797",amenity:"restaurant",cuisine:"italian"},addTags:{amenity:"restaurant",brand:"Carluccio's","brand:wikidata":"Q25111797","brand:wikipedia":"en:Carluccio's Ltd",cuisine:"italian",name:"Carluccio's"},reference:{key:"cuisine",value:"italian"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/italian/Carrabba's Italian Grill":{name:"Carrabba's Italian Grill",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/Carrabbas/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5045999",amenity:"restaurant",cuisine:"italian"},addTags:{amenity:"restaurant",brand:"Carrabba's Italian Grill","brand:wikidata":"Q5045999","brand:wikipedia":"en:Carrabba's Italian Grill",cuisine:"italian",name:"Carrabba's Italian Grill"},reference:{key:"cuisine",value:"italian"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Cheddar's":{name:"Cheddar's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/CheddarsScratchKitchen/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5089187",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Cheddar's","brand:wikidata":"Q5089187","brand:wikipedia":"en:Cheddar's Scratch Kitchen",cuisine:"american",name:"Cheddar's",official_name:"Cheddar's Scratch Kitchen"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Cheeburger Cheeburger":{name:"Cheeburger Cheeburger",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/136947372998541/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5089247",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Cheeburger Cheeburger","brand:wikidata":"Q5089247","brand:wikipedia":"en:Cheeburger Cheeburger",cuisine:"burger",name:"Cheeburger Cheeburger"},countryCodes:["ca","sa","us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/mexican/Chevys":{name:"Chevys",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/ChevysFreshMex/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5094466",amenity:"restaurant",cuisine:"mexican"},addTags:{amenity:"restaurant",brand:"Chevys Fresh Mex","brand:wikidata":"Q5094466","brand:wikipedia":"en:Chevys Fresh Mex",cuisine:"mexican",name:"Chevys",official_name:"Chevys Fresh Mex"},reference:{key:"cuisine",value:"mexican"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Chili's":{name:"Chili's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/Chilis/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1072948",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Chili's","brand:wikidata":"Q1072948","brand:wikipedia":"en:Chili's",cuisine:"tex-mex",name:"Chili's",official_name:"Chili's Grill & Bar"},terms:["chili's grill and bar"],matchScore:2,suggestion:true},"amenity/restaurant/Chiquito":{name:"Chiquito",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/chiquito.restaurant/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5101775",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Chiquito","brand:wikidata":"Q5101775","brand:wikipedia":"en:Chiquito (restaurant)",cuisine:"tex-mex",name:"Chiquito"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Chuck E. Cheese's":{name:"Chuck E. Cheese's",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/ChuckECheese/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2438391",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Chuck E. Cheese's","brand:wikidata":"Q2438391","brand:wikipedia":"en:Chuck E. Cheese's",cuisine:"pizza",name:"Chuck E. Cheese's"},reference:{key:"cuisine",value:"pizza"},countryCodes:["ca","us"],terms:["chuck e cheese"],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Cici's Pizza":{name:"Cici's Pizza",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/Cicis/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2972189",amenity:"restaurant",cuisine:"pizza;buffet"},addTags:{amenity:"restaurant",brand:"Cici's Pizza","brand:wikidata":"Q2972189","brand:wikipedia":"en:Cicis",cuisine:"pizza;buffet",name:"Cici's Pizza"},reference:{key:"cuisine",value:"pizza"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Claim Jumper":{name:"Claim Jumper",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/ClaimJumperRestaurants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5125081",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Claim Jumper","brand:wikidata":"Q5125081","brand:wikipedia":"en:Claim Jumper",cuisine:"american",name:"Claim Jumper"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Coast to Coast":{name:"Coast to Coast",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/coasttocoastrestaurants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q22000729",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Coast to Coast","brand:wikidata":"Q22000729","brand:wikipedia":"en:Coast to Coast (restaurant)",cuisine:"american",name:"Coast to Coast"},reference:{key:"cuisine",value:"american"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Cosmo":{name:"Cosmo",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/CosmoRestaurants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5174239",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Cosmo","brand:wikidata":"Q5174239","brand:wikipedia":"en:Cosmo (restaurant)",name:"Cosmo"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Country Pride":{name:"Country Pride",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/CountryPrideRestaurants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64051992",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Country Pride","brand:wikidata":"Q64051992",cuisine:"american",name:"Country Pride"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:["country pride restaurant"],matchScore:2,suggestion:true},"amenity/restaurant/french/Courtepaille":{name:"Courtepaille",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/CourtepailleFR/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3116688",amenity:"restaurant",cuisine:"french"},addTags:{amenity:"restaurant",brand:"Courtepaille","brand:wikidata":"Q3116688","brand:wikipedia":"fr:Grill Courtepaille",cuisine:"french",name:"Courtepaille"},reference:{key:"cuisine",value:"french"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Cracker Barrel":{name:"Cracker Barrel",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/crackerbarrel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4492609",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Cracker Barrel","brand:wikidata":"Q4492609","brand:wikipedia":"en:Cracker Barrel",cuisine:"american",name:"Cracker Barrel",official_name:"Cracker Barrel Old Country Store"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Dave & Buster's":{name:"Dave & Buster's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/daveandbusters/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5228205",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Dave & Buster's","brand:wikidata":"Q5228205","brand:wikipedia":"en:Dave & Buster's",cuisine:"american",name:"Dave & Buster's"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Denny's":{name:"Denny's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/dennys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1189695",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Denny's","brand:wikidata":"Q1189695","brand:wikipedia":"en:Denny's",cuisine:"american",name:"Denny's"},reference:{key:"cuisine",value:"american"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Dickey's Barbecue Pit":{name:"Dickey's Barbecue Pit",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/dickeysbarbecuepit/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q19880747",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Dickey's Barbecue Pit","brand:wikidata":"Q19880747","brand:wikipedia":"en:Dickey's Barbecue Pit",cuisine:"barbecue",name:"Dickey's Barbecue Pit"},countryCodes:["us"],terms:["dickeys barbecue"],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Donatos Pizza":{name:"Donatos Pizza",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/DonatosPizza/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1240741",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Donatos Pizza","brand:wikidata":"Q1240741","brand:wikipedia":"en:Donatos Pizza",cuisine:"pizza",name:"Donatos Pizza",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},countryCodes:["us"],terms:["donatos"],matchScore:2,suggestion:true},"amenity/restaurant/italian/East Side Mario's":{name:"East Side Mario's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/eastsidemarios/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5329375",amenity:"restaurant",cuisine:"italian"},addTags:{amenity:"restaurant",brand:"East Side Mario's","brand:wikidata":"Q5329375","brand:wikipedia":"en:East Side Mario's",cuisine:"italian",name:"East Side Mario's"},reference:{key:"cuisine",value:"italian"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Eat'n Park":{name:"Eat'n Park",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/EatnParkRestaurants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5331211",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Eat'n Park","brand:wikidata":"Q5331211","brand:wikipedia":"en:Eat'n Park",cuisine:"american",name:"Eat'n Park"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Famous Dave's":{name:"Famous Dave's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/famousdaves/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5433448",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Famous Dave's","brand:wikidata":"Q5433448","brand:wikipedia":"en:Famous Dave's",cuisine:"barbecue",name:"Famous Dave's"},countryCodes:["us"],terms:["famous daves bbq"],matchScore:2,suggestion:true},"amenity/restaurant/american/First Watch":{name:"First Watch",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/FirstWatch/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5454064",amenity:"restaurant",cuisine:"american;breakfast"},addTags:{amenity:"restaurant",brand:"First Watch","brand:wikidata":"Q5454064","brand:wikipedia":"en:First Watch (restaurant chain)",cuisine:"american;breakfast",name:"First Watch"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/french/Flunch":{name:"Flunch",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/flunch/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q629326",amenity:"restaurant",cuisine:"french"},addTags:{amenity:"restaurant",brand:"Flunch","brand:wikidata":"Q629326","brand:wikipedia":"en:Flunch",cuisine:"french",name:"Flunch"},reference:{key:"cuisine",value:"french"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Foster's Hollywood":{name:"Foster's Hollywood",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/fostershollywood/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5864366",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Foster's Hollywood","brand:wikidata":"Q5864366","brand:wikipedia":"en:Foster's Hollywood",cuisine:"american",name:"Foster's Hollywood"},reference:{key:"cuisine",value:"american"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/italian/Frankie & Benny's":{name:"Frankie & Benny's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/frankiebennys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5490892",amenity:"restaurant",cuisine:"italian"},addTags:{amenity:"restaurant",brand:"Frankie & Benny's","brand:wikidata":"Q5490892","brand:wikipedia":"en:Frankie & Benny's",cuisine:"italian",name:"Frankie & Benny's"},reference:{key:"cuisine",value:"italian"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Freshii":{name:"Freshii",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/freshii/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5503051",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Freshii","brand:wikidata":"Q5503051","brand:wikipedia":"en:Freshii",cuisine:"salad",name:"Freshii"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Friendly's":{name:"Friendly's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/friendlys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1464513",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Friendly's","brand:wikidata":"Q1464513","brand:wikipedia":"en:Friendly's",cuisine:"american",name:"Friendly's"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Frisch's Big Boy":{name:"Frisch's Big Boy",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/frischsbigboy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5504660",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Frisch's Big Boy","brand:wikidata":"Q5504660","brand:wikipedia":"en:Frisch's",cuisine:"burger",name:"Frisch's Big Boy",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Fuddruckers":{name:"Fuddruckers",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/fuddruckers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5507056",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Fuddruckers","brand:wikidata":"Q5507056","brand:wikipedia":"en:Fuddruckers",cuisine:"burger",name:"Fuddruckers"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Giordano's Pizzeria":{name:"Giordano's Pizzeria",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/giordanospizza/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5563393",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Giordano's Pizzeria","brand:wikidata":"Q5563393","brand:wikipedia":"en:Giordano's Pizzeria",cuisine:"pizza",name:"Giordano's Pizzeria"},reference:{key:"cuisine",value:"pizza"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Godfather's Pizza":{name:"Godfather's Pizza",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/godfatherspizza/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5576353",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Godfather's Pizza","brand:wikidata":"Q5576353","brand:wikipedia":"en:Godfather's Pizza",cuisine:"pizza",name:"Godfather's Pizza"},reference:{key:"cuisine",value:"pizza"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Golden Corral":{name:"Golden Corral",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/goldencorral/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4039560",amenity:"restaurant",cuisine:"american;buffet"},addTags:{amenity:"restaurant",brand:"Golden Corral","brand:wikidata":"Q4039560","brand:wikipedia":"en:Golden Corral",cuisine:"american;buffet",name:"Golden Corral"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:["golden corral buffet","golden corral buffet & grill","golden corral buffet and grill"],matchScore:2,suggestion:true},"amenity/restaurant/Gourmet Burger Kitchen":{name:"Gourmet Burger Kitchen",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/gourmetburgerkitchen/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5588445",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Gourmet Burger Kitchen","brand:wikidata":"Q5588445","brand:wikipedia":"en:Gourmet Burger Kitchen",cuisine:"burger",name:"Gourmet Burger Kitchen"},countryCodes:["gb","gr","ie"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Handmade Burger Co.":{name:"Handmade Burger Co.",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/handmadeburgercompany/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q56154673",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Handmade Burger Co.","brand:wikidata":"Q56154673",cuisine:"burger",name:"Handmade Burger Co."},countryCodes:["gb"],terms:["Handmade Burger Company"],matchScore:2,suggestion:true},"amenity/restaurant/Hans im Glück":{name:"Hans im Glück",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/hansimglueck.burgergrill/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q22569868",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Hans im Glück","brand:wikidata":"Q22569868","brand:wikipedia":"de:Hans im Glück (Restaurantkette)",cuisine:"burger",name:"Hans im Glück"},countryCodes:["at","ch","de","sg"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Happy's Pizza":{name:"Happy's Pizza",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/EatHappysPizza/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5652393",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Happy's Pizza","brand:wikidata":"Q5652393","brand:wikipedia":"en:Happy's Pizza",cuisine:"pizza",name:"Happy's Pizza"},reference:{key:"cuisine",value:"pizza"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Hard Rock Cafe":{name:"Hard Rock Cafe",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/hardrock/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q918151",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Hard Rock Cafe","brand:wikidata":"Q918151","brand:wikipedia":"en:Hard Rock Cafe",cuisine:"american",name:"Hard Rock Cafe"},reference:{key:"cuisine",value:"american"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Harvester":{name:"Harvester",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/harvesterrestaurant/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5676915",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Harvester","brand:wikidata":"Q5676915","brand:wikipedia":"en:Harvester (restaurant)",cuisine:"american",name:"Harvester"},reference:{key:"cuisine",value:"american"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Hippopotamus":{name:"Hippopotamus",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/Hippopotamus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3136174",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Hippopotamus","brand:wikidata":"Q3136174","brand:wikipedia":"fr:Hippopotamus (restaurant)",cuisine:"steak_house",name:"Hippopotamus"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Hooters":{name:"Hooters",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/hooters/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1025921",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Hooters","brand:wikidata":"Q1025921","brand:wikipedia":"en:Hooters",cuisine:"burger",name:"Hooters"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Huddle House":{name:"Huddle House",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/HuddleHouse/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5928324",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Huddle House","brand:wikidata":"Q5928324","brand:wikipedia":"en:Huddle House",cuisine:"american",name:"Huddle House"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Husky House":{name:"Husky House",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/huskyenergy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q702049",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Husky","brand:wikidata":"Q702049","brand:wikipedia":"en:Husky Energy",cuisine:"diner",name:"Husky House"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/IHOP":{name:"IHOP",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/IHOP/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1185675",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"IHOP","brand:wikidata":"Q1185675","brand:wikipedia":"en:IHOP",cuisine:"breakfast;pancake",name:"IHOP"},terms:["international house of pancakes"],matchScore:2,suggestion:true},"amenity/restaurant/american/IL Патио":{name:"IL Патио",icon:"maki-restaurant",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FRosInter.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q4397763",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"IL Патио","brand:wikidata":"Q4397763","brand:wikipedia":"en:Росинтер",cuisine:"american",name:"IL Патио"},reference:{key:"cuisine",value:"american"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Iron Skillet":{name:"Iron Skillet",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/IronSkilletRestaurant/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64052855",amenity:"restaurant",cuisine:"american;buffet"},addTags:{amenity:"restaurant",brand:"Iron Skillet","brand:wikidata":"Q64052855",cuisine:"american;buffet",name:"Iron Skillet"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:["iron skillet restaurant"],matchScore:2,suggestion:true},"amenity/restaurant/Jason's Deli":{name:"Jason's Deli",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/JasonsDeli/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16997641",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Jason's Deli","brand:wikidata":"Q16997641","brand:wikipedia":"en:Jason's Deli",cuisine:"sandwich",name:"Jason's Deli"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Jet's Pizza":{name:"Jet's Pizza",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/JetsPizza/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16997713",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Jet's Pizza","brand:wikidata":"Q16997713","brand:wikipedia":"en:Jet's Pizza",cuisine:"pizza",name:"Jet's Pizza"},reference:{key:"cuisine",value:"pizza"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/seafood/Joe's Crab Shack":{name:"Joe's Crab Shack",icon:"maki-restaurant-seafood",imageURL:"https://graph.facebook.com/joescrabshack/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6208210",amenity:"restaurant",cuisine:"seafood"},addTags:{amenity:"restaurant",brand:"Joe's Crab Shack","brand:wikidata":"Q6208210","brand:wikipedia":"en:Joe's Crab Shack",cuisine:"seafood",name:"Joe's Crab Shack"},reference:{key:"cuisine",value:"seafood"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/italian/Johnny Carino's":{name:"Johnny Carino's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/carinositalian/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5039637",amenity:"restaurant",cuisine:"italian"},addTags:{amenity:"restaurant",brand:"Johnny Carino's","brand:wikidata":"Q5039637","brand:wikipedia":"en:Carino's Italian",cuisine:"italian",name:"Johnny Carino's"},reference:{key:"cuisine",value:"italian"},countryCodes:["us"],terms:["carinios"],matchScore:2,suggestion:true},"amenity/restaurant/Johnny Rockets":{name:"Johnny Rockets",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/johnnyrockets/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1051593",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Johnny Rockets","brand:wikidata":"Q1051593","brand:wikipedia":"en:Johnny Rockets",cuisine:"burger",name:"Johnny Rockets"},terms:["johnny rocket"],matchScore:2,suggestion:true},"amenity/restaurant/american/Kelsey's":{name:"Kelsey's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/KelseysRestaurants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6386459",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Kelsey's","brand:wikidata":"Q6386459","brand:wikipedia":"en:Kelseys Original Roadhouse",cuisine:"american",name:"Kelsey's"},reference:{key:"cuisine",value:"american"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Kudu":{name:"Kudu",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/KuduRestaurants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6441777",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Kudu","brand:wikidata":"Q6441777","brand:wikipedia":"en:Kudu (restaurant)",cuisine:"sandwich",name:"Kudu"},countryCodes:["sa"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/La Boucherie":{name:"La Boucherie",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/restaurantlaboucherie/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q21427479",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"La Boucherie","brand:wikidata":"Q21427479","brand:wikipedia":"fr:La Boucherie (restaurant)",cuisine:"steak_house",name:"La Boucherie"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/LaRosa's Pizzeria":{name:"LaRosa's Pizzeria",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/LaRosasPizzeria/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6460833",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"LaRosa's Pizzeria","brand:wikidata":"Q6460833","brand:wikipedia":"en:LaRosa's Pizzeria",cuisine:"pizza",name:"LaRosa's Pizzeria",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/seafood/Legal Sea Foods":{name:"Legal Sea Foods",icon:"maki-restaurant-seafood",imageURL:"https://graph.facebook.com/LegalSeaFoods/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6517417",amenity:"restaurant",cuisine:"seafood"},addTags:{amenity:"restaurant",brand:"Legal Sea Foods","brand:wikidata":"Q6517417","brand:wikipedia":"en:Legal Sea Foods",cuisine:"seafood",name:"Legal Sea Foods"},reference:{key:"cuisine",value:"seafood"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Logan's Roadhouse":{name:"Logan's Roadhouse",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/Logans.Roadhouse/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6666872",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Logan's Roadhouse","brand:wikidata":"Q6666872","brand:wikipedia":"en:Logan's Roadhouse",cuisine:"american",name:"Logan's Roadhouse"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/LongHorn Steakhouse":{name:"LongHorn Steakhouse",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/longhornsteakhouse/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3259007",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"LongHorn Steakhouse","brand:wikidata":"Q3259007","brand:wikipedia":"en:LongHorn Steakhouse",cuisine:"steak_house",name:"LongHorn Steakhouse"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Lou Malnati's Pizzeria":{name:"Lou Malnati's Pizzeria",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/loumalnatis/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6685628",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Lou Malnati's Pizzeria","brand:wikidata":"Q6685628","brand:wikipedia":"en:Lou Malnati's Pizzeria",cuisine:"pizza",name:"Lou Malnati's Pizzeria"},reference:{key:"cuisine",value:"pizza"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Loving Hut":{name:"Loving Hut",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/LovingHutUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3491655",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Loving Hut","brand:wikidata":"Q3491655","brand:wikipedia":"en:Loving Hut",cuisine:"international","diet:vegan":"only","diet:vegetarian":"only",name:"Loving Hut"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Léon de Bruxelles":{name:"Léon de Bruxelles",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/leondebruxellesofficiel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q21041507",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Léon de Bruxelles","brand:wikidata":"Q21041507","brand:wikipedia":"en:Léon de Bruxelles",cuisine:"friture",name:"Léon de Bruxelles"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/thai/MK Restaurants":{name:"MK Restaurants",icon:"maki-restaurant-noodle",imageURL:"https://graph.facebook.com/mkrestaurants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62075359",amenity:"restaurant",cuisine:"thai"},addTags:{amenity:"restaurant",brand:"MK Restaurants","brand:wikidata":"Q62075359",cuisine:"thai",name:"MK Restaurants"},reference:{key:"cuisine",value:"thai"},countryCodes:["th"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Marco's Pizza":{name:"Marco's Pizza",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/MarcosPizza/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6757382",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Marco's Pizza","brand:wikidata":"Q6757382","brand:wikipedia":"en:Marco's Pizza",cuisine:"pizza",name:"Marco's Pizza"},reference:{key:"cuisine",value:"pizza"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Marie Callender's":{name:"Marie Callender's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/MarieCallenders/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6762784",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Marie Callender's","brand:wikidata":"Q6762784","brand:wikipedia":"en:Marie Callender's",cuisine:"american",name:"Marie Callender's"},reference:{key:"cuisine",value:"american"},countryCodes:["mx","us"],terms:["marie calendar","marie calendar's","marie callendar's"],matchScore:2,suggestion:true},"amenity/restaurant/asian/Max's Restaurant":{name:"Max's Restaurant",icon:"maki-restaurant-noodle",imageURL:"https://graph.facebook.com/MaxsRestaurantNA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6794477",amenity:"restaurant",cuisine:"asian"},addTags:{amenity:"restaurant",brand:"Max's Restaurant","brand:wikidata":"Q6794477","brand:wikipedia":"en:Max's Restaurant",cuisine:"asian",name:"Max's Restaurant"},reference:{key:"cuisine",value:"asian"},countryCodes:["ph"],terms:["Max's"],matchScore:2,suggestion:true},"amenity/restaurant/McAlister's Deli":{name:"McAlister's Deli",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/mcalistersdeli/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17020829",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"McAlister's Deli","brand:wikidata":"Q17020829","brand:wikipedia":"en:McAlister's Deli",cuisine:"sandwich",name:"McAlister's Deli"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/seafood/McCormick & Schmick's":{name:"McCormick & Schmick's",icon:"maki-restaurant-seafood",imageURL:"https://graph.facebook.com/mccormickandschmicks/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6800562",amenity:"restaurant",cuisine:"seafood;steak"},addTags:{amenity:"restaurant",brand:"McCormick & Schmick's","brand:wikidata":"Q6800562","brand:wikipedia":"en:McCormick & Schmick's",cuisine:"seafood;steak",name:"McCormick & Schmick's"},reference:{key:"cuisine",value:"seafood"},countryCodes:["us"],terms:["mccormick & schmick","mccormick & schmicks grill","mccormick and schmick","mccormick and schmick's"],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Mellow Mushroom":{name:"Mellow Mushroom",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/mellowmushroom/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17021360",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Mellow Mushroom","brand:wikidata":"Q17021360","brand:wikipedia":"en:Mellow Mushroom",cuisine:"pizza",name:"Mellow Mushroom"},reference:{key:"cuisine",value:"pizza"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/french/Mimi's Cafe":{name:"Mimi's Cafe",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/mimiscafe/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17022081",amenity:"restaurant",cuisine:"french"},addTags:{amenity:"restaurant",brand:"Mimi's Cafe","brand:wikidata":"Q17022081","brand:wikipedia":"en:Mimi's Cafe",cuisine:"french",name:"Mimi's Cafe"},reference:{key:"cuisine",value:"french"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Montana's":{name:"Montana's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/montanasBBQ/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17022490",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Montana's","brand:wikidata":"Q17022490","brand:wikipedia":"en:Montana's BBQ & Bar",cuisine:"barbecue",name:"Montana's",official_name:"Montana's BBQ & Bar"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Morton's The Steakhouse":{name:"Morton's The Steakhouse",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/mortons/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17022759",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Morton's The Steakhouse","brand:wikidata":"Q17022759","brand:wikipedia":"en:Morton's The Steakhouse",cuisine:"steak_house",name:"Morton's The Steakhouse"},countryCodes:["us"],terms:["mortons"],matchScore:2,suggestion:true},"amenity/restaurant/Moses":{name:"Moses",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/MosesIsrael/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64760150",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Moses","brand:en":"Moses","brand:he":"מוזס","brand:wikidata":"Q64760150",cuisine:"burger",name:"Moses","name:en":"Moses","name:he":"מוזס"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Mountain Mike's":{name:"Mountain Mike's",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/mountainmikes/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6925120",amenity:"restaurant",cuisine:"pizza"},addTags:{alt_name:"Mountain Mike's Pizza",amenity:"restaurant",brand:"Mountain Mike's","brand:wikidata":"Q6925120","brand:wikipedia":"en:Mountain Mike's Pizza",cuisine:"pizza",name:"Mountain Mike's",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Nando's":{name:"Nando's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/NandosUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3472954",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Nando's","brand:wikidata":"Q3472954","brand:wikipedia":"en:Nando's",cuisine:"chicken;portuguese",name:"Nando's"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Noodles & Company":{name:"Noodles & Company",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/noodlesandcompany/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7049673",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Noodles & Company","brand:wikidata":"Q7049673","brand:wikipedia":"en:Noodles & Company",cuisine:"pasta",name:"Noodles & Company"},countryCodes:["us"],terms:["noodles and company","noodles co"],matchScore:2,suggestion:true},"amenity/restaurant/american/O'Charley's":{name:"O'Charley's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/ocharleysfans/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7071703",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"O'Charley's","brand:wikidata":"Q7071703","brand:wikipedia":"en:O'Charley's",cuisine:"american",name:"O'Charley's"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/seafood/Ocean Basket":{name:"Ocean Basket",icon:"maki-restaurant-seafood",imageURL:"https://graph.facebook.com/daoceanbasket/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62075311",amenity:"restaurant",cuisine:"seafood"},addTags:{amenity:"restaurant",brand:"Ocean Basket","brand:wikidata":"Q62075311",cuisine:"seafood",name:"Ocean Basket"},reference:{key:"cuisine",value:"seafood"},countryCodes:["za"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Old Chicago":{name:"Old Chicago",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/OldChicago/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64411347",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Old Chicago","brand:wikidata":"Q64411347",cuisine:"pizza",name:"Old Chicago",official_name:"Old Chicago Pizza & Taproom"},reference:{key:"cuisine",value:"pizza"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Old Wild West":{name:"Old Wild West",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/OWWofficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q25402475",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Old Wild West","brand:wikidata":"Q25402475","brand:wikipedia":"it:Old Wild West",cuisine:"american",name:"Old Wild West"},reference:{key:"cuisine",value:"american"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/italian/Olive Garden":{name:"Olive Garden",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/OliveGarden/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3045312",amenity:"restaurant",cuisine:"italian"},addTags:{amenity:"restaurant",brand:"Olive Garden","brand:wikidata":"Q3045312","brand:wikipedia":"en:Olive Garden",cuisine:"italian",name:"Olive Garden"},reference:{key:"cuisine",value:"italian"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/On The Border":{name:"On The Border",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/OnTheBorderMexicanGrillandCantina/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7091305",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"On The Border","brand:wikidata":"Q7091305","brand:wikipedia":"en:On the Border Mexican Grill & Cantina",cuisine:"tex-mex",name:"On The Border",official_name:"On The Border Mexican Grill & Cantina"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Outback Steakhouse":{name:"Outback Steakhouse",icon:"maki-restaurant",imageURL:"https://pbs.twimg.com/profile_images/778575984958267392/MGtDYhwg_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q1064893",amenity:"restaurant",cuisine:"american;steak"},addTags:{amenity:"restaurant",brand:"Outback Steakhouse","brand:wikidata":"Q1064893","brand:wikipedia":"en:Outback Steakhouse",cuisine:"american;steak",name:"Outback Steakhouse"},reference:{key:"cuisine",value:"american"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/asian/P.F. Chang's":{name:"P.F. Chang's",icon:"maki-restaurant-noodle",imageURL:"https://graph.facebook.com/pfchangs/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5360181",amenity:"restaurant",cuisine:"asian"},addTags:{amenity:"restaurant",brand:"P.F. Chang's","brand:wikidata":"Q5360181","brand:wikipedia":"en:P. F. Chang's China Bistro",cuisine:"asian",name:"P.F. Chang's",official_name:"P.F. Chang's China Bistro"},reference:{key:"cuisine",value:"asian"},countryCodes:["mx","us"],terms:["pf chang"],matchScore:2,suggestion:true},"amenity/restaurant/Pardos Chicken":{name:"Pardos Chicken",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/pardoschicken/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17624435",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Pardos Chicken","brand:wikidata":"Q17624435","brand:wikipedia":"en:Pardos chicken",cuisine:"peruvian",name:"Pardos Chicken"},countryCodes:["pe"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/asian/Pei Wei":{name:"Pei Wei",icon:"maki-restaurant-noodle",imageURL:"https://graph.facebook.com/peiwei/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7160898",amenity:"restaurant",cuisine:"asian"},addTags:{amenity:"restaurant",brand:"Pei Wei","brand:wikidata":"Q7160898","brand:wikipedia":"en:Pei Wei Asian Diner",cuisine:"asian",name:"Pei Wei"},reference:{key:"cuisine",value:"asian"},countryCodes:["us"],terms:["pei wei asian diner"],matchScore:2,suggestion:true},"amenity/restaurant/american/Perkins":{name:"Perkins",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/eatatperkins/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7169056",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Perkins","brand:wikidata":"Q7169056","brand:wikipedia":"en:Perkins Restaurant and Bakery",cuisine:"american",name:"Perkins",official_name:"Perkins Restaurant and Bakery"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/vietnamese/Phở 24":{name:"Phở 24",icon:"maki-restaurant-noodle",imageURL:"https://graph.facebook.com/pho24.24giavitinhte/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63863118",amenity:"restaurant",cuisine:"vietnamese;noodle"},addTags:{amenity:"restaurant",brand:"Phở 24","brand:wikidata":"Q63863118",cuisine:"vietnamese;noodle",name:"Phở 24","name:en":"Pho 24","name:vi":"Phở 24"},reference:{key:"cuisine",value:"vietnamese"},countryCodes:["vn"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/vietnamese/Phở Hòa (Branded)":{name:"Phở Hòa (Branded)",icon:"maki-restaurant-noodle",imageURL:"https://graph.facebook.com/phohoanoodlesoup/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q55629932",amenity:"restaurant",cuisine:"vietnamese;noodle"},addTags:{alt_name:"Phở Hoà","alt_name:en":"Pho Hoa","alt_name:vi":"Phở Hoà",amenity:"restaurant",brand:"Phở Hòa","brand:wikidata":"Q55629932","brand:wikipedia":"en:Phở Hòa",cuisine:"vietnamese;noodle",name:"Phở Hòa","name:vi":"Phở Hòa"},reference:{key:"cuisine",value:"vietnamese"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Pieology Pizzeria":{name:"Pieology Pizzeria",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/pieology/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q60746053",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Pieology Pizzeria","brand:wikidata":"Q60746053","brand:wikipedia":"en:Pieology",cuisine:"pizza",name:"Pieology Pizzeria"},reference:{key:"cuisine",value:"pizza"},countryCodes:["us"],terms:["pieology"],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Pizza Factory":{name:"Pizza Factory",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/pizzafactoryinc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q39054369",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Pizza Factory","brand:wikidata":"Q39054369","brand:wikipedia":"en:Pizza Factory",cuisine:"pizza",name:"Pizza Factory"},reference:{key:"cuisine",value:"pizza"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Pizza Hut":{name:"Pizza Hut",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/pizzahutus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q191615",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Pizza Hut","brand:wikidata":"Q191615","brand:wikipedia":"en:Pizza Hut",cuisine:"pizza",name:"Pizza Hut"},reference:{key:"cuisine",value:"pizza"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Pizza Ranch":{name:"Pizza Ranch",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/PizzaRanchRestaurants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7199978",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Pizza Ranch","brand:wikidata":"Q7199978","brand:wikipedia":"en:Pizza Ranch",cuisine:"pizza",name:"Pizza Ranch"},reference:{key:"cuisine",value:"pizza"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/PizzaExpress":{name:"PizzaExpress",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/pizzaexpress/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q662845",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"PizzaExpress","brand:wikidata":"Q662845","brand:wikipedia":"en:PizzaExpress",cuisine:"pizza",name:"PizzaExpress"},reference:{key:"cuisine",value:"pizza"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/french/Poivre Rouge":{name:"Poivre Rouge",icon:"maki-restaurant",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20Restaumarch%C3%A9.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q7316076",amenity:"restaurant",cuisine:"french"},addTags:{amenity:"restaurant",brand:"Poivre Rouge","brand:wikidata":"Q7316076","brand:wikipedia":"fr:Poivre Rouge (restauration)",cuisine:"french",name:"Poivre Rouge"},reference:{key:"cuisine",value:"french"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Ponderosa Steakhouse":{name:"Ponderosa Steakhouse",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/ponbonsteakhouses/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64038204",amenity:"restaurant",cuisine:"american;steak;buffet"},addTags:{amenity:"restaurant",brand:"Ponderosa Steakhouse","brand:wikidata":"Q64038204",cuisine:"american;steak;buffet",name:"Ponderosa Steakhouse"},reference:{key:"cuisine",value:"american"},countryCodes:["ae","eg","qa","tw","us"],terms:["ponderosa"],matchScore:2,suggestion:true},"amenity/restaurant/italian/Prezzo":{name:"Prezzo",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/loveprezzo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7242489",amenity:"restaurant",cuisine:"italian"},addTags:{amenity:"restaurant",brand:"Prezzo","brand:wikidata":"Q7242489","brand:wikipedia":"en:Prezzo (restaurant)",cuisine:"italian",name:"Prezzo"},reference:{key:"cuisine",value:"italian"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Quaker Steak & Lube":{name:"Quaker Steak & Lube",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/TheOfficialQSL/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7268570",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Quaker Steak & Lube","brand:wikidata":"Q7268570","brand:wikipedia":"en:Quaker Steak & Lube",cuisine:"wings",name:"Quaker Steak & Lube"},countryCodes:["us"],terms:["quaker steak and lube"],matchScore:2,suggestion:true},"amenity/restaurant/seafood/Red Lobster":{name:"Red Lobster",icon:"maki-restaurant-seafood",imageURL:"https://graph.facebook.com/redlobster/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q846301",amenity:"restaurant",cuisine:"seafood"},addTags:{amenity:"restaurant",brand:"Red Lobster","brand:wikidata":"Q846301","brand:wikipedia":"en:Red Lobster",cuisine:"seafood",name:"Red Lobster"},reference:{key:"cuisine",value:"seafood"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Red Robin":{name:"Red Robin",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/RedRobin/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7304886",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Red Robin","brand:wikidata":"Q7304886","brand:wikipedia":"en:Red Robin",cuisine:"burger",name:"Red Robin",official_name:"Red Robin Gourmet Burgers and Brews"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/italian/Romano's Macaroni Grill":{name:"Romano's Macaroni Grill",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/RomanosMacaroniGrill/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7362714",amenity:"restaurant",cuisine:"italian"},addTags:{amenity:"restaurant",brand:"Romano's Macaroni Grill","brand:wikidata":"Q7362714","brand:wikipedia":"en:Romano's Macaroni Grill",cuisine:"italian",name:"Romano's Macaroni Grill"},reference:{key:"cuisine",value:"italian"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Round Table Pizza":{name:"Round Table Pizza",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/RoundTablePizza/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7371139",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Round Table Pizza","brand:wikidata":"Q7371139","brand:wikipedia":"en:Round Table Pizza",cuisine:"pizza",name:"Round Table Pizza"},reference:{key:"cuisine",value:"pizza"},countryCodes:["us"],terms:["round table"],matchScore:2,suggestion:true},"amenity/restaurant/american/Ruby Tuesday":{name:"Ruby Tuesday",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/rubytuesday/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7376400",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Ruby Tuesday","brand:wikidata":"Q7376400","brand:wikipedia":"en:Ruby Tuesday (restaurant)",cuisine:"american",name:"Ruby Tuesday"},reference:{key:"cuisine",value:"american"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Ruth's Chris Steak House":{name:"Ruth's Chris Steak House",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/RuthsChrisSteakHouseNational/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7382829",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Ruth's Chris Steak House","brand:wikidata":"Q7382829","brand:wikipedia":"en:Ruth's Chris Steak House",cuisine:"american",name:"Ruth's Chris Steak House"},reference:{key:"cuisine",value:"american"},countryCodes:["ca","mx","us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Saltgrass Steak House":{name:"Saltgrass Steak House",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/saltgrass/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7406113",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Saltgrass Steak House","brand:wikidata":"Q7406113","brand:wikipedia":"en:Saltgrass Steak House",cuisine:"steak_house",name:"Saltgrass Steak House"},countryCodes:["us"],terms:["saltgrass"],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Shakey's":{name:"Shakey's",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/shakeyspizzaparlorusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6134929",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Shakey's","brand:wikidata":"Q6134929","brand:wikipedia":"en:Shakey's Pizza",cuisine:"pizza",name:"Shakey's"},reference:{key:"cuisine",value:"pizza"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Shari's":{name:"Shari's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/SharisPies/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7489612",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Shari's","brand:wikidata":"Q7489612","brand:wikipedia":"en:Shari's Cafe & Pies",cuisine:"american",name:"Shari's"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Shoney's":{name:"Shoney's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/shoneys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7500392",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Shoney's","brand:wikidata":"Q7500392","brand:wikipedia":"en:Shoney's",cuisine:"american",name:"Shoney's"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Sizzler":{name:"Sizzler",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/sizzler/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1848822",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Sizzler","brand:wikidata":"Q1848822","brand:wikipedia":"en:Sizzler",cuisine:"steak_house",name:"Sizzler"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Skyline Chili":{name:"Skyline Chili",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/SkylineChili/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q151224",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Skyline Chili","brand:wikidata":"Q151224","brand:wikipedia":"en:Skyline Chili",cuisine:"chili",name:"Skyline Chili",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Smitty's":{name:"Smitty's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/SmittysRestaurants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7545728",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Smitty's","brand:wikidata":"Q7545728","brand:wikipedia":"en:Smitty's",cuisine:"pancake",name:"Smitty's"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Snappy Tomato Pizza":{name:"Snappy Tomato Pizza",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/SnappyTomatoPizza/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7547352",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Snappy Tomato Pizza","brand:wikidata":"Q7547352","brand:wikipedia":"en:Snappy Tomato Pizza",cuisine:"pizza",name:"Snappy Tomato Pizza",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},countryCodes:["gb","us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Spur":{name:"Spur",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/SpurSteakRanches/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7581546",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Spur","brand:wikidata":"Q7581546","brand:wikipedia":"en:Spur Steak Ranches",cuisine:"steak_house",name:"Spur"},countryCodes:["za"],terms:["spur steak ranches"],matchScore:2,suggestion:true},"amenity/restaurant/Steak 'n Shake":{name:"Steak 'n Shake",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/steaknshake/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7605233",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Steak 'n Shake","brand:wikidata":"Q7605233","brand:wikipedia":"en:Steak 'n Shake",cuisine:"burger",name:"Steak 'n Shake"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Sunset Grill":{name:"Sunset Grill",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/SunsetGrillBreakfast/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62112489",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Sunset Grill","brand:wikidata":"Q62112489","brand:wikipedia":"en:Sunset Grill (Canadian restaurant chain)",cuisine:"american",name:"Sunset Grill"},reference:{key:"cuisine",value:"american"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Swiss Chalet":{name:"Swiss Chalet",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/SwissChalet/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2372909",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Swiss Chalet","brand:wikidata":"Q2372909","brand:wikipedia":"en:Swiss Chalet",cuisine:"chicken",name:"Swiss Chalet"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/TGI Friday's":{name:"TGI Friday's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/TGIFridays/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1524184",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"TGI Friday's","brand:wikidata":"Q1524184","brand:wikipedia":"en:TGI Fridays",cuisine:"american",name:"TGI Friday's"},reference:{key:"cuisine",value:"american"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Texas Roadhouse":{name:"Texas Roadhouse",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/texasroadhouse/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7707945",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Texas Roadhouse","brand:wikidata":"Q7707945","brand:wikipedia":"en:Texas Roadhouse",cuisine:"steak_house",name:"Texas Roadhouse"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/The Cheesecake Factory":{name:"The Cheesecake Factory",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/thecheesecakefactory/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1045842",amenity:"restaurant",cuisine:"american"},addTags:{alt_name:"Cheesecake Factory",amenity:"restaurant",brand:"The Cheesecake Factory","brand:wikidata":"Q1045842","brand:wikipedia":"en:The Cheesecake Factory",cuisine:"american",name:"The Cheesecake Factory"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/The Keg":{name:"The Keg",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/thekegsteakhouseandbar/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7744066",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"The Keg","brand:wikidata":"Q7744066","brand:wikipedia":"en:The Keg",cuisine:"steak_house",name:"The Keg"},countryCodes:["ca","us"],terms:["keg"],matchScore:2,suggestion:true},"amenity/restaurant/The Melting Pot":{name:"The Melting Pot",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/themeltingpotrestaurants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7750948",amenity:"restaurant"},addTags:{alt_name:"Melting Pot",amenity:"restaurant",brand:"The Melting Pot","brand:wikidata":"Q7750948","brand:wikipedia":"en:The Melting Pot (restaurant)",cuisine:"fondue",name:"The Melting Pot"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Toby Carvery":{name:"Toby Carvery",icon:"maki-restaurant",imageURL:"https://pbs.twimg.com/profile_images/1091279321795309573/A5J8Nhws_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q7811777",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Toby Carvery","brand:wikidata":"Q7811777","brand:wikipedia":"en:Toby Carvery",cuisine:"british",name:"Toby Carvery"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/mexican/Toks":{name:"Toks",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/ToksMx/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q48835586",amenity:"restaurant",cuisine:"mexican"},addTags:{amenity:"restaurant",brand:"Toks","brand:wikidata":"Q48835586","brand:wikipedia":"en:Toks",cuisine:"mexican",name:"Toks"},reference:{key:"cuisine",value:"mexican"},countryCodes:["mx"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Tony Roma's":{name:"Tony Roma's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/TonyRomas/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2213883",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Tony Roma's","brand:wikidata":"Q2213883","brand:wikipedia":"en:Tony Roma's",cuisine:"barbecue",name:"Tony Roma's"},terms:["tony roma"],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Toppers Pizza":{name:"Toppers Pizza",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/ToppersRocks/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7825113",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Toppers Pizza","brand:wikidata":"Q7825113","brand:wikipedia":"en:Toppers Pizza",cuisine:"pizza",name:"Toppers Pizza"},reference:{key:"cuisine",value:"pizza"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/italian/Vapiano":{name:"Vapiano",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/Vapiano/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q506252",amenity:"restaurant",cuisine:"italian"},addTags:{amenity:"restaurant",brand:"Vapiano","brand:wikidata":"Q506252","brand:wikipedia":"en:Vapiano",cuisine:"italian",name:"Vapiano"},reference:{key:"cuisine",value:"italian"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Village Inn":{name:"Village Inn",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/villageinnrestaurants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7930659",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Village Inn","brand:wikidata":"Q7930659","brand:wikipedia":"en:Village Inn",cuisine:"american",name:"Village Inn"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Vips":{name:"Vips",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/VIPSMX/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q48783378",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Vips","brand:wikidata":"Q48783378","brand:wikipedia":"es:Vips",name:"Vips"},countryCodes:["es","mx"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Waffle House":{name:"Waffle House",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/WaffleHouse/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1701206",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Waffle House","brand:wikidata":"Q1701206","brand:wikipedia":"en:Waffle House",cuisine:"american",name:"Waffle House",opening_hours:"24/7"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/asian/Wagamama":{name:"Wagamama",icon:"maki-restaurant-noodle",imageURL:"https://graph.facebook.com/wagamama.spain/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q503715",amenity:"restaurant",cuisine:"asian"},addTags:{amenity:"restaurant",brand:"Wagamama","brand:wikidata":"Q503715","brand:wikipedia":"en:Wagamama",cuisine:"asian",name:"Wagamama"},reference:{key:"cuisine",value:"asian"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/japanese/Wasabi":{name:"Wasabi",icon:"maki-restaurant-noodle",imageURL:"https://graph.facebook.com/WasabiUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q23891278",amenity:"restaurant",cuisine:"japanese"},addTags:{amenity:"restaurant",brand:"Wasabi","brand:wikidata":"Q23891278","brand:wikipedia":"en:Wasabi (restaurant)",cuisine:"japanese",name:"Wasabi"},reference:{key:"cuisine",value:"japanese"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Western Sizzlin'":{name:"Western Sizzlin'",icon:"maki-restaurant",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FWestern%20Sizzlin'%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q7988295",amenity:"restaurant",cuisine:"american;steak"},addTags:{amenity:"restaurant",brand:"Western Sizzlin'","brand:wikidata":"Q7988295","brand:wikipedia":"en:Western Sizzlin'",cuisine:"american;steak",name:"Western Sizzlin'"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:["western sizzling"],matchScore:2,suggestion:true},"amenity/restaurant/White Spot":{name:"White Spot",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/whitespot/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7995414",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"White Spot","brand:wikidata":"Q7995414","brand:wikipedia":"en:White Spot",cuisine:"burger",name:"White Spot"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Wingstop":{name:"Wingstop",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/Wingstop/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q8025339",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Wingstop","brand:wikidata":"Q8025339","brand:wikipedia":"en:Wingstop",cuisine:"wings",name:"Wingstop"},countryCodes:["mx","us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/sushi/YO! Sushi":{name:"YO! Sushi",icon:"fas-fish",imageURL:"https://graph.facebook.com/YOSushi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3105441",amenity:"restaurant",cuisine:"sushi"},addTags:{amenity:"restaurant",brand:"YO! Sushi","brand:wikidata":"Q3105441","brand:wikipedia":"en:YO! Sushi",cuisine:"sushi",name:"YO! Sushi"},reference:{key:"cuisine",value:"sushi"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/italian/Zizzi":{name:"Zizzi",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/wearezizzi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q8072944",amenity:"restaurant",cuisine:"italian"},addTags:{amenity:"restaurant",brand:"Zizzi","brand:wikidata":"Q8072944","brand:wikipedia":"en:Zizzi",cuisine:"italian",name:"Zizzi"},reference:{key:"cuisine",value:"italian"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/sushi/Планета Суши":{name:"Планета Суши",icon:"fas-fish",imageURL:"https://graph.facebook.com/sushiplanet.ru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62739250",amenity:"restaurant",cuisine:"sushi"},addTags:{amenity:"restaurant",brand:"Планета Суши","brand:wikidata":"Q62739250",cuisine:"sushi",name:"Планета Суши","name:en":"Planet Sushi"},reference:{key:"cuisine",value:"sushi"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/japanese/Тануки":{name:"Тануки",icon:"maki-restaurant-noodle",imageURL:"https://graph.facebook.com/tanuki.official/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62758690",amenity:"restaurant",cuisine:"japanese"},addTags:{amenity:"restaurant",brand:"Тануки","brand:wikidata":"Q62758690",cuisine:"japanese",name:"Тануки","name:en":"Tanuki","name:ru":"Тануки"},reference:{key:"cuisine",value:"japanese"},countryCodes:["kz","ru","ua"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/בורגר סאלון":{name:"בורגר סאלון",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/BurgerSaloon/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64760057",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"בורגר סאלון","brand:en":"Burger Saloon","brand:he":"בורגר סאלון","brand:wikidata":"Q64760057",cuisine:"burger",name:"בורגר סאלון","name:en":"Burger Saloon","name:he":"בורגר סאלון"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/いきなり!ステーキ":{name:"いきなり!ステーキ",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/ikinari.steak/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q21652405",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"いきなり!ステーキ","brand:en":"Ikinari Steak","brand:ja":"いきなり!ステーキ","brand:wikidata":"Q21652405","brand:wikipedia":"ja:いきなり!ステーキ",cuisine:"steak_house",name:"いきなり!ステーキ","name:en":"Ikinari Steak","name:ja":"いきなり!ステーキ"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/japanese/はなまるうどん":{name:"はなまるうどん",icon:"maki-restaurant-noodle",imageURL:"https://graph.facebook.com/hanamaruudon.jp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11275674",amenity:"restaurant",cuisine:"japanese;udon"},addTags:{amenity:"restaurant",brand:"はなまるうどん","brand:en":"Hanamarūdon","brand:ja":"はなまるうどん","brand:wikidata":"Q11275674","brand:wikipedia":"ja:はなまるうどん",cuisine:"japanese;udon",name:"はなまるうどん","name:en":"Hanamarūdon","name:ja":"はなまるうどん"},reference:{key:"cuisine",value:"japanese"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/びっくりドンキー":{name:"びっくりドンキー",icon:"maki-restaurant",geometry:["point","area"],tags:{"brand:wikidata":"Q11276815",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"びっくりドンキー","brand:en":"Bikkuri Donkey","brand:ja":"びっくりドンキー","brand:wikidata":"Q11276815","brand:wikipedia":"ja:びっくりドンキー",cuisine:"burger",name:"びっくりドンキー","name:en":"Bikkuri Donkey","name:ja":"びっくりドンキー"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/japanese/やよい軒":{name:"やよい軒",icon:"maki-restaurant-noodle",imageURL:"https://graph.facebook.com/yayoiphilippines/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11280577",amenity:"restaurant",cuisine:"japanese"},addTags:{amenity:"restaurant",brand:"やよい軒","brand:en":"Yayoiken","brand:ja":"やよい軒","brand:wikidata":"Q11280577","brand:wikipedia":"ja:やよい軒",cuisine:"japanese",name:"やよい軒","name:en":"Yayoiken","name:ja":"やよい軒"},reference:{key:"cuisine",value:"japanese"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/italian/カプリチョーザ":{name:"カプリチョーザ",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/capricciosa.restaurant/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11294660",amenity:"restaurant",cuisine:"italian"},addTags:{amenity:"restaurant",brand:"カプリチョーザ","brand:en":"Capricciosa","brand:ja":"カプリチョーザ","brand:wikidata":"Q11294660","brand:wikipedia":"ja:カプリチョーザ",cuisine:"italian",name:"カプリチョーザ","name:en":"Capricciosa","name:ja":"カプリチョーザ"},reference:{key:"cuisine",value:"italian"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/japanese/ココス":{name:"ココス",icon:"maki-restaurant-noodle",imageURL:"https://pbs.twimg.com/profile_images/875584429069959169/5l38DoS7_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q11301951",amenity:"restaurant",cuisine:"western;japanese"},addTags:{amenity:"restaurant",brand:"ココス","brand:en":"Coco's","brand:ja":"ココス","brand:wikidata":"Q11301951","brand:wikipedia":"ja:ココスジャパン",cuisine:"western;japanese",name:"ココス","name:en":"Coco's","name:ja":"ココス"},reference:{key:"cuisine",value:"japanese"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/italian/サイゼリヤ":{name:"サイゼリヤ",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/Saizeriya4Fun/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q886564",amenity:"restaurant",cuisine:"italian"},addTags:{amenity:"restaurant",brand:"サイゼリヤ","brand:en":"Saizeriya","brand:ja":"サイゼリヤ","brand:wikidata":"Q886564","brand:wikipedia":"en:Saizeriya",cuisine:"italian",name:"サイゼリヤ","name:en":"Saizeriya","name:ja":"サイゼリヤ"},reference:{key:"cuisine",value:"italian"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/ジョイフル":{name:"ジョイフル",icon:"maki-restaurant",geometry:["point","area"],tags:{"brand:wikidata":"Q11310517",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"ジョイフル","brand:en":"Joyfull","brand:ja":"ジョイフル","brand:wikidata":"Q11310517","brand:wikipedia":"ja:ジョイフル",cuisine:"western",name:"ジョイフル","name:en":"Joyfull","name:ja":"ジョイフル"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/italian/ジョナサン":{name:"ジョナサン",icon:"maki-restaurant",imageURL:"https://pbs.twimg.com/profile_images/1098912743497711618/uM80VkgK_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q11310628",amenity:"restaurant",cuisine:"italian;japanese"},addTags:{amenity:"restaurant",brand:"ジョナサン","brand:en":"Jonathan's","brand:ja":"ジョナサン","brand:wikidata":"Q11310628","brand:wikipedia":"ja:ジョナサン (ファミリーレストラン)",cuisine:"italian;japanese",name:"ジョナサン","name:en":"Jonathan's","name:ja":"ジョナサン"},reference:{key:"cuisine",value:"italian"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/ジョリーパスタ":{name:"ジョリーパスタ",icon:"maki-restaurant",geometry:["point","area"],tags:{"brand:wikidata":"Q10852718",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"ジョリーパスタ","brand:en":"Jolly-Pasta","brand:ja":"ジョリーパスタ","brand:wikidata":"Q10852718","brand:wikipedia":"ja:ジョリーパスタ",cuisine:"pasta",name:"ジョリーパスタ","name:en":"Jolly-Pasta","name:ja":"ジョリーパスタ"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/ステーキガスト":{name:"ステーキガスト",icon:"maki-restaurant",geometry:["point","area"],tags:{"brand:wikidata":"Q11253593",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"ステーキガスト","brand:en":"Skylark","brand:ja":"ステーキガスト","brand:wikidata":"Q11253593","brand:wikipedia":"ja:すかいらーく",cuisine:"steak",name:"ステーキガスト","name:en":"Skylark","name:ja":"ステーキガスト"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/japanese/デニーズ":{name:"デニーズ",icon:"maki-restaurant-noodle",geometry:["point","area"],tags:{"brand:wikidata":"Q11320661",amenity:"restaurant",cuisine:"western;japanese"},addTags:{amenity:"restaurant",brand:"デニーズ","brand:en":"Denny's","brand:ja":"デニーズ","brand:wikidata":"Q11320661","brand:wikipedia":"ja:デニーズ (日本)",cuisine:"western;japanese",name:"デニーズ","name:en":"Denny's","name:ja":"デニーズ"},reference:{key:"cuisine",value:"japanese"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/chinese/バーミヤン":{name:"バーミヤン",icon:"maki-restaurant-noodle",imageURL:"https://pbs.twimg.com/profile_images/1098907474789163010/uXiRaQ9S_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q11328598",amenity:"restaurant",cuisine:"chinese"},addTags:{amenity:"restaurant",brand:"バーミヤン","brand:en":"Bamiyan","brand:ja":"バーミヤン","brand:wikidata":"Q11328598","brand:wikipedia":"ja:バーミヤン (レストランチェーン)",cuisine:"chinese",name:"バーミヤン","name:en":"Bamiyan","name:ja":"バーミヤン"},reference:{key:"cuisine",value:"chinese"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/ビッグボーイ":{name:"ビッグボーイ",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/bigboyrestaurants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4386779",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"ビッグボーイ","brand:en":"Big Boy Restaurants","brand:ja":"ビッグボーイ","brand:wikidata":"Q4386779","brand:wikipedia":"en:Big Boy Restaurants",cuisine:"burger",name:"ビッグボーイ","name:en":"Big Boy Restaurants","name:ja":"ビッグボーイ"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/japanese/リンガーハット":{name:"リンガーハット",icon:"maki-restaurant-noodle",geometry:["point","area"],tags:{"brand:wikidata":"Q7334856",amenity:"restaurant",cuisine:"japanese"},addTags:{amenity:"restaurant",brand:"リンガーハット","brand:en":"Ringer Hut","brand:ja":"リンガーハット","brand:wikidata":"Q7334856","brand:wikipedia":"en:Ringer Hut",cuisine:"japanese",name:"リンガーハット","name:en":"Ringer Hut","name:ja":"リンガーハット"},reference:{key:"cuisine",value:"japanese"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/japanese/ロイヤルホスト":{name:"ロイヤルホスト",icon:"maki-restaurant-noodle",geometry:["point","area"],tags:{"brand:wikidata":"Q11120884",amenity:"restaurant",cuisine:"japanese;italian;french"},addTags:{amenity:"restaurant",brand:"ロイヤルホスト","brand:en":"Royal Host","brand:ja":"ロイヤルホスト","brand:wikidata":"Q11120884","brand:wikipedia":"ja:ロイヤルホスト",cuisine:"japanese;italian;french",name:"ロイヤルホスト","name:en":"Royal Host","name:ja":"ロイヤルホスト"},reference:{key:"cuisine",value:"japanese"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/noodle/丸亀製麺":{name:"丸亀製麺",icon:"maki-restaurant-noodle",imageURL:"https://graph.facebook.com/marugame/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10877253",amenity:"restaurant",cuisine:"noodle"},addTags:{amenity:"restaurant",brand:"丸亀製麺","brand:en":"Marugame Seimen","brand:ja":"丸亀製麺","brand:wikidata":"Q10877253","brand:wikipedia":"ja:丸亀製麺",cuisine:"noodle",name:"丸亀製麺","name:en":"Marugame Seimen","name:ja":"丸亀製麺"},reference:{key:"cuisine",value:"noodle"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/八方雲集":{name:"八方雲集",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/8wayTW/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q28417381",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"八方雲集","brand:en":"Eight Way","brand:wikidata":"Q28417381","brand:wikipedia":"zh:八方雲集","brand:zh":"八方雲集",name:"八方雲集","name:en":"Eight Way","name:zh":"八方雲集"},countryCodes:["cn","tw"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/japanese/和食さと":{name:"和食さと",icon:"maki-restaurant-noodle",imageURL:"https://graph.facebook.com/satorsgroup/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11304897",amenity:"restaurant",cuisine:"japanese"},addTags:{amenity:"restaurant",brand:"和食さと","brand:en":"Washoku Sato","brand:ja":"和食さと","brand:wikidata":"Q11304897","brand:wikipedia":"ja:SRSホールディングス",cuisine:"japanese",name:"和食さと","name:en":"Washoku Sato","name:ja":"和食さと"},reference:{key:"cuisine",value:"japanese"},countryCodes:["jp"],terms:["さと"],matchScore:2,suggestion:true},"amenity/restaurant/japanese/夢庵":{name:"夢庵",icon:"maki-restaurant-noodle",geometry:["point","area"],tags:{"brand:wikidata":"Q11253593",amenity:"restaurant",cuisine:"japanese"},addTags:{amenity:"restaurant",brand:"夢庵","brand:en":"Yumean","brand:ja":"夢庵","brand:wikidata":"Q11253593","brand:wikipedia":"ja:すかいらーく",cuisine:"japanese",name:"夢庵","name:en":"Yumean","name:ja":"夢庵"},reference:{key:"cuisine",value:"japanese"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/japanese/大戸屋":{name:"大戸屋",icon:"maki-restaurant-noodle",imageURL:"https://graph.facebook.com/ootoya/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11435522",amenity:"restaurant",cuisine:"japanese"},addTags:{amenity:"restaurant",brand:"大戸屋","brand:en":"Ootoya","brand:ja":"大戸屋","brand:wikidata":"Q11435522","brand:wikipedia":"ja:大戸屋ホールディングス",cuisine:"japanese",name:"大戸屋","name:en":"Ootoya","name:ja":"大戸屋"},reference:{key:"cuisine",value:"japanese"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/japanese/大阪王将":{name:"大阪王将",icon:"maki-restaurant-noodle",imageURL:"https://graph.facebook.com/osakaohsho/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q48743717",amenity:"restaurant",cuisine:"japanese;chinese"},addTags:{amenity:"restaurant",brand:"大阪王将","brand:en":"Osaka Ohsho","brand:ja":"大阪王将","brand:wikidata":"Q48743717","brand:wikipedia":"ja:大阪王将",cuisine:"japanese;chinese",name:"大阪王将","name:en":"Osaka Ohsho","name:ja":"大阪王将"},reference:{key:"cuisine",value:"japanese"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/天下一品":{name:"天下一品",icon:"maki-restaurant",geometry:["point","area"],tags:{"brand:wikidata":"Q11442172",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"天下一品","brand:en":"Tenkaippin","brand:wikidata":"Q11442172","brand:wikipedia":"en:Tenkaippin",cuisine:"ramen",name:"天下一品","name:en":"Tenkaippin"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/安楽亭":{name:"安楽亭",icon:"maki-restaurant",geometry:["point","area"],tags:{"brand:wikidata":"Q11450866",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"安楽亭","brand:en":"Anrakutei","brand:wikidata":"Q11450866","brand:wikipedia":"ja:安楽亭",cuisine:"barbecue",name:"安楽亭","name:en":"Anrakutei"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/japanese/木曽路":{name:"木曽路",icon:"maki-restaurant-noodle",geometry:["point","area"],tags:{"brand:wikidata":"Q11518589",amenity:"restaurant",cuisine:"japanese"},addTags:{amenity:"restaurant",brand:"木曽路","brand:en":"Kisoji","brand:jp":"木曽路","brand:wikidata":"Q11518589","brand:wikipedia":"ja:木曽路 (企業)",cuisine:"japanese",name:"木曽路","name:en":"Kisoji","name:jp":"木曽路"},reference:{key:"cuisine",value:"japanese"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/chinese/永和豆漿":{name:"永和豆漿",icon:"maki-restaurant-noodle",geometry:["point","area"],tags:{"brand:wikidata":"Q11131335",amenity:"restaurant",cuisine:"chinese;breakfast"},addTags:{amenity:"restaurant",brand:"永和豆漿","brand:en":"Yonghe Soy Milk","brand:wikidata":"Q11131335","brand:wikipedia":"zh:永和豆漿",cuisine:"chinese;breakfast",name:"永和豆漿","name:en":"Yonghe Soy Milk"},reference:{key:"cuisine",value:"chinese"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/牛角":{name:"牛角",icon:"maki-restaurant",geometry:["point","area"],tags:{"brand:wikidata":"Q11349387",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"牛角","brand:en":"Gyū-Kaku","brand:wikidata":"Q11349387","brand:wikipedia":"en:Gyu-Kaku",cuisine:"barbecue",name:"牛角","name:en":"Gyū-Kaku"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/japanese/華屋与兵衛":{name:"華屋与兵衛",icon:"maki-restaurant-noodle",geometry:["point","area"],tags:{"brand:wikidata":"Q11620063",amenity:"restaurant",cuisine:"japanese"},addTags:{amenity:"restaurant",brand:"華屋与兵衛","brand:en":"Hanaya Yohei","brand:ja":"華屋与兵衛","brand:wikidata":"Q11620063","brand:wikipedia":"ja:華屋与兵衛 (レストラン)",cuisine:"japanese",name:"華屋与兵衛","name:en":"Hanaya Yohei","name:ja":"華屋与兵衛"},reference:{key:"cuisine",value:"japanese"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/chinese/餃子の王将":{name:"餃子の王将",icon:"maki-restaurant-noodle",imageURL:"https://graph.facebook.com/ohshosaiyo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11666805",amenity:"restaurant",cuisine:"chinese;gyoza"},addTags:{amenity:"restaurant",brand:"餃子の王将","brand:en":"Gyoza no Ohsho","brand:ja":"餃子の王将","brand:wikidata":"Q11666805","brand:wikipedia":"en:Gyoza no Ohsho",cuisine:"chinese;gyoza",name:"餃子の王将","name:en":"Gyoza no Ohsho","name:ja":"餃子の王将"},reference:{key:"cuisine",value:"chinese"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/빕스":{name:"빕스",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/ivips/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12599540",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"빕스","brand:en":"VIPS","brand:ko":"빕스","brand:wikidata":"Q12599540","brand:wikipedia":"en:VIPS (restaurant)",name:"빕스","name:en":"VIPS","name:ko":"빕스"},countryCodes:["kr"],terms:[],matchScore:2,suggestion:true},"amenity/social_centre/American Legion Hall":{name:"American Legion Hall",icon:"fas-handshake",imageURL:"https://graph.facebook.com/americanlegionhq/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q468865",amenity:"social_centre"},addTags:{amenity:"social_centre",brand:"American Legion","brand:wikidata":"Q468865","brand:wikipedia":"en:American Legion",name:"American Legion Hall","social_centre:for":"veterans"},countryCodes:["us"],terms:["american legion"],matchScore:2,suggestion:true},"amenity/social_centre/Eagles Lodge":{name:"Eagles Lodge",icon:"fas-handshake",imageURL:"https://graph.facebook.com/foegrandaerie/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5493810",amenity:"social_centre"},addTags:{alt_name:"Aeries Lodge",amenity:"social_centre",brand:"Fraternal Order of Eagles","brand:wikidata":"Q5493810","brand:wikipedia":"en:Fraternal Order of Eagles",name:"Eagles Lodge",official_name:"Fraternal Order of Eagles"},countryCodes:["us"],terms:["aeries","eagles","foe"],matchScore:2,suggestion:true},"amenity/social_centre/Elks Lodge":{name:"Elks Lodge",icon:"fas-handshake",imageURL:"https://graph.facebook.com/107605905935671/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2895789",amenity:"social_centre"},addTags:{amenity:"social_centre",brand:"Benevolent and Protective Order of Elks","brand:wikidata":"Q2895789","brand:wikipedia":"en:Benevolent and Protective Order of Elks",name:"Elks Lodge",official_name:"Benevolent and Protective Order of Elks"},countryCodes:["us"],terms:["bpoe","elks"],matchScore:2,suggestion:true},"amenity/social_centre/Moose Lodge":{name:"Moose Lodge",icon:"fas-handshake",imageURL:"https://graph.facebook.com/heardofmoose/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6908585",amenity:"social_centre"},addTags:{amenity:"social_centre",brand:"Loyal Order of Moose","brand:wikidata":"Q6908585","brand:wikipedia":"en:Loyal Order of Moose",name:"Moose Lodge",official_name:"Loyal Order of Moose"},countryCodes:["bm","ca","us"],terms:["moose"],matchScore:2,suggestion:true},"amenity/social_centre/Odd Fellows Hall":{name:"Odd Fellows Hall",icon:"fas-handshake",imageURL:"https://graph.facebook.com/IOOFSGL/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1425508",amenity:"social_centre"},addTags:{amenity:"social_centre",brand:"Independent Order of Odd Fellows","brand:wikidata":"Q1425508","brand:wikipedia":"en:Independent Order of Odd Fellows",name:"Odd Fellows Hall",official_name:"Independent Order of Odd Fellows"},terms:["ioof","odd fellow","odd fellows"],matchScore:2,suggestion:true},"amenity/vehicle_inspection/Autosur":{name:"Autosur",icon:"maki-car",imageURL:"https://graph.facebook.com/autosurfrance/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64224807",amenity:"vehicle_inspection"},addTags:{amenity:"vehicle_inspection",brand:"Autosur","brand:wikidata":"Q64224807",name:"Autosur"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"amenity/vehicle_inspection/Autovision":{name:"Autovision",icon:"maki-car",imageURL:"https://graph.facebook.com/AutovisionFrance/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64224842",amenity:"vehicle_inspection"},addTags:{amenity:"vehicle_inspection",brand:"Autovision","brand:wikidata":"Q64224842",name:"Autovision"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"amenity/vehicle_inspection/Dekra":{name:"Dekra",icon:"maki-car",imageURL:"https://pbs.twimg.com/profile_images/3238634623/8ccb79c10c4bfb652432961fe776c6c3_bigger.jpeg",geometry:["point","area"],tags:{"brand:wikidata":"Q383711",amenity:"vehicle_inspection"},addTags:{amenity:"vehicle_inspection",brand:"Dekra","brand:wikidata":"Q383711","brand:wikipedia":"en:Dekra",name:"Dekra",official_name:"Dekra Automotive"},countryCodes:["de","fr"],terms:[],matchScore:2,suggestion:true},"amenity/vehicle_inspection/Sécuritest":{name:"Sécuritest",icon:"maki-car",imageURL:"https://graph.facebook.com/218871841874062/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64224992",amenity:"vehicle_inspection"},addTags:{amenity:"vehicle_inspection",brand:"Sécuritest","brand:wikidata":"Q64224992",name:"Sécuritest"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"amenity/vending_machine/parcel_pickup/Amazon Locker":{name:"Amazon Locker",icon:"temaki-vending_machine",imageURL:"https://graph.facebook.com/amazon/picture?type=large",geometry:["point"],tags:{"brand:wikidata":"Q16974764",amenity:"vending_machine",vending:"parcel_pickup"},addTags:{amenity:"vending_machine",brand:"Amazon Locker","brand:wikidata":"Q16974764","brand:wikipedia":"en:Amazon Locker",name:"Amazon Locker",vending:"parcel_pickup"},reference:{key:"vending",value:"parcel_pickup"},countryCodes:["de","us"],terms:[],matchScore:2,suggestion:true},"amenity/vending_machine/public_transport_tickets/Automat ŚKUP":{name:"Automat ŚKUP",icon:"temaki-vending_machine",geometry:["point"],tags:{"brand:wikidata":"Q24945427",amenity:"vending_machine",vending:"public_transport_tickets"},addTags:{amenity:"vending_machine",brand:"Automat ŚKUP","brand:wikidata":"Q24945427","brand:wikipedia":"pl:Śląska Karta Usług Publicznych",name:"Automat ŚKUP",vending:"public_transport_tickets"},reference:{key:"vending",value:"public_transport_tickets"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"amenity/vending_machine/public_transport_tickets/BKK-automata":{name:"BKK-automata",icon:"temaki-vending_machine",imageURL:"https://graph.facebook.com/bkkbudapest/picture?type=large",geometry:["point"],tags:{"brand:wikidata":"Q608917",amenity:"vending_machine",vending:"public_transport_tickets"},addTags:{amenity:"vending_machine",brand:"BKK-automata","brand:wikidata":"Q608917","brand:wikipedia":"hu:Budapesti Közlekedési Központ",name:"BKK-automata",vending:"public_transport_tickets"},reference:{key:"vending",value:"public_transport_tickets"},countryCodes:["hu"],terms:[],matchScore:2,suggestion:true},"amenity/vending_machine/parcel_pickup_dropoff/DHL Packstation":{name:"DHL Packstation",icon:"temaki-vending_machine",geometry:["point"],tags:{"brand:wikidata":"Q1766703",amenity:"vending_machine",vending:"parcel_pickup;parcel_mail_in"},addTags:{amenity:"vending_machine",brand:"Packstation","brand:wikidata":"Q1766703","brand:wikipedia":"en:Packstation",name:"DHL Packstation",vending:"parcel_pickup;parcel_mail_in"},reference:{key:"vending",value:"parcel_pickup;parcel_mail_in"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/vending_machine/DHL Paketbox":{name:"DHL Paketbox",icon:"temaki-vending_machine",geometry:["point"],tags:{"brand:wikidata":"Q2046604",amenity:"vending_machine"},addTags:{amenity:"vending_machine",brand:"Paketbox","brand:wikidata":"Q2046604","brand:wikipedia":"de:Paketbox",name:"DHL Paketbox",vending:"parcel_mail_in"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/vending_machine/excrement_bags/Dog-Station":{name:"Dog-Station",icon:"temaki-vending_machine",geometry:["point"],tags:{"brand:wikidata":"Q63720061",amenity:"vending_machine",vending:"excrement_bags"},addTags:{amenity:"vending_machine",brand:"Dog-Station","brand:wikidata":"Q63720061",name:"Dog-Station",vending:"excrement_bags"},reference:{key:"vending",value:"excrement_bags"},countryCodes:["at","de","dk"],terms:[],matchScore:2,suggestion:true},"amenity/vending_machine/public_transport_tickets/KKM":{name:"KKM",icon:"temaki-vending_machine",geometry:["point"],tags:{"brand:wikidata":"Q57515549",amenity:"vending_machine",vending:"public_transport_tickets"},addTags:{amenity:"vending_machine",brand:"KKM","brand:wikidata":"Q57515549",name:"KKM",vending:"public_transport_tickets"},reference:{key:"vending",value:"public_transport_tickets"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"amenity/vending_machine/parcel_pickup_dropoff/Paczkomat InPost":{name:"Paczkomat InPost",icon:"temaki-vending_machine",imageURL:"https://graph.facebook.com/paczkomaty/picture?type=large",geometry:["point"],tags:{"brand:wikidata":"Q3182097",amenity:"vending_machine",vending:"parcel_pickup;parcel_mail_in"},addTags:{amenity:"vending_machine",brand:"InPost","brand:wikidata":"Q3182097","brand:wikipedia":"pl:InPost",name:"Paczkomat InPost",vending:"parcel_pickup;parcel_mail_in"},reference:{key:"vending",value:"parcel_pickup;parcel_mail_in"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"amenity/vending_machine/parking_tickets/ParkPlus (Calgary)":{name:"ParkPlus (Calgary)",icon:"temaki-vending_machine",imageURL:"https://graph.facebook.com/CalgaryParkingAuthority/picture?type=large",geometry:["point"],tags:{"brand:wikidata":"Q63719595",amenity:"vending_machine",vending:"parking_tickets"},addTags:{amenity:"vending_machine",brand:"ParkPlus","brand:wikidata":"Q63719595",name:"ParkPlus",vending:"parking_tickets"},reference:{key:"vending",value:"parking_tickets"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/vending_machine/Redbox":{name:"Redbox",icon:"temaki-vending_machine",imageURL:"https://graph.facebook.com/redbox/picture?type=large",geometry:["point"],tags:{"brand:wikidata":"Q7305489",amenity:"vending_machine"},addTags:{amenity:"vending_machine",brand:"Redbox","brand:wikidata":"Q7305489","brand:wikipedia":"en:Redbox",name:"Redbox",vending:"dvd"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/vending_machine/excrement_bags/Robidog":{name:"Robidog",icon:"temaki-vending_machine",geometry:["point"],tags:{"brand:wikidata":"Q2159689",amenity:"vending_machine",vending:"excrement_bags"},addTags:{amenity:"vending_machine",brand:"Robidog","brand:wikidata":"Q2159689","brand:wikipedia":"de:Robidog",name:"Robidog",vending:"excrement_bags"},reference:{key:"vending",value:"excrement_bags"},countryCodes:["ch"],terms:[],matchScore:2,suggestion:true},"amenity/vending_machine/parcel_pickup_dropoff/Smartpost":{name:"Smartpost",icon:"temaki-vending_machine",geometry:["point"],tags:{"brand:wikidata":"Q7543889",amenity:"vending_machine",vending:"parcel_pickup;parcel_mail_in"},addTags:{amenity:"vending_machine",brand:"Smartpost","brand:wikidata":"Q7543889","brand:wikipedia":"fi:SmartPOST",name:"Smartpost",vending:"parcel_pickup;parcel_mail_in"},reference:{key:"vending",value:"parcel_pickup;parcel_mail_in"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"amenity/vending_machine/cigarettes/Tobaccoland":{name:"Tobaccoland",icon:"temaki-vending_machine",geometry:["point"],tags:{"brand:wikidata":"Q1439872",amenity:"vending_machine",vending:"cigarettes"},addTags:{amenity:"vending_machine",brand:"Tobaccoland","brand:wikidata":"Q1439872","brand:wikipedia":"de:Tobaccoland Automatengesellschaft",name:"Tobaccoland",vending:"cigarettes"},reference:{key:"vending",value:"cigarettes"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/vending_machine/drinks/コカ・コーラ":{name:"コカ・コーラ",icon:"temaki-vending_machine",imageURL:"https://pbs.twimg.com/profile_images/1133719168996564992/YYUxyMIM_bigger.png",geometry:["point"],tags:{"brand:wikidata":"Q2813",amenity:"vending_machine",vending:"drinks"},addTags:{amenity:"vending_machine",brand:"コカ・コーラ","brand:en":"Coca-Cola","brand:ja":"コカ・コーラ","brand:wikidata":"Q2813","brand:wikipedia":"ja:コカ・コーラ",drink:"cola",name:"コカ・コーラ","name:en":"Coca-Cola","name:ja":"コカ・コーラ",vending:"drinks"},reference:{key:"vending",value:"drinks"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/vending_machine/ポッカサッポロ":{name:"ポッカサッポロ",icon:"temaki-vending_machine",imageURL:"https://pbs.twimg.com/profile_images/937822527543377920/j8-XeRV8_bigger.jpg",geometry:["point"],tags:{"brand:wikidata":"Q7208665",amenity:"vending_machine"},addTags:{amenity:"vending_machine",brand:"ポッカサッポロ","brand:en":"Pokka Sapporo","brand:ja":"ポッカサッポロ","brand:wikidata":"Q7208665","brand:wikipedia":"ja:ポッカサッポロフード&ビバレッジ",name:"ポッカサッポロ","name:en":"Pokka Sapporo","name:ja":"ポッカサッポロ",vending:"water;food"},countryCodes:["jp"],terms:["pokka sapporo"],matchScore:2,suggestion:true},"amenity/veterinary/Banfield Pet Hospital":{name:"Banfield Pet Hospital",icon:"temaki-veterinary_care",imageURL:"https://graph.facebook.com/BanfieldPetHospital/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2882416",amenity:"veterinary"},addTags:{amenity:"veterinary",brand:"Banfield Pet Hospital","brand:wikidata":"Q2882416","brand:wikipedia":"en:Banfield Pet Hospital",name:"Banfield Pet Hospital"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/veterinary/VCA Animal Hospital":{name:"VCA Animal Hospital",icon:"temaki-veterinary_care",imageURL:"https://graph.facebook.com/VCAAnimalHospitals/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7906620",amenity:"veterinary"},addTags:{amenity:"veterinary",brand:"VCA Animal Hospital","brand:wikidata":"Q7906620","brand:wikipedia":"en:VCA Animal Hospitals",name:"VCA Animal Hospital"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"craft/signmaker/Fastsigns":{name:"Fastsigns",icon:"temaki-tools",imageURL:"https://graph.facebook.com/FASTSIGNS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5437127",craft:"signmaker"},addTags:{brand:"Fastsigns","brand:wikidata":"Q5437127","brand:wikipedia":"en:Fastsigns",craft:"signmaker",name:"Fastsigns"},countryCodes:["ae","ca","cl","gb","ky","mx","sa","us"],terms:[],matchScore:2,suggestion:true},"healthcare/blood_donation/Australian Red Cross Blood Service":{name:"Australian Red Cross Blood Service",icon:"maki-blood-bank",imageURL:"https://graph.facebook.com/AustralianRedCross/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4824610",healthcare:"blood_donation"},addTags:{brand:"Australian Red Cross","brand:wikidata":"Q4824610","brand:wikipedia":"en:Australian Red Cross","donation:compensation":"no",healthcare:"blood_donation",name:"Australian Red Cross Blood Service",short_name:"Blood Service"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"amenity/clinic/ZoomCare":{name:"ZoomCare",icon:"maki-doctor",imageURL:"https://graph.facebook.com/ZOOMCare/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64120374",amenity:"clinic"},addTags:{amenity:"clinic",brand:"ZoomCare","brand:wikidata":"Q64120374","brand:wikipedia":"en:ZoomCare",healthcare:"clinic",name:"ZoomCare",urgent_care:"yes"},reference:{key:"amenity",value:"clinic"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"healthcare/counselling/Jenny Craig":{name:"Jenny Craig",icon:"fas-comments",imageURL:"https://graph.facebook.com/jennycraig/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6179221",healthcare:"counselling"},addTags:{brand:"Jenny Craig","brand:wikidata":"Q6179221","brand:wikipedia":"en:Jenny Craig, Inc.",healthcare:"counselling","healthcare:counselling":"dietitian","healthcare:speciality":"weight_loss",name:"Jenny Craig"},countryCodes:["au","ca","nz","us"],terms:[],matchScore:2,suggestion:true},"healthcare/counselling/WW Studio":{name:"WW Studio",icon:"fas-comments",imageURL:"https://graph.facebook.com/WW/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1929466",healthcare:"counselling"},addTags:{alt_name:"Weight Watchers",brand:"WW Studio","brand:wikidata":"Q1929466","brand:wikipedia":"en:WW International",healthcare:"counselling","healthcare:counselling":"dietitian","healthcare:speciality":"weight_loss",name:"WW Studio"},terms:["ww"],matchScore:2,suggestion:true},"landuse/residential/Avalon":{name:"Avalon",icon:"maki-building",imageURL:"https://pbs.twimg.com/profile_images/859879308940193792/us4WbKaN_bigger.jpg",geometry:["area"],tags:{"brand:wikidata":"Q64665938",landuse:"residential"},addTags:{brand:"Avalon","brand:wikidata":"Q64665938",landuse:"residential",name:"Avalon",residential:"apartments"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"leisure/escape_game/Escapology":{name:"Escapology",icon:"fas-puzzle-piece",imageURL:"https://graph.facebook.com/EscapologySanDiego/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64137163",leisure:"escape_game"},addTags:{brand:"Escapology","brand:wikidata":"Q64137163",leisure:"escape_game",name:"Escapology"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"leisure/fitness_centre/24 Hour Fitness":{name:"24 Hour Fitness",icon:"fas-dumbbell",imageURL:"https://graph.facebook.com/24HourFitness/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4631849",leisure:"fitness_centre"},addTags:{brand:"24 Hour Fitness","brand:wikidata":"Q4631849","brand:wikipedia":"en:24 Hour Fitness",leisure:"fitness_centre",name:"24 Hour Fitness"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"leisure/fitness_centre/Anytime Fitness":{name:"Anytime Fitness",icon:"fas-dumbbell",imageURL:"https://graph.facebook.com/anytimefitness/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4778364",leisure:"fitness_centre"},addTags:{brand:"Anytime Fitness","brand:wikidata":"Q4778364","brand:wikipedia":"en:Anytime Fitness",leisure:"fitness_centre",name:"Anytime Fitness"},terms:[],matchScore:2,suggestion:true},"leisure/fitness_centre/Basic-Fit":{name:"Basic-Fit",icon:"fas-dumbbell",imageURL:"https://graph.facebook.com/BasicFitEspana/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q40165577",leisure:"fitness_centre"},addTags:{brand:"Basic-Fit","brand:wikidata":"Q40165577","brand:wikipedia":"nl:Basic-Fit",leisure:"fitness_centre",name:"Basic-Fit"},countryCodes:["be","es","fr","lu","nl"],terms:[],matchScore:2,suggestion:true},"leisure/fitness_centre/Clever fit":{name:"Clever fit",icon:"fas-dumbbell",imageURL:"https://graph.facebook.com/cleverfit/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q27909675",leisure:"fitness_centre"},addTags:{brand:"Clever fit","brand:wikidata":"Q27909675","brand:wikipedia":"de:Clever fit",leisure:"fitness_centre",name:"Clever fit"},countryCodes:["at","ch","de"],terms:[],matchScore:2,suggestion:true},"leisure/fitness_centre/CorePower Yoga":{name:"CorePower Yoga",icon:"fas-dumbbell",imageURL:"https://graph.facebook.com/CorePowerYoga/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q21015663",leisure:"fitness_centre"},addTags:{brand:"CorePower Yoga","brand:wikidata":"Q21015663","brand:wikipedia":"en:CorePower Yoga",leisure:"fitness_centre",name:"CorePower Yoga",sport:"yoga"},countryCodes:["us"],terms:["corepower"],matchScore:2,suggestion:true},"leisure/fitness_centre/Crunch Fitness":{name:"Crunch Fitness",icon:"fas-dumbbell",imageURL:"https://graph.facebook.com/CRUNCH/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5190093",leisure:"fitness_centre"},addTags:{brand:"Crunch Fitness","brand:wikidata":"Q5190093","brand:wikipedia":"en:Crunch Fitness",leisure:"fitness_centre",name:"Crunch Fitness"},countryCodes:["au","ca","us"],terms:[],matchScore:2,suggestion:true},"leisure/fitness_centre/Curves":{name:"Curves",icon:"fas-dumbbell",imageURL:"https://graph.facebook.com/Curves/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5196080",leisure:"fitness_centre"},addTags:{brand:"Curves","brand:wikidata":"Q5196080","brand:wikipedia":"en:Curves International",leisure:"fitness_centre",name:"Curves"},terms:[],matchScore:2,suggestion:true},"leisure/fitness_centre/F45 Training":{name:"F45 Training",icon:"fas-dumbbell",imageURL:"https://graph.facebook.com/F45FunctionalTraining/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64390973",leisure:"fitness_centre"},addTags:{brand:"F45 Training","brand:wikidata":"Q64390973",leisure:"fitness_centre",name:"F45 Training"},terms:[],matchScore:2,suggestion:true},"leisure/fitness_centre/Fit4Less  (Canada)":{name:"Fit4Less  (Canada)",icon:"fas-dumbbell",imageURL:"https://pbs.twimg.com/profile_images/1002267809248768000/7GDwAjgc_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q64821050",leisure:"fitness_centre"},addTags:{brand:"Fit4Less","brand:wikidata":"Q64821050",leisure:"fitness_centre",name:"Fit4Less"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"leisure/fitness_centre/Fit4less  (UK)":{name:"Fit4less  (UK)",icon:"fas-dumbbell",imageURL:"https://pbs.twimg.com/profile_images/570920453774917632/3SpVGgNU_bigger.jpeg",geometry:["point","area"],tags:{"brand:wikidata":"Q64821053",leisure:"fitness_centre"},addTags:{brand:"Fit4less","brand:wikidata":"Q64821053",leisure:"fitness_centre",name:"Fit4less"},countryCodes:["uk"],terms:[],matchScore:2,suggestion:true},"leisure/fitness_centre/Fitness First":{name:"Fitness First",icon:"fas-dumbbell",imageURL:"https://graph.facebook.com/FitnessFirstGER/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q127120",leisure:"fitness_centre"},addTags:{brand:"Fitness First","brand:wikidata":"Q127120","brand:wikipedia":"en:Fitness First",leisure:"fitness_centre",name:"Fitness First"},countryCodes:["ae","au","de","gb","ph","th"],terms:[],matchScore:2,suggestion:true},"leisure/fitness_centre/Fitness24Seven":{name:"Fitness24Seven",icon:"fas-dumbbell",imageURL:"https://graph.facebook.com/Fitness24SevenSweden/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61112447",leisure:"fitness_centre"},addTags:{brand:"Fitness24Seven","brand:wikidata":"Q61112447","brand:wikipedia":"sv:Fitness24Seven",leisure:"fitness_centre",name:"Fitness24Seven"},countryCodes:["fi","se"],terms:[],matchScore:2,suggestion:true},"leisure/fitness_centre/Gold's Gym":{name:"Gold's Gym",icon:"fas-dumbbell",imageURL:"https://graph.facebook.com/goldsgym/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1536234",leisure:"fitness_centre"},addTags:{brand:"Gold's Gym","brand:wikidata":"Q1536234","brand:wikipedia":"en:Gold's Gym",leisure:"fitness_centre",name:"Gold's Gym"},countryCodes:["ae","in","ph","us"],terms:[],matchScore:2,suggestion:true},"leisure/fitness_centre/GoodLife Fitness":{name:"GoodLife Fitness",icon:"fas-dumbbell",geometry:["point","area"],tags:{"brand:wikidata":"Q3110654",leisure:"fitness_centre"},addTags:{brand:"GoodLife Fitness","brand:wikidata":"Q3110654","brand:wikipedia":"en:GoodLife Fitness",leisure:"fitness_centre",name:"GoodLife Fitness"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"leisure/fitness_centre/Jazzercise":{name:"Jazzercise",icon:"fas-dumbbell",imageURL:"https://graph.facebook.com/Jazzerciseinc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6168434",leisure:"fitness_centre"},addTags:{brand:"Jazzercise","brand:wikidata":"Q6168434","brand:wikipedia":"en:Jazzercise",leisure:"fitness_centre",name:"Jazzercise"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"leisure/fitness_centre/LA Fitness":{name:"LA Fitness",icon:"fas-dumbbell",imageURL:"https://graph.facebook.com/LAFitness/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6457180",leisure:"fitness_centre"},addTags:{brand:"LA Fitness","brand:wikidata":"Q6457180","brand:wikipedia":"en:LA Fitness",leisure:"fitness_centre",name:"LA Fitness"},countryCodes:["ca","gb","us"],terms:[],matchScore:2,suggestion:true},"leisure/fitness_centre/Life Time":{name:"Life Time",icon:"fas-dumbbell",imageURL:"https://graph.facebook.com/LifeTime.Life/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6545004",leisure:"fitness_centre"},addTags:{brand:"Life Time","brand:wikidata":"Q6545004","brand:wikipedia":"en:Life Time Fitness",leisure:"fitness_centre",name:"Life Time"},countryCodes:["ca","us"],terms:["life time athletic","life time fitness"],matchScore:2,suggestion:true},"leisure/fitness_centre/McFit":{name:"McFit",icon:"fas-dumbbell",imageURL:"https://graph.facebook.com/mcfit.DE/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q871302",leisure:"fitness_centre"},addTags:{brand:"McFit","brand:wikidata":"Q871302","brand:wikipedia":"en:McFit",leisure:"fitness_centre",name:"McFit"},countryCodes:["at","de","es","it","pl"],terms:[],matchScore:2,suggestion:true},"leisure/fitness_centre/Orangetheory Fitness":{name:"Orangetheory Fitness",icon:"fas-dumbbell",imageURL:"https://graph.facebook.com/OrangeTheoryFitness/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q25005163",leisure:"fitness_centre"},addTags:{brand:"Orangetheory Fitness","brand:wikidata":"Q25005163","brand:wikipedia":"en:Orangetheory Fitness",leisure:"fitness_centre",name:"Orangetheory Fitness"},countryCodes:["ca","es","us"],terms:["orangetheory"],matchScore:2,suggestion:true},"leisure/fitness_centre/Planet Fitness":{name:"Planet Fitness",icon:"fas-dumbbell",imageURL:"https://graph.facebook.com/planetfitness/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7201095",leisure:"fitness_centre"},addTags:{brand:"Planet Fitness","brand:wikidata":"Q7201095","brand:wikipedia":"en:Planet Fitness",leisure:"fitness_centre",name:"Planet Fitness"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"leisure/fitness_centre/PureGym":{name:"PureGym",icon:"fas-dumbbell",imageURL:"https://graph.facebook.com/puregym/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q18345898",leisure:"fitness_centre"},addTags:{brand:"PureGym","brand:wikidata":"Q18345898","brand:wikipedia":"en:PureGym",leisure:"fitness_centre",name:"PureGym"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"leisure/fitness_centre/Retro Fitness":{name:"Retro Fitness",icon:"fas-dumbbell",imageURL:"https://graph.facebook.com/RetroFitness/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61994955",leisure:"fitness_centre"},addTags:{brand:"Retro Fitness","brand:wikidata":"Q61994955",leisure:"fitness_centre",name:"Retro Fitness"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"leisure/fitness_centre/Snap Fitness":{name:"Snap Fitness",icon:"fas-dumbbell",imageURL:"https://graph.facebook.com/SnapFitness247/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7547254",leisure:"fitness_centre"},addTags:{brand:"Snap Fitness","brand:wikidata":"Q7547254","brand:wikipedia":"en:Snap Fitness",leisure:"fitness_centre",name:"Snap Fitness"},terms:[],matchScore:2,suggestion:true},"leisure/playground/McDonald's PlayPlace":{name:"McDonald's PlayPlace",icon:"maki-playground",imageURL:"https://graph.facebook.com/mcdonalds/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q38076",leisure:"playground"},addTags:{access:"customers",brand:"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"en:McDonald's",leisure:"playground",name:"McDonald's PlayPlace"},terms:["mcdonald's"],matchScore:2,suggestion:true},"leisure/sports_centre/YMCA":{name:"YMCA",icon:"maki-pitch",imageURL:"https://graph.facebook.com/YMCA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q157169",leisure:"sports_centre"},addTags:{brand:"YMCA","brand:wikidata":"Q157169","brand:wikipedia":"en:YMCA",leisure:"sports_centre",name:"YMCA"},terms:[],matchScore:2,suggestion:true},"leisure/sports_centre/iFLY":{name:"iFLY",icon:"maki-pitch",imageURL:"https://graph.facebook.com/iFLYUS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64767105",leisure:"sports_centre"},addTags:{brand:"iFLY","brand:wikidata":"Q64767105",leisure:"sports_centre",name:"iFLY",sport:"indoor_skydiving"},terms:[],matchScore:2,suggestion:true},"shop/beauty/tanning/Palm Beach Tan":{name:"Palm Beach Tan",icon:"maki-shop",imageURL:"https://graph.facebook.com/PBTOfficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64027086",shop:"beauty",beauty:"tanning"},addTags:{beauty:"tanning",brand:"Palm Beach Tan","brand:wikidata":"Q64027086","brand:wikipedia":"en:Palm Beach Tan",leisure:"tanning_salon",name:"Palm Beach Tan",shop:"beauty"},reference:{key:"leisure",value:"tanning_salon"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"office/bail_bond_agent/Aladdin Bail Bonds":{name:"Aladdin Bail Bonds",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FAladdin%20Bail%20Bonds%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q64166257",office:"bail_bond_agent"},addTags:{brand:"Aladdin Bail Bonds","brand:wikidata":"Q64166257","brand:wikipedia":"en:Aladdin Bail Bonds",name:"Aladdin Bail Bonds",office:"bail_bond_agent",opening_hours:"24/7"},countryCodes:["us"],terms:["aladdin","aladin bail bonds","alladin bail bonds"],matchScore:2,suggestion:true},"office/employment_agency/Adecco":{name:"Adecco",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/adeccogroupDE/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q353494",office:"employment_agency"},addTags:{brand:"Adecco","brand:wikidata":"Q353494","brand:wikipedia":"en:The Adecco Group",name:"Adecco",office:"employment_agency"},terms:[],matchScore:2,suggestion:true},"office/employment_agency/Manpower":{name:"Manpower",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/ManpowerGroup/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1472539",office:"employment_agency"},addTags:{brand:"Manpower","brand:wikidata":"Q1472539","brand:wikipedia":"en:ManpowerGroup",name:"Manpower",office:"employment_agency"},terms:[],matchScore:2,suggestion:true},"office/employment_agency/Pôle Emploi":{name:"Pôle Emploi",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/poleemploi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q8901192",office:"employment_agency"},addTags:{brand:"Pôle Emploi","brand:wikidata":"Q8901192","brand:wikipedia":"en:Pôle emploi",name:"Pôle Emploi",office:"employment_agency"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"office/employment_agency/Randstad":{name:"Randstad",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/Randstad/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q267840",office:"employment_agency"},addTags:{brand:"Randstad","brand:wikidata":"Q267840","brand:wikipedia":"en:Randstad Holding",name:"Randstad",office:"employment_agency"},terms:[],matchScore:2,suggestion:true},"office/estate_agent/Century 21":{name:"Century 21",icon:"temaki-real_estate_agency",imageURL:"https://graph.facebook.com/century21/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1054480",office:"estate_agent"},addTags:{brand:"Century 21","brand:wikidata":"Q1054480","brand:wikipedia":"en:Century 21 (real estate)",name:"Century 21",office:"estate_agent"},terms:["century 21 real estate"],matchScore:2,suggestion:true},"office/estate_agent/Coldwell Banker":{name:"Coldwell Banker",icon:"temaki-real_estate_agency",imageURL:"https://graph.facebook.com/coldwellbanker/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q738853",office:"estate_agent"},addTags:{brand:"Coldwell Banker","brand:wikidata":"Q738853","brand:wikipedia":"en:Coldwell Banker",name:"Coldwell Banker",office:"estate_agent"},terms:["coldwell banker real estate"],matchScore:2,suggestion:true},"office/estate_agent/Engel & Völkers":{name:"Engel & Völkers",icon:"temaki-real_estate_agency",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FEngel-voelkers-logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1341765",office:"estate_agent"},addTags:{brand:"Engel & Völkers","brand:wikidata":"Q1341765","brand:wikipedia":"en:Engel & Völkers",name:"Engel & Völkers",office:"estate_agent"},terms:[],matchScore:2,suggestion:true},"office/estate_agent/Foncia":{name:"Foncia",icon:"temaki-real_estate_agency",imageURL:"https://graph.facebook.com/Foncia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1435638",office:"estate_agent"},addTags:{brand:"Foncia","brand:wikidata":"Q1435638","brand:wikipedia":"fr:Foncia",name:"Foncia",office:"estate_agent"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"office/estate_agent/Guy Hoquet":{name:"Guy Hoquet",icon:"temaki-real_estate_agency",imageURL:"https://graph.facebook.com/GuyHoquetImmobilier/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q25383970",office:"estate_agent"},addTags:{brand:"Guy Hoquet","brand:wikidata":"Q25383970","brand:wikipedia":"fr:Guy Hoquet l'immobilier",name:"Guy Hoquet",office:"estate_agent"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"office/estate_agent/Orpi":{name:"Orpi",icon:"temaki-real_estate_agency",imageURL:"https://graph.facebook.com/OrpiFrance/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3356080",office:"estate_agent"},addTags:{brand:"Orpi","brand:wikidata":"Q3356080","brand:wikipedia":"fr:Organisation régionale des professionnels de l'immobilier",name:"Orpi",office:"estate_agent"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"office/estate_agent/REMAX":{name:"RE/MAX",icon:"temaki-real_estate_agency",imageURL:"https://graph.facebook.com/remax/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q965845",office:"estate_agent"},addTags:{brand:"RE/MAX","brand:wikidata":"Q965845","brand:wikipedia":"en:RE/MAX",name:"RE/MAX",office:"estate_agent"},terms:[],matchScore:2,suggestion:true},"office/estate_agent/Royal LePage":{name:"Royal LePage",icon:"temaki-real_estate_agency",imageURL:"https://pbs.twimg.com/profile_images/1143181179102859269/HvAK2iCT_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q7374385",office:"estate_agent"},addTags:{brand:"Royal LePage","brand:wikidata":"Q7374385","brand:wikipedia":"en:Royal LePage",name:"Royal LePage",office:"estate_agent"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"office/estate_agent/Square Habitat":{name:"Square Habitat",icon:"temaki-real_estate_agency",geometry:["point","area"],tags:{"brand:wikidata":"Q64027038",office:"estate_agent"},addTags:{brand:"Square Habitat","brand:wikidata":"Q64027038","brand:wikipedia":"fr:Square Habitat",name:"Square Habitat",office:"estate_agent"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"office/financial_advisor/Edward Jones":{name:"Edward Jones",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/edwardjones/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5343830",office:"financial_advisor"},addTags:{alt_name:"Edward Jones Investments",brand:"Edward Jones","brand:wikidata":"Q5343830","brand:wikipedia":"en:Edward Jones Investments",name:"Edward Jones",office:"financial_advisor"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"office/insurance/AAA Insurance":{name:"AAA Insurance",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/AAAFanPage/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q463436",office:"insurance"},addTags:{brand:"American Automobile Association","brand:wikidata":"Q463436","brand:wikipedia":"en:American Automobile Association",name:"AAA Insurance",office:"insurance",short_name:"AAA"},countryCodes:["us"],terms:["american automobile association"],matchScore:2,suggestion:true},"office/insurance/AOK":{name:"AOK",icon:"maki-suitcase",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FAllgemeine%20Ortskrankenkasse%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q835141",office:"insurance"},addTags:{brand:"AOK","brand:wikidata":"Q835141","brand:wikipedia":"de:Allgemeine Ortskrankenkasse",name:"AOK",office:"insurance"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"office/insurance/AXA":{name:"AXA",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/axainsurance/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q160054",office:"insurance"},addTags:{brand:"AXA","brand:wikidata":"Q160054","brand:wikipedia":"en:AXA",name:"AXA",office:"insurance"},terms:[],matchScore:2,suggestion:true},"office/insurance/Allianz":{name:"Allianz",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/allianz/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q487292",office:"insurance"},addTags:{brand:"Allianz","brand:wikidata":"Q487292","brand:wikipedia":"en:Allianz",name:"Allianz",office:"insurance"},terms:[],matchScore:2,suggestion:true},"office/insurance/Allstate":{name:"Allstate",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/Allstate/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2645636",office:"insurance"},addTags:{brand:"Allstate","brand:wikidata":"Q2645636","brand:wikipedia":"en:Allstate",name:"Allstate",office:"insurance"},countryCodes:["us"],terms:["allstate insurance"],matchScore:2,suggestion:true},"office/insurance/American Family Insurance":{name:"American Family Insurance",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/amfam/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4743730",office:"insurance"},addTags:{brand:"American Family Insurance","brand:wikidata":"Q4743730","brand:wikipedia":"en:American Family Insurance",name:"American Family Insurance",office:"insurance"},countryCodes:["us"],terms:["american family","amfam"],matchScore:2,suggestion:true},"office/insurance/Aviva":{name:"Aviva",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/Aviva/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q791179",office:"insurance"},addTags:{brand:"Aviva","brand:wikidata":"Q791179","brand:wikipedia":"en:Aviva",name:"Aviva",office:"insurance"},countryCodes:["fr","ie","pl"],terms:[],matchScore:2,suggestion:true},"office/insurance/DEVK":{name:"DEVK",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/devk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1153049",office:"insurance"},addTags:{brand:"DEVK","brand:wikidata":"Q1153049","brand:wikipedia":"de:DEVK",name:"DEVK",office:"insurance"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"office/insurance/Debeka":{name:"Debeka",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/Debeka/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1181452",office:"insurance"},addTags:{brand:"Debeka","brand:wikidata":"Q1181452","brand:wikipedia":"de:Debeka",name:"Debeka",office:"insurance"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"office/insurance/Erie Insurance":{name:"Erie Insurance",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/erieinsurance/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5388314",office:"insurance"},addTags:{brand:"Erie Insurance","brand:wikidata":"Q5388314","brand:wikipedia":"en:Erie Insurance Group",name:"Erie Insurance",office:"insurance"},countryCodes:["us"],terms:["erie"],matchScore:2,suggestion:true},"office/insurance/Farmers Insurance":{name:"Farmers Insurance",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/FarmersInsurance/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1396863",office:"insurance"},addTags:{brand:"Farmers Insurance","brand:wikidata":"Q1396863","brand:wikipedia":"en:Farmers Insurance Group",name:"Farmers Insurance",office:"insurance"},countryCodes:["us"],terms:["farmers"],matchScore:2,suggestion:true},"office/insurance/GEICO":{name:"GEICO",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/geico/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1498689",office:"insurance"},addTags:{brand:"GEICO","brand:wikidata":"Q1498689","brand:wikipedia":"en:GEICO",name:"GEICO",office:"insurance"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"office/insurance/Generali":{name:"Generali",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/GENERALIes/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q670482",office:"insurance"},addTags:{brand:"Generali","brand:wikidata":"Q670482","brand:wikipedia":"it:Assicurazioni Generali",name:"Generali",office:"insurance"},terms:[],matchScore:2,suggestion:true},"office/insurance/Grange Insurance":{name:"Grange Insurance",icon:"maki-suitcase",imageURL:"https://pbs.twimg.com/profile_images/476391605457260545/J37LFSJc_bigger.jpeg",geometry:["point","area"],tags:{"brand:wikidata":"Q17183481",office:"insurance"},addTags:{brand:"Grange Insurance","brand:wikidata":"Q17183481","brand:wikipedia":"en:Grange Insurance",name:"Grange Insurance",office:"insurance"},countryCodes:["us"],terms:["grange"],matchScore:2,suggestion:true},"office/insurance/Groupama":{name:"Groupama",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/groupama/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3083531",office:"insurance"},addTags:{brand:"Groupama","brand:wikidata":"Q3083531","brand:wikipedia":"fr:Groupama",name:"Groupama",office:"insurance",official_name:"Groupe des Assurances Mutuelles Agricoles"},terms:[],matchScore:2,suggestion:true},"office/insurance/Knappschaft":{name:"Knappschaft",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/KNAPPSCHAFT/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1313465",office:"insurance"},addTags:{brand:"Knappschaft","brand:wikidata":"Q1313465","brand:wikipedia":"de:Knappschaft (Krankenkasse)",name:"Knappschaft",office:"insurance"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"office/insurance/MAAF":{name:"MAAF",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/maafassurances/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3331028",office:"insurance"},addTags:{brand:"MAAF","brand:wikidata":"Q3331028","brand:wikipedia":"fr:Mutuelle d'assurance des artisans de France",name:"MAAF",office:"insurance"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"office/insurance/MMA":{name:"MMA",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/MMA.Assurances/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3331046",office:"insurance"},addTags:{brand:"MMA","brand:wikidata":"Q3331046","brand:wikipedia":"fr:MMA (assurance)",name:"MMA",office:"insurance",official_name:"Mutuelles du Mans Assurances"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"office/insurance/Macif":{name:"Macif",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/lEssentielparMacif/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3331021",office:"insurance"},addTags:{brand:"Macif","brand:wikidata":"Q3331021","brand:wikipedia":"fr:Mutuelle assurance des commerçants et industriels de France et des cadres et des salariés de l'industrie et du commerce",name:"Macif",office:"insurance"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"office/insurance/Maif":{name:"Maif",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/MAIFassureur/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3331029",office:"insurance"},addTags:{brand:"Maif","brand:wikidata":"Q3331029","brand:wikipedia":"fr:Maif",name:"Maif",office:"insurance",official_name:"Mutuelle d'assurance des instituteurs de France"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"office/insurance/Mapfre":{name:"Mapfre",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/mapfreinsurance/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q544532",office:"insurance"},addTags:{brand:"Mapfre","brand:wikidata":"Q544532","brand:wikipedia":"en:Mapfre",name:"Mapfre",office:"insurance"},terms:[],matchScore:2,suggestion:true},"office/insurance/Matmut":{name:"Matmut",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/MatmutAssurances/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3299185",office:"insurance"},addTags:{brand:"Matmut","brand:wikidata":"Q3299185","brand:wikipedia":"fr:Matmut",name:"Matmut",office:"insurance"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"office/insurance/Nationwide":{name:"Nationwide",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/nationwide/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6979886",office:"insurance"},addTags:{brand:"Nationwide","brand:wikidata":"Q6979886","brand:wikipedia":"en:Nationwide Mutual Insurance Company",name:"Nationwide",office:"insurance"},countryCodes:["us"],terms:["nationwide insurance"],matchScore:2,suggestion:true},"office/insurance/PZU":{name:"PZU",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/grupapzu/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1807170",office:"insurance"},addTags:{brand:"PZU","brand:wikidata":"Q1807170","brand:wikipedia":"pl:Powszechny Zakład Ubezpieczeń",name:"PZU",office:"insurance"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"office/insurance/Progressive":{name:"Progressive",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/progressive/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7248721",office:"insurance"},addTags:{brand:"Progressive","brand:wikidata":"Q7248721","brand:wikipedia":"en:Progressive Corporation",name:"Progressive",office:"insurance"},countryCodes:["us"],terms:["progressive insurance"],matchScore:2,suggestion:true},"office/insurance/State Farm":{name:"State Farm",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/statefarm/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2007336",office:"insurance"},addTags:{brand:"State Farm","brand:wikidata":"Q2007336","brand:wikipedia":"en:State Farm",name:"State Farm",office:"insurance"},countryCodes:["us"],terms:["state farm insurance"],matchScore:2,suggestion:true},"office/insurance/Techniker Krankenkasse":{name:"Techniker Krankenkasse",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/DieTechniker/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q607531",office:"insurance"},addTags:{brand:"Techniker Krankenkasse","brand:wikidata":"Q607531","brand:wikipedia":"de:Techniker Krankenkasse",name:"Techniker Krankenkasse",office:"insurance"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"office/insurance/The Co-operators":{name:"The Co-operators",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/TheCooperatorsInsurance/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3520320",office:"insurance"},addTags:{brand:"The Co-operators","brand:wikidata":"Q3520320","brand:wikipedia":"en:The Co-operators",name:"The Co-operators",office:"insurance"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"office/insurance/Росгосстрах":{name:"Росгосстрах",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/RGS.ru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4397745",office:"insurance"},addTags:{brand:"Росгосстрах","brand:wikidata":"Q4397745","brand:wikipedia":"en:Rosgosstrakh",name:"Росгосстрах",office:"insurance"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"office/tax_advisor/Block Advisors":{name:"Block Advisors",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/BlockAdvisors/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64166231",office:"tax_advisor"},addTags:{brand:"Block Advisors","brand:wikidata":"Q64166231",name:"Block Advisors",office:"tax_advisor"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"office/tax_advisor/H&R Block":{name:"H&R Block",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/hrblock/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5627799",office:"tax_advisor"},addTags:{brand:"H&R Block","brand:wikidata":"Q5627799","brand:wikipedia":"en:H&R Block",name:"H&R Block",office:"tax_advisor"},countryCodes:["au","ca","in","us"],terms:[],matchScore:2,suggestion:true},"office/tax_advisor/Jackson Hewitt":{name:"Jackson Hewitt",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/jacksonhewitt/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6117132",office:"tax_advisor"},addTags:{brand:"Jackson Hewitt","brand:wikidata":"Q6117132","brand:wikipedia":"en:Jackson Hewitt",name:"Jackson Hewitt",office:"tax_advisor",official_name:"Jackson Hewitt Tax Service"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"office/tax_advisor/Liberty Tax":{name:"Liberty Tax",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/libertytax/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6541978",office:"tax_advisor"},addTags:{alt_name:"Liberty Tax Service",brand:"Liberty Tax","brand:wikidata":"Q6541978","brand:wikipedia":"en:Liberty Tax Service",name:"Liberty Tax",office:"tax_advisor"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"office/telecommunication/Ooredoo":{name:"Ooredoo",icon:"maki-telephone",imageURL:"https://abs.twimg.com/sticky/default_profile_images/default_profile_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q919935",office:"telecommunication"},addTags:{brand:"Ooredoo","brand:wikidata":"Q919935","brand:wikipedia":"en:Ooredoo",name:"Ooredoo",office:"telecommunication"},terms:[],matchScore:2,suggestion:true},"office/telecommunication/Velcom":{name:"Velcom",icon:"maki-telephone",imageURL:"https://graph.facebook.com/velcomlikes/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1888809",office:"telecommunication"},addTags:{brand:"Velcom","brand:wikidata":"Q1888809","brand:wikipedia":"en:Velcom",name:"Velcom",office:"telecommunication"},countryCodes:["by"],terms:[],matchScore:2,suggestion:true},"office/telecommunication/Ростелеком":{name:"Ростелеком",icon:"maki-telephone",imageURL:"https://graph.facebook.com/288785311160831/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1477012",office:"telecommunication"},addTags:{brand:"Ростелеком","brand:wikidata":"Q1477012","brand:wikipedia":"en:Rostelecom",name:"Ростелеком",office:"telecommunication"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"office/telecommunication/Укртелеком":{name:"Укртелеком",icon:"maki-telephone",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FUkrtelecom.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1505321",office:"telecommunication"},addTags:{brand:"Укртелеком","brand:wikidata":"Q1505321","brand:wikipedia":"en:Ukrtelecom",name:"Укртелеком",office:"telecommunication"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"shop/agrarian/Granngården":{name:"Granngården",icon:"fas-tractor",imageURL:"https://graph.facebook.com/granngarden/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10508136",shop:"agrarian"},addTags:{brand:"Granngården","brand:wikidata":"Q10508136","brand:wikipedia":"sv:Granngården AB",name:"Granngården",shop:"agrarian"},countryCodes:["se"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/Alko":{name:"Alko",icon:"fas-wine-bottle",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FAlko.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1849187",shop:"alcohol"},addTags:{brand:"Alko","brand:wikidata":"Q1849187","brand:wikipedia":"en:Alko",name:"Alko",shop:"alcohol"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/BC Liquor Store":{name:"BC Liquor Store",icon:"fas-wine-bottle",imageURL:"https://pbs.twimg.com/profile_images/1302250656/winesplash-icon_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q43079557",shop:"alcohol"},addTags:{brand:"BC Liquor Store","brand:wikidata":"Q43079557","brand:wikipedia":"en:BC Liquor Stores",name:"BC Liquor Store",shop:"alcohol"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/BWS":{name:"BWS",icon:"fas-wine-bottle",geometry:["point","area"],tags:{"brand:wikidata":"Q4836848",shop:"alcohol"},addTags:{brand:"BWS","brand:wikidata":"Q4836848","brand:wikipedia":"en:BWS (liquor retailer)",name:"BWS",shop:"alcohol"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/Bargain Booze":{name:"Bargain Booze",icon:"fas-wine-bottle",imageURL:"https://pbs.twimg.com/profile_images/998956835796205568/21tNi907_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q16971315",shop:"alcohol"},addTags:{brand:"Bargain Booze","brand:wikidata":"Q16971315","brand:wikipedia":"en:Bargain Booze",name:"Bargain Booze",shop:"alcohol"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/BevMo!":{name:"BevMo!",icon:"fas-wine-bottle",imageURL:"https://pbs.twimg.com/profile_images/1128010188038893568/TCOuuRrD_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q4899308",shop:"alcohol"},addTags:{brand:"BevMo!","brand:wikidata":"Q4899308","brand:wikipedia":"en:BevMo!",name:"BevMo!",shop:"alcohol"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/Dan Murphy's":{name:"Dan Murphy's",icon:"fas-wine-bottle",imageURL:"https://pbs.twimg.com/profile_images/465419847128473601/ybOMjW8-_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q5214075",shop:"alcohol"},addTags:{brand:"Dan Murphy's","brand:wikidata":"Q5214075","brand:wikipedia":"en:Dan Murphy's",name:"Dan Murphy's",shop:"alcohol"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/Fine Wine & Good Spirits":{name:"Fine Wine & Good Spirits",icon:"fas-wine-bottle",imageURL:"https://graph.facebook.com/PAWineSpirits/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64514776",shop:"alcohol"},addTags:{brand:"Fine Wine & Good Spirits","brand:wikidata":"Q64514776",name:"Fine Wine & Good Spirits",shop:"alcohol"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/Gall & Gall":{name:"Gall & Gall",icon:"fas-wine-bottle",imageURL:"https://pbs.twimg.com/profile_images/652468758515068928/dzFqRsLG_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q13639185",shop:"alcohol"},addTags:{brand:"Gall & Gall","brand:wikidata":"Q13639185","brand:wikipedia":"nl:Gall & Gall",name:"Gall & Gall",shop:"alcohol"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/LCBO":{name:"LCBO",icon:"fas-wine-bottle",imageURL:"https://pbs.twimg.com/profile_images/481885343986102272/mGMV-t--_bigger.jpeg",geometry:["point","area"],tags:{"brand:wikidata":"Q845263",shop:"alcohol"},addTags:{brand:"LCBO","brand:wikidata":"Q845263","brand:wikipedia":"en:Liquor Control Board of Ontario",name:"LCBO",shop:"alcohol"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/Liquorland":{name:"Liquorland",icon:"fas-wine-bottle",imageURL:"https://pbs.twimg.com/profile_images/378800000468322180/92219ed513322ff2f4d6d416dc477704_bigger.jpeg",geometry:["point","area"],tags:{"brand:wikidata":"Q2283837",shop:"alcohol"},addTags:{brand:"Liquorland","brand:wikidata":"Q2283837","brand:wikipedia":"en:Liquorland",name:"Liquorland",shop:"alcohol"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/Nicolas":{name:"Nicolas",icon:"fas-wine-bottle",imageURL:"https://pbs.twimg.com/profile_images/842779196082573314/AtkEMQlh_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q3340012",shop:"alcohol"},addTags:{brand:"Nicolas","brand:wikidata":"Q3340012","brand:wikipedia":"en:Nicolas (wine retailer)",name:"Nicolas",shop:"alcohol"},countryCodes:["be","fr","gb"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/SAQ":{name:"SAQ",icon:"fas-wine-bottle",imageURL:"https://pbs.twimg.com/profile_images/1064657571133308928/zhzEYvxp_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q3488077",shop:"alcohol"},addTags:{brand:"SAQ","brand:wikidata":"Q3488077","brand:wikipedia":"en:Société des alcools du Québec",name:"SAQ",shop:"alcohol"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/Spec's":{name:"Spec's",icon:"fas-wine-bottle",imageURL:"https://pbs.twimg.com/profile_images/1143912744858599424/oL3Wrl5R_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q7574415",shop:"alcohol"},addTags:{brand:"Spec's","brand:wikidata":"Q7574415","brand:wikipedia":"en:Spec's Wine, Spirits & Finer Foods",name:"Spec's",shop:"alcohol"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/Systembolaget":{name:"Systembolaget",icon:"fas-wine-bottle",imageURL:"https://pbs.twimg.com/profile_images/456046476032872449/mg3NXDpc_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q1476113",shop:"alcohol"},addTags:{brand:"Systembolaget","brand:wikidata":"Q1476113","brand:wikipedia":"en:Systembolaget",name:"Systembolaget",shop:"alcohol"},countryCodes:["se"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/The Beer Store":{name:"The Beer Store",icon:"fas-wine-bottle",imageURL:"https://pbs.twimg.com/profile_images/1112700310441676800/Gyk3rZl6_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q16243674",shop:"alcohol"},addTags:{brand:"The Beer Store","brand:wikidata":"Q16243674","brand:wikipedia":"en:The Beer Store",name:"The Beer Store",shop:"alcohol"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/Total Wine":{name:"Total Wine",icon:"fas-wine-bottle",imageURL:"https://pbs.twimg.com/profile_images/3095579292/69f5115c869a3b0f73bfb7ad25ba2a37_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q7828084",shop:"alcohol"},addTags:{brand:"Total Wine","brand:wikidata":"Q7828084","brand:wikipedia":"en:Total Wine & More",name:"Total Wine",official_name:"Total Wine & More",shop:"alcohol"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/Virginia ABC":{name:"Virginia ABC",icon:"fas-wine-bottle",imageURL:"https://graph.facebook.com/VirginiaABC/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7934236",shop:"alcohol"},addTags:{brand:"Virginia ABC","brand:wikidata":"Q7934236","brand:wikipedia":"en:Virginia Alcoholic Beverage Control Authority",name:"Virginia ABC",shop:"alcohol"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/Бристоль":{name:"Бристоль",icon:"fas-wine-bottle",imageURL:"https://graph.facebook.com/bristolretail/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q59155583",shop:"alcohol"},addTags:{brand:"Бристоль","brand:wikidata":"Q59155583","brand:wikipedia":"ru:Бристоль (сеть магазинов)",name:"Бристоль",shop:"alcohol"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/Красное & Белое":{name:"Красное & Белое",icon:"fas-wine-bottle",imageURL:"https://graph.facebook.com/krasnoe.beloe/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q24933790",shop:"alcohol"},addTags:{brand:"Красное & Белое","brand:en":"Red&White","brand:wikidata":"Q24933790","brand:wikipedia":"en:Krasnoe & Beloe",name:"Красное & Белое","name:en":"Red&White",shop:"alcohol"},countryCodes:["ru"],terms:["красное и белое"],matchScore:2,suggestion:true},"shop/alcohol/カクヤス":{name:"カクヤス",icon:"fas-wine-bottle",geometry:["point","area"],tags:{"brand:wikidata":"Q11293990",shop:"alcohol"},addTags:{brand:"カクヤス","brand:en":"Kakuyasu","brand:ja":"カクヤス","brand:wikidata":"Q11293990","brand:wikipedia":"ja:カクヤス",name:"カクヤス","name:en":"Kakuyasu","name:ja":"カクヤス",shop:"alcohol"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/art/YellowKorner":{name:"YellowKorner",icon:"maki-shop",imageURL:"https://graph.facebook.com/YellowKorner/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3572115",shop:"art"},addTags:{brand:"YellowKorner","brand:wikidata":"Q3572115","brand:wikipedia":"fr:YellowKorner",name:"YellowKorner",shop:"art"},terms:[],matchScore:2,suggestion:true},"shop/baby_goods/Aubert":{name:"Aubert",icon:"fas-baby-carriage",imageURL:"https://graph.facebook.com/Aubert/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62964657",shop:"baby_goods"},addTags:{brand:"Aubert","brand:wikidata":"Q62964657",name:"Aubert",shop:"baby_goods"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/baby_goods/Babies R Us":{name:"Babies R Us",icon:"fas-baby-carriage",imageURL:"https://graph.facebook.com/babiesrus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17232036",shop:"baby_goods"},addTags:{brand:"Babies R Us","brand:wikidata":"Q17232036",name:"Babies R Us",shop:"baby_goods"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/baby_goods/BabyOne":{name:"BabyOne",icon:"fas-baby-carriage",imageURL:"https://graph.facebook.com/BabyOne/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q57540408",shop:"baby_goods"},addTags:{brand:"BabyOne","brand:wikidata":"Q57540408",name:"BabyOne",shop:"baby_goods"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/baby_goods/Buy Buy Baby":{name:"Buy Buy Baby",icon:"fas-baby-carriage",imageURL:"https://graph.facebook.com/buybuyBABY/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5003352",shop:"baby_goods"},addTags:{brand:"Buy Buy Baby","brand:wikidata":"Q5003352","brand:wikipedia":"en:Buy Buy Baby",name:"Buy Buy Baby",shop:"baby_goods"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/baby_goods/Mothercare":{name:"Mothercare",icon:"fas-baby-carriage",imageURL:"https://graph.facebook.com/mothercareuk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q136738",shop:"baby_goods"},addTags:{brand:"Mothercare","brand:wikidata":"Q136738","brand:wikipedia":"en:Mothercare",name:"Mothercare",shop:"baby_goods"},terms:[],matchScore:2,suggestion:true},"shop/baby_goods/西松屋":{name:"西松屋",icon:"fas-baby-carriage",imageURL:"https://graph.facebook.com/nishimatsuya.official/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11628761",shop:"baby_goods"},addTags:{brand:"西松屋","brand:en":"Nishimatsuya Chain","brand:ja":"西松屋","brand:wikidata":"Q11628761","brand:wikipedia":"ja:西松屋",name:"西松屋","name:en":"Nishimatsuya Chain","name:ja":"西松屋",shop:"baby_goods"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/bag/Carpisa":{name:"Carpisa",icon:"fas-suitcase-rolling",imageURL:"https://graph.facebook.com/CarpisaOfficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q28035409",shop:"bag"},addTags:{brand:"Carpisa","brand:wikidata":"Q28035409","brand:wikipedia":"en:Carpisa",name:"Carpisa",shop:"bag"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"shop/bag/Coach":{name:"Coach",icon:"fas-suitcase-rolling",imageURL:"https://graph.facebook.com/coach/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q727697",shop:"bag"},addTags:{brand:"Coach","brand:wikidata":"Q727697","brand:wikipedia":"en:Coach New York",name:"Coach",shop:"bag"},countryCodes:["ca","us"],terms:["coach new york","coach ny"],matchScore:2,suggestion:true},"shop/bag/Kipling":{name:"Kipling",icon:"fas-suitcase-rolling",imageURL:"https://graph.facebook.com/KiplingU.S.A/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6414641",shop:"bag"},addTags:{brand:"Kipling","brand:wikidata":"Q6414641","brand:wikipedia":"en:Kipling (brand)",name:"Kipling",shop:"bag"},countryCodes:["be","gb"],terms:[],matchScore:2,suggestion:true},"shop/bag/Samsonite":{name:"Samsonite",icon:"fas-suitcase-rolling",imageURL:"https://pbs.twimg.com/profile_images/1117861430366175232/3u8m-kIE_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q1203426",shop:"bag"},addTags:{brand:"Samsonite","brand:wikidata":"Q1203426","brand:wikipedia":"en:Samsonite",name:"Samsonite",shop:"bag"},terms:[],matchScore:2,suggestion:true},"shop/bag/Tumi":{name:"Tumi",icon:"fas-suitcase-rolling",imageURL:"https://graph.facebook.com/TumiTravel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4465402",shop:"bag"},addTags:{brand:"Tumi","brand:wikidata":"Q4465402","brand:wikipedia":"en:Tumi Inc.",name:"Tumi",shop:"bag"},terms:[],matchScore:2,suggestion:true},"shop/bag/Vera Bradley":{name:"Vera Bradley",icon:"fas-suitcase-rolling",imageURL:"https://graph.facebook.com/VeraBradley/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7920749",shop:"bag"},addTags:{brand:"Vera Bradley","brand:wikidata":"Q7920749","brand:wikipedia":"en:Vera Bradley",name:"Vera Bradley",shop:"bag"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Anker":{name:"Anker",icon:"maki-bakery",imageURL:"https://graph.facebook.com/Ankerbrot/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q557116",shop:"bakery"},addTags:{brand:"Anker","brand:wikidata":"Q557116","brand:wikipedia":"de:Ankerbrot",name:"Anker",shop:"bakery"},countryCodes:["at","sk"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Awiteks":{name:"Awiteks",icon:"maki-bakery",imageURL:"https://graph.facebook.com/awiteks/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62054190",shop:"bakery"},addTags:{brand:"Awiteks","brand:wikidata":"Q62054190",name:"Awiteks",shop:"bakery"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Backwerk":{name:"Backwerk",icon:"maki-bakery",imageURL:"https://graph.facebook.com/155997891116938/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q798298",shop:"bakery"},addTags:{brand:"BackWerk","brand:wikidata":"Q798298","brand:wikipedia":"de:BackWerk",name:"Backwerk",shop:"bakery"},countryCodes:["at","ch","de","gb","nl"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Bakers Delight":{name:"Bakers Delight",icon:"maki-bakery",imageURL:"https://graph.facebook.com/bakersdelight/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4849261",shop:"bakery"},addTags:{brand:"Bakers Delight","brand:wikidata":"Q4849261","brand:wikipedia":"en:Bakers Delight",name:"Bakers Delight",shop:"bakery"},countryCodes:["au","ca","nz","us"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Bakker Bart":{name:"Bakker Bart",icon:"maki-bakery",imageURL:"https://graph.facebook.com/bakkerbartNL/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2177445",shop:"bakery"},addTags:{brand:"Bakker Bart","brand:wikidata":"Q2177445","brand:wikipedia":"nl:Bakker Bart",name:"Bakker Bart",shop:"bakery"},countryCodes:["be","nl"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Banette":{name:"Banette",icon:"maki-bakery",imageURL:"https://graph.facebook.com/293934294060419/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2882405",shop:"bakery"},addTags:{brand:"Banette","brand:wikidata":"Q2882405","brand:wikipedia":"fr:Banette (entreprise)",name:"Banette",shop:"bakery"},terms:[],matchScore:2,suggestion:true},"shop/bakery/Birds":{name:"Birds",icon:"maki-bakery",imageURL:"https://graph.facebook.com/birdsbakeryderby/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63001935",shop:"bakery"},addTags:{brand:"Birds","brand:wikidata":"Q63001935","brand:wikipedia":"en:Birds Bakery",name:"Birds",official_name:"Birds Bakery",shop:"bakery"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Breadtop":{name:"Breadtop",icon:"maki-bakery",imageURL:"https://graph.facebook.com/we.love.breadtop/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4959217",shop:"bakery"},addTags:{brand:"Breadtop","brand:wikidata":"Q4959217","brand:wikipedia":"en:Breadtop",cuisine:"chinese",name:"Breadtop",shop:"bakery"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Bäckerei Fuchs":{name:"Bäckerei Fuchs",icon:"maki-bakery",imageURL:"https://graph.facebook.com/baeckereifuchs/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q42825993",shop:"bakery"},addTags:{brand:"Bäckerei Fuchs","brand:wikidata":"Q42825993","brand:wikipedia":"de:Harald Fuchs Bäckerei – Konditorei",name:"Bäckerei Fuchs",shop:"bakery"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Cadera":{name:"Cadera",icon:"maki-bakery",imageURL:"https://graph.facebook.com/Cadera1853/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62086410",shop:"bakery"},addTags:{brand:"Cadera","brand:wikidata":"Q62086410",name:"Cadera",shop:"bakery"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Cooplands":{name:"Cooplands",icon:"maki-bakery",imageURL:"https://graph.facebook.com/Cooplands/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5167971",shop:"bakery"},addTags:{brand:"Cooplands","brand:wikidata":"Q5167971","brand:wikipedia":"en:Cooplands",name:"Cooplands",shop:"bakery"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Dat Backhus":{name:"Dat Backhus",icon:"maki-bakery",imageURL:"https://graph.facebook.com/datbackhus.hamburg/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62093175",shop:"bakery"},addTags:{brand:"Dat Backhus","brand:wikidata":"Q62093175",name:"Dat Backhus",shop:"bakery"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Der Beck":{name:"Der Beck",icon:"maki-bakery",imageURL:"https://graph.facebook.com/derbeck.baeckerei/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1192443",shop:"bakery"},addTags:{brand:"Der Beck","brand:wikidata":"Q1192443","brand:wikipedia":"en:Der Beck",name:"Der Beck",shop:"bakery"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Ditsch":{name:"Ditsch",icon:"maki-bakery",imageURL:"https://graph.facebook.com/ditsch/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q911573",shop:"bakery"},addTags:{brand:"Ditsch","brand:wikidata":"Q911573","brand:wikipedia":"en:Ditsch",name:"Ditsch",shop:"bakery"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Fornetti":{name:"Fornetti",icon:"maki-bakery",imageURL:"https://graph.facebook.com/fornetti.magyarorszag/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1003020",shop:"bakery"},addTags:{brand:"Fornetti","brand:wikidata":"Q1003020","brand:wikipedia":"en:Fornetti",name:"Fornetti",shop:"bakery"},terms:[],matchScore:2,suggestion:true},"shop/bakery/Goldilocks":{name:"Goldilocks",icon:"maki-bakery",imageURL:"https://graph.facebook.com/GoldilocksPH/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5580198",shop:"bakery"},addTags:{brand:"Goldilocks","brand:wikidata":"Q5580198","brand:wikipedia":"en:Goldilocks Bakeshop",name:"Goldilocks",shop:"bakery"},countryCodes:["ca","ph","th","us"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Greggs":{name:"Greggs",icon:"maki-bakery",imageURL:"https://graph.facebook.com/greggsofficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3403981",shop:"bakery"},addTags:{brand:"Greggs","brand:wikidata":"Q3403981","brand:wikipedia":"en:Greggs",name:"Greggs",shop:"bakery"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Hofpfisterei":{name:"Hofpfisterei",icon:"maki-bakery",imageURL:"https://graph.facebook.com/hofpfisterei/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1623217",shop:"bakery"},addTags:{brand:"Hofpfisterei","brand:wikidata":"Q1623217","brand:wikipedia":"en:Hofpfisterei",name:"Hofpfisterei",shop:"bakery"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Ihle":{name:"Ihle",icon:"maki-bakery",imageURL:"https://graph.facebook.com/1845011368873218/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1626371",shop:"bakery"},addTags:{brand:"Ihle","brand:wikidata":"Q1626371","brand:wikipedia":"de:Landbäckerei Ihle",name:"Ihle",shop:"bakery"},countryCodes:["de"],terms:["landbäckerei ihle"],matchScore:2,suggestion:true},"shop/bakery/K&U Bäckerei":{name:"K&U Bäckerei",icon:"maki-bakery",imageURL:"https://graph.facebook.com/KU.Backkultur/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1719433",shop:"bakery"},addTags:{brand:"K&U Bäckerei","brand:wikidata":"Q1719433","brand:wikipedia":"de:K & U Bäckerei",name:"K&U Bäckerei",shop:"bakery"},countryCodes:["de"],terms:["k&u"],matchScore:2,suggestion:true},"shop/bakery/Kamps":{name:"Kamps",icon:"maki-bakery",imageURL:"https://graph.facebook.com/417008548362119/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1723381",shop:"bakery"},addTags:{brand:"Kamps","brand:wikidata":"Q1723381","brand:wikipedia":"de:Kamps (Unternehmen)",name:"Kamps",shop:"bakery"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/bakery/La Mie Câline":{name:"La Mie Câline",icon:"maki-bakery",imageURL:"https://graph.facebook.com/lamiecalinefrance/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3210704",shop:"bakery"},addTags:{brand:"La Mie Câline","brand:wikidata":"Q3210704","brand:wikipedia":"fr:La Mie câline",name:"La Mie Câline",shop:"bakery"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Le Crobag":{name:"Le Crobag",icon:"maki-bakery",imageURL:"https://graph.facebook.com/lecrobag/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1558025",shop:"bakery"},addTags:{brand:"Le Crobag","brand:wikidata":"Q1558025","brand:wikipedia":"de:Le Crobag",name:"Le Crobag",shop:"bakery"},countryCodes:["at","de","pl","ru"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Lila Bäcker":{name:"Lila Bäcker",icon:"maki-bakery",imageURL:"https://pbs.twimg.com/profile_images/1145260042/logo_up_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q57516591",shop:"bakery"},addTags:{brand:"Lila Bäcker","brand:wikidata":"Q57516591",name:"Lila Bäcker",shop:"bakery"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Löwenbäcker Schaper":{name:"Löwenbäcker Schaper",icon:"maki-bakery",imageURL:"https://graph.facebook.com/LoewenbaeckerSchaper/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62075965",shop:"bakery"},addTags:{brand:"Löwenbäcker Schaper","brand:wikidata":"Q62075965",name:"Löwenbäcker Schaper",shop:"bakery"},countryCodes:["de"],terms:["schaper"],matchScore:2,suggestion:true},"shop/bakery/Marie Blachère":{name:"Marie Blachère",icon:"maki-bakery",imageURL:"https://graph.facebook.com/marieblachereusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62082410",shop:"bakery"},addTags:{brand:"Marie Blachère","brand:wikidata":"Q62082410",name:"Marie Blachère",shop:"bakery"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Mlinar":{name:"Mlinar",icon:"maki-bakery",imageURL:"https://graph.facebook.com/MlinarHrvatska/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62082464",shop:"bakery"},addTags:{brand:"Mlinar","brand:wikidata":"Q62082464",name:"Mlinar",shop:"bakery"},countryCodes:["ba","hr","sl"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Musmanni":{name:"Musmanni",icon:"maki-bakery",geometry:["point","area"],tags:{"brand:wikidata":"Q19382082",shop:"bakery"},addTags:{brand:"Musmanni","brand:wikidata":"Q19382082","brand:wikipedia":"no:Musmanni",name:"Musmanni",shop:"bakery"},countryCodes:["cr"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Nothing Bundt Cakes":{name:"Nothing Bundt Cakes",icon:"maki-bakery",imageURL:"https://graph.facebook.com/nothingbundtcakes/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62082526",shop:"bakery"},addTags:{brand:"Nothing Bundt Cakes","brand:wikidata":"Q62082526",name:"Nothing Bundt Cakes",shop:"bakery"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Paris Baguette (worldwide)":{name:"Paris Baguette (worldwide)",icon:"maki-bakery",imageURL:"https://graph.facebook.com/parisbaguetteus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62605260",shop:"bakery"},addTags:{brand:"Paris Baguette","brand:wikidata":"Q62605260",name:"Paris Baguette",shop:"bakery"},countryCodes:["sg","us","vn"],terms:["paris baguette cafe"],matchScore:2,suggestion:true},"shop/bakery/Paul":{name:"Paul",icon:"maki-bakery",imageURL:"https://pbs.twimg.com/profile_images/1104154254699364353/69J1OrZ1_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q3370417",shop:"bakery"},addTags:{brand:"Paul","brand:wikidata":"Q3370417","brand:wikipedia":"en:Paul (bakery)",name:"Paul",shop:"bakery"},terms:[],matchScore:2,suggestion:true},"shop/bakery/Red Ribbon":{name:"Red Ribbon",icon:"maki-bakery",imageURL:"https://graph.facebook.com/redribbonbakeshop/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7304789",shop:"bakery"},addTags:{brand:"Red Ribbon","brand:wikidata":"Q7304789","brand:wikipedia":"en:Red Ribbon Bakeshop",name:"Red Ribbon",shop:"bakery"},countryCodes:["ph","us"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Ronde des Pains":{name:"Ronde des Pains",icon:"maki-bakery",geometry:["point","area"],tags:{"brand:wikidata":"Q3441707",shop:"bakery"},addTags:{brand:"Ronde des Pains","brand:wikidata":"Q3441707","brand:wikipedia":"fr:Ronde des Pains",name:"Ronde des Pains",shop:"bakery"},countryCodes:["be","fr"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Schäfer's":{name:"Schäfer's",icon:"maki-bakery",imageURL:"https://graph.facebook.com/149823855088841/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1464562",shop:"bakery"},addTags:{brand:"Schäfer's","brand:wikidata":"Q1464562","brand:wikipedia":"de:Schäfers Brot",name:"Schäfer's",shop:"bakery"},countryCodes:["de"],terms:["schäfer"],matchScore:2,suggestion:true},"shop/bakery/Sehne":{name:"Sehne",icon:"maki-bakery",imageURL:"https://graph.facebook.com/150057125031868/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1314761",shop:"bakery"},addTags:{brand:"Sehne","brand:wikidata":"Q1314761","brand:wikipedia":"de:Sehne Backwaren",name:"Sehne",shop:"bakery"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Steinecke":{name:"Steinecke",icon:"maki-bakery",imageURL:"https://graph.facebook.com/brotmeisterei.steinecke/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q57516278",shop:"bakery"},addTags:{brand:"Steinecke","brand:wikidata":"Q57516278","brand:wikipedia":"de:Meisterbäckerei Steinecke",name:"Steinecke",shop:"bakery"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Sternenbäck":{name:"Sternenbäck",icon:"maki-bakery",imageURL:"https://graph.facebook.com/sternenbaeck/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62595021",shop:"bakery"},addTags:{brand:"Sternenbäck","brand:wikidata":"Q62595021",name:"Sternenbäck",shop:"bakery"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Ströck":{name:"Ströck",icon:"maki-bakery",imageURL:"https://graph.facebook.com/Stroeck/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2357607",shop:"bakery"},addTags:{brand:"Ströck","brand:wikidata":"Q2357607","brand:wikipedia":"de:Ströck-Brot",name:"Ströck",shop:"bakery"},countryCodes:["at"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Wiener Feinbäcker":{name:"Wiener Feinbäcker",icon:"maki-bakery",imageURL:"https://graph.facebook.com/248217405252147/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q15854357",shop:"bakery"},addTags:{brand:"Wiener Feinbäcker","brand:wikidata":"Q15854357","brand:wikipedia":"de:Wiener Feinbäckerei Heberer",name:"Wiener Feinbäcker",shop:"bakery"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/bakery/von Allwörden":{name:"von Allwörden",icon:"maki-bakery",imageURL:"https://graph.facebook.com/allwoerden/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q60411349",shop:"bakery"},addTags:{brand:"von Allwörden","brand:wikidata":"Q60411349","brand:wikipedia":"nds:Heinrich von Allwörden GmbH",name:"von Allwörden",shop:"bakery"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/bakery/サンジェルマン":{name:"サンジェルマン",icon:"maki-bakery",geometry:["point","area"],tags:{"brand:wikidata":"Q11305612",shop:"bakery"},addTags:{brand:"サンジェルマン","brand:en":"Saint-Germain","brand:ja":"サンジェルマン","brand:wikidata":"Q11305612","brand:wikipedia":"ja:サンジェルマン (製パン)",name:"サンジェルマン","name:en":"Saint-Germain","name:ja":"サンジェルマン",shop:"bakery"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/bakery/ヴィ・ド・フランス":{name:"ヴィ・ド・フランス",icon:"maki-bakery",geometry:["point","area"],tags:{"brand:wikidata":"Q7928249",shop:"bakery"},addTags:{brand:"ヴィ・ド・フランス","brand:en":"Vie de France","brand:ja":"ヴィ・ド・フランス","brand:wikidata":"Q7928249","brand:wikipedia":"ja:ヴィ・ド・フランス",name:"ヴィ・ド・フランス","name:en":"Vie de France","name:ja":"ヴィ・ド・フランス",shop:"bakery"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/bakery/巴黎贝甜 (China)":{name:"巴黎贝甜 (China)",icon:"maki-bakery",imageURL:"https://graph.facebook.com/parisbaguetteus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62605260",shop:"bakery"},addTags:{brand:"巴黎贝甜","brand:en":"Paris Baguette","brand:wikidata":"Q62605260","brand:zh":"巴黎贝甜",name:"巴黎贝甜","name:en":"Paris Baguette","name:zh":"巴黎贝甜",shop:"bakery"},countryCodes:["cn"],terms:["paris baguette","paris baguette cafe","巴黎貝甜"],matchScore:2,suggestion:true},"shop/bakery/뚜레쥬르":{name:"뚜레쥬르",icon:"maki-bakery",imageURL:"https://graph.facebook.com/TousLesJoursUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3535609",shop:"bakery"},addTags:{brand:"뚜레쥬르","brand:en":"Tous Les Jours","brand:ko":"뚜레쥬르","brand:wikidata":"Q3535609","brand:wikipedia":"ko:뚜레쥬르",name:"뚜레쥬르","name:en":"Tous Les Jours","name:ko":"뚜레쥬르",shop:"bakery"},countryCodes:["kr"],terms:["뚜레주르"],matchScore:2,suggestion:true},"shop/bakery/파리바게뜨 (South Korea)":{name:"파리바게뜨 (South Korea)",icon:"maki-bakery",imageURL:"https://graph.facebook.com/parisbaguetteus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62605260",shop:"bakery"},addTags:{"alt_name:ko":"파리바게트",brand:"파리바게뜨","brand:en":"Paris Baguette","brand:ko":"파리바게뜨","brand:wikidata":"Q62605260",name:"파리바게뜨","name:en":"Paris Baguette","name:ko":"파리바게뜨",shop:"bakery"},countryCodes:["kr"],terms:["paris baguette","paris baguette cafe","파리바게트"],matchScore:2,suggestion:true},"shop/beauty/Benefit Brow Bar":{name:"Benefit Brow Bar",icon:"maki-shop",imageURL:"https://graph.facebook.com/benefitcosmetics/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2895769",shop:"beauty"},addTags:{beauty:"eyebrow;eyelash;waxing",brand:"Benefit","brand:wikidata":"Q2895769","brand:wikipedia":"en:Benefit Cosmetics",name:"Benefit Brow Bar",shop:"beauty"},countryCodes:["us"],terms:["benefit","ulta brow bar"],matchScore:2,suggestion:true},"shop/beauty/European Wax Center":{name:"European Wax Center",icon:"maki-shop",imageURL:"https://graph.facebook.com/EuropeanWax/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5413426",shop:"beauty"},addTags:{beauty:"waxing",brand:"European Wax Center","brand:wikidata":"Q5413426","brand:wikipedia":"en:European Wax Center",name:"European Wax Center",shop:"beauty"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/beauty/Indigo Sun":{name:"Indigo Sun",icon:"maki-shop",imageURL:"https://graph.facebook.com/indigosunretail/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63436906",shop:"beauty"},addTags:{beauty:"tanning",brand:"Indigo Sun","brand:wikidata":"Q63436906",name:"Indigo Sun",shop:"beauty"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/beauty/Sola Salons":{name:"Sola Salons",icon:"maki-shop",imageURL:"https://graph.facebook.com/solasalons/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64337426",shop:"beauty"},addTags:{beauty:"hair;nails;skin_care;massage",brand:"Sola Salons","brand:wikidata":"Q64337426",name:"Sola Salons",shop:"beauty"},countryCodes:["us"],terms:["sola","sola salon studios"],matchScore:2,suggestion:true},"shop/beauty/The Skin Bar at Ulta Beauty":{name:"The Skin Bar at Ulta Beauty",icon:"maki-shop",imageURL:"https://graph.facebook.com/UltaBeauty/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7880076",shop:"beauty"},addTags:{alt_name:"Ulta Skin Bar",beauty:"skin_care",brand:"Ulta Beauty","brand:wikidata":"Q7880076","brand:wikipedia":"en:Ulta Beauty",name:"The Skin Bar at Ulta Beauty",shop:"beauty"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/beauty/Yves Rocher":{name:"Yves Rocher",icon:"maki-shop",imageURL:"https://graph.facebook.com/YvesRocherUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q28496595",shop:"beauty"},addTags:{beauty:"cosmetics",brand:"Yves Rocher","brand:wikidata":"Q28496595","brand:wikipedia":"en:Yves Rocher (company)",name:"Yves Rocher",shop:"beauty"},terms:[],matchScore:2,suggestion:true},"shop/bed/Casper":{name:"Casper",icon:"maki-lodging",imageURL:"https://graph.facebook.com/224110981099062/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q20539294",shop:"bed"},addTags:{brand:"Casper","brand:wikidata":"Q20539294","brand:wikipedia":"en:Casper Sleep",name:"Casper",shop:"bed"},terms:[],matchScore:2,suggestion:true},"shop/bed/Dreams":{name:"Dreams",icon:"maki-lodging",imageURL:"https://graph.facebook.com/dreamsbeds/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5306688",shop:"bed"},addTags:{brand:"Dreams","brand:wikidata":"Q5306688","brand:wikipedia":"en:Dreams (bed retailer)",name:"Dreams",shop:"bed"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/bed/Matratzen Concord":{name:"Matratzen Concord",icon:"maki-lodging",imageURL:"https://graph.facebook.com/MatratzenConcord/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q18629057",shop:"bed"},addTags:{brand:"Matratzen Concord","brand:wikidata":"Q18629057","brand:wikipedia":"de:Matratzen Concord",name:"Matratzen Concord",shop:"bed"},countryCodes:["at","ch","de"],terms:[],matchScore:2,suggestion:true},"shop/bed/Mattress Firm":{name:"Mattress Firm",icon:"maki-lodging",imageURL:"https://graph.facebook.com/MattressFirm/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6791878",shop:"bed"},addTags:{brand:"Mattress Firm","brand:wikidata":"Q6791878","brand:wikipedia":"en:Mattress Firm",name:"Mattress Firm",shop:"bed"},countryCodes:["us"],terms:["sleepys"],matchScore:2,suggestion:true},"shop/bed/Mattress Warehouse":{name:"Mattress Warehouse",icon:"maki-lodging",imageURL:"https://graph.facebook.com/mattresswhse/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61995079",shop:"bed"},addTags:{brand:"Mattress Warehouse","brand:wikidata":"Q61995079",name:"Mattress Warehouse",shop:"bed"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/bed/Sleep Country":{name:"Sleep Country",icon:"maki-lodging",imageURL:"https://graph.facebook.com/SleepCountryCanada/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7539684",shop:"bed"},addTags:{brand:"Sleep Country","brand:wikidata":"Q7539684","brand:wikipedia":"en:Sleep Country Canada",name:"Sleep Country",shop:"bed"},countryCodes:["ca"],terms:["Sleep Country Canada"],matchScore:2,suggestion:true},"shop/bed/Sleep Number":{name:"Sleep Number",icon:"maki-lodging",imageURL:"https://graph.facebook.com/SleepNumber/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7447640",shop:"bed"},addTags:{brand:"Sleep Number","brand:wikidata":"Q7447640","brand:wikipedia":"en:Sleep Number",name:"Sleep Number",shop:"bed"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/beverages/Dursty":{name:"Dursty",icon:"maki-shop",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FDursty%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1267518",shop:"beverages"},addTags:{brand:"Dursty","brand:wikidata":"Q1267518","brand:wikipedia":"de:Dursty Getränkemärkte",name:"Dursty",shop:"beverages"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/beverages/Edeka Getränkemarkt":{name:"Edeka Getränkemarkt",icon:"maki-shop",geometry:["point","area"],tags:{"brand:wikidata":"Q57450576",shop:"beverages"},addTags:{brand:"Edeka Getränkemarkt","brand:wikidata":"Q57450576",name:"Edeka Getränkemarkt",shop:"beverages"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/beverages/Fristo":{name:"Fristo",icon:"maki-shop",geometry:["point","area"],tags:{"brand:wikidata":"Q1465151",shop:"beverages"},addTags:{brand:"Fristo","brand:wikidata":"Q1465151","brand:wikipedia":"de:Fristo",name:"Fristo",shop:"beverages"},countryCodes:["at","de"],terms:["fristo getränkemarkt"],matchScore:2,suggestion:true},"shop/beverages/Getränke Hoffmann":{name:"Getränke Hoffmann",icon:"maki-shop",imageURL:"https://graph.facebook.com/getraenkehoffmann/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q19284021",shop:"beverages"},addTags:{brand:"Getränke Hoffmann","brand:wikidata":"Q19284021","brand:wikipedia":"de:Getränke Hoffmann",name:"Getränke Hoffmann",shop:"beverages"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/beverages/Getränkeland":{name:"Getränkeland",icon:"maki-shop",imageURL:"https://graph.facebook.com/Getraenkeland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62594849",shop:"beverages"},addTags:{brand:"Getränkeland","brand:wikidata":"Q62594849",name:"Getränkeland",shop:"beverages"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/beverages/Hol'ab":{name:"Hol'ab",icon:"maki-shop",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20hol%20ab.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q57557270",shop:"beverages"},addTags:{brand:"Hol'ab","brand:wikidata":"Q57557270",name:"Hol'ab",shop:"beverages"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/beverages/Orterer Getränkemarkt":{name:"Orterer Getränkemarkt",icon:"maki-shop",geometry:["point","area"],tags:{"brand:wikidata":"Q23787118",shop:"beverages"},addTags:{brand:"Orterer Getränkemarkt","brand:wikidata":"Q23787118","brand:wikipedia":"de:Orterer Gruppe",name:"Orterer Getränkemarkt",shop:"beverages"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/beverages/Rewe Getränkemarkt":{name:"Rewe Getränkemarkt",icon:"maki-shop",geometry:["point","area"],tags:{"brand:wikidata":"Q57519344",shop:"beverages"},addTags:{brand:"Rewe Getränkemarkt","brand:wikidata":"Q57519344",name:"Rewe Getränkemarkt",shop:"beverages"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/beverages/Trinkgut":{name:"Trinkgut",icon:"maki-shop",imageURL:"https://pbs.twimg.com/profile_images/339373337/twitter_icon_trinkgut_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q2453627",shop:"beverages"},addTags:{brand:"Trinkgut","brand:wikidata":"Q2453627","brand:wikipedia":"de:Trinkgut",name:"Trinkgut",shop:"beverages"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/beverages/清心福全":{name:"清心福全",icon:"maki-shop",imageURL:"https://graph.facebook.com/chingshin1987/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10391229",shop:"beverages"},addTags:{brand:"清心福全","brand:wikidata":"Q10391229","brand:wikipedia":"zh:清心福全冷飲站",name:"清心福全",shop:"beverages"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"shop/bicycle/Evans Cycles":{name:"Evans Cycles",icon:"maki-bicycle",imageURL:"https://graph.facebook.com/evanscycles/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5415901",shop:"bicycle"},addTags:{brand:"Evans Cycles","brand:wikidata":"Q5415901","brand:wikipedia":"en:Evans Cycles",name:"Evans Cycles",shop:"bicycle"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/bicycle/Fri BikeShop":{name:"Fri BikeShop",icon:"maki-bicycle",imageURL:"https://graph.facebook.com/Cykelbutikken/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q26721030",shop:"bicycle"},addTags:{brand:"Fri BikeShop","brand:wikidata":"Q26721030",name:"Fri BikeShop",shop:"bicycle"},countryCodes:["dk"],terms:[],matchScore:2,suggestion:true},"shop/bicycle/Giant":{name:"Giant",icon:"maki-bicycle",imageURL:"https://graph.facebook.com/giantbicycles/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q703557",shop:"bicycle"},addTags:{brand:"Giant","brand:wikidata":"Q703557","brand:wikipedia":"en:Giant Bicycles",name:"Giant",shop:"bicycle"},terms:[],matchScore:2,suggestion:true},"shop/bicycle/Trek":{name:"Trek",icon:"maki-bicycle",imageURL:"https://graph.facebook.com/TrekBicycle/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1067617",shop:"bicycle"},addTags:{alt_name:"Trek Bicycle Store",brand:"Trek","brand:wikidata":"Q1067617","brand:wikipedia":"en:Trek Bicycle Corporation",name:"Trek",shop:"bicycle"},terms:["treck","trek bicycle"],matchScore:2,suggestion:true},"shop/bicycle/サイクルベースあさひ":{name:"サイクルベースあさひ",icon:"maki-bicycle",imageURL:"https://graph.facebook.com/cbasahi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11257202",shop:"bicycle"},addTags:{brand:"サイクルベースあさひ","brand:en":"Cycle Base Asahi","brand:ja":"サイクルベースあさひ","brand:wikidata":"Q11257202","brand:wikipedia":"ja:あさひ (企業)",name:"サイクルベースあさひ","name:en":"Cycle Base Asahi","name:ja":"サイクルベースあさひ",shop:"bicycle"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/bookmaker/Betfred":{name:"Betfred",icon:"maki-shop",imageURL:"https://pbs.twimg.com/profile_images/1034363254758359041/dxetDfNN_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q4897425",shop:"bookmaker"},addTags:{brand:"Betfred","brand:wikidata":"Q4897425","brand:wikipedia":"en:Betfred",name:"Betfred",shop:"bookmaker"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/bookmaker/Coral":{name:"Coral",icon:"maki-shop",imageURL:"https://pbs.twimg.com/profile_images/1000461740772134913/T9-zMXmF_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q54621344",shop:"bookmaker"},addTags:{brand:"Coral","brand:wikidata":"Q54621344","brand:wikipedia":"en:Coral (bookmaker)",name:"Coral",shop:"bookmaker"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/bookmaker/Fortuna":{name:"Fortuna",icon:"maki-shop",imageURL:"https://graph.facebook.com/703606549739592/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q25857973",shop:"bookmaker"},addTags:{brand:"Fortuna","brand:wikidata":"Q25857973","brand:wikipedia":"en:Fortuna Entertainment Group",name:"Fortuna",shop:"bookmaker"},countryCodes:["cz","hr","pl","ro","sk"],terms:[],matchScore:2,suggestion:true},"shop/bookmaker/Ladbrokes":{name:"Ladbrokes",icon:"maki-shop",imageURL:"https://pbs.twimg.com/profile_images/1037325155310161921/6E9Rvy3Y_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q1799875",shop:"bookmaker"},addTags:{brand:"Ladbrokes","brand:wikidata":"Q1799875","brand:wikipedia":"en:Ladbrokes Coral",name:"Ladbrokes",shop:"bookmaker"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/bookmaker/Paddy Power":{name:"Paddy Power",icon:"maki-shop",imageURL:"https://graph.facebook.com/2039606582931195/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3888718",shop:"bookmaker"},addTags:{brand:"Paddy Power","brand:wikidata":"Q3888718","brand:wikipedia":"en:Paddy Power",name:"Paddy Power",shop:"bookmaker"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/bookmaker/Tipico":{name:"Tipico",icon:"maki-shop",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FTipico%20Unternehmenslogo.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q15851003",shop:"bookmaker"},addTags:{brand:"Tipico","brand:wikidata":"Q15851003","brand:wikipedia":"en:Tipico",name:"Tipico",shop:"bookmaker"},countryCodes:["at","co","de","gi","hr","mt"],terms:[],matchScore:2,suggestion:true},"shop/bookmaker/William Hill":{name:"William Hill",icon:"maki-shop",imageURL:"https://pbs.twimg.com/profile_images/797028677733253120/bW9oFXT-_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q4053147",shop:"bookmaker"},addTags:{brand:"William Hill","brand:wikidata":"Q4053147","brand:wikipedia":"en:William Hill (bookmaker)",name:"William Hill",shop:"bookmaker"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/bookmaker/ΟΠΑΠ":{name:"ΟΠΑΠ",icon:"maki-shop",imageURL:"https://pbs.twimg.com/profile_images/1024247841135452160/UlceXxkv_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q2007823",shop:"bookmaker"},addTags:{brand:"ΟΠΑΠ","brand:el":"ΟΠΑΠ","brand:en":"OPAP","brand:wikidata":"Q2007823","brand:wikipedia":"en:OPAP",name:"ΟΠΑΠ","name:el":"ΟΠΑΠ","name:en":"OPAP",shop:"bookmaker"},countryCodes:["gr"],terms:[],matchScore:2,suggestion:true},"shop/bookmaker/Лига ставок":{name:"Лига ставок",icon:"maki-shop",imageURL:"https://graph.facebook.com/ligastavok05/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6545804",shop:"bookmaker"},addTags:{brand:"Лига ставок","brand:en":"Liga Stavok","brand:ru":"Лига ставок","brand:wikidata":"Q6545804","brand:wikipedia":"ru:Лига Ставок",name:"Лига ставок","name:en":"Liga Stavok","name:ru":"Лига ставок",shop:"bookmaker"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/bookmaker/Фонбет":{name:"Фонбет",icon:"maki-shop",imageURL:"https://graph.facebook.com/fonbetrussia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q49137910",shop:"bookmaker"},addTags:{brand:"Фонбет","brand:en":"Fonbet","brand:ru":"Фонбет","brand:wikidata":"Q49137910","brand:wikipedia":"ru:Фонбет",name:"Фонбет","name:en":"Fonbet","name:ru":"Фонбет",shop:"bookmaker"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/books/Akademibokhandeln":{name:"Akademibokhandeln",icon:"fas-book",imageURL:"https://graph.facebook.com/Akademibokhandeln/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10403918",shop:"books"},addTags:{brand:"Akademibokhandeln","brand:wikidata":"Q10403918","brand:wikipedia":"sv:Akademibokhandeln",name:"Akademibokhandeln",shop:"books"},countryCodes:["se"],terms:[],matchScore:2,suggestion:true},"shop/books/Akateeminen Kirjakauppa":{name:"Akateeminen Kirjakauppa",icon:"fas-book",imageURL:"https://graph.facebook.com/AkateeminenCOM/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10403942",shop:"books"},addTags:{brand:"Akateeminen Kirjakauppa","brand:wikidata":"Q10403942","brand:wikipedia":"fi:Akateeminen Kirjakauppa",name:"Akateeminen Kirjakauppa",shop:"books"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"shop/books/Barnes & Noble":{name:"Barnes & Noble",icon:"fas-book",imageURL:"https://graph.facebook.com/barnesandnoble/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q795454",shop:"books"},addTags:{brand:"Barnes & Noble","brand:wikidata":"Q795454","brand:wikipedia":"en:Barnes & Noble",name:"Barnes & Noble",shop:"books"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/books/Books-A-Million":{name:"Books-A-Million",icon:"fas-book",imageURL:"https://graph.facebook.com/booksamillion/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4943266",shop:"books"},addTags:{brand:"Books-A-Million","brand:wikidata":"Q4943266","brand:wikipedia":"en:Books-A-Million",name:"Books-A-Million",shop:"books"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/books/Bruna":{name:"Bruna",icon:"fas-book",imageURL:"https://graph.facebook.com/Brunawinkels/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3317555",shop:"books"},addTags:{brand:"Bruna","brand:wikidata":"Q3317555","brand:wikipedia":"en:Bruna (company)",name:"Bruna",shop:"books"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/books/Chapters":{name:"Chapters",icon:"fas-book",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FChapters%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q5073540",shop:"books"},addTags:{brand:"Chapters","brand:wikidata":"Q5073540","brand:wikipedia":"en:Chapters (bookstore)",name:"Chapters",shop:"books"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/books/Cultura":{name:"Cultura",icon:"fas-book",imageURL:"https://graph.facebook.com/culturafr/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3007154",shop:"books"},addTags:{brand:"Cultura","brand:wikidata":"Q3007154","brand:wikipedia":"fr:Cultura",name:"Cultura",shop:"books"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/books/Empik":{name:"Empik",icon:"fas-book",imageURL:"https://graph.facebook.com/empikcom/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3045978",shop:"books"},addTags:{brand:"Empik","brand:wikidata":"Q3045978","brand:wikipedia":"pl:Empik",name:"Empik",shop:"books"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/books/Fnac":{name:"Fnac",icon:"fas-book",imageURL:"https://graph.facebook.com/Fnac/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q676585",shop:"books"},addTags:{brand:"Fnac","brand:wikidata":"Q676585","brand:wikipedia":"en:Fnac",name:"Fnac",shop:"books"},countryCodes:["be","ch","es","fr","nl","pt"],terms:[],matchScore:2,suggestion:true},"shop/books/Half Price Books":{name:"Half Price Books",icon:"fas-book",imageURL:"https://graph.facebook.com/halfpricebooks/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5641744",shop:"books"},addTags:{brand:"Half Price Books","brand:wikidata":"Q5641744","brand:wikipedia":"en:Half Price Books",name:"Half Price Books",shop:"books"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/books/Hugendubel":{name:"Hugendubel",icon:"fas-book",imageURL:"https://graph.facebook.com/hugendubelbuchhandlungen/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1634142",shop:"books"},addTags:{brand:"Hugendubel","brand:wikidata":"Q1634142","brand:wikipedia":"en:Hugendubel",name:"Hugendubel",shop:"books"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/books/Indigo":{name:"Indigo",icon:"fas-book",imageURL:"https://graph.facebook.com/ChaptersIndigo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2477358",shop:"books"},addTags:{alt_name:"!ndigo",brand:"Indigo","brand:wikidata":"Q2477358","brand:wikipedia":"en:Indigo Books and Music",name:"Indigo",shop:"books"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/books/Mondadori":{name:"Mondadori",icon:"fas-book",imageURL:"https://graph.facebook.com/GruppoMondadori/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q85355",shop:"books"},addTags:{brand:"Mondadori","brand:wikidata":"Q85355","brand:wikipedia":"en:Arnoldo Mondadori Editore",name:"Mondadori",shop:"books"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"shop/books/National Book Store":{name:"National Book Store",icon:"fas-book",imageURL:"https://graph.facebook.com/nbsalert/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6971094",shop:"books"},addTags:{brand:"National Book Store","brand:wikidata":"Q6971094","brand:wikipedia":"en:National Book Store",name:"National Book Store",shop:"books"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"shop/books/Standaard Boekhandel":{name:"Standaard Boekhandel",icon:"fas-book",imageURL:"https://graph.facebook.com/standaardboekhandel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3496554",shop:"books"},addTags:{brand:"Standaard Boekhandel","brand:wikidata":"Q3496554","brand:wikipedia":"nl:Standaard Boekhandel",name:"Standaard Boekhandel",shop:"books"},countryCodes:["be"],terms:[],matchScore:2,suggestion:true},"shop/books/Suomalainen Kirjakauppa":{name:"Suomalainen Kirjakauppa",icon:"fas-book",geometry:["point","area"],tags:{"brand:wikidata":"Q7641808",shop:"books"},addTags:{brand:"Suomalainen Kirjakauppa","brand:wikidata":"Q7641808","brand:wikipedia":"fi:Suomalainen Kirjakauppa",name:"Suomalainen Kirjakauppa",shop:"books"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"shop/books/TSUTAYA":{name:"TSUTAYA",icon:"fas-book",imageURL:"https://graph.facebook.com/TSUTAYA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5193457",shop:"books"},addTags:{brand:"TSUTAYA","brand:wikidata":"Q5193457","brand:wikipedia":"ja:カルチュア・コンビニエンス・クラブ",name:"TSUTAYA",shop:"books"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/books/Thalia":{name:"Thalia",icon:"fas-book",imageURL:"https://graph.facebook.com/thalia.de/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2408854",shop:"books"},addTags:{brand:"Thalia","brand:wikidata":"Q2408854","brand:wikipedia":"de:Thalia Bücher",name:"Thalia",shop:"books"},countryCodes:["at","ch","de"],terms:[],matchScore:2,suggestion:true},"shop/books/The Works":{name:"The Works",icon:"fas-book",imageURL:"https://graph.facebook.com/TheWorksStores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7775853",shop:"books"},addTags:{brand:"The Works","brand:wikidata":"Q7775853","brand:wikipedia":"en:The Works (retailer)",name:"The Works",shop:"books"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/books/Waterstones":{name:"Waterstones",icon:"fas-book",imageURL:"https://graph.facebook.com/waterstones/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q151779",shop:"books"},addTags:{brand:"Waterstones","brand:wikidata":"Q151779","brand:wikipedia":"en:Waterstones",name:"Waterstones",shop:"books"},countryCodes:["be","gb","ie","je","nl"],terms:[],matchScore:2,suggestion:true},"shop/books/Weltbild":{name:"Weltbild",icon:"fas-book",imageURL:"https://graph.facebook.com/weltbild/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q883522",shop:"books"},addTags:{brand:"Weltbild","brand:wikidata":"Q883522","brand:wikipedia":"en:Weltbild Publishing Group",name:"Weltbild",shop:"books"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/books/Буквоед":{name:"Буквоед",icon:"fas-book",imageURL:"https://graph.facebook.com/SuperBookvoed/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4098549",shop:"books"},addTags:{brand:"Буквоед","brand:wikidata":"Q4098549","brand:wikipedia":"ru:Буквоед",name:"Буквоед",shop:"books"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/books/Дом книги":{name:"Дом книги",icon:"fas-book",imageURL:"https://graph.facebook.com/spbdk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q48950742",shop:"books"},addTags:{brand:"Дом книги","brand:wikidata":"Q48950742","brand:wikipedia":"ru:Московский дом книги",name:"Дом книги",shop:"books"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/books/Читай-город":{name:"Читай-город",icon:"fas-book",imageURL:"https://graph.facebook.com/chitaigorod/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4516645",shop:"books"},addTags:{brand:"Читай-город","brand:wikidata":"Q4516645","brand:wikipedia":"ru:Читай-город",name:"Читай-город",shop:"books"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/books/סטימצקי":{name:"סטימצקי",icon:"fas-book",imageURL:"https://graph.facebook.com/SteimatzkyMadaf.HaSfarim/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2903995",shop:"books"},addTags:{brand:"סטימצקי","brand:en":"Steimatzky","brand:he":"סטימצקי","brand:wikidata":"Q2903995","brand:wikipedia":"he:סטימצקי",name:"סטימצקי","name:en":"Steimatzky","name:he":"סטימצקי",shop:"books"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"shop/books/צומת ספרים":{name:"צומת ספרים",icon:"fas-book",imageURL:"https://graph.facebook.com/tzometsfarim/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6743833",shop:"books"},addTags:{brand:"צומת ספרים","brand:en":"Tzomet Sfarim","brand:he":"צומת ספרים","brand:wikidata":"Q6743833","brand:wikipedia":"he:צומת ספרים",name:"צומת ספרים","name:en":"Tzomet Sfarm","name:he":"צומת ספרים",shop:"books"},countryCodes:["il"],terms:["Zomet Sfarim"],matchScore:2,suggestion:true},"shop/books/あおい書店":{name:"あおい書店",icon:"fas-book",imageURL:"https://graph.facebook.com/aoi.bookstore/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11256783",shop:"books"},addTags:{brand:"あおい書店","brand:en":"AOI","brand:ja":"あおい書店","brand:wikidata":"Q11256783","brand:wikipedia":"ja:あおい書店",name:"あおい書店","name:en":"AOI","name:ja":"あおい書店",shop:"books"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/books/ブックオフ":{name:"ブックオフ",icon:"fas-book",imageURL:"https://graph.facebook.com/bookoffcorporation/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q893011",shop:"books"},addTags:{brand:"ブックオフ","brand:en":"Book Off","brand:ja":"ブックオフ","brand:wikidata":"Q893011","brand:wikipedia":"en:Book Off",name:"ブックオフ","name:en":"Book Off","name:ja":"ブックオフ",shop:"books"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/books/メロンブックス":{name:"メロンブックス",icon:"fas-book",imageURL:"https://pbs.twimg.com/profile_images/877364475304714240/Ael4G2BP_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q10851653",shop:"books"},addTags:{brand:"メロンブックス","brand:en":"Melonbooks","brand:ja":"メロンブックス","brand:wikidata":"Q10851653","brand:wikipedia":"ja:メロンブックス",name:"メロンブックス","name:en":"Melonbooks","name:ja":"メロンブックス",shop:"books"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/books/リブロ":{name:"リブロ",icon:"fas-book",imageURL:"https://graph.facebook.com/libroryubo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6542768",shop:"books"},addTags:{brand:"リブロ","brand:en":"LIBRO","brand:ja":"リブロ","brand:wikidata":"Q6542768","brand:wikipedia":"ja:リブロ",name:"リブロ","name:en":"Libro","name:ja":"リブロ",shop:"books"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/books/三省堂書店":{name:"三省堂書店",icon:"fas-book",imageURL:"https://graph.facebook.com/books.sanseido/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10866539",shop:"books"},addTags:{brand:"三省堂書店","brand:en":"Books Sanseido","brand:ja":"三省堂書店","brand:wikidata":"Q10866539","brand:wikipedia":"ja:三省堂書店",name:"三省堂書店","name:en":"Books Sanseido","name:ja":"三省堂書店",shop:"books"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/books/文教堂":{name:"文教堂",icon:"fas-book",geometry:["point","area"],tags:{"brand:wikidata":"Q11499974",shop:"books"},addTags:{brand:"文教堂","brand:en":"Bunkyodo","brand:ja":"文教堂","brand:wikidata":"Q11499974","brand:wikipedia":"ja:文教堂",name:"文教堂","name:en":"Bunkyodo","name:ja":"文教堂",shop:"books"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/books/新华书店":{name:"新华书店",icon:"fas-book",geometry:["point","area"],tags:{"brand:wikidata":"Q6124193",shop:"books"},addTags:{brand:"新华书店","brand:en":"Xinhua Bookstore","brand:wikidata":"Q6124193","brand:wikipedia":"en:Xinhua Bookstore","brand:zh":"新华书店",name:"新华书店","name:en":"Xinhua Bookstore","name:zh":"新华书店",shop:"books"},countryCodes:["cn"],terms:[],matchScore:2,suggestion:true},"shop/books/未来屋書店":{name:"未来屋書店",icon:"fas-book",imageURL:"https://graph.facebook.com/miraiyashoten/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11519563",shop:"books"},addTags:{brand:"未来屋書店","brand:en":"Miraiya Shoten","brand:ja":"未来屋書店","brand:wikidata":"Q11519563","brand:wikipedia":"ja:未来屋書店",name:"未来屋書店","name:en":"Miraiya Shoten","name:ja":"未来屋書店",shop:"books"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/butcher/Coqivoire":{name:"Coqivoire",icon:"fas-bacon",imageURL:"https://graph.facebook.com/COQIVOIRE/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q60183284",shop:"butcher"},addTags:{brand:"Coqivoire","brand:wikidata":"Q60183284",butcher:"poultry",name:"Coqivoire",shop:"butcher"},countryCodes:["ci"],terms:[],matchScore:2,suggestion:true},"shop/butcher/Foani":{name:"Foani",icon:"fas-bacon",imageURL:"https://graph.facebook.com/foaniservices/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q60183335",shop:"butcher"},addTags:{brand:"Foani","brand:wikidata":"Q60183335",butcher:"poultry",name:"Foani",shop:"butcher"},countryCodes:["ci"],terms:[],matchScore:2,suggestion:true},"shop/butcher/Vinzenzmurr":{name:"Vinzenzmurr",icon:"fas-bacon",imageURL:"https://graph.facebook.com/vinzenzmurrtraditionsmetzgerei/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2527361",shop:"butcher"},addTags:{brand:"Vinzenzmurr","brand:wikidata":"Q2527361","brand:wikipedia":"de:Vinzenzmurr",name:"Vinzenzmurr",shop:"butcher"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/butcher/Великолукский мясокомбинат":{name:"Великолукский мясокомбинат",icon:"fas-bacon",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2F%D0%92%D0%B5%D0%BB%D0%B8%D0%BA%D0%BE%D0%BB%D1%83%D0%BA%D1%81%D0%BA%D0%B8%D0%B9%20%D0%BC%D1%8F%D1%81%D0%BE%D0%BA%D0%BE%D0%BC%D0%B1%D0%B8%D0%BD%D0%B0%D1%82.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q18401767",shop:"butcher"},addTags:{brand:"Великолукский мясокомбинат","brand:wikidata":"Q18401767","brand:wikipedia":"ru:Великолукский мясокомбинат",name:"Великолукский мясокомбинат",shop:"butcher"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/butcher/Родинна ковбаска":{name:"Родинна ковбаска",icon:"fas-bacon",imageURL:"https://graph.facebook.com/rodunnakovbaska/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q30969660",shop:"butcher"},addTags:{brand:"Родинна ковбаска","brand:en":"Rodynna-kovbaska","brand:wikidata":"Q30969660","brand:wikipedia":"uk:ТзОВ «Барком»",name:"Родинна ковбаска","name:en":"Rodynna-kovbaska",shop:"butcher"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"shop/butcher/肉のハナマサ":{name:"肉のハナマサ",icon:"fas-bacon",imageURL:"https://graph.facebook.com/hanamasaresto/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11326564",shop:"butcher"},addTags:{brand:"ハナマサ","brand:en":"Hanamasa","brand:ja":"ハナマサ","brand:wikidata":"Q11326564","brand:wikipedia":"ja:ハナマサ",butcher:"beef",name:"肉のハナマサ","name:en":"Hanamasa Meat","name:ja":"肉のハナマサ",shop:"butcher"},countryCodes:["jp"],terms:["ハナマサ"],matchScore:2,suggestion:true},"shop/candles/Yankee Candle":{name:"Yankee Candle",icon:"fas-burn",imageURL:"https://graph.facebook.com/Yankeecandle/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q8048733",shop:"candles"},addTags:{brand:"Yankee Candle","brand:wikidata":"Q8048733","brand:wikipedia":"en:Yankee Candle",name:"Yankee Candle",shop:"candles"},countryCodes:["ca","gb","us"],terms:[],matchScore:2,suggestion:true},"shop/car_parts/Advance Auto Parts":{name:"Advance Auto Parts",icon:"fas-car-battery",imageURL:"https://graph.facebook.com/advanceautoparts/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4686051",shop:"car_parts"},addTags:{brand:"Advance Auto Parts","brand:wikidata":"Q4686051","brand:wikipedia":"en:Advance Auto Parts",name:"Advance Auto Parts",shop:"car_parts"},countryCodes:["ca","us","vi"],terms:[],matchScore:2,suggestion:true},"shop/car_parts/AutoZone":{name:"AutoZone",icon:"fas-car-battery",imageURL:"https://graph.facebook.com/autozone/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4826087",shop:"car_parts"},addTags:{brand:"AutoZone","brand:wikidata":"Q4826087","brand:wikipedia":"en:AutoZone",name:"AutoZone",shop:"car_parts"},countryCodes:["br","mx","us"],terms:[],matchScore:2,suggestion:true},"shop/car_parts/Halfords":{name:"Halfords",icon:"fas-car-battery",imageURL:"https://graph.facebook.com/HalfordsUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3398786",shop:"car_parts"},addTags:{brand:"Halfords","brand:wikidata":"Q3398786","brand:wikipedia":"en:Halfords",name:"Halfords","service:bicycle:retail":"yes",shop:"car_parts"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/car_parts/NAPA Auto Parts":{name:"NAPA Auto Parts",icon:"fas-car-battery",imageURL:"https://graph.facebook.com/NAPAAUTOPARTS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6970842",shop:"car_parts"},addTags:{brand:"NAPA Auto Parts","brand:wikidata":"Q6970842","brand:wikipedia":"en:National Automotive Parts Association",name:"NAPA Auto Parts",shop:"car_parts"},countryCodes:["ca","mx","us"],terms:["napa"],matchScore:2,suggestion:true},"shop/car_parts/O'Reilly Auto Parts":{name:"O'Reilly Auto Parts",icon:"fas-car-battery",imageURL:"https://graph.facebook.com/oreillyautoparts/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7071951",shop:"car_parts"},addTags:{brand:"O'Reilly Auto Parts","brand:wikidata":"Q7071951","brand:wikipedia":"en:O'Reilly Auto Parts",name:"O'Reilly Auto Parts",shop:"car_parts"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/car_parts/Repco":{name:"Repco",icon:"fas-car-battery",imageURL:"https://graph.facebook.com/RepcoAusCareers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q173425",shop:"car_parts"},addTags:{brand:"Repco","brand:wikidata":"Q173425","brand:wikipedia":"en:Repco",name:"Repco",shop:"car_parts"},countryCodes:["au","nz"],terms:[],matchScore:2,suggestion:true},"shop/car_parts/Supercheap Auto":{name:"Supercheap Auto",icon:"fas-car-battery",imageURL:"https://graph.facebook.com/scauto/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7643119",shop:"car_parts"},addTags:{brand:"Supercheap Auto","brand:wikidata":"Q7643119","brand:wikipedia":"en:Supercheap Auto",name:"Supercheap Auto",shop:"car_parts"},countryCodes:["au","nz"],terms:[],matchScore:2,suggestion:true},"shop/car_parts/Автомир":{name:"Автомир",icon:"fas-car-battery",imageURL:"https://graph.facebook.com/avtomir.cars/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4056321",shop:"car_parts"},addTags:{brand:"Автомир","brand:wikidata":"Q4056321","brand:wikipedia":"ru:Автомир (автодилер)",name:"Автомир",shop:"car_parts"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/car_parts/イエローハット":{name:"イエローハット",icon:"fas-car-battery",imageURL:"https://graph.facebook.com/YellowHatUAE/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11285915",shop:"car_parts"},addTags:{brand:"イエローハット","brand:en":"Yellow Hat","brand:ja":"イエローハット","brand:wikidata":"Q11285915","brand:wikipedia":"ja:イエローハット",name:"イエローハット","name:en":"Yellow Hat","name:ja":"イエローハット",shop:"car_parts"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/car_parts/オートバックス":{name:"オートバックス",icon:"fas-car-battery",imageURL:"https://graph.facebook.com/autobacs.seven/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7886426",shop:"car_parts"},addTags:{brand:"オートバックス","brand:en":"Autobacs","brand:ja":"オートバックス","brand:wikidata":"Q7886426","brand:wikipedia":"ja:オートバックスセブン",name:"オートバックス","name:en":"Autobacs","name:ja":"オートバックス",shop:"car_parts"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/car_parts/タイヤ館":{name:"タイヤ館",icon:"fas-car-battery",imageURL:"https://pbs.twimg.com/profile_images/1069402555938037761/aK6lJYjW_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q11315808",shop:"car_parts"},addTags:{brand:"タイヤ館","brand:en":"Taiyakan","brand:ja":"タイヤ館","brand:wikidata":"Q11315808","brand:wikipedia":"ja:タイヤ館",name:"タイヤ館","name:en":"Taiyakan","name:ja":"タイヤ館",shop:"car_parts"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/A.T.U":{name:"A.T.U",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/ATU/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q784721",shop:"car_repair"},addTags:{brand:"A.T.U","brand:wikidata":"Q784721","brand:wikipedia":"de:Auto-Teile-Unger",name:"A.T.U",shop:"car_repair"},countryCodes:["at","de"],terms:["auto-teile-unger"],matchScore:2,suggestion:true},"shop/car_repair/AAMCO":{name:"AAMCO",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/AAMCO/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4649902",shop:"car_repair"},addTags:{brand:"AAMCO","brand:wikidata":"Q4649902","brand:wikipedia":"en:AAMCO Transmissions",name:"AAMCO","service:vehicle:transmission":"yes",shop:"car_repair"},countryCodes:["ca","us"],terms:["aamco transmissions","aamco transmissions and total car care"],matchScore:2,suggestion:true},"shop/car_repair/ATS Euromaster":{name:"ATS Euromaster",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/ATSEUROMASTER/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4654920",shop:"car_repair"},addTags:{brand:"ATS Euromaster","brand:wikidata":"Q4654920","brand:wikipedia":"en:ATS Euromaster",name:"ATS Euromaster",shop:"car_repair"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/BestDrive":{name:"BestDrive",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/BestDriveFrance/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63057183",shop:"car_repair"},addTags:{brand:"BestDrive","brand:wikidata":"Q63057183",name:"BestDrive",shop:"car_repair"},countryCodes:["cz","fr","sk"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/Bosch Car Service":{name:"Bosch Car Service",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/BoschGlobal/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q234021",shop:"car_repair"},addTags:{brand:"Bosch Car Service","brand:wikidata":"Q234021","brand:wikipedia":"en:Robert Bosch GmbH",name:"Bosch Car Service",shop:"car_repair"},terms:["bosch service"],matchScore:2,suggestion:true},"shop/car_repair/Brakes Plus":{name:"Brakes Plus",icon:"maki-car-repair",imageURL:"https://pbs.twimg.com/profile_images/1003734298048905217/s6j3I8IK_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q62075246",shop:"car_repair"},addTags:{brand:"Brakes Plus","brand:wikidata":"Q62075246",name:"Brakes Plus",shop:"car_repair"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/Car-X":{name:"Car-X",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/CarxAuto/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63859189",shop:"car_repair"},addTags:{brand:"Car-X","brand:wikidata":"Q63859189",name:"Car-X",shop:"car_repair"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/Carglass":{name:"Carglass",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/CarglassSweden/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1035997",shop:"car_repair"},addTags:{brand:"Carglass","brand:wikidata":"Q1035997","brand:wikipedia":"de:Carglass",name:"Carglass",shop:"car_repair"},terms:[],matchScore:2,suggestion:true},"shop/car_repair/Carstar":{name:"Carstar",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/CARSTAR/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64187891",shop:"car_repair"},addTags:{brand:"Carstar","brand:wikidata":"Q64187891",name:"Carstar","service:vehicle:body_repair":"yes",shop:"car_repair"},countryCodes:["ca","us"],terms:["carstar auto body repair experts"],matchScore:2,suggestion:true},"shop/car_repair/Citroën":{name:"Citroën",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/Citroen/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6746",shop:"car_repair"},addTags:{brand:"Citroën","brand:wikidata":"Q6746","brand:wikipedia":"fr:Citroën",name:"Citroën",shop:"car_repair"},terms:[],matchScore:2,suggestion:true},"shop/car_repair/Euromaster":{name:"Euromaster",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/ATSEUROMASTER/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3060668",shop:"car_repair"},addTags:{brand:"Euromaster","brand:wikidata":"Q3060668","brand:wikipedia":"de:Euromaster",name:"Euromaster",shop:"car_repair"},countryCodes:["ch","de","es","fi","fr","nl","pt"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/Feu Vert":{name:"Feu Vert",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/FeuVert/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3070922",shop:"car_repair"},addTags:{brand:"Feu Vert","brand:wikidata":"Q3070922","brand:wikipedia":"fr:Feu vert (entreprise)",name:"Feu Vert",shop:"car_repair"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/Firestone":{name:"Firestone",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/FirestoneTires/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q420837",shop:"car_repair"},addTags:{brand:"Firestone","brand:wikidata":"Q420837","brand:wikipedia":"en:Firestone Tire and Rubber Company",name:"Firestone",official_name:"Firestone Complete Auto Care",shop:"car_repair"},countryCodes:["ca","cl","us"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/Ford":{name:"Ford",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/ford/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q44294",shop:"car_repair"},addTags:{brand:"Ford","brand:wikidata":"Q44294","brand:wikipedia":"en:Ford Motor Company",name:"Ford",shop:"car_repair"},terms:[],matchScore:2,suggestion:true},"shop/car_repair/Goodyear":{name:"Goodyear",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/GoodyearNorthAmerica/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q620875",shop:"car_repair"},addTags:{brand:"Goodyear","brand:wikidata":"Q620875","brand:wikipedia":"en:Goodyear Tire and Rubber Company",name:"Goodyear",shop:"car_repair"},countryCodes:["au","ca","cl","pe","us"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/Grease Monkey":{name:"Grease Monkey",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/greasemonkeyintl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5598563",shop:"car_repair"},addTags:{brand:"Grease Monkey","brand:wikidata":"Q5598563","brand:wikipedia":"en:Grease Monkey (business)",name:"Grease Monkey",shop:"car_repair"},countryCodes:["cn","us"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/Halfords Autocentre":{name:"Halfords Autocentre",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/HalfordsAutocentres/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5641894",shop:"car_repair"},addTags:{brand:"Halfords Auocentre","brand:wikidata":"Q5641894","brand:wikipedia":"en:Halfords Autocentre",name:"Halfords Autocentre",shop:"car_repair"},countryCodes:["gb"],terms:["halfords"],matchScore:2,suggestion:true},"shop/car_repair/Jiffy Lube":{name:"Jiffy Lube",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/jiffylube/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6192247",shop:"car_repair"},addTags:{brand:"Jiffy Lube","brand:wikidata":"Q6192247","brand:wikipedia":"en:Jiffy Lube",name:"Jiffy Lube",shop:"car_repair"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/Kwik Fit":{name:"Kwik Fit",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/KwikFit/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q958053",shop:"car_repair"},addTags:{brand:"Kwik Fit","brand:wikidata":"Q958053","brand:wikipedia":"en:Kwik Fit",name:"Kwik Fit",shop:"car_repair"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/MAACO":{name:"MAACO",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/MAACOUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6714015",shop:"car_repair"},addTags:{brand:"MAACO","brand:wikidata":"Q6714015","brand:wikipedia":"en:MAACO",name:"MAACO","service:vehicle:body_repair":"yes","service:vehicle:painting":"yes",shop:"car_repair"},countryCodes:["ca","us"],terms:["maaco collision repair & auto painting"],matchScore:2,suggestion:true},"shop/car_repair/Meineke":{name:"Meineke",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/meinekecarcareusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6810159",shop:"car_repair"},addTags:{brand:"Meineke","brand:wikidata":"Q6810159","brand:wikipedia":"en:Meineke Car Care Centers",name:"Meineke",official_name:"Meineke Car Care Center",shop:"car_repair"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/Mekonomen":{name:"Mekonomen",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/MekonomenSverige/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10580079",shop:"car_repair"},addTags:{brand:"Mekonomen","brand:wikidata":"Q10580079","brand:wikipedia":"sv:Mekonomen",name:"Mekonomen",shop:"car_repair"},countryCodes:["dk","no","se"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/Midas":{name:"Midas",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/Midas/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3312613",shop:"car_repair"},addTags:{brand:"Midas","brand:wikidata":"Q3312613","brand:wikipedia":"en:Midas (automotive service)",name:"Midas",shop:"car_repair"},terms:[],matchScore:2,suggestion:true},"shop/car_repair/Monro Muffler Brake":{name:"Monro Muffler Brake",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/MonroAutoServiceTire/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6902090",shop:"car_repair"},addTags:{brand:"Monro Muffler Brake","brand:wikidata":"Q6902090","brand:wikipedia":"en:Monro Muffler Brake",name:"Monro Muffler Brake",shop:"car_repair"},countryCodes:["us"],terms:["monro"],matchScore:2,suggestion:true},"shop/car_repair/Mr. Lube":{name:"Mr. Lube",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/MrLubeCanada/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17104067",shop:"car_repair"},addTags:{brand:"Mr. Lube","brand:wikidata":"Q17104067","brand:wikipedia":"en:Mr. Lube",name:"Mr. Lube",shop:"car_repair"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/Norauto":{name:"Norauto",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/Norautofr/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3317698",shop:"car_repair"},addTags:{brand:"Norauto","brand:wikidata":"Q3317698","brand:wikipedia":"en:Mobivia Groupe",name:"Norauto",shop:"car_repair"},countryCodes:["ar","es","fr","hu","it","pl","pt","ro"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/Pep Boys":{name:"Pep Boys",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/pepboysauto/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3375007",shop:"car_repair"},addTags:{brand:"Pep Boys","brand:wikidata":"Q3375007","brand:wikipedia":"en:Pep Boys",name:"Pep Boys",shop:"car_repair"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/Peugeot":{name:"Peugeot",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/Peugeot/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6742",shop:"car_repair"},addTags:{brand:"Peugeot","brand:wikidata":"Q6742","brand:wikipedia":"en:Peugeot",name:"Peugeot",shop:"car_repair"},terms:[],matchScore:2,suggestion:true},"shop/car_repair/Point S":{name:"Point S",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/points.france/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3393358",shop:"car_repair"},addTags:{brand:"Point S","brand:wikidata":"Q3393358","brand:wikipedia":"fr:Point S",name:"Point S",shop:"car_repair"},terms:[],matchScore:2,suggestion:true},"shop/car_repair/Renault":{name:"Renault",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/Renault/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6686",shop:"car_repair"},addTags:{brand:"Renault","brand:wikidata":"Q6686","brand:wikipedia":"en:Renault",name:"Renault",shop:"car_repair"},terms:["garage renault"],matchScore:2,suggestion:true},"shop/car_repair/Roady":{name:"Roady",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/RoadyFrance/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3434112",shop:"car_repair"},addTags:{brand:"Roady","brand:wikidata":"Q3434112","brand:wikipedia":"en:Roady (Mousquetaires)",name:"Roady",shop:"car_repair"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/Safelite AutoGlass":{name:"Safelite AutoGlass",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/safelite/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q28797369",shop:"car_repair"},addTags:{brand:"Safelite AutoGlass","brand:wikidata":"Q28797369","brand:wikipedia":"en:Safelite",name:"Safelite AutoGlass",shop:"car_repair"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/Speedy":{name:"Speedy",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/vadoncchezSpeedy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3492969",shop:"car_repair"},addTags:{brand:"Speedy","brand:wikidata":"Q3492969","brand:wikipedia":"fr:Speedy (entreprise)",name:"Speedy",shop:"car_repair"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/Speedy Auto Service":{name:"Speedy Auto Service",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/SpeedyAutoServiceCanada/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q22318193",shop:"car_repair"},addTags:{brand:"Speedy Auto Service","brand:wikidata":"Q22318193",name:"Speedy Auto Service",shop:"car_repair"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/Toyota":{name:"Toyota",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/toyota/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q53268",shop:"car_repair"},addTags:{brand:"Toyota","brand:wikidata":"Q53268","brand:wikipedia":"en:Toyota",name:"Toyota",shop:"car_repair"},terms:[],matchScore:2,suggestion:true},"shop/car_repair/Tuffy":{name:"Tuffy",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/Tuffy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17125314",shop:"car_repair"},addTags:{brand:"Tuffy","brand:wikidata":"Q17125314","brand:wikipedia":"en:Tuffy Auto Service Centers",name:"Tuffy",shop:"car_repair"},countryCodes:["us"],terms:["tuffy auto service","tuffy auto service center","tuffy auto service centers","tuffy service","tuffy service center","tuffy service centers","tuffy tire & auto service","tuffy tire & auto service center","tuffy tire & auto service centers","tuffy tire and auto service","tuffy tire and auto service center","tuffy tire and auto service centers"],matchScore:2,suggestion:true},"shop/car_repair/Valvoline":{name:"Valvoline",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/viocofficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7912852",shop:"car_repair"},addTags:{brand:"Valvoline","brand:wikidata":"Q7912852","brand:wikipedia":"en:Valvoline Instant Oil Change",name:"Valvoline",official_name:"Valvoline Instant Oil Change",shop:"car_repair"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/ÖAMTC":{name:"ÖAMTC",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/OEAMTC/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q306057",shop:"car_repair"},addTags:{brand:"ÖAMTC","brand:wikidata":"Q306057","brand:wikipedia":"de:Österreichischer Automobil-, Motorrad- und Touring Club",name:"ÖAMTC",shop:"car_repair"},countryCodes:["at"],terms:[],matchScore:2,suggestion:true},"shop/car/Audi":{name:"Audi",icon:"maki-car",imageURL:"https://graph.facebook.com/audi.jp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q23317",shop:"car"},addTags:{brand:"Audi","brand:wikidata":"Q23317","brand:wikipedia":"en:Audi",name:"Audi",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/BMW":{name:"BMW",icon:"maki-car",imageURL:"https://graph.facebook.com/BMWGroup/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q26678",shop:"car"},addTags:{brand:"BMW","brand:wikidata":"Q26678","brand:wikipedia":"en:BMW",name:"BMW",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Chevrolet":{name:"Chevrolet",icon:"maki-car",imageURL:"https://graph.facebook.com/chevrolet/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q29570",shop:"car"},addTags:{brand:"Chevrolet","brand:wikidata":"Q29570","brand:wikipedia":"en:Chevrolet",name:"Chevrolet",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Citroën":{name:"Citroën",icon:"maki-car",imageURL:"https://graph.facebook.com/Citroen/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6746",shop:"car"},addTags:{brand:"Citroën","brand:wikidata":"Q6746","brand:wikipedia":"fr:Citroën",name:"Citroën",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Dacia":{name:"Dacia",icon:"maki-car",imageURL:"https://graph.facebook.com/Dacia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q27460",shop:"car"},addTags:{brand:"Dacia","brand:wikidata":"Q27460","brand:wikipedia":"en:Automobile Dacia",name:"Dacia",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Fiat":{name:"Fiat",icon:"maki-car",imageURL:"https://graph.facebook.com/Fiat/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q27597",shop:"car"},addTags:{brand:"Fiat","brand:wikidata":"Q27597","brand:wikipedia":"en:Fiat Automobiles",name:"Fiat",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Ford":{name:"Ford",icon:"maki-car",imageURL:"https://graph.facebook.com/ford/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q44294",shop:"car"},addTags:{brand:"Ford","brand:wikidata":"Q44294","brand:wikipedia":"en:Ford Motor Company",name:"Ford",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Honda":{name:"Honda",icon:"maki-car",imageURL:"https://graph.facebook.com/HondaJP/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q9584",shop:"car"},addTags:{brand:"Honda","brand:wikidata":"Q9584","brand:wikipedia":"en:Honda",name:"Honda",shop:"car"},terms:["honda cars"],matchScore:2,suggestion:true},"shop/car/Hyundai":{name:"Hyundai",icon:"maki-car",imageURL:"https://graph.facebook.com/Hyundai/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q55931",shop:"car"},addTags:{brand:"Hyundai","brand:wikidata":"Q55931","brand:wikipedia":"en:Hyundai Motor Company",name:"Hyundai",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Isuzu":{name:"Isuzu",icon:"maki-car",imageURL:"https://graph.facebook.com/isuzumex/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q29803",shop:"car"},addTags:{brand:"Isuzu","brand:wikidata":"Q29803","brand:wikipedia":"en:Isuzu Motors",name:"Isuzu",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Kia":{name:"Kia",icon:"maki-car",imageURL:"https://graph.facebook.com/Kiamotorsworldwide/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q35349",shop:"car"},addTags:{brand:"Kia","brand:wikidata":"Q35349","brand:wikipedia":"en:Kia Motors",name:"Kia",shop:"car"},terms:["kia motors"],matchScore:2,suggestion:true},"shop/car/Land Rover":{name:"Land Rover",icon:"maki-car",imageURL:"https://graph.facebook.com/landroverusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q35907",shop:"car"},addTags:{brand:"Land Rover","brand:wikidata":"Q35907","brand:wikipedia":"en:Land Rover",name:"Land Rover",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Lexus":{name:"Lexus",icon:"maki-car",imageURL:"https://graph.facebook.com/lexus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q35919",shop:"car"},addTags:{brand:"Lexus","brand:wikidata":"Q35919","brand:wikipedia":"en:Lexus",name:"Lexus",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Mazda":{name:"Mazda",icon:"maki-car",imageURL:"https://graph.facebook.com/Mazda.Japan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q35996",shop:"car"},addTags:{brand:"Mazda","brand:wikidata":"Q35996","brand:wikipedia":"en:Mazda",name:"Mazda",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Mercedes-Benz":{name:"Mercedes-Benz",icon:"maki-car",imageURL:"https://graph.facebook.com/MercedesBenz/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q36008",shop:"car"},addTags:{brand:"Mercedes-Benz","brand:wikidata":"Q36008","brand:wikipedia":"en:Mercedes-Benz",name:"Mercedes-Benz",shop:"car"},terms:["mercedes"],matchScore:2,suggestion:true},"shop/car/Mitsubishi":{name:"Mitsubishi",icon:"maki-car",imageURL:"https://graph.facebook.com/MitsubishiMotors.en/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q36033",shop:"car"},addTags:{brand:"Mitsubishi","brand:wikidata":"Q36033","brand:wikipedia":"en:Mitsubishi Motors",name:"Mitsubishi",shop:"car"},terms:["mitsubishi motors"],matchScore:2,suggestion:true},"shop/car/Netz":{name:"Netz",icon:"maki-car",geometry:["point","area"],tags:{"brand:wikidata":"Q11325416",shop:"car"},addTags:{brand:"Netz","brand:wikidata":"Q11325416","brand:wikipedia":"ja:ネッツ店",name:"Netz",shop:"car"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/car/Nissan":{name:"Nissan",icon:"maki-car",imageURL:"https://graph.facebook.com/NissanJP/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q20165",shop:"car"},addTags:{brand:"Nissan","brand:wikidata":"Q20165","brand:wikipedia":"ja:日産自動車",name:"Nissan",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Opel":{name:"Opel",icon:"maki-car",imageURL:"https://graph.facebook.com/Opel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q40966",shop:"car"},addTags:{brand:"Opel","brand:wikidata":"Q40966","brand:wikipedia":"en:Opel",name:"Opel",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Peugeot":{name:"Peugeot",icon:"maki-car",imageURL:"https://graph.facebook.com/Peugeot/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6742",shop:"car"},addTags:{brand:"Peugeot","brand:wikidata":"Q6742","brand:wikipedia":"en:Peugeot",name:"Peugeot",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Porsche":{name:"Porsche",icon:"maki-car",imageURL:"https://graph.facebook.com/porsche/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q40993",shop:"car"},addTags:{brand:"Porsche","brand:wikidata":"Q40993","brand:wikipedia":"en:Porsche",name:"Porsche",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Renault":{name:"Renault",icon:"maki-car",imageURL:"https://graph.facebook.com/Renault/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6686",shop:"car"},addTags:{brand:"Renault","brand:wikidata":"Q6686","brand:wikipedia":"en:Renault",name:"Renault",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Seat":{name:"Seat",icon:"maki-car",imageURL:"https://graph.facebook.com/SEAT.Official/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q188217",shop:"car"},addTags:{brand:"Seat","brand:wikidata":"Q188217","brand:wikipedia":"en:SEAT",name:"Seat",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Skoda":{name:"Skoda",icon:"maki-car",imageURL:"https://graph.facebook.com/skoda/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q29637",shop:"car"},addTags:{brand:"Skoda","brand:wikidata":"Q29637","brand:wikipedia":"en:Škoda Auto",name:"Skoda",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Subaru":{name:"Subaru",icon:"maki-car",imageURL:"https://graph.facebook.com/SUBARU.jp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q172741",shop:"car"},addTags:{brand:"Subaru","brand:wikidata":"Q172741","brand:wikipedia":"en:Subaru",name:"Subaru",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Suzuki":{name:"Suzuki",icon:"maki-car",imageURL:"https://graph.facebook.com/SuzukiGlobalOfficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q181642",shop:"car"},addTags:{brand:"Suzuki","brand:wikidata":"Q181642","brand:wikipedia":"en:Suzuki",name:"Suzuki",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Tesla":{name:"Tesla",icon:"maki-car",imageURL:"https://pbs.twimg.com/profile_images/489192650474414080/4RxZxsud_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q478214",shop:"car"},addTags:{brand:"Tesla","brand:wikidata":"Q478214","brand:wikipedia":"en:Tesla, Inc.",name:"Tesla",shop:"car"},terms:["tesla motors"],matchScore:2,suggestion:true},"shop/car/Toyota":{name:"Toyota",icon:"maki-car",imageURL:"https://graph.facebook.com/toyota/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q53268",shop:"car"},addTags:{brand:"Toyota","brand:wikidata":"Q53268","brand:wikipedia":"en:Toyota",name:"Toyota",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Volkswagen":{name:"Volkswagen",icon:"maki-car",imageURL:"https://graph.facebook.com/VW/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q246",shop:"car"},addTags:{brand:"Volkswagen","brand:wikidata":"Q246","brand:wikipedia":"en:Volkswagen",name:"Volkswagen",shop:"car"},terms:["vw"],matchScore:2,suggestion:true},"shop/car/Volvo":{name:"Volvo",icon:"maki-car",imageURL:"https://graph.facebook.com/volvocars/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q215293",shop:"car"},addTags:{brand:"Volvo","brand:wikidata":"Q215293","brand:wikipedia":"en:Volvo Cars",name:"Volvo",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/ホンダ":{name:"ホンダ",icon:"maki-car",imageURL:"https://graph.facebook.com/HondaJP/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q9584",shop:"car"},addTags:{brand:"ホンダ","brand:en":"Honda","brand:ja":"ホンダ","brand:wikidata":"Q9584","brand:wikipedia":"ja:本田技研工業",name:"ホンダ","name:en":"Honda","name:ja":"ホンダ",shop:"car"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/carpet/Carpetright":{name:"Carpetright",icon:"maki-shop",imageURL:"https://graph.facebook.com/carpetright/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5045782",shop:"carpet"},addTags:{brand:"Carpetright","brand:wikidata":"Q5045782","brand:wikipedia":"en:Carpetright",name:"Carpetright",shop:"carpet"},countryCodes:["be","gb","ie","nl"],terms:[],matchScore:2,suggestion:true},"shop/catalogue/Argos":{name:"Argos",icon:"maki-shop",imageURL:"https://graph.facebook.com/argos/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4789707",shop:"catalogue"},addTags:{brand:"Argos","brand:wikidata":"Q4789707","brand:wikipedia":"en:Argos (retailer)",name:"Argos",shop:"catalogue"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/charity/Age UK":{name:"Age UK",icon:"maki-shop",imageURL:"https://graph.facebook.com/ageuk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4691850",shop:"charity"},addTags:{brand:"Age UK","brand:wikidata":"Q4691850","brand:wikipedia":"en:Age UK",name:"Age UK",shop:"charity"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/charity/Barnardo's":{name:"Barnardo's",icon:"maki-shop",imageURL:"https://graph.facebook.com/barnardos/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2884670",shop:"charity"},addTags:{brand:"Barnardo's","brand:wikidata":"Q2884670","brand:wikipedia":"en:Barnardo's",name:"Barnardo's",shop:"charity"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/charity/British Heart Foundation":{name:"British Heart Foundation",icon:"maki-shop",imageURL:"https://graph.facebook.com/bhf/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4970039",shop:"charity"},addTags:{brand:"British Heart Foundation","brand:wikidata":"Q4970039","brand:wikipedia":"en:British Heart Foundation",name:"British Heart Foundation",shop:"charity"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/charity/British Red Cross":{name:"British Red Cross",icon:"maki-shop",imageURL:"https://graph.facebook.com/britishredcross/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4970966",shop:"charity"},addTags:{brand:"British Red Cross","brand:wikidata":"Q4970966","brand:wikipedia":"en:British Red Cross",name:"British Red Cross",shop:"charity"},countryCodes:["gb","gg","im"],terms:[],matchScore:2,suggestion:true},"shop/charity/Cancer Research UK":{name:"Cancer Research UK",icon:"maki-shop",imageURL:"https://graph.facebook.com/cancerresearchuk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q326079",shop:"charity"},addTags:{brand:"Cancer Research UK","brand:wikidata":"Q326079","brand:wikipedia":"en:Cancer Research UK",name:"Cancer Research UK",shop:"charity"},countryCodes:["gb","gg"],terms:[],matchScore:2,suggestion:true},"shop/charity/Goodwill":{name:"Goodwill",icon:"maki-shop",imageURL:"https://graph.facebook.com/GoodwillIntl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5583655",shop:"charity"},addTags:{brand:"Goodwill","brand:wikidata":"Q5583655","brand:wikipedia":"en:Goodwill Industries",name:"Goodwill",shop:"charity"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/charity/Mind":{name:"Mind",icon:"maki-shop",imageURL:"https://graph.facebook.com/mindforbettermentalhealth/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3314763",shop:"charity"},addTags:{brand:"Mind","brand:wikidata":"Q3314763","brand:wikipedia":"en:Mind (charity)",name:"Mind",shop:"charity"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/charity/Myrorna":{name:"Myrorna",icon:"maki-shop",imageURL:"https://graph.facebook.com/Myrorna/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10592609",shop:"charity"},addTags:{brand:"Myrorna","brand:wikidata":"Q10592609","brand:wikipedia":"sv:Myrorna",name:"Myrorna",shop:"charity"},countryCodes:["se"],terms:[],matchScore:2,suggestion:true},"shop/charity/Oxfam":{name:"Oxfam",icon:"maki-shop",imageURL:"https://graph.facebook.com/oxfamGB/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q267941",shop:"charity"},addTags:{brand:"Oxfam","brand:wikidata":"Q267941","brand:wikipedia":"en:Oxfam",name:"Oxfam",shop:"charity"},countryCodes:["be","de","gb","ie","im"],terms:[],matchScore:2,suggestion:true},"shop/charity/RSPCA":{name:"RSPCA",icon:"maki-shop",imageURL:"https://graph.facebook.com/RSPCA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q584819",shop:"charity"},addTags:{brand:"RSPCA","brand:wikidata":"Q584819","brand:wikipedia":"en:Royal Society for the Prevention of Cruelty to Animals",name:"RSPCA",shop:"charity"},countryCodes:["au","gb"],terms:[],matchScore:2,suggestion:true},"shop/charity/Scope":{name:"Scope",icon:"maki-shop",imageURL:"https://graph.facebook.com/Scope/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7434435",shop:"charity"},addTags:{brand:"Scope","brand:wikidata":"Q7434435","brand:wikipedia":"en:Scope (charity)",name:"Scope",shop:"charity"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/charity/Sue Ryder":{name:"Sue Ryder",icon:"maki-shop",imageURL:"https://graph.facebook.com/SueRyderNational/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7634271",shop:"charity"},addTags:{brand:"Sue Ryder","brand:wikidata":"Q7634271","brand:wikipedia":"en:Sue Ryder (charity)",name:"Sue Ryder",shop:"charity"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/charity/The Salvation Army":{name:"The Salvation Army",icon:"maki-shop",imageURL:"https://graph.facebook.com/SalvationArmyUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q188307",shop:"charity"},addTags:{brand:"The Salvation Army","brand:wikidata":"Q188307","brand:wikipedia":"en:The Salvation Army",name:"The Salvation Army",shop:"charity"},countryCodes:["au","ca","gb","us"],terms:["salvation army"],matchScore:2,suggestion:true},"shop/chemist/Bipa":{name:"Bipa",icon:"fas-shopping-basket",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBipa%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q864933",shop:"chemist"},addTags:{brand:"Bipa","brand:wikidata":"Q864933","brand:wikipedia":"de:Bipa",name:"Bipa",shop:"chemist"},countryCodes:["at","hr"],terms:[],matchScore:2,suggestion:true},"shop/chemist/Budnikowsky":{name:"Budnikowsky",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/BUDNI/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1001516",shop:"chemist"},addTags:{brand:"Budnikowsky","brand:wikidata":"Q1001516","brand:wikipedia":"de:Budnikowsky",name:"Budnikowsky",shop:"chemist"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/chemist/Drogeria Natura":{name:"Drogeria Natura",icon:"fas-shopping-basket",imageURL:"https://pbs.twimg.com/profile_images/707518851785871360/aCEmonjR_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q9212032",shop:"chemist"},addTags:{brand:"Drogeria Natura","brand:wikidata":"Q9212032","brand:wikipedia":"pl:Drogerie Natura",name:"Drogeria Natura",shop:"chemist"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/chemist/Etos":{name:"Etos",icon:"fas-shopping-basket",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FEtos%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2609459",shop:"chemist"},addTags:{brand:"Etos","brand:wikidata":"Q2609459","brand:wikipedia":"en:Etos",name:"Etos",shop:"chemist"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/chemist/Kruidvat":{name:"Kruidvat",icon:"fas-shopping-basket",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FKruidvat%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2226366",shop:"chemist"},addTags:{brand:"Kruidvat","brand:wikidata":"Q2226366","brand:wikipedia":"en:Kruidvat",name:"Kruidvat",shop:"chemist"},countryCodes:["be","fr","nl"],terms:[],matchScore:2,suggestion:true},"shop/chemist/Matas":{name:"Matas",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q6786143",shop:"chemist"},addTags:{brand:"Matas","brand:wikidata":"Q6786143","brand:wikipedia":"en:Matas (drug store)",name:"Matas",shop:"chemist"},countryCodes:["dk"],terms:[],matchScore:2,suggestion:true},"shop/chemist/Müller":{name:"Müller",icon:"fas-shopping-basket",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20Drogerie%20Mueller.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1958759",shop:"chemist"},addTags:{brand:"Müller","brand:wikidata":"Q1958759","brand:wikipedia":"en:Müller (German trade company)",name:"Müller",shop:"chemist"},countryCodes:["at","ch","de","es","hr","hu"],terms:[],matchScore:2,suggestion:true},"shop/chemist/Rossmann":{name:"Rossmann",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/rossmann.gmbh/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q316004",shop:"chemist"},addTags:{brand:"Rossmann","brand:wikidata":"Q316004","brand:wikipedia":"de:Dirk Rossmann GmbH",name:"Rossmann",shop:"chemist"},countryCodes:["cz","de","hu","pl"],terms:[],matchScore:2,suggestion:true},"shop/chemist/Teta":{name:"Teta",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q20860823",shop:"chemist"},addTags:{brand:"Teta","brand:wikidata":"Q20860823","brand:wikipedia":"cs:Teta drogerie",name:"Teta",shop:"chemist"},countryCodes:["cz","sk"],terms:[],matchScore:2,suggestion:true},"shop/chemist/Trekpleister":{name:"Trekpleister",icon:"fas-shopping-basket",imageURL:"https://pbs.twimg.com/profile_images/1141970592448602112/ubBPZHWI_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q2551576",shop:"chemist"},addTags:{brand:"Trekpleister","brand:wikidata":"Q2551576","brand:wikipedia":"nl:Trekpleister (drogisterij)",name:"Trekpleister",shop:"chemist"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/chemist/Walgreens":{name:"Walgreens",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/walgreens/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1591889",shop:"chemist"},addTags:{brand:"Walgreens","brand:wikidata":"Q1591889","brand:wikipedia":"en:Walgreens",name:"Walgreens",shop:"chemist"},countryCodes:["us"],terms:["walgreens pharmacy"],matchScore:2,suggestion:true},"shop/chemist/Watsons":{name:"Watsons",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/WatsonsPH/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7974785",shop:"chemist"},addTags:{brand:"Watsons","brand:wikidata":"Q7974785","brand:wikipedia":"en:Watsons",name:"Watsons",shop:"chemist"},terms:[],matchScore:2,suggestion:true},"shop/chemist/dm":{name:"dm",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/dm.Deutschland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q266572",shop:"chemist"},addTags:{brand:"dm","brand:wikidata":"Q266572","brand:wikipedia":"en:Dm-drogerie markt",name:"dm",shop:"chemist"},countryCodes:["at","ba","bg","cz","de","hr","hu","it","mk","ro","rs","si","sk"],terms:["dm drogerie markt"],matchScore:2,suggestion:true},"shop/chemist/屈臣氏":{name:"屈臣氏",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/WatsonsPH/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7974785",shop:"chemist"},addTags:{brand:"屈臣氏","brand:wikidata":"Q7974785","brand:wikipedia":"zh:屈臣氏",name:"屈臣氏",shop:"chemist"},countryCodes:["cn","hk","tw"],terms:[],matchScore:2,suggestion:true},"shop/chemist/康是美":{name:"康是美",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q11063876",shop:"chemist"},addTags:{brand:"康是美","brand:wikidata":"Q11063876","brand:wikipedia":"zh:康是美藥妝店",name:"康是美",shop:"chemist"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"shop/chocolate/Cacau Show":{name:"Cacau Show",icon:"maki-shop",imageURL:"https://graph.facebook.com/CacauShow/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q9671713",shop:"chocolate"},addTags:{brand:"Cacau Show","brand:wikidata":"Q9671713","brand:wikipedia":"en:Cacau Show",name:"Cacau Show",shop:"chocolate"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"shop/chocolate/Godiva Chocolatier":{name:"Godiva Chocolatier",icon:"maki-shop",imageURL:"https://graph.facebook.com/Godiva/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q931084",shop:"chocolate"},addTags:{brand:"Godiva Chocolatier","brand:wikidata":"Q931084","brand:wikipedia":"en:Godiva Chocolatier",name:"Godiva Chocolatier",shop:"chocolate"},countryCodes:["us"],terms:["godiva"],matchScore:2,suggestion:true},"shop/chocolate/Jeff de Bruges":{name:"Jeff de Bruges",icon:"maki-shop",geometry:["point","area"],tags:{"brand:wikidata":"Q3176626",shop:"chocolate"},addTags:{brand:"Jeff de Bruges","brand:wikidata":"Q3176626","brand:wikipedia":"fr:Jeff de Bruges",name:"Jeff de Bruges",shop:"chocolate"},countryCodes:["ca","cz","fr","gb"],terms:[],matchScore:2,suggestion:true},"shop/chocolate/Laura Secord":{name:"Laura Secord",icon:"maki-shop",imageURL:"https://pbs.twimg.com/profile_images/771761705336639488/0S9UP_QL_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q6499418",shop:"chocolate"},addTags:{brand:"Laura Secord","brand:wikidata":"Q6499418","brand:wikipedia":"en:Laura Secord Chocolates",name:"Laura Secord",shop:"chocolate"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/chocolate/Leonidas":{name:"Leonidas",icon:"maki-shop",imageURL:"https://graph.facebook.com/Leonidas.Official/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q80335",shop:"chocolate"},addTags:{brand:"Leonidas","brand:wikidata":"Q80335","brand:wikipedia":"en:Leonidas (chocolate maker)",name:"Leonidas",shop:"chocolate"},countryCodes:["be","cz","fr","gb","gr","nl"],terms:[],matchScore:2,suggestion:true},"shop/chocolate/Lindt":{name:"Lindt",icon:"maki-shop",imageURL:"https://graph.facebook.com/lindtchocolateusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q152822",shop:"chocolate"},addTags:{brand:"Lindt","brand:wikidata":"Q152822","brand:wikipedia":"en:Lindt & Sprüngli",name:"Lindt",shop:"chocolate"},terms:[],matchScore:2,suggestion:true},"shop/chocolate/Purdys Chocolatier":{name:"Purdys Chocolatier",icon:"maki-shop",imageURL:"https://pbs.twimg.com/profile_images/930972583658266624/Hwx_gjlb_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q7261007",shop:"chocolate"},addTags:{brand:"Purdys Chocolatier","brand:wikidata":"Q7261007","brand:wikipedia":"en:Purdy's Chocolates",name:"Purdys Chocolatier",shop:"chocolate"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/clothes/AOKI":{name:"AOKI",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/aokistyle/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11189480",shop:"clothes"},addTags:{brand:"AOKI","brand:wikidata":"Q11189480","brand:wikipedia":"ja:AOKIホールディングス",clothes:"men",name:"AOKI","name:ja":"アオキ",shop:"clothes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Abercrombie & Fitch":{name:"Abercrombie & Fitch",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/abercrombieofficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q319344",shop:"clothes"},addTags:{brand:"Abercrombie & Fitch","brand:wikidata":"Q319344","brand:wikipedia":"en:Abercrombie & Fitch",clothes:"men;women",name:"Abercrombie & Fitch",shop:"clothes"},countryCodes:["de","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Accessorize":{name:"Accessorize",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/MonsoonUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3069980",shop:"clothes"},addTags:{brand:"Accessorize","brand:wikidata":"Q3069980","brand:wikipedia":"en:Monsoon Accessorize",name:"Accessorize",shop:"clothes"},countryCodes:["gb","it","ru"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Ackermans":{name:"Ackermans",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/AckermansSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4674255",shop:"clothes"},addTags:{brand:"Ackermans","brand:wikidata":"Q4674255","brand:wikipedia":"en:Ackermans",name:"Ackermans",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Aeropostale":{name:"Aeropostale",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Aeropostale/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q794565",shop:"clothes"},addTags:{brand:"Aeropostale","brand:wikidata":"Q794565","brand:wikipedia":"en:Aéropostale (clothing)",clothes:"men;women",name:"Aeropostale",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/AllSaints":{name:"AllSaints",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/926445027907293185/xgAk5nhG_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q4728473",shop:"clothes"},addTags:{brand:"AllSaints","brand:wikidata":"Q4728473","brand:wikipedia":"en:AllSaints",name:"AllSaints",shop:"clothes"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/clothes/American Eagle Outfitters":{name:"American Eagle Outfitters",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/americaneagle/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2842931",shop:"clothes"},addTags:{brand:"American Eagle Outfitters","brand:wikidata":"Q2842931","brand:wikipedia":"en:American Eagle Outfitters",clothes:"men;women",name:"American Eagle Outfitters",shop:"clothes",short_name:"American Eagle"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Ann Taylor":{name:"Ann Taylor",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/AnnTaylor/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4766699",shop:"clothes"},addTags:{brand:"Ann Taylor","brand:wikidata":"Q4766699","brand:wikipedia":"en:Ann Inc.",clothes:"women",name:"Ann Taylor",shop:"clothes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Anthropologie":{name:"Anthropologie",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Anthropologie/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4773903",shop:"clothes"},addTags:{brand:"Anthropologie","brand:wikidata":"Q4773903","brand:wikipedia":"en:Anthropologie",clothes:"women",name:"Anthropologie",shop:"clothes"},countryCodes:["ca","gb","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Arc'teryx":{name:"Arc'teryx",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/arcteryx/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3271455",shop:"clothes"},addTags:{brand:"Arc'teryx","brand:wikidata":"Q3271455","brand:wikipedia":"en:Arc'teryx",clothes:"men;women",name:"Arc'teryx",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Ardene":{name:"Ardene",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Ardene/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2860764",shop:"clothes"},addTags:{brand:"Ardene","brand:wikidata":"Q2860764","brand:wikipedia":"en:Ardene",name:"Ardene",shop:"clothes"},countryCodes:["ca","sn"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Aritzia":{name:"Aritzia",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/aritzia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4791147",shop:"clothes"},addTags:{brand:"Aritzia","brand:wikidata":"Q4791147","brand:wikipedia":"en:Aritzia",clothes:"women",name:"Aritzia",shop:"clothes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Armand Thiery":{name:"Armand Thiery",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/ARMANDTHIERY/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2861975",shop:"clothes"},addTags:{brand:"Armand Thiery","brand:wikidata":"Q2861975","brand:wikipedia":"fr:Armand Thiery",name:"Armand Thiery",shop:"clothes"},countryCodes:["be","fr"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Armani Exchange":{name:"Armani Exchange",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/armaniexchange/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q56045740",shop:"clothes"},addTags:{brand:"Armani Exchange","brand:wikidata":"Q56045740",clothes:"men;women",name:"Armani Exchange",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Baby Gap":{name:"Baby Gap",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/GapJapan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q420822",shop:"clothes"},addTags:{brand:"Gap","brand:wikidata":"Q420822","brand:wikipedia":"en:Gap Inc.",name:"Baby Gap",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Banana Republic":{name:"Banana Republic",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/BananaRepublic/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q806085",shop:"clothes"},addTags:{brand:"Banana Republic","brand:wikidata":"Q806085","brand:wikipedia":"en:Banana Republic",clothes:"men;women",name:"Banana Republic",shop:"clothes"},countryCodes:["ca","gb","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Bershka":{name:"Bershka",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/bershka/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q827258",shop:"clothes"},addTags:{brand:"Bershka","brand:wikidata":"Q827258","brand:wikipedia":"en:Bershka",name:"Bershka",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Betty Barclay":{name:"Betty Barclay",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Barclay.Betty/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q850250",shop:"clothes"},addTags:{brand:"Betty Barclay","brand:wikidata":"Q850250","brand:wikipedia":"de:Betty Barclay",name:"Betty Barclay",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Big Star":{name:"Big Star",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/bigstareurope/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q9171569",shop:"clothes"},addTags:{brand:"Big Star","brand:wikidata":"Q9171569","brand:wikipedia":"pl:Big Star Limited",name:"Big Star",shop:"clothes"},countryCodes:["by","pl"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Billabong":{name:"Billabong",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/993897138152091648/RkssuGQ7_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q862718",shop:"clothes"},addTags:{brand:"Billabong","brand:wikidata":"Q862718","brand:wikipedia":"en:Billabong (clothing)",clothes:"men;women",name:"Billabong",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Bonita":{name:"Bonita",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q892598",shop:"clothes"},addTags:{brand:"Bonita","brand:wikidata":"Q892598","brand:wikipedia":"de:Bonita (Unternehmen)",name:"Bonita",shop:"clothes"},countryCodes:["at","ch","de","nl"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Bonobo":{name:"Bonobo",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/bonoboplanet/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63682093",shop:"clothes"},addTags:{brand:"Bonobo","brand:wikidata":"Q63682093",clothes:"men;women",name:"Bonobo",shop:"clothes"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Bonobos":{name:"Bonobos",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/bonobos/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4942546",shop:"clothes"},addTags:{brand:"Bonobos","brand:wikidata":"Q4942546","brand:wikipedia":"en:Bonobos (apparel)",clothes:"men",name:"Bonobos",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Brice":{name:"Brice",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/833583108603658240/v7HkRIsd_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q2925067",shop:"clothes"},addTags:{brand:"Brice","brand:wikidata":"Q2925067","brand:wikipedia":"fr:Brice (enseigne)",name:"Brice",shop:"clothes"},countryCodes:["be","fr"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Brooks Brothers":{name:"Brooks Brothers",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/BrooksBrothers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q929722",shop:"clothes"},addTags:{brand:"Brooks Brothers","brand:wikidata":"Q929722","brand:wikipedia":"en:Brooks Brothers",name:"Brooks Brothers",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Brunello Cucinelli":{name:"Brunello Cucinelli",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/BrunelloCucinelli/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3645582",shop:"clothes"},addTags:{brand:"Brunello Cucinelli","brand:wikidata":"Q3645582","brand:wikipedia":"en:Brunello Cucinelli",name:"Brunello Cucinelli",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Buckle":{name:"Buckle",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/bucklestore/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4983306",shop:"clothes"},addTags:{brand:"Buckle","brand:wikidata":"Q4983306","brand:wikipedia":"en:Buckle (clothing retailer)",clothes:"men;women",name:"Buckle",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Buffalo Exchange":{name:"Buffalo Exchange",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/buffaloexchange/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4985721",shop:"clothes"},addTags:{brand:"Buffalo Exchange","brand:wikidata":"Q4985721","brand:wikipedia":"en:Buffalo Exchange",name:"Buffalo Exchange",second_hand:"only",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Burberry":{name:"Burberry",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Burberry/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q390107",shop:"clothes"},addTags:{brand:"Burberry","brand:wikidata":"Q390107","brand:wikipedia":"en:Burberry",clothes:"men;women",name:"Burberry",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Burlington Coat Factory":{name:"Burlington Coat Factory",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/BurlingtonStores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4999220",shop:"clothes"},addTags:{brand:"Burlington Coat Factory","brand:wikidata":"Q4999220","brand:wikipedia":"en:Burlington (department store)",name:"Burlington Coat Factory",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Burton":{name:"Burton",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/BurtonMenswear/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5000795",shop:"clothes"},addTags:{brand:"Burton","brand:wikidata":"Q5000795","brand:wikipedia":"en:Burton (retailer)",name:"Burton",shop:"clothes"},countryCodes:["fr","gb"],terms:[],matchScore:2,suggestion:true},"shop/clothes/C&A":{name:"C&A",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/ca/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q701338",shop:"clothes"},addTags:{brand:"C&A","brand:wikidata":"Q701338","brand:wikipedia":"en:C&A",name:"C&A",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/COS":{name:"COS",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/cos/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q60772401",shop:"clothes"},addTags:{brand:"COS","brand:wikidata":"Q60772401","brand:wikipedia":"en:COS (clothing)",name:"COS",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Cache Cache":{name:"Cache Cache",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/CacheCacheFrance/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63064086",shop:"clothes"},addTags:{brand:"Cache Cache","brand:wikidata":"Q63064086",name:"Cache Cache",shop:"clothes"},countryCodes:["fr","it","lu"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Calvin Klein":{name:"Calvin Klein",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/CalvinKlein/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1068628",shop:"clothes"},addTags:{brand:"Calvin Klein","brand:wikidata":"Q1068628","brand:wikipedia":"en:Calvin Klein (company)",name:"Calvin Klein",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Calzedonia":{name:"Calzedonia",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/calzedonia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1027874",shop:"clothes"},addTags:{brand:"Calzedonia","brand:wikidata":"Q1027874","brand:wikipedia":"en:Calzedonia",name:"Calzedonia",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Camaïeu":{name:"Camaïeu",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/camaieu/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2934647",shop:"clothes"},addTags:{brand:"Camaïeu","brand:wikidata":"Q2934647","brand:wikipedia":"en:Camaïeu (company)",name:"Camaïeu",shop:"clothes"},countryCodes:["be","cz","fr","it","pl"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Camp David":{name:"Camp David",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/CAMPDAVID.OFFICIAL/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q50540636",shop:"clothes"},addTags:{brand:"Camp David","brand:wikidata":"Q50540636","brand:wikipedia":"en:Camp David (fashion)",name:"Camp David",shop:"clothes"},countryCodes:["at","de","ee","sk"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Canada Goose":{name:"Canada Goose",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/canadagoose/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2988422",shop:"clothes"},addTags:{brand:"Canada Goose","brand:wikidata":"Q2988422","brand:wikipedia":"en:Canada Goose",name:"Canada Goose",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Carhartt":{name:"Carhartt",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Carhartt/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q527877",shop:"clothes"},addTags:{brand:"Carhartt","brand:wikidata":"Q527877","brand:wikipedia":"en:Carhartt",clothes:"workwear",name:"Carhartt",shop:"clothes"},countryCodes:["gb","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Caroll":{name:"Caroll",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/carollparis/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63063871",shop:"clothes"},addTags:{brand:"Caroll","brand:wikidata":"Q63063871",name:"Caroll",shop:"clothes"},countryCodes:["ch","fr"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Carter's":{name:"Carter's",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/carters/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5047083",shop:"clothes"},addTags:{brand:"Carter's","brand:wikidata":"Q5047083","brand:wikipedia":"en:Carter's",clothes:"children",name:"Carter's",shop:"clothes"},terms:["carters babies and kids"],matchScore:2,suggestion:true},"shop/clothes/Catherines":{name:"Catherines",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/CatherinesPlusSizes/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64026208",shop:"clothes"},addTags:{brand:"Catherines","brand:wikidata":"Q64026208",clothes:"oversize;women",name:"Catherines",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Cato":{name:"Cato",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/CatoFashions/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16956136",shop:"clothes"},addTags:{brand:"Cato","brand:wikidata":"Q16956136","brand:wikipedia":"en:Cato Corporation",clothes:"women",name:"Cato",official_name:"Cato Fashions",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Celio":{name:"Celio",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/celioOFFICIAL/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2672003",shop:"clothes"},addTags:{brand:"Celio","brand:wikidata":"Q2672003","brand:wikipedia":"en:Celio (retailer)",name:"Celio",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Chanel":{name:"Chanel",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/chanel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q218115",shop:"clothes"},addTags:{brand:"Chanel","brand:wikidata":"Q218115","brand:wikipedia":"en:Chanel",name:"Chanel",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Charles Vögele":{name:"Charles Vögele",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCharles%20Voegele%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1066326",shop:"clothes"},addTags:{brand:"Charles Vögele","brand:wikidata":"Q1066326","brand:wikipedia":"de:Charles Vögele Holding",name:"Charles Vögele",shop:"clothes",short_name:"Vögele"},countryCodes:["at","be","ch","de","hu","nl"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Charlotte Russe":{name:"Charlotte Russe",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/CharlotteRusse/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5086126",shop:"clothes"},addTags:{brand:"Charlotte Russe","brand:wikidata":"Q5086126","brand:wikipedia":"en:Charlotte Russe (clothing retailer)",name:"Charlotte Russe",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Charming Charlie":{name:"Charming Charlie",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q16829286",shop:"clothes"},addTags:{brand:"Charming Charlie","brand:wikidata":"Q16829286","brand:wikipedia":"en:Charming Charlie",clothes:"women",name:"Charming Charlie",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Chico's":{name:"Chico's",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/LoveChicos/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5096393",shop:"clothes"},addTags:{brand:"Chico's","brand:wikidata":"Q5096393","brand:wikipedia":"en:Chico's (clothing retailer)",name:"Chico's",shop:"clothes"},countryCodes:["ar","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Christopher & Banks":{name:"Christopher & Banks",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/ChristopherandBanks/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5111816",shop:"clothes"},addTags:{brand:"Christopher & Banks","brand:wikidata":"Q5111816","brand:wikipedia":"en:Christopher & Banks",name:"Christopher & Banks",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Club Monaco":{name:"Club Monaco",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/clubmonaco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2979949",shop:"clothes"},addTags:{brand:"Club Monaco","brand:wikidata":"Q2979949","brand:wikipedia":"en:Club Monaco",name:"Club Monaco",shop:"clothes"},countryCodes:["ca","gb","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Colin's":{name:"Colin's",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/ColinsLook/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q28729658",shop:"clothes"},addTags:{brand:"Colin's","brand:wikidata":"Q28729658",name:"Colin's",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Columbia":{name:"Columbia",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/ColumbiaSportswear/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1112588",shop:"clothes"},addTags:{brand:"Columbia","brand:wikidata":"Q1112588","brand:wikipedia":"en:Columbia Sportswear",name:"Columbia",official_name:"Columbia Sportswear",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Cropp":{name:"Cropp",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/CroppGlobal/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q9196793",shop:"clothes"},addTags:{brand:"Cropp","brand:wikidata":"Q9196793","brand:wikipedia":"pl:Cropp",name:"Cropp",shop:"clothes"},countryCodes:["cs","hu","pl","ro","ru","sk","ua"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Cubus":{name:"Cubus",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/cubusnorge/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3439593",shop:"clothes"},addTags:{brand:"Cubus","brand:wikidata":"Q3439593","brand:wikipedia":"no:Cubus",name:"Cubus",shop:"clothes"},countryCodes:["de","fi","lv","no","pl","se"],terms:[],matchScore:2,suggestion:true},"shop/clothes/DXL Men's Apparel":{name:"DXL Men's Apparel",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/DestinationXL/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61981830",shop:"clothes"},addTags:{brand:"DXL Men's Apparel","brand:wikidata":"Q61981830",clothes:"oversize;men",name:"DXL Men's Apparel",shop:"clothes",short_name:"DXL"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Damart":{name:"Damart",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/damartbelgium/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3012602",shop:"clothes"},addTags:{brand:"Damart","brand:wikidata":"Q3012602","brand:wikipedia":"en:Damart",name:"Damart",shop:"clothes"},countryCodes:["be","fr","lu"],terms:[],matchScore:2,suggestion:true},"shop/clothes/David's Bridal":{name:"David's Bridal",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/davidsbridal/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5230388",shop:"clothes"},addTags:{brand:"David's Bridal","brand:wikidata":"Q5230388","brand:wikipedia":"en:David's Bridal",clothes:"wedding",name:"David's Bridal",shop:"clothes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Desigual":{name:"Desigual",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/desigual6/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q83750",shop:"clothes"},addTags:{brand:"Desigual","brand:wikidata":"Q83750","brand:wikipedia":"en:Desigual",name:"Desigual",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Devred":{name:"Devred",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Devred1902.Officiel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3025542",shop:"clothes"},addTags:{brand:"Devred","brand:wikidata":"Q3025542","brand:wikipedia":"fr:Devred 1902",name:"Devred",shop:"clothes"},countryCodes:["be","fr","ma"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Diesel":{name:"Diesel",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Diesel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q158285",shop:"clothes"},addTags:{brand:"Diesel","brand:wikidata":"Q158285","brand:wikipedia":"en:Diesel (brand)",name:"Diesel",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Dior":{name:"Dior",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Dior/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q542767",shop:"clothes"},addTags:{brand:"Dior","brand:wikidata":"Q542767","brand:wikipedia":"en:Christian Dior (fashion house)",name:"Dior",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Diverse":{name:"Diverse",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/DiverseSystem/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11694298",shop:"clothes"},addTags:{brand:"Diverse","brand:wikidata":"Q11694298","brand:wikipedia":"pl:Diverse",name:"Diverse",shop:"clothes"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Dolce & Gabbana":{name:"Dolce & Gabbana",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/DolceGabbana/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q214480",shop:"clothes"},addTags:{brand:"Dolce & Gabbana","brand:wikidata":"Q214480","brand:wikipedia":"en:Dolce & Gabbana",name:"Dolce & Gabbana",shop:"clothes"},terms:["d&g","dolce & gabana","dolce & gabanna","dolce & gabbanna","dolce and gabana","dolce and gabanna","dolce and gabbana","dolce and gabbanna","dolce y gabana","dolce y gabanna","dolce y gabbana","dolce y gabbanna"],matchScore:2,suggestion:true},"shop/clothes/Dorothy Perkins":{name:"Dorothy Perkins",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/dorothyperkins/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5298588",shop:"clothes"},addTags:{brand:"Dorothy Perkins","brand:wikidata":"Q5298588","brand:wikipedia":"en:Dorothy Perkins",name:"Dorothy Perkins",shop:"clothes"},countryCodes:["gb","gg","ie","im"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Dress Barn":{name:"Dress Barn",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/dressbarn/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5307031",shop:"clothes"},addTags:{brand:"Dress Barn","brand:wikidata":"Q5307031","brand:wikipedia":"en:Ascena Retail Group",name:"Dress Barn",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Dressmann":{name:"Dressmann",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/dressmann.no/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3357081",shop:"clothes"},addTags:{brand:"Dressmann","brand:wikidata":"Q3357081","brand:wikipedia":"en:Dressmann",name:"Dressmann",shop:"clothes"},countryCodes:["at","fi","no","se"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Dynamite":{name:"Dynamite",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q3117385",shop:"clothes"},addTags:{brand:"Dynamite","brand:wikidata":"Q3117385","brand:wikipedia":"en:Groupe Dynamite",clothes:"women",name:"Dynamite",shop:"clothes"},countryCodes:["ca","jo","ku","sa","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Eddie Bauer":{name:"Eddie Bauer",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/EddieBauer/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q842174",shop:"clothes"},addTags:{brand:"Eddie Bauer","brand:wikidata":"Q842174","brand:wikipedia":"en:Eddie Bauer",name:"Eddie Bauer",shop:"clothes"},countryCodes:["ca","jp","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Engbers":{name:"Engbers",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/engbers.maennermode/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1290088",shop:"clothes"},addTags:{brand:"Engbers","brand:wikidata":"Q1290088","brand:wikipedia":"de:Engbers",name:"Engbers",shop:"clothes"},countryCodes:["at","de"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Ermenegildo Zegna":{name:"Ermenegildo Zegna",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/ermenegildozegna/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1355904",shop:"clothes"},addTags:{brand:"Ermenegildo Zegna","brand:wikidata":"Q1355904","brand:wikipedia":"en:Ermenegildo Zegna",clothes:"men",name:"Ermenegildo Zegna",shop:"clothes",short_name:"Zegna"},countryCodes:["ch","it"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Ernsting's family":{name:"Ernsting's family",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Ernstingsfamily/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1361016",shop:"clothes"},addTags:{brand:"Ernsting's family","brand:wikidata":"Q1361016","brand:wikipedia":"de:Ernsting’s family",name:"Ernsting's family",shop:"clothes"},countryCodes:["at","de"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Esprit":{name:"Esprit",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/esprit/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q532746",shop:"clothes"},addTags:{brand:"Esprit","brand:wikidata":"Q532746","brand:wikipedia":"en:Esprit Holdings",name:"Esprit",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Etam":{name:"Etam",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/etam/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3059202",shop:"clothes"},addTags:{brand:"Etam","brand:wikidata":"Q3059202","brand:wikipedia":"en:Etam Développement",name:"Etam",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Express":{name:"Express",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/express/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1384784",shop:"clothes"},addTags:{brand:"Express","brand:wikidata":"Q1384784","brand:wikipedia":"en:Express, Inc.",name:"Express",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Fairweather":{name:"Fairweather",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/870307662935805961/8fyPNSUX_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q64861806",shop:"clothes"},addTags:{brand:"Fairweather","brand:wikidata":"Q64861806",clothes:"women",name:"Fairweather",shop:"clothes"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Fat Face":{name:"Fat Face",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/fatfaceusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5437186",shop:"clothes"},addTags:{brand:"Fat Face","brand:wikidata":"Q5437186","brand:wikipedia":"en:Fat Face",name:"Fat Face",shop:"clothes"},countryCodes:["gb","gg","ie"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Fendi":{name:"Fendi",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Fendi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q926575",shop:"clothes"},addTags:{brand:"Fendi","brand:wikidata":"Q926575","brand:wikipedia":"en:Fendi",name:"Fendi",shop:"clothes"},countryCodes:["fr","it"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Forever 21":{name:"Forever 21",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Forever21/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1060537",shop:"clothes"},addTags:{brand:"Forever 21","brand:wikidata":"Q1060537","brand:wikipedia":"en:Forever 21",name:"Forever 21",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Free People":{name:"Free People",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/FreePeople/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5499945",shop:"clothes"},addTags:{brand:"Free People","brand:wikidata":"Q5499945","brand:wikipedia":"en:Free People",name:"Free People",shop:"clothes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/GU":{name:"GU",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/g.u.japan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5512642",shop:"clothes"},addTags:{brand:"GU","brand:wikidata":"Q5512642","brand:wikipedia":"en:GU (retailer)",name:"GU",shop:"clothes"},countryCodes:["cl","jp","tw"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Gant":{name:"Gant",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/gant/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1493667",shop:"clothes"},addTags:{brand:"Gant","brand:wikidata":"Q1493667","brand:wikipedia":"en:Gant (retailer)",name:"Gant",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Gap":{name:"Gap",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/GapJapan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q420822",shop:"clothes"},addTags:{brand:"Gap","brand:wikidata":"Q420822","brand:wikipedia":"en:Gap Inc.",name:"Gap",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Gap Kids":{name:"Gap Kids",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/GapJapan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q420822",shop:"clothes"},addTags:{brand:"Gap","brand:wikidata":"Q420822","brand:wikipedia":"en:Gap Inc.",name:"Gap Kids",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Garage":{name:"Garage",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/1138911592970670080/7cyb2dhC_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q5521860",shop:"clothes"},addTags:{brand:"Garage","brand:wikidata":"Q5521860","brand:wikipedia":"en:Garage (clothing retailer)",clothes:"women",name:"Garage",shop:"clothes"},countryCodes:["am","ca","jo","om","qa","sa","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Gerry Weber":{name:"Gerry Weber",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/gerryweber.global/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q873447",shop:"clothes"},addTags:{brand:"Gerry Weber","brand:wikidata":"Q873447","brand:wikipedia":"en:Gerry Weber",name:"Gerry Weber",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Gina Laura":{name:"Gina Laura",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/ginalaura.mode/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2700576",shop:"clothes"},addTags:{brand:"Gina Laura","brand:wikidata":"Q2700576","brand:wikipedia":"de:Gina Laura",name:"Gina Laura",shop:"clothes"},countryCodes:["at","de"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Gloria Jeans":{name:"Gloria Jeans",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/gloriajeanscorp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4139985",shop:"clothes"},addTags:{brand:"Gloria Jeans","brand:wikidata":"Q4139985","brand:wikipedia":"ru:Глория Джинс",name:"Gloria Jeans",shop:"clothes"},countryCodes:["ru","ua"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Gucci":{name:"Gucci",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/GUCCI/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q178516",shop:"clothes"},addTags:{brand:"Gucci","brand:wikidata":"Q178516","brand:wikipedia":"en:Gucci",name:"Gucci",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Guess":{name:"Guess",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/GUESS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2470307",shop:"clothes"},addTags:{brand:"Guess","brand:wikidata":"Q2470307","brand:wikipedia":"en:Guess (clothing)",name:"Guess",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Gymboree":{name:"Gymboree",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Gymboree/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4039771",shop:"clothes"},addTags:{brand:"Gymboree","brand:wikidata":"Q4039771","brand:wikipedia":"en:Gymboree",name:"Gymboree",shop:"clothes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Gémo":{name:"Gémo",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Gemo.Officiel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3122954",shop:"clothes"},addTags:{brand:"Gémo","brand:wikidata":"Q3122954","brand:wikipedia":"fr:Gémo",name:"Gémo",shop:"clothes"},countryCodes:["be","ch","fr"],terms:[],matchScore:2,suggestion:true},"shop/clothes/H&M":{name:"H&M",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/hmhongkong/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q188326",shop:"clothes"},addTags:{brand:"H&M","brand:wikidata":"Q188326","brand:wikipedia":"en:H&M",name:"H&M",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Haggar":{name:"Haggar",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/1013286424693518336/6XVpnzF7_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q5638669",shop:"clothes"},addTags:{alt_name:"Haggar Clothing Co.",brand:"Haggar","brand:wikidata":"Q5638669","brand:wikipedia":"en:Haggar Clothing",name:"Haggar",shop:"clothes"},countryCodes:["us"],terms:["haggar clothing"],matchScore:2,suggestion:true},"shop/clothes/Hallhuber":{name:"Hallhuber",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/hallhuberfashion/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1571714",shop:"clothes"},addTags:{brand:"Hallhuber","brand:wikidata":"Q1571714","brand:wikipedia":"de:Hallhuber (Bekleidungshaus)",name:"Hallhuber",shop:"clothes"},countryCodes:["at","ch","de","lu","nl"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Hanna Andersson":{name:"Hanna Andersson",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/ShopHannaAndersson/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17460802",shop:"clothes"},addTags:{brand:"Hanna Andersson","brand:wikidata":"Q17460802","brand:wikipedia":"en:Hanna Andersson",clothes:"baby;children;women",name:"Hanna Andersson",shop:"clothes"},countryCodes:["us"],terms:["hanna anderssen"],matchScore:2,suggestion:true},"shop/clothes/Hermès":{name:"Hermès",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/hermesusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q843887",shop:"clothes"},addTags:{brand:"Hermès","brand:wikidata":"Q843887","brand:wikipedia":"en:Hermès",name:"Hermès",shop:"clothes"},countryCodes:["ch","fr"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Hollister":{name:"Hollister",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/hollister/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1257477",shop:"clothes"},addTags:{brand:"Hollister","brand:wikidata":"Q1257477","brand:wikipedia":"en:Hollister Co.",name:"Hollister",official_name:"Hollister Co.",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Hot Topic":{name:"Hot Topic",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/hottopic/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q9294032",shop:"clothes"},addTags:{brand:"Hot Topic","brand:wikidata":"Q9294032","brand:wikipedia":"en:Hot Topic",name:"Hot Topic",shop:"clothes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Hugo Boss":{name:"Hugo Boss",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/hugoboss/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q491627",shop:"clothes"},addTags:{brand:"Hugo Boss","brand:wikidata":"Q491627","brand:wikipedia":"en:Hugo Boss",name:"Hugo Boss",shop:"clothes",short_name:"Boss"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Hunkemöller":{name:"Hunkemöller",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/hunkemoller/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2604175",shop:"clothes"},addTags:{brand:"Hunkemöller","brand:wikidata":"Q2604175","brand:wikipedia":"en:Hunkemöller",name:"Hunkemöller",shop:"clothes"},countryCodes:["at","be","de","dk","es","lu","nl"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Indochino":{name:"Indochino",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/indochino/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64448127",shop:"clothes"},addTags:{brand:"Indochino","brand:wikidata":"Q64448127","brand:wikipedia":"en:Indochino",clothes:"suits",name:"Indochino",shop:"clothes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Intimissimi":{name:"Intimissimi",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/intimissimi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q305404",shop:"clothes"},addTags:{brand:"Intimissimi","brand:wikidata":"Q305404","brand:wikipedia":"en:Intimissimi",clothes:"underwear",name:"Intimissimi",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/J.Crew":{name:"J.Crew",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/jcrew/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5370765",shop:"clothes"},addTags:{brand:"J.Crew","brand:wikidata":"Q5370765","brand:wikipedia":"en:J.Crew",clothes:"men;women;children",name:"J.Crew",shop:"clothes"},countryCodes:["ca","gb","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/J.Jill":{name:"J.Jill",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/JJillStyle/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64448268",shop:"clothes"},addTags:{brand:"J.Jill","brand:wikidata":"Q64448268","brand:wikipedia":"en:J.Jill",clothes:"women",name:"J.Jill",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/JBC":{name:"JBC",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/jbcfashion/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2671470",shop:"clothes"},addTags:{brand:"JBC","brand:wikidata":"Q2671470","brand:wikipedia":"nl:JBC",name:"JBC",shop:"clothes"},countryCodes:["be","lu"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Jack & Jones":{name:"Jack & Jones",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/jackandjonesUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6077665",shop:"clothes"},addTags:{brand:"Jack & Jones","brand:wikidata":"Q6077665","brand:wikipedia":"en:Jack & Jones",name:"Jack & Jones",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Jack Wills":{name:"Jack Wills",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/jackwills/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6115814",shop:"clothes"},addTags:{brand:"Jack Wills","brand:wikidata":"Q6115814","brand:wikipedia":"en:Jack Wills",name:"Jack Wills",shop:"clothes"},countryCodes:["ae","gb","hk","ie","kw","lb","mo","sg","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Janie & Jack":{name:"Janie & Jack",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/janieandjack/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64449634",shop:"clothes"},addTags:{brand:"Janie & Jack","brand:wikidata":"Q64449634","brand:wikipedia":"en:Janie & Jack",clothes:"children",name:"Janie & Jack",shop:"clothes"},countryCodes:["ca","us"],terms:["janie and jack"],matchScore:2,suggestion:true},"shop/clothes/Jeans Fritz":{name:"Jeans Fritz",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/JeansFritz/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1686071",shop:"clothes"},addTags:{brand:"Jeans Fritz","brand:wikidata":"Q1686071","brand:wikipedia":"de:Jeans Fritz",name:"Jeans Fritz",shop:"clothes"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Jennyfer":{name:"Jennyfer",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/brand.jennyfer/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3177174",shop:"clothes"},addTags:{brand:"Jennyfer","brand:wikidata":"Q3177174","brand:wikipedia":"fr:Jennyfer",name:"Jennyfer",shop:"clothes"},countryCodes:["fr","it","lu"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Jet":{name:"Jet",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/JetGoodForLife/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61995123",shop:"clothes"},addTags:{brand:"Jet","brand:wikidata":"Q61995123",name:"Jet",shop:"clothes"},countryCodes:["za"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Jigsaw":{name:"Jigsaw",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/InsideJigsaw/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6192383",shop:"clothes"},addTags:{brand:"Jigsaw","brand:wikidata":"Q6192383","brand:wikipedia":"en:Jigsaw (clothing retailer)",name:"Jigsaw",shop:"clothes"},countryCodes:["au","gb","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/JoS. A. Bank":{name:"JoS. A. Bank",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Jos.A.Bank.Clothiers.Inc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6204078",shop:"clothes"},addTags:{brand:"JoS. A. Bank","brand:wikidata":"Q6204078","brand:wikipedia":"en:JoS. A. Bank Clothiers",name:"JoS. A. Bank",official_name:"Jos. A. Bank Clothiers",shop:"clothes"},countryCodes:["us"],terms:["joseph a bank"],matchScore:2,suggestion:true},"shop/clothes/Joules":{name:"Joules",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Joules/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q25351738",shop:"clothes"},addTags:{brand:"Joules","brand:wikidata":"Q25351738","brand:wikipedia":"en:Joules (clothing)",name:"Joules",shop:"clothes"},countryCodes:["gb","gg","ie"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Jules":{name:"Jules",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Julescom/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3188386",shop:"clothes"},addTags:{brand:"Jules","brand:wikidata":"Q3188386","brand:wikipedia":"fr:Jules (enseigne)",clothes:"men",name:"Jules",shop:"clothes"},countryCodes:["be","fr","it"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Justice":{name:"Justice",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Justice/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7857512",shop:"clothes"},addTags:{brand:"Justice","brand:wikidata":"Q7857512","brand:wikipedia":"en:Tween Brands",name:"Justice",shop:"clothes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/KappAhl":{name:"KappAhl",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/kappahl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4349016",shop:"clothes"},addTags:{brand:"KappAhl","brand:wikidata":"Q4349016","brand:wikipedia":"sv:Kappahl",name:"KappAhl",shop:"clothes"},countryCodes:["fi","no","pl","se"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Kate Spade New York":{name:"Kate Spade New York",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/katespadeny/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6375797",shop:"clothes"},addTags:{brand:"Kate Spade New York","brand:wikidata":"Q6375797","brand:wikipedia":"en:Kate Spade New York",name:"Kate Spade New York",shop:"clothes",short_name:"Kate Spade"},countryCodes:["ca","us"],terms:["kate spade ny"],matchScore:2,suggestion:true},"shop/clothes/KiK":{name:"KiK",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/kik/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q883965",shop:"clothes"},addTags:{brand:"KiK","brand:wikidata":"Q883965","brand:wikipedia":"en:KiK",name:"KiK",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Kiabi":{name:"Kiabi",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Kiabi.official/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3196299",shop:"clothes"},addTags:{brand:"Kiabi","brand:wikidata":"Q3196299","brand:wikipedia":"fr:Kiabi",name:"Kiabi",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/LC Waikiki":{name:"LC Waikiki",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/lcwaikiki/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3205965",shop:"clothes"},addTags:{brand:"LC Waikiki","brand:wikidata":"Q3205965","brand:wikipedia":"fr:LC Waikiki",name:"LC Waikiki",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/La Senza":{name:"La Senza",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/lasenza/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3212802",shop:"clothes"},addTags:{brand:"La Senza","brand:wikidata":"Q3212802","brand:wikipedia":"en:La Senza",name:"La Senza",shop:"clothes"},countryCodes:["ca","gb"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Lacoste":{name:"Lacoste",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Lacoste/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q309031",shop:"clothes"},addTags:{brand:"Lacoste","brand:wikidata":"Q309031","brand:wikipedia":"en:Lacoste",name:"Lacoste",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Lane Bryant":{name:"Lane Bryant",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/LaneBryant/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6485350",shop:"clothes"},addTags:{brand:"Lane Bryant","brand:wikidata":"Q6485350","brand:wikipedia":"en:Lane Bryant",clothes:"oversize;women",name:"Lane Bryant",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Laura":{name:"Laura",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q6498590",shop:"clothes"},addTags:{brand:"Laura","brand:wikidata":"Q6498590","brand:wikipedia":"en:Laura (clothing retailer)",clothes:"women",name:"Laura",shop:"clothes"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Levi's":{name:"Levi's",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Levis/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q127962",shop:"clothes"},addTags:{brand:"Levi's","brand:wikidata":"Q127962","brand:wikipedia":"en:Levi Strauss & Co.",clothes:"denim;men;women",name:"Levi's",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Lids":{name:"Lids",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Lids/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q19841609",shop:"clothes"},addTags:{brand:"Lids","brand:wikidata":"Q19841609","brand:wikipedia":"en:Lids (store)",clothes:"hats",name:"Lids",shop:"clothes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Lindex":{name:"Lindex",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/lindex/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1786717",shop:"clothes"},addTags:{brand:"Lindex","brand:wikidata":"Q1786717","brand:wikipedia":"en:Lindex",name:"Lindex",shop:"clothes"},countryCodes:["cz","ee","fi","no","se","sk"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Loft":{name:"Loft",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/LOFT/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62075137",shop:"clothes"},addTags:{brand:"Loft","brand:wikidata":"Q62075137",clothes:"women",name:"Loft",shop:"clothes"},terms:["ann taylor loft"],matchScore:2,suggestion:true},"shop/clothes/Loro Piana":{name:"Loro Piana",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/LoroPiana/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1686544",shop:"clothes"},addTags:{brand:"Loro Piana","brand:wikidata":"Q1686544","brand:wikipedia":"en:Loro Piana",name:"Loro Piana",shop:"clothes"},countryCodes:["fr","it"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Louis Vuitton":{name:"Louis Vuitton",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/LouisVuitton/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q191485",shop:"clothes"},addTags:{brand:"Louis Vuitton","brand:wikidata":"Q191485","brand:wikipedia":"en:Louis Vuitton",name:"Louis Vuitton",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Lowes":{name:"Lowes",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/842174325243305984/dylLS9xr_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q6693996",shop:"clothes"},addTags:{brand:"Lowes","brand:wikidata":"Q6693996","brand:wikipedia":"en:Lowes Menswear",name:"Lowes",shop:"clothes"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Lucky Brand":{name:"Lucky Brand",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/luckybrand/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6697865",shop:"clothes"},addTags:{brand:"Lucky Brand","brand:wikidata":"Q6697865","brand:wikipedia":"en:Lucky Brand Jeans",name:"Lucky Brand",shop:"clothes"},countryCodes:["ca","us"],terms:["lucky brand jeans"],matchScore:2,suggestion:true},"shop/clothes/Lululemon":{name:"Lululemon",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/lululemon/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6702957",shop:"clothes"},addTags:{brand:"Lululemon","brand:wikidata":"Q6702957","brand:wikipedia":"en:Lululemon Athletica",clothes:"men;women",name:"Lululemon",official_name:"Lululemon Athletica",shop:"clothes"},countryCodes:["au","ca","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/M&Co":{name:"M&Co",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/mandcofashion/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6711808",shop:"clothes"},addTags:{brand:"M&Co","brand:wikidata":"Q6711808","brand:wikipedia":"en:M&Co.",name:"M&Co",shop:"clothes"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Madewell":{name:"Madewell",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/madewell/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64026213",shop:"clothes"},addTags:{brand:"Madewell","brand:wikidata":"Q64026213",clothes:"men;women",name:"Madewell",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Mango":{name:"Mango",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/mango.com/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q136503",shop:"clothes"},addTags:{brand:"Mango","brand:wikidata":"Q136503","brand:wikipedia":"en:Mango (retailer)",name:"Mango",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Marc O'Polo":{name:"Marc O'Polo",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/marcopoloru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1892752",shop:"clothes"},addTags:{brand:"Marc O'Polo","brand:wikidata":"Q1892752","brand:wikipedia":"en:Marc O'Polo",name:"Marc O'Polo",shop:"clothes"},countryCodes:["at","be","ch","de","nl","pl"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Marimekko":{name:"Marimekko",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/marimekkodesignhouse/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q534903",shop:"clothes"},addTags:{brand:"Marimekko","brand:wikidata":"Q534903","brand:wikipedia":"fi:Marimekko",name:"Marimekko",shop:"clothes"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Mark's":{name:"Mark's",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/MarksClothing/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6766373",shop:"clothes"},addTags:{brand:"Mark's","brand:wikidata":"Q6766373","brand:wikipedia":"en:Mark's",name:"Mark's",shop:"clothes"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Massimo Dutti":{name:"Massimo Dutti",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/MassimoDuttiOfficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q788231",shop:"clothes"},addTags:{brand:"Massimo Dutti","brand:wikidata":"Q788231","brand:wikipedia":"en:Massimo Dutti",name:"Massimo Dutti",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Matalan":{name:"Matalan",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/shopmatalan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12061509",shop:"clothes"},addTags:{brand:"Matalan","brand:wikidata":"Q12061509","brand:wikipedia":"en:Matalan",name:"Matalan",shop:"clothes"},countryCodes:["ae","gb"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Maurices":{name:"Maurices",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/maurices/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6793571",shop:"clothes"},addTags:{brand:"Maurices","brand:wikidata":"Q6793571","brand:wikipedia":"en:Maurices",name:"Maurices",shop:"clothes"},countryCodes:["ca","fr","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Max Mara":{name:"Max Mara",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/maxmara/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1151774",shop:"clothes"},addTags:{brand:"Max Mara","brand:wikidata":"Q1151774","brand:wikipedia":"en:Max Mara",name:"Max Mara",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Melanie Lyne":{name:"Melanie Lyne",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q64861470",shop:"clothes"},addTags:{brand:"Melanie Lyne","brand:wikidata":"Q64861470",clothes:"women",name:"Melanie Lyne",shop:"clothes"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Men's Wearhouse":{name:"Men's Wearhouse",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/MensWearhouse/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q57405513",shop:"clothes"},addTags:{brand:"Men's Wearhouse","brand:wikidata":"Q57405513","brand:wikipedia":"en:Men's Wearhouse",clothes:"suits",name:"Men's Wearhouse",shop:"clothes"},countryCodes:["us"],terms:["mens warehouse"],matchScore:2,suggestion:true},"shop/clothes/Mexx":{name:"Mexx",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Mexx/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1837290",shop:"clothes"},addTags:{brand:"Mexx","brand:wikidata":"Q1837290","brand:wikipedia":"en:Mexx",name:"Mexx",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Michael Kors":{name:"Michael Kors",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/MichaelKors/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q19572998",shop:"clothes"},addTags:{brand:"Michael Kors","brand:wikidata":"Q19572998","brand:wikipedia":"en:Capri Holdings",name:"Michael Kors",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Monsoon":{name:"Monsoon",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/MonsoonUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3069980",shop:"clothes"},addTags:{brand:"Monsoon","brand:wikidata":"Q3069980","brand:wikipedia":"en:Monsoon Accessorize",name:"Monsoon",shop:"clothes"},countryCodes:["gb","gg","ie"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Moores":{name:"Moores",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/471700618038345729/gZ8q6UVv_bigger.jpeg",geometry:["point","area"],tags:{"brand:wikidata":"Q6908309",shop:"clothes"},addTags:{brand:"Moores","brand:wikidata":"Q6908309","brand:wikipedia":"en:Moores",clothes:"men",name:"Moores",shop:"clothes"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Mr Price":{name:"Mr Price",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/MRPFASHION/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6929120",shop:"clothes"},addTags:{brand:"Mr Price","brand:wikidata":"Q6929120","brand:wikipedia":"en:Mr. Price",name:"Mr Price",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/NKD":{name:"NKD",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/nkd.friends/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q927272",shop:"clothes"},addTags:{brand:"NKD","brand:wikidata":"Q927272","brand:wikipedia":"de:NKD",name:"NKD",shop:"clothes"},countryCodes:["at","de","it","si"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Naf Naf":{name:"Naf Naf",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/nafnaf.com/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3334188",shop:"clothes"},addTags:{brand:"Naf Naf","brand:wikidata":"Q3334188","brand:wikipedia":"fr:Naf Naf",name:"Naf Naf",shop:"clothes"},countryCodes:["ch","fr"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Nautica":{name:"Nautica",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Nautica/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6981479",shop:"clothes"},addTags:{brand:"Nautica","brand:wikidata":"Q6981479","brand:wikipedia":"en:Nautica (clothing company)",name:"Nautica",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/New Look":{name:"New Look",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/newlook/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12063852",shop:"clothes"},addTags:{brand:"New Look","brand:wikidata":"Q12063852","brand:wikipedia":"en:New Look (company)",name:"New Look",shop:"clothes"},countryCodes:["be","de","fr","gb","ie","pl"],terms:[],matchScore:2,suggestion:true},"shop/clothes/New York & Company":{name:"New York & Company",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/NewYorkandCompany/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7012977",shop:"clothes"},addTags:{brand:"New York & Company","brand:wikidata":"Q7012977","brand:wikipedia":"en:New York & Company",name:"New York & Company",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/New Yorker":{name:"New Yorker",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/NewYorker.Fashion/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q706421",shop:"clothes"},addTags:{brand:"New Yorker","brand:wikidata":"Q706421","brand:wikipedia":"en:New Yorker (clothing)",name:"New Yorker",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Next":{name:"Next",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/nextofficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q246655",shop:"clothes"},addTags:{brand:"Next","brand:wikidata":"Q246655","brand:wikipedia":"en:Next plc",name:"Next",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Nike":{name:"Nike",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/nike/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q483915",shop:"clothes"},addTags:{brand:"Nike","brand:wikidata":"Q483915","brand:wikipedia":"en:Nike, Inc.",name:"Nike",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Nordstrom Rack":{name:"Nordstrom Rack",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/NordstromRack/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q21463374",shop:"clothes"},addTags:{brand:"Nordstrom Rack","brand:wikidata":"Q21463374","brand:wikipedia":"en:Nordstrom Rack",name:"Nordstrom Rack",shop:"clothes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/OVS":{name:"OVS",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/OVSGlobalPage/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2042514",shop:"clothes"},addTags:{brand:"OVS","brand:wikidata":"Q2042514","brand:wikipedia":"en:OVS (company)",name:"OVS",shop:"clothes"},countryCodes:["at","ch","fr","it","si"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Oasis":{name:"Oasis",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/oasisfashions/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64532852",shop:"clothes"},addTags:{brand:"Oasis","brand:wikidata":"Q64532852",name:"Oasis",shop:"clothes"},countryCodes:["es","gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Okaïdi":{name:"Okaïdi",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/OkaidiWorld/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3350027",shop:"clothes"},addTags:{brand:"Okaïdi","brand:wikidata":"Q3350027","brand:wikipedia":"fr:Okaïdi",name:"Okaïdi",shop:"clothes"},countryCodes:["be","ch","es","fr","it","pl"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Old Navy":{name:"Old Navy",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/oldnavy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2735242",shop:"clothes"},addTags:{brand:"Old Navy","brand:wikidata":"Q2735242","brand:wikipedia":"en:Old Navy",name:"Old Navy",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Only":{name:"Only",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/ONLY/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61799370",shop:"clothes"},addTags:{brand:"Only","brand:wikidata":"Q61799370",name:"Only",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Orchestra":{name:"Orchestra",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/orchestraUS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q28042940",shop:"clothes"},addTags:{brand:"Orchestra","brand:wikidata":"Q28042940","brand:wikipedia":"fr:Orchestra Prémaman",name:"Orchestra",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Orsay":{name:"Orsay",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/orsay/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q883245",shop:"clothes"},addTags:{brand:"Orsay","brand:wikidata":"Q883245","brand:wikipedia":"de:Orsay (Modeunternehmen)",name:"Orsay",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Outfit":{name:"Outfit",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/OutfitFashionUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7112061",shop:"clothes"},addTags:{brand:"Outfit","brand:wikidata":"Q7112061","brand:wikipedia":"en:Outfit (retailer)",name:"Outfit",shop:"clothes"},countryCodes:["de","gb"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Oysho":{name:"Oysho",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/OYSHO/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3327046",shop:"clothes"},addTags:{brand:"Oysho","brand:wikidata":"Q3327046","brand:wikipedia":"en:Oysho",name:"Oysho",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/PacSun":{name:"PacSun",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/pacsun/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7121857",shop:"clothes"},addTags:{brand:"PacSun","brand:wikidata":"Q7121857","brand:wikipedia":"en:PacSun",name:"PacSun",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Palmers":{name:"Palmers",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/palmers.official/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1509985",shop:"clothes"},addTags:{brand:"Palmers","brand:wikidata":"Q1509985","brand:wikipedia":"de:Palmers",name:"Palmers",shop:"clothes"},countryCodes:["at","de"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Peacocks":{name:"Peacocks",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/peacocksclothing/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7157762",shop:"clothes"},addTags:{brand:"Peacocks","brand:wikidata":"Q7157762","brand:wikipedia":"en:Peacocks (clothing)",name:"Peacocks",shop:"clothes"},countryCodes:["cy","gb"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Peek & Cloppenburg":{name:"Peek & Cloppenburg",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/peekcloppenburg/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2066959",shop:"clothes"},addTags:{brand:"Peek & Cloppenburg","brand:wikidata":"Q2066959","brand:wikipedia":"en:Peek & Cloppenburg",name:"Peek & Cloppenburg",shop:"clothes"},countryCodes:["at","be","de","nl","pl"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Pep":{name:"Pep",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/PEPSocial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7166182",shop:"clothes"},addTags:{brand:"Pep","brand:wikidata":"Q7166182","brand:wikipedia":"en:Pep (store)",name:"Pep",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Pepco":{name:"Pepco",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/PEPCOpl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11815580",shop:"clothes"},addTags:{brand:"Pepco","brand:wikidata":"Q11815580","brand:wikipedia":"pl:Pepco",name:"Pepco",shop:"clothes"},countryCodes:["cz","hu","pl","ro","sk"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Petit Bateau":{name:"Petit Bateau",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/petitbateauus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3377090",shop:"clothes"},addTags:{brand:"Petit Bateau","brand:wikidata":"Q3377090","brand:wikipedia":"en:Petit Bateau",name:"Petit Bateau",shop:"clothes"},countryCodes:["be","de","fr","gb","it","lu"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Phase Eight":{name:"Phase Eight",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/phaseeight/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17020730",shop:"clothes"},addTags:{brand:"Phase Eight","brand:wikidata":"Q17020730","brand:wikipedia":"en:Phase Eight",name:"Phase Eight",shop:"clothes"},countryCodes:["ch","de","gb"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Pierre Cardin":{name:"Pierre Cardin",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/PIERRECARDINOFFICIAL/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q22921009",shop:"clothes"},addTags:{brand:"Pierre Cardin","brand:wikidata":"Q22921009",name:"Pierre Cardin",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Pimkie":{name:"Pimkie",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Pimkie/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1758066",shop:"clothes"},addTags:{brand:"Pimkie","brand:wikidata":"Q1758066","brand:wikipedia":"en:Pimkie",name:"Pimkie",shop:"clothes"},countryCodes:["at","be","de","es","fr","it"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Pink":{name:"Pink",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/vspink/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q20716793",shop:"clothes"},addTags:{brand:"Pink","brand:wikidata":"Q20716793","brand:wikipedia":"en:Pink (Victoria's Secret)",clothes:"underwear;women",name:"Pink",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Plato's Closet":{name:"Plato's Closet",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/platoscloset/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61779112",shop:"clothes"},addTags:{brand:"Plato's Closet","brand:wikidata":"Q61779112",name:"Plato's Closet",second_hand:"only",shop:"clothes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Polo Ralph Lauren":{name:"Polo Ralph Lauren",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/RalphLauren/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1641437",shop:"clothes"},addTags:{brand:"Polo Ralph Lauren","brand:wikidata":"Q1641437","brand:wikipedia":"en:Ralph Lauren Corporation",name:"Polo Ralph Lauren",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Primark":{name:"Primark",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Primark/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q137023",shop:"clothes"},addTags:{brand:"Primark","brand:wikidata":"Q137023","brand:wikipedia":"en:Primark",name:"Primark",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Promod":{name:"Promod",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Promod/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3407429",shop:"clothes"},addTags:{brand:"Promod","brand:wikidata":"Q3407429","brand:wikipedia":"en:Promod",name:"Promod",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Pull & Bear":{name:"Pull & Bear",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/pullandbear/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q691029",shop:"clothes"},addTags:{brand:"Pull & Bear","brand:wikidata":"Q691029","brand:wikipedia":"en:Pull&Bear",name:"Pull & Bear",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Puma":{name:"Puma",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/PUMA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q157064",shop:"clothes"},addTags:{brand:"Puma","brand:wikidata":"Q157064","brand:wikipedia":"en:Puma (brand)",name:"Puma",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Rainbow":{name:"Rainbow",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/RainbowApparel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7284708",shop:"clothes"},addTags:{brand:"Rainbow","brand:wikidata":"Q7284708","brand:wikipedia":"en:Rainbow Shops",name:"Rainbow",shop:"clothes"},countryCodes:["de","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Reebok":{name:"Reebok",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/ReebokUS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q466183",shop:"clothes"},addTags:{brand:"Reebok","brand:wikidata":"Q466183","brand:wikipedia":"en:Reebok",name:"Reebok",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Reitmans":{name:"Reitmans",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/reitmans/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7310506",shop:"clothes"},addTags:{brand:"Reitmans","brand:wikidata":"Q7310506","brand:wikipedia":"en:Reitmans",name:"Reitmans",shop:"clothes"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Reserved":{name:"Reserved",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Reserved/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q21809354",shop:"clothes"},addTags:{brand:"Reserved","brand:wikidata":"Q21809354","brand:wikipedia":"en:Reserved",name:"Reserved",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/River Island":{name:"River Island",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/riverisland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2670328",shop:"clothes"},addTags:{brand:"River Island","brand:wikidata":"Q2670328","brand:wikipedia":"en:River Island",name:"River Island",shop:"clothes"},countryCodes:["gb","ie","im","nl","pl"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Robert Graham":{name:"Robert Graham",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/robertgrahamnyc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q18390679",shop:"clothes"},addTags:{brand:"Robert Graham","brand:wikidata":"Q18390679","brand:wikipedia":"en:Robert Graham (fashion brand)",clothes:"men",name:"Robert Graham",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Ross":{name:"Ross",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/RossDressforLess/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3442791",shop:"clothes"},addTags:{brand:"Ross","brand:wikidata":"Q3442791","brand:wikipedia":"en:Ross Stores",name:"Ross",official_name:"Ross Dress for Less",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Saint Laurent":{name:"Saint Laurent",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/ysl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2282172",shop:"clothes"},addTags:{alt_name:"Yves Saint Laurent",brand:"Saint Laurent","brand:wikidata":"Q2282172","brand:wikipedia":"en:Yves Saint Laurent (brand)",name:"Saint Laurent",shop:"clothes",short_name:"YSL"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Sela":{name:"Sela",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/sela.shop/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62075111",shop:"clothes"},addTags:{brand:"Sela","brand:wikidata":"Q62075111",name:"Sela",shop:"clothes"},countryCodes:["kg","ru"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Sergent Major":{name:"Sergent Major",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/sergent.major.officiel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62521738",shop:"clothes"},addTags:{brand:"Sergent Major","brand:wikidata":"Q62521738","brand:wikipedia":"fr:Sergent Major (entreprise)",clothes:"babies;children",name:"Sergent Major",shop:"clothes"},countryCodes:["be","de","es","fr","gb","it"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Sisley":{name:"Sisley",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Sisley/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12054325",shop:"clothes"},addTags:{brand:"Sisley","brand:wikidata":"Q12054325","brand:wikipedia":"cs:Sisley",name:"Sisley",shop:"clothes"},countryCodes:["at","ch","de","hr","it","ru"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Slaters":{name:"Slaters",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Slaters1973/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7538912",shop:"clothes"},addTags:{brand:"Slaters","brand:wikidata":"Q7538912",clothes:"suits",name:"Slaters",shop:"clothes"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Spanx":{name:"Spanx",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/SPANX/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1932886",shop:"clothes"},addTags:{brand:"Spanx","brand:wikidata":"Q1932886","brand:wikipedia":"en:Spanx",clothes:"underwear",name:"Spanx",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Springfield":{name:"Springfield",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Springfield/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q958209",shop:"clothes"},addTags:{brand:"Springfield","brand:wikidata":"Q958209","brand:wikipedia":"es:Springfield (cadena de tiendas)",name:"Springfield",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Stefanel":{name:"Stefanel",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Stefanel.Official/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2338087",shop:"clothes"},addTags:{brand:"Stefanel","brand:wikidata":"Q2338087","brand:wikipedia":"ro:Stefanel (companie)",name:"Stefanel",shop:"clothes"},countryCodes:["at","de","fr","it"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Stradivarius":{name:"Stradivarius",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/stradivas/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3322945",shop:"clothes"},addTags:{brand:"Stradivarius","brand:wikidata":"Q3322945","brand:wikipedia":"en:Stradivarius (clothing brand)",name:"Stradivarius",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Street One":{name:"Street One",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/MyStreetOne/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61997265",shop:"clothes"},addTags:{brand:"Street One","brand:wikidata":"Q61997265",name:"Street One",shop:"clothes"},countryCodes:["at","be","bg","ch","cz","de","dk","es","fi","fr","hr","hu","ie","it","lt","lu","lv","nl","no","pl","ro","se","si","sk"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Suburbia":{name:"Suburbia",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/moda.suburbia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6134992",shop:"clothes"},addTags:{brand:"Suburbia","brand:wikidata":"Q6134992","brand:wikipedia":"en:Suburbia (department store)",name:"Suburbia",shop:"clothes"},countryCodes:["mx"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Superdry":{name:"Superdry",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/SuperdryUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1684445",shop:"clothes"},addTags:{brand:"Superdry","brand:wikidata":"Q1684445","brand:wikipedia":"en:Superdry",name:"Superdry",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/TJ Maxx":{name:"TJ Maxx",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/tjmaxx/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10860683",shop:"clothes"},addTags:{brand:"TJ Maxx","brand:wikidata":"Q10860683","brand:wikipedia":"en:TJ Maxx",name:"TJ Maxx",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/TK Maxx":{name:"TK Maxx",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/tkmaxx/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q23823668",shop:"clothes"},addTags:{brand:"TK Maxx","brand:wikidata":"Q23823668","brand:wikipedia":"en:TK Maxx",name:"TK Maxx",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Takko":{name:"Takko",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/TakkoFashion/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1371302",shop:"clothes"},addTags:{brand:"Takko","brand:wikidata":"Q1371302","brand:wikipedia":"de:Takko",name:"Takko",shop:"clothes"},countryCodes:["at","cz","de","hu","nl"],terms:["takko fashion"],matchScore:2,suggestion:true},"shop/clothes/Talbots":{name:"Talbots",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/TALBOTS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7679064",shop:"clothes"},addTags:{brand:"Talbots","brand:wikidata":"Q7679064","brand:wikipedia":"en:Talbots",name:"Talbots",shop:"clothes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Tally Weijl":{name:"Tally Weijl",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/TALLYWEiJL.official/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q689695",shop:"clothes"},addTags:{brand:"Tally Weijl","brand:wikidata":"Q689695","brand:wikipedia":"en:Tally Weijl",name:"Tally Weijl",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Tati":{name:"Tati",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Tati/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3516026",shop:"clothes"},addTags:{brand:"Tati","brand:wikidata":"Q3516026","brand:wikipedia":"fr:Tati (entreprise)",name:"Tati",shop:"clothes"},countryCodes:["dz","fr"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Tezenis":{name:"Tezenis",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/tezenis/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q28056374",shop:"clothes"},addTags:{brand:"Tezenis","brand:wikidata":"Q28056374",name:"Tezenis",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/The Children's Place":{name:"The Children's Place",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/childrensplace/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3520257",shop:"clothes"},addTags:{alt_name:"Children's Place",brand:"The Children's Place","brand:wikidata":"Q3520257","brand:wikipedia":"en:The Children's Place",name:"The Children's Place",shop:"clothes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/The North Face":{name:"The North Face",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/thenorthface/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q152784",shop:"clothes"},addTags:{alt_name:"North Face",brand:"The North Face","brand:wikidata":"Q152784","brand:wikipedia":"en:The North Face",name:"The North Face",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/The Sting":{name:"The Sting",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/thesting.official/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2518794",shop:"clothes"},addTags:{brand:"The Sting","brand:wikidata":"Q2518794","brand:wikipedia":"nl:The Sting Companies",name:"The Sting",shop:"clothes"},countryCodes:["be","de","gb","nl"],terms:[],matchScore:2,suggestion:true},"shop/clothes/The Walking Company":{name:"The Walking Company",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/TheWalkingCompany/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q30716262",shop:"clothes"},addTags:{alt_name:"Walking Company",brand:"The Walking Company","brand:wikidata":"Q30716262","brand:wikipedia":"en:The Walking Company",name:"The Walking Company",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Tillys":{name:"Tillys",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/780828141644230657/2yanagO1_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q7802889",shop:"clothes"},addTags:{brand:"Tillys","brand:wikidata":"Q7802889","brand:wikipedia":"en:Tillys",clothes:"children;men;women",name:"Tillys",shop:"clothes"},countryCodes:["tr"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Timberland":{name:"Timberland",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/timberland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1539185",shop:"clothes"},addTags:{brand:"Timberland","brand:wikidata":"Q1539185","brand:wikipedia":"en:The Timberland Company",name:"Timberland",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Tip Top Tailors":{name:"Tip Top Tailors",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/1092442171238699013/-Zx_BPzB_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q7808781",shop:"clothes"},addTags:{brand:"Tip Top Tailors","brand:wikidata":"Q7808781","brand:wikipedia":"en:Tip Top Tailors",clothes:"men",name:"Tip Top Tailors",shop:"clothes"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Tom Tailor":{name:"Tom Tailor",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/tomtailor/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q571206",shop:"clothes"},addTags:{brand:"Tom Tailor","brand:wikidata":"Q571206","brand:wikipedia":"en:Tom Tailor",name:"Tom Tailor",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Tommy Bahama":{name:"Tommy Bahama",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/tommybahama/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3531299",shop:"clothes"},addTags:{brand:"Tommy Bahama","brand:wikidata":"Q3531299","brand:wikipedia":"en:Tommy Bahama",name:"Tommy Bahama",shop:"clothes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Tommy Hilfiger":{name:"Tommy Hilfiger",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/tommyhilfiger/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q634881",shop:"clothes"},addTags:{brand:"Tommy Hilfiger","brand:wikidata":"Q634881","brand:wikipedia":"en:Tommy Hilfiger (company)",name:"Tommy Hilfiger",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Topshop":{name:"Topshop",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/227518370711659/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1893576",shop:"clothes"},addTags:{brand:"Topshop","brand:wikidata":"Q1893576","brand:wikipedia":"en:Topshop",name:"Topshop",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Torrid":{name:"Torrid",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Torrid/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7827120",shop:"clothes"},addTags:{brand:"Torrid","brand:wikidata":"Q7827120","brand:wikipedia":"en:Torrid (clothing retailer)",name:"Torrid",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Tory Burch":{name:"Tory Burch",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/toryburch/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q19988222",shop:"clothes"},addTags:{brand:"Tory Burch","brand:wikidata":"Q19988222","brand:wikipedia":"en:Tory Burch (company)",name:"Tory Burch",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Triumph":{name:"Triumph",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/TriumphInternationalUS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q671216",shop:"clothes"},addTags:{brand:"Triumph","brand:wikidata":"Q671216","brand:wikipedia":"en:Triumph International",name:"Triumph",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Truworths":{name:"Truworths",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/TruworthsFashion/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q24233998",shop:"clothes"},addTags:{brand:"Truworths","brand:wikidata":"Q24233998","brand:wikipedia":"en:Truworths",name:"Truworths",shop:"clothes"},countryCodes:["za"],terms:[],matchScore:2,suggestion:true},"shop/clothes/UNTUCKit":{name:"UNTUCKit",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/UNTUCKit/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q28207006",shop:"clothes"},addTags:{brand:"UNTUCKit","brand:wikidata":"Q28207006","brand:wikipedia":"en:Untuckit",name:"UNTUCKit",shop:"clothes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/USC":{name:"USC",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/uscfashion/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7866331",shop:"clothes"},addTags:{brand:"USC","brand:wikidata":"Q7866331","brand:wikipedia":"en:USC (clothing retailer)",name:"USC",shop:"clothes"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Ulla Popken":{name:"Ulla Popken",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/ulla.popken/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2475146",shop:"clothes"},addTags:{brand:"Ulla Popken","brand:wikidata":"Q2475146","brand:wikipedia":"en:Ulla Popken",name:"Ulla Popken",shop:"clothes"},countryCodes:["at","be","ch","de","fr","nl"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Under Armour":{name:"Under Armour",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/UnderArmour/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2031485",shop:"clothes"},addTags:{brand:"Under Armour","brand:wikidata":"Q2031485","brand:wikipedia":"en:Under Armour",clothes:"men;women",name:"Under Armour",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Uniqlo":{name:"Uniqlo",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/uniqlo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q26070",shop:"clothes"},addTags:{brand:"Uniqlo","brand:wikidata":"Q26070","brand:wikipedia":"en:Uniqlo",name:"Uniqlo",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/United Colors of Benetton":{name:"United Colors of Benetton",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/BenettonUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q817139",shop:"clothes"},addTags:{brand:"United Colors of Benetton","brand:wikidata":"Q817139","brand:wikipedia":"en:Benetton Group",name:"United Colors of Benetton",shop:"clothes",short_name:"Benetton"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Urban Outfitters":{name:"Urban Outfitters",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/urbanoutfitters/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3552193",shop:"clothes"},addTags:{brand:"Urban Outfitters","brand:wikidata":"Q3552193","brand:wikipedia":"en:Urban Outfitters",name:"Urban Outfitters",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Vero Moda":{name:"Vero Moda",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/bestsellercom/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q594721",shop:"clothes"},addTags:{brand:"Vero Moda","brand:wikidata":"Q594721","brand:wikipedia":"en:Bestseller (company)",name:"Vero Moda",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Victoria's Secret":{name:"Victoria's Secret",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/victoriassecret/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q332477",shop:"clothes"},addTags:{brand:"Victoria's Secret","brand:wikidata":"Q332477","brand:wikipedia":"en:Victoria's Secret",clothes:"underwear;women",name:"Victoria's Secret",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Vilebrequin":{name:"Vilebrequin",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/VILEBREQUIN/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3558391",shop:"clothes"},addTags:{brand:"Vilebrequin","brand:wikidata":"Q3558391","brand:wikipedia":"en:Vilebrequin",clothes:"swimwear",name:"Vilebrequin",shop:"clothes"},countryCodes:["fr","it"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Vineyard Vines":{name:"Vineyard Vines",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/vineyardvines/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7932495",shop:"clothes"},addTags:{brand:"Vineyard Vines","brand:wikidata":"Q7932495","brand:wikipedia":"en:Vineyard Vines",name:"Vineyard Vines",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Volcom":{name:"Volcom",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Volcom/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2021416",shop:"clothes"},addTags:{brand:"Volcom","brand:wikidata":"Q2021416","brand:wikipedia":"en:Volcom",name:"Volcom",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/WE":{name:"WE",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/weeurope/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1987861",shop:"clothes"},addTags:{brand:"WE","brand:wikidata":"Q1987861","brand:wikipedia":"en:WE (clothing)",name:"WE",shop:"clothes"},countryCodes:["be","ch","de","nl"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Wacoal":{name:"Wacoal",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/wacoal/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q909522",shop:"clothes"},addTags:{brand:"Wacoal","brand:wikidata":"Q909522","brand:wikipedia":"en:Wacoal",clothes:"underwear",name:"Wacoal",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/White House Black Market":{name:"White House Black Market",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/WhiteHouseBlackMarket/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7994858",shop:"clothes"},addTags:{brand:"White House Black Market","brand:wikidata":"Q7994858","brand:wikipedia":"en:White House Black Market",name:"White House Black Market",shop:"clothes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/White Stuff":{name:"White Stuff",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/WhiteStuffUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7995442",shop:"clothes"},addTags:{brand:"White Stuff","brand:wikidata":"Q7995442","brand:wikipedia":"en:White Stuff Clothing",name:"White Stuff",shop:"clothes"},countryCodes:["de","dk","gb","gg"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Wibra":{name:"Wibra",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/WibraBelgie/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q943405",shop:"clothes"},addTags:{brand:"Wibra","brand:wikidata":"Q943405","brand:wikipedia":"en:Wibra",name:"Wibra",shop:"clothes"},countryCodes:["be","nl"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Wilsons Leather":{name:"Wilsons Leather",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/wilsonsleather/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q8023296",shop:"clothes"},addTags:{brand:"Wilsons Leather","brand:wikidata":"Q8023296","brand:wikipedia":"en:Wilsons Leather",clothes:"men;women",name:"Wilsons Leather",shop:"clothes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Winners":{name:"Winners",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Winners/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q845257",shop:"clothes"},addTags:{brand:"Winners","brand:wikidata":"Q845257","brand:wikipedia":"en:Winners",name:"Winners",shop:"clothes"},countryCodes:["ca","es"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Wolford":{name:"Wolford",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/WolfordFashion/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q431607",shop:"clothes"},addTags:{brand:"Wolford","brand:wikidata":"Q431607","brand:wikipedia":"en:Wolford",name:"Wolford",shop:"clothes"},countryCodes:["at","de","fr","gb","it","nl"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Woolworths":{name:"Woolworths",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/WoolworthsSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q8033997",shop:"clothes"},addTags:{brand:"Woolworths","brand:wikidata":"Q8033997","brand:wikipedia":"en:Woolworths Holdings Limited",name:"Woolworths",shop:"clothes"},countryCodes:["za"],terms:[],matchScore:2,suggestion:true},"shop/clothes/XXI Forever":{name:"XXI Forever",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Forever21/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1060537",shop:"clothes"},addTags:{brand:"Forever 21","brand:wikidata":"Q1060537","brand:wikipedia":"en:Forever 21",name:"XXI Forever",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Yamamay":{name:"Yamamay",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/YamamayOfficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2599214",shop:"clothes"},addTags:{brand:"Yamamay","brand:wikidata":"Q2599214","brand:wikipedia":"it:Yamamay",name:"Yamamay",shop:"clothes"},countryCodes:["es","it"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Zara":{name:"Zara",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/zara/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q147662",shop:"clothes"},addTags:{brand:"Zara","brand:wikidata":"Q147662","brand:wikipedia":"en:Zara (retailer)",name:"Zara",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Zeeman":{name:"Zeeman",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/zeemantextielsupers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q184399",shop:"clothes"},addTags:{brand:"Zeeman","brand:wikidata":"Q184399","brand:wikipedia":"en:Zeeman (store)",name:"Zeeman",shop:"clothes"},countryCodes:["be","de","fr","lu","nl"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Zumiez":{name:"Zumiez",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/zumiez/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q8075252",shop:"clothes"},addTags:{brand:"Zumiez","brand:wikidata":"Q8075252","brand:wikipedia":"en:Zumiez",name:"Zumiez",shop:"clothes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/mister*lady":{name:"mister*lady",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/misterlady.community/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q18640136",shop:"clothes"},addTags:{brand:"mister*lady","brand:wikidata":"Q18640136","brand:wikipedia":"de:Mister*lady",name:"mister*lady",shop:"clothes"},countryCodes:["at","de"],terms:[],matchScore:2,suggestion:true},"shop/clothes/rue21":{name:"rue21",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/rue21/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7377762",shop:"clothes"},addTags:{brand:"rue21","brand:wikidata":"Q7377762","brand:wikipedia":"en:Rue21",name:"rue21",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/s.Oliver":{name:"s.Oliver",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/s.OliverGlobal/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q265056",shop:"clothes"},addTags:{brand:"s.Oliver","brand:wikidata":"Q265056","brand:wikipedia":"en:S.Oliver",name:"s.Oliver",shop:"clothes"},countryCodes:["at","be","de","fr","hr"],terms:[],matchScore:2,suggestion:true},"shop/clothes/しまむら":{name:"しまむら",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/shimamuragroup/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7758173",shop:"clothes"},addTags:{brand:"しまむら","brand:en":"Shimamura","brand:ja":"しまむら","brand:wikidata":"Q7758173","brand:wikipedia":"ja:しまむら",name:"しまむら","name:en":"Shimamura","name:ja":"しまむら",shop:"clothes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/clothes/はるやま":{name:"はるやま",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/haruyama.co.jp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11275918",shop:"clothes"},addTags:{brand:"はるやま","brand:en":"Haruyama","brand:ja":"はるやま","brand:wikidata":"Q11275918","brand:wikipedia":"ja:はるやま商事",name:"はるやま","name:en":"Haruyama","name:ja":"はるやま",shop:"clothes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/clothes/ユニクロ":{name:"ユニクロ",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/uniqlo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q26070",shop:"clothes"},addTags:{brand:"ユニクロ","brand:en":"UNIQLO","brand:ja":"ユニクロ","brand:wikidata":"Q26070","brand:wikipedia":"en:Uniqlo",name:"ユニクロ","name:en":"UNIQLO","name:ja":"ユニクロ",shop:"clothes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/clothes/ライトオン":{name:"ライトオン",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/righton.co.jp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11346416",shop:"clothes"},addTags:{brand:"ライトオン","brand:en":"Right-on","brand:ja":"ライトオン","brand:wikidata":"Q11346416","brand:wikipedia":"ja:ライトオン",name:"ライトオン","name:en":"Right-on","name:ja":"ライトオン",shop:"clothes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/clothes/ワークマン":{name:"ワークマン",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/306869439836144/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11351660",shop:"clothes"},addTags:{brand:"ワークマン","brand:en":"Workman","brand:ja":"ワークマン","brand:wikidata":"Q11351660","brand:wikipedia":"ja:ワークマン",name:"ワークマン","name:en":"Workman","name:ja":"ワークマン",shop:"clothes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/clothes/洋服の青山":{name:"洋服の青山",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/AoyamaOfficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11661241",shop:"clothes"},addTags:{brand:"洋服の青山","brand:en":"Aoyama Tailor","brand:ja":"洋服の青山","brand:wikidata":"Q11661241","brand:wikipedia":"ja:青山商事",name:"洋服の青山","name:en":"Aoyama Tailor","name:ja":"洋服の青山",shop:"clothes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/coffee/Nespresso":{name:"Nespresso",icon:"maki-shop",imageURL:"https://graph.facebook.com/nespresso/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q301301",shop:"coffee"},addTags:{brand:"Nespresso","brand:wikidata":"Q301301","brand:wikipedia":"en:Nespresso",name:"Nespresso",shop:"coffee"},terms:[],matchScore:2,suggestion:true},"shop/coffee/Tchibo":{name:"Tchibo",icon:"maki-shop",imageURL:"https://graph.facebook.com/tchibo.de/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q564213",shop:"coffee"},addTags:{brand:"Tchibo","brand:wikidata":"Q564213","brand:wikipedia":"de:Tchibo",name:"Tchibo",shop:"coffee"},countryCodes:["at","ch","cz","de","pl","sk"],terms:[],matchScore:2,suggestion:true},"shop/computer/DNS":{name:"DNS",icon:"fas-laptop",imageURL:"https://graph.facebook.com/dnsshop/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4036922",shop:"computer"},addTags:{alt_name:"ДНС",brand:"DNS","brand:en":"DNS","brand:ru":"ДНС","brand:wikidata":"Q4036922","brand:wikipedia":"ru:DNS (компания)",name:"DNS","name:en":"DNS","name:ru":"ДНС",shop:"computer"},countryCodes:["ru","ua"],terms:[],matchScore:2,suggestion:true},"shop/computer/PC World":{name:"PC World",icon:"fas-laptop",imageURL:"https://graph.facebook.com/curryspcworld/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7118727",shop:"computer"},addTags:{brand:"PC World","brand:wikidata":"Q7118727","brand:wikipedia":"en:PC World (retailer)",name:"PC World",shop:"computer"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/confectionery/Adyar Ananda Bhavan":{name:"Adyar Ananda Bhavan",icon:"maki-confectionery",imageURL:"https://graph.facebook.com/a2b.officialpage/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q15178238",shop:"confectionery"},addTags:{brand:"Adyar Ananda Bhavan","brand:wikidata":"Q15178238","brand:wikipedia":"en:Adyar Ananda Bhavan",name:"Adyar Ananda Bhavan",shop:"confectionery"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"shop/confectionery/Hemmakvall":{name:"Hemmakvall",icon:"maki-confectionery",imageURL:"https://graph.facebook.com/hemmakvall/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10521791",shop:"confectionery"},addTags:{brand:"Hemmakväll","brand:wikidata":"Q10521791","brand:wikipedia":"sv:Hemmakväll",name:"Hemmakväll",shop:"confectionery"},countryCodes:["se"],terms:[],matchScore:2,suggestion:true},"shop/confectionery/Hussel":{name:"Hussel",icon:"maki-confectionery",imageURL:"https://graph.facebook.com/HusselConfiserie/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17123688",shop:"confectionery"},addTags:{brand:"Hussel","brand:wikidata":"Q17123688","brand:wikipedia":"de:Hussel",name:"Hussel",shop:"confectionery"},countryCodes:["at","de"],terms:[],matchScore:2,suggestion:true},"shop/confectionery/Jamin":{name:"Jamin",icon:"maki-confectionery",imageURL:"https://graph.facebook.com/jaminonline/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2291848",shop:"confectionery"},addTags:{brand:"Jamin","brand:wikidata":"Q2291848","brand:wikipedia":"nl:Jamin",name:"Jamin",shop:"confectionery"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/confectionery/Kilwins":{name:"Kilwins",icon:"maki-confectionery",imageURL:"https://graph.facebook.com/KilwinsChocolatesFudgeandIceCream/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q38250832",shop:"confectionery"},addTags:{brand:"Kilwins","brand:wikidata":"Q38250832","brand:wikipedia":"en:Kilwins",cuisine:"chocolate;ice_cream;popcorn",name:"Kilwins",shop:"confectionery"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/confectionery/Rocky Mountain Chocolate Factory":{name:"Rocky Mountain Chocolate Factory",icon:"maki-confectionery",imageURL:"https://graph.facebook.com/myrmcf/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7355878",shop:"confectionery"},addTags:{brand:"Rocky Mountain Chocolate Factory","brand:wikidata":"Q7355878","brand:wikipedia":"en:Rocky Mountain Chocolate Factory",name:"Rocky Mountain Chocolate Factory",shop:"confectionery"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/confectionery/See's Candies":{name:"See's Candies",icon:"maki-confectionery",imageURL:"https://graph.facebook.com/Sees.Candies/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2103510",shop:"confectionery"},addTags:{brand:"See's Candies","brand:wikidata":"Q2103510","brand:wikipedia":"en:See's Candies",name:"See's Candies",shop:"confectionery"},countryCodes:["us"],terms:["sees candy"],matchScore:2,suggestion:true},"shop/confectionery/Thorntons":{name:"Thorntons",icon:"maki-confectionery",imageURL:"https://graph.facebook.com/Thorntons.Official/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q683102",shop:"confectionery"},addTags:{brand:"Thorntons","brand:wikidata":"Q683102","brand:wikipedia":"en:Thorntons",name:"Thorntons",shop:"confectionery"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/confectionery/Вацак":{name:"Вацак",icon:"maki-confectionery",imageURL:"https://graph.facebook.com/Vatsak.KD/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q30966576",shop:"confectionery"},addTags:{brand:"Вацак","brand:wikidata":"Q30966576","brand:wikipedia":"uk:Кондитерський Дім «Вацак»",name:"Вацак",shop:"confectionery"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"shop/confectionery/シャトレーゼ":{name:"シャトレーゼ",icon:"maki-confectionery",imageURL:"https://graph.facebook.com/chateraise.jp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11307696",shop:"confectionery"},addTags:{brand:"シャトレーゼ","brand:en":"Chateraise","brand:ja":"シャトレーゼ","brand:wikidata":"Q11307696","brand:wikipedia":"ja:シャトレーゼ",name:"シャトレーゼ","name:en":"Chateraise","name:ja":"シャトレーゼ",shop:"confectionery"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/convenience/7-Eleven":{name:"7-Eleven",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/7ElevenMexico/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q259340",shop:"convenience"},addTags:{brand:"7-Eleven","brand:wikidata":"Q259340","brand:wikipedia":"en:7-Eleven",name:"7-Eleven",shop:"convenience"},terms:["7-11","seven eleven"],matchScore:2,suggestion:true},"shop/convenience/76":{name:"76",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/76gas/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1658320",shop:"convenience"},addTags:{brand:"76","brand:wikidata":"Q1658320","brand:wikipedia":"en:76 (gas station)",name:"76",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/8 à Huit":{name:"8 à Huit",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/fashion8a8/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2818601",shop:"convenience"},addTags:{brand:"8 à Huit","brand:wikidata":"Q2818601","brand:wikipedia":"fr:8 à Huit",name:"8 à Huit",shop:"convenience"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/convenience/99 Speedmart":{name:"99 Speedmart",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/99speedmart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62075061",shop:"convenience"},addTags:{brand:"99 Speedmart","brand:wikidata":"Q62075061",name:"99 Speedmart",shop:"convenience"},countryCodes:["br","my","us"],terms:[],matchScore:2,suggestion:true},"shop/convenience/ABC (Hawaii)":{name:"ABC (Hawaii)",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/abcstores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4650251",shop:"convenience"},addTags:{brand:"ABC","brand:wikidata":"Q4650251","brand:wikipedia":"en:ABC Stores (Hawaii)",name:"ABC",shop:"convenience"},countryCodes:["us"],terms:["abc stores"],matchScore:2,suggestion:true},"shop/convenience/Aibė":{name:"Aibė",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q1022952",shop:"convenience"},addTags:{brand:"Aibė","brand:wikidata":"Q1022952","brand:wikipedia":"de:Aibė",name:"Aibė",shop:"convenience"},countryCodes:["lt"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Albert Heijn to go":{name:"Albert Heijn to go",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/albertheijn/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1653985",shop:"convenience"},addTags:{brand:"Albert Heijn to go","brand:wikidata":"Q1653985","brand:wikipedia":"en:Albert Heijn",name:"Albert Heijn to go",shop:"convenience"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Alepa":{name:"Alepa",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q4716167",shop:"convenience"},addTags:{brand:"Alepa","brand:wikidata":"Q4716167","brand:wikipedia":"fi:Alepa",name:"Alepa",shop:"convenience"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Alfamart":{name:"Alfamart",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/alfamartku/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q23745600",shop:"convenience"},addTags:{brand:"Alfamart","brand:wikidata":"Q23745600","brand:wikipedia":"id:Alfamart",name:"Alfamart",shop:"convenience"},countryCodes:["id"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Alfamidi":{name:"Alfamidi",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/alfamidiku/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12471462",shop:"convenience"},addTags:{brand:"Alfamidi","brand:wikidata":"Q12471462","brand:wikipedia":"id:Alfamidi",name:"Alfamidi",shop:"convenience"},countryCodes:["id"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Aral":{name:"Aral",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/araldeutschland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q565734",shop:"convenience"},addTags:{brand:"Aral","brand:wikidata":"Q565734","brand:wikipedia":"en:Aral AG",name:"Aral",shop:"convenience"},countryCodes:["de"],terms:["aral tankstelle"],matchScore:2,suggestion:true},"shop/convenience/BP Shop":{name:"BP Shop",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/bp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q152057",shop:"convenience"},addTags:{brand:"BP Shop","brand:wikidata":"Q152057","brand:wikipedia":"en:BP",name:"BP Shop",shop:"convenience"},countryCodes:["au","ch","fr","gb","us"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Best-one":{name:"Best-one",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q4896532",shop:"convenience"},addTags:{brand:"Best-one","brand:wikidata":"Q4896532","brand:wikipedia":"en:Best-one",name:"Best-one",shop:"convenience"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Buc-ee's":{name:"Buc-ee's",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/bucees/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4982335",shop:"convenience"},addTags:{brand:"Buc-ee's","brand:wikidata":"Q4982335","brand:wikipedia":"en:Buc-ee's",name:"Buc-ee's",shop:"convenience"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Budgens":{name:"Budgens",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/DiscoverBudgens/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4985016",shop:"convenience"},addTags:{brand:"Budgens","brand:wikidata":"Q4985016","brand:wikipedia":"en:Budgens",name:"Budgens",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/CBA":{name:"CBA",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/cbaboltok/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q779845",shop:"convenience"},addTags:{brand:"CBA","brand:wikidata":"Q779845","brand:wikipedia":"en:CBA (food retail)",name:"CBA",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/COOP Jednota":{name:"COOP Jednota",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/COOPJednota/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q41629254",shop:"convenience"},addTags:{brand:"COOP Jednota","brand:wikidata":"Q41629254","brand:wikipedia":"sk:COOP Jednota Slovensko",name:"COOP Jednota",shop:"convenience"},countryCodes:["cz","sk"],terms:["jednota"],matchScore:2,suggestion:true},"shop/convenience/Carrefour Express":{name:"Carrefour Express",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/expresshoria/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2940190",shop:"convenience"},addTags:{brand:"Carrefour Express","brand:wikidata":"Q2940190","brand:wikipedia":"fr:Carrefour Express",name:"Carrefour Express",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Casey's General Store":{name:"Casey's General Store",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/caseys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2940968",shop:"convenience"},addTags:{brand:"Casey's General Store","brand:wikidata":"Q2940968","brand:wikipedia":"en:Casey's General Stores",name:"Casey's General Store",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Centra":{name:"Centra",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/CentraIreland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q747678",shop:"convenience"},addTags:{brand:"Centra","brand:wikidata":"Q747678","brand:wikipedia":"en:Centra",name:"Centra",shop:"convenience"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Chata Polska":{name:"Chata Polska",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/chatapolskasklepy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61994406",shop:"convenience"},addTags:{brand:"Chata Polska","brand:wikidata":"Q61994406",name:"Chata Polska",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Cheers":{name:"Cheers",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q64154066",shop:"convenience"},addTags:{brand:"Cheers","brand:wikidata":"Q64154066",name:"Cheers",opening_hours:"24/7",shop:"convenience"},countryCodes:["sg","vn"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Chevron":{name:"Chevron",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/Chevron/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q319642",shop:"convenience"},addTags:{brand:"Chevron","brand:wikidata":"Q319642","brand:wikipedia":"en:Chevron Corporation",name:"Chevron",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Circle K":{name:"Circle K",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/circlekireland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3268010",shop:"convenience"},addTags:{brand:"Circle K","brand:wikidata":"Q3268010","brand:wikipedia":"en:Circle K",name:"Circle K",shop:"convenience"},terms:["ok","ok-mart"],matchScore:2,suggestion:true},"shop/convenience/Citgo":{name:"Citgo",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/CITGOPetroleumCorporation/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2974437",shop:"convenience"},addTags:{brand:"Citgo","brand:wikidata":"Q2974437","brand:wikipedia":"en:Citgo",name:"Citgo",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Co-op (Canada)":{name:"Co-op (Canada)",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/CoopCRS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5440676",shop:"convenience"},addTags:{brand:"Federated Co-operatives","brand:wikidata":"Q5440676","brand:wikipedia":"en:Federated Co-operatives",name:"Co-op",shop:"convenience"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Coles Express":{name:"Coles Express",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/ColesExpress/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5144653",shop:"convenience"},addTags:{brand:"Coles Express","brand:wikidata":"Q5144653","brand:wikipedia":"en:Coles Express",name:"Coles Express",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Coop Pronto":{name:"Coop Pronto",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/209094172456220/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1129777",shop:"convenience"},addTags:{brand:"Coop Pronto","brand:wikidata":"Q1129777","brand:wikipedia":"de:Coop Mineraloel",name:"Coop Pronto",shop:"convenience"},countryCodes:["ch","li"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Coop (Schweiz)":{name:"Coop (Schweiz)",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/coop.ch/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q432564",shop:"convenience"},addTags:{brand:"Coop","brand:wikidata":"Q432564","brand:wikipedia":"de:Coop (Schweiz)",name:"Coop",shop:"convenience"},countryCodes:["ch"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Costcutter":{name:"Costcutter",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/costcutter/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5175072",shop:"convenience"},addTags:{brand:"Costcutter","brand:wikidata":"Q5175072","brand:wikipedia":"en:Costcutter",name:"Costcutter",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Couche-Tard":{name:"Couche-Tard",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/CoucheTardQc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2836957",shop:"convenience"},addTags:{brand:"Couche-Tard","brand:wikidata":"Q2836957","brand:wikipedia":"en:Alimentation Couche-Tard",name:"Couche-Tard",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Cumberland Farms":{name:"Cumberland Farms",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/CumberlandFarms/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1143685",shop:"convenience"},addTags:{brand:"Cumberland Farms","brand:wikidata":"Q1143685","brand:wikipedia":"en:Cumberland Farms",name:"Cumberland Farms",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Daisy Mart":{name:"Daisy Mart",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/DaisyMart.Kamel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61994934",shop:"convenience"},addTags:{brand:"Daisy Mart","brand:wikidata":"Q61994934",name:"Daisy Mart",shop:"convenience"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Delikatesy Centrum":{name:"Delikatesy Centrum",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/Delikatesypl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11693824",shop:"convenience"},addTags:{brand:"Delikatesy Centrum","brand:wikidata":"Q11693824","brand:wikipedia":"pl:Delikatesy Centrum",name:"Delikatesy Centrum",shop:"convenience"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/convenience/ExtraMile":{name:"ExtraMile",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/ExtraMileExtras/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64224605",shop:"convenience"},addTags:{brand:"ExtraMile","brand:wikidata":"Q64224605",name:"ExtraMile",shop:"convenience"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/convenience/FamilyMart":{name:"FamilyMart",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/familymart.japan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1191685",shop:"convenience"},addTags:{brand:"FamilyMart","brand:wikidata":"Q1191685","brand:wikipedia":"en:FamilyMart",name:"FamilyMart",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Four Square":{name:"Four Square",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/FourSquareNZ/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5475558",shop:"convenience"},addTags:{brand:"Four Square","brand:wikidata":"Q5475558","brand:wikipedia":"en:Four Square (supermarket)",name:"Four Square",shop:"convenience"},countryCodes:["nz"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Franprix":{name:"Franprix",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/franprix/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2420096",shop:"convenience"},addTags:{brand:"Franprix","brand:wikidata":"Q2420096","brand:wikipedia":"fr:Franprix",name:"Franprix",shop:"convenience"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Freshmarket":{name:"Freshmarket",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/sklepyfreshmarket/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16546326",shop:"convenience"},addTags:{brand:"Freshmarket","brand:wikidata":"Q16546326","brand:wikipedia":"pl:Freshmarket",name:"Freshmarket",shop:"convenience"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/convenience/GS25":{name:"GS25",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/funGS25/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q624041",shop:"convenience"},addTags:{brand:"GS25","brand:wikidata":"Q624041","brand:wikipedia":"ko:GS25",name:"GS25",shop:"convenience"},countryCodes:["kr"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Groszek":{name:"Groszek",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/Sklepy.Groszek/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q9280965",shop:"convenience"},addTags:{brand:"Groszek","brand:wikidata":"Q9280965","brand:wikipedia":"pl:Groszek (sieć sklepów)",name:"Groszek",shop:"convenience"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Hasty Market":{name:"Hasty Market",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/607684929288087/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q58022603",shop:"convenience"},addTags:{brand:"Hasty Market","brand:wikidata":"Q58022603",name:"Hasty Market",shop:"convenience"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Hudson":{name:"Hudson",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q5928787",shop:"convenience"},addTags:{brand:"Hudson","brand:wikidata":"Q5928787","brand:wikipedia":"en:Hudson Group",name:"Hudson",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Husky":{name:"Husky",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/huskyenergy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q702049",shop:"convenience"},addTags:{brand:"Husky","brand:wikidata":"Q702049","brand:wikipedia":"en:Husky Energy",name:"Husky",shop:"convenience"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Indomaret":{name:"Indomaret",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/IndomaretMudahdanHemat/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4262825",shop:"convenience"},addTags:{brand:"Indomaret","brand:wikidata":"Q4262825","brand:wikipedia":"en:Indomaret",name:"Indomaret",shop:"convenience"},countryCodes:["id"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Intermarché Contact":{name:"Intermarché Contact",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/tousuniscontrelaviechere/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3153200",shop:"convenience"},addTags:{brand:"Intermarché Contact","brand:wikidata":"Q3153200","brand:wikipedia":"fr:Intermarché",name:"Intermarché Contact",shop:"convenience"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Jacksons":{name:"Jacksons",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/JacksonsFoodStores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64617393",shop:"convenience"},addTags:{brand:"Jacksons","brand:wikidata":"Q64617393",name:"Jacksons",shop:"convenience"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Joker":{name:"Joker",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/JokerNorge/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q716328",shop:"convenience"},addTags:{brand:"Joker","brand:wikidata":"Q716328","brand:wikipedia":"en:Joker (store)",name:"Joker",shop:"convenience"},countryCodes:["no"],terms:[],matchScore:2,suggestion:true},"shop/convenience/K-Market":{name:"K-Market",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/KMarketSuomi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11868562",shop:"convenience"},addTags:{brand:"K-Market","brand:wikidata":"Q11868562","brand:wikipedia":"fi:K-Market",name:"K-Market",shop:"convenience"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Kangaroo Express":{name:"Kangaroo Express",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/KangarooExpress/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61747408",shop:"convenience"},addTags:{brand:"Kangaroo Express","brand:wikidata":"Q61747408",name:"Kangaroo Express",shop:"convenience",short_name:"Kangaroo"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Konzum (Balkans)":{name:"Konzum (Balkans)",icon:"fas-shopping-basket",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FKonzum%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q518563",shop:"convenience"},addTags:{brand:"Konzum","brand:wikidata":"Q518563","brand:wikipedia":"hr:Konzum",name:"Konzum",shop:"convenience"},countryCodes:["ba","hr","rs"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Kum & Go":{name:"Kum & Go",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/kumandgo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6443340",shop:"convenience"},addTags:{brand:"Kum & Go","brand:wikidata":"Q6443340","brand:wikipedia":"en:Kum & Go",name:"Kum & Go",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Kwik Shop":{name:"Kwik Shop",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/kwikshopstores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6450417",shop:"convenience"},addTags:{brand:"Kwik Shop","brand:wikidata":"Q6450417","brand:wikipedia":"en:Kwik Shop",name:"Kwik Shop",shop:"convenience"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Kwik Trip":{name:"Kwik Trip",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/KwikTrip/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6450420",shop:"convenience"},addTags:{brand:"Kwik Trip","brand:wikidata":"Q6450420","brand:wikipedia":"en:Kwik Trip",name:"Kwik Trip",shop:"convenience"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Lawson":{name:"Lawson",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/lawson.fanpage/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1557223",shop:"convenience"},addTags:{brand:"Lawson","brand:wikidata":"Q1557223","brand:wikipedia":"en:Lawson (store)",name:"Lawson",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Lewiatan":{name:"Lewiatan",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/psh.lewiatan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11755396",shop:"convenience"},addTags:{brand:"Lewiatan","brand:wikidata":"Q11755396","brand:wikipedia":"pl:Lewiatan (sieć handlowa)",name:"Lewiatan",shop:"convenience"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Lifestyle Express":{name:"Lifestyle Express",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q61994869",shop:"convenience"},addTags:{brand:"Lifestyle Express","brand:wikidata":"Q61994869",name:"Lifestyle Express",shop:"convenience"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Loaf 'N Jug":{name:"Loaf 'N Jug",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/loafnjugstores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6663398",shop:"convenience"},addTags:{brand:"Loaf 'N Jug","brand:wikidata":"Q6663398","brand:wikipedia":"en:Loaf 'N Jug",name:"Loaf 'N Jug",shop:"convenience"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Mace":{name:"Mace",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/maces.stores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17089386",shop:"convenience"},addTags:{brand:"Mace","brand:wikidata":"Q17089386","brand:wikipedia":"en:Mace (shop)",name:"Mace",shop:"convenience"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Marathon":{name:"Marathon",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/MarathonPetroleumCorporation/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q458363",shop:"convenience"},addTags:{brand:"Marathon","brand:wikidata":"Q458363","brand:wikipedia":"en:Marathon Petroleum",name:"Marathon",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Małpka Express":{name:"Małpka Express",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/malpkaexpress/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q18431946",shop:"convenience"},addTags:{brand:"Małpka Express","brand:wikidata":"Q18431946","brand:wikipedia":"pl:Małpka Express",name:"Małpka Express",shop:"convenience"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/convenience/McColl's":{name:"McColl's",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/YourMcColls/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16997477",shop:"convenience"},addTags:{brand:"McColl's","brand:wikidata":"Q16997477","brand:wikipedia":"en:McColl's",name:"McColl's",shop:"convenience"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Migrolino":{name:"Migrolino",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/migrolino/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q56745088",shop:"convenience"},addTags:{brand:"Migrolino","brand:wikidata":"Q56745088","brand:wikipedia":"de:Migrolino",name:"Migrolino",shop:"convenience"},countryCodes:["ch"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Ministop":{name:"Ministop",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/374173965530/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1038929",shop:"convenience"},addTags:{brand:"Ministop","brand:wikidata":"Q1038929","brand:wikipedia":"en:Ministop",name:"Ministop",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Minit Mart":{name:"Minit Mart",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/MinitMartOfficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q18154470",shop:"convenience"},addTags:{brand:"Minit Mart","brand:wikidata":"Q18154470","brand:wikipedia":"en:Minit Mart Foods Inc.",name:"Minit Mart",shop:"convenience"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Mobil Mart":{name:"Mobil Mart",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/ExxonandMobilStations/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3088656",shop:"convenience"},addTags:{brand:"Mobil Mart","brand:wikidata":"Q3088656","brand:wikipedia":"en:Mobil",name:"Mobil Mart",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Nasz Sklep":{name:"Nasz Sklep",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q62070369",shop:"convenience"},addTags:{brand:"Nasz Sklep","brand:wikidata":"Q62070369",name:"Nasz Sklep",shop:"convenience"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Neste K":{name:"Neste K",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q42901270",shop:"convenience"},addTags:{brand:"Neste K","brand:wikidata":"Q42901270","brand:wikipedia":"fi:Neste K",name:"Neste K",shop:"convenience"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"shop/convenience/NewDays":{name:"NewDays",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q11234763",shop:"convenience"},addTags:{alt_name:"ニューデイズ",brand:"NewDays","brand:wikidata":"Q11234763","brand:wikipedia":"ja:NewDays",name:"NewDays",shop:"convenience"},countryCodes:["jp"],terms:["newdays ミニ"],matchScore:2,suggestion:true},"shop/convenience/Nisa":{name:"Nisa",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/nisalocally/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16999069",shop:"convenience"},addTags:{brand:"Nisa","brand:wikidata":"Q16999069","brand:wikipedia":"en:Nisa (retailer)",name:"Nisa",shop:"convenience"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Nisa Local":{name:"Nisa Local",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/nisalocally/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16999069",shop:"convenience"},addTags:{brand:"Nisa Local","brand:wikidata":"Q16999069","brand:wikipedia":"en:Nisa (retailer)",name:"Nisa Local",shop:"convenience"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/convenience/OK便利商店":{name:"OK便利商店",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/circlekireland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3268010",shop:"convenience"},addTags:{brand:"OK便利商店","brand:en":"Circle K","brand:wikidata":"Q3268010","brand:wikipedia":"zh:OK便利店",name:"OK便利商店","name:en":"Circle K",shop:"convenience"},countryCodes:["cn","tw"],terms:["ok便利店 circle k"],matchScore:2,suggestion:true},"shop/convenience/On the Run":{name:"On the Run",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/OntheRunUS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16931259",shop:"convenience"},addTags:{brand:"On the Run","brand:wikidata":"Q16931259","brand:wikipedia":"en:On the Run (convenience store)",name:"On the Run",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Oxxo":{name:"Oxxo",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/OXXOTiendas/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1342538",shop:"convenience"},addTags:{brand:"Oxxo","brand:wikidata":"Q1342538","brand:wikipedia":"es:Oxxo",name:"Oxxo",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Petro-Canada":{name:"Petro-Canada",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/petrocanada/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1208279",shop:"convenience"},addTags:{brand:"Petro-Canada","brand:wikidata":"Q1208279","brand:wikipedia":"en:Petro-Canada",name:"Petro-Canada",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Plaid Pantry":{name:"Plaid Pantry",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/plaidpantryOfficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7200591",shop:"convenience"},addTags:{brand:"Plaid Pantry","brand:wikidata":"Q7200591","brand:wikipedia":"en:Plaid Pantry",name:"Plaid Pantry",shop:"convenience"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Premier":{name:"Premier",icon:"fas-shopping-basket",imageURL:"https://pbs.twimg.com/profile_images/552086468839997441/Ok2vWsQl_bigger.jpeg",geometry:["point","area"],tags:{"brand:wikidata":"Q7240340",shop:"convenience"},addTags:{brand:"Premier","brand:wikidata":"Q7240340","brand:wikipedia":"en:Premier Stores",name:"Premier",shop:"convenience"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Proxi":{name:"Proxi",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q3408522",shop:"convenience"},addTags:{brand:"Proxi","brand:wikidata":"Q3408522","brand:wikipedia":"fr:Proxi",name:"Proxi",shop:"convenience"},countryCodes:["ch","fr"],terms:[],matchScore:2,suggestion:true},"shop/convenience/RaceTrac":{name:"RaceTrac",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/RaceTrac/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q735942",shop:"convenience"},addTags:{brand:"RaceTrac","brand:wikidata":"Q735942","brand:wikipedia":"en:RaceTrac",name:"RaceTrac",shop:"convenience"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Sainsbury's Local":{name:"Sainsbury's Local",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/sainsburys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q13218434",shop:"convenience"},addTags:{brand:"Sainsbury's Local","brand:wikidata":"Q13218434","brand:wikipedia":"en:Sainsbury's Local",name:"Sainsbury's Local",shop:"convenience"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Sale":{name:"Sale",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q11892046",shop:"convenience"},addTags:{brand:"Sale","brand:wikidata":"Q11892046","brand:wikipedia":"fi:Sale",name:"Sale",shop:"convenience"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Sheetz":{name:"Sheetz",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/sheetz/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7492551",shop:"convenience"},addTags:{brand:"Sheetz","brand:wikidata":"Q7492551","brand:wikipedia":"en:Sheetz",name:"Sheetz",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Shell":{name:"Shell",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/Shell/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q154950",shop:"convenience"},addTags:{brand:"Shell","brand:wikidata":"Q154950","brand:wikipedia":"en:Royal Dutch Shell",name:"Shell",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Shell Select":{name:"Shell Select",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/Shell/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q154950",shop:"convenience"},addTags:{brand:"Shell Select","brand:wikidata":"Q154950","brand:wikipedia":"en:Royal Dutch Shell",name:"Shell Select",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Siwa":{name:"Siwa",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q11893827",shop:"convenience"},addTags:{brand:"Siwa","brand:wikidata":"Q11893827","brand:wikipedia":"fi:Siwa",name:"Siwa",shop:"convenience"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Spar":{name:"Spar",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/SPARintheUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q610492",shop:"convenience"},addTags:{brand:"Spar","brand:wikidata":"Q610492","brand:wikipedia":"en:Spar (retailer)",name:"Spar",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Spar Express":{name:"Spar Express",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/SPARintheUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q610492",shop:"convenience"},addTags:{brand:"Spar","brand:wikidata":"Q610492","brand:wikipedia":"en:Spar (retailer)",name:"Spar Express",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Speedway":{name:"Speedway",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/SpeedwayStores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7575683",shop:"convenience"},addTags:{brand:"Speedway","brand:wikidata":"Q7575683","brand:wikipedia":"en:Speedway LLC",name:"Speedway",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Społem":{name:"Społem",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/SpolemSpoldzielczoscSpozywcow/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11826043",shop:"convenience"},addTags:{brand:"Społem","brand:wikidata":"Q11826043","brand:wikipedia":"pl:Powszechna Spółdzielnia Spożywców „Społem”",name:"Społem",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Star Mart":{name:"Star Mart",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q61994857",shop:"convenience"},addTags:{brand:"Star Mart","brand:wikidata":"Q61994857",name:"Star Mart",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Stripes":{name:"Stripes",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/stripesstores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7624135",shop:"convenience"},addTags:{brand:"Stripes","brand:wikidata":"Q7624135","brand:wikipedia":"en:Stripes Convenience Stores",name:"Stripes",shop:"convenience"},countryCodes:["cl","us"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Tesco":{name:"Tesco",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/tesco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q487494",shop:"convenience"},addTags:{brand:"Tesco","brand:wikidata":"Q487494","brand:wikipedia":"en:Tesco",name:"Tesco",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Tesco Express":{name:"Tesco Express",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/tesco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q487494",shop:"convenience"},addTags:{brand:"Tesco Express","brand:wikidata":"Q487494","brand:wikipedia":"en:Tesco",name:"Tesco Express",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/The Co-operative Food (UK)":{name:"The Co-operative Food (UK)",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/coopukfood/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3277439",shop:"convenience"},addTags:{brand:"The Co-operative Food","brand:wikidata":"Q3277439","brand:wikipedia":"en:Co-op Food",name:"The Co-operative Food",shop:"convenience"},countryCodes:["gb"],terms:["coop","coop food","cooperative food","the cooperative"],matchScore:2,suggestion:true},"shop/convenience/Tiger Mart":{name:"Tiger Mart",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q57643977",shop:"convenience"},addTags:{brand:"Tiger Mart","brand:wikidata":"Q57643977",name:"Tiger Mart",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/United Dairy Farmers":{name:"United Dairy Farmers",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/UnitedDairyFarmers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7887677",shop:"convenience"},addTags:{amenity:"ice_cream",brand:"United Dairy Farmers","brand:wikidata":"Q7887677","brand:wikipedia":"en:United Dairy Farmers",name:"United Dairy Farmers",shop:"convenience",short_name:"UDF"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Utile":{name:"Utile",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/ULesCommercants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2529029",shop:"convenience"},addTags:{brand:"Utile","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Utile",shop:"convenience"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/convenience/VinMart+":{name:"VinMart+",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/sieuthivinmart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q60245505",shop:"convenience"},addTags:{brand:"VinMart","brand:wikidata":"Q60245505","brand:wikipedia":"vi:VinMart",name:"VinMart+",shop:"convenience"},countryCodes:["vn"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Vival":{name:"Vival",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q7937525",shop:"convenience"},addTags:{brand:"Vival","brand:wikidata":"Q7937525","brand:wikipedia":"en:Vival (shop)",name:"Vival",shop:"convenience"},countryCodes:["fr","pe"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Wawa":{name:"Wawa",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/wawa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5936320",shop:"convenience"},addTags:{brand:"Wawa","brand:wikidata":"Q5936320","brand:wikipedia":"en:Wawa (company)",name:"Wawa",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Weltladen":{name:"Weltladen",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q1640782",shop:"convenience"},addTags:{brand:"Weltladen","brand:wikidata":"Q1640782","brand:wikipedia":"de:Weltladen",name:"Weltladen",shop:"convenience"},countryCodes:["at","ch","de"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Woolworths Petrol":{name:"Woolworths Petrol",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/woolworths/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5023980",shop:"convenience"},addTags:{brand:"Caltex","brand:wikidata":"Q5023980","brand:wikipedia":"en:Caltex Woolworths",name:"Woolworths Petrol",shop:"convenience"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"shop/convenience/abc (Poland)":{name:"abc (Poland)",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q11683985",shop:"convenience"},addTags:{brand:"abc","brand:wikidata":"Q11683985","brand:wikipedia":"pl:Abc (sieć handlowa)",name:"abc",shop:"convenience"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/convenience/ampm":{name:"ampm",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/ampm/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q306960",shop:"convenience"},addTags:{brand:"ampm","brand:wikidata":"Q306960","brand:wikipedia":"en:Ampm",name:"ampm",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/miniピアゴ":{name:"miniピアゴ",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q11188499",shop:"convenience"},addTags:{brand:"miniピアゴ","brand:en":"mini Piago","brand:ja":"miniピアゴ","brand:wikidata":"Q11188499","brand:wikipedia":"ja:Miniピアゴ",name:"miniピアゴ","name:en":"mini Piago","name:ja":"miniピアゴ",shop:"convenience"},countryCodes:["jp"],terms:["ミニピアゴ"],matchScore:2,suggestion:true},"shop/convenience/Żabka":{name:"Żabka",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/zabkapolska/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2589061",shop:"convenience"},addTags:{brand:"Żabka","brand:wikidata":"Q2589061","brand:wikipedia":"pl:Żabka (sieć sklepów)",name:"Żabka",shop:"convenience"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/convenience/ВкусВилл":{name:"ВкусВилл",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/vkusvill.ru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q57271676",shop:"convenience"},addTags:{brand:"ВкусВилл","brand:wikidata":"Q57271676","brand:wikipedia":"ru:Вкусвилл",name:"ВкусВилл",shop:"convenience"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Гроздь":{name:"Гроздь",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/grozdmag/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q21638412",shop:"convenience"},addTags:{brand:"Гроздь","brand:wikidata":"Q21638412","brand:wikipedia":"ru:Гроздь (сеть магазинов)",name:"Гроздь",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Доброном":{name:"Доброном",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/Eurooptby/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2565040",shop:"convenience"},addTags:{brand:"Доброном","brand:wikidata":"Q2565040","brand:wikipedia":"be:Eurotorg",name:"Доброном",shop:"convenience"},countryCodes:["by","ru"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Копейка":{name:"Копейка",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q1783878",shop:"convenience"},addTags:{brand:"Копейка","brand:en":"Kopeyka","brand:wikidata":"Q1783878","brand:wikipedia":"en:Kopeyka (supermarket)",name:"Копейка","name:en":"Kopeyka",shop:"convenience"},countryCodes:["by","ru","ua"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Магнит":{name:"Магнит",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/magnitretail/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q940518",shop:"convenience"},addTags:{brand:"Магнит","brand:en":"Magnit","brand:wikidata":"Q940518","brand:wikipedia":"ru:Магнит (сеть магазинов)",name:"Магнит","name:en":"Magnit",shop:"convenience"},terms:["магнит у дома"],matchScore:2,suggestion:true},"shop/convenience/Мария-Ра":{name:"Мария-Ра",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/mariarashop/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4281631",shop:"convenience"},addTags:{brand:"Мария-Ра","brand:wikidata":"Q4281631","brand:wikipedia":"ru:Мария-Ра",name:"Мария-Ра",shop:"convenience"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Сельпо":{name:"Сельпо",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/silpo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4419434",shop:"convenience"},addTags:{brand:"Сельпо","brand:wikidata":"Q4419434","brand:wikipedia":"ru:Сильпо",name:"Сельпо",shop:"convenience"},countryCodes:["kz","ru"],terms:[],matchScore:2,suggestion:true},"shop/convenience/アンスリー":{name:"アンスリー",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q17192555",shop:"convenience"},addTags:{brand:"アンスリー","brand:en":"Ansuri","brand:ja":"アンスリー","brand:wikidata":"Q17192555","brand:wikipedia":"ja:アンスリー",name:"アンスリー","name:en":"Ansuri","name:ja":"アンスリー",shop:"convenience"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/convenience/サンクス":{name:"サンクス",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q16141064",shop:"convenience"},addTags:{brand:"サンクス","brand:en":"Sunkus","brand:ja":"サンクス","brand:wikidata":"Q16141064","brand:wikipedia":"ja:サークルKサンクス",name:"サンクス","name:en":"Sunkus","name:ja":"サンクス",shop:"convenience"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/convenience/サークルK":{name:"サークルK",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/circlekireland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3268010",shop:"convenience"},addTags:{brand:"サークルK","brand:en":"Circle K","brand:ja":"サークルK","brand:wikidata":"Q3268010","brand:wikipedia":"en:Circle K",name:"サークルK","name:en":"Circle K","name:ja":"サークルK",shop:"convenience"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/convenience/スリーエフ":{name:"スリーエフ",icon:"fas-shopping-basket",imageURL:"https://pbs.twimg.com/profile_images/875645560073539585/X1oFVQef_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q11313419",shop:"convenience"},addTags:{brand:"スリーエフ","brand:en":"Three F","brand:ja":"スリーエフ","brand:wikidata":"Q11313419","brand:wikipedia":"ja:スリーエフ",name:"スリーエフ","name:en":"Three F","name:ja":"スリーエフ",shop:"convenience"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/convenience/セイコーマート":{name:"セイコーマート",icon:"fas-shopping-basket",imageURL:"https://pbs.twimg.com/profile_images/1019751731402379264/OudcSFFt_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q11314123",shop:"convenience"},addTags:{brand:"セイコーマート","brand:en":"Seicomart","brand:ja":"セイコーマート","brand:wikidata":"Q11314123","brand:wikipedia":"ja:セイコーマート",name:"セイコーマート","name:en":"Seicomart","name:ja":"セイコーマート",shop:"convenience"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/convenience/セブン-イレブン":{name:"セブン-イレブン",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/7ElevenMexico/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q259340",shop:"convenience"},addTags:{brand:"セブン-イレブン","brand:en":"7-Eleven","brand:ja":"セブン-イレブン","brand:wikidata":"Q259340","brand:wikipedia":"en:7-Eleven",name:"セブン-イレブン","name:en":"7-Eleven","name:ja":"セブン-イレブン","official_name:en":"Seven-Eleven",shop:"convenience"},countryCodes:["jp"],terms:["セブンイレブン(7-11)","セブンイレブン(seven-eleven)"],matchScore:2,suggestion:true},"shop/convenience/セーブオン":{name:"セーブオン",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q11314868",shop:"convenience"},addTags:{brand:"セーブオン","brand:en":"Save On","brand:ja":"セーブオン","brand:wikidata":"Q11314868","brand:wikipedia":"ja:セーブオン",name:"セーブオン","name:en":"Save On","name:ja":"セーブオン",shop:"convenience"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/convenience/デイリーヤマザキ":{name:"デイリーヤマザキ",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q5209392",shop:"convenience"},addTags:{brand:"デイリーヤマザキ","brand:en":"Daily Yamazaki","brand:ja":"デイリーヤマザキ","brand:wikidata":"Q5209392","brand:wikipedia":"en:Daily Yamazaki",name:"デイリーヤマザキ","name:en":"Daily Yamazaki","name:ja":"デイリーヤマザキ",shop:"convenience"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/convenience/ナチュラルローソン":{name:"ナチュラルローソン",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q11323850",shop:"convenience"},addTags:{brand:"ナチュラルローソン","brand:en":"NATURAL LAWSON","brand:ja":"ナチュラルローソン","brand:wikidata":"Q11323850","brand:wikipedia":"ja:ナチュラルローソン",name:"ナチュラルローソン","name:en":"Natural Lawson","name:ja":"ナチュラルローソン",shop:"convenience"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/convenience/ファミリーマート":{name:"ファミリーマート",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/familymart.japan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1191685",shop:"convenience"},addTags:{brand:"ファミリーマート","brand:en":"FamilyMart","brand:ja":"ファミリーマート","brand:wikidata":"Q1191685","brand:wikipedia":"en:FamilyMart",name:"ファミリーマート","name:en":"FamilyMart","name:ja":"ファミリーマート",shop:"convenience"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/convenience/ポプラ":{name:"ポプラ",icon:"fas-shopping-basket",imageURL:"https://pbs.twimg.com/profile_images/826586791058644992/chXkmxnQ_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q7229380",shop:"convenience"},addTags:{brand:"ポプラ","brand:en":"Poplar","brand:ja":"ポプラ","brand:wikidata":"Q7229380","brand:wikipedia":"ja:ポプラ (コンビニエンスストア)",name:"ポプラ","name:en":"Poplar","name:ja":"ポプラ",shop:"convenience"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/convenience/ミニストップ":{name:"ミニストップ",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/374173965530/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1038929",shop:"convenience"},addTags:{brand:"ミニストップ","brand:en":"Ministop","brand:ja":"ミニストップ","brand:wikidata":"Q1038929","brand:wikipedia":"ja:ミニストップ",name:"ミニストップ","name:en":"Ministop","name:ja":"ミニストップ",shop:"convenience"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/convenience/ヤマザキショップ":{name:"ヤマザキショップ",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q11345131",shop:"convenience"},addTags:{brand:"ヤマザキショップ","brand:ja":"ヤマザキショップ","brand:wikidata":"Q11345131","brand:wikipedia":"ja:ヤマザキショップ",name:"ヤマザキショップ","name:en":"Yamazaki Shop","name:ja":"ヤマザキショップ",shop:"convenience"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/convenience/ローソン":{name:"ローソン",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/lawson.fanpage/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1557223",shop:"convenience"},addTags:{brand:"ローソン","brand:en":"LAWSON","brand:ja":"ローソン","brand:wikidata":"Q1557223","brand:wikipedia":"ja:ローソン",name:"ローソン","name:en":"Lawson","name:ja":"ローソン",shop:"convenience"},countryCodes:["jp"],terms:["ローソン"],matchScore:2,suggestion:true},"shop/convenience/ローソンストア100":{name:"ローソンストア100",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q11350960",shop:"convenience"},addTags:{brand:"ローソンストア100","brand:en":"LAWSON STORE 100","brand:ja":"ローソンストア100","brand:wikidata":"Q11350960","brand:wikipedia":"ja:ローソンストア100",name:"ローソンストア100","name:en":"Lawson Store 100","name:ja":"ローソンストア100",shop:"convenience"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/convenience/ローソン・スリーエフ":{name:"ローソン・スリーエフ",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q24866804",shop:"convenience"},addTags:{brand:"ローソン・スリーエフ","brand:en":"LAWSON・Three F","brand:ja":"ローソン・スリーエフ","brand:wikidata":"Q24866804","brand:wikipedia":"ja:ローソン・スリーエフ",name:"ローソン・スリーエフ","name:en":"Lawson・Three F","name:ja":"ローソン・スリーエフ",shop:"convenience"},countryCodes:["jp"],terms:["lawson+スリーエフ","ローソン・スリーエフ"],matchScore:2,suggestion:true},"shop/convenience/全家":{name:"全家",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/familymart.japan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1191685",shop:"convenience"},addTags:{brand:"全家","brand:en":"FamilyMart","brand:wikidata":"Q1191685","brand:wikipedia":"en:FamilyMart",name:"全家","name:en":"FamilyMart",shop:"convenience"},countryCodes:["cn","tw"],terms:[],matchScore:2,suggestion:true},"shop/convenience/全家便利商店":{name:"全家便利商店",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q10891564",shop:"convenience"},addTags:{brand:"全家便利商店","brand:wikidata":"Q10891564","brand:wikipedia":"zh:全家便利商店",name:"全家便利商店",shop:"convenience"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"shop/convenience/萊爾富":{name:"萊爾富",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q11326216",shop:"convenience"},addTags:{brand:"萊爾富","brand:wikidata":"Q11326216","brand:wikipedia":"zh:萊爾富",name:"萊爾富",shop:"convenience"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"shop/convenience/세븐일레븐":{name:"세븐일레븐",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/7ElevenMexico/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q259340",shop:"convenience"},addTags:{brand:"세븐일레븐","brand:en":"7-Eleven","brand:ko":"세븐일레븐","brand:wikidata":"Q259340","brand:wikipedia":"en:7-Eleven",name:"세븐일레븐","name:en":"7-Eleven","name:ko":"세븐일레븐",shop:"convenience"},countryCodes:["kr"],terms:[],matchScore:2,suggestion:true},"shop/copyshop/FedEx Office":{name:"FedEx Office",icon:"fas-print",imageURL:"https://graph.facebook.com/FedExOffice/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q474379",shop:"copyshop"},addTags:{brand:"FedEx Office","brand:wikidata":"Q474379","brand:wikipedia":"en:FedEx Office",name:"FedEx Office",shop:"copyshop"},countryCodes:["us"],terms:["fedex office print and ship center"],matchScore:2,suggestion:true},"shop/copyshop/Minuteman Press":{name:"Minuteman Press",icon:"fas-print",imageURL:"https://graph.facebook.com/MinutemanPressFranchise/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64866081",shop:"copyshop"},addTags:{brand:"Minuteman Press","brand:wikidata":"Q64866081",name:"Minuteman Press",shop:"copyshop"},terms:[],matchScore:2,suggestion:true},"shop/copyshop/Sir Speedy":{name:"Sir Speedy",icon:"fas-print",imageURL:"https://graph.facebook.com/SirSpeedyCorporate/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17088225",shop:"copyshop"},addTags:{brand:"Sir Speedy","brand:wikidata":"Q17088225","brand:wikipedia":"en:Sir Speedy",name:"Sir Speedy",shop:"copyshop"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/cosmetics/Aveda":{name:"Aveda",icon:"maki-shop",imageURL:"https://graph.facebook.com/Aveda/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4827965",shop:"cosmetics"},addTags:{brand:"Aveda","brand:wikidata":"Q4827965","brand:wikipedia":"en:Aveda",name:"Aveda",shop:"cosmetics"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/cosmetics/Bath & Body Works":{name:"Bath & Body Works",icon:"maki-shop",imageURL:"https://graph.facebook.com/bathandbodyworks/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q810773",shop:"cosmetics"},addTags:{brand:"Bath & Body Works","brand:wikidata":"Q810773","brand:wikipedia":"en:Bath & Body Works",name:"Bath & Body Works",shop:"cosmetics"},terms:[],matchScore:2,suggestion:true},"shop/cosmetics/KIKO Milano":{name:"KIKO Milano",icon:"maki-shop",imageURL:"https://graph.facebook.com/KikoMilanoGlobal/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3812045",shop:"cosmetics"},addTags:{brand:"KIKO Milano","brand:wikidata":"Q3812045","brand:wikipedia":"it:KIKO",name:"KIKO Milano",shop:"cosmetics"},countryCodes:["be","fr","gb","nl"],terms:["kiko"],matchScore:2,suggestion:true},"shop/cosmetics/Kiehl's":{name:"Kiehl's",icon:"maki-shop",imageURL:"https://graph.facebook.com/KiehlsUS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3196447",shop:"cosmetics"},addTags:{brand:"Kiehl's","brand:wikidata":"Q3196447","brand:wikipedia":"en:Kiehl's",name:"Kiehl's",shop:"cosmetics"},countryCodes:["ca","us"],terms:["kiehl's since 1851"],matchScore:2,suggestion:true},"shop/cosmetics/L'Occitane":{name:"L'Occitane",icon:"maki-shop",imageURL:"https://graph.facebook.com/loccitaneusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1880676",shop:"cosmetics"},addTags:{brand:"L'Occitane","brand:wikidata":"Q1880676","brand:wikipedia":"en:L'Occitane en Provence",name:"L'Occitane",shop:"cosmetics"},terms:["l'occitane en provence"],matchScore:2,suggestion:true},"shop/cosmetics/Lush":{name:"Lush",icon:"maki-shop",imageURL:"https://graph.facebook.com/LUSHJAPAN/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1585448",shop:"cosmetics"},addTags:{brand:"Lush","brand:wikidata":"Q1585448","brand:wikipedia":"en:Lush (company)",name:"Lush",shop:"cosmetics"},terms:[],matchScore:2,suggestion:true},"shop/cosmetics/MAC Cosmetics":{name:"MAC Cosmetics",icon:"maki-shop",imageURL:"https://graph.facebook.com/MACcosmetics/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2624442",shop:"cosmetics"},addTags:{brand:"MAC Cosmetics","brand:wikidata":"Q2624442","brand:wikipedia":"en:MAC Cosmetics",name:"MAC Cosmetics",shop:"cosmetics",short_name:"M·A·C"},countryCodes:["ca","de","us"],terms:[],matchScore:2,suggestion:true},"shop/cosmetics/Nocibé":{name:"Nocibé",icon:"maki-shop",imageURL:"https://graph.facebook.com/nocibe/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3342592",shop:"cosmetics"},addTags:{brand:"Nocibé","brand:wikidata":"Q3342592","brand:wikipedia":"fr:Nocibé",name:"Nocibé",shop:"cosmetics"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/cosmetics/Origins":{name:"Origins",icon:"maki-shop",imageURL:"https://graph.facebook.com/Origins/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6643229",shop:"cosmetics"},addTags:{brand:"Origins","brand:wikidata":"Q6643229","brand:wikipedia":"en:Origins (cosmetics)",name:"Origins",shop:"cosmetics"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/cosmetics/Saje":{name:"Saje",icon:"maki-shop",imageURL:"https://graph.facebook.com/SajeWellness/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q44631749",shop:"cosmetics"},addTags:{brand:"Saje","brand:wikidata":"Q44631749","brand:wikipedia":"en:Saje Natural Wellness",name:"Saje",shop:"cosmetics"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/cosmetics/Sephora":{name:"Sephora",icon:"maki-shop",imageURL:"https://graph.facebook.com/sephora/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2408041",shop:"cosmetics"},addTags:{brand:"Sephora","brand:wikidata":"Q2408041","brand:wikipedia":"en:Sephora",name:"Sephora",shop:"cosmetics"},terms:[],matchScore:2,suggestion:true},"shop/cosmetics/The Body Shop":{name:"The Body Shop",icon:"maki-shop",imageURL:"https://graph.facebook.com/TheBodyShopUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q837851",shop:"cosmetics"},addTags:{brand:"The Body Shop","brand:wikidata":"Q837851","brand:wikipedia":"en:The Body Shop",name:"The Body Shop",shop:"cosmetics"},terms:[],matchScore:2,suggestion:true},"shop/cosmetics/Ulta Beauty":{name:"Ulta Beauty",icon:"maki-shop",imageURL:"https://graph.facebook.com/UltaBeauty/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7880076",shop:"cosmetics"},addTags:{brand:"Ulta Beauty","brand:wikidata":"Q7880076","brand:wikipedia":"en:Ulta Beauty",name:"Ulta Beauty",shop:"cosmetics"},countryCodes:["us"],terms:["ulta"],matchScore:2,suggestion:true},"shop/cosmetics/Л'Этуаль":{name:"Л'Этуаль",icon:"maki-shop",imageURL:"https://graph.facebook.com/letoile.ru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q18400706",shop:"cosmetics"},addTags:{brand:"Л'Этуаль","brand:wikidata":"Q18400706","brand:wikipedia":"ru:Л’Этуаль",name:"Л'Этуаль",shop:"cosmetics"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/cosmetics/Магнит Косметик":{name:"Магнит Косметик",icon:"maki-shop",imageURL:"https://graph.facebook.com/magnitretail/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q940518",shop:"cosmetics"},addTags:{brand:"Магнит Косметик","brand:en":"Magnit Cosmetics","brand:wikidata":"Q940518","brand:wikipedia":"ru:Магнит (сеть магазинов)",name:"Магнит Косметик","name:en":"Magnit Cosmetics",shop:"cosmetics"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/country_store/Atwoods":{name:"Atwoods",icon:"maki-shop",imageURL:"https://graph.facebook.com/Atwoods.Ranch.and.Home.Stores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4818874",shop:"country_store"},addTags:{brand:"Atwoods","brand:wikidata":"Q4818874","brand:wikipedia":"en:Atwoods",name:"Atwoods",shop:"country_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/country_store/Blain's Farm & Fleet":{name:"Blain's Farm & Fleet",icon:"maki-shop",imageURL:"https://graph.facebook.com/BlainsFarmandFleet/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4923906",shop:"country_store"},addTags:{brand:"Blain's Farm & Fleet","brand:wikidata":"Q4923906","brand:wikipedia":"en:Blain's Farm & Fleet",name:"Blain's Farm & Fleet",shop:"country_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/country_store/Bomgaars":{name:"Bomgaars",icon:"maki-shop",imageURL:"https://graph.facebook.com/BomgaarsSupply.Corporate/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q22059070",shop:"country_store"},addTags:{brand:"Bomgaars","brand:wikidata":"Q22059070","brand:wikipedia":"en:Bomgaars",name:"Bomgaars",shop:"country_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/country_store/Fleet Farm":{name:"Fleet Farm",icon:"maki-shop",imageURL:"https://graph.facebook.com/fleetfarm/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6859973",shop:"country_store"},addTags:{brand:"Fleet Farm","brand:wikidata":"Q6859973","brand:wikipedia":"en:Fleet Farm",name:"Fleet Farm",shop:"country_store"},countryCodes:["us"],terms:["mills fleet farm"],matchScore:2,suggestion:true},"shop/country_store/Grange Co-op":{name:"Grange Co-op",icon:"maki-shop",imageURL:"https://graph.facebook.com/grangecoop/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5595639",shop:"country_store"},addTags:{brand:"Grange Co-op","brand:wikidata":"Q5595639","brand:wikipedia":"en:Grange Cooperative",name:"Grange Co-op",shop:"country_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/country_store/Home of Economy":{name:"Home of Economy",icon:"maki-shop",imageURL:"https://graph.facebook.com/Homeofeconomy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5889100",shop:"country_store"},addTags:{brand:"Home of Economy","brand:wikidata":"Q5889100","brand:wikipedia":"en:Home of Economy",name:"Home of Economy",shop:"country_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/country_store/Norbys Farm Fleet":{name:"Norbys Farm Fleet",icon:"maki-shop",imageURL:"https://graph.facebook.com/norbysfarmfleet/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7050461",shop:"country_store"},addTags:{brand:"Norbys Farm Fleet","brand:wikidata":"Q7050461","brand:wikipedia":"en:Norby's Farm Fleet",name:"Norbys Farm Fleet",shop:"country_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/country_store/Orscheln Farm & Home":{name:"Orscheln Farm & Home",icon:"maki-shop",imageURL:"https://graph.facebook.com/orschelnfarmandhome/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q22060331",shop:"country_store"},addTags:{brand:"Orscheln Farm & Home","brand:wikidata":"Q22060331","brand:wikipedia":"en:Orscheln Farm & Home",name:"Orscheln Farm & Home",shop:"country_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/country_store/Peavey Mart":{name:"Peavey Mart",icon:"maki-shop",imageURL:"https://graph.facebook.com/PeaveyMart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7158483",shop:"country_store"},addTags:{brand:"Peavey Mart","brand:wikidata":"Q7158483","brand:wikipedia":"en:Peavey Mart",name:"Peavey Mart",shop:"country_store"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/country_store/Rural King":{name:"Rural King",icon:"maki-shop",imageURL:"https://graph.facebook.com/RuralKing/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7380525",shop:"country_store"},addTags:{brand:"Rural King","brand:wikidata":"Q7380525","brand:wikipedia":"en:Rural King",name:"Rural King",shop:"country_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/country_store/TSC Stores":{name:"TSC Stores",icon:"maki-shop",imageURL:"https://graph.facebook.com/TSCStoresCanada/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62720230",shop:"country_store"},addTags:{brand:"TSC Stores","brand:wikidata":"Q62720230",name:"TSC Stores",shop:"country_store"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/country_store/Theisen's":{name:"Theisen's",icon:"maki-shop",imageURL:"https://pbs.twimg.com/profile_images/743446346414227456/6V3KBxMe_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q7777850",shop:"country_store"},addTags:{brand:"Theisen's","brand:wikidata":"Q7777850","brand:wikipedia":"en:Theisen's",name:"Theisen's",shop:"country_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/country_store/Tractor Supply Company":{name:"Tractor Supply Company",icon:"maki-shop",imageURL:"https://graph.facebook.com/TractorSupplyCo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q15109925",shop:"country_store"},addTags:{brand:"Tractor Supply Company","brand:wikidata":"Q15109925","brand:wikipedia":"en:Tractor Supply Company",name:"Tractor Supply Company",shop:"country_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/country_store/Wynnstay":{name:"Wynnstay",icon:"maki-shop",imageURL:"https://graph.facebook.com/WynnstayCountryStores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63016351",shop:"country_store"},addTags:{brand:"Wynnstay","brand:wikidata":"Q63016351",name:"Wynnstay",shop:"country_store"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/craft/A.C. Moore":{name:"A.C. Moore",icon:"fas-palette",imageURL:"https://graph.facebook.com/acmoore/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4647066",shop:"craft"},addTags:{brand:"A.C. Moore","brand:wikidata":"Q4647066","brand:wikipedia":"en:A.C. Moore",name:"A.C. Moore",shop:"craft"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/craft/Hobby Lobby":{name:"Hobby Lobby",icon:"fas-palette",imageURL:"https://graph.facebook.com/HobbyLobby/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5874938",shop:"craft"},addTags:{brand:"Hobby Lobby","brand:wikidata":"Q5874938","brand:wikipedia":"en:Hobby Lobby",name:"Hobby Lobby",shop:"craft"},countryCodes:["in","us"],terms:[],matchScore:2,suggestion:true},"shop/craft/Hobbycraft":{name:"Hobbycraft",icon:"fas-palette",imageURL:"https://graph.facebook.com/HobbycraftUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16984508",shop:"craft"},addTags:{brand:"Hobbycraft","brand:wikidata":"Q16984508","brand:wikipedia":"en:Hobbycraft",name:"Hobbycraft",shop:"craft"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/craft/Jo-Ann":{name:"Jo-Ann",icon:"fas-palette",imageURL:"https://graph.facebook.com/JoAnn/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6203968",shop:"craft"},addTags:{brand:"Jo-Ann","brand:wikidata":"Q6203968","brand:wikipedia":"en:Jo-Ann Stores",name:"Jo-Ann",shop:"craft"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/craft/Michaels":{name:"Michaels",icon:"fas-palette",imageURL:"https://graph.facebook.com/Michaels/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6835667",shop:"craft"},addTags:{brand:"Michaels","brand:wikidata":"Q6835667","brand:wikipedia":"en:Michaels",name:"Michaels",shop:"craft"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/deli/ほっともっと":{name:"ほっともっと",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/hottomotto/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10850949",shop:"deli"},addTags:{brand:"ほっともっと","brand:en":"Hotto Motto","brand:ja":"ほっともっと","brand:wikidata":"Q10850949","brand:wikipedia":"ja:ほっともっと",name:"ほっともっと","name:en":"Hotto Motto","name:ja":"ほっともっと",shop:"deli"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/deli/京樽":{name:"京樽",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/kyotaru.sushi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11374503",shop:"deli"},addTags:{brand:"京樽","brand:en":"Kyotaru","brand:ja":"京樽","brand:wikidata":"Q11374503","brand:wikipedia":"ja:京樽",name:"京樽","name:en":"Kyotaru","name:ja":"京樽",shop:"deli"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Barneys New York":{name:"Barneys New York",icon:"maki-shop",imageURL:"https://graph.facebook.com/BarneysNY/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q59465",shop:"department_store"},addTags:{brand:"Barneys New York","brand:wikidata":"Q59465","brand:wikipedia":"en:Barneys New York",name:"Barneys New York",shop:"department_store"},countryCodes:["us"],terms:["barneys"],matchScore:2,suggestion:true},"shop/department_store/Belk":{name:"Belk",icon:"maki-shop",imageURL:"https://graph.facebook.com/Belk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q127428",shop:"department_store"},addTags:{brand:"Belk","brand:wikidata":"Q127428","brand:wikipedia":"en:Belk",name:"Belk",shop:"department_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Bi-Mart":{name:"Bi-Mart",icon:"maki-shop",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBi-Mart.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q4902331",shop:"department_store"},addTags:{brand:"Bi-Mart","brand:wikidata":"Q4902331","brand:wikipedia":"en:Bi-Mart",name:"Bi-Mart",shop:"department_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Big Lots":{name:"Big Lots",icon:"maki-shop",imageURL:"https://graph.facebook.com/biglots/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4905973",shop:"department_store"},addTags:{brand:"Big Lots","brand:wikidata":"Q4905973","brand:wikipedia":"en:Big Lots",name:"Big Lots",shop:"department_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Big W":{name:"Big W",icon:"maki-shop",imageURL:"https://graph.facebook.com/BIGWaustralia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4906646",shop:"department_store"},addTags:{brand:"Big W","brand:wikidata":"Q4906646","brand:wikipedia":"en:Big W",name:"Big W",shop:"department_store"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Bloomingdale's":{name:"Bloomingdale's",icon:"maki-shop",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBloomingdale's%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q283383",shop:"department_store"},addTags:{brand:"Bloomingdale's","brand:wikidata":"Q283383","brand:wikipedia":"en:Bloomingdale's",name:"Bloomingdale's",shop:"department_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Canadian Tire":{name:"Canadian Tire",icon:"maki-shop",imageURL:"https://graph.facebook.com/Canadiantire/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1032400",shop:"department_store"},addTags:{brand:"Canadian Tire","brand:wikidata":"Q1032400","brand:wikipedia":"en:Canadian Tire",name:"Canadian Tire",shop:"department_store"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Casas Bahia":{name:"Casas Bahia",icon:"maki-shop",imageURL:"https://graph.facebook.com/CasasBahia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5048048",shop:"department_store"},addTags:{brand:"Casas Bahia","brand:wikidata":"Q5048048","brand:wikipedia":"en:Casas Bahia",name:"Casas Bahia",shop:"department_store"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Century 21":{name:"Century 21",icon:"maki-shop",imageURL:"https://graph.facebook.com/century21stores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5063125",shop:"department_store"},addTags:{brand:"Century 21","brand:wikidata":"Q5063125","brand:wikipedia":"en:Century 21 (department store)",name:"Century 21",shop:"department_store"},countryCodes:["us"],terms:["c21"],matchScore:2,suggestion:true},"shop/department_store/Coppel":{name:"Coppel",icon:"maki-shop",imageURL:"https://graph.facebook.com/tiendascoppel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2497795",shop:"department_store"},addTags:{brand:"Coppel","brand:wikidata":"Q2497795","brand:wikipedia":"en:Coppel",name:"Coppel",shop:"department_store"},terms:[],matchScore:2,suggestion:true},"shop/department_store/David Jones":{name:"David Jones",icon:"maki-shop",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FDavid%20Jones%20Limited%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q5235753",shop:"department_store"},addTags:{brand:"David Jones","brand:wikidata":"Q5235753","brand:wikipedia":"en:David Jones Limited",name:"David Jones",shop:"department_store"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Debenhams":{name:"Debenhams",icon:"maki-shop",imageURL:"https://graph.facebook.com/Debenhams/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1181484",shop:"department_store"},addTags:{brand:"Debenhams","brand:wikidata":"Q1181484","brand:wikipedia":"en:Debenhams",name:"Debenhams",shop:"department_store"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Dillard's":{name:"Dillard's",icon:"maki-shop",imageURL:"https://graph.facebook.com/Dillards/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q844805",shop:"department_store"},addTags:{brand:"Dillard's","brand:wikidata":"Q844805","brand:wikipedia":"en:Dillard's",name:"Dillard's",shop:"department_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/department_store/El Corte Inglés":{name:"El Corte Inglés",icon:"maki-shop",imageURL:"https://graph.facebook.com/elcorteingles/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q623133",shop:"department_store"},addTags:{brand:"El Corte Inglés","brand:wikidata":"Q623133","brand:wikipedia":"en:El Corte Inglés",name:"El Corte Inglés",shop:"department_store"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Falabella":{name:"Falabella",icon:"maki-shop",imageURL:"https://graph.facebook.com/falabellachile/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5135229",shop:"department_store"},addTags:{brand:"Falabella","brand:wikidata":"Q5135229","brand:wikipedia":"en:Falabella (retail store)",name:"Falabella",shop:"department_store"},terms:["saga falabella"],matchScore:2,suggestion:true},"shop/department_store/Galeria Kaufhof":{name:"Galeria Kaufhof",icon:"maki-shop",imageURL:"https://graph.facebook.com/GaleriaKarstadtKaufhof/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q322598",shop:"department_store"},addTags:{brand:"Galeria Kaufhof","brand:wikidata":"Q322598","brand:wikipedia":"en:Galeria Kaufhof",name:"Galeria Kaufhof",shop:"department_store"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Giant Tiger":{name:"Giant Tiger",icon:"maki-shop",imageURL:"https://graph.facebook.com/GiantTiger/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5558429",shop:"department_store"},addTags:{brand:"Giant Tiger","brand:wikidata":"Q5558429","brand:wikipedia":"en:Giant Tiger",name:"Giant Tiger",shop:"department_store"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Gordmans":{name:"Gordmans",icon:"maki-shop",imageURL:"https://graph.facebook.com/gordmans/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5584725",shop:"department_store"},addTags:{brand:"Gordmans","brand:wikidata":"Q5584725","brand:wikipedia":"en:Gordmans",name:"Gordmans",shop:"department_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/department_store/HEMA":{name:"HEMA",icon:"maki-shop",imageURL:"https://graph.facebook.com/hema/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q903805",shop:"department_store"},addTags:{brand:"HEMA","brand:wikidata":"Q903805","brand:wikipedia":"en:HEMA (store)",name:"HEMA",shop:"department_store"},countryCodes:["be","de","nl"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Harvey Norman":{name:"Harvey Norman",icon:"maki-shop",imageURL:"https://graph.facebook.com/HarveyNormanAU/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4040441",shop:"department_store"},addTags:{brand:"Harvey Norman","brand:wikidata":"Q4040441","brand:wikipedia":"en:Harvey Norman",name:"Harvey Norman",shop:"department_store"},countryCodes:["au","nz"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Havan":{name:"Havan",icon:"maki-shop",imageURL:"https://graph.facebook.com/Havanoficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61968827",shop:"department_store"},addTags:{brand:"Havan","brand:wikidata":"Q61968827",name:"Havan",shop:"department_store"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Hudson's Bay":{name:"Hudson's Bay",icon:"maki-shop",imageURL:"https://pbs.twimg.com/profile_images/1101488235371479041/QIHGzj4I_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q641129",shop:"department_store"},addTags:{alt_name:"The Bay",brand:"Hudson's Bay","brand:wikidata":"Q641129","brand:wikipedia":"en:Hudson's Bay (retailer)",name:"Hudson's Bay",shop:"department_store"},countryCodes:["ca","nl"],terms:[],matchScore:2,suggestion:true},"shop/department_store/JCPenney":{name:"JCPenney",icon:"maki-shop",imageURL:"https://graph.facebook.com/jcp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q920037",shop:"department_store"},addTags:{brand:"JCPenney","brand:wikidata":"Q920037","brand:wikipedia":"en:J. C. Penney",name:"JCPenney",shop:"department_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/department_store/John Lewis":{name:"John Lewis",icon:"maki-shop",imageURL:"https://pbs.twimg.com/profile_images/1144621972669763585/GG6RGijn_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q1918981",shop:"department_store"},addTags:{brand:"John Lewis","brand:wikidata":"Q1918981","brand:wikipedia":"en:John Lewis & Partners",name:"John Lewis",shop:"department_store"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Karstadt":{name:"Karstadt",icon:"maki-shop",imageURL:"https://graph.facebook.com/karstadt1881/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q182910",shop:"department_store"},addTags:{brand:"Karstadt","brand:wikidata":"Q182910","brand:wikipedia":"en:Karstadt",name:"Karstadt",shop:"department_store"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Kmart (Australia)":{name:"Kmart (Australia)",icon:"maki-shop",imageURL:"https://graph.facebook.com/KmartAustralia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6421682",shop:"department_store"},addTags:{brand:"Kmart","brand:wikidata":"Q6421682","brand:wikipedia":"en:Kmart Australia",name:"Kmart",shop:"department_store"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Kmart (USA)":{name:"Kmart (USA)",icon:"maki-shop",imageURL:"https://graph.facebook.com/kmart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1753080",shop:"department_store"},addTags:{brand:"Kmart","brand:wikidata":"Q1753080","brand:wikipedia":"en:Kmart",name:"Kmart",shop:"department_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Kohl's":{name:"Kohl's",icon:"maki-shop",imageURL:"https://graph.facebook.com/kohls/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q967265",shop:"department_store"},addTags:{brand:"Kohl's","brand:wikidata":"Q967265","brand:wikipedia":"en:Kohl's",name:"Kohl's",shop:"department_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Lojas Americanas":{name:"Lojas Americanas",icon:"maki-shop",imageURL:"https://graph.facebook.com/lojasamericanas/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3064093",shop:"department_store"},addTags:{brand:"Lojas Americanas","brand:wikidata":"Q3064093","brand:wikipedia":"en:Lojas Americanas",name:"Lojas Americanas",shop:"department_store"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Lord & Taylor":{name:"Lord & Taylor",icon:"maki-shop",imageURL:"https://graph.facebook.com/lordandtaylor/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2749082",shop:"department_store"},addTags:{brand:"Lord & Taylor","brand:wikidata":"Q2749082","brand:wikipedia":"en:Lord & Taylor",name:"Lord & Taylor",shop:"department_store"},countryCodes:["us"],terms:["lord and taylor"],matchScore:2,suggestion:true},"shop/department_store/Lotte Department Store":{name:"Lotte Department Store",icon:"maki-shop",imageURL:"https://graph.facebook.com/LOTTEshopping/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q489905",shop:"department_store"},addTags:{brand:"Lotte Department Store","brand:wikidata":"Q489905","brand:wikipedia":"en:Lotte Department Store",name:"Lotte Department Store",shop:"department_store"},terms:["lotte"],matchScore:2,suggestion:true},"shop/department_store/Macy's":{name:"Macy's",icon:"maki-shop",imageURL:"https://graph.facebook.com/Macys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q629269",shop:"department_store"},addTags:{brand:"Macy's","brand:wikidata":"Q629269","brand:wikipedia":"en:Macy's",name:"Macy's",shop:"department_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Marks & Spencer":{name:"Marks & Spencer",icon:"maki-shop",imageURL:"https://graph.facebook.com/marksandspencerrussia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q714491",shop:"department_store"},addTags:{brand:"Marks & Spencer","brand:wikidata":"Q714491","brand:wikipedia":"en:Marks & Spencer",name:"Marks & Spencer",shop:"department_store"},countryCodes:["gb","gr","ie"],terms:["M & S","marks and spencer"],matchScore:2,suggestion:true},"shop/department_store/Marshalls":{name:"Marshalls",icon:"maki-shop",imageURL:"https://graph.facebook.com/Marshalls/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q15903261",shop:"department_store"},addTags:{brand:"Marshalls","brand:wikidata":"Q15903261","brand:wikipedia":"en:Marshalls",name:"Marshalls",shop:"department_store"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Muji":{name:"Muji",icon:"maki-shop",imageURL:"https://pbs.twimg.com/profile_images/2779266335/6fbe4ceb685984dbe3a149bd94043e80_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q708789",shop:"department_store"},addTags:{brand:"Muji","brand:en":"Muji","brand:ja":"無印良品","brand:wikidata":"Q708789","brand:wikipedia":"en:Muji",name:"Muji","name:en":"Muji","name:ja":"無印良品",shop:"department_store"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Myer":{name:"Myer",icon:"maki-shop",imageURL:"https://graph.facebook.com/myer/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1110323",shop:"department_store"},addTags:{brand:"Myer","brand:wikidata":"Q1110323","brand:wikipedia":"en:Myer",name:"Myer",shop:"department_store"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Neiman Marcus":{name:"Neiman Marcus",icon:"maki-shop",imageURL:"https://graph.facebook.com/neimanmarcus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q743497",shop:"department_store"},addTags:{brand:"Neiman Marcus","brand:wikidata":"Q743497","brand:wikipedia":"en:Neiman Marcus",name:"Neiman Marcus",shop:"department_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Nordstrom":{name:"Nordstrom",icon:"maki-shop",imageURL:"https://graph.facebook.com/Nordstrom/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q174310",shop:"department_store"},addTags:{brand:"Nordstrom","brand:wikidata":"Q174310","brand:wikipedia":"en:Nordstrom",name:"Nordstrom",shop:"department_store"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Oechsle":{name:"Oechsle",icon:"maki-shop",imageURL:"https://graph.facebook.com/tiendasoechsle/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6049096",shop:"department_store"},addTags:{brand:"Oechsle","brand:wikidata":"Q6049096","brand:wikipedia":"es:Oechsle",name:"Oechsle",shop:"department_store"},countryCodes:["pe"],terms:[],matchScore:2,suggestion:true},"shop/department_store/París":{name:"París",icon:"maki-shop",imageURL:"https://graph.facebook.com/TiendasParis/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q20812805",shop:"department_store"},addTags:{brand:"París","brand:wikidata":"Q20812805","brand:wikipedia":"en:París (retail store)",name:"París",shop:"department_store"},countryCodes:["cl","pe"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Printemps":{name:"Printemps",icon:"maki-shop",imageURL:"https://graph.facebook.com/Printemps/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1535260",shop:"department_store"},addTags:{brand:"Printemps","brand:wikidata":"Q1535260","brand:wikipedia":"fr:Printemps (grands magasins)",name:"Printemps",shop:"department_store"},countryCodes:["ad","cn","fr","jp","sa"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Ripley":{name:"Ripley",icon:"maki-shop",imageURL:"https://graph.facebook.com/ripleychile/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3433040",shop:"department_store"},addTags:{brand:"Ripley","brand:wikidata":"Q3433040","brand:wikipedia":"en:Ripley S.A.",name:"Ripley",shop:"department_store"},countryCodes:["cl","pe"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Saks Fifth Avenue":{name:"Saks Fifth Avenue",icon:"maki-shop",imageURL:"https://graph.facebook.com/saks/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2723882",shop:"department_store"},addTags:{brand:"Saks Fifth Avenue","brand:wikidata":"Q2723882","brand:wikipedia":"en:Saks Fifth Avenue",name:"Saks Fifth Avenue",shop:"department_store"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Saks Off 5th":{name:"Saks Off 5th",icon:"maki-shop",imageURL:"https://graph.facebook.com/saks/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2723882",shop:"department_store"},addTags:{brand:"Saks Off 5th","brand:wikidata":"Q2723882","brand:wikipedia":"en:Saks Fifth Avenue",name:"Saks Off 5th",shop:"department_store"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Sears":{name:"Sears",icon:"maki-shop",imageURL:"https://graph.facebook.com/sears/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6499202",shop:"department_store"},addTags:{brand:"Sears","brand:wikidata":"Q6499202","brand:wikipedia":"en:Sears",name:"Sears",shop:"department_store"},countryCodes:["mx","us"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Shopko":{name:"Shopko",icon:"maki-shop",imageURL:"https://graph.facebook.com/ShopkoOptical/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7501155",shop:"department_store"},addTags:{brand:"Shopko","brand:wikidata":"Q7501155","brand:wikipedia":"en:Shopko",name:"Shopko",shop:"department_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Stein Mart":{name:"Stein Mart",icon:"maki-shop",imageURL:"https://graph.facebook.com/SteinMart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7606770",shop:"department_store"},addTags:{brand:"Stein Mart","brand:wikidata":"Q7606770","brand:wikipedia":"en:Stein Mart",name:"Stein Mart",shop:"department_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Stockmann":{name:"Stockmann",icon:"maki-shop",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FStockmann%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1543093",shop:"department_store"},addTags:{brand:"Stockmann","brand:wikidata":"Q1543093","brand:wikipedia":"fi:Stockmann",name:"Stockmann",shop:"department_store"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Target (Australia)":{name:"Target (Australia)",icon:"maki-shop",imageURL:"https://graph.facebook.com/targetaus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7685854",shop:"department_store"},addTags:{brand:"Target","brand:wikidata":"Q7685854","brand:wikipedia":"en:Target Australia",name:"Target",shop:"department_store"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Target (USA)":{name:"Target (USA)",icon:"maki-shop",imageURL:"https://graph.facebook.com/target/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1046951",shop:"department_store"},addTags:{brand:"Target","brand:wikidata":"Q1046951","brand:wikipedia":"en:Target Corporation",name:"Target",shop:"department_store"},countryCodes:["us"],terms:["Super Target"],matchScore:2,suggestion:true},"shop/department_store/The Warehouse":{name:"The Warehouse",icon:"maki-shop",imageURL:"https://graph.facebook.com/TheWarehouseNZ/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3566291",shop:"department_store"},addTags:{brand:"The Warehouse","brand:wikidata":"Q3566291","brand:wikipedia":"en:The Warehouse Group",name:"The Warehouse",shop:"department_store"},countryCodes:["nz"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Walmart":{name:"Walmart",icon:"maki-shop",imageURL:"https://graph.facebook.com/walmart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q483551",shop:"department_store"},addTags:{brand:"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"en:Walmart",name:"Walmart",shop:"department_store"},terms:[],matchScore:2,suggestion:true},"shop/department_store/Woolworth":{name:"Woolworth",icon:"maki-shop",imageURL:"https://graph.facebook.com/WoolworthDeutschland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q183538",shop:"department_store"},addTags:{brand:"Woolworth","brand:wikidata":"Q183538","brand:wikipedia":"de:Woolworth Deutschland",name:"Woolworth",shop:"department_store"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Åhléns":{name:"Åhléns",icon:"maki-shop",imageURL:"https://graph.facebook.com/ahlens/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q270851",shop:"department_store"},addTags:{brand:"Åhléns","brand:wikidata":"Q270851","brand:wikipedia":"sv:Åhléns",name:"Åhléns",shop:"department_store"},countryCodes:["se"],terms:[],matchScore:2,suggestion:true},"shop/department_store/東急ハンズ":{name:"東急ハンズ",icon:"maki-shop",imageURL:"https://graph.facebook.com/TokyuHandsInc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q859212",shop:"department_store"},addTags:{brand:"東急ハンズ","brand:en":"Tokyu Hands","brand:ja":"東急ハンズ","brand:wikidata":"Q859212","brand:wikipedia":"ja:東急ハンズ",name:"東急ハンズ","name:en":"Tokyu Hands","name:ja":"東急ハンズ",shop:"department_store"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/department_store/無印良品":{name:"無印良品",icon:"maki-shop",imageURL:"https://pbs.twimg.com/profile_images/2779266335/6fbe4ceb685984dbe3a149bd94043e80_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q708789",shop:"department_store"},addTags:{brand:"無印良品","brand:en":"Muji","brand:ja":"無印良品","brand:wikidata":"Q708789","brand:wikipedia":"ja:無印良品",name:"無印良品","name:en":"Muji","name:ja":"無印良品",shop:"department_store"},countryCodes:["jp","tw"],terms:[],matchScore:2,suggestion:true},"shop/department_store/롯데백화점":{name:"롯데백화점",icon:"maki-shop",imageURL:"https://graph.facebook.com/LOTTEshopping/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q489905",shop:"department_store"},addTags:{brand:"롯데백화점","brand:ko":"롯데백화점","brand:wikidata":"Q489905","brand:wikipedia":"ko:롯데백화점",name:"롯데백화점","name:en":"Lotte Department Store","name:ko":"롯데백화점",shop:"department_store"},countryCodes:["kr"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Ace Hardware":{name:"Ace Hardware",icon:"temaki-tools",imageURL:"https://graph.facebook.com/acehardware/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4672981",shop:"doityourself"},addTags:{brand:"Ace Hardware","brand:wikidata":"Q4672981","brand:wikipedia":"en:Ace Hardware",name:"Ace Hardware",shop:"doityourself"},terms:[],matchScore:2,suggestion:true},"shop/doityourself/B&Q":{name:"B&Q",icon:"temaki-tools",imageURL:"https://graph.facebook.com/bandq/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q707602",shop:"doityourself"},addTags:{brand:"B&Q","brand:wikidata":"Q707602","brand:wikipedia":"en:B&Q",name:"B&Q",shop:"doityourself"},terms:[],matchScore:2,suggestion:true},"shop/doityourself/Bauhaus":{name:"Bauhaus",icon:"temaki-tools",imageURL:"https://graph.facebook.com/137379942944322/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q672043",shop:"doityourself"},addTags:{brand:"Bauhaus","brand:wikidata":"Q672043","brand:wikipedia":"en:Bauhaus (company)",name:"Bauhaus",shop:"doityourself"},terms:[],matchScore:2,suggestion:true},"shop/doityourself/Biltema":{name:"Biltema",icon:"temaki-tools",imageURL:"https://graph.facebook.com/BiltemaSverige/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3355552",shop:"doityourself"},addTags:{brand:"Biltema","brand:wikidata":"Q3355552","brand:wikipedia":"en:Biltema",name:"Biltema",shop:"doityourself"},countryCodes:["dk","fi","no","se"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Brico":{name:"Brico",icon:"temaki-tools",imageURL:"https://graph.facebook.com/brico.be/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2510786",shop:"doityourself"},addTags:{brand:"Brico","brand:wikidata":"Q2510786","brand:wikipedia":"en:Brico",name:"Brico",shop:"doityourself"},countryCodes:["be","fr","it"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Brico Dépôt":{name:"Brico Dépôt",icon:"temaki-tools",imageURL:"https://graph.facebook.com/BricoDepotFrance/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2889702",shop:"doityourself"},addTags:{brand:"Brico Dépôt","brand:wikidata":"Q2889702","brand:wikipedia":"en:Brico Dépôt",name:"Brico Dépôt",shop:"doityourself"},countryCodes:["fr","ro"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Bricoman":{name:"Bricoman",icon:"temaki-tools",imageURL:"https://graph.facebook.com/BricomanFrance/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2925142",shop:"doityourself"},addTags:{brand:"Bricoman","brand:wikidata":"Q2925142","brand:wikipedia":"it:Bricoman",name:"Bricoman",shop:"doityourself"},countryCodes:["fr","it","pl"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Bricomarché":{name:"Bricomarché",icon:"temaki-tools",imageURL:"https://graph.facebook.com/Bricomarche/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2925147",shop:"doityourself"},addTags:{brand:"Bricomarché","brand:wikidata":"Q2925147","brand:wikipedia":"en:Bricomarché",name:"Bricomarché",shop:"doityourself"},countryCodes:["fr","pl","pt"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Bricorama":{name:"Bricorama",icon:"temaki-tools",imageURL:"https://graph.facebook.com/BricoramaFR/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2925146",shop:"doityourself"},addTags:{brand:"Bricorama","brand:wikidata":"Q2925146","brand:wikipedia":"en:Bricorama",name:"Bricorama",shop:"doityourself"},countryCodes:["es","fr"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Bunnings Warehouse":{name:"Bunnings Warehouse",icon:"temaki-tools",imageURL:"https://pbs.twimg.com/profile_images/1405732718/hammer_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q4997829",shop:"doityourself"},addTags:{brand:"Bunnings Warehouse","brand:wikidata":"Q4997829","brand:wikipedia":"en:Bunnings Warehouse",name:"Bunnings Warehouse",shop:"doityourself"},countryCodes:["au","nz"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Castorama":{name:"Castorama",icon:"temaki-tools",imageURL:"https://graph.facebook.com/castorama/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q966971",shop:"doityourself"},addTags:{brand:"Castorama","brand:wikidata":"Q966971","brand:wikipedia":"en:Castorama",name:"Castorama",shop:"doityourself"},terms:[],matchScore:2,suggestion:true},"shop/doityourself/Clas Ohlson":{name:"Clas Ohlson",icon:"temaki-tools",imageURL:"https://graph.facebook.com/clasohlsonsverige/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3356220",shop:"doityourself"},addTags:{brand:"Clas Ohlson","brand:wikidata":"Q3356220","brand:wikipedia":"en:Clas Ohlson",name:"Clas Ohlson",shop:"doityourself"},countryCodes:["fi","no","se"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Easy":{name:"Easy",icon:"temaki-tools",imageURL:"https://graph.facebook.com/EasyHomecenter/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5331091",shop:"doityourself"},addTags:{brand:"Easy","brand:wikidata":"Q5331091","brand:wikipedia":"en:Easy (store)",name:"Easy",shop:"doityourself"},terms:[],matchScore:2,suggestion:true},"shop/doityourself/Gamma":{name:"Gamma",icon:"temaki-tools",imageURL:"https://graph.facebook.com/gamma.be/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2294120",shop:"doityourself"},addTags:{brand:"Gamma","brand:wikidata":"Q2294120","brand:wikipedia":"en:Gamma (store)",name:"Gamma",shop:"doityourself"},countryCodes:["be","nl"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Globus Baumarkt":{name:"Globus Baumarkt",icon:"temaki-tools",imageURL:"https://graph.facebook.com/Globus.de/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q457503",shop:"doityourself"},addTags:{brand:"Globus Baumarkt","brand:wikidata":"Q457503","brand:wikipedia":"de:Globus Holding",name:"Globus Baumarkt",shop:"doityourself"},countryCodes:["de","lu"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Hagebaumarkt":{name:"Hagebaumarkt",icon:"temaki-tools",imageURL:"https://graph.facebook.com/hagebau/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1568279",shop:"doityourself"},addTags:{brand:"Hagebaumarkt","brand:wikidata":"Q1568279","brand:wikipedia":"de:Hagebau",name:"Hagebaumarkt",shop:"doityourself"},countryCodes:["at","be","ch","de","es","fr","lu","nl"],terms:["hagebau"],matchScore:2,suggestion:true},"shop/doityourself/Hammer":{name:"Hammer",icon:"temaki-tools",imageURL:"https://graph.facebook.com/hammerzuhause/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q52159668",shop:"doityourself"},addTags:{brand:"Hammer","brand:wikidata":"Q52159668","brand:wikipedia":"de:Hammer (Fachmarktkette)",name:"Hammer",shop:"doityourself"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Hellweg":{name:"Hellweg",icon:"temaki-tools",imageURL:"https://graph.facebook.com/Hellweg.de/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1603084",shop:"doityourself"},addTags:{brand:"Hellweg","brand:wikidata":"Q1603084","brand:wikipedia":"de:Hellweg (Baumarkt)",name:"Hellweg",shop:"doityourself"},countryCodes:["at","de"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Home Building Centre (Canada)":{name:"Home Building Centre (Canada)",icon:"temaki-tools",imageURL:"https://graph.facebook.com/homehardwarestores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3139611",shop:"doityourself"},addTags:{brand:"Home Hardware","brand:wikidata":"Q3139611","brand:wikipedia":"en:Home Hardware",name:"Home Building Centre",shop:"doityourself"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Home Hardware Building Centre (Canada)":{name:"Home Hardware Building Centre (Canada)",icon:"temaki-tools",imageURL:"https://graph.facebook.com/homehardwarestores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3139611",shop:"doityourself"},addTags:{brand:"Home Hardware","brand:wikidata":"Q3139611","brand:wikipedia":"en:Home Hardware",name:"Home Hardware Building Centre",shop:"doityourself"},countryCodes:["ca"],terms:["home hardware"],matchScore:2,suggestion:true},"shop/doityourself/Home Timber & Hardware (Australia)":{name:"Home Timber & Hardware (Australia)",icon:"temaki-tools",geometry:["point","area"],tags:{"brand:wikidata":"Q17006984",shop:"doityourself"},addTags:{alt_name:"Home Hardware",brand:"Home Timber & Hardware","brand:wikidata":"Q17006984","brand:wikipedia":"en:Home Timber & Hardware",name:"Home Timber & Hardware",shop:"doityourself",short_name:"Home"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Homebase":{name:"Homebase",icon:"temaki-tools",imageURL:"https://graph.facebook.com/homebase/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q9293447",shop:"doityourself"},addTags:{brand:"Homebase","brand:wikidata":"Q9293447","brand:wikipedia":"en:Homebase",name:"Homebase",shop:"doityourself"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Hornbach":{name:"Hornbach",icon:"temaki-tools",imageURL:"https://graph.facebook.com/hornbach.de/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q685926",shop:"doityourself"},addTags:{brand:"Hornbach","brand:wikidata":"Q685926","brand:wikipedia":"en:Hornbach (retailer)",name:"Hornbach",shop:"doityourself"},terms:[],matchScore:2,suggestion:true},"shop/doityourself/Hubo":{name:"Hubo",icon:"temaki-tools",imageURL:"https://graph.facebook.com/hubo.be/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3142153",shop:"doityourself"},addTags:{brand:"Hubo","brand:wikidata":"Q3142153","brand:wikipedia":"en:Hubo Belgium",name:"Hubo",shop:"doityourself"},countryCodes:["be","nl"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Jewson":{name:"Jewson",icon:"temaki-tools",imageURL:"https://graph.facebook.com/jewsonuk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6190226",shop:"doityourself"},addTags:{brand:"Jewson","brand:wikidata":"Q6190226","brand:wikipedia":"en:Jewson",name:"Jewson",shop:"doityourself"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Karwei":{name:"Karwei",icon:"temaki-tools",imageURL:"https://graph.facebook.com/karwei/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2097480",shop:"doityourself"},addTags:{brand:"Karwei","brand:wikidata":"Q2097480","brand:wikipedia":"en:Karwei",name:"Karwei",shop:"doityourself"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Leroy Merlin":{name:"Leroy Merlin",icon:"temaki-tools",imageURL:"https://graph.facebook.com/leroymerlin/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q889624",shop:"doityourself"},addTags:{brand:"Leroy Merlin","brand:wikidata":"Q889624","brand:wikipedia":"en:Leroy Merlin",name:"Leroy Merlin",shop:"doityourself"},terms:[],matchScore:2,suggestion:true},"shop/doityourself/Lowe's":{name:"Lowe's",icon:"temaki-tools",imageURL:"https://graph.facebook.com/lowes/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1373493",shop:"doityourself"},addTags:{brand:"Lowe's","brand:wikidata":"Q1373493","brand:wikipedia":"en:Lowe's",name:"Lowe's",shop:"doityourself"},countryCodes:["ca","mx","us"],terms:["lowes home improvement"],matchScore:2,suggestion:true},"shop/doityourself/Menards":{name:"Menards",icon:"temaki-tools",imageURL:"https://graph.facebook.com/MenardsHomeImprovement/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1639897",shop:"doityourself"},addTags:{brand:"Menards","brand:wikidata":"Q1639897","brand:wikipedia":"en:Menards",name:"Menards",shop:"doityourself"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Mitre 10":{name:"Mitre 10",icon:"temaki-tools",imageURL:"https://graph.facebook.com/224109081130110/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6882393",shop:"doityourself"},addTags:{brand:"Mitre 10","brand:wikidata":"Q6882393","brand:wikipedia":"en:Mitre 10",name:"Mitre 10",shop:"doityourself"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Mr.Bricolage":{name:"Mr.Bricolage",icon:"temaki-tools",imageURL:"https://graph.facebook.com/mr.bricolagefrance/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3141657",shop:"doityourself"},addTags:{brand:"Mr.Bricolage","brand:wikidata":"Q3141657","brand:wikipedia":"fr:Mr Bricolage",name:"Mr.Bricolage",shop:"doityourself"},countryCodes:["be","fr"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/OBI":{name:"OBI",icon:"temaki-tools",imageURL:"https://graph.facebook.com/obirussia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q300518",shop:"doityourself"},addTags:{brand:"OBI","brand:wikidata":"Q300518","brand:wikipedia":"en:Obi (store)",name:"OBI",shop:"doityourself"},terms:[],matchScore:2,suggestion:true},"shop/doityourself/Praktiker":{name:"Praktiker",icon:"temaki-tools",imageURL:"https://graph.facebook.com/984505914908905/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q680214",shop:"doityourself"},addTags:{brand:"Praktiker","brand:wikidata":"Q680214","brand:wikipedia":"en:Praktiker",name:"Praktiker",shop:"doityourself"},countryCodes:["bg","gr","hu","ro"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Praxis":{name:"Praxis",icon:"temaki-tools",imageURL:"https://graph.facebook.com/praxis/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2741995",shop:"doityourself"},addTags:{brand:"Praxis","brand:wikidata":"Q2741995","brand:wikipedia":"nl:Praxis (winkel)",name:"Praxis",shop:"doityourself"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Promart":{name:"Promart",icon:"temaki-tools",imageURL:"https://graph.facebook.com/PROMARTHomecenter/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17626095",shop:"doityourself"},addTags:{brand:"Promart","brand:wikidata":"Q17626095","brand:wikipedia":"en:Promart",name:"Promart",shop:"doityourself"},countryCodes:["pe"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Rona":{name:"Rona",icon:"temaki-tools",imageURL:"https://graph.facebook.com/ronainc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3415283",shop:"doityourself"},addTags:{brand:"Rona","brand:wikidata":"Q3415283","brand:wikipedia":"en:Rona, Inc.",name:"Rona",shop:"doityourself"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Screwfix":{name:"Screwfix",icon:"temaki-tools",imageURL:"https://graph.facebook.com/Screwfix/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7439115",shop:"doityourself"},addTags:{brand:"Screwfix","brand:wikidata":"Q7439115","brand:wikipedia":"en:Screwfix",name:"Screwfix",shop:"doityourself"},countryCodes:["de","gb"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Sodimac":{name:"Sodimac",icon:"temaki-tools",imageURL:"https://graph.facebook.com/homecenter/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7553274",shop:"doityourself"},addTags:{brand:"Sodimac","brand:wikidata":"Q7553274","brand:wikipedia":"es:Sodimac",name:"Sodimac",shop:"doityourself"},terms:["sodimac constructor"],matchScore:2,suggestion:true},"shop/doityourself/Tekzen":{name:"Tekzen",icon:"temaki-tools",imageURL:"https://graph.facebook.com/tekzenturkiye/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q25475379",shop:"doityourself"},addTags:{brand:"Tekzen","brand:wikidata":"Q25475379","brand:wikipedia":"tr:Tekzen",name:"Tekzen",shop:"doityourself"},countryCodes:["tr"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/The Home Depot":{name:"The Home Depot",icon:"temaki-tools",imageURL:"https://graph.facebook.com/homedepot/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q864407",shop:"doityourself"},addTags:{alt_name:"Home Depot",brand:"The Home Depot","brand:wikidata":"Q864407","brand:wikipedia":"en:The Home Depot",name:"The Home Depot",shop:"doityourself"},countryCodes:["ca","mx","us"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Toom Baumarkt":{name:"Toom Baumarkt",icon:"temaki-tools",imageURL:"https://graph.facebook.com/192246064148765/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2442970",shop:"doityourself"},addTags:{brand:"Toom Baumarkt","brand:wikidata":"Q2442970","brand:wikipedia":"de:Toom Baumarkt",name:"Toom Baumarkt",shop:"doityourself"},countryCodes:["de"],terms:["toom"],matchScore:2,suggestion:true},"shop/doityourself/Travis Perkins":{name:"Travis Perkins",icon:"temaki-tools",imageURL:"https://graph.facebook.com/TravisPerkinsPlcUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2450664",shop:"doityourself"},addTags:{brand:"Travis Perkins","brand:wikidata":"Q2450664","brand:wikipedia":"en:Travis Perkins",name:"Travis Perkins",shop:"doityourself"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Weldom":{name:"Weldom",icon:"temaki-tools",imageURL:"https://graph.facebook.com/Weldom/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16683226",shop:"doityourself"},addTags:{brand:"Weldom","brand:wikidata":"Q16683226","brand:wikipedia":"fr:Weldom",name:"Weldom",shop:"doityourself"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Wickes":{name:"Wickes",icon:"temaki-tools",imageURL:"https://graph.facebook.com/Wickes.co.uk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7998350",shop:"doityourself"},addTags:{brand:"Wickes","brand:wikidata":"Q7998350","brand:wikipedia":"en:Wickes",name:"Wickes",shop:"doityourself"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/jem & fix":{name:"jem & fix",icon:"temaki-tools",imageURL:"https://graph.facebook.com/jemogfix/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12319200",shop:"doityourself"},addTags:{brand:"jem & fix","brand:wikidata":"Q12319200","brand:wikipedia":"da:Jem & fix",name:"jem & fix",shop:"doityourself"},countryCodes:["dk"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Леруа Мерлен":{name:"Леруа Мерлен",icon:"temaki-tools",imageURL:"https://graph.facebook.com/leroymerlin/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q889624",shop:"doityourself"},addTags:{brand:"Леруа Мерлен","brand:en":"Leroy Merlin","brand:wikidata":"Q889624","brand:wikipedia":"en:Leroy Merlin",name:"Леруа Мерлен","name:en":"Leroy Merlin",shop:"doityourself"},countryCodes:["ru","ua"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/カインズホーム":{name:"カインズホーム",icon:"temaki-tools",imageURL:"https://graph.facebook.com/cainzfun/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11293852",shop:"doityourself"},addTags:{brand:"カインズホーム","brand:en":"Cainz Home","brand:ja":"カインズホーム","brand:wikidata":"Q11293852","brand:wikipedia":"ja:カインズ",name:"カインズホーム","name:en":"Cainz Home","name:ja":"カインズホーム",shop:"doityourself"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/コメリ":{name:"コメリ",icon:"temaki-tools",imageURL:"https://graph.facebook.com/saiengardenclub/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11302690",shop:"doityourself"},addTags:{brand:"コメリ","brand:ja":"コメリ","brand:wikidata":"Q11302690","brand:wikipedia":"ja:コメリ",name:"コメリ","name:en":"Komeri","name:ja":"コメリ",shop:"doityourself"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/コーナン":{name:"コーナン",icon:"temaki-tools",imageURL:"https://graph.facebook.com/kohnan.official/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11303403",shop:"doityourself"},addTags:{brand:"コーナン","brand:ja":"コーナン","brand:wikidata":"Q11303403","brand:wikipedia":"ja:コーナン",name:"コーナン","name:en":"Kohnan","name:ja":"コーナン",shop:"doityourself"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/dry_cleaning/5àsec":{name:"5àsec",icon:"temaki-clothes_hanger",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%205%C3%A0sec.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2817899",shop:"dry_cleaning"},addTags:{brand:"5àsec","brand:wikidata":"Q2817899","brand:wikipedia":"fr:5àsec",name:"5àsec",shop:"dry_cleaning"},terms:[],matchScore:2,suggestion:true},"shop/dry_cleaning/Martinizing Dry Cleaning":{name:"Martinizing Dry Cleaning",icon:"temaki-clothes_hanger",imageURL:"https://graph.facebook.com/MartinizingDryClean/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6777169",shop:"dry_cleaning"},addTags:{brand:"Martinizing Dry Cleaning","brand:wikidata":"Q6777169","brand:wikipedia":"en:Martinizing Dry Cleaning",name:"Martinizing Dry Cleaning",shop:"dry_cleaning"},terms:[],matchScore:2,suggestion:true},"shop/dry_cleaning/Диана":{name:"Диана",icon:"temaki-clothes_hanger",imageURL:"https://graph.facebook.com/diana.dryclean/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62105088",shop:"dry_cleaning"},addTags:{brand:"Диана","brand:wikidata":"Q62105088",name:"Диана",shop:"dry_cleaning"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/dry_cleaning/タカケンサンシャイン":{name:"タカケンサンシャイン",icon:"temaki-clothes_hanger",geometry:["point","area"],tags:{"brand:wikidata":"Q11315914",shop:"dry_cleaning"},addTags:{brand:"タカケンサンシャイン","brand:en":"Takaken Sunshine","brand:ja":"タカケンサンシャイン","brand:wikidata":"Q11315914","brand:wikipedia":"ja:タカケンサンシャイン",name:"タカケンサンシャイン","name:en":"Takaken Sunshine","name:ja":"タカケンサンシャイン",shop:"dry_cleaning"},countryCodes:["jp"],terms:["タカケンクリーング"],matchScore:2,suggestion:true},"shop/dry_cleaning/ホワイト急便":{name:"ホワイト急便",icon:"temaki-clothes_hanger",imageURL:"https://graph.facebook.com/974471789387794/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11505557",shop:"dry_cleaning"},addTags:{brand:"ホワイト急便","brand:en":"White Kyuubin","brand:ja":"ホワイト急便","brand:wikidata":"Q11505557","brand:wikipedia":"ja:日本さわやかグループ",name:"ホワイト急便","name:en":"White Kyuubin","name:ja":"ホワイト急便",shop:"dry_cleaning"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/dry_cleaning/白洋舎":{name:"白洋舎",icon:"temaki-clothes_hanger",imageURL:"https://graph.facebook.com/hakuyosha.jp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11579995",shop:"dry_cleaning"},addTags:{brand:"白洋舎","brand:en":"Hakuyosha","brand:wikidata":"Q11579995","brand:wikipedia":"ja:白洋舎",name:"白洋舎","name:en":"Hakuyosha",shop:"dry_cleaning"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/electronics/Apple Store":{name:"Apple Store",icon:"fas-plug",imageURL:"https://graph.facebook.com/apple/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q421253",shop:"electronics"},addTags:{brand:"Apple Store","brand:wikidata":"Q421253","brand:wikipedia":"en:Apple Store",name:"Apple Store",shop:"electronics"},terms:[],matchScore:2,suggestion:true},"shop/electronics/Batteries Plus Bulbs":{name:"Batteries Plus Bulbs",icon:"fas-plug",imageURL:"https://graph.facebook.com/BatteriesPlus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17005157",shop:"electronics"},addTags:{brand:"Batteries Plus Bulbs","brand:wikidata":"Q17005157","brand:wikipedia":"en:Batteries Plus Bulbs",name:"Batteries Plus Bulbs",shop:"electronics"},countryCodes:["us"],terms:["batteries plus"],matchScore:2,suggestion:true},"shop/electronics/Best Buy":{name:"Best Buy",icon:"fas-plug",imageURL:"https://graph.facebook.com/bestbuy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q533415",shop:"electronics"},addTags:{brand:"Best Buy","brand:wikidata":"Q533415","brand:wikipedia":"en:Best Buy",name:"Best Buy",shop:"electronics"},terms:[],matchScore:2,suggestion:true},"shop/electronics/Boulanger":{name:"Boulanger",icon:"fas-plug",imageURL:"https://graph.facebook.com/Boulanger.Electromenager.Multimedia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2921695",shop:"electronics"},addTags:{brand:"Boulanger","brand:wikidata":"Q2921695","brand:wikipedia":"fr:Boulanger (entreprise)",name:"Boulanger",shop:"electronics"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/electronics/CeX":{name:"CeX",icon:"fas-plug",imageURL:"https://graph.facebook.com/CeX/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5055676",shop:"electronics"},addTags:{brand:"CeX","brand:wikidata":"Q5055676","brand:wikipedia":"en:CeX (company)",name:"CeX",shop:"electronics"},countryCodes:["au","es","gb","ie","in","it","mx","nl","pl","pt"],terms:[],matchScore:2,suggestion:true},"shop/electronics/Currys":{name:"Currys",icon:"fas-plug",imageURL:"https://graph.facebook.com/curryspcworld/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3246464",shop:"electronics"},addTags:{brand:"Currys","brand:wikidata":"Q3246464","brand:wikipedia":"en:Currys",name:"Currys",shop:"electronics"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/electronics/Currys PC World":{name:"Currys PC World",icon:"fas-plug",imageURL:"https://graph.facebook.com/curryspcworld/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7118727",shop:"electronics"},addTags:{brand:"Currys PC World","brand:wikidata":"Q7118727","brand:wikipedia":"en:PC World (retailer)",name:"Currys PC World",shop:"electronics"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/electronics/Darty":{name:"Darty",icon:"fas-plug",imageURL:"https://graph.facebook.com/darty/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3117381",shop:"electronics"},addTags:{brand:"Darty","brand:wikidata":"Q3117381","brand:wikipedia":"en:Groupe Fnac Darty",name:"Darty",shop:"electronics"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/electronics/Elektra":{name:"Elektra",icon:"fas-plug",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FMural%20Elektra.JPG&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1142753",shop:"electronics"},addTags:{brand:"Elektra","brand:wikidata":"Q1142753","brand:wikipedia":"es:Grupo Elektra",name:"Elektra",shop:"electronics"},countryCodes:["gt","hn","pa","pe","sv"],terms:[],matchScore:2,suggestion:true},"shop/electronics/Elgiganten":{name:"Elgiganten",icon:"fas-plug",imageURL:"https://graph.facebook.com/elgiganten.dk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17050121",shop:"electronics"},addTags:{brand:"Elgiganten","brand:wikidata":"Q17050121","brand:wikipedia":"en:Elgiganten",name:"Elgiganten",shop:"electronics"},countryCodes:["dk","se"],terms:[],matchScore:2,suggestion:true},"shop/electronics/Euronics":{name:"Euronics",icon:"fas-plug",imageURL:"https://graph.facebook.com/EuronicsItalia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q184860",shop:"electronics"},addTags:{brand:"Euronics","brand:wikidata":"Q184860","brand:wikipedia":"en:Euronics",name:"Euronics",shop:"electronics"},terms:[],matchScore:2,suggestion:true},"shop/electronics/Expert":{name:"Expert",icon:"fas-plug",imageURL:"https://graph.facebook.com/expert.de/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q680990",shop:"electronics"},addTags:{brand:"Expert","brand:wikidata":"Q680990","brand:wikipedia":"en:Expert (company)",name:"Expert",shop:"electronics"},terms:[],matchScore:2,suggestion:true},"shop/electronics/Gigantti":{name:"Gigantti",icon:"fas-plug",geometry:["point","area"],tags:{"brand:wikidata":"Q42512186",shop:"electronics"},addTags:{brand:"Gigantti","brand:wikidata":"Q42512186","brand:wikipedia":"fi:Gigantti (tavarataloketju)",name:"Gigantti",shop:"electronics"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"shop/electronics/Hartlauer":{name:"Hartlauer",icon:"fas-plug",imageURL:"https://graph.facebook.com/loewennews/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1587223",shop:"electronics"},addTags:{brand:"Hartlauer","brand:wikidata":"Q1587223","brand:wikipedia":"de:Hartlauer",name:"Hartlauer",shop:"electronics"},countryCodes:["at"],terms:[],matchScore:2,suggestion:true},"shop/electronics/Interdiscount":{name:"Interdiscount",icon:"fas-plug",imageURL:"https://graph.facebook.com/interdiscount/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1665980",shop:"electronics"},addTags:{brand:"Interdiscount","brand:wikidata":"Q1665980","brand:wikipedia":"de:Interdiscount",name:"Interdiscount",shop:"electronics"},countryCodes:["ch"],terms:[],matchScore:2,suggestion:true},"shop/electronics/JB Hi-Fi":{name:"JB Hi-Fi",icon:"fas-plug",imageURL:"https://graph.facebook.com/JBHiFi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3310113",shop:"electronics"},addTags:{brand:"JB Hi-Fi","brand:wikidata":"Q3310113","brand:wikipedia":"en:JB Hi-Fi",name:"JB Hi-Fi",shop:"electronics"},countryCodes:["au","nz"],terms:[],matchScore:2,suggestion:true},"shop/electronics/Jaycar":{name:"Jaycar",icon:"fas-plug",geometry:["point","area"],tags:{"brand:wikidata":"Q6167713",shop:"electronics"},addTags:{brand:"Jaycar","brand:wikidata":"Q6167713","brand:wikipedia":"en:Jaycar",name:"Jaycar",shop:"electronics"},countryCodes:["au","nz"],terms:[],matchScore:2,suggestion:true},"shop/electronics/Kjell & Company":{name:"Kjell & Company",icon:"fas-plug",imageURL:"https://graph.facebook.com/kjellcoSverige/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6419332",shop:"electronics"},addTags:{brand:"Kjell & Company","brand:wikidata":"Q6419332","brand:wikipedia":"en:Kjell & Company",name:"Kjell & Company",shop:"electronics"},countryCodes:["no","se"],terms:["kjell och company"],matchScore:2,suggestion:true},"shop/electronics/Komputronik":{name:"Komputronik",icon:"fas-plug",imageURL:"https://graph.facebook.com/komputronik/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11742085",shop:"electronics"},addTags:{brand:"Komputronik","brand:wikidata":"Q11742085","brand:wikipedia":"pl:Komputronik",name:"Komputronik",shop:"electronics"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/electronics/La Curacao":{name:"La Curacao",icon:"fas-plug",imageURL:"https://graph.facebook.com/CuracaoUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5194599",shop:"electronics"},addTags:{brand:"La Curacao","brand:wikidata":"Q5194599","brand:wikipedia":"en:Curacao (retail store)",name:"La Curacao",shop:"electronics"},terms:[],matchScore:2,suggestion:true},"shop/electronics/Maplin":{name:"Maplin",icon:"fas-plug",imageURL:"https://graph.facebook.com/Maplin/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6754124",shop:"electronics"},addTags:{brand:"Maplin","brand:wikidata":"Q6754124","brand:wikipedia":"en:Maplin (retailer)",name:"Maplin",shop:"electronics"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/electronics/Media Expert":{name:"Media Expert",icon:"fas-plug",imageURL:"https://graph.facebook.com/mediaexpert/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11776794",shop:"electronics"},addTags:{brand:"Media Expert","brand:wikidata":"Q11776794","brand:wikipedia":"pl:Media Expert",name:"Media Expert",shop:"electronics"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/electronics/Media Markt":{name:"Media Markt",icon:"fas-plug",imageURL:"https://graph.facebook.com/mediamarkt/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2381223",shop:"electronics"},addTags:{brand:"Media Markt","brand:wikidata":"Q2381223","brand:wikipedia":"en:Media Markt",name:"Media Markt",shop:"electronics"},terms:[],matchScore:2,suggestion:true},"shop/electronics/Medimax":{name:"Medimax",icon:"fas-plug",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FMEDIMAX%20Logo-cmyk%20mit%20Claim.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q62872450",shop:"electronics"},addTags:{brand:"Medimax","brand:wikidata":"Q62872450",name:"Medimax",shop:"electronics"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/electronics/Musimundo":{name:"Musimundo",icon:"fas-plug",imageURL:"https://graph.facebook.com/musimundo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6034719",shop:"electronics"},addTags:{brand:"Musimundo","brand:wikidata":"Q6034719","brand:wikipedia":"es:Musimundo",name:"Musimundo",shop:"electronics"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"shop/electronics/Neonet":{name:"Neonet",icon:"fas-plug",imageURL:"https://graph.facebook.com/Neonetpl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11790622",shop:"electronics"},addTags:{brand:"Neonet","brand:wikidata":"Q11790622","brand:wikipedia":"pl:Neonet",name:"Neonet",shop:"electronics"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/electronics/RTV Euro AGD":{name:"RTV Euro AGD",icon:"fas-plug",imageURL:"https://graph.facebook.com/rtveuroagd/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7277895",shop:"electronics"},addTags:{brand:"RTV Euro AGD","brand:wikidata":"Q7277895","brand:wikipedia":"pl:RTV Euro AGD",name:"RTV Euro AGD",shop:"electronics"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/electronics/RadioShack":{name:"RadioShack",icon:"fas-plug",imageURL:"https://graph.facebook.com/RadioShack/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1195490",shop:"electronics"},addTags:{brand:"RadioShack","brand:wikidata":"Q1195490","brand:wikipedia":"en:RadioShack",name:"RadioShack",shop:"electronics"},terms:[],matchScore:2,suggestion:true},"shop/electronics/Samsung":{name:"Samsung",icon:"fas-plug",imageURL:"https://graph.facebook.com/SamsungNewsroom/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q20718",shop:"electronics"},addTags:{brand:"Samsung","brand:wikidata":"Q20718","brand:wikipedia":"en:Samsung Electronics",name:"Samsung",shop:"electronics"},terms:[],matchScore:2,suggestion:true},"shop/electronics/Saturn":{name:"Saturn",icon:"fas-plug",imageURL:"https://graph.facebook.com/SaturnDE/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2543504",shop:"electronics"},addTags:{brand:"Saturn","brand:wikidata":"Q2543504","brand:wikipedia":"en:Saturn (retailer)",name:"Saturn",shop:"electronics"},countryCodes:["at","de","lu","pl"],terms:[],matchScore:2,suggestion:true},"shop/electronics/Sony":{name:"Sony",icon:"fas-plug",imageURL:"https://graph.facebook.com/sony.jpn/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q41187",shop:"electronics"},addTags:{brand:"Sony","brand:wikidata":"Q41187","brand:wikipedia":"en:Sony",name:"Sony",shop:"electronics"},terms:[],matchScore:2,suggestion:true},"shop/electronics/Teknikmagasinet":{name:"Teknikmagasinet",icon:"fas-plug",imageURL:"https://graph.facebook.com/TeknikmagasinetNorge/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3357520",shop:"electronics"},addTags:{brand:"Teknikmagasinet","brand:wikidata":"Q3357520","brand:wikipedia":"en:Teknikmagasinet",name:"Teknikmagasinet",shop:"electronics"},countryCodes:["fi","no","se"],terms:[],matchScore:2,suggestion:true},"shop/electronics/The Good Guys":{name:"The Good Guys",icon:"fas-plug",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FThe%20Good%20Guys%20Logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q7737217",shop:"electronics"},addTags:{brand:"The Good Guys","brand:wikidata":"Q7737217","brand:wikipedia":"en:The Good Guys (Australian company)",name:"The Good Guys",shop:"electronics"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"shop/electronics/The Source":{name:"The Source",icon:"fas-plug",imageURL:"https://graph.facebook.com/thesourcecanada/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3212934",shop:"electronics"},addTags:{brand:"The Source","brand:wikidata":"Q3212934","brand:wikipedia":"en:The Source (retailer)",name:"The Source",shop:"electronics"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/electronics/Unieuro":{name:"Unieuro",icon:"fas-plug",imageURL:"https://graph.facebook.com/unieuro/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4004687",shop:"electronics"},addTags:{brand:"Unieuro","brand:wikidata":"Q4004687","brand:wikipedia":"en:Unieuro",name:"Unieuro",shop:"electronics"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"shop/electronics/Worten":{name:"Worten",icon:"fas-plug",imageURL:"https://graph.facebook.com/WortenES/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10394039",shop:"electronics"},addTags:{brand:"Worten","brand:wikidata":"Q10394039","brand:wikipedia":"pt:Worten",name:"Worten",shop:"electronics"},countryCodes:["es","pt"],terms:[],matchScore:2,suggestion:true},"shop/electronics/b8ta":{name:"b8ta",icon:"fas-plug",imageURL:"https://graph.facebook.com/b8ta/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q55604609",shop:"electronics"},addTags:{brand:"b8ta","brand:wikidata":"Q55604609","brand:wikipedia":"en:B8ta",name:"b8ta",shop:"electronics"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/electronics/М.Видео":{name:"М.Видео",icon:"fas-plug",imageURL:"https://graph.facebook.com/mvideo.ru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6558800",shop:"electronics"},addTags:{brand:"М.Видео","brand:en":"M.video","brand:wikidata":"Q6558800","brand:wikipedia":"en:M.video",name:"М.Видео","name:en":"M.video",shop:"electronics"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/electronics/Фокстрот":{name:"Фокстрот",icon:"fas-plug",imageURL:"https://graph.facebook.com/foxtrotinfo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16721578",shop:"electronics"},addTags:{brand:"Фокстрот","brand:wikidata":"Q16721578","brand:wikipedia":"uk:Фокстрот (торгова мережа)",name:"Фокстрот",shop:"electronics"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"shop/electronics/Эльдорадо":{name:"Эльдорадо",icon:"fas-plug",imageURL:"https://graph.facebook.com/Eldorado.Stores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4531492",shop:"electronics"},addTags:{brand:"Эльдорадо","brand:wikidata":"Q4531492","brand:wikipedia":"ru:Эльдорадо (сеть магазинов)",name:"Эльдорадо",shop:"electronics"},countryCodes:["ru","ua"],terms:[],matchScore:2,suggestion:true},"shop/electronics/エディオン":{name:"エディオン",icon:"fas-plug",imageURL:"https://graph.facebook.com/edion.jp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11290252",shop:"electronics"},addTags:{brand:"エディオン","brand:en":"EDION","brand:ja":"エディオン","brand:wikidata":"Q11290252","brand:wikipedia":"ja:エディオン",name:"エディオン","name:en":"EDION","name:ja":"エディオン",shop:"electronics"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/electronics/ケーズデンキ":{name:"ケーズデンキ",icon:"fas-plug",imageURL:"https://graph.facebook.com/ksdenki20180125/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6322472",shop:"electronics"},addTags:{brand:"ケーズデンキ","brand:en":"K's Denki","brand:ja":"ケーズデンキ","brand:wikidata":"Q6322472","brand:wikipedia":"ja:ケーズホールディングス",name:"ケーズデンキ","name:en":"K's Denki","name:ja":"ケーズデンキ",shop:"electronics"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/electronics/コジマ":{name:"コジマ",icon:"fas-plug",imageURL:"https://graph.facebook.com/kojima.official/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11302052",shop:"electronics"},addTags:{brand:"コジマ","brand:en":"Kojima","brand:ja":"コジマ","brand:wikidata":"Q11302052","brand:wikipedia":"ja:コジマ",name:"コジマ","name:en":"Kojima","name:ja":"コジマ",shop:"electronics"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/electronics/ソフマップ":{name:"ソフマップ",icon:"fas-plug",imageURL:"https://pbs.twimg.com/profile_images/1073173217404043266/fIyrfOW-_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q7553789",shop:"electronics"},addTags:{brand:"ソフマップ","brand:en":"Sofmap","brand:ja":"ソフマップ","brand:wikidata":"Q7553789","brand:wikipedia":"ja:ソフマップ",name:"ソフマップ","name:en":"Sofmap","name:ja":"ソフマップ",shop:"electronics"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/electronics/ビックカメラ":{name:"ビックカメラ",icon:"fas-plug",imageURL:"https://graph.facebook.com/biccamera.page/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4903531",shop:"electronics"},addTags:{brand:"ビックカメラ","brand:en":"Bic Camera","brand:ja":"ビックカメラ","brand:wikidata":"Q4903531","brand:wikipedia":"ja:ビックカメラ",name:"ビックカメラ","name:en":"Bic Camera","name:ja":"ビックカメラ",shop:"electronics"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/electronics/ヤマダ電機":{name:"ヤマダ電機",icon:"fas-plug",imageURL:"https://graph.facebook.com/YAMADA.DENKI/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1096390",shop:"electronics"},addTags:{brand:"ヤマダ電機","brand:en":"Yamada Denki","brand:ja":"ヤマダ電機","brand:wikidata":"Q1096390","brand:wikipedia":"en:Yamada Denki",name:"ヤマダ電機","name:en":"Yamada Denki","name:ja":"ヤマダ電機",shop:"electronics"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/electronics/ヨドバシカメラ":{name:"ヨドバシカメラ",icon:"fas-plug",imageURL:"https://pbs.twimg.com/profile_images/875976284915892225/JAIY0yvm_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q168467",shop:"electronics"},addTags:{brand:"ヨドバシカメラ","brand:en":"Yodobashi Camera","brand:ja":"ヨドバシカメラ","brand:wikidata":"Q168467","brand:wikipedia":"ja:ヨドバシカメラ",name:"ヨドバシカメラ","name:en":"Yodobashi Camera","name:ja":"ヨドバシカメラ",shop:"electronics"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/electronics/全國電子":{name:"全國電子",icon:"fas-plug",imageURL:"https://graph.facebook.com/elifemall.com.tw/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10891540",shop:"electronics"},addTags:{brand:"全國電子","brand:en":"E-life Mall","brand:wikidata":"Q10891540","brand:wikipedia":"zh:全國電子",name:"全國電子","name:en":"E-life Mall",shop:"electronics"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"shop/electronics/燦坤3C":{name:"燦坤3C",icon:"fas-plug",imageURL:"https://graph.facebook.com/tkec520/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11569285",shop:"electronics"},addTags:{brand:"燦坤3C","brand:en":"Tsannkuen 3C","brand:wikidata":"Q11569285","brand:wikipedia":"zh:燦坤",name:"燦坤3C","name:en":"Tsannkuen 3C",shop:"electronics"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"shop/erotic/Ann Summers":{name:"Ann Summers",icon:"maki-shop",imageURL:"https://pbs.twimg.com/profile_images/1104069397008789504/jN1FCnL5_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q579524",shop:"erotic"},addTags:{brand:"Ann Summers","brand:wikidata":"Q579524","brand:wikipedia":"en:Ann Summers",name:"Ann Summers",shop:"erotic"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/erotic/Orion":{name:"Orion",icon:"maki-shop",imageURL:"https://pbs.twimg.com/profile_images/807193082244505600/DWoJxqGu_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q1609577",shop:"erotic"},addTags:{brand:"Orion","brand:wikidata":"Q1609577","brand:wikipedia":"de:Orion (Erotik)",name:"Orion",shop:"erotic"},countryCodes:["at","de"],terms:[],matchScore:2,suggestion:true},"shop/fabric/Mondial Tissus":{name:"Mondial Tissus",icon:"fas-tape",imageURL:"https://graph.facebook.com/MondialTissus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17635288",shop:"fabric"},addTags:{brand:"Mondial Tissus","brand:wikidata":"Q17635288","brand:wikipedia":"fr:Mondial Tissus",name:"Mondial Tissus",shop:"fabric"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/fashion_accessories/Brighton Collectibles":{name:"Brighton Collectibles",icon:"maki-shop",imageURL:"https://graph.facebook.com/BrightonCollectibles/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4967623",shop:"fashion_accessories"},addTags:{brand:"Brighton Collectibles","brand:wikidata":"Q4967623","brand:wikipedia":"en:Brighton Collectibles",name:"Brighton Collectibles",shop:"fashion_accessories"},countryCodes:["us"],terms:["brighton"],matchScore:2,suggestion:true},"shop/fashion_accessories/Bvlgari":{name:"Bvlgari",icon:"maki-shop",imageURL:"https://graph.facebook.com/Bulgari/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q752515",shop:"fashion_accessories"},addTags:{brand:"Bulgari","brand:wikidata":"Q752515","brand:wikipedia":"en:Bulgari",name:"Bvlgari",shop:"fashion_accessories"},terms:["bulgari"],matchScore:2,suggestion:true},"shop/fashion_accessories/Claire's":{name:"Claire's",icon:"maki-shop",imageURL:"https://graph.facebook.com/claires/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2974996",shop:"fashion_accessories"},addTags:{brand:"Claire's","brand:wikidata":"Q2974996","brand:wikipedia":"en:Claire's",name:"Claire's",shop:"fashion_accessories"},terms:[],matchScore:2,suggestion:true},"shop/fashion_accessories/Jimmy Choo":{name:"Jimmy Choo",icon:"maki-shop",imageURL:"https://graph.facebook.com/JimmyChoo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5213855",shop:"fashion_accessories"},addTags:{brand:"Jimmy Choo","brand:wikidata":"Q5213855","brand:wikipedia":"en:Jimmy Choo Ltd",name:"Jimmy Choo",shop:"fashion_accessories"},terms:[],matchScore:2,suggestion:true},"shop/fashion_accessories/Prada":{name:"Prada",icon:"maki-shop",imageURL:"https://graph.facebook.com/Prada/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q193136",shop:"fashion_accessories"},addTags:{brand:"Prada","brand:wikidata":"Q193136","brand:wikipedia":"en:Prada",name:"Prada",shop:"fashion_accessories"},terms:[],matchScore:2,suggestion:true},"shop/fashion_accessories/Salvatore Ferragamo":{name:"Salvatore Ferragamo",icon:"maki-shop",imageURL:"https://graph.facebook.com/SalvatoreFerragamo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3946053",shop:"fashion_accessories"},addTags:{brand:"Salvatore Ferragamo","brand:wikidata":"Q3946053","brand:wikipedia":"en:Salvatore Ferragamo S.p.A.",name:"Salvatore Ferragamo",shop:"fashion_accessories"},terms:[],matchScore:2,suggestion:true},"shop/fashion_accessories/Van Cleef & Arpels":{name:"Van Cleef & Arpels",icon:"maki-shop",imageURL:"https://graph.facebook.com/vancleef.arpels/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2708181",shop:"fashion_accessories"},addTags:{brand:"Van Cleef & Arpels","brand:wikidata":"Q2708181","brand:wikipedia":"en:Van Cleef & Arpels",name:"Van Cleef & Arpels",shop:"fashion_accessories"},terms:["van cleef & arples","van cleef and arpels","van cleef and arples"],matchScore:2,suggestion:true},"shop/florist/Blume 2000":{name:"Blume 2000",icon:"maki-florist",imageURL:"https://graph.facebook.com/Blume2000.de/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q886166",shop:"florist"},addTags:{brand:"Blume 2000","brand:wikidata":"Q886166","brand:wikipedia":"de:Blume 2000",name:"Blume 2000",shop:"florist"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/florist/Blumen Risse":{name:"Blumen Risse",icon:"maki-florist",imageURL:"https://graph.facebook.com/BlumenRisse/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q886177",shop:"florist"},addTags:{brand:"Blumen Risse","brand:wikidata":"Q886177","brand:wikipedia":"de:Blumen Risse",name:"Blumen Risse",shop:"florist"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/florist/Interflora":{name:"Interflora",icon:"maki-florist",imageURL:"https://graph.facebook.com/Interflora.France/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q692179",shop:"florist"},addTags:{brand:"Interflora","brand:wikidata":"Q692179","brand:wikipedia":"en:Interflora",name:"Interflora",shop:"florist"},countryCodes:["fr","gb","no","se"],terms:[],matchScore:2,suggestion:true},"shop/florist/Monceau Fleurs":{name:"Monceau Fleurs",icon:"maki-florist",imageURL:"https://graph.facebook.com/Monceau.Fleurs.France/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17629431",shop:"florist"},addTags:{brand:"Monceau Fleurs","brand:wikidata":"Q17629431","brand:wikipedia":"fr:Emova Group",name:"Monceau Fleurs",shop:"florist"},countryCodes:["be","fr"],terms:[],matchScore:2,suggestion:true},"shop/frozen_food/Picard":{name:"Picard",icon:"maki-shop",imageURL:"https://graph.facebook.com/picardsurgeles/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3382454",shop:"frozen_food"},addTags:{brand:"Picard","brand:wikidata":"Q3382454","brand:wikipedia":"en:Picard Surgelés",name:"Picard",shop:"frozen_food"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/funeral_directors/PFG":{name:"PFG",icon:"maki-cemetery",geometry:["point","area"],tags:{"brand:wikidata":"Q3396087",shop:"funeral_directors"},addTags:{brand:"PFG","brand:wikidata":"Q3396087","brand:wikipedia":"fr:Pompes funèbres générales",name:"PFG",official_name:"Pompes Funèbres Générales",shop:"funeral_directors"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/funeral_directors/Roblot":{name:"Roblot",icon:"maki-cemetery",geometry:["point","area"],tags:{"brand:wikidata":"Q63247414",shop:"funeral_directors"},addTags:{brand:"Roblot","brand:wikidata":"Q63247414",name:"Roblot",shop:"funeral_directors"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/funeral_directors/Roc-Eclerc":{name:"Roc-Eclerc",icon:"maki-cemetery",imageURL:"https://graph.facebook.com/grouperoceclerc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62558102",shop:"funeral_directors"},addTags:{brand:"Roc-Eclerc","brand:wikidata":"Q62558102",name:"Roc-Eclerc",shop:"funeral_directors"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/funeral_directors/The Co-operative Funeralcare":{name:"The Co-operative Funeralcare",icon:"maki-cemetery",imageURL:"https://pbs.twimg.com/profile_images/1034361261193134080/1PfqKyVV_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q7726521",shop:"funeral_directors"},addTags:{brand:"The Co-operative Funeralcare","brand:wikidata":"Q7726521","brand:wikipedia":"en:Co-op Funeralcare",name:"The Co-operative Funeralcare",shop:"funeral_directors"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Aaron's":{name:"Aaron's",icon:"fas-couch",imageURL:"https://graph.facebook.com/aaronsinc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10397787",shop:"furniture"},addTags:{brand:"Aaron's","brand:wikidata":"Q10397787","brand:wikipedia":"en:Aaron's, Inc.",name:"Aaron's",shop:"furniture"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/furniture/American Signature Furniture":{name:"American Signature Furniture",icon:"fas-couch",imageURL:"https://graph.facebook.com/AmericanSignatureFurnitureUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63859411",shop:"furniture"},addTags:{brand:"American Signature Furniture","brand:wikidata":"Q63859411",name:"American Signature Furniture",shop:"furniture"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Arhaus":{name:"Arhaus",icon:"fas-couch",imageURL:"https://graph.facebook.com/44947264751/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q35689887",shop:"furniture"},addTags:{brand:"Arhaus","brand:wikidata":"Q35689887","brand:wikipedia":"en:Arhaus",name:"Arhaus",shop:"furniture"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Ashley HomeStore":{name:"Ashley HomeStore",icon:"fas-couch",imageURL:"https://graph.facebook.com/AshleyHomeStore/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4805437",shop:"furniture"},addTags:{alt_name:"Ashley Furniture",brand:"Ashley HomeStore","brand:wikidata":"Q4805437","brand:wikipedia":"en:Ashley HomeStore",name:"Ashley HomeStore",shop:"furniture"},countryCodes:["ca","us"],terms:["ashley furniture homestore"],matchScore:2,suggestion:true},"shop/furniture/Asko":{name:"Asko",icon:"fas-couch",geometry:["point","area"],tags:{"brand:wikidata":"Q11853132",shop:"furniture"},addTags:{brand:"Asko","brand:wikidata":"Q11853132","brand:wikipedia":"fi:Asko",name:"Asko",shop:"furniture"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Askona":{name:"Askona",icon:"fas-couch",imageURL:"https://graph.facebook.com/AskonaRu/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4071319",shop:"furniture"},addTags:{brand:"Askona","brand:wikidata":"Q4071319","brand:wikipedia":"ru:Аскона (компания)",name:"Askona",shop:"furniture"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Black Red White":{name:"Black Red White",icon:"fas-couch",imageURL:"https://graph.facebook.com/BlackRedWhitePL/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4921546",shop:"furniture"},addTags:{brand:"Black Red White","brand:wikidata":"Q4921546","brand:wikipedia":"en:Black Red White",name:"Black Red White",shop:"furniture"},terms:[],matchScore:2,suggestion:true},"shop/furniture/BoConcept":{name:"BoConcept",icon:"fas-couch",imageURL:"https://graph.facebook.com/boconceptusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11338915",shop:"furniture"},addTags:{brand:"BoConcept","brand:wikidata":"Q11338915","brand:wikipedia":"en:BoConcept",name:"BoConcept",shop:"furniture"},terms:[],matchScore:2,suggestion:true},"shop/furniture/Bob's Discount Furniture":{name:"Bob's Discount Furniture",icon:"fas-couch",imageURL:"https://graph.facebook.com/mybobs/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4931582",shop:"furniture"},addTags:{brand:"Bob's Discount Furniture","brand:wikidata":"Q4931582","brand:wikipedia":"en:Bob's Discount Furniture",name:"Bob's Discount Furniture",shop:"furniture"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Bodzio":{name:"Bodzio",icon:"fas-couch",imageURL:"https://graph.facebook.com/FabrykaMebliBodzio/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q20034845",shop:"furniture"},addTags:{brand:"Bodzio","brand:wikidata":"Q20034845","brand:wikipedia":"pl:Fabryka Mebli Bodzio",name:"Bodzio",shop:"furniture"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/furniture/But":{name:"But",icon:"fas-couch",imageURL:"https://graph.facebook.com/but/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q18720442",shop:"furniture"},addTags:{brand:"But","brand:wikidata":"Q18720442","brand:wikipedia":"en:BUT (retailer)",name:"But",shop:"furniture"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Cabinets To Go":{name:"Cabinets To Go",icon:"fas-couch",imageURL:"https://graph.facebook.com/CabinetsToGo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q25245346",shop:"furniture"},addTags:{brand:"Cabinets To Go","brand:wikidata":"Q25245346","brand:wikipedia":"en:Cabinets To Go",name:"Cabinets To Go",shop:"furniture"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Conforama":{name:"Conforama",icon:"fas-couch",imageURL:"https://graph.facebook.com/Conforama/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q541134",shop:"furniture"},addTags:{brand:"Conforama","brand:wikidata":"Q541134","brand:wikipedia":"en:Conforama",name:"Conforama",shop:"furniture"},countryCodes:["ch","es","fr","it"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Crate & Barrel":{name:"Crate & Barrel",icon:"fas-couch",imageURL:"https://graph.facebook.com/crateandbarrel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5182604",shop:"furniture"},addTags:{brand:"Crate & Barrel","brand:wikidata":"Q5182604","brand:wikipedia":"en:Crate & Barrel",name:"Crate & Barrel",shop:"furniture"},countryCodes:["us"],terms:["crate and barrel"],matchScore:2,suggestion:true},"shop/furniture/DFS":{name:"DFS",icon:"fas-couch",imageURL:"https://graph.facebook.com/DFSUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5204927",shop:"furniture"},addTags:{brand:"DFS","brand:wikidata":"Q5204927","brand:wikipedia":"en:DFS Furniture",name:"DFS",shop:"furniture"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Dänisches Bettenlager":{name:"Dänisches Bettenlager",icon:"fas-couch",imageURL:"https://graph.facebook.com/JYSK.dk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q138913",shop:"furniture"},addTags:{brand:"Dänisches Bettenlager","brand:wikidata":"Q138913","brand:wikipedia":"en:Jysk (store)",name:"Dänisches Bettenlager",shop:"furniture"},countryCodes:["at","de"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Ethan Allen":{name:"Ethan Allen",icon:"fas-couch",imageURL:"https://graph.facebook.com/ethanallendesign/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5402870",shop:"furniture"},addTags:{brand:"Ethan Allen","brand:wikidata":"Q5402870","brand:wikipedia":"en:Ethan Allen (furniture company)",name:"Ethan Allen",shop:"furniture"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Fly":{name:"Fly",icon:"fas-couch",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FFly-Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1389184",shop:"furniture"},addTags:{brand:"Fly","brand:wikidata":"Q1389184","brand:wikipedia":"fr:Fly (entreprise)",name:"Fly",shop:"furniture"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Freedom":{name:"Freedom",icon:"fas-couch",imageURL:"https://graph.facebook.com/freedomAU/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5500546",shop:"furniture"},addTags:{brand:"Freedom","brand:wikidata":"Q5500546","brand:wikipedia":"en:Freedom Furniture",name:"Freedom",shop:"furniture"},countryCodes:["au"],terms:["freedom furniture"],matchScore:2,suggestion:true},"shop/furniture/HSL":{name:"HSL",icon:"fas-couch",imageURL:"https://graph.facebook.com/hslchairs/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64284324",shop:"furniture"},addTags:{brand:"HSL","brand:wikidata":"Q64284324",name:"HSL",official_name:"High Seat Limited",shop:"furniture"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Harveys":{name:"Harveys",icon:"fas-couch",imageURL:"https://graph.facebook.com/harveysfurniture/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5677754",shop:"furniture"},addTags:{brand:"Harveys","brand:wikidata":"Q5677754","brand:wikipedia":"en:Harveys Furniture",name:"Harveys",shop:"furniture"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Havertys":{name:"Havertys",icon:"fas-couch",imageURL:"https://pbs.twimg.com/profile_images/672434576397062144/tX39o3Bz_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q5683881",shop:"furniture"},addTags:{brand:"Havertys","brand:wikidata":"Q5683881","brand:wikipedia":"en:Havertys",name:"Havertys",shop:"furniture"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/furniture/IKEA":{name:"IKEA",icon:"fas-couch",imageURL:"https://graph.facebook.com/IKEA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q54078",shop:"furniture"},addTags:{brand:"IKEA","brand:wikidata":"Q54078","brand:wikipedia":"en:IKEA",name:"IKEA",shop:"furniture"},terms:[],matchScore:2,suggestion:true},"shop/furniture/Isku":{name:"Isku",icon:"fas-couch",imageURL:"https://graph.facebook.com/iskuinteriorofficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11865127",shop:"furniture"},addTags:{brand:"Isku","brand:wikidata":"Q11865127","brand:wikipedia":"fi:Isku (yritys)",name:"Isku",shop:"furniture"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"shop/furniture/JYSK":{name:"JYSK",icon:"fas-couch",imageURL:"https://graph.facebook.com/JYSK.dk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q138913",shop:"furniture"},addTags:{brand:"JYSK","brand:wikidata":"Q138913","brand:wikipedia":"en:Jysk (store)",name:"JYSK",shop:"furniture"},terms:[],matchScore:2,suggestion:true},"shop/furniture/Kwantum":{name:"Kwantum",icon:"fas-couch",imageURL:"https://graph.facebook.com/KwantumNL/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2262591",shop:"furniture"},addTags:{brand:"Kwantum","brand:wikidata":"Q2262591","brand:wikipedia":"nl:Kwantum (winkelketen)",name:"Kwantum",shop:"furniture"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/furniture/La-Z-Boy":{name:"La-Z-Boy",icon:"fas-couch",imageURL:"https://graph.facebook.com/lazboy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6391583",shop:"furniture"},addTags:{brand:"La-Z-Boy","brand:wikidata":"Q6391583","brand:wikipedia":"en:La-Z-Boy",name:"La-Z-Boy",shop:"furniture"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Leen Bakker":{name:"Leen Bakker",icon:"fas-couch",imageURL:"https://graph.facebook.com/leenbakker/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3333662",shop:"furniture"},addTags:{brand:"Leen Bakker","brand:wikidata":"Q3333662","brand:wikipedia":"nl:Leen Bakker",name:"Leen Bakker",shop:"furniture"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/furniture/LoveSac":{name:"LoveSac",icon:"fas-couch",imageURL:"https://graph.facebook.com/LoveSac/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6690181",shop:"furniture"},addTags:{brand:"LoveSac","brand:wikidata":"Q6690181","brand:wikipedia":"en:LoveSac",name:"LoveSac",shop:"furniture"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Maisons du Monde":{name:"Maisons du Monde",icon:"fas-couch",imageURL:"https://graph.facebook.com/maisonsdumondeus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3280364",shop:"furniture"},addTags:{brand:"Maisons du Monde","brand:wikidata":"Q3280364","brand:wikipedia":"fr:Maisons du Monde",name:"Maisons du Monde",shop:"furniture"},countryCodes:["be","ch","de","es","fr","gb","it","lu"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Möbelix":{name:"Möbelix",icon:"fas-couch",imageURL:"https://graph.facebook.com/moebelix.at/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q877547",shop:"furniture"},addTags:{brand:"Möbelix","brand:wikidata":"Q877547","brand:wikipedia":"hu:Möbelix",name:"Möbelix",shop:"furniture"},countryCodes:["at","cz","hu","sk"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Pottery Barn":{name:"Pottery Barn",icon:"fas-couch",imageURL:"https://graph.facebook.com/potterybarn/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3400126",shop:"furniture"},addTags:{brand:"Pottery Barn","brand:wikidata":"Q3400126","brand:wikipedia":"en:Pottery Barn",name:"Pottery Barn",shop:"furniture"},countryCodes:["au","ca","mx","ph","us"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Raymour & Flanigan":{name:"Raymour & Flanigan",icon:"fas-couch",imageURL:"https://graph.facebook.com/raymourandflanigan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7299290",shop:"furniture"},addTags:{brand:"Raymour & Flanigan","brand:wikidata":"Q7299290","brand:wikipedia":"en:Raymour & Flanigan",name:"Raymour & Flanigan",shop:"furniture"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Rent-A-Center":{name:"Rent-A-Center",icon:"fas-couch",imageURL:"https://graph.facebook.com/RentACenter/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7313497",shop:"furniture"},addTags:{brand:"Rent-A-Center","brand:wikidata":"Q7313497","brand:wikipedia":"en:Rent-A-Center",name:"Rent-A-Center",shop:"furniture"},countryCodes:["mx","us"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Restoration Hardware":{name:"Restoration Hardware",icon:"fas-couch",imageURL:"https://graph.facebook.com/791504884230356/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7316207",shop:"furniture"},addTags:{brand:"Restoration Hardware","brand:wikidata":"Q7316207","brand:wikipedia":"en:Restoration Hardware",name:"Restoration Hardware",shop:"furniture"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Roller":{name:"Roller",icon:"fas-couch",imageURL:"https://graph.facebook.com/ROLLER.Clever.einrichten/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1621286",shop:"furniture"},addTags:{brand:"Roller","brand:wikidata":"Q1621286","brand:wikipedia":"de:Roller (Möbelhaus)",name:"Roller",shop:"furniture"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Rooms To Go":{name:"Rooms To Go",icon:"fas-couch",imageURL:"https://graph.facebook.com/roomstogo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7366329",shop:"furniture"},addTags:{brand:"Rooms To Go","brand:wikidata":"Q7366329","brand:wikipedia":"en:Rooms To Go",name:"Rooms To Go",shop:"furniture"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/furniture/ScS":{name:"ScS",icon:"fas-couch",imageURL:"https://graph.facebook.com/scssofas/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q19654399",shop:"furniture"},addTags:{brand:"ScS","brand:wikidata":"Q19654399","brand:wikipedia":"en:ScS",name:"ScS",shop:"furniture"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/furniture/The Brick":{name:"The Brick",icon:"fas-couch",imageURL:"https://graph.facebook.com/TheBrick/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7720000",shop:"furniture"},addTags:{brand:"The Brick","brand:wikidata":"Q7720000","brand:wikipedia":"en:The Brick",name:"The Brick",shop:"furniture"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Urban Barn":{name:"Urban Barn",icon:"fas-couch",imageURL:"https://graph.facebook.com/urbanbarn/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62515207",shop:"furniture"},addTags:{brand:"Urban Barn","brand:wikidata":"Q62515207",name:"Urban Barn",shop:"furniture"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Value City Furniture":{name:"Value City Furniture",icon:"fas-couch",imageURL:"https://graph.facebook.com/ValueCityFurnitureUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63859417",shop:"furniture"},addTags:{brand:"Value City Furniture","brand:wikidata":"Q63859417",name:"Value City Furniture",shop:"furniture"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/furniture/İstikbal":{name:"İstikbal",icon:"fas-couch",imageURL:"https://graph.facebook.com/istikbal/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6031999",shop:"furniture"},addTags:{brand:"İstikbal","brand:wikidata":"Q6031999","brand:wikipedia":"tr:İstikbal",name:"İstikbal",shop:"furniture"},countryCodes:["tr"],terms:[],matchScore:2,suggestion:true},"shop/furniture/ニトリ":{name:"ニトリ",icon:"fas-couch",imageURL:"https://graph.facebook.com/nitori.jp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10801453",shop:"furniture"},addTags:{brand:"ニトリ","brand:en":"Nitori","brand:ja":"ニトリ","brand:wikidata":"Q10801453","brand:wikipedia":"en:Nitori",name:"ニトリ","name:en":"Nitori","name:ja":"ニトリ",shop:"furniture"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/games/Games Workshop":{name:"Games Workshop",icon:"fas-dice",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FGames%20Workshop%20Logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q587270",shop:"games"},addTags:{brand:"Games Workshop","brand:wikidata":"Q587270","brand:wikipedia":"en:Games Workshop",name:"Games Workshop",shop:"games"},countryCodes:["de","fr","gb","nl","us"],terms:[],matchScore:2,suggestion:true},"shop/garden_centre/Dehner":{name:"Dehner",icon:"maki-garden-centre",imageURL:"https://graph.facebook.com/dehner/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1183029",shop:"garden_centre"},addTags:{brand:"Dehner","brand:wikidata":"Q1183029","brand:wikipedia":"de:Dehner",name:"Dehner",shop:"garden_centre"},countryCodes:["at","de"],terms:[],matchScore:2,suggestion:true},"shop/garden_centre/Gamm Vert":{name:"Gamm Vert",icon:"maki-garden-centre",imageURL:"https://graph.facebook.com/gammvert.officiel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3095006",shop:"garden_centre"},addTags:{brand:"Gamm Vert","brand:wikidata":"Q3095006","brand:wikipedia":"fr:Gamm Vert",name:"Gamm Vert",shop:"garden_centre"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/garden_centre/Jardiland":{name:"Jardiland",icon:"maki-garden-centre",imageURL:"https://graph.facebook.com/Jardiland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3162276",shop:"garden_centre"},addTags:{brand:"Jardiland","brand:wikidata":"Q3162276","brand:wikipedia":"fr:Jardiland",name:"Jardiland",shop:"garden_centre"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/garden_centre/Point Vert":{name:"Point Vert",icon:"maki-garden-centre",imageURL:"https://graph.facebook.com/444739795728913/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16661975",shop:"garden_centre"},addTags:{brand:"Point Vert","brand:wikidata":"Q16661975","brand:wikipedia":"fr:Magasin vert",name:"Point Vert",shop:"garden_centre"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/garden_centre/Truffaut":{name:"Truffaut",icon:"maki-garden-centre",imageURL:"https://graph.facebook.com/truffautfr/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3162640",shop:"garden_centre"},addTags:{brand:"Truffaut","brand:wikidata":"Q3162640","brand:wikipedia":"fr:Jardineries Truffaut",name:"Truffaut",shop:"garden_centre"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/gas/Airgas":{name:"Airgas",icon:"maki-shop",imageURL:"https://graph.facebook.com/airgasusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q80635",shop:"gas"},addTags:{brand:"Airgas","brand:wikidata":"Q80635","brand:wikipedia":"en:Airgas",name:"Airgas",shop:"gas"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/gift/American Greetings":{name:"American Greetings",icon:"maki-gift",imageURL:"https://graph.facebook.com/AmericanGreetings/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q464767",shop:"gift"},addTags:{brand:"American Greetings","brand:wikidata":"Q464767","brand:wikipedia":"en:American Greetings",name:"American Greetings",shop:"gift"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/gift/Card Factory":{name:"Card Factory",icon:"maki-gift",imageURL:"https://graph.facebook.com/cardfactoryplc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5038192",shop:"gift"},addTags:{brand:"Card Factory","brand:wikidata":"Q5038192","brand:wikipedia":"en:Card Factory",name:"Card Factory",shop:"gift"},countryCodes:["gb","im"],terms:[],matchScore:2,suggestion:true},"shop/gift/Carlton Cards":{name:"Carlton Cards",icon:"maki-gift",imageURL:"https://graph.facebook.com/Carltoncards.ca/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5042968",shop:"gift"},addTags:{brand:"Carlton Cards","brand:wikidata":"Q5042968","brand:wikipedia":"en:Carlton Cards",name:"Carlton Cards",shop:"gift"},countryCodes:["ca"],terms:["carlton"],matchScore:2,suggestion:true},"shop/gift/Clintons":{name:"Clintons",icon:"maki-gift",imageURL:"https://graph.facebook.com/ClintonsUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5134299",shop:"gift"},addTags:{brand:"Clintons","brand:wikidata":"Q5134299","brand:wikipedia":"en:Clintons",name:"Clintons",shop:"gift"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/gift/Cracker Barrel":{name:"Cracker Barrel",icon:"maki-gift",imageURL:"https://graph.facebook.com/crackerbarrel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4492609",shop:"gift"},addTags:{brand:"Cracker Barrel","brand:wikidata":"Q4492609","brand:wikipedia":"en:Cracker Barrel",name:"Cracker Barrel",official_name:"Cracker Barrel Old Country Store",shop:"gift"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/gift/Disney Store":{name:"Disney Store",icon:"maki-gift",imageURL:"https://graph.facebook.com/shopdisney/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1047009",shop:"gift"},addTags:{brand:"Disney Store","brand:wikidata":"Q1047009","brand:wikipedia":"en:Disney Store",name:"Disney Store",shop:"gift"},countryCodes:["ca","fr","us"],terms:["the disney store"],matchScore:2,suggestion:true},"shop/gift/Edible Arrangements":{name:"Edible Arrangements",icon:"maki-gift",imageURL:"https://graph.facebook.com/ediblearrangements/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5337996",shop:"gift"},addTags:{brand:"Edible Arrangements","brand:wikidata":"Q5337996","brand:wikipedia":"en:Edible Arrangements",name:"Edible Arrangements",shop:"gift"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/gift/Hallmark":{name:"Hallmark",icon:"maki-gift",imageURL:"https://graph.facebook.com/Hallmark/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1521910",shop:"gift"},addTags:{brand:"Hallmark","brand:wikidata":"Q1521910","brand:wikipedia":"en:Hallmark Cards",name:"Hallmark",shop:"gift"},countryCodes:["ca","gb","us"],terms:["hallmark gold crown"],matchScore:2,suggestion:true},"shop/gift/Nanu-Nana":{name:"Nanu-Nana",icon:"maki-gift",imageURL:"https://graph.facebook.com/NanuNanaDE/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1720245",shop:"gift"},addTags:{brand:"Nanu-Nana","brand:wikidata":"Q1720245","brand:wikipedia":"de:Nanu-Nana",name:"Nanu-Nana",shop:"gift"},countryCodes:["at","de"],terms:[],matchScore:2,suggestion:true},"shop/gift/Papyrus":{name:"Papyrus",icon:"maki-gift",imageURL:"https://graph.facebook.com/papyrus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q28222692",shop:"gift"},addTags:{brand:"Papyrus","brand:wikidata":"Q28222692","brand:wikipedia":"en:Papyrus (company)",name:"Papyrus",shop:"gift"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/gift/Spencer's":{name:"Spencer's",icon:"maki-gift",imageURL:"https://graph.facebook.com/spencers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7576055",shop:"gift"},addTags:{brand:"Spencer Gifts","brand:wikidata":"Q7576055","brand:wikipedia":"en:Spencer Gifts",name:"Spencer's",official_name:"Spencer Gifts",shop:"gift"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/gift/Things Remembered":{name:"Things Remembered",icon:"maki-gift",imageURL:"https://graph.facebook.com/thingsremembered/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q54958287",shop:"gift"},addTags:{brand:"Things Remembered","brand:wikidata":"Q54958287","brand:wikipedia":"en:Things Remembered",name:"Things Remembered",shop:"gift"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/greengrocer/Produce Junction":{name:"Produce Junction",icon:"fas-carrot",imageURL:"https://graph.facebook.com/ProduceJunction/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q60583541",shop:"greengrocer"},addTags:{brand:"Produce Junction","brand:wikidata":"Q60583541",name:"Produce Junction",shop:"greengrocer"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/hairdresser_supply/Sally Beauty Supply":{name:"Sally Beauty Supply",icon:"maki-shop",imageURL:"https://graph.facebook.com/sallybeauty/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7405065",shop:"hairdresser_supply"},addTags:{brand:"Sally Beauty Supply","brand:wikidata":"Q7405065","brand:wikipedia":"en:Sally Beauty Holdings",name:"Sally Beauty Supply",shop:"hairdresser_supply"},countryCodes:["ca","mx","us"],terms:[],matchScore:2,suggestion:true},"shop/hairdresser/Camille Albane":{name:"Camille Albane",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/CamilleAlbane.Paris/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62965183",shop:"hairdresser"},addTags:{brand:"Camille Albane","brand:wikidata":"Q62965183",name:"Camille Albane",shop:"hairdresser"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/hairdresser/Cost Cutters":{name:"Cost Cutters",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/CostCutters/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62029366",shop:"hairdresser"},addTags:{brand:"Cost Cutters","brand:wikidata":"Q62029366",name:"Cost Cutters",shop:"hairdresser"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/hairdresser/Dessange":{name:"Dessange",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/DESSANGE.Paris/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62979914",shop:"hairdresser"},addTags:{brand:"Dessange","brand:wikidata":"Q62979914",name:"Dessange",shop:"hairdresser"},terms:[],matchScore:2,suggestion:true},"shop/hairdresser/Fantastic Sams":{name:"Fantastic Sams",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/fantasticsamscutandcolor/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5434222",shop:"hairdresser"},addTags:{brand:"Fantastic Sams","brand:wikidata":"Q5434222","brand:wikipedia":"en:Fantastic Sams",name:"Fantastic Sams",shop:"hairdresser"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/hairdresser/First Choice Haircutters":{name:"First Choice Haircutters",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/SignatureStyleSalons/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5452622",shop:"hairdresser"},addTags:{brand:"First Choice Haircutters","brand:wikidata":"Q5452622","brand:wikipedia":"en:First Choice Haircutters",name:"First Choice Haircutters",shop:"hairdresser"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/hairdresser/Franck Provost":{name:"Franck Provost",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/franck.provost.paris/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62805922",shop:"hairdresser"},addTags:{brand:"Franck Provost","brand:wikidata":"Q62805922","brand:wikipedia":"fr:Franck Provost (Salons de coiffure)",name:"Franck Provost",shop:"hairdresser"},countryCodes:["be","fr","pl"],terms:[],matchScore:2,suggestion:true},"shop/hairdresser/Great Clips":{name:"Great Clips",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/GreatClips/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5598967",shop:"hairdresser"},addTags:{brand:"Great Clips","brand:wikidata":"Q5598967","brand:wikipedia":"en:Great Clips",name:"Great Clips",shop:"hairdresser"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/hairdresser/Hair Cuttery":{name:"Hair Cuttery",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/haircuttery/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5639484",shop:"hairdresser"},addTags:{brand:"Hair Cuttery","brand:wikidata":"Q5639484","brand:wikipedia":"en:Hair Cuttery",name:"Hair Cuttery",shop:"hairdresser"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/hairdresser/Hair Express":{name:"Hair Express",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/hairexpressfriseur/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q57550814",shop:"hairdresser"},addTags:{brand:"Hair Express","brand:wikidata":"Q57550814",name:"Hair Express",shop:"hairdresser"},countryCodes:["de","us"],terms:[],matchScore:2,suggestion:true},"shop/hairdresser/Hairkiller":{name:"Hairkiller",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/hairkillerDetmold/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q58305998",shop:"hairdresser"},addTags:{brand:"Hairkiller","brand:wikidata":"Q58305998",name:"Hairkiller",shop:"hairdresser"},countryCodes:["at","de","lu"],terms:[],matchScore:2,suggestion:true},"shop/hairdresser/Jean Louis David":{name:"Jean Louis David",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/jean.louis.david.officiel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64445174",shop:"hairdresser"},addTags:{brand:"Jean Louis David","brand:wikidata":"Q64445174",name:"Jean Louis David",shop:"hairdresser"},countryCodes:["es","fr","it","pl"],terms:[],matchScore:2,suggestion:true},"shop/hairdresser/Klier":{name:"Klier",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/frisoerklier/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1465159",shop:"hairdresser"},addTags:{brand:"Klier","brand:wikidata":"Q1465159","brand:wikipedia":"de:Frisör Klier",name:"Klier",shop:"hairdresser"},countryCodes:["at","cz","de","sk"],terms:[],matchScore:2,suggestion:true},"shop/hairdresser/Klipp":{name:"Klipp",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/klipp.frisoer/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1737304",shop:"hairdresser"},addTags:{brand:"Klipp","brand:wikidata":"Q1737304","brand:wikipedia":"de:Klipp Frisör",name:"Klipp",shop:"hairdresser"},countryCodes:["at"],terms:[],matchScore:2,suggestion:true},"shop/hairdresser/Mastercuts":{name:"Mastercuts",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/MasterCuts/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64026258",shop:"hairdresser"},addTags:{brand:"Mastercuts","brand:wikidata":"Q64026258",name:"Mastercuts",shop:"hairdresser"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/hairdresser/Saint Algue":{name:"Saint Algue",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/saint.algue.officiel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62973210",shop:"hairdresser"},addTags:{brand:"Saint Algue","brand:wikidata":"Q62973210",name:"Saint Algue",shop:"hairdresser"},terms:[],matchScore:2,suggestion:true},"shop/hairdresser/Sport Clips":{name:"Sport Clips",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/SportClipsHaircuts/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7579310",shop:"hairdresser"},addTags:{brand:"Sport Clips","brand:wikidata":"Q7579310",name:"Sport Clips",shop:"hairdresser"},countryCodes:["ca","us"],terms:["sport clips haircuts"],matchScore:2,suggestion:true},"shop/hairdresser/Super Cut":{name:"Super Cut",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/supercut.friseur/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64139077",shop:"hairdresser"},addTags:{brand:"Super Cut","brand:wikidata":"Q64139077",name:"Super Cut",shop:"hairdresser"},terms:[],matchScore:2,suggestion:true},"shop/hairdresser/Supercuts":{name:"Supercuts",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/Supercuts/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7643239",shop:"hairdresser"},addTags:{brand:"Supercuts","brand:wikidata":"Q7643239","brand:wikipedia":"en:Supercuts",name:"Supercuts",shop:"hairdresser"},countryCodes:["ca","gb","us"],terms:[],matchScore:2,suggestion:true},"shop/hairdresser/Tchip":{name:"Tchip",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/TCHIP.Coiffure.Officiel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62871250",shop:"hairdresser"},addTags:{brand:"Tchip","brand:wikidata":"Q62871250",name:"Tchip",shop:"hairdresser"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/hairdresser/The Salon at Ulta Beauty":{name:"The Salon at Ulta Beauty",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/UltaBeauty/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7880076",shop:"hairdresser"},addTags:{alt_name:"Ulta Salon",brand:"Ulta Beauty","brand:wikidata":"Q7880076","brand:wikipedia":"en:Ulta Beauty",name:"The Salon at Ulta Beauty",shop:"hairdresser"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/hairdresser/Toni & Guy":{name:"Toni & Guy",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/toniandguyworld/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q324784",shop:"hairdresser"},addTags:{brand:"Toni & Guy","brand:wikidata":"Q324784","brand:wikipedia":"en:Toni & Guy",name:"Toni & Guy",shop:"hairdresser"},terms:[],matchScore:2,suggestion:true},"shop/hairdresser/Top Hair":{name:"Top Hair",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/Mein.Friseur.Top.Hair/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62523343",shop:"hairdresser"},addTags:{brand:"Top Hair","brand:wikidata":"Q62523343",name:"Top Hair",shop:"hairdresser"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/hardware/Harbor Freight Tools":{name:"Harbor Freight Tools",icon:"temaki-tools",imageURL:"https://graph.facebook.com/harbor.f.tools/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5654601",shop:"hardware"},addTags:{brand:"Harbor Freight Tools","brand:wikidata":"Q5654601","brand:wikipedia":"en:Harbor Freight Tools",name:"Harbor Freight Tools",shop:"hardware"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/hardware/Home Hardware":{name:"Home Hardware",icon:"temaki-tools",imageURL:"https://graph.facebook.com/homehardwarestores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3139611",shop:"hardware"},addTags:{brand:"Home Hardware","brand:wikidata":"Q3139611","brand:wikipedia":"en:Home Hardware",name:"Home Hardware",shop:"hardware"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/hardware/K-Rauta":{name:"K-Rauta",icon:"temaki-tools",imageURL:"https://graph.facebook.com/KRautaSuomi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4206187",shop:"hardware"},addTags:{brand:"K-Rauta","brand:wikidata":"Q4206187","brand:wikipedia":"fi:K-Rauta",name:"K-Rauta",shop:"hardware"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"shop/hardware/Kodin Terra":{name:"Kodin Terra",icon:"temaki-tools",imageURL:"https://graph.facebook.com/KodinTerraPori/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11872038",shop:"hardware"},addTags:{brand:"Kodin Terra","brand:wikidata":"Q11872038","brand:wikipedia":"fi:Kodin Terra",name:"Kodin Terra",shop:"hardware"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"shop/hardware/True Value":{name:"True Value",icon:"temaki-tools",imageURL:"https://graph.facebook.com/TrueValue/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7847545",shop:"hardware"},addTags:{brand:"True Value","brand:wikidata":"Q7847545","brand:wikipedia":"en:True Value",name:"True Value",shop:"hardware"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/hardware/Würth":{name:"Würth",icon:"temaki-tools",imageURL:"https://graph.facebook.com/Wuerth.Group/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q679750",shop:"hardware"},addTags:{brand:"Würth","brand:wikidata":"Q679750","brand:wikipedia":"de:Würth-Gruppe",name:"Würth",shop:"hardware"},countryCodes:["be","de","fi","fr","it","no"],terms:[],matchScore:2,suggestion:true},"shop/hardware/Мосхозторг":{name:"Мосхозторг",icon:"temaki-tools",imageURL:"https://graph.facebook.com/MosHozTorg/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62499092",shop:"hardware"},addTags:{brand:"Мосхозторг","brand:wikidata":"Q62499092",name:"Мосхозторг",shop:"hardware"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/health_food/Holland & Barrett":{name:"Holland & Barrett",icon:"maki-shop",imageURL:"https://pbs.twimg.com/profile_images/1136291410636754944/XbHAPXKQ_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q5880870",shop:"health_food"},addTags:{brand:"Holland & Barrett","brand:wikidata":"Q5880870","brand:wikipedia":"en:Holland & Barrett",name:"Holland & Barrett",shop:"health_food"},countryCodes:["gb","ie","nl"],terms:["holland and barrett"],matchScore:2,suggestion:true},"shop/hearing_aids/Amplifon":{name:"Amplifon",icon:"maki-shop",imageURL:"https://graph.facebook.com/AmplifonGroupCareers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q477222",shop:"hearing_aids"},addTags:{brand:"Amplifon","brand:wikidata":"Q477222","brand:wikipedia":"en:Amplifon",name:"Amplifon",shop:"hearing_aids"},terms:[],matchScore:2,suggestion:true},"shop/hearing_aids/Audika":{name:"Audika",icon:"maki-shop",imageURL:"https://graph.facebook.com/audikafrance/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2870745",shop:"hearing_aids"},addTags:{brand:"Audika","brand:wikidata":"Q2870745","brand:wikipedia":"fr:Audika",name:"Audika",shop:"hearing_aids"},countryCodes:["ch","fr"],terms:[],matchScore:2,suggestion:true},"shop/hearing_aids/Geers":{name:"Geers",icon:"maki-shop",imageURL:"https://graph.facebook.com/geers.hoerakustik/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1497707",shop:"hearing_aids"},addTags:{brand:"Geers","brand:wikidata":"Q1497707","brand:wikipedia":"de:Geers Hörakustik",name:"Geers",shop:"hearing_aids"},countryCodes:["de","pl"],terms:[],matchScore:2,suggestion:true},"shop/hearing_aids/Kind Hörgeräte":{name:"Kind Hörgeräte",icon:"maki-shop",imageURL:"https://graph.facebook.com/kindhoergeraete/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q43598590",shop:"hearing_aids"},addTags:{brand:"Kind Hörgeräte","brand:wikidata":"Q43598590","brand:wikipedia":"de:Kind Hörgeräte",name:"Kind Hörgeräte",shop:"hearing_aids"},countryCodes:["de"],terms:["kind"],matchScore:2,suggestion:true},"shop/hearing_aids/Miracle-Ear":{name:"Miracle-Ear",icon:"maki-shop",imageURL:"https://graph.facebook.com/miracleear/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17108572",shop:"hearing_aids"},addTags:{brand:"Miracle-Ear","brand:wikidata":"Q17108572","brand:wikipedia":"en:Miracle-Ear",name:"Miracle-Ear",shop:"hearing_aids"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/hearing_aids/Neuroth":{name:"Neuroth",icon:"maki-shop",imageURL:"https://graph.facebook.com/NeurothAG/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q15836645",shop:"hearing_aids"},addTags:{brand:"Neuroth","brand:wikidata":"Q15836645","brand:wikipedia":"de:Neuroth AG",name:"Neuroth",shop:"hearing_aids"},countryCodes:["at","de"],terms:[],matchScore:2,suggestion:true},"shop/hifi/Bang & Olufsen":{name:"Bang & Olufsen",icon:"maki-shop",imageURL:"https://graph.facebook.com/bangolufsenusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q790020",shop:"hifi"},addTags:{brand:"Bang & Olufsen","brand:wikidata":"Q790020","brand:wikipedia":"en:Bang & Olufsen",name:"Bang & Olufsen",shop:"hifi"},terms:[],matchScore:2,suggestion:true},"shop/hifi/Bose":{name:"Bose",icon:"maki-shop",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBose%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q328568",shop:"hifi"},addTags:{brand:"Bose","brand:wikidata":"Q328568","brand:wikipedia":"en:Bose Corporation",name:"Bose",shop:"hifi"},terms:[],matchScore:2,suggestion:true},"shop/hobby/アニメイト":{name:"アニメイト",icon:"fas-dragon",imageURL:"https://pbs.twimg.com/profile_images/1098862296787382272/pLo1nSbN_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q1041890",shop:"hobby"},addTags:{brand:"アニメイト","brand:en":"Animate","brand:ja":"アニメイト","brand:wikidata":"Q1041890","brand:wikipedia":"ja:アニメイト",name:"アニメイト","name:en":"Animate","name:ja":"アニメイト",shop:"hobby"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/houseware/At Home":{name:"At Home",icon:"fas-blender",imageURL:"https://graph.facebook.com/AtHomeStores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5522290",shop:"houseware"},addTags:{brand:"At Home (store)","brand:wikidata":"Q5522290",name:"At Home",shop:"houseware"},countryCodes:["us"],terms:["garden ridge"],matchScore:2,suggestion:true},"shop/houseware/Bed Bath & Beyond":{name:"Bed Bath & Beyond",icon:"fas-blender",imageURL:"https://graph.facebook.com/BedBathAndBeyond/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q813782",shop:"houseware"},addTags:{brand:"Bed Bath & Beyond","brand:wikidata":"Q813782","brand:wikipedia":"en:Bed Bath & Beyond",name:"Bed Bath & Beyond",shop:"houseware"},countryCodes:["ca","mx","nz","us"],terms:["bed bath and beyond"],matchScore:2,suggestion:true},"shop/houseware/Blokker":{name:"Blokker",icon:"fas-blender",imageURL:"https://graph.facebook.com/BlokkerNL/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q884934",shop:"houseware"},addTags:{brand:"Blokker","brand:wikidata":"Q884934","brand:wikipedia":"en:Blokker Holding",name:"Blokker",shop:"houseware"},countryCodes:["be","nl"],terms:[],matchScore:2,suggestion:true},"shop/houseware/Cervera":{name:"Cervera",icon:"fas-blender",imageURL:"https://graph.facebook.com/CerveraAB/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10447179",shop:"houseware"},addTags:{brand:"Cervera","brand:wikidata":"Q10447179","brand:wikipedia":"sv:Cervera (företag)",name:"Cervera",shop:"houseware"},countryCodes:["se"],terms:[],matchScore:2,suggestion:true},"shop/houseware/HomeGoods":{name:"HomeGoods",icon:"fas-blender",imageURL:"https://graph.facebook.com/Homegoods/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5887941",shop:"houseware"},addTags:{brand:"HomeGoods","brand:wikidata":"Q5887941","brand:wikipedia":"en:HomeGoods",name:"HomeGoods",shop:"houseware"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/houseware/Kitchen Collection":{name:"Kitchen Collection",icon:"fas-blender",imageURL:"https://graph.facebook.com/KitchenCollectionStores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64149036",shop:"houseware"},addTags:{brand:"Kitchen Collection","brand:wikidata":"Q64149036",name:"Kitchen Collection",shop:"houseware"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/houseware/Lagerhaus":{name:"Lagerhaus",icon:"fas-blender",imageURL:"https://graph.facebook.com/lagerhaus.se/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10553211",shop:"houseware"},addTags:{brand:"Lagerhaus","brand:wikidata":"Q10553211","brand:wikipedia":"sv:Lagerhaus",name:"Lagerhaus",shop:"houseware"},terms:[],matchScore:2,suggestion:true},"shop/houseware/Le Creuset":{name:"Le Creuset",icon:"fas-blender",imageURL:"https://graph.facebook.com/lecreuset/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q555861",shop:"houseware"},addTags:{brand:"Le Creuset","brand:wikidata":"Q555861","brand:wikipedia":"en:Le Creuset",name:"Le Creuset",shop:"houseware"},terms:[],matchScore:2,suggestion:true},"shop/houseware/Marskramer":{name:"Marskramer",icon:"fas-blender",imageURL:"https://graph.facebook.com/marskramer.nl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2305917",shop:"houseware"},addTags:{brand:"Marskramer","brand:wikidata":"Q2305917","brand:wikipedia":"nl:Marskramer (warenhuis)",name:"Marskramer",shop:"houseware"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/houseware/Old Time Pottery":{name:"Old Time Pottery",icon:"fas-blender",imageURL:"https://graph.facebook.com/oldtimepottery/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7085222",shop:"houseware"},addTags:{brand:"Old Time Pottery","brand:website":"http://www.oldtimepottery.com","brand:wikidata":"Q7085222","brand:wikipedia":"en:Old Time Pottery",name:"Old Time Pottery",shop:"houseware"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/houseware/Sur La Table":{name:"Sur La Table",icon:"fas-blender",imageURL:"https://graph.facebook.com/SurLaTable/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7645220",shop:"houseware"},addTags:{brand:"Sur La Table","brand:wikidata":"Q7645220","brand:wikipedia":"en:Sur La Table",name:"Sur La Table",shop:"houseware"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/houseware/The Container Store":{name:"The Container Store",icon:"fas-blender",imageURL:"https://graph.facebook.com/containerstore/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7727445",shop:"houseware"},addTags:{brand:"The Container Store","brand:wikidata":"Q7727445","brand:wikipedia":"en:The Container Store",name:"The Container Store",shop:"houseware"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/houseware/Tuesday Morning":{name:"Tuesday Morning",icon:"fas-blender",imageURL:"https://graph.facebook.com/TuesdayMorning/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7851426",shop:"houseware"},addTags:{brand:"Tuesday Morning","brand:wikidata":"Q7851426","brand:wikipedia":"en:Tuesday Morning",name:"Tuesday Morning",shop:"houseware"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/houseware/WMF":{name:"WMF",icon:"fas-blender",imageURL:"https://graph.facebook.com/WMF/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q451423",shop:"houseware"},addTags:{brand:"WMF","brand:wikidata":"Q451423","brand:wikipedia":"en:WMF Group",name:"WMF",shop:"houseware"},countryCodes:["at","de"],terms:[],matchScore:2,suggestion:true},"shop/houseware/Williams-Sonoma":{name:"Williams-Sonoma",icon:"fas-blender",imageURL:"https://graph.facebook.com/WilliamsSonoma/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2581220",shop:"houseware"},addTags:{brand:"Williams-Sonoma","brand:wikidata":"Q2581220","brand:wikipedia":"en:Williams-Sonoma",name:"Williams-Sonoma",shop:"houseware"},countryCodes:["ca","us"],terms:["william sonoma"],matchScore:2,suggestion:true},"shop/houseware/World Market":{name:"World Market",icon:"fas-blender",imageURL:"https://graph.facebook.com/worldmarket/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5174750",shop:"interior_decoration"},addTags:{brand:"World Market","brand:wikidata":"Q5174750","brand:wikipedia":"en:Cost Plus World Market",name:"World Market",official_name:"Cost Plus World Market",shop:"interior_decoration"},countryCodes:["us"],terms:["cost plus"],matchScore:2,suggestion:true},"shop/houseware/Xenos":{name:"Xenos",icon:"fas-blender",imageURL:"https://graph.facebook.com/XenosNL/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16547960",shop:"houseware"},addTags:{brand:"Xenos","brand:wikidata":"Q16547960","brand:wikipedia":"nl:Xenos",name:"Xenos",shop:"houseware"},countryCodes:["de","nl"],terms:[],matchScore:2,suggestion:true},"shop/interior_decoration/Centrakor":{name:"Centrakor",icon:"maki-shop",imageURL:"https://graph.facebook.com/Centrakor/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64079345",shop:"interior_decoration"},addTags:{brand:"Centrakor","brand:wikidata":"Q64079345",name:"Centrakor",shop:"interior_decoration"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/interior_decoration/Depot":{name:"Depot",icon:"maki-shop",imageURL:"https://graph.facebook.com/DEPOTonline/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1191740",shop:"interior_decoration"},addTags:{brand:"Depot","brand:wikidata":"Q1191740","brand:wikipedia":"de:Gries Deco Holding",name:"Depot",shop:"interior_decoration"},countryCodes:["at","ch","de"],terms:[],matchScore:2,suggestion:true},"shop/interior_decoration/Fired Earth":{name:"Fired Earth",icon:"maki-shop",imageURL:"https://pbs.twimg.com/profile_images/895948506082537472/9N7fI-vd_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q20594569",shop:"interior_decoration"},addTags:{brand:"Fired Earth","brand:wikidata":"Q20594569",name:"Fired Earth",shop:"interior_decoration"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/interior_decoration/Hemtex":{name:"Hemtex",icon:"maki-shop",imageURL:"https://graph.facebook.com/hemtex/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10521868",shop:"interior_decoration"},addTags:{brand:"Hemtex","brand:wikidata":"Q10521868","brand:wikipedia":"sv:Hemtex",name:"Hemtex",shop:"interior_decoration"},countryCodes:["ee","fi","se"],terms:[],matchScore:2,suggestion:true},"shop/interior_decoration/HomeSense":{name:"HomeSense",icon:"maki-shop",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FHomeSense%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q16844433",shop:"interior_decoration"},addTags:{brand:"HomeSense","brand:wikidata":"Q16844433","brand:wikipedia":"en:HomeSense",name:"HomeSense",shop:"interior_decoration"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/interior_decoration/Kirkland's":{name:"Kirkland's",icon:"maki-shop",imageURL:"https://graph.facebook.com/Kirklands/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6415714",shop:"interior_decoration"},addTags:{brand:"Kirkland's","brand:wikidata":"Q6415714","brand:wikipedia":"en:Kirkland's",name:"Kirkland's",shop:"interior_decoration"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/interior_decoration/Pier 1 Imports":{name:"Pier 1 Imports",icon:"maki-shop",imageURL:"https://graph.facebook.com/pier1/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7191691",shop:"interior_decoration"},addTags:{brand:"Pier 1 Imports","brand:wikidata":"Q7191691","brand:wikipedia":"en:Pier 1 Imports",name:"Pier 1 Imports",shop:"interior_decoration"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/interior_decoration/Ten Thousand Villages":{name:"Ten Thousand Villages",icon:"maki-shop",imageURL:"https://graph.facebook.com/TenThousandVillages/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2403252",shop:"interior_decoration"},addTags:{brand:"Ten Thousand Villages","brand:wikidata":"Q2403252","brand:wikipedia":"en:Ten Thousand Villages",fair_trade:"only",name:"Ten Thousand Villages",shop:"interior_decoration"},countryCodes:["ca","us"],terms:["10 thousand villages","10,000 villages"],matchScore:2,suggestion:true},"shop/jewelry/Alex and Ani":{name:"Alex and Ani",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/alexandaniusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16198810",shop:"jewelry"},addTags:{brand:"Alex and Ani","brand:wikidata":"Q16198810","brand:wikipedia":"en:Alex and Ani",name:"Alex and Ani",shop:"jewelry"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/jewelry/Apart":{name:"Apart",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/BizuteriaApart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11686561",shop:"jewelry"},addTags:{brand:"Apart","brand:wikidata":"Q11686561","brand:wikipedia":"pl:Apart",name:"Apart",shop:"jewelry"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/jewelry/Bijou Brigitte":{name:"Bijou Brigitte",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/bijoubrigitte/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q599545",shop:"jewelry"},addTags:{brand:"Bijou Brigitte","brand:wikidata":"Q599545","brand:wikipedia":"de:Bijou Brigitte",name:"Bijou Brigitte",shop:"jewelry"},terms:[],matchScore:2,suggestion:true},"shop/jewelry/Cartier":{name:"Cartier",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/cartier.usa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q538587",shop:"jewelry"},addTags:{brand:"Cartier","brand:wikidata":"Q538587","brand:wikipedia":"en:Cartier (jeweler)",name:"Cartier",shop:"jewelry"},terms:[],matchScore:2,suggestion:true},"shop/jewelry/Christ":{name:"Christ",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/juwelierchrist/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1077957",shop:"jewelry"},addTags:{brand:"Christ","brand:wikidata":"Q1077957","brand:wikipedia":"de:Christ (Juwelier)",name:"Christ",shop:"jewelry"},countryCodes:["ch","de","nl"],terms:[],matchScore:2,suggestion:true},"shop/jewelry/David Yurman":{name:"David Yurman",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/DavidYurman/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5241390",shop:"jewelry"},addTags:{brand:"David Yurman","brand:wikidata":"Q5241390","brand:wikipedia":"en:David Yurman",name:"David Yurman",shop:"jewelry"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/jewelry/Ernest Jones":{name:"Ernest Jones",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/ernestjonesjewellers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5393358",shop:"jewelry"},addTags:{brand:"Ernest Jones","brand:wikidata":"Q5393358","brand:wikipedia":"en:Ernest Jones (retailer)",name:"Ernest Jones",shop:"jewelry"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/jewelry/Guldfynd":{name:"Guldfynd",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/Guldfynd/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q49099223",shop:"jewelry"},addTags:{brand:"Guldfynd","brand:wikidata":"Q49099223","brand:wikipedia":"sv:Guldfynd",name:"Guldfynd",shop:"jewelry"},countryCodes:["se"],terms:[],matchScore:2,suggestion:true},"shop/jewelry/H.Samuel":{name:"H.Samuel",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/HSamuelTheJeweller/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5628558",shop:"jewelry"},addTags:{brand:"H.Samuel","brand:wikidata":"Q5628558","brand:wikipedia":"en:H. Samuel",name:"H.Samuel",shop:"jewelry"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/jewelry/Histoire d'Or":{name:"Histoire d'Or",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/HistoiredOr/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62529245",shop:"jewelry"},addTags:{brand:"Histoire d'Or","brand:wikidata":"Q62529245",name:"Histoire d'Or",shop:"jewelry"},countryCodes:["be","fr","it","nl"],terms:[],matchScore:2,suggestion:true},"shop/jewelry/James Avery Jewelry":{name:"James Avery Jewelry",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/JamesAvery/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6129024",shop:"jewelry"},addTags:{brand:"James Avery Jewelry","brand:wikidata":"Q6129024","brand:wikipedia":"en:James Avery Artisan Jewelry",name:"James Avery Jewelry",shop:"jewelry"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/jewelry/Jared":{name:"Jared",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/JaredTheGalleriaOfJewelry/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62029282",shop:"jewelry"},addTags:{brand:"Jared","brand:wikidata":"Q62029282",name:"Jared",shop:"jewelry"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/jewelry/Julien d'Orcel":{name:"Julien d'Orcel",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/juliendorcel.bijouteries/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62497463",shop:"jewelry"},addTags:{brand:"Julien d'Orcel","brand:wikidata":"Q62497463",name:"Julien d'Orcel",shop:"jewelry"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/jewelry/Kay Jewelers":{name:"Kay Jewelers",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/KayJewelers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62029290",shop:"jewelry"},addTags:{brand:"Kay Jewelers","brand:wikidata":"Q62029290",name:"Kay Jewelers",shop:"jewelry"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/jewelry/PNJ":{name:"PNJ",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/PNJ.COM.VN/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61129183",shop:"jewelry"},addTags:{brand:"PNJ","brand:wikidata":"Q61129183","brand:wikipedia":"vi:PNJ",name:"PNJ",shop:"jewelry"},countryCodes:["vn"],terms:[],matchScore:2,suggestion:true},"shop/jewelry/Pandora":{name:"Pandora",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/PANDORA.Japan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2241604",shop:"jewelry"},addTags:{brand:"Pandora","brand:wikidata":"Q2241604","brand:wikipedia":"en:Pandora (jewelry)",name:"Pandora",shop:"jewelry"},terms:[],matchScore:2,suggestion:true},"shop/jewelry/Swarovski":{name:"Swarovski",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/SWAROVSKI.NorthAmerica/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q611115",shop:"jewelry"},addTags:{brand:"Swarovski","brand:wikidata":"Q611115","brand:wikipedia":"en:Swarovski",name:"Swarovski",shop:"jewelry"},terms:[],matchScore:2,suggestion:true},"shop/jewelry/Tiffany & Company":{name:"Tiffany & Company",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/Tiffany/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1066858",shop:"jewelry"},addTags:{brand:"Tiffany & Company","brand:wikidata":"Q1066858","brand:wikipedia":"en:Tiffany & Co.",name:"Tiffany & Company",official_name:"Tiffany & Co.",shop:"jewelry"},countryCodes:["us"],terms:["tiffany","tiffany and company","tiffany's"],matchScore:2,suggestion:true},"shop/jewelry/Warren James":{name:"Warren James",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/warrenjamesjewellers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q19604616",shop:"jewelry"},addTags:{brand:"Warren James","brand:wikidata":"Q19604616","brand:wikipedia":"en:Warren James Jewellers",name:"Warren James",shop:"jewelry"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/jewelry/Zales":{name:"Zales",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/Zales/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q8065305",shop:"jewelry"},addTags:{brand:"Zales","brand:wikidata":"Q8065305","brand:wikipedia":"en:Zale Corporation",name:"Zales",shop:"jewelry"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/jewelry/Адамас":{name:"Адамас",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/adamas.club/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62393709",shop:"jewelry"},addTags:{brand:"Адамас","brand:en":"Adamas","brand:ru":"Адамас","brand:wikidata":"Q62393709",name:"Адамас","name:en":"Adamas","name:ru":"Адамас",shop:"jewelry"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/kiosk/Lietuvos spauda":{name:"Lietuvos spauda",icon:"maki-shop",imageURL:"https://graph.facebook.com/narvesen.no/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6514414",shop:"kiosk"},addTags:{brand:"Lietuvos spauda","brand:wikidata":"Q6514414","brand:wikipedia":"lt:Lietuvos spauda",name:"Lietuvos spauda",shop:"kiosk"},countryCodes:["lt"],terms:[],matchScore:2,suggestion:true},"shop/kiosk/Narvesen":{name:"Narvesen",icon:"maki-shop",imageURL:"https://graph.facebook.com/narvesen.no/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6514414",shop:"kiosk"},addTags:{brand:"Narvesen","brand:wikidata":"Q6514414","brand:wikipedia":"en:Narvesen",name:"Narvesen",shop:"kiosk"},countryCodes:["lt","lv","no"],terms:[],matchScore:2,suggestion:true},"shop/kiosk/Pressbyrån":{name:"Pressbyrån",icon:"maki-shop",imageURL:"https://graph.facebook.com/Pressbyran/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2489072",shop:"kiosk"},addTags:{brand:"Pressbyrån","brand:wikidata":"Q2489072","brand:wikipedia":"en:Pressbyrån",name:"Pressbyrån",shop:"kiosk"},countryCodes:["se"],terms:[],matchScore:2,suggestion:true},"shop/kiosk/R-Kioski":{name:"R-Kioski",icon:"maki-shop",imageURL:"https://graph.facebook.com/rkioski/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1571400",shop:"kiosk"},addTags:{brand:"R-Kioski","brand:wikidata":"Q1571400","brand:wikipedia":"en:R-kioski",name:"R-Kioski",shop:"kiosk"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"shop/kiosk/Ruch":{name:"Ruch",icon:"maki-shop",imageURL:"https://graph.facebook.com/ruch/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1260314",shop:"kiosk"},addTags:{brand:"Ruch","brand:wikidata":"Q1260314","brand:wikipedia":"pl:Ruch (przedsiębiorstwo)",name:"Ruch",shop:"kiosk"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/kiosk/Tisak":{name:"Tisak",icon:"maki-shop",imageURL:"https://graph.facebook.com/tisakmedia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12643627",shop:"kiosk"},addTags:{brand:"Tisak","brand:wikidata":"Q12643627","brand:wikipedia":"hr:Tisak (tvrtka)",name:"Tisak",shop:"kiosk"},countryCodes:["hr"],terms:[],matchScore:2,suggestion:true},"shop/kiosk/k kiosk":{name:"k kiosk",icon:"maki-shop",imageURL:"https://graph.facebook.com/kkiosk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q60381703",shop:"kiosk"},addTags:{brand:"k kiosk","brand:wikidata":"Q60381703","brand:wikipedia":"it:K Kiosk",name:"k kiosk",shop:"kiosk"},countryCodes:["ch"],terms:[],matchScore:2,suggestion:true},"shop/kiosk/キヨスク":{name:"キヨスク",icon:"maki-shop",geometry:["point","area"],tags:{"brand:wikidata":"Q1334796",shop:"kiosk"},addTags:{brand:"キヨスク","brand:en":"KIOSK","brand:ja":"キヨスク","brand:wikidata":"Q1334796","brand:wikipedia":"ja:キヨスク",name:"キヨスク","name:en":"KIOSK","name:ja":"キヨスク",shop:"kiosk"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/kitchen/Cuisinella":{name:"Cuisinella",icon:"maki-shop",imageURL:"https://graph.facebook.com/CuisinellaFR/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3007012",shop:"kitchen"},addTags:{brand:"Cuisinella","brand:wikidata":"Q3007012","brand:wikipedia":"fr:Cuisinella",name:"Cuisinella",shop:"kitchen"},countryCodes:["fr","tn"],terms:[],matchScore:2,suggestion:true},"shop/kitchen/Magnet":{name:"Magnet",icon:"maki-shop",imageURL:"https://graph.facebook.com/MagnetKitchens/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6731427",shop:"kitchen"},addTags:{brand:"Magnet","brand:wikidata":"Q6731427",name:"Magnet",shop:"kitchen"},countryCodes:["gb"],terms:["magnet kitchens"],matchScore:2,suggestion:true},"shop/kitchen/Mobalpa":{name:"Mobalpa",icon:"maki-shop",imageURL:"https://graph.facebook.com/Mobalpa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3317571",shop:"kitchen"},addTags:{brand:"Mobalpa","brand:wikidata":"Q3317571","brand:wikipedia":"fr:Mobalpa",name:"Mobalpa",shop:"kitchen"},countryCodes:["be","fr","gb"],terms:[],matchScore:2,suggestion:true},"shop/kitchen/Schmidt":{name:"Schmidt",icon:"maki-shop",imageURL:"https://graph.facebook.com/Schmidt.HomeDesign/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3487620",shop:"kitchen"},addTags:{brand:"Schmidt","brand:wikidata":"Q3487620","brand:wikipedia":"de:Schmidt Groupe",name:"Schmidt",shop:"kitchen"},countryCodes:["be","es","fr","gb"],terms:[],matchScore:2,suggestion:true},"shop/kitchen/SoCoo'c":{name:"SoCoo'c",icon:"maki-shop",imageURL:"https://graph.facebook.com/SoCooc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62783840",shop:"kitchen"},addTags:{brand:"SoCoo'c","brand:wikidata":"Q62783840","brand:wikipedia":"fr:SoCoo'c",name:"SoCoo'c",shop:"kitchen"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/massage/Massage Envy":{name:"Massage Envy",icon:"temaki-spa",imageURL:"https://graph.facebook.com/MassageEnvy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q22922899",shop:"massage"},addTags:{brand:"Massage Envy","brand:wikidata":"Q22922899","brand:wikipedia":"en:Massage Envy",name:"Massage Envy",shop:"massage"},countryCodes:["us"],terms:["massage envy spa"],matchScore:2,suggestion:true},"shop/massage/Massage Heights":{name:"Massage Heights",icon:"temaki-spa",imageURL:"https://graph.facebook.com/MassageHeights/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64573956",shop:"massage"},addTags:{brand:"Massage Heights","brand:wikidata":"Q64573956",name:"Massage Heights",shop:"massage"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/medical_supply/Pofam-Poznań":{name:"Pofam-Poznań",icon:"maki-shop",imageURL:"https://graph.facebook.com/381601628634155/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62057457",shop:"medical_supply"},addTags:{brand:"Pofam-Poznań","brand:wikidata":"Q62057457",name:"Pofam-Poznań",shop:"medical_supply"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/medical_supply/Ортека":{name:"Ортека",icon:"maki-shop",imageURL:"https://graph.facebook.com/orteka.rus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62393660",shop:"medical_supply"},addTags:{brand:"Ортека","brand:wikidata":"Q62393660",name:"Ортека",shop:"medical_supply"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/3 Store":{name:"3 Store",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/ThreeUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q407009",shop:"mobile_phone"},addTags:{brand:"3 Store","brand:wikidata":"Q407009","brand:wikipedia":"en:3 (telecommunications)",name:"3 Store",shop:"mobile_phone"},countryCodes:["gb","it"],terms:["3","three","three store"],matchScore:2,suggestion:true},"shop/mobile_phone/AT&T":{name:"AT&T",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/ATT/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q298594",shop:"mobile_phone"},addTags:{brand:"AT&T","brand:wikidata":"Q298594","brand:wikipedia":"en:AT&T Mobility",name:"AT&T",shop:"mobile_phone"},countryCodes:["mx","us"],terms:["att mobile","att mobility","att wireless"],matchScore:2,suggestion:true},"shop/mobile_phone/Bell":{name:"Bell",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/BellCanada/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2894594",shop:"mobile_phone"},addTags:{brand:"Bell","brand:wikidata":"Q2894594","brand:wikipedia":"en:Bell Mobility",name:"Bell",shop:"mobile_phone"},countryCodes:["ca"],terms:["bell mobile","bell mobility","bell wireless"],matchScore:2,suggestion:true},"shop/mobile_phone/Best Buy Mobile":{name:"Best Buy Mobile",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/bestbuy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q533415",shop:"mobile_phone"},addTags:{brand:"Best Buy Mobile","brand:wikidata":"Q533415","brand:wikipedia":"en:Best Buy",name:"Best Buy Mobile",shop:"mobile_phone"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Bitė":{name:"Bitė",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/bitelietuva/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q796010",shop:"mobile_phone"},addTags:{brand:"Bitė","brand:wikidata":"Q796010","brand:wikipedia":"lt:Bitės grupė",name:"Bitė",shop:"mobile_phone"},countryCodes:["lt"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Boost Mobile":{name:"Boost Mobile",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/boostmobile/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4943790",shop:"mobile_phone"},addTags:{brand:"Boost Mobile","brand:wikidata":"Q4943790","brand:wikipedia":"en:Boost Mobile",name:"Boost Mobile",shop:"mobile_phone"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Carphone Warehouse":{name:"Carphone Warehouse",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/carphonewarehouse/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q118046",shop:"mobile_phone"},addTags:{brand:"Carphone Warehouse","brand:wikidata":"Q118046","brand:wikipedia":"en:Carphone Warehouse",name:"Carphone Warehouse",shop:"mobile_phone"},countryCodes:["by","gb","ie"],terms:["the carphone warehouse"],matchScore:2,suggestion:true},"shop/mobile_phone/Chatr":{name:"Chatr",icon:"fas-mobile-alt",imageURL:"https://pbs.twimg.com/profile_images/705052150091681792/Rt-nwXo7_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q5087766",shop:"mobile_phone"},addTags:{brand:"Chatr","brand:wikidata":"Q5087766","brand:wikipedia":"en:Chatr",name:"Chatr",shop:"mobile_phone"},countryCodes:["ca"],terms:["Chatr Mobile"],matchScore:2,suggestion:true},"shop/mobile_phone/Claro":{name:"Claro",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/ClaroCol/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1770208",shop:"mobile_phone"},addTags:{brand:"Claro","brand:wikidata":"Q1770208","brand:wikipedia":"en:Claro (company)",name:"Claro",shop:"mobile_phone"},terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Cricket Wireless":{name:"Cricket Wireless",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/cricketwireless/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5184987",shop:"mobile_phone"},addTags:{brand:"Cricket Wireless","brand:wikidata":"Q5184987","brand:wikipedia":"en:Cricket Wireless",name:"Cricket Wireless",shop:"mobile_phone"},countryCodes:["us"],terms:["cricket"],matchScore:2,suggestion:true},"shop/mobile_phone/Digicel":{name:"Digicel",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/digicel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2117506",shop:"mobile_phone"},addTags:{brand:"Digicel","brand:wikidata":"Q2117506","brand:wikipedia":"en:Digicel",name:"Digicel",shop:"mobile_phone"},terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/EE":{name:"EE",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/ee/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5322942",shop:"mobile_phone"},addTags:{brand:"EE","brand:wikidata":"Q5322942","brand:wikipedia":"en:EE Limited",name:"EE",shop:"mobile_phone"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Entel":{name:"Entel",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/entelsa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q450420",shop:"mobile_phone"},addTags:{brand:"Entel","brand:wikidata":"Q450420","brand:wikipedia":"en:Entel (Chile)",name:"Entel",shop:"mobile_phone"},countryCodes:["cl","pe"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Fido":{name:"Fido",icon:"fas-mobile-alt",geometry:["point","area"],tags:{"brand:wikidata":"Q3071471",shop:"mobile_phone"},addTags:{brand:"Fido","brand:wikidata":"Q3071471","brand:wikipedia":"en:Fido Solutions",name:"Fido",shop:"mobile_phone"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Freedom Mobile":{name:"Freedom Mobile",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/frdmmobile/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q8023931",shop:"mobile_phone"},addTags:{brand:"Freedom Mobile","brand:wikidata":"Q8023931","brand:wikipedia":"en:Freedom Mobile",name:"Freedom Mobile",shop:"mobile_phone"},countryCodes:["ca"],terms:["freedom","wind mobile"],matchScore:2,suggestion:true},"shop/mobile_phone/Koodo":{name:"Koodo",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/Koodo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6430529",shop:"mobile_phone"},addTags:{brand:"Koodo","brand:wikidata":"Q6430529","brand:wikipedia":"en:Koodo Mobile",name:"Koodo",shop:"mobile_phone"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/MTN":{name:"MTN",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/MTN/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1813361",shop:"mobile_phone"},addTags:{brand:"MTN","brand:wikidata":"Q1813361","brand:wikipedia":"en:MTN Group",name:"MTN",shop:"mobile_phone"},terms:["agence mtn"],matchScore:2,suggestion:true},"shop/mobile_phone/MetroPCS":{name:"MetroPCS",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/MetroByTMobile/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1925685",shop:"mobile_phone"},addTags:{brand:"MetroPCS","brand:wikidata":"Q1925685","brand:wikipedia":"en:Metro by T-Mobile",name:"MetroPCS",shop:"mobile_phone"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Mobilcom Debitel":{name:"Mobilcom Debitel",icon:"fas-mobile-alt",imageURL:"https://pbs.twimg.com/profile_images/1090909837385441280/-CqxodYE_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q344744",shop:"mobile_phone"},addTags:{brand:"Mobilcom Debitel","brand:wikidata":"Q344744","brand:wikipedia":"en:Debitel",name:"Mobilcom Debitel",shop:"mobile_phone"},countryCodes:["de","ir"],terms:["debitel"],matchScore:2,suggestion:true},"shop/mobile_phone/Moov":{name:"Moov",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/moovcotedivoire/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3323637",shop:"mobile_phone"},addTags:{brand:"Moov","brand:wikidata":"Q3323637","brand:wikipedia":"fr:Moov Côte d'Ivoire",name:"Moov",shop:"mobile_phone"},countryCodes:["ci","tg"],terms:["agence moov"],matchScore:2,suggestion:true},"shop/mobile_phone/Movistar":{name:"Movistar",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/movistar.es/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q967735",shop:"mobile_phone"},addTags:{brand:"Movistar","brand:wikidata":"Q967735","brand:wikipedia":"en:Movistar",name:"Movistar",shop:"mobile_phone"},terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/O2":{name:"O2",icon:"fas-mobile-alt",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FO2.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1759255",shop:"mobile_phone"},addTags:{brand:"O2","brand:wikidata":"Q1759255","brand:wikipedia":"en:Telefónica Europe",name:"O2",shop:"mobile_phone"},countryCodes:["cz","de","gb","ie","sk"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Optie1":{name:"Optie1",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/Optie1/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62393564",shop:"mobile_phone"},addTags:{brand:"Optie1","brand:wikidata":"Q62393564",name:"Optie1",shop:"mobile_phone"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Orange":{name:"Orange",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/orange/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1431486",shop:"mobile_phone"},addTags:{brand:"Orange","brand:wikidata":"Q1431486","brand:wikipedia":"fr:Orange (entreprise)",name:"Orange",shop:"mobile_phone"},terms:["agence orange"],matchScore:2,suggestion:true},"shop/mobile_phone/Personal":{name:"Personal",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/personalargentina/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10933021",shop:"mobile_phone"},addTags:{brand:"Personal","brand:wikidata":"Q10933021","brand:wikipedia":"es:Personal (Argentina)",name:"Personal",shop:"mobile_phone"},countryCodes:["ar","py"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Phone House":{name:"Phone House",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/carphonewarehouse/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q118046",shop:"mobile_phone"},addTags:{brand:"Phone House","brand:wikidata":"Q118046","brand:wikipedia":"en:Carphone Warehouse",name:"Phone House",shop:"mobile_phone"},countryCodes:["de","es","fr","nl","pt"],terms:["the phone house"],matchScore:2,suggestion:true},"shop/mobile_phone/Play":{name:"Play",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/Play/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7202998",shop:"mobile_phone"},addTags:{brand:"Play","brand:wikidata":"Q7202998","brand:wikipedia":"pl:Play (sieć telefonii komórkowej)",name:"Play",shop:"mobile_phone"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Plus":{name:"Plus",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/plus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7205598",shop:"mobile_phone"},addTags:{brand:"Plus","brand:wikidata":"Q7205598","brand:wikipedia":"pl:Plus (sieć telefonii komórkowej)",name:"Plus",shop:"mobile_phone"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Rogers":{name:"Rogers",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/Rogers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3439663",shop:"mobile_phone"},addTags:{brand:"Rogers","brand:wikidata":"Q3439663","brand:wikipedia":"en:Rogers Wireless",name:"Rogers",shop:"mobile_phone"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/SFR":{name:"SFR",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/SFR/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q218765",shop:"mobile_phone"},addTags:{brand:"SFR","brand:wikidata":"Q218765","brand:wikipedia":"en:SFR",name:"SFR",shop:"mobile_phone"},countryCodes:["fr","lu"],terms:["espace sfr"],matchScore:2,suggestion:true},"shop/mobile_phone/Sprint":{name:"Sprint",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/sprint/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q301965",shop:"mobile_phone"},addTags:{brand:"Sprint","brand:wikidata":"Q301965","brand:wikipedia":"en:Sprint Corporation",name:"Sprint",shop:"mobile_phone"},terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/T-Mobile":{name:"T-Mobile",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/TMobile/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q327634",shop:"mobile_phone"},addTags:{brand:"T-Mobile","brand:wikidata":"Q327634","brand:wikipedia":"en:T-Mobile",name:"T-Mobile",shop:"mobile_phone"},terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/TIM":{name:"TIM",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/TimOfficialPage/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q144617",shop:"mobile_phone"},addTags:{brand:"TIM","brand:wikidata":"Q144617","brand:wikipedia":"en:Telecom Italia",name:"TIM",shop:"mobile_phone"},countryCodes:["br","it"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Tbooth Wireless":{name:"Tbooth Wireless",icon:"fas-mobile-alt",imageURL:"https://pbs.twimg.com/profile_images/910995518846672896/-zraayKF_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q7690597",shop:"mobile_phone"},addTags:{brand:"Tbooth Wireless","brand:wikidata":"Q7690597",name:"Tbooth Wireless",shop:"mobile_phone"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Telcel":{name:"Telcel",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/Telcel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3517255",shop:"mobile_phone"},addTags:{brand:"Telcel","brand:wikidata":"Q3517255","brand:wikipedia":"en:Telcel",name:"Telcel",shop:"mobile_phone"},countryCodes:["cu","mx"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Tele2":{name:"Tele2",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/WeAreTele2/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q309865",shop:"mobile_phone"},addTags:{brand:"Tele2","brand:wikidata":"Q309865","brand:wikipedia":"en:Tele2",name:"Tele2",shop:"mobile_phone"},terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Telekom":{name:"Telekom",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/deutschetelekom/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q9396",shop:"mobile_phone"},addTags:{brand:"Telekom","brand:wikidata":"Q9396","brand:wikipedia":"en:Deutsche Telekom",name:"Telekom",shop:"mobile_phone"},countryCodes:["de","hu","ro","si","sk"],terms:["telekom shop"],matchScore:2,suggestion:true},"shop/mobile_phone/Telenor":{name:"Telenor",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/telenorgroup/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q845632",shop:"mobile_phone"},addTags:{brand:"Telenor","brand:wikidata":"Q845632","brand:wikipedia":"en:Telenor",name:"Telenor",shop:"mobile_phone"},terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Telstra":{name:"Telstra",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/Telstra/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q721162",shop:"mobile_phone"},addTags:{brand:"Telstra","brand:wikidata":"Q721162","brand:wikipedia":"en:Telstra",name:"Telstra",shop:"mobile_phone"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Telus":{name:"Telus",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/telus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q165858",shop:"mobile_phone"},addTags:{brand:"Telus","brand:wikidata":"Q165858","brand:wikipedia":"en:Telus",name:"Telus",shop:"mobile_phone"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Turkcell":{name:"Turkcell",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/Turkcell/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q283852",shop:"mobile_phone"},addTags:{brand:"Turkcell","brand:wikidata":"Q283852","brand:wikipedia":"en:Turkcell",name:"Turkcell",shop:"mobile_phone"},countryCodes:["cy","tr"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/U.S. Cellular":{name:"U.S. Cellular",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/USCellular/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2466256",shop:"mobile_phone"},addTags:{brand:"U.S. Cellular","brand:wikidata":"Q2466256","brand:wikipedia":"en:U.S. Cellular",name:"U.S. Cellular",shop:"mobile_phone"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Verizon Wireless":{name:"Verizon Wireless",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/verizon/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q919641",shop:"mobile_phone"},addTags:{brand:"Verizon Wireless","brand:wikidata":"Q919641","brand:wikipedia":"en:Verizon Wireless",name:"Verizon Wireless",shop:"mobile_phone"},countryCodes:["us"],terms:["verizon"],matchScore:2,suggestion:true},"shop/mobile_phone/Virgin Mobile (Canada)":{name:"Virgin Mobile (Canada)",icon:"fas-mobile-alt",imageURL:"https://pbs.twimg.com/profile_images/764098127641149440/uYi5SNMU_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q3560641",shop:"mobile_phone"},addTags:{brand:"Virgin Mobile","brand:wikidata":"Q3560641","brand:wikipedia":"en:Virgin Mobile Canada",name:"Virgin Mobile",shop:"mobile_phone"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Vodafone":{name:"Vodafone",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/vodafoneUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q122141",shop:"mobile_phone"},addTags:{brand:"Vodafone","brand:wikidata":"Q122141","brand:wikipedia":"en:Vodafone",name:"Vodafone",shop:"mobile_phone"},terms:["vodafone shop"],matchScore:2,suggestion:true},"shop/mobile_phone/WIFI_ETECSA":{name:"WIFI_ETECSA",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/etecsa.cu/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q490323",shop:"mobile_phone"},addTags:{brand:"WIFI_ETECSA","brand:wikidata":"Q490323","brand:wikipedia":"es:Empresa de Telecomunicaciones de Cuba",name:"WIFI_ETECSA",shop:"mobile_phone"},countryCodes:["cu"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/WOW! Mobile Boutique":{name:"WOW! Mobile Boutique",icon:"fas-mobile-alt",imageURL:"https://pbs.twimg.com/profile_images/860473723475906561/A2bVMfab_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q64847598",shop:"mobile_phone"},addTags:{brand:"WOW! Mobile Boutique","brand:wikidata":"Q64847598",name:"WOW! Mobile Boutique",shop:"mobile_phone"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Wind":{name:"Wind",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/Wind/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q650467",shop:"mobile_phone"},addTags:{brand:"Wind","brand:wikidata":"Q650467","brand:wikipedia":"en:WIND (Italy)",name:"Wind",shop:"mobile_phone"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/WirelessWave":{name:"WirelessWave",icon:"fas-mobile-alt",imageURL:"https://pbs.twimg.com/profile_images/565650686931529728/xv5f4DIL_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q8026815",shop:"mobile_phone"},addTags:{brand:"WirelessWave","brand:wikidata":"Q8026815",name:"WirelessWave",shop:"mobile_phone"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Yoigo":{name:"Yoigo",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/Yoigo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2630989",shop:"mobile_phone"},addTags:{brand:"Yoigo","brand:wikidata":"Q2630989","brand:wikipedia":"en:Yoigo",name:"Yoigo",shop:"mobile_phone"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/auショップ":{name:"auショップ",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/aubyKDDI/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q307110",shop:"mobile_phone"},addTags:{brand:"au","brand:ja":"au","brand:wikidata":"Q307110","brand:wikipedia":"ja:Au (携帯電話)",name:"auショップ","name:en":"au","name:ja":"auショップ",shop:"mobile_phone"},countryCodes:["jp"],terms:["au"],matchScore:2,suggestion:true},"shop/mobile_phone/Алло":{name:"Алло",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/allo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q18683057",shop:"mobile_phone"},addTags:{brand:"Алло","brand:wikidata":"Q18683057","brand:wikipedia":"uk:Алло (торгова мережа)",name:"Алло",shop:"mobile_phone"},countryCodes:["md","ua"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Билайн":{name:"Билайн",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/Beelinerus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q402880",shop:"mobile_phone"},addTags:{brand:"Билайн","brand:en":"Beeline","brand:wikidata":"Q402880","brand:wikipedia":"en:Beeline (brand)",name:"Билайн","name:en":"Beeline",shop:"mobile_phone"},countryCodes:["kg","kz","ru"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Евросеть":{name:"Евросеть",icon:"fas-mobile-alt",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FEuroset.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q65310",shop:"mobile_phone"},addTags:{brand:"Евросеть","brand:en":"Euroset","brand:wikidata":"Q65310","brand:wikipedia":"en:Euroset",name:"Евросеть","name:en":"Euroset",shop:"mobile_phone"},countryCodes:["by","kz","ru","ua"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Київстар":{name:"Київстар",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/kyivstar/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2288463",shop:"mobile_phone"},addTags:{brand:"Київстар","brand:en":"Kyivstar","brand:wikidata":"Q2288463","brand:wikipedia":"en:Kyivstar",name:"Київстар","name:en":"Kyivstar",shop:"mobile_phone"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/МТС":{name:"МТС",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/mts/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1368919",shop:"mobile_phone"},addTags:{brand:"МТС","brand:en":"MTS","brand:wikidata":"Q1368919","brand:wikipedia":"en:MTS (network provider)",name:"МТС","name:en":"MTS",shop:"mobile_phone"},countryCodes:["by","ru","ua"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Мегафон":{name:"Мегафон",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/MegaFon.ru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1720713",shop:"mobile_phone"},addTags:{brand:"Мегафон","brand:en":"MegaFon","brand:wikidata":"Q1720713","brand:wikipedia":"en:MegaFon",name:"Мегафон","name:en":"MegaFon",shop:"mobile_phone"},countryCodes:["ru","tj"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Связной":{name:"Связной",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/svyaznoy.ru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q65371",shop:"mobile_phone"},addTags:{brand:"Связной","brand:en":"Svyaznoy","brand:wikidata":"Q65371","brand:wikipedia":"en:Svyaznoy",name:"Связной","name:en":"Svyaznoy",shop:"mobile_phone"},countryCodes:["by","ru","uz"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Теле2":{name:"Теле2",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/WeAreTele2/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q309865",shop:"mobile_phone"},addTags:{brand:"Теле2","brand:en":"Tele2","brand:wikidata":"Q309865","brand:wikipedia":"en:Tele2",name:"Теле2","name:en":"Tele2",shop:"mobile_phone"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/ソフトバンク":{name:"ソフトバンク",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/SoftBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7553832",shop:"mobile_phone"},addTags:{brand:"ソフトバンク","brand:en":"SoftBank Telecom","brand:ja":"ソフトバンク","brand:wikidata":"Q7553832","brand:wikipedia":"en:SoftBank Telecom",name:"ソフトバンク","name:en":"SoftBank Telecom","name:ja":"ソフトバンク",shop:"mobile_phone"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/ソフトバンクショップ":{name:"ソフトバンクショップ",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/SoftBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11315281",shop:"mobile_phone"},addTags:{brand:"ソフトバンクショップ","brand:en":"SoftBankShop","brand:ja":"ソフトバンクショップ","brand:wikidata":"Q11315281","brand:wikipedia":"ja:ソフトバンクショップ",name:"ソフトバンクショップ","name:en":"SoftBankShop","name:ja":"ソフトバンクショップ",shop:"mobile_phone"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/ドコモショップ":{name:"ドコモショップ",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/docomo.official/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q853958",shop:"mobile_phone"},addTags:{brand:"ドコモショップ","brand:en":"DoCoMo Shop","brand:ja":"ドコモショップ","brand:wikidata":"Q853958","brand:wikipedia":"ja:NTTドコモ",name:"ドコモショップ","name:en":"DoCoMo Shop","name:ja":"ドコモショップ",shop:"mobile_phone"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/money_lender/ACE Cash Express":{name:"ACE Cash Express",icon:"maki-bank",imageURL:"https://graph.facebook.com/acecashexpress/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q24260962",shop:"money_lender"},addTags:{brand:"ACE Cash Express","brand:wikidata":"Q24260962",name:"ACE Cash Express",shop:"money_lender"},countryCodes:["us"],terms:["ace"],matchScore:2,suggestion:true},"shop/money_lender/Advance America":{name:"Advance America",icon:"maki-bank",imageURL:"https://graph.facebook.com/AdvanceAmerica/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4686044",shop:"money_lender"},addTags:{brand:"Advance America","brand:wikidata":"Q4686044",name:"Advance America",shop:"money_lender"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/money_lender/California Check Cashing Stores":{name:"California Check Cashing Stores",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q64390932",shop:"money_lender"},addTags:{brand:"California Check Cashing Stores","brand:wikidata":"Q64390932",name:"California Check Cashing Stores",shop:"money_lender"},countryCodes:["us"],terms:["california check cashing"],matchScore:2,suggestion:true},"shop/money_lender/Cash Store":{name:"Cash Store",icon:"maki-bank",imageURL:"https://graph.facebook.com/cashstore/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61943411",shop:"money_lender"},addTags:{brand:"Cash Store","brand:wikidata":"Q61943411",name:"Cash Store",shop:"money_lender"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/money_lender/Check Into Cash":{name:"Check Into Cash",icon:"maki-bank",imageURL:"https://graph.facebook.com/checkintocash/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16961246",shop:"money_lender"},addTags:{brand:"Check Into Cash","brand:wikidata":"Q16961246","brand:wikipedia":"en:Check Into Cash",name:"Check Into Cash",shop:"money_lender"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/money_lender/Money Mart":{name:"Money Mart",icon:"maki-bank",imageURL:"https://graph.facebook.com/moneymartusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6899166",shop:"money_lender"},addTags:{brand:"Money Mart","brand:wikidata":"Q6899166","brand:wikipedia":"en:Money Mart",name:"Money Mart",shop:"money_lender"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/motorcycle/Harley-Davidson":{name:"Harley-Davidson",icon:"fas-motorcycle",imageURL:"https://graph.facebook.com/harley-davidson/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q192814",shop:"motorcycle"},addTags:{brand:"Harley-Davidson","brand:wikidata":"Q192814","brand:wikipedia":"en:Harley-Davidson",name:"Harley-Davidson",shop:"motorcycle"},terms:[],matchScore:2,suggestion:true},"shop/motorcycle/Honda":{name:"Honda",icon:"fas-motorcycle",imageURL:"https://graph.facebook.com/HondaJP/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q9584",shop:"motorcycle"},addTags:{brand:"Honda","brand:wikidata":"Q9584","brand:wikipedia":"en:Honda",name:"Honda",shop:"motorcycle"},terms:[],matchScore:2,suggestion:true},"shop/motorcycle/Kawasaki":{name:"Kawasaki",icon:"fas-motorcycle",imageURL:"https://graph.facebook.com/kawasaki/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6379855",shop:"motorcycle"},addTags:{brand:"Kawasaki","brand:wikidata":"Q6379855","brand:wikipedia":"en:Kawasaki motorcycles",name:"Kawasaki",shop:"motorcycle"},terms:[],matchScore:2,suggestion:true},"shop/motorcycle/Motortrade":{name:"Motortrade",icon:"fas-motorcycle",imageURL:"https://graph.facebook.com/MotortradePh/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q48803162",shop:"motorcycle"},addTags:{brand:"Motortrade","brand:wikidata":"Q48803162","brand:wikipedia":"en:Motortrade",name:"Motortrade",shop:"motorcycle"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"shop/motorcycle/Suzuki":{name:"Suzuki",icon:"fas-motorcycle",imageURL:"https://graph.facebook.com/SuzukiGlobalOfficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q181642",shop:"motorcycle"},addTags:{brand:"Suzuki","brand:wikidata":"Q181642","brand:wikipedia":"en:Suzuki",name:"Suzuki",shop:"motorcycle"},terms:[],matchScore:2,suggestion:true},"shop/motorcycle/Yamaha":{name:"Yamaha",icon:"fas-motorcycle",imageURL:"https://graph.facebook.com/yamahamotorusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q158888",shop:"motorcycle"},addTags:{brand:"Yamaha","brand:wikidata":"Q158888","brand:wikipedia":"en:Yamaha Motor Company",name:"Yamaha",shop:"motorcycle"},terms:[],matchScore:2,suggestion:true},"shop/music/FYE":{name:"FYE",icon:"fas-compact-disc",imageURL:"https://graph.facebook.com/FYE/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5424141",shop:"music"},addTags:{brand:"FYE","brand:wikidata":"Q5424141","brand:wikipedia":"en:FYE (retailer)",name:"FYE",shop:"music"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/music/HMV":{name:"HMV",icon:"fas-compact-disc",imageURL:"https://graph.facebook.com/hmv/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10854572",shop:"music"},addTags:{brand:"HMV","brand:wikidata":"Q10854572","brand:wikipedia":"en:HMV",name:"HMV",shop:"music"},countryCodes:["ca","gb"],terms:[],matchScore:2,suggestion:true},"shop/music/TSUTAYA":{name:"TSUTAYA",icon:"fas-compact-disc",imageURL:"https://graph.facebook.com/TSUTAYA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5193457",shop:"music"},addTags:{brand:"TSUTAYA","brand:wikidata":"Q5193457","brand:wikipedia":"ja:カルチュア・コンビニエンス・クラブ",name:"TSUTAYA",shop:"music"},terms:[],matchScore:2,suggestion:true},"shop/musical_instrument/Guitar Center":{name:"Guitar Center",icon:"fas-guitar",imageURL:"https://graph.facebook.com/GuitarCenter/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3622794",shop:"musical_instrument"},addTags:{brand:"Guitar Center","brand:wikidata":"Q3622794","brand:wikipedia":"en:Guitar Center",name:"Guitar Center",shop:"musical_instrument"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/newsagent/Cigo":{name:"Cigo",icon:"fas-newspaper",imageURL:"https://graph.facebook.com/cigo.nl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62391977",shop:"newsagent"},addTags:{brand:"Cigo","brand:wikidata":"Q62391977",name:"Cigo",shop:"newsagent"},countryCodes:["de","nl"],terms:[],matchScore:2,suggestion:true},"shop/newsagent/Kolporter":{name:"Kolporter",icon:"fas-newspaper",imageURL:"https://graph.facebook.com/kolporterpl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6427874",shop:"kiosk"},addTags:{brand:"Kolporter","brand:wikidata":"Q6427874","brand:wikipedia":"pl:Kolporter (przedsiębiorstwo)",name:"Kolporter",shop:"kiosk"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/newsagent/Maison de la Presse":{name:"Maison de la Presse",icon:"fas-newspaper",imageURL:"https://graph.facebook.com/260230084083052/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62085960",shop:"newsagent"},addTags:{brand:"Maison de la Presse","brand:wikidata":"Q62085960",name:"Maison de la Presse",shop:"newsagent"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/newsagent/Martin's":{name:"Martin's",icon:"fas-newspaper",imageURL:"https://graph.facebook.com/YourMcColls/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16997477",shop:"newsagent"},addTags:{brand:"Martin's","brand:wikidata":"Q16997477","brand:wikipedia":"en:McColl's",name:"Martin's",shop:"newsagent"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/newsagent/Primera":{name:"Primera",icon:"fas-newspaper",imageURL:"https://graph.facebook.com/Primera.nl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2176149",shop:"newsagent"},addTags:{brand:"Primera","brand:wikidata":"Q2176149","brand:wikipedia":"nl:Primera (winkelketen)",name:"Primera",shop:"newsagent"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/newsagent/Relay":{name:"Relay",icon:"fas-newspaper",imageURL:"https://pbs.twimg.com/profile_images/1024284754911416320/NcQ5ml-K_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q3424298",shop:"newsagent"},addTags:{brand:"Relay","brand:wikidata":"Q3424298","brand:wikipedia":"en:Relay (shop)",name:"Relay",shop:"newsagent"},terms:[],matchScore:2,suggestion:true},"shop/newsagent/WHSmith":{name:"WHSmith",icon:"fas-newspaper",imageURL:"https://graph.facebook.com/WHSmithuk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1548712",shop:"newsagent"},addTags:{brand:"WHSmith","brand:wikidata":"Q1548712","brand:wikipedia":"en:WHSmith",name:"WHSmith",shop:"newsagent"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/newsagent/k kiosk":{name:"k kiosk",icon:"fas-newspaper",imageURL:"https://graph.facebook.com/kkiosk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q60381703",shop:"newsagent"},addTags:{brand:"k kiosk","brand:wikidata":"Q60381703","brand:wikipedia":"it:K Kiosk",name:"k kiosk",shop:"newsagent"},countryCodes:["ch"],terms:[],matchScore:2,suggestion:true},"shop/newsagent/Белсоюзпечать":{name:"Белсоюзпечать",icon:"fas-newspaper",geometry:["point","area"],tags:{"brand:wikidata":"Q4430611",shop:"newsagent"},addTags:{brand:"Белсоюзпечать","brand:wikidata":"Q4430611","brand:wikipedia":"ru:Союзпечать",name:"Белсоюзпечать",shop:"newsagent"},countryCodes:["by"],terms:[],matchScore:2,suggestion:true},"shop/newsagent/Витебскоблсоюзпечать":{name:"Витебскоблсоюзпечать",icon:"fas-newspaper",geometry:["point","area"],tags:{"brand:wikidata":"Q4430611",shop:"newsagent"},addTags:{brand:"Витебскоблсоюзпечать","brand:wikidata":"Q4430611","brand:wikipedia":"ru:Союзпечать",name:"Витебскоблсоюзпечать",shop:"newsagent"},countryCodes:["by"],terms:[],matchScore:2,suggestion:true},"shop/newsagent/Первая полоса":{name:"Первая полоса",icon:"fas-newspaper",geometry:["point","area"],tags:{"brand:wikidata":"Q62736412",shop:"newsagent"},addTags:{brand:"Первая полоса","brand:wikidata":"Q62736412",name:"Первая полоса",shop:"newsagent"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/newsagent/Союзпечать":{name:"Союзпечать",icon:"fas-newspaper",geometry:["point","area"],tags:{"brand:wikidata":"Q4430611",shop:"newsagent"},addTags:{brand:"Союзпечать","brand:wikidata":"Q4430611","brand:wikipedia":"ru:Союзпечать",name:"Союзпечать",shop:"newsagent"},countryCodes:["by","kz","ru","ua"],terms:[],matchScore:2,suggestion:true},"shop/newsagent/読売新聞":{name:"読売新聞",icon:"fas-newspaper",imageURL:"https://pbs.twimg.com/profile_images/1091035339232227328/elp0X_L6_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q645218",shop:"newsagent"},addTags:{brand:"読売新聞","brand:en":"Yomiuri Shimbun","brand:wikidata":"Q645218","brand:wikipedia":"en:Yomiuri Shimbun",name:"読売新聞","name:en":"Yomiuri Shimbun",shop:"newsagent"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/nutrition_supplements/GNC":{name:"GNC",icon:"maki-shop",imageURL:"https://graph.facebook.com/GNCLiveWell/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4808595",shop:"nutrition_supplements"},addTags:{brand:"GNC","brand:wikidata":"Q4808595","brand:wikipedia":"en:GNC (store)",name:"GNC",shop:"nutrition_supplements"},terms:["gnc live well"],matchScore:2,suggestion:true},"shop/nutrition_supplements/The Vitamin Shoppe":{name:"The Vitamin Shoppe",icon:"maki-shop",imageURL:"https://graph.facebook.com/THEVITAMINSHOPPE/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7772938",shop:"nutrition_supplements"},addTags:{brand:"The Vitamin Shoppe","brand:wikidata":"Q7772938","brand:wikipedia":"en:The Vitamin Shoppe",name:"The Vitamin Shoppe",shop:"nutrition_supplements"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/nutrition_supplements/Vitamin World":{name:"Vitamin World",icon:"maki-shop",imageURL:"https://pbs.twimg.com/profile_images/1083747378878914561/lXRtQg0T_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q7936979",shop:"nutrition_supplements"},addTags:{brand:"Vitamin World","brand:wikidata":"Q7936979","brand:wikipedia":"en:Vitamin World",name:"Vitamin World",shop:"nutrition_supplements"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/optician/Alain Afflelou":{name:"Alain Afflelou",icon:"maki-optician",imageURL:"https://graph.facebook.com/AlainAfflelouOptico/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2829511",shop:"optician"},addTags:{brand:"Alain Afflelou","brand:wikidata":"Q2829511","brand:wikipedia":"fr:Alain Afflelou (entreprise)",name:"Alain Afflelou",shop:"optician"},countryCodes:["be","ch","es","fr","pt"],terms:[],matchScore:2,suggestion:true},"shop/optician/America's Best Contacts & Eyeglasses":{name:"America's Best Contacts & Eyeglasses",icon:"maki-optician",imageURL:"https://graph.facebook.com/AmericasBestContactsandEyeglasses/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4742504",shop:"optician"},addTags:{brand:"America's Best Contacts & Eyeglasses","brand:wikidata":"Q4742504","brand:wikipedia":"en:America's Best Contacts & Eyeglasses",name:"America's Best Contacts & Eyeglasses",shop:"optician",short_name:"America's Best"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/optician/Apollo-Optik":{name:"Apollo-Optik",icon:"maki-optician",imageURL:"https://graph.facebook.com/ApolloOptik/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q618940",shop:"optician"},addTags:{brand:"Apollo-Optik","brand:wikidata":"Q618940","brand:wikipedia":"de:Apollo-Optik",name:"Apollo-Optik",shop:"optician",short_name:"Apollo"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/optician/Atol":{name:"Atol",icon:"maki-optician",imageURL:"https://graph.facebook.com/opticiensatol/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2869542",shop:"optician"},addTags:{brand:"Atol","brand:wikidata":"Q2869542","brand:wikipedia":"fr:Atol (opticien)",name:"Atol",shop:"optician"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/optician/Boots Opticians":{name:"Boots Opticians",icon:"maki-optician",imageURL:"https://graph.facebook.com/BootsUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4944037",shop:"optician"},addTags:{brand:"Boots Opticians","brand:wikidata":"Q4944037","brand:wikipedia":"en:Boots Opticians",name:"Boots Opticians",shop:"optician",short_name:"Boots"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/optician/Clarkson Eyecare":{name:"Clarkson Eyecare",icon:"maki-optician",geometry:["point","area"],tags:{"brand:wikidata":"Q64027001",shop:"optician"},addTags:{brand:"Clarkson Eyecare","brand:wikidata":"Q64027001",healthcare:"optometrist",name:"Clarkson Eyecare",shop:"optician",short_name:"Clarkson"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/optician/Cohen's Fashion Optical":{name:"Cohen's Fashion Optical",icon:"maki-optician",imageURL:"https://graph.facebook.com/cohensoptical/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5141313",shop:"optician"},addTags:{brand:"Cohen's Fashion Optical","brand:wikidata":"Q5141313","brand:wikipedia":"en:Cohen's Fashion Optical",healthcare:"optometrist",name:"Cohen's Fashion Optical",shop:"optician",short_name:"Cohen's"},countryCodes:["us"],terms:["cohen's optical"],matchScore:2,suggestion:true},"shop/optician/Eye Wish":{name:"Eye Wish",icon:"maki-optician",imageURL:"https://graph.facebook.com/EyeWishOpticiens/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62391641",shop:"optician"},addTags:{brand:"Eye Wish","brand:wikidata":"Q62391641",name:"Eye Wish",shop:"optician"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/optician/Fielmann":{name:"Fielmann",icon:"maki-optician",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2F160506%20Fielmann%20LogoNEU%20pos%20wiki.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q457822",shop:"optician"},addTags:{brand:"Fielmann","brand:wikidata":"Q457822","brand:wikipedia":"en:Fielmann",name:"Fielmann",shop:"optician"},terms:[],matchScore:2,suggestion:true},"shop/optician/General Óptica":{name:"General Óptica",icon:"maki-optician",imageURL:"https://graph.facebook.com/generaloptica/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62391672",shop:"optician"},addTags:{brand:"General Óptica","brand:wikidata":"Q62391672",name:"General Óptica",shop:"optician"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"shop/optician/Grand Optical":{name:"Grand Optical",icon:"maki-optician",imageURL:"https://graph.facebook.com/grandoptical/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3113677",shop:"optician"},addTags:{brand:"Grand Optical","brand:wikidata":"Q3113677","brand:wikipedia":"fr:Grand Optical",name:"Grand Optical",shop:"optician"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/optician/Générale d'Optique":{name:"Générale d'Optique",icon:"maki-optician",imageURL:"https://graph.facebook.com/generaledoptique/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62391701",shop:"optician"},addTags:{brand:"Générale d'Optique","brand:wikidata":"Q62391701",name:"Générale d'Optique",shop:"optician"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/optician/Hakim Optical":{name:"Hakim Optical",icon:"maki-optician",imageURL:"https://graph.facebook.com/HakimOptical/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q28232761",shop:"optician"},addTags:{brand:"Hakim Optical","brand:wikidata":"Q28232761","brand:wikipedia":"en:Hakim Optical",name:"Hakim Optical",shop:"optician"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/optician/Hans Anders":{name:"Hans Anders",icon:"maki-optician",imageURL:"https://graph.facebook.com/hansanders.nl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1884976",shop:"optician"},addTags:{brand:"Hans Anders","brand:wikidata":"Q1884976","brand:wikipedia":"nl:Hans Anders",name:"Hans Anders",shop:"optician"},countryCodes:["be","fr","nl"],terms:[],matchScore:2,suggestion:true},"shop/optician/Instrumentarium":{name:"Instrumentarium",icon:"maki-optician",imageURL:"https://graph.facebook.com/instru.fi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11864937",shop:"optician"},addTags:{brand:"Instrumentarium","brand:wikidata":"Q11864937","brand:wikipedia":"fi:Instrumentarium",name:"Instrumentarium",shop:"optician"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"shop/optician/Krys":{name:"Krys",icon:"maki-optician",imageURL:"https://graph.facebook.com/Krys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3119538",shop:"optician"},addTags:{brand:"Krys","brand:wikidata":"Q3119538","brand:wikipedia":"fr:Krys Group",name:"Krys",shop:"optician"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/optician/LensCrafters":{name:"LensCrafters",icon:"maki-optician",imageURL:"https://graph.facebook.com/LensCrafters/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6523209",shop:"optician"},addTags:{brand:"LensCrafters","brand:wikidata":"Q6523209","brand:wikipedia":"en:LensCrafters",name:"LensCrafters",shop:"optician"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/optician/Les Opticiens Mutualistes":{name:"Les Opticiens Mutualistes",icon:"maki-optician",imageURL:"https://graph.facebook.com/lesopticiensmutualistes.officiel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q18414551",shop:"optician"},addTags:{brand:"Les Opticiens Mutualistes","brand:wikidata":"Q18414551","brand:wikipedia":"fr:Les Opticiens Mutualistes",name:"Les Opticiens Mutualistes",shop:"optician"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/optician/Lissac":{name:"Lissac",icon:"maki-optician",imageURL:"https://graph.facebook.com/lissac.opticien/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63102559",shop:"optician"},addTags:{brand:"Lissac","brand:wikidata":"Q63102559",name:"Lissac",shop:"optician"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/optician/Multiópticas (Portugal)":{name:"Multiópticas (Portugal)",icon:"maki-optician",imageURL:"https://graph.facebook.com/MultiOpticasPortugal/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62391722",shop:"optician"},addTags:{brand:"Multiópticas","brand:wikidata":"Q62391722",name:"Multiópticas",shop:"optician"},countryCodes:["pt"],terms:[],matchScore:2,suggestion:true},"shop/optician/Multiópticas (Spain)":{name:"Multiópticas (Spain)",icon:"maki-optician",imageURL:"https://graph.facebook.com/Multiopticas/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62391719",shop:"optician"},addTags:{brand:"Multiópticas","brand:wikidata":"Q62391719",name:"Multiópticas",shop:"optician"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"shop/optician/Oakley":{name:"Oakley",icon:"maki-optician",imageURL:"https://graph.facebook.com/Oakley/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q161906",shop:"optician"},addTags:{brand:"Oakley","brand:wikidata":"Q161906","brand:wikipedia":"en:Oakley, Inc.",name:"Oakley",shop:"optician"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/optician/Oliver Peoples":{name:"Oliver Peoples",icon:"maki-optician",imageURL:"https://graph.facebook.com/oliverpeoples/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7087746",shop:"optician"},addTags:{brand:"Oliver Peoples","brand:wikidata":"Q7087746","brand:wikipedia":"en:Oliver Peoples",name:"Oliver Peoples",shop:"optician"},terms:[],matchScore:2,suggestion:true},"shop/optician/Optic 2000":{name:"Optic 2000",icon:"maki-optician",imageURL:"https://graph.facebook.com/optic2000/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3354445",shop:"optician"},addTags:{brand:"Optic 2000","brand:wikidata":"Q3354445","brand:wikipedia":"fr:Optic 2000",name:"Optic 2000",shop:"optician"},countryCodes:["ch","fr"],terms:[],matchScore:2,suggestion:true},"shop/optician/Optical Center":{name:"Optical Center",icon:"maki-optician",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20opticalcenter.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q3354448",shop:"optician"},addTags:{brand:"Optical Center","brand:wikidata":"Q3354448","brand:wikipedia":"fr:Optical Center",name:"Optical Center",shop:"optician"},terms:[],matchScore:2,suggestion:true},"shop/optician/Opticalia":{name:"Opticalia",icon:"maki-optician",imageURL:"https://graph.facebook.com/OPTICALIAGRUPO/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62082114",shop:"optician"},addTags:{brand:"Opticalia","brand:wikidata":"Q62082114",name:"Opticalia",shop:"optician"},terms:[],matchScore:2,suggestion:true},"shop/optician/Pearle Vision":{name:"Pearle Vision",icon:"maki-optician",imageURL:"https://graph.facebook.com/pearlevision/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2231148",shop:"optician"},addTags:{brand:"Pearle Vision","brand:wikidata":"Q2231148","brand:wikipedia":"en:Pearle Vision",name:"Pearle Vision",shop:"optician",short_name:"Pearle"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/optician/Silmäasema":{name:"Silmäasema",icon:"maki-optician",imageURL:"https://graph.facebook.com/silmaasema/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q15994200",shop:"optician"},addTags:{brand:"Silmäasema","brand:wikidata":"Q15994200","brand:wikipedia":"fi:Silmäasema",name:"Silmäasema",shop:"optician"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"shop/optician/Specsavers":{name:"Specsavers",icon:"maki-optician",imageURL:"https://graph.facebook.com/Specsavers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2000610",shop:"optician"},addTags:{brand:"Specsavers","brand:wikidata":"Q2000610","brand:wikipedia":"en:Specsavers",name:"Specsavers",shop:"optician"},terms:[],matchScore:2,suggestion:true},"shop/optician/Sunglass Hut":{name:"Sunglass Hut",icon:"maki-optician",imageURL:"https://graph.facebook.com/SunglassHut/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q136311",shop:"optician"},addTags:{brand:"Sunglass Hut","brand:wikidata":"Q136311","brand:wikipedia":"en:Sunglass Hut",name:"Sunglass Hut",shop:"optician"},terms:[],matchScore:2,suggestion:true},"shop/optician/Synoptik":{name:"Synoptik",icon:"maki-optician",imageURL:"https://graph.facebook.com/synoptiksverige/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10687541",shop:"optician"},addTags:{brand:"Synoptik","brand:wikidata":"Q10687541","brand:wikipedia":"sv:Synoptik",name:"Synoptik",shop:"optician"},countryCodes:["se"],terms:[],matchScore:2,suggestion:true},"shop/optician/Synsam":{name:"Synsam",icon:"maki-optician",imageURL:"https://graph.facebook.com/synsam.se/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12004589",shop:"optician"},addTags:{brand:"Synsam","brand:wikidata":"Q12004589","brand:wikipedia":"sv:Synsam",name:"Synsam",shop:"optician"},countryCodes:["fi","no","se"],terms:[],matchScore:2,suggestion:true},"shop/optician/Target Optical":{name:"Target Optical",icon:"maki-optician",imageURL:"https://graph.facebook.com/targetopticalnn/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q19903688",shop:"optician"},addTags:{brand:"Target Optical","brand:wikidata":"Q19903688","brand:wikipedia":"en:Target Optical",name:"Target Optical",shop:"optician"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/optician/Vision Express":{name:"Vision Express",icon:"maki-optician",imageURL:"https://graph.facebook.com/visionexpress/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7936150",shop:"optician"},addTags:{brand:"Vision Express","brand:wikidata":"Q7936150","brand:wikipedia":"en:Vision Express",name:"Vision Express",shop:"optician"},terms:[],matchScore:2,suggestion:true},"shop/optician/Visionworks":{name:"Visionworks",icon:"maki-optician",imageURL:"https://graph.facebook.com/Visionworks/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5422607",shop:"optician"},addTags:{brand:"Visionworks","brand:wikidata":"Q5422607","brand:wikipedia":"en:Visionworks",name:"Visionworks",shop:"optician"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/optician/Warby Parker":{name:"Warby Parker",icon:"maki-optician",imageURL:"https://graph.facebook.com/warbyparker/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7968882",shop:"optician"},addTags:{brand:"Warby Parker","brand:wikidata":"Q7968882","brand:wikipedia":"en:Warby Parker",name:"Warby Parker",shop:"optician"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/optician/แว่นท็อปเจริญ":{name:"แว่นท็อปเจริญ",icon:"maki-optician",imageURL:"https://graph.facebook.com/TopCharoenOpticalOfficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62391732",shop:"optician"},addTags:{brand:"แว่นท็อปเจริญ","brand:th":"แว่นท็อปเจริญ","brand:wikidata":"Q62391732",name:"แว่นท็อปเจริญ","name:th":"แว่นท็อปเจริญ",shop:"optician"},countryCodes:["th"],terms:[],matchScore:2,suggestion:true},"shop/optician/メガネスーパー":{name:"メガネスーパー",icon:"maki-optician",imageURL:"https://graph.facebook.com/meganesuper/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11343504",shop:"optician"},addTags:{brand:"メガネスーパー","brand:ja":"メガネスーパー","brand:wikidata":"Q11343504","brand:wikipedia":"ja:メガネスーパー",name:"メガネスーパー","name:en":"Meganesuper","name:ja":"メガネスーパー",shop:"optician"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/optician/寶島眼鏡":{name:"寶島眼鏡",icon:"maki-optician",imageURL:"https://graph.facebook.com/formosafans/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62391741",shop:"optician"},addTags:{brand:"寶島眼鏡","brand:wikidata":"Q62391741",name:"寶島眼鏡",shop:"optician"},countryCodes:["zh"],terms:[],matchScore:2,suggestion:true},"shop/optician/眼鏡市場":{name:"眼鏡市場",icon:"maki-optician",imageURL:"https://graph.facebook.com/meganeichiba.jp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11343506",shop:"optician"},addTags:{brand:"眼鏡市場","brand:en":"Megane Ichiba","brand:wikidata":"Q11343506","brand:wikipedia":"ja:メガネトップ",name:"眼鏡市場","name:en":"Megane Ichiba",shop:"optician"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/outdoor/Bass Pro Shops":{name:"Bass Pro Shops",icon:"temaki-compass",imageURL:"https://graph.facebook.com/bassproshops/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4867953",shop:"outdoor"},addTags:{brand:"Bass Pro Shops","brand:wikidata":"Q4867953","brand:wikipedia":"en:Bass Pro Shops",name:"Bass Pro Shops",shop:"outdoor"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/outdoor/Blacks":{name:"Blacks",icon:"temaki-compass",imageURL:"https://graph.facebook.com/blacksonline/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64822933",shop:"outdoor"},addTags:{brand:"Blacks","brand:wikidata":"Q64822933",name:"Blacks",shop:"outdoor"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/outdoor/Cabela's":{name:"Cabela's",icon:"temaki-compass",imageURL:"https://graph.facebook.com/Cabelas/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2793714",shop:"outdoor"},addTags:{brand:"Cabela's","brand:wikidata":"Q2793714","brand:wikipedia":"en:Cabela's",name:"Cabela's",shop:"outdoor"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/outdoor/Gander Outdoors":{name:"Gander Outdoors",icon:"temaki-compass",imageURL:"https://graph.facebook.com/GanderOutdoors/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64357426",shop:"outdoor"},addTags:{brand:"Gander Outdoors","brand:wikidata":"Q64357426","brand:wikipedia":"en:Gander Outdoors",name:"Gander Outdoors",shop:"outdoor"},countryCodes:["us"],terms:["gander mountain"],matchScore:2,suggestion:true},"shop/outdoor/Jack Wolfskin":{name:"Jack Wolfskin",icon:"temaki-compass",imageURL:"https://graph.facebook.com/JACKWOLFSKINofficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q536133",shop:"outdoor"},addTags:{brand:"Jack Wolfskin","brand:wikidata":"Q536133","brand:wikipedia":"en:Jack Wolfskin",name:"Jack Wolfskin",shop:"outdoor"},countryCodes:["ch","de","fr"],terms:[],matchScore:2,suggestion:true},"shop/outdoor/Kathmandu":{name:"Kathmandu",icon:"temaki-compass",imageURL:"https://graph.facebook.com/kathmandu/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1736294",shop:"outdoor"},addTags:{brand:"Kathmandu","brand:wikidata":"Q1736294","brand:wikipedia":"en:Kathmandu (company)",name:"Kathmandu",shop:"outdoor"},countryCodes:["au","nz"],terms:[],matchScore:2,suggestion:true},"shop/outdoor/Millets":{name:"Millets",icon:"temaki-compass",imageURL:"https://graph.facebook.com/milletsonlinefans/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64822903",shop:"outdoor"},addTags:{brand:"Millets","brand:wikidata":"Q64822903",name:"Millets",shop:"outdoor"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/outdoor/Mountain Warehouse":{name:"Mountain Warehouse",icon:"temaki-compass",imageURL:"https://graph.facebook.com/MountainWarehouse/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6925414",shop:"outdoor"},addTags:{brand:"Mountain Warehouse","brand:wikidata":"Q6925414","brand:wikipedia":"en:Mountain Warehouse",name:"Mountain Warehouse",shop:"outdoor"},countryCodes:["gb","pl"],terms:[],matchScore:2,suggestion:true},"shop/outdoor/REI":{name:"REI",icon:"temaki-compass",imageURL:"https://graph.facebook.com/9062006483/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3414933",shop:"outdoor"},addTags:{brand:"REI","brand:wikidata":"Q3414933","brand:wikipedia":"en:Recreational Equipment, Inc.",name:"REI",shop:"outdoor"},countryCodes:["id","us"],terms:[],matchScore:2,suggestion:true},"shop/outdoor/Sportsman's Warehouse":{name:"Sportsman's Warehouse",icon:"temaki-compass",imageURL:"https://graph.facebook.com/sportsmanswh/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7579979",shop:"outdoor"},addTags:{brand:"Sportsman's Warehouse","brand:wikidata":"Q7579979","brand:wikipedia":"en:Sportsman's Warehouse",name:"Sportsman's Warehouse",shop:"outdoor"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/outdoor/Trespass":{name:"Trespass",icon:"temaki-compass",imageURL:"https://graph.facebook.com/trespass/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17035733",shop:"outdoor"},addTags:{brand:"Trespass","brand:wikidata":"Q17035733","brand:wikipedia":"en:Trespass (clothing)",name:"Trespass",shop:"outdoor"},countryCodes:["fr","gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/outpost/Wildberries":{name:"Wildberries",icon:"maki-shop",imageURL:"https://graph.facebook.com/wildberries.ru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q24933714",shop:"outpost"},addTags:{brand:"Wildberries","brand:wikidata":"Q24933714","brand:wikipedia":"ru:Wildberries",name:"Wildberries",shop:"outpost"},countryCodes:["by","ru"],terms:[],matchScore:2,suggestion:true},"shop/paint/Benjamin Moore":{name:"Benjamin Moore",icon:"fas-paint-roller",imageURL:"https://graph.facebook.com/benjaminmoorepaints/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4889038",shop:"paint"},addTags:{brand:"Benjamin Moore","brand:wikidata":"Q4889038","brand:wikipedia":"en:Benjamin Moore & Co.",name:"Benjamin Moore",shop:"paint"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/paint/Comex":{name:"Comex",icon:"fas-paint-roller",imageURL:"https://graph.facebook.com/Comex/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5151654",shop:"paint"},addTags:{brand:"Comex","brand:wikidata":"Q5151654","brand:wikipedia":"en:Comex Group",name:"Comex",shop:"paint"},terms:[],matchScore:2,suggestion:true},"shop/paint/Jotun":{name:"Jotun",icon:"fas-paint-roller",imageURL:"https://graph.facebook.com/JotunGroup/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1778870",shop:"paint"},addTags:{brand:"Jotun","brand:wikidata":"Q1778870","brand:wikipedia":"en:Jotun (company)",name:"Jotun",shop:"paint"},terms:[],matchScore:2,suggestion:true},"shop/paint/National Paints":{name:"National Paints",icon:"fas-paint-roller",imageURL:"https://graph.facebook.com/NationalPaints/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62073521",shop:"paint"},addTags:{brand:"National Paints","brand:wikidata":"Q62073521",name:"National Paints",shop:"paint"},countryCodes:["ae","qa"],terms:[],matchScore:2,suggestion:true},"shop/paint/Sherwin-Williams":{name:"Sherwin-Williams",icon:"fas-paint-roller",imageURL:"https://graph.facebook.com/SherwinWilliamsforYourHome/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q48881",shop:"paint"},addTags:{brand:"Sherwin-Williams","brand:wikidata":"Q48881","brand:wikipedia":"en:Sherwin-Williams",name:"Sherwin-Williams",shop:"paint"},terms:["sherwin williams paint store","sherwin williams paints"],matchScore:2,suggestion:true},"shop/party/Party City":{name:"Party City",icon:"fas-mask",imageURL:"https://graph.facebook.com/PartyCity/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7140896",shop:"party"},addTags:{brand:"Party City","brand:wikidata":"Q7140896","brand:wikipedia":"en:Party City",name:"Party City",shop:"party"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/pastry/Smallcakes":{name:"Smallcakes",icon:"maki-bakery",imageURL:"https://graph.facebook.com/SmallcakesKC/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62384749",shop:"pastry"},addTags:{brand:"Smallcakes","brand:wikidata":"Q62384749",name:"Smallcakes",shop:"pastry"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/pawnbroker/Cash Converters":{name:"Cash Converters",icon:"maki-shop",imageURL:"https://graph.facebook.com/CashConvertersUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5048645",shop:"pawnbroker"},addTags:{brand:"Cash Converters","brand:wikidata":"Q5048645","brand:wikipedia":"en:Cash Converters",name:"Cash Converters",shop:"pawnbroker"},terms:[],matchScore:2,suggestion:true},"shop/pawnbroker/Cebuana Lhuillier":{name:"Cebuana Lhuillier",icon:"maki-shop",imageURL:"https://graph.facebook.com/cebuanalhuillierpawnshop/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17064661",shop:"pawnbroker"},addTags:{brand:"Cebuana Lhuillier","brand:wikidata":"Q17064661","brand:wikipedia":"en:Cebuana Lhuillier",name:"Cebuana Lhuillier",shop:"pawnbroker"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"shop/pawnbroker/Palawan Pawnshop":{name:"Palawan Pawnshop",icon:"maki-shop",imageURL:"https://graph.facebook.com/palawan.pawnshop/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62391488",shop:"pawnbroker"},addTags:{brand:"Palawan Pawnshop","brand:wikidata":"Q62391488",name:"Palawan Pawnshop",shop:"pawnbroker"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"shop/pawnbroker/Villarica Pawnshop":{name:"Villarica Pawnshop",icon:"maki-shop",imageURL:"https://graph.facebook.com/155765647803482/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62391438",shop:"pawnbroker"},addTags:{brand:"Villarica Pawnshop","brand:wikidata":"Q62391438",name:"Villarica Pawnshop",shop:"pawnbroker"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"shop/perfumery/Douglas":{name:"Douglas",icon:"maki-shop",imageURL:"https://graph.facebook.com/DouglasDeutschland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2052213",shop:"perfumery"},addTags:{brand:"Douglas","brand:wikidata":"Q2052213","brand:wikipedia":"de:Parfümerie Douglas",name:"Douglas",shop:"perfumery"},countryCodes:["at","ch","de","es","it","nl","pl"],terms:[],matchScore:2,suggestion:true},"shop/perfumery/FAnn":{name:"FAnn",icon:"maki-shop",imageURL:"https://graph.facebook.com/FAnn.cz/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62391353",shop:"perfumery"},addTags:{brand:"FAnn","brand:wikidata":"Q62391353",name:"FAnn",shop:"perfumery"},countryCodes:["cz","sk"],terms:[],matchScore:2,suggestion:true},"shop/perfumery/ICI PARIS XL":{name:"ICI PARIS XL",icon:"maki-shop",imageURL:"https://graph.facebook.com/iciparisxlbe/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q769749",shop:"perfumery"},addTags:{brand:"ICI PARIS XL","brand:wikidata":"Q769749","brand:wikipedia":"en:ICI Paris XL",name:"ICI PARIS XL",shop:"perfumery"},countryCodes:["be","lu","nl"],terms:[],matchScore:2,suggestion:true},"shop/perfumery/Marionnaud":{name:"Marionnaud",icon:"maki-shop",imageURL:"https://graph.facebook.com/Marionnaud.France/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1129073",shop:"perfumery"},addTags:{brand:"Marionnaud","brand:wikidata":"Q1129073","brand:wikipedia":"fr:Marionnaud",name:"Marionnaud",shop:"perfumery"},countryCodes:["at","ch","es","fr","it","sk"],terms:[],matchScore:2,suggestion:true},"shop/perfumery/O Boticário":{name:"O Boticário",icon:"maki-shop",imageURL:"https://graph.facebook.com/oboticario/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7073219",shop:"perfumery"},addTags:{brand:"O Boticário","brand:wikidata":"Q7073219","brand:wikipedia":"en:O Boticário",name:"O Boticário",shop:"perfumery"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"shop/pet/Das Futterhaus":{name:"Das Futterhaus",icon:"maki-dog-park",imageURL:"https://graph.facebook.com/futterhaus.deutschland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1167914",shop:"pet"},addTags:{brand:"Das Futterhaus","brand:wikidata":"Q1167914","brand:wikipedia":"de:Das Futterhaus",name:"Das Futterhaus",shop:"pet"},countryCodes:["at","de"],terms:[],matchScore:2,suggestion:true},"shop/pet/Faunatar":{name:"Faunatar",icon:"maki-dog-park",imageURL:"https://graph.facebook.com/Faunatar/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11859415",shop:"pet"},addTags:{brand:"Faunatar","brand:wikidata":"Q11859415","brand:wikipedia":"fi:Faunatar",name:"Faunatar",shop:"pet"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"shop/pet/Fressnapf":{name:"Fressnapf",icon:"maki-dog-park",imageURL:"https://graph.facebook.com/Fressnapf/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q875796",shop:"pet"},addTags:{brand:"Fressnapf","brand:wikidata":"Q875796","brand:wikipedia":"en:Fressnapf",name:"Fressnapf",shop:"pet"},countryCodes:["at","ch","de","hu","lu"],terms:[],matchScore:2,suggestion:true},"shop/pet/Global Pet Foods":{name:"Global Pet Foods",icon:"maki-dog-park",imageURL:"https://pbs.twimg.com/profile_images/879147372143661056/QsqRYNnI_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q57985699",shop:"pet"},addTags:{brand:"Global Pet Foods","brand:wikidata":"Q57985699",name:"Global Pet Foods",shop:"pet"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/pet/Maxi Zoo":{name:"Maxi Zoo",icon:"maki-dog-park",imageURL:"https://graph.facebook.com/Fressnapf/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q875796",shop:"pet"},addTags:{brand:"Maxi Zoo","brand:wikidata":"Q875796","brand:wikipedia":"en:Fressnapf",name:"Maxi Zoo",shop:"pet"},countryCodes:["be","ch","dk","fr","ie","it","pl"],terms:[],matchScore:2,suggestion:true},"shop/pet/Mud Bay":{name:"Mud Bay",icon:"maki-dog-park",imageURL:"https://graph.facebook.com/mudbay/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q30324179",shop:"pet"},addTags:{brand:"Mud Bay","brand:wikidata":"Q30324179","brand:wikipedia":"en:Mud Bay pet store",name:"Mud Bay",shop:"pet"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/pet/Musti ja Mirri":{name:"Musti ja Mirri",icon:"maki-dog-park",imageURL:"https://graph.facebook.com/mustijamirri/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11883558",shop:"pet"},addTags:{brand:"Musti ja Mirri","brand:wikidata":"Q11883558","brand:wikipedia":"fi:Musti ja Mirri",name:"Musti ja Mirri",shop:"pet"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"shop/pet/Pet Food Express":{name:"Pet Food Express",icon:"maki-dog-park",imageURL:"https://graph.facebook.com/petfoodexpress/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7171541",shop:"pet"},addTags:{brand:"Pet Food Express","brand:wikidata":"Q7171541","brand:wikipedia":"en:Pet Food Express",name:"Pet Food Express",shop:"pet"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/pet/Pet Supermarket":{name:"Pet Supermarket",icon:"maki-dog-park",imageURL:"https://graph.facebook.com/PetSupermarket/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61968363",shop:"pet"},addTags:{brand:"Pet Supermarket","brand:wikidata":"Q61968363",name:"Pet Supermarket",shop:"pet"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/pet/Pet Supplies Plus":{name:"Pet Supplies Plus",icon:"maki-dog-park",imageURL:"https://graph.facebook.com/petsuppliesplus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7171563",shop:"pet"},addTags:{brand:"Pet Supplies Plus","brand:wikidata":"Q7171563","brand:wikipedia":"en:Pet Supplies Plus",name:"Pet Supplies Plus",shop:"pet"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/pet/Pet Valu":{name:"Pet Valu",icon:"maki-dog-park",imageURL:"https://graph.facebook.com/PetValuUS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q58009635",shop:"pet"},addTags:{brand:"Pet Valu","brand:wikidata":"Q58009635",name:"Pet Valu",shop:"pet"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/pet/PetSmart":{name:"PetSmart",icon:"maki-dog-park",imageURL:"https://graph.facebook.com/PetSmart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3307147",shop:"pet"},addTags:{brand:"PetSmart","brand:wikidata":"Q3307147","brand:wikipedia":"en:PetSmart",name:"PetSmart",shop:"pet"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/pet/Petco":{name:"Petco",icon:"maki-dog-park",imageURL:"https://graph.facebook.com/Petco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7171798",shop:"pet"},addTags:{brand:"Petco","brand:wikidata":"Q7171798","brand:wikipedia":"en:Petco",name:"Petco",shop:"pet"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/pet/Petland":{name:"Petland",icon:"maki-dog-park",imageURL:"https://graph.facebook.com/PetlandUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17111474",shop:"pet"},addTags:{brand:"Petland","brand:wikidata":"Q17111474","brand:wikipedia":"en:Petland",name:"Petland",shop:"pet"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/pet/Petland Discounts":{name:"Petland Discounts",icon:"maki-dog-park",imageURL:"https://graph.facebook.com/petlanddiscount/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7178463",shop:"pet"},addTags:{brand:"Petland Discounts","brand:wikidata":"Q7178463","brand:wikipedia":"en:Petland Discounts",name:"Petland Discounts",shop:"pet"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/pet/Pets at Home":{name:"Pets at Home",icon:"maki-dog-park",imageURL:"https://graph.facebook.com/petsathomeUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7179258",shop:"pet"},addTags:{brand:"Pets at Home","brand:wikidata":"Q7179258","brand:wikipedia":"en:Pets at Home",name:"Pets at Home",shop:"pet"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/pet/Unleashed":{name:"Unleashed",icon:"maki-dog-park",imageURL:"https://graph.facebook.com/Petco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62122874",shop:"pet"},addTags:{alt_name:"Unleashed by Petco",brand:"Unleashed","brand:wikidata":"Q62122874",name:"Unleashed",shop:"pet"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/pet/Wild Birds Unlimited":{name:"Wild Birds Unlimited",icon:"maki-dog-park",imageURL:"https://pbs.twimg.com/profile_images/466209950788636672/DHjpTthh_bigger.jpeg",geometry:["point","area"],tags:{"brand:wikidata":"Q8000542",shop:"pet"},addTags:{brand:"Wild Birds Unlimited","brand:wikidata":"Q8000542","brand:wikipedia":"en:Wild Birds Unlimited",name:"Wild Birds Unlimited",shop:"pet"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/pet/Бетховен":{name:"Бетховен",icon:"maki-dog-park",imageURL:"https://graph.facebook.com/zoobethowenclub/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62390798",shop:"pet"},addTags:{brand:"Бетховен","brand:wikidata":"Q62390798",name:"Бетховен",shop:"pet"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/pet/Четыре лапы":{name:"Четыре лапы",icon:"maki-dog-park",imageURL:"https://graph.facebook.com/4laps/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62390783",shop:"pet"},addTags:{brand:"Четыре лапы","brand:wikidata":"Q62390783",name:"Четыре лапы",shop:"pet"},countryCodes:["kz","ru"],terms:[],matchScore:2,suggestion:true},"shop/photo/Kodak Express":{name:"Kodak Express",icon:"fas-camera-retro",imageURL:"https://graph.facebook.com/kodakexpress/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6425126",shop:"photo"},addTags:{brand:"Kodak Express","brand:wikidata":"Q6425126","brand:wikipedia":"en:Kodak Express",name:"Kodak Express",shop:"photo"},terms:["kodak"],matchScore:2,suggestion:true},"shop/second_hand/Value Village":{name:"Value Village",icon:"maki-shop",imageURL:"https://graph.facebook.com/savers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7428188",shop:"second_hand"},addTags:{brand:"Value Village","brand:wikidata":"Q7428188","brand:wikipedia":"en:Savers",name:"Value Village",shop:"second_hand"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/shoes/ABCマート":{name:"ABCマート",icon:"maki-shoe",imageURL:"https://graph.facebook.com/172547912801644/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11188787",shop:"shoes"},addTags:{brand:"ABCマート","brand:ja":"ABCマート","brand:wikidata":"Q11188787","brand:wikipedia":"en:ABC-Mart",name:"ABCマート","name:ja":"ABCマート",shop:"shoes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Aldo":{name:"Aldo",icon:"maki-shoe",imageURL:"https://graph.facebook.com/ALDO/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2832297",shop:"shoes"},addTags:{brand:"Aldo","brand:wikidata":"Q2832297","brand:wikipedia":"en:Aldo Group",name:"Aldo",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/Allen Edmonds":{name:"Allen Edmonds",icon:"maki-shoe",imageURL:"https://graph.facebook.com/allenedmonds/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4731627",shop:"shoes"},addTags:{brand:"Allen Edmonds","brand:wikidata":"Q4731627","brand:wikipedia":"en:Allen Edmonds",name:"Allen Edmonds",shop:"shoes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/shoes/André":{name:"André",icon:"maki-shoe",imageURL:"https://graph.facebook.com/AndreChaussures/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2847114",shop:"shoes"},addTags:{brand:"André","brand:wikidata":"Q2847114","brand:wikipedia":"fr:André (chaussure)",name:"André",shop:"shoes"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Bata":{name:"Bata",icon:"maki-shoe",imageURL:"https://graph.facebook.com/Bata/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q688082",shop:"shoes"},addTags:{brand:"Bata","brand:wikidata":"Q688082","brand:wikipedia":"en:Bata (company)",name:"Bata",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/Besson Chaussures":{name:"Besson Chaussures",icon:"maki-shoe",imageURL:"https://graph.facebook.com/besson.chaussures/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2899930",shop:"shoes"},addTags:{brand:"Besson Chaussures","brand:wikidata":"Q2899930","brand:wikipedia":"fr:Besson Chaussures",name:"Besson Chaussures",shop:"shoes"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Birkenstock":{name:"Birkenstock",icon:"maki-shoe",imageURL:"https://graph.facebook.com/birkenstock/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q648458",shop:"shoes"},addTags:{brand:"Birkenstock","brand:wikidata":"Q648458","brand:wikipedia":"en:Birkenstock",name:"Birkenstock",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/Brantano":{name:"Brantano",icon:"maki-shoe",imageURL:"https://graph.facebook.com/brantano.belgie/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4957616",shop:"shoes"},addTags:{brand:"Brantano","brand:wikidata":"Q4957616","brand:wikipedia":"en:Brantano Footwear",name:"Brantano",shop:"shoes"},countryCodes:["be","gb","lu"],terms:[],matchScore:2,suggestion:true},"shop/shoes/CCC":{name:"CCC",icon:"maki-shoe",imageURL:"https://graph.facebook.com/CCC/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11788344",shop:"shoes"},addTags:{brand:"CCC","brand:wikidata":"Q11788344","brand:wikipedia":"de:CCC (Unternehmen)",name:"CCC",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/Camper":{name:"Camper",icon:"maki-shoe",imageURL:"https://graph.facebook.com/Camper/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1030922",shop:"shoes"},addTags:{brand:"Camper","brand:wikidata":"Q1030922","brand:wikipedia":"en:Camper (company)",name:"Camper",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/Chaussea":{name:"Chaussea",icon:"maki-shoe",imageURL:"https://graph.facebook.com/chaussea.fr/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62082044",shop:"shoes"},addTags:{brand:"Chaussea","brand:wikidata":"Q62082044",name:"Chaussea",shop:"shoes"},countryCodes:["be","es","fr","lu"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Clarks":{name:"Clarks",icon:"maki-shoe",imageURL:"https://graph.facebook.com/ClarksShoesUS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1095857",shop:"shoes"},addTags:{brand:"Clarks","brand:wikidata":"Q1095857","brand:wikipedia":"en:C. & J. Clark",name:"Clarks",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/Cole Haan":{name:"Cole Haan",icon:"maki-shoe",imageURL:"https://pbs.twimg.com/profile_images/1119296742300766209/G_KesZkl_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q4356504",shop:"shoes"},addTags:{brand:"Cole Haan","brand:wikidata":"Q4356504","brand:wikipedia":"en:Cole Haan",name:"Cole Haan",shop:"shoes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Converse":{name:"Converse",icon:"maki-shoe",imageURL:"https://graph.facebook.com/converse/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q319515",shop:"shoes"},addTags:{brand:"Converse","brand:wikidata":"Q319515","brand:wikipedia":"en:Converse (shoe company)",name:"Converse",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/Crocs":{name:"Crocs",icon:"maki-shoe",imageURL:"https://graph.facebook.com/Crocs/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q926699",shop:"shoes"},addTags:{brand:"Crocs","brand:wikidata":"Q926699","brand:wikipedia":"en:Crocs",name:"Crocs",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/DSW":{name:"DSW",icon:"maki-shoe",imageURL:"https://graph.facebook.com/designerbrands/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5206207",shop:"shoes"},addTags:{brand:"DSW","brand:wikidata":"Q5206207","brand:wikipedia":"en:Designer Brands",name:"DSW",shop:"shoes"},countryCodes:["ca","us"],terms:["designer shoe warehouse","dsw shoes"],matchScore:2,suggestion:true},"shop/shoes/Deichmann":{name:"Deichmann",icon:"maki-shoe",imageURL:"https://graph.facebook.com/Deichmann/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q664543",shop:"shoes"},addTags:{brand:"Deichmann","brand:wikidata":"Q664543","brand:wikipedia":"en:Deichmann SE",name:"Deichmann",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/Din sko":{name:"Din sko",icon:"maki-shoe",imageURL:"https://graph.facebook.com/dinsko/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10472869",shop:"shoes"},addTags:{brand:"Din sko","brand:wikidata":"Q10472869","brand:wikipedia":"sv:Din sko",name:"Din sko",shop:"shoes"},countryCodes:["no","se"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Dosenbach":{name:"Dosenbach",icon:"maki-shoe",imageURL:"https://graph.facebook.com/Dosenbach.CH/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2677329",shop:"shoes"},addTags:{brand:"Dosenbach","brand:wikidata":"Q2677329","brand:wikipedia":"de:Dosenbach-Ochsner",name:"Dosenbach",shop:"shoes"},countryCodes:["ch"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Ecco":{name:"Ecco",icon:"maki-shoe",imageURL:"https://graph.facebook.com/Ecco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1280255",shop:"shoes"},addTags:{brand:"Ecco","brand:wikidata":"Q1280255","brand:wikipedia":"en:ECCO",name:"Ecco",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/FLO":{name:"FLO",icon:"maki-shoe",imageURL:"https://graph.facebook.com/FLOShoesGlobal/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61994802",shop:"shoes"},addTags:{brand:"FLO","brand:wikidata":"Q61994802",name:"FLO",shop:"shoes"},countryCodes:["al","tr"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Famous Footwear":{name:"Famous Footwear",icon:"maki-shoe",imageURL:"https://graph.facebook.com/famousfootwear/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5433457",shop:"shoes"},addTags:{brand:"Famous Footwear","brand:wikidata":"Q5433457","brand:wikipedia":"en:Famous Footwear",name:"Famous Footwear",shop:"shoes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Foot Locker":{name:"Foot Locker",icon:"maki-shoe",imageURL:"https://graph.facebook.com/footlocker/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63335",shop:"shoes"},addTags:{brand:"Foot Locker","brand:wikidata":"Q63335","brand:wikipedia":"en:Foot Locker",name:"Foot Locker",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/G.H. Bass & Co.":{name:"G.H. Bass & Co.",icon:"maki-shoe",imageURL:"https://pbs.twimg.com/profile_images/561257801650302976/enHlVVdc_bigger.jpeg",geometry:["point","area"],tags:{"brand:wikidata":"Q16993893",shop:"shoes"},addTags:{brand:"G.H. Bass & Co.","brand:wikidata":"Q16993893","brand:wikipedia":"en:G.H. Bass & Co.",name:"G.H. Bass & Co.",shop:"shoes"},countryCodes:["gb","us"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Gabor":{name:"Gabor",icon:"maki-shoe",imageURL:"https://graph.facebook.com/gaborshoesag/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1488760",shop:"shoes"},addTags:{brand:"Gabor","brand:wikidata":"Q1488760","brand:wikipedia":"de:Gabor Shoes",name:"Gabor",shop:"shoes"},countryCodes:["de","it"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Geox":{name:"Geox",icon:"maki-shoe",imageURL:"https://graph.facebook.com/GEOX/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q588001",shop:"shoes"},addTags:{brand:"Geox","brand:wikidata":"Q588001","brand:wikipedia":"en:Geox",name:"Geox",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/Görtz":{name:"Görtz",icon:"maki-shoe",imageURL:"https://graph.facebook.com/goertz/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1559593",shop:"shoes"},addTags:{brand:"Görtz","brand:wikidata":"Q1559593","brand:wikipedia":"de:Ludwig Görtz",name:"Görtz",shop:"shoes"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Humanic":{name:"Humanic",icon:"maki-shoe",imageURL:"https://graph.facebook.com/Humanic/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1636668",shop:"shoes"},addTags:{brand:"Humanic","brand:wikidata":"Q1636668","brand:wikipedia":"en:Humanic",name:"Humanic",shop:"shoes"},countryCodes:["at","cz","de","hu","ro","sk"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Hush Puppies":{name:"Hush Puppies",icon:"maki-shoe",imageURL:"https://graph.facebook.com/hushpuppiesglobal/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1828588",shop:"shoes"},addTags:{brand:"Hush Puppies","brand:wikidata":"Q1828588","brand:wikipedia":"en:Hush Puppies",name:"Hush Puppies",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/Johnston & Murphy":{name:"Johnston & Murphy",icon:"maki-shoe",imageURL:"https://graph.facebook.com/johnstonmurphy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6268615",shop:"shoes"},addTags:{brand:"Johnston & Murphy","brand:wikidata":"Q6268615","brand:wikipedia":"en:Johnston & Murphy",name:"Johnston & Murphy",shop:"shoes"},countryCodes:["ca","us"],terms:["johnston and murphy"],matchScore:2,suggestion:true},"shop/shoes/Journeys":{name:"Journeys",icon:"maki-shoe",imageURL:"https://graph.facebook.com/Journeys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61994838",shop:"shoes"},addTags:{brand:"Journeys","brand:wikidata":"Q61994838",name:"Journeys",shop:"shoes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Kari":{name:"Kari",icon:"maki-shoe",imageURL:"https://graph.facebook.com/shopkari/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q47155680",shop:"shoes"},addTags:{brand:"Kari","brand:wikidata":"Q47155680","brand:wikipedia":"ru:Kari (компания)",name:"Kari",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/Kids Foot Locker":{name:"Kids Foot Locker",icon:"maki-shoe",imageURL:"https://graph.facebook.com/footlocker/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63335",shop:"shoes"},addTags:{brand:"Foot Locker","brand:wikidata":"Q63335","brand:wikipedia":"en:Foot Locker",name:"Kids Foot Locker",shop:"shoes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/shoes/La Halle aux Chaussures":{name:"La Halle aux Chaussures",icon:"maki-shoe",imageURL:"https://graph.facebook.com/lahalle.com/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62390731",shop:"shoes"},addTags:{brand:"La Halle aux Chaussures","brand:wikidata":"Q62390731",name:"La Halle aux Chaussures",shop:"shoes"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Lady Foot Locker":{name:"Lady Foot Locker",icon:"maki-shoe",imageURL:"https://graph.facebook.com/footlocker/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63335",shop:"shoes"},addTags:{brand:"Foot Locker","brand:wikidata":"Q63335","brand:wikipedia":"en:Foot Locker",name:"Lady Foot Locker",shop:"shoes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Mephisto":{name:"Mephisto",icon:"maki-shoe",imageURL:"https://graph.facebook.com/mephisto.usa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q822975",shop:"shoes"},addTags:{brand:"Mephisto","brand:wikidata":"Q822975","brand:wikipedia":"fr:Mephisto (chaussure)",name:"Mephisto",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/Merrell":{name:"Merrell",icon:"maki-shoe",imageURL:"https://graph.facebook.com/merrell/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1921997",shop:"shoes"},addTags:{brand:"Merrell","brand:wikidata":"Q1921997","brand:wikipedia":"en:Merrell (company)",name:"Merrell",shop:"shoes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Minelli":{name:"Minelli",icon:"maki-shoe",imageURL:"https://graph.facebook.com/Minelli/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61994831",shop:"shoes"},addTags:{brand:"Minelli","brand:wikidata":"Q61994831",name:"Minelli",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/New Balance":{name:"New Balance",icon:"maki-shoe",imageURL:"https://graph.facebook.com/newbalanceusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q742988",shop:"shoes"},addTags:{brand:"New Balance","brand:wikidata":"Q742988","brand:wikipedia":"en:New Balance",name:"New Balance",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/Office":{name:"Office",icon:"maki-shoe",imageURL:"https://graph.facebook.com/Officeshoes1/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7079121",shop:"shoes"},addTags:{brand:"Office","brand:wikidata":"Q7079121","brand:wikipedia":"en:Office Holdings",name:"Office",shop:"shoes"},countryCodes:["de","gb","ie","ro"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Payless ShoeSource":{name:"Payless ShoeSource",icon:"maki-shoe",imageURL:"https://graph.facebook.com/payless/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7156755",shop:"shoes"},addTags:{brand:"Payless ShoeSource","brand:wikidata":"Q7156755","brand:wikipedia":"en:Payless ShoeSource",name:"Payless ShoeSource",shop:"shoes"},terms:["payless"],matchScore:2,suggestion:true},"shop/shoes/Quick Schuh":{name:"Quick Schuh",icon:"maki-shoe",imageURL:"https://graph.facebook.com/quick.schuh/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2123069",shop:"shoes"},addTags:{brand:"Quick Schuh","brand:wikidata":"Q2123069","brand:wikipedia":"de:Quick Schuh",name:"Quick Schuh",shop:"shoes"},countryCodes:["at","de"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Rack Room Shoes":{name:"Rack Room Shoes",icon:"maki-shoe",imageURL:"https://graph.facebook.com/myrackroomshoes/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17109937",shop:"shoes"},addTags:{brand:"Rack Room Shoes","brand:wikidata":"Q17109937","brand:wikipedia":"en:Rack Room Shoes",name:"Rack Room Shoes",shop:"shoes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Red Wing":{name:"Red Wing",icon:"maki-shoe",imageURL:"https://graph.facebook.com/RedWingShoes/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q934096",shop:"shoes"},addTags:{brand:"Red Wing","brand:wikidata":"Q934096","brand:wikipedia":"en:Red Wing Shoes",name:"Red Wing",shop:"shoes"},countryCodes:["de","gb","nl","us"],terms:["red wing shoes"],matchScore:2,suggestion:true},"shop/shoes/Reno":{name:"Reno",icon:"maki-shoe",imageURL:"https://graph.facebook.com/RENO/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2144204",shop:"shoes"},addTags:{brand:"Reno","brand:wikidata":"Q2144204","brand:wikipedia":"de:Reno (Schuhhandel)",name:"Reno",shop:"shoes"},countryCodes:["at","ch","de","hu","sk"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Rieker":{name:"Rieker",icon:"maki-shoe",imageURL:"https://graph.facebook.com/riekerofficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2152193",shop:"shoes"},addTags:{brand:"Rieker","brand:wikidata":"Q2152193","brand:wikipedia":"en:Rieker Shoes",name:"Rieker",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/Rockport":{name:"Rockport",icon:"maki-shoe",imageURL:"https://graph.facebook.com/Rockport/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4048384",shop:"shoes"},addTags:{brand:"Rockport","brand:wikidata":"Q4048384","brand:wikipedia":"en:Rockport (company)",name:"Rockport",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/Salamander":{name:"Salamander",icon:"maki-shoe",imageURL:"https://graph.facebook.com/SalamanderCzech/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q878354",shop:"shoes"},addTags:{brand:"Salamander","brand:wikidata":"Q878354","brand:wikipedia":"de:Salamander (Schuhe)",name:"Salamander",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/San Marina":{name:"San Marina",icon:"maki-shoe",imageURL:"https://graph.facebook.com/sanmarina/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3471558",shop:"shoes"},addTags:{brand:"San Marina","brand:wikidata":"Q3471558","brand:wikipedia":"fr:San Marina",name:"San Marina",shop:"shoes"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Scapino":{name:"Scapino",icon:"maki-shoe",imageURL:"https://graph.facebook.com/ScapinoNL/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2298792",shop:"shoes"},addTags:{brand:"Scapino","brand:wikidata":"Q2298792","brand:wikipedia":"nl:Scapino (winkelketen)",name:"Scapino",shop:"shoes"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Schuh":{name:"Schuh",icon:"maki-shoe",imageURL:"https://graph.facebook.com/schuhshoes/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7432952",shop:"shoes"},addTags:{brand:"Schuh","brand:wikidata":"Q7432952","brand:wikipedia":"en:Schuh",name:"Schuh",shop:"shoes"},countryCodes:["de","gb","gg","ie"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Shoe Carnival":{name:"Shoe Carnival",icon:"maki-shoe",imageURL:"https://graph.facebook.com/ShoeCarnival/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7500007",shop:"shoes"},addTags:{brand:"Shoe Carnival","brand:wikidata":"Q7500007","brand:wikipedia":"en:Shoe Carnival",name:"Shoe Carnival",shop:"shoes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Shoe Zone":{name:"Shoe Zone",icon:"maki-shoe",imageURL:"https://graph.facebook.com/shoezone/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7500016",shop:"shoes"},addTags:{brand:"Shoe Zone","brand:wikidata":"Q7500016","brand:wikipedia":"en:Shoe Zone",name:"Shoe Zone",shop:"shoes"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Siemes Schuhcenter":{name:"Siemes Schuhcenter",icon:"maki-shoe",imageURL:"https://graph.facebook.com/Schuhcenter.de/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2800720",shop:"shoes"},addTags:{brand:"Siemes Schuhcenter","brand:wikidata":"Q2800720","brand:wikipedia":"de:Siemes (Unternehmen)",name:"Siemes Schuhcenter",shop:"shoes"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Skechers":{name:"Skechers",icon:"maki-shoe",imageURL:"https://graph.facebook.com/SKECHERS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2945643",shop:"shoes"},addTags:{brand:"Skechers","brand:wikidata":"Q2945643","brand:wikipedia":"en:Skechers",name:"Skechers",shop:"shoes"},terms:["sketchers"],matchScore:2,suggestion:true},"shop/shoes/Sperry":{name:"Sperry",icon:"maki-shoe",imageURL:"https://graph.facebook.com/sperry/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7576421",shop:"shoes"},addTags:{brand:"Sperry","brand:wikidata":"Q7576421","brand:wikipedia":"en:Sperry Top-Sider",name:"Sperry",shop:"shoes"},countryCodes:["us"],terms:["sperry top sider"],matchScore:2,suggestion:true},"shop/shoes/Steve Madden":{name:"Steve Madden",icon:"maki-shoe",imageURL:"https://graph.facebook.com/SteveMaddenShoes/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q25352034",shop:"shoes"},addTags:{brand:"Steve Madden","brand:wikidata":"Q25352034","brand:wikipedia":"en:Steve Madden (company)",name:"Steve Madden",shop:"shoes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Stride Rite":{name:"Stride Rite",icon:"maki-shoe",imageURL:"https://graph.facebook.com/striderite/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2356171",shop:"shoes"},addTags:{brand:"Stride Rite","brand:wikidata":"Q2356171","brand:wikipedia":"en:Stride Rite Corporation",name:"Stride Rite",shop:"shoes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Tamaris":{name:"Tamaris",icon:"maki-shoe",imageURL:"https://graph.facebook.com/tamarisinternational/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61994827",shop:"shoes"},addTags:{brand:"Tamaris","brand:wikidata":"Q61994827",name:"Tamaris",shop:"shoes"},countryCodes:["at","be","de","fr","nl"],terms:[],matchScore:2,suggestion:true},"shop/shoes/The Shoe Company":{name:"The Shoe Company",icon:"maki-shoe",imageURL:"https://graph.facebook.com/theshoeco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7763892",shop:"shoes"},addTags:{brand:"The Shoe Company","brand:wikidata":"Q7763892","brand:wikipedia":"en:The Shoe Company",name:"The Shoe Company",shop:"shoes"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/shoes/UGG":{name:"UGG",icon:"maki-shoe",imageURL:"https://graph.facebook.com/UGG/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1138480",shop:"shoes"},addTags:{brand:"UGG","brand:wikidata":"Q1138480","brand:wikipedia":"en:UGG (brand)",name:"UGG",shop:"shoes"},countryCodes:["au","us"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Vans":{name:"Vans",icon:"maki-shoe",imageURL:"https://graph.facebook.com/VANS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1135366",shop:"shoes"},addTags:{brand:"Vans","brand:wikidata":"Q1135366","brand:wikipedia":"en:Vans",name:"Vans",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/vanHaren":{name:"vanHaren",icon:"maki-shoe",imageURL:"https://graph.facebook.com/vanharenschoenen/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62390668",shop:"shoes"},addTags:{brand:"vanHaren","brand:wikidata":"Q62390668",name:"vanHaren",shop:"shoes"},countryCodes:["be","nl"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Éram":{name:"Éram",icon:"maki-shoe",imageURL:"https://graph.facebook.com/eram.fr/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16684192",shop:"shoes"},addTags:{brand:"Éram","brand:wikidata":"Q16684192","brand:wikipedia":"fr:Éram",name:"Éram",shop:"shoes"},countryCodes:["be","fr"],terms:[],matchScore:2,suggestion:true},"shop/shoes/ЦентрОбувь":{name:"ЦентрОбувь",icon:"maki-shoe",geometry:["point","area"],tags:{"brand:wikidata":"Q4504072",shop:"shoes"},addTags:{brand:"ЦентрОбувь","brand:wikidata":"Q4504072","brand:wikipedia":"ru:ЦентрОбувь",name:"ЦентрОбувь",shop:"shoes"},countryCodes:["by","ru","ua"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Юничел":{name:"Юничел",icon:"maki-shoe",imageURL:"https://graph.facebook.com/unichel.shoes/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62390569",shop:"shoes"},addTags:{brand:"Юничел","brand:wikidata":"Q62390569",name:"Юничел",shop:"shoes"},countryCodes:["kz","ru"],terms:[],matchScore:2,suggestion:true},"shop/shoes/つるや":{name:"つるや",icon:"maki-shoe",geometry:["point","area"],tags:{"brand:wikidata":"Q11272578",shop:"shoes"},addTags:{brand:"つるや","brand:en":"Tsuruya","brand:ja":"つるや","brand:wikidata":"Q11272578","brand:wikipedia":"ja:つるや (靴屋)",name:"つるや","name:en":"Tsuruya","name:ja":"つるや",shop:"shoes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/shoes/東京靴流通センター":{name:"東京靴流通センター",icon:"maki-shoe",imageURL:"https://graph.facebook.com/chiyodafanpage/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11318515",shop:"shoes"},addTags:{brand:"東京靴流通センター","brand:en":"Tokyo Shoes Retailing Center","brand:ja":"東京靴流通センター","brand:wikidata":"Q11318515","brand:wikipedia":"ja:チヨダ",name:"東京靴流通センター","name:en":"Tokyo Shoes Retailing Center","name:ja":"東京靴流通センター",shop:"shoes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/sports/Academy Sports + Outdoors":{name:"Academy Sports + Outdoors",icon:"fas-futbol",imageURL:"https://graph.facebook.com/Academy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4671380",shop:"sports"},addTags:{brand:"Academy Sports + Outdoors","brand:wikidata":"Q4671380","brand:wikipedia":"en:Academy Sports + Outdoors",name:"Academy Sports + Outdoors",shop:"sports"},countryCodes:["us"],terms:["academy","academy sports and outdoors"],matchScore:2,suggestion:true},"shop/sports/Adidas":{name:"Adidas",icon:"fas-futbol",imageURL:"https://graph.facebook.com/adidasUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3895",shop:"sports"},addTags:{brand:"Adidas","brand:wikidata":"Q3895","brand:wikipedia":"en:Adidas",name:"Adidas",shop:"sports"},terms:[],matchScore:2,suggestion:true},"shop/sports/Aktiesport":{name:"Aktiesport",icon:"fas-futbol",imageURL:"https://graph.facebook.com/aktiesport/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q57546889",shop:"sports"},addTags:{brand:"Aktiesport","brand:wikidata":"Q57546889",name:"Aktiesport",shop:"sports"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/sports/American Golf":{name:"American Golf",icon:"fas-futbol",imageURL:"https://graph.facebook.com/americangolf/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62657494",shop:"sports"},addTags:{brand:"American Golf","brand:wikidata":"Q62657494",name:"American Golf",shop:"sports",sport:"golf"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/sports/Big 5 Sporting Goods":{name:"Big 5 Sporting Goods",icon:"fas-futbol",imageURL:"https://graph.facebook.com/Big5SportingGoods/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4904902",shop:"sports"},addTags:{brand:"Big 5 Sporting Goods","brand:wikidata":"Q4904902","brand:wikipedia":"en:Big 5 Sporting Goods",name:"Big 5 Sporting Goods",shop:"sports"},countryCodes:["us"],terms:["big 5"],matchScore:2,suggestion:true},"shop/sports/Centauro":{name:"Centauro",icon:"fas-futbol",imageURL:"https://graph.facebook.com/centauroesporte/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q28679561",shop:"sports"},addTags:{brand:"Centauro","brand:wikidata":"Q28679561","brand:wikipedia":"pt:Lojas Centauro",name:"Centauro",shop:"sports"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"shop/sports/Decathlon":{name:"Decathlon",icon:"fas-futbol",imageURL:"https://graph.facebook.com/DecathlonUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q509349",shop:"sports"},addTags:{brand:"Decathlon","brand:wikidata":"Q509349","brand:wikipedia":"en:Decathlon Group",name:"Decathlon",shop:"sports"},terms:[],matchScore:2,suggestion:true},"shop/sports/Dick's Sporting Goods":{name:"Dick's Sporting Goods",icon:"fas-futbol",imageURL:"https://graph.facebook.com/dickssportinggoods/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5272601",shop:"sports"},addTags:{brand:"Dick's Sporting Goods","brand:wikidata":"Q5272601","brand:wikipedia":"en:Dick's Sporting Goods",name:"Dick's Sporting Goods",shop:"sports"},countryCodes:["us"],terms:["dicks"],matchScore:2,suggestion:true},"shop/sports/Finish Line":{name:"Finish Line",icon:"fas-futbol",imageURL:"https://graph.facebook.com/finishline/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5450341",shop:"sports"},addTags:{brand:"Finish Line","brand:wikidata":"Q5450341","brand:wikipedia":"en:Finish Line, Inc.",name:"Finish Line",shop:"sports"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/sports/Hervis":{name:"Hervis",icon:"fas-futbol",imageURL:"https://graph.facebook.com/hervissports.at/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1614816",shop:"sports"},addTags:{brand:"Hervis","brand:wikidata":"Q1614816","brand:wikipedia":"de:Hervis",name:"Hervis",shop:"sports"},countryCodes:["at","cz","de","hr","hu","ro","si"],terms:["hervis sport","hervis sports"],matchScore:2,suggestion:true},"shop/sports/Hibbett Sports":{name:"Hibbett Sports",icon:"fas-futbol",imageURL:"https://graph.facebook.com/HibbettSports/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5750671",shop:"sports"},addTags:{brand:"Hibbett Sports","brand:wikidata":"Q5750671","brand:wikipedia":"en:Hibbett Sports",name:"Hibbett Sports",shop:"sports"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/sports/Intersport":{name:"Intersport",icon:"fas-futbol",imageURL:"https://graph.facebook.com/intersportAT/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q666888",shop:"sports"},addTags:{brand:"Intersport","brand:wikidata":"Q666888","brand:wikipedia":"en:Intersport",name:"Intersport",shop:"sports"},terms:[],matchScore:2,suggestion:true},"shop/sports/JD Sports":{name:"JD Sports",icon:"fas-futbol",imageURL:"https://graph.facebook.com/JDSportsOfficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6108019",shop:"sports"},addTags:{brand:"JD Sports","brand:wikidata":"Q6108019","brand:wikipedia":"en:JD Sports",name:"JD Sports",shop:"sports"},countryCodes:["de","es","fr","gb","ie","nl"],terms:["JD"],matchScore:2,suggestion:true},"shop/sports/Marathon Sports":{name:"Marathon Sports",icon:"fas-futbol",imageURL:"https://graph.facebook.com/marathonsports/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3027516",shop:"sports"},addTags:{brand:"Marathon Sports","brand:wikidata":"Q3027516","brand:wikipedia":"es:Marathon Sports",name:"Marathon Sports",shop:"sports"},countryCodes:["bo","ec","pe"],terms:[],matchScore:2,suggestion:true},"shop/sports/Martes Sport":{name:"Martes Sport",icon:"fas-futbol",imageURL:"https://graph.facebook.com/sklepmartes/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62073490",shop:"sports"},addTags:{brand:"Martes Sport","brand:wikidata":"Q62073490",name:"Martes Sport",shop:"sports"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/sports/Modell's Sporting Goods":{name:"Modell's Sporting Goods",icon:"fas-futbol",imageURL:"https://graph.facebook.com/modells/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3317844",shop:"sports"},addTags:{brand:"Modell's Sporting Goods","brand:wikidata":"Q3317844","brand:wikipedia":"en:Modell's Sporting Goods",name:"Modell's Sporting Goods",shop:"sports"},countryCodes:["us"],terms:["modells"],matchScore:2,suggestion:true},"shop/sports/Peloton":{name:"Peloton",icon:"fas-futbol",imageURL:"https://graph.facebook.com/onepeloton/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q56276186",shop:"sports"},addTags:{brand:"Peloton","brand:wikidata":"Q56276186","brand:wikipedia":"en:Peloton (company)",name:"Peloton",shop:"sports"},countryCodes:["ca","gb","us"],terms:[],matchScore:2,suggestion:true},"shop/sports/Play It Again Sports":{name:"Play It Again Sports",icon:"fas-futbol",imageURL:"https://graph.facebook.com/playitagainsports/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7203029",shop:"sports"},addTags:{brand:"Play It Again Sports","brand:wikidata":"Q7203029","brand:wikipedia":"en:Play It Again Sports",name:"Play It Again Sports",shop:"sports"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/sports/Rebel":{name:"Rebel",icon:"fas-futbol",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FRebel%20sport%20logo%202012.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q18636397",shop:"sports"},addTags:{brand:"Rebel","brand:wikidata":"Q18636397","brand:wikipedia":"en:Rebel (company)",name:"Rebel",shop:"sports"},countryCodes:["au","nz"],terms:[],matchScore:2,suggestion:true},"shop/sports/Sport 2000":{name:"Sport 2000",icon:"fas-futbol",imageURL:"https://graph.facebook.com/SPORT2000France/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q262394",shop:"sports"},addTags:{brand:"Sport 2000","brand:wikidata":"Q262394","brand:wikipedia":"de:Sport 2000",name:"Sport 2000",shop:"sports"},countryCodes:["at","de","fr","nl"],terms:[],matchScore:2,suggestion:true},"shop/sports/Sport Chek":{name:"Sport Chek",icon:"fas-futbol",imageURL:"https://pbs.twimg.com/profile_images/1072276948317986817/J6YF-QLZ_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q3494037",shop:"sports"},addTags:{brand:"Sport Chek","brand:wikidata":"Q3494037","brand:wikipedia":"en:Sport Chek",name:"Sport Chek",shop:"sports"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/sports/Sporting Life":{name:"Sporting Life",icon:"fas-futbol",imageURL:"https://graph.facebook.com/SportingLifeCan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7579583",shop:"sports"},addTags:{brand:"Sporting Life","brand:wikidata":"Q7579583","brand:wikipedia":"en:Sporting Life (retailer)",name:"Sporting Life",shop:"sports"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/sports/Sportisimo":{name:"Sportisimo",icon:"fas-futbol",imageURL:"https://graph.facebook.com/1463426373966592/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q54974273",shop:"sports"},addTags:{brand:"Sportisimo","brand:wikidata":"Q54974273",name:"Sportisimo",shop:"sports"},countryCodes:["cz","sk"],terms:[],matchScore:2,suggestion:true},"shop/sports/Sports Authority":{name:"Sports Authority",icon:"fas-futbol",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSports%20Authority%20logo2011.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q7579688",shop:"sports"},addTags:{brand:"Sports Authority","brand:wikidata":"Q7579688","brand:wikipedia":"en:Sports Authority",name:"Sports Authority",shop:"sports"},terms:[],matchScore:2,suggestion:true},"shop/sports/Sports Direct":{name:"Sports Direct",icon:"fas-futbol",imageURL:"https://graph.facebook.com/SportsDirect/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2913554",shop:"sports"},addTags:{brand:"Sports Direct","brand:wikidata":"Q2913554","brand:wikipedia":"en:Sports Direct",name:"Sports Direct",shop:"sports"},terms:["SportsDirect.com"],matchScore:2,suggestion:true},"shop/sports/Stadium":{name:"Stadium",icon:"fas-futbol",imageURL:"https://graph.facebook.com/stadium.finland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4993863",shop:"sports"},addTags:{brand:"Stadium","brand:wikidata":"Q4993863","brand:wikipedia":"sv:Stadium (detaljhandelskedja)",name:"Stadium",shop:"sports"},countryCodes:["de","dk","fi","se"],terms:[],matchScore:2,suggestion:true},"shop/sports/XXL":{name:"XXL",icon:"fas-futbol",imageURL:"https://graph.facebook.com/xxlnorge/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12010840",shop:"sports"},addTags:{brand:"XXL","brand:wikidata":"Q12010840","brand:wikipedia":"no:XXL",name:"XXL",shop:"sports"},countryCodes:["fi","no","se"],terms:[],matchScore:2,suggestion:true},"shop/sports/Спортмастер":{name:"Спортмастер",icon:"fas-futbol",imageURL:"https://graph.facebook.com/sportmaster.ru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4438176",shop:"sports"},addTags:{brand:"Спортмастер","brand:en":"Sportmaster","brand:ru":"Спортмастер","brand:wikidata":"Q4438176","brand:wikipedia":"ru:Спортмастер",name:"Спортмастер","name:en":"Sportmaster","name:ru":"Спортмастер",shop:"sports"},countryCodes:["by","kz","ru","ua"],terms:["спортмастер гипер"],matchScore:2,suggestion:true},"shop/stationery/Bureau Vallée":{name:"Bureau Vallée",icon:"fas-paperclip",imageURL:"https://graph.facebook.com/BureauVallee/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q18385014",shop:"stationery"},addTags:{brand:"Bureau Vallée","brand:wikidata":"Q18385014","brand:wikipedia":"fr:Bureau Vallée",name:"Bureau Vallée",shop:"stationery"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/stationery/McPaper":{name:"McPaper",icon:"fas-paperclip",imageURL:"https://graph.facebook.com/mcpaperberlin/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1915329",shop:"stationery"},addTags:{brand:"McPaper","brand:wikidata":"Q1915329","brand:wikipedia":"de:McPaper",name:"McPaper",shop:"stationery"},countryCodes:["ch","de"],terms:[],matchScore:2,suggestion:true},"shop/stationery/Office Depot":{name:"Office Depot",icon:"fas-paperclip",imageURL:"https://graph.facebook.com/OfficeDepot/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1337797",shop:"stationery"},addTags:{brand:"Office Depot","brand:wikidata":"Q1337797","brand:wikipedia":"en:Office Depot",name:"Office Depot",shop:"stationery"},terms:[],matchScore:2,suggestion:true},"shop/stationery/OfficeMax":{name:"OfficeMax",icon:"fas-paperclip",imageURL:"https://graph.facebook.com/OfficeDepot/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7079111",shop:"stationery"},addTags:{brand:"OfficeMax","brand:wikidata":"Q7079111","brand:wikipedia":"en:OfficeMax",name:"OfficeMax",shop:"stationery"},countryCodes:["mx","nz","us"],terms:[],matchScore:2,suggestion:true},"shop/stationery/Officeworks":{name:"Officeworks",icon:"fas-paperclip",imageURL:"https://graph.facebook.com/officeworks/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7079486",shop:"stationery"},addTags:{brand:"Officeworks","brand:wikidata":"Q7079486","brand:wikipedia":"en:Officeworks",name:"Officeworks",shop:"stationery"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"shop/stationery/Pagro":{name:"Pagro",icon:"fas-paperclip",imageURL:"https://graph.facebook.com/pagro.at/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q57550022",shop:"stationery"},addTags:{brand:"Pagro","brand:wikidata":"Q57550022",name:"Pagro",shop:"stationery"},countryCodes:["at"],terms:[],matchScore:2,suggestion:true},"shop/stationery/Paper Source":{name:"Paper Source",icon:"fas-paperclip",imageURL:"https://graph.facebook.com/PaperSource/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q25000269",shop:"stationery"},addTags:{brand:"Paper Source","brand:wikidata":"Q25000269","brand:wikipedia":"en:Paper Source",name:"Paper Source",shop:"stationery"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/stationery/Paperchase":{name:"Paperchase",icon:"fas-paperclip",imageURL:"https://graph.facebook.com/paperchase/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7132739",shop:"stationery"},addTags:{brand:"Paperchase","brand:wikidata":"Q7132739","brand:wikipedia":"en:Paperchase",name:"Paperchase",shop:"stationery"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/stationery/Ryman":{name:"Ryman",icon:"fas-paperclip",imageURL:"https://graph.facebook.com/ryman/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7385188",shop:"stationery"},addTags:{brand:"Ryman","brand:wikidata":"Q7385188","brand:wikipedia":"en:Ryman",name:"Ryman",shop:"stationery"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/stationery/Staples":{name:"Staples",icon:"fas-paperclip",imageURL:"https://graph.facebook.com/staples/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q785943",shop:"stationery"},addTags:{brand:"Staples","brand:wikidata":"Q785943","brand:wikipedia":"en:Staples Inc.",name:"Staples",shop:"stationery"},terms:[],matchScore:2,suggestion:true},"shop/stationery/Комус":{name:"Комус",icon:"fas-paperclip",imageURL:"https://graph.facebook.com/komusclub/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4230314",shop:"stationery"},addTags:{brand:"Комус","brand:en":"Komus","brand:wikidata":"Q4230314","brand:wikipedia":"en:Komus (company)",name:"Комус","name:en":"Komus",shop:"stationery"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/storage_rental/Extra Space Storage":{name:"Extra Space Storage",icon:"fas-warehouse",imageURL:"https://graph.facebook.com/extraspace/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5422162",shop:"storage_rental"},addTags:{brand:"Extra Space Storage","brand:wikidata":"Q5422162","brand:wikipedia":"en:Extra Space Storage",name:"Extra Space Storage",shop:"storage_rental"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/storage_rental/Public Storage":{name:"Public Storage",icon:"fas-warehouse",imageURL:"https://graph.facebook.com/PublicStorage/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1156045",shop:"storage_rental"},addTags:{brand:"Public Storage","brand:wikidata":"Q1156045","brand:wikipedia":"en:Public Storage",name:"Public Storage",shop:"storage_rental"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/8 à Huit":{name:"8 à Huit",icon:"maki-grocery",imageURL:"https://graph.facebook.com/fashion8a8/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2818601",shop:"supermarket"},addTags:{brand:"8 à Huit","brand:wikidata":"Q2818601","brand:wikipedia":"fr:8 à Huit",name:"8 à Huit",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/99 Ranch Market":{name:"99 Ranch Market",icon:"maki-grocery",imageURL:"https://graph.facebook.com/99RanchMarket/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4646307",shop:"supermarket"},addTags:{brand:"99 Ranch Market","brand:wikidata":"Q4646307","brand:wikipedia":"en:99 Ranch Market",cuisine:"asian",name:"99 Ranch Market","name:en":"99 Ranch Market","name:zh-Hans":"大华超级市场","name:zh-Hant":"大華超級市場",shop:"supermarket"},countryCodes:["us"],terms:["99 ranch","ranch 99"],matchScore:2,suggestion:true},"shop/supermarket/A&O":{name:"A&O",icon:"maki-grocery",imageURL:"https://graph.facebook.com/www.aeo.it/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3600279",shop:"supermarket"},addTags:{brand:"A&O","brand:wikidata":"Q3600279","brand:wikipedia":"it:A&O",name:"A&O",shop:"supermarket"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/A101":{name:"A101",icon:"maki-grocery",imageURL:"https://graph.facebook.com/a101iletisim/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6034496",shop:"supermarket"},addTags:{brand:"A101","brand:wikidata":"Q6034496","brand:wikipedia":"tr:A101",name:"A101",shop:"supermarket"},countryCodes:["tr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/AD Delhaize":{name:"AD Delhaize",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Delhaize/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1184173",shop:"supermarket"},addTags:{brand:"AD Delhaize","brand:wikidata":"Q1184173","brand:wikipedia":"fr:Delhaize",name:"AD Delhaize",shop:"supermarket"},countryCodes:["be","lu"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/ADEG":{name:"ADEG",icon:"maki-grocery",imageURL:"https://graph.facebook.com/mein.adeg/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q290211",shop:"supermarket"},addTags:{brand:"ADEG","brand:wikidata":"Q290211","brand:wikipedia":"de:ADEG Österreich",name:"ADEG",shop:"supermarket"},countryCodes:["at"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Acme":{name:"Acme",icon:"maki-grocery",imageURL:"https://graph.facebook.com/acmemarkets/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q341975",shop:"supermarket"},addTags:{brand:"Acme","brand:wikidata":"Q341975","brand:wikipedia":"en:Acme Markets",name:"Acme",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Ahorramás":{name:"Ahorramás",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Ahorramas/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q58221883",shop:"supermarket"},addTags:{brand:"Ahorramás","brand:wikidata":"Q58221883",name:"Ahorramás",shop:"supermarket"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Albert":{name:"Albert",icon:"maki-grocery",imageURL:"https://graph.facebook.com/albertceskarepublika/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q9144241",shop:"supermarket"},addTags:{brand:"Albert","brand:wikidata":"Q9144241","brand:wikipedia":"cs:Albert (obchodní řetězec)",name:"Albert",shop:"supermarket"},countryCodes:["cz"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Albert Heijn":{name:"Albert Heijn",icon:"maki-grocery",imageURL:"https://graph.facebook.com/albertheijn/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1653985",shop:"supermarket"},addTags:{brand:"Albert Heijn","brand:wikidata":"Q1653985","brand:wikipedia":"nl:Albert Heijn (supermarkt)",name:"Albert Heijn",shop:"supermarket"},countryCodes:["be","nl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Albertsons":{name:"Albertsons",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Albertsons/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4712282",shop:"supermarket"},addTags:{brand:"Albertsons","brand:wikidata":"Q4712282","brand:wikipedia":"en:Albertsons",name:"Albertsons",shop:"supermarket"},countryCodes:["us"],terms:["albertsons supermarket"],matchScore:2,suggestion:true},"shop/supermarket/Aldi":{name:"Aldi",icon:"maki-grocery",imageURL:"https://graph.facebook.com/ALDI.USA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q125054",shop:"supermarket"},addTags:{brand:"Aldi","brand:wikidata":"Q125054","brand:wikipedia":"en:Aldi",name:"Aldi",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Aldi Nord":{name:"Aldi Nord",icon:"maki-grocery",imageURL:"https://graph.facebook.com/154533341244676/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q41171373",shop:"supermarket"},addTags:{brand:"Aldi Nord","brand:wikidata":"Q41171373","brand:wikipedia":"en:Aldi",name:"Aldi Nord",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Aldi Süd":{name:"Aldi Süd",icon:"maki-grocery",imageURL:"https://graph.facebook.com/ALDI.SUED/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q41171672",shop:"supermarket"},addTags:{brand:"Aldi Süd","brand:wikidata":"Q41171672","brand:wikipedia":"en:Aldi",name:"Aldi Süd",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Alfamart":{name:"Alfamart",icon:"maki-grocery",imageURL:"https://graph.facebook.com/alfamartku/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q23745600",shop:"supermarket"},addTags:{brand:"Alfamart","brand:wikidata":"Q23745600","brand:wikipedia":"en:Alfamart",name:"Alfamart",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Alimerka":{name:"Alimerka",icon:"maki-grocery",imageURL:"https://graph.facebook.com/alimerka.es/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16482738",shop:"supermarket"},addTags:{brand:"Alimerka","brand:wikidata":"Q16482738","brand:wikipedia":"es:Alimerka",name:"Alimerka",shop:"supermarket"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Alnatura":{name:"Alnatura",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Alnatura/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q876811",shop:"supermarket"},addTags:{brand:"Alnatura","brand:wikidata":"Q876811","brand:wikipedia":"en:Alnatura",name:"Alnatura",organic:"only",shop:"supermarket"},countryCodes:["ch","de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Asda":{name:"Asda",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Asda/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q297410",shop:"supermarket"},addTags:{brand:"Asda","brand:wikidata":"Q297410","brand:wikipedia":"en:Asda",name:"Asda",shop:"supermarket"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Atacadão":{name:"Atacadão",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Atacadaosa.Oficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2868739",shop:"supermarket"},addTags:{brand:"Atacadão","brand:wikidata":"Q2868739","brand:wikipedia":"en:Atacadão",name:"Atacadão",shop:"supermarket"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Auchan":{name:"Auchan",icon:"maki-grocery",imageURL:"https://graph.facebook.com/auchan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q758603",shop:"supermarket"},addTags:{brand:"Auchan","brand:wikidata":"Q758603","brand:wikipedia":"en:Auchan",name:"Auchan",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/BI-LO":{name:"BI-LO",icon:"maki-grocery",imageURL:"https://graph.facebook.com/BILOSuperSaver/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4835620",shop:"supermarket"},addTags:{brand:"BI-LO","brand:wikidata":"Q4835620","brand:wikipedia":"en:BI-LO (United States)",name:"BI-LO",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/BM":{name:"BM",icon:"maki-grocery",imageURL:"https://graph.facebook.com/BMSupermercados/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62073462",shop:"supermarket"},addTags:{brand:"BM","brand:wikidata":"Q62073462",name:"BM",shop:"supermarket"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Biedronka":{name:"Biedronka",icon:"maki-grocery",imageURL:"https://graph.facebook.com/BiedronkaCodziennie/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q857182",shop:"supermarket"},addTags:{brand:"Biedronka","brand:wikidata":"Q857182","brand:wikipedia":"pl:Biedronka (sieć handlowa)",name:"Biedronka",shop:"supermarket"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Big Bazaar":{name:"Big Bazaar",icon:"maki-grocery",imageURL:"https://graph.facebook.com/BigBazaar/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3631008",shop:"supermarket"},addTags:{brand:"Big Bazaar","brand:wikidata":"Q3631008","brand:wikipedia":"en:Big Bazaar",name:"Big Bazaar",shop:"supermarket"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Big C":{name:"Big C",icon:"maki-grocery",imageURL:"https://graph.facebook.com/BigCBigService/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q858665",shop:"supermarket"},addTags:{brand:"Big C","brand:wikidata":"Q858665","brand:wikipedia":"en:Big C",name:"Big C",shop:"supermarket"},countryCodes:["th","vn"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Billa":{name:"Billa",icon:"maki-grocery",imageURL:"https://graph.facebook.com/BILLA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q537781",shop:"supermarket"},addTags:{brand:"Billa","brand:wikidata":"Q537781","brand:wikipedia":"en:Billa (supermarket)",name:"Billa",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Bim":{name:"Bim",icon:"maki-grocery",imageURL:"https://graph.facebook.com/bimturkiye/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1022075",shop:"supermarket"},addTags:{brand:"Bim","brand:wikidata":"Q1022075","brand:wikipedia":"en:Bim (company)",name:"Bim",shop:"supermarket"},countryCodes:["ma","tr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Bingo":{name:"Bingo",icon:"maki-grocery",imageURL:"https://graph.facebook.com/bingotuzla/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16842066",shop:"supermarket"},addTags:{brand:"Bingo","brand:wikidata":"Q16842066","brand:wikipedia":"bs:Bingo (kompanija)",name:"Bingo",shop:"supermarket"},countryCodes:["ba"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Bio Company":{name:"Bio Company",icon:"maki-grocery",imageURL:"https://graph.facebook.com/biocompany.de/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q864179",shop:"supermarket"},addTags:{brand:"Bio Company","brand:wikidata":"Q864179","brand:wikipedia":"de:Bio Company",name:"Bio Company",organic:"only",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Biocoop":{name:"Biocoop",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Biocoop/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2904039",shop:"supermarket"},addTags:{brand:"Biocoop","brand:wikidata":"Q2904039","brand:wikipedia":"fr:Biocoop",name:"Biocoop",shop:"supermarket"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Bodega Aurrera":{name:"Bodega Aurrera",icon:"maki-grocery",imageURL:"https://graph.facebook.com/BodegaAurrera/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3365858",shop:"supermarket"},addTags:{brand:"Bodega Aurrera","brand:wikidata":"Q3365858","brand:wikipedia":"en:Bodega Aurrerá",name:"Bodega Aurrera",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Bravo":{name:"Bravo",icon:"maki-grocery",imageURL:"https://graph.facebook.com/bravo.supermarkets/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16985159",shop:"supermarket"},addTags:{brand:"Bravo","brand:wikidata":"Q16985159","brand:wikipedia":"en:Bravo (supermarket)",name:"Bravo",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Brookshire Brothers":{name:"Brookshire Brothers",icon:"maki-grocery",imageURL:"https://graph.facebook.com/BrookshireBros/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4975084",shop:"supermarket"},addTags:{brand:"Brookshire Brothers","brand:wikidata":"Q4975084","brand:wikipedia":"en:Brookshire Brothers",name:"Brookshire Brothers",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Brookshire's":{name:"Brookshire's",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Brookshires/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4975085",shop:"supermarket"},addTags:{brand:"Brookshire's","brand:wikidata":"Q4975085","brand:wikipedia":"en:Brookshire Grocery Company",name:"Brookshire's",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Budgens":{name:"Budgens",icon:"maki-grocery",imageURL:"https://graph.facebook.com/DiscoverBudgens/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4985016",shop:"supermarket"},addTags:{brand:"Budgens","brand:wikidata":"Q4985016","brand:wikipedia":"en:Budgens",name:"Budgens",shop:"supermarket"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Bulk Barn":{name:"Bulk Barn",icon:"maki-grocery",imageURL:"https://graph.facebook.com/BulkBarnFoods/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4996466",shop:"supermarket"},addTags:{brand:"Bulk Barn","brand:wikidata":"Q4996466",name:"Bulk Barn",shop:"supermarket"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Bunnpris":{name:"Bunnpris",icon:"maki-grocery",imageURL:"https://graph.facebook.com/bunnpris.no/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1774634",shop:"supermarket"},addTags:{brand:"Bunnpris","brand:wikidata":"Q1774634","brand:wikipedia":"en:Bunnpris",name:"Bunnpris",shop:"supermarket"},countryCodes:["no"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/C-Town Supermarkets":{name:"C-Town Supermarkets",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Ctown.supermarkets/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5005929",shop:"supermarket"},addTags:{brand:"C-Town Supermarkets","brand:wikidata":"Q5005929","brand:wikipedia":"en:C-Town Supermarkets",name:"C-Town",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/CBA":{name:"CBA",icon:"maki-grocery",imageURL:"https://graph.facebook.com/cbaboltok/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q779845",shop:"supermarket"},addTags:{brand:"CBA","brand:wikidata":"Q779845","brand:wikipedia":"en:CBA (food retail)",name:"CBA",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/COOP Jednota":{name:"COOP Jednota",icon:"maki-grocery",imageURL:"https://graph.facebook.com/COOPJednota/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q41629254",shop:"supermarket"},addTags:{brand:"COOP Jednota","brand:wikidata":"Q41629254","brand:wikipedia":"sk:COOP Jednota Slovensko",name:"COOP Jednota",shop:"supermarket"},countryCodes:["cz","sk"],terms:["jednota"],matchScore:2,suggestion:true},"shop/supermarket/Caprabo":{name:"Caprabo",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Caprabo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1980781",shop:"supermarket"},addTags:{brand:"Caprabo","brand:wikidata":"Q1980781","brand:wikipedia":"en:Caprabo",name:"Caprabo",shop:"supermarket"},countryCodes:["ad","es"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Cardenas":{name:"Cardenas",icon:"maki-grocery",imageURL:"https://graph.facebook.com/CardenasMarkets/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64149543",shop:"supermarket"},addTags:{brand:"Cardenas","brand:wikidata":"Q64149543","brand:wikipedia":"en:Cardenas (supermarket)",cuisine:"latin_american",name:"Cardenas",shop:"supermarket"},countryCodes:["us"],terms:["mi pueblo","mi pueblo food center"],matchScore:2,suggestion:true},"shop/supermarket/Cargills Food City (Sri Lanka)":{name:"Cargills Food City (Sri Lanka)",icon:"maki-grocery",imageURL:"https://graph.facebook.com/cargillsfoodcity/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q58353955",shop:"supermarket"},addTags:{brand:"Cargills Food City","brand:wikidata":"Q58353955",name:"Cargills Food City",shop:"supermarket"},countryCodes:["lk"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Carrefour":{name:"Carrefour",icon:"maki-grocery",imageURL:"https://graph.facebook.com/carrefour/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q217599",shop:"supermarket"},addTags:{brand:"Carrefour","brand:wikidata":"Q217599","brand:wikipedia":"fr:Carrefour (enseigne)",name:"Carrefour",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Carrefour City":{name:"Carrefour City",icon:"maki-grocery",imageURL:"https://graph.facebook.com/CarrefourCity/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2940187",shop:"supermarket"},addTags:{brand:"Carrefour City","brand:wikidata":"Q2940187","brand:wikipedia":"fr:Carrefour City",name:"Carrefour City",shop:"supermarket"},countryCodes:["be","fr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Carrefour Contact":{name:"Carrefour Contact",icon:"maki-grocery",imageURL:"https://graph.facebook.com/vieuxberquin59232/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2940188",shop:"supermarket"},addTags:{brand:"Carrefour Contact","brand:wikidata":"Q2940188","brand:wikipedia":"fr:Carrefour Contact",name:"Carrefour Contact",shop:"supermarket"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Carrefour Market":{name:"Carrefour Market",icon:"maki-grocery",imageURL:"https://graph.facebook.com/carrefourmarket/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2689639",shop:"supermarket"},addTags:{brand:"Carrefour Market","brand:wikidata":"Q2689639","brand:wikipedia":"fr:Carrefour Market",name:"Carrefour Market",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Carulla":{name:"Carulla",icon:"maki-grocery",imageURL:"https://graph.facebook.com/SupermercadosCarulla/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5047480",shop:"supermarket"},addTags:{brand:"Carulla","brand:wikidata":"Q5047480","brand:wikipedia":"en:Carulla",name:"Carulla",shop:"supermarket"},countryCodes:["co"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Centre Commercial E. Leclerc":{name:"Centre Commercial E. Leclerc",icon:"maki-grocery",imageURL:"https://graph.facebook.com/E.Leclerc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1273376",shop:"supermarket"},addTags:{brand:"Centre Commercial E. Leclerc","brand:wikidata":"Q1273376","brand:wikipedia":"fr:E.Leclerc",name:"Centre Commercial E. Leclerc",shop:"supermarket"},countryCodes:["fr","pl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Chata Polska":{name:"Chata Polska",icon:"maki-grocery",imageURL:"https://graph.facebook.com/chatapolskasklepy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61994406",shop:"supermarket"},addTags:{brand:"Chata Polska","brand:wikidata":"Q61994406",name:"Chata Polska",shop:"supermarket"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Checkers":{name:"Checkers",icon:"maki-grocery",imageURL:"https://graph.facebook.com/checkerssa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5089126",shop:"supermarket"},addTags:{brand:"Checkers","brand:wikidata":"Q5089126","brand:wikipedia":"en:Checkers (supermarket chain)",name:"Checkers",shop:"supermarket"},countryCodes:["bw","na","za"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Chedraui":{name:"Chedraui",icon:"maki-grocery",imageURL:"https://graph.facebook.com/CHEDRAUIOFICIAL/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2961952",shop:"supermarket"},addTags:{brand:"Chedraui","brand:wikidata":"Q2961952","brand:wikipedia":"en:Chedraui",name:"Chedraui",shop:"supermarket"},countryCodes:["mx"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/City Market":{name:"City Market",icon:"maki-grocery",imageURL:"https://graph.facebook.com/CityMarketGrocery/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5123299",shop:"supermarket"},addTags:{brand:"City Market","brand:wikidata":"Q5123299","brand:wikipedia":"en:City Market (US grocery store chain)",name:"City Market",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Co-op (Canada)":{name:"Co-op (Canada)",icon:"maki-grocery",imageURL:"https://graph.facebook.com/CoopCRS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5440676",shop:"supermarket"},addTags:{brand:"Federated Co-operatives","brand:wikidata":"Q5440676","brand:wikipedia":"en:Federated Co-operatives",name:"Co-op",shop:"supermarket"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Coles":{name:"Coles",icon:"maki-grocery",imageURL:"https://graph.facebook.com/coles/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1108172",shop:"supermarket"},addTags:{brand:"Coles","brand:wikidata":"Q1108172","brand:wikipedia":"en:Coles Supermarkets",name:"Coles",shop:"supermarket"},countryCodes:["au","gb"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Colruyt":{name:"Colruyt",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Colruyt/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2363991",shop:"supermarket"},addTags:{brand:"Colruyt","brand:wikidata":"Q2363991","brand:wikipedia":"en:Colruyt (supermarket)",name:"Colruyt",shop:"supermarket"},countryCodes:["be","fr","lu"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Combi":{name:"Combi",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Combi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1113618",shop:"supermarket"},addTags:{brand:"Combi","brand:wikidata":"Q1113618","brand:wikipedia":"de:Combi (Einkaufsmarkt)",name:"Combi",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Comercial Mexicana":{name:"Comercial Mexicana",icon:"maki-grocery",imageURL:"https://graph.facebook.com/209308192464395/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2985173",shop:"supermarket"},addTags:{brand:"Comercial Mexicana","brand:wikidata":"Q2985173","brand:wikipedia":"es:Comercial Mexicana",name:"Comercial Mexicana",shop:"supermarket"},countryCodes:["mx"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Conad":{name:"Conad",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Conad/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q639075",shop:"supermarket"},addTags:{brand:"Conad","brand:wikidata":"Q639075","brand:wikipedia":"it:Conad",name:"Conad",shop:"supermarket"},countryCodes:["al","it"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Conad City":{name:"Conad City",icon:"maki-grocery",imageURL:"https://graph.facebook.com/ConadCityQualiano/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q57543102",shop:"supermarket"},addTags:{brand:"Conad City","brand:wikidata":"Q57543102",name:"Conad City",shop:"supermarket"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Condis":{name:"Condis",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Condislife/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q57417581",shop:"supermarket"},addTags:{brand:"Condis","brand:wikidata":"Q57417581",name:"Condis",shop:"supermarket"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Consum":{name:"Consum",icon:"maki-grocery",imageURL:"https://graph.facebook.com/supermercadosconsum/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q8350308",shop:"supermarket"},addTags:{brand:"Consum","brand:wikidata":"Q8350308","brand:wikipedia":"es:Consum",name:"Consum",shop:"supermarket"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Continente":{name:"Continente",icon:"maki-grocery",imageURL:"https://graph.facebook.com/continenteoficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2995683",shop:"supermarket"},addTags:{brand:"Continente","brand:wikidata":"Q2995683","brand:wikipedia":"en:Continente (Supermarket)",name:"Continente",shop:"supermarket"},countryCodes:["pt"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Coop Prix":{name:"Coop Prix",icon:"maki-grocery",imageURL:"https://graph.facebook.com/coopprix/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5167705",shop:"supermarket"},addTags:{brand:"Coop Prix","brand:wikidata":"Q5167705","brand:wikipedia":"no:Coop Prix",name:"Coop Prix",shop:"supermarket"},countryCodes:["no"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Coop (Schweiz)":{name:"Coop (Schweiz)",icon:"maki-grocery",imageURL:"https://graph.facebook.com/coop.ch/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q432564",shop:"supermarket"},addTags:{brand:"Coop","brand:wikidata":"Q432564","brand:wikipedia":"de:Coop (Schweiz)",name:"Coop",shop:"supermarket"},countryCodes:["ch"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Cora":{name:"Cora",icon:"maki-grocery",imageURL:"https://graph.facebook.com/coraBelgium/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q686643",shop:"supermarket"},addTags:{brand:"Cora","brand:wikidata":"Q686643","brand:wikipedia":"en:Cora (hypermarket)",name:"Cora",shop:"supermarket"},countryCodes:["be","fr","lu","ro"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Costcutter":{name:"Costcutter",icon:"maki-grocery",imageURL:"https://graph.facebook.com/costcutter/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5175072",shop:"supermarket"},addTags:{brand:"Costcutter","brand:wikidata":"Q5175072","brand:wikipedia":"en:Costcutter",name:"Costcutter",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Coto":{name:"Coto",icon:"maki-grocery",imageURL:"https://graph.facebook.com/coto/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5175411",shop:"supermarket"},addTags:{brand:"Coto","brand:wikidata":"Q5175411","brand:wikipedia":"es:Coto (supermercado)",name:"Coto",shop:"supermarket"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Countdown":{name:"Countdown",icon:"maki-grocery",imageURL:"https://graph.facebook.com/countdown/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5176845",shop:"supermarket"},addTags:{brand:"Countdown","brand:wikidata":"Q5176845","brand:wikipedia":"en:Countdown (supermarket)",name:"Countdown",shop:"supermarket"},countryCodes:["nz"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Cub Foods":{name:"Cub Foods",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Cub/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5191916",shop:"supermarket"},addTags:{brand:"Cub Foods","brand:wikidata":"Q5191916","brand:wikipedia":"en:Cub Foods",name:"Cub Foods",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/D'Agostino":{name:"D'Agostino",icon:"maki-grocery",imageURL:"https://graph.facebook.com/yourdagnyc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q20656844",shop:"supermarket"},addTags:{brand:"D'Agostino","brand:wikidata":"Q20656844","brand:wikipedia":"en:D'Agostino Supermarkets",name:"D'Agostino",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/D1":{name:"D1",icon:"maki-grocery",imageURL:"https://graph.facebook.com/427264640797493/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q43403418",shop:"supermarket"},addTags:{brand:"D1","brand:wikidata":"Q43403418","brand:wikipedia":"es:Tiendas D1",name:"D1",shop:"supermarket"},countryCodes:["co"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Dagli'Brugsen":{name:"Dagli'Brugsen",icon:"maki-grocery",imageURL:"https://graph.facebook.com/DagliBrugsen/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12307017",shop:"supermarket"},addTags:{brand:"Dagli'Brugsen","brand:wikidata":"Q12307017","brand:wikipedia":"en:Dagli'Brugsen",name:"Dagli'Brugsen",shop:"supermarket"},countryCodes:["dk"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Deen":{name:"Deen",icon:"maki-grocery",imageURL:"https://graph.facebook.com/DEENSupermarkten/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q13571727",shop:"supermarket"},addTags:{brand:"Deen","brand:wikidata":"Q13571727","brand:wikipedia":"nl:Deen (supermarkt)",name:"Deen",shop:"supermarket"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Delhaize":{name:"Delhaize",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Delhaize/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1184173",shop:"supermarket"},addTags:{brand:"Delhaize","brand:wikidata":"Q1184173","brand:wikipedia":"fr:Delhaize",name:"Delhaize",shop:"supermarket"},countryCodes:["be","lu"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Delikatesy Centrum":{name:"Delikatesy Centrum",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Delikatesypl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11693824",shop:"supermarket"},addTags:{brand:"Delikatesy Centrum","brand:wikidata":"Q11693824","brand:wikipedia":"pl:Delikatesy Centrum",name:"Delikatesy Centrum",shop:"supermarket"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Denner":{name:"Denner",icon:"maki-grocery",imageURL:"https://graph.facebook.com/denner.ch/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q379911",shop:"supermarket"},addTags:{brand:"Denner","brand:wikidata":"Q379911","brand:wikipedia":"en:Denner (supermarket)",name:"Denner",shop:"supermarket"},countryCodes:["ch","li"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Despar":{name:"Despar",icon:"maki-grocery",imageURL:"https://graph.facebook.com/SPARintheUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q610492",shop:"supermarket"},addTags:{brand:"Spar","brand:wikidata":"Q610492","brand:wikipedia":"en:Spar (retailer)",name:"Despar",shop:"supermarket"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Despensa Familiar":{name:"Despensa Familiar",icon:"maki-grocery",imageURL:"https://graph.facebook.com/DespensaFamiliarGuatemala/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61994849",shop:"supermarket"},addTags:{brand:"Despensa Familiar","brand:wikidata":"Q61994849",name:"Despensa Familiar",shop:"supermarket"},countryCodes:["gt","hn","sv"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Dia":{name:"Dia",icon:"maki-grocery",imageURL:"https://graph.facebook.com/DIAEspana/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q925132",shop:"supermarket"},addTags:{brand:"Dia","brand:wikidata":"Q925132","brand:wikipedia":"es:Supermercados DIA",name:"Dia",shop:"supermarket"},terms:["supermercado dia"],matchScore:2,suggestion:true},"shop/supermarket/Dia Market":{name:"Dia Market",icon:"maki-grocery",imageURL:"https://graph.facebook.com/DIAEspana/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q925132",shop:"supermarket"},addTags:{brand:"Dia Market","brand:wikidata":"Q925132","brand:wikipedia":"es:Supermercados DIA",name:"Dia Market",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Dino":{name:"Dino",icon:"maki-grocery",imageURL:"https://graph.facebook.com/marketdinobieniewice/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11694239",shop:"supermarket"},addTags:{brand:"Dino","brand:wikidata":"Q11694239","brand:wikipedia":"pl:Dino Polska",name:"Dino",shop:"supermarket"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Dirk van den Broek":{name:"Dirk van den Broek",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Dirksupermarkten/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17502722",shop:"supermarket"},addTags:{brand:"Dirk van den Broek","brand:wikidata":"Q17502722","brand:wikipedia":"en:Dirk (supermarket)",name:"Dirk van den Broek",shop:"supermarket"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Disco (Argentina)":{name:"Disco (Argentina)",icon:"maki-grocery",imageURL:"https://graph.facebook.com/DiscoArgentina/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6135978",shop:"supermarket"},addTags:{brand:"Disco","brand:wikidata":"Q6135978","brand:wikipedia":"es:Disco (supermercado de Argentina)",name:"Disco",shop:"supermarket"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Disco (Uruguay)":{name:"Disco (Uruguay)",icon:"maki-grocery",imageURL:"https://graph.facebook.com/discouruguay/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16636819",shop:"supermarket"},addTags:{brand:"Disco","brand:wikidata":"Q16636819","brand:wikipedia":"es:Disco (supermercado de Uruguay)",name:"Disco",shop:"supermarket"},countryCodes:["uy"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Diska":{name:"Diska",icon:"maki-grocery",imageURL:"https://graph.facebook.com/diskamarkt/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62390177",shop:"supermarket"},addTags:{brand:"Diska","brand:wikidata":"Q62390177",name:"Diska",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Dunnes Stores":{name:"Dunnes Stores",icon:"maki-grocery",imageURL:"https://graph.facebook.com/DunnesStores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1266203",shop:"supermarket"},addTags:{brand:"Dunnes Stores","brand:wikidata":"Q1266203","brand:wikipedia":"en:Dunnes Stores",name:"Dunnes Stores",shop:"supermarket"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/E-Center":{name:"E-Center",icon:"maki-grocery",imageURL:"https://graph.facebook.com/EDEKA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q701755",shop:"supermarket"},addTags:{brand:"E-Center","brand:wikidata":"Q701755","brand:wikipedia":"en:Edeka",name:"E-Center",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/E. Leclerc":{name:"E. Leclerc",icon:"maki-grocery",imageURL:"https://graph.facebook.com/E.Leclerc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1273376",shop:"supermarket"},addTags:{brand:"E. Leclerc","brand:wikidata":"Q1273376","brand:wikipedia":"en:E.Leclerc",name:"E. Leclerc",shop:"supermarket"},countryCodes:["es","fr","pl","pt"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/E. Leclerc Drive":{name:"E. Leclerc Drive",icon:"maki-grocery",imageURL:"https://graph.facebook.com/E.Leclerc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1273376",shop:"supermarket"},addTags:{brand:"E. Leclerc Drive","brand:wikidata":"Q1273376","brand:wikipedia":"fr:E.Leclerc",name:"E. Leclerc Drive",shop:"supermarket"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/EMTÉ":{name:"EMTÉ",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FEmte%20logo.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q3119122",shop:"supermarket"},addTags:{brand:"EMTÉ","brand:wikidata":"Q3119122","brand:wikipedia":"en:EMTÉ",name:"EMTÉ",shop:"supermarket"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Edeka":{name:"Edeka",icon:"maki-grocery",imageURL:"https://graph.facebook.com/EDEKA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q701755",shop:"supermarket"},addTags:{brand:"Edeka","brand:wikidata":"Q701755","brand:wikipedia":"en:Edeka",name:"Edeka",shop:"supermarket"},countryCodes:["de"],terms:["edeka neukauf"],matchScore:2,suggestion:true},"shop/supermarket/Eko":{name:"Eko",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q9251859",shop:"supermarket"},addTags:{brand:"Eko","brand:wikidata":"Q9251859","brand:wikipedia":"pl:Eko Holding",name:"Eko",shop:"supermarket"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Ekom":{name:"Ekom",icon:"maki-grocery",imageURL:"https://graph.facebook.com/1013432382051351/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62073442",shop:"supermarket"},addTags:{brand:"Ekom","brand:wikidata":"Q62073442",name:"Ekom",shop:"supermarket"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Ekono":{name:"Ekono",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogotipo%20Ekono.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2842729",shop:"supermarket"},addTags:{brand:"Ekono","brand:wikidata":"Q2842729","brand:wikipedia":"es:Ekono",name:"Ekono",shop:"supermarket"},countryCodes:["cl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Eroski":{name:"Eroski",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Eroski/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1361349",shop:"supermarket"},addTags:{brand:"Eroski","brand:wikidata":"Q1361349","brand:wikipedia":"en:Eroski",name:"Eroski",shop:"supermarket"},countryCodes:["es","gi"],terms:["charter","eroski center"],matchScore:2,suggestion:true},"shop/supermarket/Esselunga":{name:"Esselunga",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Esselunga/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1059636",shop:"supermarket"},addTags:{brand:"Esselunga","brand:wikidata":"Q1059636","brand:wikipedia":"en:Esselunga",name:"Esselunga",shop:"supermarket"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/EuroSpin":{name:"EuroSpin",icon:"maki-grocery",imageURL:"https://graph.facebook.com/EurospinItaliaSpa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1374674",shop:"supermarket"},addTags:{brand:"EuroSpin","brand:wikidata":"Q1374674","brand:wikipedia":"it:Eurospin",name:"EuroSpin",shop:"supermarket"},countryCodes:["it","si"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Eurospar":{name:"Eurospar",icon:"maki-grocery",imageURL:"https://graph.facebook.com/EurosparIreland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12309283",shop:"supermarket"},addTags:{brand:"Eurospar","brand:wikidata":"Q12309283","brand:wikipedia":"da:Eurospar",name:"Eurospar",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Extra":{name:"Extra",icon:"maki-grocery",imageURL:"https://graph.facebook.com/extramorkved/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11964085",shop:"supermarket"},addTags:{brand:"Extra","brand:wikidata":"Q11964085","brand:wikipedia":"no:Extra (Coop)",name:"Extra",shop:"supermarket"},terms:["coop extra"],matchScore:2,suggestion:true},"shop/supermarket/Famila":{name:"Famila",icon:"maki-grocery",imageURL:"https://graph.facebook.com/1674632829509874/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1395108",shop:"supermarket"},addTags:{brand:"Famila","brand:wikidata":"Q1395108","brand:wikipedia":"de:Famila",name:"Famila",shop:"supermarket"},countryCodes:["de","it"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Fareway":{name:"Fareway",icon:"maki-grocery",imageURL:"https://graph.facebook.com/farewaystores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5434998",shop:"supermarket"},addTags:{brand:"Fareway","brand:wikidata":"Q5434998","brand:wikipedia":"en:Fareway",name:"Fareway",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Farm Boy":{name:"Farm Boy",icon:"maki-grocery",imageURL:"https://graph.facebook.com/farmboy.ca/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5435469",shop:"supermarket"},addTags:{brand:"Farm Boy","brand:wikidata":"Q5435469","brand:wikipedia":"en:Farm Boy",name:"Farm Boy",shop:"supermarket"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Farmfoods":{name:"Farmfoods",icon:"maki-grocery",imageURL:"https://graph.facebook.com/147382588630890/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5435841",shop:"supermarket"},addTags:{brand:"Farmfoods","brand:wikidata":"Q5435841","brand:wikipedia":"en:Farmfoods",name:"Farmfoods",shop:"supermarket"},countryCodes:["gb","sk"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Feneberg":{name:"Feneberg",icon:"maki-grocery",imageURL:"https://graph.facebook.com/FenebergLebensmittel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5345378",shop:"supermarket"},addTags:{brand:"Feneberg","brand:wikidata":"Q5345378","brand:wikipedia":"de:Feneberg Lebensmittel",name:"Feneberg",shop:"supermarket"},countryCodes:["at","de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Food 4 Less":{name:"Food 4 Less",icon:"maki-grocery",imageURL:"https://graph.facebook.com/myfood4less/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5465282",shop:"supermarket"},addTags:{brand:"Food 4 Less","brand:wikidata":"Q5465282","brand:wikipedia":"en:Food 4 Less",name:"Food 4 Less",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Food Basics":{name:"Food Basics",icon:"maki-grocery",imageURL:"https://graph.facebook.com/foodbasics.ca/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5465300",shop:"supermarket"},addTags:{brand:"Food Basics","brand:wikidata":"Q5465300","brand:wikipedia":"en:Food Basics",name:"Food Basics",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Food City (USA)":{name:"Food City (USA)",icon:"maki-grocery",imageURL:"https://graph.facebook.com/FoodCity/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16981107",shop:"supermarket"},addTags:{brand:"Food City","brand:wikidata":"Q16981107","brand:wikipedia":"en:Food City (K-VA-T)",name:"Food City",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Food Lion":{name:"Food Lion",icon:"maki-grocery",imageURL:"https://graph.facebook.com/foodlion/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1435950",shop:"supermarket"},addTags:{brand:"Food Lion","brand:wikidata":"Q1435950","brand:wikipedia":"en:Food Lion",name:"Food Lion",shop:"supermarket"},countryCodes:["es","us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/FoodLand (USA)":{name:"FoodLand (USA)",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q5465271",shop:"supermarket"},addTags:{brand:"FoodLand","brand:wikidata":"Q5465271","brand:wikipedia":"en:FoodLand",name:"FoodLand",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/FoodMaxx":{name:"FoodMaxx",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Foodmaxx/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61894844",shop:"supermarket"},addTags:{brand:"FoodMaxx","brand:wikidata":"Q61894844",name:"FoodMaxx",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Foodland (Australia)":{name:"Foodland (Australia)",icon:"maki-grocery",imageURL:"https://graph.facebook.com/FoodlandSupermarkets/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5465555",shop:"supermarket"},addTags:{brand:"Foodland","brand:wikidata":"Q5465555","brand:wikipedia":"en:Foodland (South Australia)",name:"Foodland",shop:"supermarket"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Foodland (Canada)":{name:"Foodland (Canada)",icon:"maki-grocery",imageURL:"https://graph.facebook.com/dansFoodland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5465554",shop:"supermarket"},addTags:{brand:"Foodland","brand:wikidata":"Q5465554","brand:wikipedia":"en:Foodland (Canada)",name:"Foodland",shop:"supermarket"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Foodland (Hawaii)":{name:"Foodland (Hawaii)",icon:"maki-grocery",imageURL:"https://graph.facebook.com/FoodlandHawaii/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5465560",shop:"supermarket"},addTags:{brand:"Foodland","brand:wikidata":"Q5465560","brand:wikipedia":"en:Foodland Hawaii",name:"Foodland",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Foodworks":{name:"Foodworks",icon:"maki-grocery",imageURL:"https://graph.facebook.com/foodworksaus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5465579",shop:"supermarket"},addTags:{brand:"Foodworks","brand:wikidata":"Q5465579","brand:wikipedia":"en:Foodworks",name:"Foodworks",shop:"supermarket"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Fred Meyer":{name:"Fred Meyer",icon:"maki-grocery",imageURL:"https://graph.facebook.com/fredmeyer/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5495932",shop:"supermarket"},addTags:{brand:"Fred Meyer","brand:wikidata":"Q5495932","brand:wikipedia":"en:Fred Meyer",name:"Fred Meyer",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Fresh":{name:"Fresh",icon:"maki-grocery",imageURL:"https://graph.facebook.com/freshobchod/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q50737403",shop:"supermarket"},addTags:{brand:"Fresh","brand:wikidata":"Q50737403","brand:wikipedia":"sk:Fresh",name:"Fresh",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Fresh Thyme":{name:"Fresh Thyme",icon:"maki-grocery",imageURL:"https://graph.facebook.com/FreshThymeFarmersMarkets/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64132791",shop:"supermarket"},addTags:{brand:"Fresh Thyme","brand:wikidata":"Q64132791",name:"Fresh Thyme",shop:"supermarket"},countryCodes:["us"],terms:["fresh thyme farmers market"],matchScore:2,suggestion:true},"shop/supermarket/FreshCo":{name:"FreshCo",icon:"maki-grocery",imageURL:"https://graph.facebook.com/FreshCo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5502915",shop:"supermarket"},addTags:{brand:"FreshCo","brand:wikidata":"Q5502915","brand:wikipedia":"en:FreshCo",name:"FreshCo",shop:"supermarket"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Froiz":{name:"Froiz",icon:"maki-grocery",imageURL:"https://graph.facebook.com/158051157541336/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17070775",shop:"supermarket"},addTags:{brand:"Froiz","brand:wikidata":"Q17070775","brand:wikipedia":"en:Froiz",name:"Froiz",shop:"supermarket"},countryCodes:["es","pt"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Føtex":{name:"Føtex",icon:"maki-grocery",imageURL:"https://graph.facebook.com/foetexdk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1480395",shop:"supermarket"},addTags:{brand:"Føtex","brand:wikidata":"Q1480395","brand:wikipedia":"en:Føtex",name:"Føtex",shop:"supermarket"},countryCodes:["dk"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/G20":{name:"G20",icon:"maki-grocery",imageURL:"https://graph.facebook.com/supermarchesg20/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3504731",shop:"supermarket"},addTags:{brand:"G20","brand:wikidata":"Q3504731","brand:wikipedia":"fr:Supermarchés G20",name:"G20",shop:"supermarket"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/GBarbosa":{name:"GBarbosa",icon:"maki-grocery",imageURL:"https://graph.facebook.com/oficialgbarbosa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10287817",shop:"supermarket"},addTags:{brand:"GBarbosa","brand:wikidata":"Q10287817","brand:wikipedia":"pt:GBarbosa",name:"GBarbosa",shop:"supermarket"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Gadis":{name:"Gadis",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Gadis.supermercados/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12389151",shop:"supermarket"},addTags:{brand:"Gadis","brand:wikidata":"Q12389151","brand:wikipedia":"gl:Gadisa",name:"Gadis",shop:"supermarket"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Giant Eagle":{name:"Giant Eagle",icon:"maki-grocery",imageURL:"https://graph.facebook.com/gianteagleinc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1522721",shop:"supermarket"},addTags:{brand:"Giant Eagle","brand:wikidata":"Q1522721","brand:wikipedia":"en:Giant Eagle",name:"Giant Eagle",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Giant (Carlisle)":{name:"Giant (Carlisle)",icon:"maki-grocery",imageURL:"https://graph.facebook.com/giantfoodstores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5558332",shop:"supermarket"},addTags:{brand:"Giant","brand:wikidata":"Q5558332","brand:wikipedia":"en:Giant Food Stores",name:"Giant",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Giant (Landover)":{name:"Giant (Landover)",icon:"maki-grocery",imageURL:"https://graph.facebook.com/GiantFood/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5558336",shop:"supermarket"},addTags:{brand:"Giant","brand:wikidata":"Q5558336","brand:wikipedia":"en:Giant Food (Landover)",name:"Giant",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Globus":{name:"Globus",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Globus.de/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q457503",shop:"supermarket"},addTags:{brand:"Globus","brand:wikidata":"Q457503","brand:wikipedia":"en:Globus (hypermarket)",name:"Globus",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Gordon Food Service":{name:"Gordon Food Service",icon:"maki-grocery",imageURL:"https://graph.facebook.com/GordonFoodService/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1538006",shop:"supermarket"},addTags:{brand:"Gordon Food Service","brand:wikidata":"Q1538006","brand:wikipedia":"en:Gordon Food Service",name:"Gordon Food Service",shop:"supermarket"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Grand Frais":{name:"Grand Frais",icon:"maki-grocery",imageURL:"https://graph.facebook.com/GrandFrais/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3114675",shop:"supermarket"},addTags:{brand:"Grand Frais","brand:wikidata":"Q3114675","brand:wikipedia":"fr:Grand Frais",name:"Grand Frais",shop:"supermarket"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Grocery Outlet":{name:"Grocery Outlet",icon:"maki-grocery",imageURL:"https://graph.facebook.com/GroceryOutletInc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5609934",shop:"supermarket"},addTags:{brand:"Grocery Outlet","brand:wikidata":"Q5609934","brand:wikipedia":"en:Grocery Outlet",name:"Grocery Outlet",official_name:"Grocery Outlet Bargain Market",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Groszek":{name:"Groszek",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Sklepy.Groszek/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q9280965",shop:"supermarket"},addTags:{brand:"Groszek","brand:wikidata":"Q9280965","brand:wikipedia":"pl:Groszek (sieć sklepów)",name:"Groszek",shop:"supermarket"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Géant Casino":{name:"Géant Casino",icon:"maki-grocery",imageURL:"https://graph.facebook.com/geantcasino/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1380537",shop:"supermarket"},addTags:{brand:"Géant Casino","brand:wikidata":"Q1380537","brand:wikipedia":"en:Géant Casino",name:"Géant Casino",shop:"supermarket"},countryCodes:["cg","fr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/H Mart":{name:"H Mart",icon:"maki-grocery",imageURL:"https://graph.facebook.com/hmartofficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5636306",shop:"supermarket"},addTags:{"alt_name:ko":"H 마트",brand:"H Mart","brand:wikidata":"Q5636306","brand:wikipedia":"en:H Mart",cuisine:"asian",name:"H Mart","name:en":"H Mart","name:ko":"한아름","name:zh-Hans":"韩亚龙","name:zh-Hant":"韓亞龍",shop:"supermarket"},countryCodes:["ca","gb","us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/H-E-B":{name:"H-E-B",icon:"maki-grocery",imageURL:"https://graph.facebook.com/HEB/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q830621",shop:"supermarket"},addTags:{brand:"H-E-B","brand:wikidata":"Q830621","brand:wikipedia":"en:H-E-B",name:"H-E-B",shop:"supermarket"},countryCodes:["mx","us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/HIT":{name:"HIT",icon:"maki-grocery",imageURL:"https://graph.facebook.com/151789788189446/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1548713",shop:"supermarket"},addTags:{brand:"HIT","brand:wikidata":"Q1548713","brand:wikipedia":"de:HIT Handelsgruppe",name:"HIT",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/HalpaHalli":{name:"HalpaHalli",icon:"maki-grocery",imageURL:"https://graph.facebook.com/HalpaHalli/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11861256",shop:"supermarket"},addTags:{brand:"HalpaHalli","brand:wikidata":"Q11861256","brand:wikipedia":"fi:HalpaHalli",name:"HalpaHalli",shop:"supermarket"},countryCodes:["ee","fi","ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Hannaford":{name:"Hannaford",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Hannaford/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5648760",shop:"supermarket"},addTags:{brand:"Hannaford","brand:wikidata":"Q5648760","brand:wikipedia":"en:Hannaford Brothers Company",name:"Hannaford",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Harris Teeter":{name:"Harris Teeter",icon:"maki-grocery",imageURL:"https://graph.facebook.com/harristeeter/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5665067",shop:"supermarket"},addTags:{brand:"Harris Teeter","brand:wikidata":"Q5665067","brand:wikipedia":"en:Harris Teeter",name:"Harris Teeter",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Hemköp":{name:"Hemköp",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Hemkop/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10521746",shop:"supermarket"},addTags:{brand:"Hemköp","brand:wikidata":"Q10521746","brand:wikipedia":"sv:Hemköp",name:"Hemköp",shop:"supermarket"},countryCodes:["se"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Heron Foods":{name:"Heron Foods",icon:"maki-grocery",imageURL:"https://graph.facebook.com/heronfoodslimited/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5743472",shop:"supermarket"},addTags:{brand:"Heron Foods","brand:wikidata":"Q5743472","brand:wikipedia":"en:Heron Foods",name:"Heron Foods",shop:"supermarket"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Hofer":{name:"Hofer",icon:"maki-grocery",imageURL:"https://graph.facebook.com/HOFER.AT/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q15815751",shop:"supermarket"},addTags:{brand:"Hofer","brand:wikidata":"Q15815751","brand:wikipedia":"de:Hofer KG",name:"Hofer",shop:"supermarket"},countryCodes:["at","si"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Hoogvliet":{name:"Hoogvliet",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Hoogvliet.supermarkten/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2770647",shop:"supermarket"},addTags:{brand:"Hoogvliet","brand:wikidata":"Q2770647","brand:wikipedia":"nl:Hoogvliet (supermarkt)",name:"Hoogvliet",shop:"supermarket"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Hy-Vee":{name:"Hy-Vee",icon:"maki-grocery",imageURL:"https://graph.facebook.com/HyVee/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1639719",shop:"supermarket"},addTags:{brand:"Hy-Vee","brand:wikidata":"Q1639719","brand:wikipedia":"en:Hy-Vee",name:"Hy-Vee",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Hyper U":{name:"Hyper U",icon:"maki-grocery",imageURL:"https://graph.facebook.com/ULesCommercants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2529029",shop:"supermarket"},addTags:{brand:"Hyper U","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Hyper U",shop:"supermarket"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/ICA":{name:"ICA",icon:"maki-grocery",imageURL:"https://graph.facebook.com/ICA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1663776",shop:"supermarket"},addTags:{brand:"ICA","brand:wikidata":"Q1663776","brand:wikipedia":"sv:Ica",name:"ICA",shop:"supermarket"},countryCodes:["no","se"],terms:["ica supermarket"],matchScore:2,suggestion:true},"shop/supermarket/ICA Kvantum":{name:"ICA Kvantum",icon:"maki-grocery",imageURL:"https://graph.facebook.com/ICA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1663776",shop:"supermarket"},addTags:{brand:"ICA Kvantum","brand:wikidata":"Q1663776","brand:wikipedia":"sv:Ica",name:"ICA Kvantum",shop:"supermarket"},countryCodes:["se"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/ICA Maxi":{name:"ICA Maxi",icon:"maki-grocery",imageURL:"https://graph.facebook.com/ICA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1663776",shop:"supermarket"},addTags:{brand:"ICA Maxi","brand:wikidata":"Q1663776","brand:wikipedia":"sv:Ica",name:"ICA Maxi",shop:"supermarket"},countryCodes:["no","se"],terms:["maxi"],matchScore:2,suggestion:true},"shop/supermarket/IDEA":{name:"IDEA",icon:"maki-grocery",imageURL:"https://graph.facebook.com/IDEASrbija/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q23461622",shop:"supermarket"},addTags:{brand:"IDEA","brand:wikidata":"Q23461622","brand:wikipedia":"en:Idea (supermarkets)",name:"IDEA",shop:"supermarket"},countryCodes:["rs"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/IGA":{name:"IGA",icon:"maki-grocery",imageURL:"https://graph.facebook.com/IGACorp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3146662",shop:"supermarket"},addTags:{brand:"IGA","brand:wikidata":"Q3146662","brand:wikipedia":"en:IGA (supermarkets)",name:"IGA",shop:"supermarket"},countryCodes:["au","ca","us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Iceland":{name:"Iceland",icon:"maki-grocery",imageURL:"https://graph.facebook.com/icelandfoods/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q721810",shop:"supermarket"},addTags:{brand:"Iceland","brand:wikidata":"Q721810","brand:wikipedia":"en:Iceland (supermarket)",name:"Iceland",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Ingles":{name:"Ingles",icon:"maki-grocery",imageURL:"https://graph.facebook.com/inglesmarkets/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6032595",shop:"supermarket"},addTags:{brand:"Ingles","brand:wikidata":"Q6032595","brand:wikipedia":"en:Ingles",name:"Ingles",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Intermarché":{name:"Intermarché",icon:"maki-grocery",imageURL:"https://graph.facebook.com/tousuniscontrelaviechere/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3153200",shop:"supermarket"},addTags:{brand:"Intermarché","brand:wikidata":"Q3153200","brand:wikipedia":"fr:Intermarché",name:"Intermarché",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Intermarché Super":{name:"Intermarché Super",icon:"maki-grocery",imageURL:"https://graph.facebook.com/tousuniscontrelaviechere/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3153200",shop:"supermarket"},addTags:{brand:"Intermarché Super","brand:wikidata":"Q3153200","brand:wikipedia":"fr:Intermarché",name:"Intermarché Super",shop:"supermarket"},countryCodes:["be","fr","pl","pt"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Interspar":{name:"Interspar",icon:"maki-grocery",imageURL:"https://graph.facebook.com/INTERSPAR/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q15820339",shop:"supermarket"},addTags:{brand:"Interspar","brand:wikidata":"Q15820339","brand:wikipedia":"de:Interspar (Österreich)",name:"Interspar",shop:"supermarket"},countryCodes:["at"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Irma":{name:"Irma",icon:"maki-grocery",imageURL:"https://graph.facebook.com/IrmaDanmark/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q797150",shop:"supermarket"},addTags:{brand:"Irma","brand:wikidata":"Q797150","brand:wikipedia":"en:Irma (supermarket)",name:"Irma",shop:"supermarket"},countryCodes:["dk"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Jan Linders":{name:"Jan Linders",icon:"maki-grocery",imageURL:"https://graph.facebook.com/JanLindersSupermarkten/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2200982",shop:"supermarket"},addTags:{brand:"Jan Linders","brand:wikidata":"Q2200982","brand:wikipedia":"nl:Jan Linders Supermarkten",name:"Jan Linders",shop:"supermarket"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Jewel-Osco":{name:"Jewel-Osco",icon:"maki-grocery",imageURL:"https://graph.facebook.com/JewelOsco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3178470",shop:"supermarket"},addTags:{brand:"Jewel-Osco","brand:wikidata":"Q3178470","brand:wikipedia":"en:Jewel (supermarket)",name:"Jewel-Osco",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Jumbo":{name:"Jumbo",icon:"maki-grocery",imageURL:"https://graph.facebook.com/jumbosupermarkten/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2262314",shop:"supermarket"},addTags:{brand:"Jumbo","brand:wikidata":"Q2262314","brand:wikipedia":"en:Jumbo (supermarket)",name:"Jumbo",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/K+K":{name:"K+K",icon:"maki-grocery",imageURL:"https://graph.facebook.com/KlaasundKock/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1718009",shop:"supermarket"},addTags:{brand:"K+K","brand:wikidata":"Q1718009","brand:wikipedia":"de:K+K Klaas & Kock",name:"K+K",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/K-Citymarket":{name:"K-Citymarket",icon:"maki-grocery",imageURL:"https://graph.facebook.com/citymarket/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11868561",shop:"supermarket"},addTags:{brand:"K-Citymarket","brand:wikidata":"Q11868561","brand:wikipedia":"fi:K-Citymarket",name:"K-Citymarket",shop:"supermarket"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/K-Supermarket":{name:"K-Supermarket",icon:"maki-grocery",imageURL:"https://graph.facebook.com/KSupermarketketju/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5408668",shop:"supermarket"},addTags:{brand:"K-Supermarket","brand:wikidata":"Q5408668","brand:wikipedia":"fi:K-Supermarket",name:"K-Supermarket",shop:"supermarket"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Kaufland":{name:"Kaufland",icon:"maki-grocery",imageURL:"https://graph.facebook.com/132476996783723/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q685967",shop:"supermarket"},addTags:{brand:"Kaufland","brand:wikidata":"Q685967","brand:wikipedia":"en:Kaufland",name:"Kaufland",shop:"supermarket"},countryCodes:["bg","cz","de","hr","pl","ro","sk"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/King Soopers":{name:"King Soopers",icon:"maki-grocery",imageURL:"https://graph.facebook.com/kingsoopers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6412065",shop:"supermarket"},addTags:{brand:"King Soopers","brand:wikidata":"Q6412065","brand:wikipedia":"en:King Soopers",name:"King Soopers",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Kings":{name:"Kings",icon:"maki-grocery",imageURL:"https://graph.facebook.com/KingsFoodMarkets/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6412914",shop:"supermarket"},addTags:{brand:"Kings","brand:wikidata":"Q6412914","brand:wikipedia":"en:Kings Food Markets",name:"Kings",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Kiwi":{name:"Kiwi",icon:"maki-grocery",imageURL:"https://graph.facebook.com/kiwiminipris/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1613639",shop:"supermarket"},addTags:{brand:"Kiwi","brand:wikidata":"Q1613639","brand:wikipedia":"en:Kiwi (store)",name:"Kiwi",shop:"supermarket"},countryCodes:["dk","no"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Konzum (Balkans)":{name:"Konzum (Balkans)",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FKonzum%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q518563",shop:"supermarket"},addTags:{brand:"Konzum","brand:wikidata":"Q518563","brand:wikipedia":"hr:Konzum",name:"Konzum",shop:"supermarket"},countryCodes:["ba","hr","rs"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Kroger":{name:"Kroger",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Kroger/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q153417",shop:"supermarket"},addTags:{brand:"Kroger","brand:wikidata":"Q153417","brand:wikipedia":"en:Kroger",name:"Kroger",shop:"supermarket"},terms:["krogers"],matchScore:2,suggestion:true},"shop/supermarket/Kvickly":{name:"Kvickly",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Kvickly/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7061148",shop:"supermarket"},addTags:{brand:"Kvickly","brand:wikidata":"Q7061148","brand:wikipedia":"en:Kvickly",name:"Kvickly",shop:"supermarket"},countryCodes:["dk"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/La Anónima":{name:"La Anónima",icon:"maki-grocery",imageURL:"https://graph.facebook.com/laanonimaoficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6135985",shop:"supermarket"},addTags:{brand:"La Anónima","brand:wikidata":"Q6135985","brand:wikipedia":"es:La Anónima",name:"La Anónima",shop:"supermarket"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/La Comer":{name:"La Comer",icon:"maki-grocery",imageURL:"https://graph.facebook.com/LaComerOficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q26765126",shop:"supermarket"},addTags:{brand:"La Comer","brand:wikidata":"Q26765126","brand:wikipedia":"es:La Comer",name:"La Comer",shop:"supermarket"},countryCodes:["mx"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/La Michoacana Meat Market":{name:"La Michoacana Meat Market",icon:"maki-grocery",imageURL:"https://graph.facebook.com/lamichoacanameatmarket.officialpage/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6463872",shop:"supermarket"},addTags:{brand:"La Michoacana Meat Market","brand:en":"La Michoacana Meat Market","brand:es":"La Michoacana","brand:wikidata":"Q6463872","brand:wikipedia":"en:La Michoacana Meat Market",cuisine:"latin_american",name:"La Michoacana Meat Market","name:en":"La Michoacana Meat Market","name:es":"La Michoacana",shop:"supermarket"},countryCodes:["us"],terms:["la michoacana"],matchScore:2,suggestion:true},"shop/supermarket/La Plaza de DIA":{name:"La Plaza de DIA",icon:"maki-grocery",imageURL:"https://graph.facebook.com/LaPlazadeDIA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q58904673",shop:"supermarket"},addTags:{brand:"La Plaza de DIA","brand:wikidata":"Q58904673",name:"La Plaza de DIA",shop:"supermarket"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/La Vie Claire":{name:"La Vie Claire",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Lavieclaire/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3213589",shop:"supermarket"},addTags:{brand:"La Vie Claire","brand:wikidata":"Q3213589","brand:wikipedia":"en:La Vie Claire (company)",name:"La Vie Claire",shop:"supermarket"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Landi":{name:"Landi",icon:"maki-grocery",imageURL:"https://graph.facebook.com/landivechigen/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1803010",shop:"supermarket"},addTags:{brand:"Landi","brand:wikidata":"Q1803010","brand:wikipedia":"en:Landi (Unternehmen)",name:"Landi",shop:"supermarket"},countryCodes:["ch"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Leader Price":{name:"Leader Price",icon:"maki-grocery",imageURL:"https://graph.facebook.com/leaderpriceofficiel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2181426",shop:"supermarket"},addTags:{brand:"Leader Price","brand:wikidata":"Q2181426","brand:wikipedia":"en:Leader Price",name:"Leader Price",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Lewiatan":{name:"Lewiatan",icon:"maki-grocery",imageURL:"https://graph.facebook.com/psh.lewiatan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11755396",shop:"supermarket"},addTags:{brand:"Lewiatan","brand:wikidata":"Q11755396","brand:wikipedia":"pl:Lewiatan (sieć handlowa)",name:"Lewiatan",shop:"supermarket"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Lider":{name:"Lider",icon:"maki-grocery",imageURL:"https://graph.facebook.com/lidercl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6711261",shop:"supermarket"},addTags:{brand:"Lider","brand:wikidata":"Q6711261","brand:wikipedia":"es:Líder (supermercado)",name:"Lider",shop:"supermarket"},countryCodes:["cl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Lider Express":{name:"Lider Express",icon:"maki-grocery",imageURL:"https://graph.facebook.com/lidercl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6711261",shop:"supermarket"},addTags:{brand:"Lider","brand:wikidata":"Q6711261","brand:wikipedia":"es:Líder (supermercado)",name:"Lider Express",shop:"supermarket"},countryCodes:["cl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Lidl":{name:"Lidl",icon:"maki-grocery",imageURL:"https://graph.facebook.com/lidl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q151954",shop:"supermarket"},addTags:{brand:"Lidl","brand:wikidata":"Q151954","brand:wikipedia":"en:Lidl",name:"Lidl",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Lincolnshire Co-op":{name:"Lincolnshire Co-op",icon:"maki-grocery",imageURL:"https://graph.facebook.com/lincolnshirecoop/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6551231",shop:"supermarket"},addTags:{brand:"Lincolnshire Co-op","brand:wikidata":"Q6551231","brand:wikipedia":"en:Lincolnshire Co-operative",name:"Lincolnshire Co-op",shop:"supermarket"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Linella":{name:"Linella",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q61085990",shop:"supermarket"},addTags:{brand:"Linella","brand:wikidata":"Q61085990","brand:wikipedia":"ro:Linella",name:"Linella",shop:"supermarket"},countryCodes:["md"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Loblaws":{name:"Loblaws",icon:"maki-grocery",imageURL:"https://graph.facebook.com/LoblawsON/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3257626",shop:"supermarket"},addTags:{brand:"Loblaws","brand:wikidata":"Q3257626","brand:wikipedia":"en:Loblaws",name:"Loblaws",shop:"supermarket"},countryCodes:["ca"],terms:["loblaws great food"],matchScore:2,suggestion:true},"shop/supermarket/Lotte Mart":{name:"Lotte Mart",icon:"maki-grocery",imageURL:"https://graph.facebook.com/lottemart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q326715",shop:"supermarket"},addTags:{brand:"Lotte Mart","brand:wikidata":"Q326715","brand:wikipedia":"en:Lotte Mart",name:"Lotte Mart",shop:"supermarket"},countryCodes:["id","kr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Lowe's Market":{name:"Lowe's Market",icon:"maki-grocery",imageURL:"https://graph.facebook.com/LowesSupermarkets/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6693107",shop:"supermarket"},addTags:{brand:"Lowe's Market","brand:wikidata":"Q6693107","brand:wikipedia":"en:Lowe's Market",name:"Lowe's Market",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Lowes Foods":{name:"Lowes Foods",icon:"maki-grocery",imageURL:"https://graph.facebook.com/LowesFoodsStores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6693991",shop:"supermarket"},addTags:{brand:"Lowes Foods","brand:wikidata":"Q6693991","brand:wikipedia":"en:Lowes Foods",name:"Lowes Foods",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Lucky":{name:"Lucky",icon:"maki-grocery",imageURL:"https://graph.facebook.com/LuckySupermarkets/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6698032",shop:"supermarket"},addTags:{brand:"Lucky","brand:wikidata":"Q6698032","brand:wikipedia":"en:Lucky Stores",name:"Lucky",shop:"supermarket"},countryCodes:["us"],terms:["luckys"],matchScore:2,suggestion:true},"shop/supermarket/Lupa":{name:"Lupa",icon:"maki-grocery",imageURL:"https://graph.facebook.com/LupaSupermercados/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q58044048",shop:"supermarket"},addTags:{brand:"Lupa","brand:wikidata":"Q58044048",name:"Lupa",shop:"supermarket"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/MD":{name:"MD",icon:"maki-grocery",imageURL:"https://graph.facebook.com/mdspa.it/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3841263",shop:"supermarket"},addTags:{brand:"MD","brand:wikidata":"Q3841263","brand:wikipedia":"en:MD Discount",name:"MD",shop:"supermarket"},countryCodes:["it"],terms:["md discount"],matchScore:2,suggestion:true},"shop/supermarket/MPREIS":{name:"MPREIS",icon:"maki-grocery",imageURL:"https://graph.facebook.com/MPREIS.at/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q873491",shop:"supermarket"},addTags:{brand:"MPREIS","brand:wikidata":"Q873491","brand:wikipedia":"de:MPreis",name:"MPREIS",shop:"supermarket"},countryCodes:["at","it"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Marc's":{name:"Marc's",icon:"maki-grocery",imageURL:"https://graph.facebook.com/MarcsStores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17080259",shop:"supermarket"},addTags:{brand:"Marc's","brand:wikidata":"Q17080259","brand:wikipedia":"en:Marc's",name:"Marc's",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Markant":{name:"Markant",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q57523365",shop:"supermarket"},addTags:{brand:"Markant","brand:wikidata":"Q57523365",name:"Markant",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Market Basket":{name:"Market Basket",icon:"maki-grocery",imageURL:"https://graph.facebook.com/marketbasket/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2079198",shop:"supermarket"},addTags:{brand:"Market Basket","brand:wikidata":"Q2079198","brand:wikipedia":"en:Market Basket (New England)",name:"Market Basket",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Marktkauf":{name:"Marktkauf",icon:"maki-grocery",imageURL:"https://graph.facebook.com/119240581466268/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1533254",shop:"supermarket"},addTags:{brand:"Marktkauf","brand:wikidata":"Q1533254","brand:wikipedia":"de:Marktkauf Holding",name:"Marktkauf",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Martin's Super Markets":{name:"Martin's Super Markets",icon:"maki-grocery",imageURL:"https://graph.facebook.com/martinssupermarkets/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6774803",shop:"supermarket"},addTags:{brand:"Martin's Super Markets","brand:wikidata":"Q6774803","brand:wikipedia":"en:Martin's Super Markets",name:"Martin's Super Markets",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Match":{name:"Match",icon:"maki-grocery",imageURL:"https://graph.facebook.com/SupermarchesMatch/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q513977",shop:"supermarket"},addTags:{brand:"Match","brand:wikidata":"Q513977","brand:wikipedia":"en:Match (supermarket)",name:"Match",shop:"supermarket"},countryCodes:["be","fr","hu","lu"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Maxi Dia":{name:"Maxi Dia",icon:"maki-grocery",imageURL:"https://graph.facebook.com/DIAEspana/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q925132",shop:"supermarket"},addTags:{brand:"Maxi Dia","brand:wikidata":"Q925132","brand:wikipedia":"es:Supermercados DIA",name:"Maxi Dia",shop:"supermarket"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Maxima X":{name:"Maxima X",icon:"maki-grocery",imageURL:"https://graph.facebook.com/MaximaLV/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1881222",shop:"supermarket"},addTags:{brand:"Maxima X","brand:wikidata":"Q1881222","brand:wikipedia":"en:Maxima Group",name:"Maxima X",shop:"supermarket"},countryCodes:["bg","ee","lt","lv"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Maxima XX":{name:"Maxima XX",icon:"maki-grocery",imageURL:"https://graph.facebook.com/MaximaLV/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1881222",shop:"supermarket"},addTags:{brand:"Maxima XX","brand:wikidata":"Q1881222","brand:wikipedia":"en:Maxima Group",name:"Maxima XX",shop:"supermarket"},countryCodes:["bg","ee","lt","lv","pl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Maxima XXX":{name:"Maxima XXX",icon:"maki-grocery",imageURL:"https://graph.facebook.com/MaximaLV/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1881222",shop:"supermarket"},addTags:{brand:"Maxima XXX","brand:wikidata":"Q1881222","brand:wikipedia":"en:Maxima Group",name:"Maxima XXX",shop:"supermarket"},countryCodes:["bg","ee","lt","lv","pl"],terms:["maxima"],matchScore:2,suggestion:true},"shop/supermarket/Maxi (Canada)":{name:"Maxi (Canada)",icon:"maki-grocery",imageURL:"https://graph.facebook.com/maxi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3302441",shop:"supermarket"},addTags:{brand:"Maxi","brand:wikidata":"Q3302441","brand:wikipedia":"en:Maxi (Canadian supermarket)",name:"Maxi",shop:"supermarket"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Maxi (Serbia)":{name:"Maxi (Serbia)",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Maxi.Srbija/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6795490",shop:"supermarket"},addTags:{brand:"Maxi","brand:wikidata":"Q6795490","brand:wikipedia":"en:Maxi (Serbian supermarket)",name:"Maxi",shop:"supermarket"},countryCodes:["rs"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Mega Image":{name:"Mega Image",icon:"maki-grocery",imageURL:"https://graph.facebook.com/MegaImageRomania/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6808085",shop:"supermarket"},addTags:{brand:"Mega Image","brand:wikidata":"Q6808085","brand:wikipedia":"en:Mega Image",name:"Mega Image",shop:"supermarket"},countryCodes:["ro"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Mego":{name:"Mego",icon:"maki-grocery",imageURL:"https://graph.facebook.com/mego.lv/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16363314",shop:"supermarket"},addTags:{brand:"Mego","brand:wikidata":"Q16363314","brand:wikipedia":"lv:Mego",name:"Mego",shop:"supermarket"},countryCodes:["lv"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Meijer":{name:"Meijer",icon:"maki-grocery",imageURL:"https://graph.facebook.com/meijer/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1917753",shop:"supermarket"},addTags:{brand:"Meijer","brand:wikidata":"Q1917753","brand:wikipedia":"en:Meijer",name:"Meijer",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Meny":{name:"Meny",icon:"maki-grocery",imageURL:"https://graph.facebook.com/meny/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10581720",shop:"supermarket"},addTags:{brand:"Meny","brand:wikidata":"Q10581720","brand:wikipedia":"en:Meny",name:"Meny",shop:"supermarket"},countryCodes:["dk","no"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Mercadona":{name:"Mercadona",icon:"maki-grocery",imageURL:"https://graph.facebook.com/mercadona/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q377705",shop:"supermarket"},addTags:{brand:"Mercadona","brand:wikidata":"Q377705","brand:wikipedia":"en:Mercadona",name:"Mercadona",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Merkur":{name:"Merkur",icon:"maki-grocery",imageURL:"https://graph.facebook.com/merkurmarkt/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1921857",shop:"supermarket"},addTags:{brand:"Merkur","brand:wikidata":"Q1921857","brand:wikipedia":"de:Merkur (Österreich)",name:"Merkur",shop:"supermarket"},countryCodes:["at"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Metro (Canada)":{name:"Metro (Canada)",icon:"maki-grocery",imageURL:"https://graph.facebook.com/metro.ontario/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1145669",shop:"supermarket"},addTags:{brand:"Metro","brand:wikidata":"Q1145669","brand:wikipedia":"en:Metro Inc.",name:"Metro",shop:"supermarket"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Metro (Peru)":{name:"Metro (Peru)",icon:"maki-grocery",imageURL:"https://graph.facebook.com/metroperu/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16640217",shop:"supermarket"},addTags:{brand:"Metro","brand:wikidata":"Q16640217","brand:wikipedia":"en:Tiendas Metro",name:"Metro",shop:"supermarket"},countryCodes:["pe"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Migros":{name:"Migros",icon:"maki-grocery",imageURL:"https://graph.facebook.com/migros/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q680727",shop:"supermarket"},addTags:{brand:"Migros","brand:wikidata":"Q680727","brand:wikipedia":"en:Migros",name:"Migros",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Mila":{name:"Mila",icon:"maki-grocery",imageURL:"https://graph.facebook.com/MilaDruciarniaSklep/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q48844636",shop:"supermarket"},addTags:{brand:"Mila","brand:wikidata":"Q48844636","brand:wikipedia":"pl:Mila (sieć sklepów)",name:"Mila",shop:"supermarket"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Minipreço":{name:"Minipreço",icon:"maki-grocery",imageURL:"https://graph.facebook.com/minipreco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3042224",shop:"supermarket"},addTags:{brand:"Minipreço","brand:wikidata":"Q3042224","brand:wikipedia":"en:Minipreço",name:"Minipreço",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Mix Markt":{name:"Mix Markt",icon:"maki-grocery",imageURL:"https://graph.facebook.com/mixmarkt.eu/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q327854",shop:"supermarket"},addTags:{brand:"Mix Markt","brand:wikidata":"Q327854","brand:wikipedia":"de:Mix Markt",name:"Mix Markt",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Monoprix":{name:"Monoprix",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Monoprix/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3321241",shop:"supermarket"},addTags:{brand:"Monoprix","brand:wikidata":"Q3321241","brand:wikipedia":"en:Monoprix",name:"Monoprix",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/More":{name:"More",icon:"maki-grocery",imageURL:"https://graph.facebook.com/morestore/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6910891",shop:"supermarket"},addTags:{brand:"More","brand:wikidata":"Q6910891","brand:wikipedia":"en:More (store)",name:"More",shop:"supermarket"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Morrisons":{name:"Morrisons",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Morrisons/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q922344",shop:"supermarket"},addTags:{brand:"Morrisons","brand:wikidata":"Q922344","brand:wikipedia":"en:Morrisons",name:"Morrisons",shop:"supermarket"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Nah & Frisch":{name:"Nah & Frisch",icon:"maki-grocery",imageURL:"https://graph.facebook.com/nahundfrisch.at/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1963643",shop:"supermarket"},addTags:{brand:"Nah & Frisch","brand:wikidata":"Q1963643","brand:wikipedia":"de:Nah & Frisch",name:"Nah & Frisch",shop:"supermarket"},countryCodes:["at","de"],terms:["nah und frisch"],matchScore:2,suggestion:true},"shop/supermarket/Nahkauf":{name:"Nahkauf",icon:"maki-grocery",imageURL:"https://graph.facebook.com/nahkauf/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q57515238",shop:"supermarket"},addTags:{brand:"Nahkauf","brand:wikidata":"Q57515238",name:"Nahkauf",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Naturalia":{name:"Naturalia",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Naturaliamagasinsbio/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3337081",shop:"supermarket"},addTags:{brand:"Naturalia","brand:wikidata":"Q3337081","brand:wikipedia":"fr:Naturalia",name:"Naturalia",shop:"supermarket"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Netto":{name:"Netto",icon:"maki-grocery",imageURL:"https://graph.facebook.com/nettodk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q552652",shop:"supermarket"},addTags:{brand:"Netto","brand:wikidata":"Q552652","brand:wikipedia":"en:Netto (store)",name:"Netto",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Netto Marken-Discount":{name:"Netto Marken-Discount",icon:"maki-grocery",imageURL:"https://graph.facebook.com/nettomarkendiscount/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q879858",shop:"supermarket"},addTags:{brand:"Netto Marken-Discount","brand:wikidata":"Q879858","brand:wikipedia":"en:Netto Marken-Discount",name:"Netto Marken-Discount",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/New World":{name:"New World",icon:"maki-grocery",imageURL:"https://graph.facebook.com/newworld/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7012488",shop:"supermarket"},addTags:{brand:"New World","brand:wikidata":"Q7012488","brand:wikipedia":"en:New World (supermarket)",name:"New World",shop:"supermarket"},countryCodes:["nz"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/No Frills":{name:"No Frills",icon:"maki-grocery",imageURL:"https://graph.facebook.com/nofrillsCA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3342407",shop:"supermarket"},addTags:{brand:"No Frills","brand:wikidata":"Q3342407","brand:wikipedia":"en:No Frills (grocery store)",name:"No Frills",shop:"supermarket"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Norfa XL":{name:"Norfa XL",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Norfalt/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1998983",shop:"supermarket"},addTags:{brand:"Norfa XL","brand:wikidata":"Q1998983","brand:wikipedia":"lt:Norfa",name:"Norfa XL",shop:"supermarket"},countryCodes:["lt"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Norma":{name:"Norma",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FNorma%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q450180",shop:"supermarket"},addTags:{brand:"Norma","brand:wikidata":"Q450180","brand:wikipedia":"de:Norma (Handelskette)",name:"Norma",shop:"supermarket"},countryCodes:["at","cz","de","fr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Okay":{name:"Okay",icon:"maki-grocery",imageURL:"https://graph.facebook.com/okaycompact/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2159701",shop:"supermarket"},addTags:{brand:"Okay","brand:wikidata":"Q2159701","brand:wikipedia":"fr:OKay",name:"Okay",shop:"supermarket"},countryCodes:["be"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Olímpica":{name:"Olímpica",icon:"maki-grocery",imageURL:"https://graph.facebook.com/SupertiendaOlimpica/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q24749847",shop:"supermarket"},addTags:{brand:"Olímpica","brand:wikidata":"Q24749847","brand:wikipedia":"es:Grupo Empresarial Olímpica",name:"Olímpica",shop:"supermarket"},countryCodes:["co"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/PLUS":{name:"PLUS",icon:"maki-grocery",imageURL:"https://graph.facebook.com/PLUSsupermarkt/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1978981",shop:"supermarket"},addTags:{brand:"PLUS","brand:wikidata":"Q1978981","brand:wikipedia":"nl:PLUS (Nederlandse supermarkt)",name:"PLUS",shop:"supermarket"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/POLOmarket":{name:"POLOmarket",icon:"maki-grocery",imageURL:"https://graph.facebook.com/polomarket/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11821937",shop:"supermarket"},addTags:{brand:"POLOmarket","brand:wikidata":"Q11821937","brand:wikipedia":"pl:Polomarket",name:"POLOmarket",shop:"supermarket"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Palí":{name:"Palí",icon:"maki-grocery",imageURL:"https://graph.facebook.com/PaliCostaRica/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1064887",shop:"supermarket"},addTags:{brand:"Palí","brand:wikidata":"Q1064887","brand:wikipedia":"es:Walmart de México y Centroamérica",name:"Palí",shop:"supermarket"},countryCodes:["cr","ni"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Pam":{name:"Pam",icon:"maki-grocery",imageURL:"https://graph.facebook.com/pampanoramaufficiale/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3777398",shop:"supermarket"},addTags:{brand:"Pam","brand:wikidata":"Q3777398","brand:wikipedia":"it:Gruppo PAM",name:"Pam",shop:"supermarket"},countryCodes:["ch","it"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Pavilions":{name:"Pavilions",icon:"maki-grocery",imageURL:"https://graph.facebook.com/pavilions/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7155886",shop:"supermarket"},addTags:{brand:"Pavilions","brand:wikidata":"Q7155886","brand:wikipedia":"en:Pavilions (supermarket)",name:"Pavilions",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Penny":{name:"Penny",icon:"maki-grocery",imageURL:"https://graph.facebook.com/pennyoesterreich/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q284688",shop:"supermarket"},addTags:{brand:"Penny","brand:wikidata":"Q284688","brand:wikipedia":"en:Penny (supermarket)",name:"Penny",shop:"supermarket"},countryCodes:["at","cz","de","hu","it","ro"],terms:["penny market","penny markt"],matchScore:2,suggestion:true},"shop/supermarket/Pick 'n Save":{name:"Pick 'n Save",icon:"maki-grocery",imageURL:"https://graph.facebook.com/PickNSaveStores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7371288",shop:"supermarket"},addTags:{brand:"Pick 'n Save","brand:wikidata":"Q7371288","brand:wikipedia":"en:Roundy's",name:"Pick 'n Save",shop:"supermarket"},countryCodes:["us","za"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Pick n Pay":{name:"Pick n Pay",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Picknpay/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7190735",shop:"supermarket"},addTags:{brand:"Pick n Pay","brand:wikidata":"Q7190735","brand:wikipedia":"en:Pick n Pay Stores",name:"Pick n Pay",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Piggly Wiggly":{name:"Piggly Wiggly",icon:"maki-grocery",imageURL:"https://graph.facebook.com/pigglywigglystores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3388303",shop:"supermarket"},addTags:{brand:"Piggly Wiggly","brand:wikidata":"Q3388303","brand:wikipedia":"en:Piggly Wiggly",name:"Piggly Wiggly",shop:"supermarket"},countryCodes:["gb","us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Pingo Doce":{name:"Pingo Doce",icon:"maki-grocery",imageURL:"https://graph.facebook.com/pingodoce/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1575057",shop:"supermarket"},addTags:{brand:"Pingo Doce","brand:wikidata":"Q1575057","brand:wikipedia":"en:Pingo Doce",name:"Pingo Doce",shop:"supermarket"},countryCodes:["pt"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Piotr i Paweł":{name:"Piotr i Paweł",icon:"maki-grocery",imageURL:"https://graph.facebook.com/piotripawelstronaoficjalna/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2096356",shop:"supermarket"},addTags:{brand:"Piotr i Paweł","brand:wikidata":"Q2096356","brand:wikipedia":"pl:Piotr i Paweł",name:"Piotr i Paweł",shop:"supermarket"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Plaza Vea":{name:"Plaza Vea",icon:"maki-grocery",imageURL:"https://graph.facebook.com/PlazaVeaOficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7203672",shop:"supermarket"},addTags:{brand:"Plaza Vea","brand:wikidata":"Q7203672","brand:wikipedia":"en:Plaza Vea",name:"Plaza Vea",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Plodine":{name:"Plodine",icon:"maki-grocery",imageURL:"https://graph.facebook.com/PlodineHrvatska/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q58040098",shop:"supermarket"},addTags:{brand:"Plodine","brand:wikidata":"Q58040098",name:"Plodine",shop:"supermarket"},countryCodes:["hr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Poiesz":{name:"Poiesz",icon:"maki-grocery",imageURL:"https://graph.facebook.com/poieszsupermarkten/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2521700",shop:"supermarket"},addTags:{brand:"Poiesz","brand:wikidata":"Q2521700","brand:wikipedia":"nl:Poiesz Supermarkten",name:"Poiesz",shop:"supermarket"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Price Chopper (Kansas City)":{name:"Price Chopper (Kansas City)",icon:"maki-grocery",imageURL:"https://graph.facebook.com/mypricechopper/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7242572",shop:"supermarket"},addTags:{brand:"Price Chopper","brand:wikidata":"Q7242572","brand:wikipedia":"en:Price Chopper (supermarket)",name:"Price Chopper",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Price Chopper (New York)":{name:"Price Chopper (New York)",icon:"maki-grocery",imageURL:"https://graph.facebook.com/PriceChopper/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7242574",shop:"supermarket"},addTags:{brand:"Price Chopper","brand:wikidata":"Q7242574","brand:wikipedia":"en:Price Chopper Supermarkets",name:"Price Chopper",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Prisma":{name:"Prisma",icon:"maki-grocery",imageURL:"https://graph.facebook.com/prisma.fi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12047031",shop:"supermarket"},addTags:{brand:"Prisma","brand:wikidata":"Q12047031","brand:wikipedia":"fi:Prisma (kauppaketju)",name:"Prisma",shop:"supermarket"},countryCodes:["ee","fi","ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Prix":{name:"Prix",icon:"maki-grocery",imageURL:"https://graph.facebook.com/prixqualitaitaliana/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61994819",shop:"supermarket"},addTags:{brand:"Prix","brand:wikidata":"Q61994819",name:"Prix",shop:"supermarket"},countryCodes:["it"],terms:["prix quality"],matchScore:2,suggestion:true},"shop/supermarket/Profi":{name:"Profi",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Profi.ro/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q956664",shop:"supermarket"},addTags:{brand:"Profi","brand:wikidata":"Q956664","brand:wikipedia":"en:Profi",name:"Profi",shop:"supermarket"},countryCodes:["be","hu","ro"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Provigo":{name:"Provigo",icon:"maki-grocery",imageURL:"https://graph.facebook.com/ProvigoleMarcheTroisRivieres/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3408306",shop:"supermarket"},addTags:{brand:"Provigo","brand:wikidata":"Q3408306","brand:wikipedia":"en:Provigo",name:"Provigo",shop:"supermarket"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Proxy Delhaize":{name:"Proxy Delhaize",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Delhaize/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q14903417",shop:"supermarket"},addTags:{brand:"Proxy Delhaize","brand:wikidata":"Q14903417","brand:wikipedia":"en:Delhaize Group",name:"Proxy Delhaize",shop:"supermarket"},countryCodes:["be","lu"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Publix":{name:"Publix",icon:"maki-grocery",imageURL:"https://graph.facebook.com/publix/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q672170",shop:"supermarket"},addTags:{brand:"Publix","brand:wikidata":"Q672170","brand:wikipedia":"en:Publix",name:"Publix",shop:"supermarket"},countryCodes:["br","us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Punto Simply":{name:"Punto Simply",icon:"maki-grocery",imageURL:"https://graph.facebook.com/SDASUPERMERCATI/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3484790",shop:"supermarket"},addTags:{brand:"Punto Simply","brand:wikidata":"Q3484790","brand:wikipedia":"it:Simply Market",name:"Punto Simply",shop:"supermarket"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Puregold":{name:"Puregold",icon:"maki-grocery",imageURL:"https://graph.facebook.com/puregold.shopping/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7261170",shop:"supermarket"},addTags:{brand:"Puregold","brand:wikidata":"Q7261170","brand:wikipedia":"en:Puregold",name:"Puregold",shop:"supermarket"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Pão de Açúcar":{name:"Pão de Açúcar",icon:"maki-grocery",imageURL:"https://graph.facebook.com/paodeacucar/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3411543",shop:"supermarket"},addTags:{brand:"Pão de Açúcar","brand:wikidata":"Q3411543","brand:wikipedia":"pt:Pão de Açúcar (supermercado brasileiro)",name:"Pão de Açúcar",shop:"supermarket"},countryCodes:["br","pt"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/QFC":{name:"QFC",icon:"maki-grocery",imageURL:"https://graph.facebook.com/QFC/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7265425",shop:"supermarket"},addTags:{brand:"QFC","brand:wikidata":"Q7265425","brand:wikipedia":"en:QFC",name:"QFC",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Raley's":{name:"Raley's",icon:"maki-grocery",imageURL:"https://graph.facebook.com/raleys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7286970",shop:"supermarket"},addTags:{brand:"Raley's","brand:wikidata":"Q7286970","brand:wikipedia":"en:Raley's Supermarkets",name:"Raley's",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Ralphs":{name:"Ralphs",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Ralphs/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3929820",shop:"supermarket"},addTags:{brand:"Ralphs","brand:wikidata":"Q3929820","brand:wikipedia":"en:Ralphs",name:"Ralphs",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Real":{name:"Real",icon:"maki-grocery",imageURL:"https://pbs.twimg.com/profile_images/930088669628850176/fUTDH88G_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q698473",shop:"supermarket"},addTags:{brand:"Real","brand:wikidata":"Q698473","brand:wikipedia":"en:Real (hypermarket)",name:"Real",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Real Canadian Superstore":{name:"Real Canadian Superstore",icon:"maki-grocery",imageURL:"https://graph.facebook.com/RealCanadianSuperstore/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7300856",shop:"supermarket"},addTags:{brand:"Real Canadian Superstore","brand:wikidata":"Q7300856","brand:wikipedia":"en:Real Canadian Superstore",name:"Real Canadian Superstore",shop:"supermarket"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Redner's":{name:"Redner's",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q7306166",shop:"supermarket"},addTags:{brand:"Redner's","brand:wikidata":"Q7306166","brand:wikipedia":"en:Redner's Markets",name:"Redner's",shop:"supermarket"},countryCodes:["us"],terms:["redners warehouse market"],matchScore:2,suggestion:true},"shop/supermarket/Reliance Fresh":{name:"Reliance Fresh",icon:"maki-grocery",imageURL:"https://graph.facebook.com/RelianceFreshOfficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7311014",shop:"supermarket"},addTags:{brand:"Reliance Fresh","brand:wikidata":"Q7311014","brand:wikipedia":"en:Reliance Fresh",name:"Reliance Fresh",shop:"supermarket"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Rema 1000":{name:"Rema 1000",icon:"maki-grocery",imageURL:"https://graph.facebook.com/REMA1000/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q28459",shop:"supermarket"},addTags:{brand:"Rema 1000","brand:wikidata":"Q28459","brand:wikipedia":"en:REMA 1000",name:"Rema 1000",shop:"supermarket"},countryCodes:["dk","no"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Rewe":{name:"Rewe",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Rewe/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16968817",shop:"supermarket"},addTags:{brand:"Rewe","brand:wikidata":"Q16968817","brand:wikipedia":"en:REWE",name:"Rewe",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Rewe City":{name:"Rewe City",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Rewe/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16968817",shop:"supermarket"},addTags:{brand:"Rewe City","brand:wikidata":"Q16968817","brand:wikipedia":"en:REWE",name:"Rewe City",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Rimi":{name:"Rimi",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FRimi%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q7334456",shop:"supermarket"},addTags:{brand:"Rimi","brand:wikidata":"Q7334456","brand:wikipedia":"en:Rimi (Norway)",name:"Rimi",shop:"supermarket"},countryCodes:["ee","lt","lv"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/S-market":{name:"S-market",icon:"maki-grocery",imageURL:"https://graph.facebook.com/smarketkemio/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11891613",shop:"supermarket"},addTags:{brand:"S-market","brand:wikidata":"Q11891613","brand:wikipedia":"fi:S-market",name:"S-market",shop:"supermarket"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Safeway":{name:"Safeway",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Safeway/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1508234",shop:"supermarket"},addTags:{brand:"Safeway","brand:wikidata":"Q1508234","brand:wikipedia":"en:Safeway Inc.",name:"Safeway",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Sainsbury's":{name:"Sainsbury's",icon:"maki-grocery",imageURL:"https://graph.facebook.com/sainsburys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q152096",shop:"supermarket"},addTags:{brand:"Sainsbury's","brand:wikidata":"Q152096","brand:wikipedia":"en:Sainsbury's",name:"Sainsbury's",shop:"supermarket"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Santa Isabel":{name:"Santa Isabel",icon:"maki-grocery",imageURL:"https://graph.facebook.com/SantaIsabelChile/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7419620",shop:"supermarket"},addTags:{brand:"Santa Isabel","brand:wikidata":"Q7419620","brand:wikipedia":"es:Santa Isabel (supermercado)",name:"Santa Isabel",shop:"supermarket"},countryCodes:["cl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Save-A-Lot":{name:"Save-A-Lot",icon:"maki-grocery",imageURL:"https://graph.facebook.com/savealot/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7427972",shop:"supermarket"},addTags:{brand:"Save-A-Lot","brand:wikidata":"Q7427972","brand:wikipedia":"en:Save-A-Lot",name:"Save-A-Lot",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Save-On-Foods":{name:"Save-On-Foods",icon:"maki-grocery",imageURL:"https://graph.facebook.com/SaveOnFoods/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7427974",shop:"supermarket"},addTags:{brand:"Save-On-Foods","brand:wikidata":"Q7427974","brand:wikipedia":"en:Save-On-Foods",name:"Save-On-Foods",shop:"supermarket"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Schnucks":{name:"Schnucks",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Schnucks/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7431920",shop:"supermarket"},addTags:{brand:"Schnucks","brand:wikidata":"Q7431920","brand:wikipedia":"en:Schnucks",name:"Schnucks",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Shaw's":{name:"Shaw's",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Shaws/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q578387",shop:"supermarket"},addTags:{brand:"Shaw's","brand:wikidata":"Q578387","brand:wikipedia":"en:Shaw's and Star Market",name:"Shaw's",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/ShopRite (USA)":{name:"ShopRite (USA)",icon:"maki-grocery",imageURL:"https://graph.facebook.com/shoprite.supermarket/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7501097",shop:"supermarket"},addTags:{brand:"ShopRite","brand:wikidata":"Q7501097","brand:wikipedia":"en:ShopRite (United States)",name:"ShopRite",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Shoprite (Africa)":{name:"Shoprite (Africa)",icon:"maki-grocery",imageURL:"https://graph.facebook.com/ShopriteSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1857639",shop:"supermarket"},addTags:{brand:"Shoprite","brand:wikidata":"Q1857639","brand:wikipedia":"en:Shoprite (South Africa)",name:"Shoprite",shop:"supermarket"},countryCodes:["ao","bw","cd","gh","ls","mg","mu","mw","mz","na","ng","sz","ug","za","zm"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Shoprite (Isle of Man)":{name:"Shoprite (Isle of Man)",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q7501242",shop:"supermarket"},addTags:{brand:"Shoprite","brand:wikidata":"Q7501242","brand:wikipedia":"en:Shoprite (Isle of Man)",name:"Shoprite",shop:"supermarket"},countryCodes:["im"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Sigma":{name:"Sigma",icon:"maki-grocery",imageURL:"https://graph.facebook.com/supermercatisigmaitalia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3977979",shop:"supermarket"},addTags:{brand:"Sigma","brand:wikidata":"Q3977979","brand:wikipedia":"it:Supermercati Sigma",name:"Sigma",shop:"supermarket"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Simply Market":{name:"Simply Market",icon:"maki-grocery",imageURL:"https://graph.facebook.com/SDASUPERMERCATI/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3484790",shop:"supermarket"},addTags:{brand:"Simply Market","brand:wikidata":"Q3484790","brand:wikipedia":"en:Simply Market",name:"Simply Market",shop:"supermarket"},terms:["simply"],matchScore:2,suggestion:true},"shop/supermarket/Sky":{name:"Sky",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCoop%20Deutschland%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1129779",shop:"supermarket"},addTags:{brand:"Sky","brand:wikidata":"Q1129779","brand:wikipedia":"de:Coop eG",name:"Sky",shop:"supermarket"},countryCodes:["de","lv","nl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Smith's":{name:"Smith's",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSmithsFoodDrug-logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q7544856",shop:"supermarket"},addTags:{brand:"Smith's","brand:wikidata":"Q7544856","brand:wikipedia":"en:Smith's Food and Drug",name:"Smith's",shop:"supermarket"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Sobeys":{name:"Sobeys",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Sobeys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1143340",shop:"supermarket"},addTags:{brand:"Sobeys","brand:wikidata":"Q1143340","brand:wikipedia":"en:Sobeys",name:"Sobeys",shop:"supermarket"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Soriana":{name:"Soriana",icon:"maki-grocery",imageURL:"https://graph.facebook.com/sorianacom/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q735562",shop:"supermarket"},addTags:{brand:"Soriana","brand:wikidata":"Q735562","brand:wikipedia":"en:Soriana",name:"Soriana",shop:"supermarket"},countryCodes:["mx"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Spar":{name:"Spar",icon:"maki-grocery",imageURL:"https://graph.facebook.com/SPARintheUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q610492",shop:"supermarket"},addTags:{brand:"Spar","brand:wikidata":"Q610492","brand:wikipedia":"en:Spar (retailer)",name:"Spar",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Społem":{name:"Społem",icon:"maki-grocery",imageURL:"https://graph.facebook.com/SpolemSpoldzielczoscSpozywcow/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11826043",shop:"supermarket"},addTags:{brand:"Społem","brand:wikidata":"Q11826043","brand:wikipedia":"pl:Powszechna Spółdzielnia Spożywców „Społem”",name:"Społem",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Sprouts Farmers Market":{name:"Sprouts Farmers Market",icon:"maki-grocery",imageURL:"https://graph.facebook.com/SproutsFarmersMarket/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7581369",shop:"supermarket"},addTags:{brand:"Sprouts Farmers Market","brand:wikidata":"Q7581369","brand:wikipedia":"en:Sprouts Farmers Market",name:"Sprouts Farmers Market",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Stater Bros.":{name:"Stater Bros.",icon:"maki-grocery",imageURL:"https://graph.facebook.com/StaterBrosMarkets/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7604016",shop:"supermarket"},addTags:{brand:"Stater Bros.","brand:wikidata":"Q7604016","brand:wikipedia":"en:Stater Bros.",name:"Stater Bros.",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Stokrotka":{name:"Stokrotka",icon:"maki-grocery",imageURL:"https://graph.facebook.com/sklepy.stokrotka/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q9345945",shop:"supermarket"},addTags:{brand:"Stokrotka","brand:wikidata":"Q9345945","brand:wikipedia":"pl:Stokrotka (sieć handlowa)",name:"Stokrotka",shop:"supermarket"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Stop & Shop":{name:"Stop & Shop",icon:"maki-grocery",imageURL:"https://graph.facebook.com/StopandShop/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3658429",shop:"supermarket"},addTags:{brand:"Stop & Shop","brand:wikidata":"Q3658429","brand:wikipedia":"en:Stop & Shop",name:"Stop & Shop",shop:"supermarket"},countryCodes:["us"],terms:["stop and shop"],matchScore:2,suggestion:true},"shop/supermarket/Suma":{name:"Suma",icon:"maki-grocery",imageURL:"https://graph.facebook.com/265671900499370/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q58012362",shop:"supermarket"},addTags:{brand:"Suma","brand:wikidata":"Q58012362",name:"Suma",shop:"supermarket"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Super C":{name:"Super C",icon:"maki-grocery",imageURL:"https://graph.facebook.com/superc.ca/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3504127",shop:"supermarket"},addTags:{brand:"Super C","brand:wikidata":"Q3504127","brand:wikipedia":"en:Super C (supermarket)",name:"Super C",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Super H Mart":{name:"Super H Mart",icon:"maki-grocery",imageURL:"https://graph.facebook.com/hmartofficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5636306",shop:"supermarket"},addTags:{brand:"H Mart","brand:wikidata":"Q5636306","brand:wikipedia":"en:H Mart",cuisine:"asian",name:"Super H Mart",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Super One Foods":{name:"Super One Foods",icon:"maki-grocery",imageURL:"https://graph.facebook.com/SuperOneGrocery/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17108733",shop:"supermarket"},addTags:{brand:"Super One Foods","brand:wikidata":"Q17108733","brand:wikipedia":"en:Super One Foods",name:"Super One Foods",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Super U":{name:"Super U",icon:"maki-grocery",imageURL:"https://graph.facebook.com/ULesCommercants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2529029",shop:"supermarket"},addTags:{brand:"Super U","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Super U",shop:"supermarket"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/SuperBrugsen":{name:"SuperBrugsen",icon:"maki-grocery",imageURL:"https://graph.facebook.com/SuperBrugsen/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12337746",shop:"supermarket"},addTags:{brand:"SuperBrugsen","brand:wikidata":"Q12337746","brand:wikipedia":"en:SuperBrugsen",name:"SuperBrugsen",shop:"supermarket"},countryCodes:["dk"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/SuperValu":{name:"SuperValu",icon:"maki-grocery",imageURL:"https://graph.facebook.com/SuperValuIreland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7642081",shop:"supermarket"},addTags:{brand:"SuperValu","brand:wikidata":"Q7642081","brand:wikipedia":"en:SuperValu (Ireland)",name:"SuperValu",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Superama":{name:"Superama",icon:"maki-grocery",imageURL:"https://pbs.twimg.com/profile_images/1141360829708886016/-mK49QYP_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q6135762",shop:"supermarket"},addTags:{brand:"Superama","brand:wikidata":"Q6135762","brand:wikipedia":"es:Superama",name:"Superama",shop:"supermarket"},countryCodes:["mx"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Supercor":{name:"Supercor",icon:"maki-grocery",imageURL:"https://graph.facebook.com/tusupercor/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6135841",shop:"supermarket"},addTags:{brand:"Supercor","brand:wikidata":"Q6135841","brand:wikipedia":"es:Supercor",name:"Supercor",shop:"supermarket"},countryCodes:["es","pt"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Supersol":{name:"Supersol",icon:"maki-grocery",imageURL:"https://graph.facebook.com/SupersolSupermercados/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62073427",shop:"supermarket"},addTags:{brand:"Supersol","brand:wikidata":"Q62073427",name:"Supersol",shop:"supermarket"},countryCodes:["ar","es","ma","uy"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Superspar":{name:"Superspar",icon:"maki-grocery",imageURL:"https://graph.facebook.com/SPARintheUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q610492",shop:"supermarket"},addTags:{brand:"Superspar","brand:wikidata":"Q610492","brand:wikipedia":"en:Spar (retailer)",name:"Superspar",shop:"supermarket"},countryCodes:["es","za"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Tegut":{name:"Tegut",icon:"maki-grocery",imageURL:"https://graph.facebook.com/tegut/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1547993",shop:"supermarket"},addTags:{brand:"Tegut","brand:wikidata":"Q1547993","brand:wikipedia":"en:Tegut",name:"Tegut",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Tesco":{name:"Tesco",icon:"maki-grocery",imageURL:"https://graph.facebook.com/tesco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q487494",shop:"supermarket"},addTags:{brand:"Tesco","brand:wikidata":"Q487494","brand:wikipedia":"en:Tesco",name:"Tesco",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Tesco Express":{name:"Tesco Express",icon:"maki-grocery",imageURL:"https://graph.facebook.com/tesco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q487494",shop:"supermarket"},addTags:{brand:"Tesco Express","brand:wikidata":"Q487494","brand:wikipedia":"en:Tesco",name:"Tesco Express",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Tesco Extra":{name:"Tesco Extra",icon:"maki-grocery",imageURL:"https://graph.facebook.com/tesco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q25172225",shop:"supermarket"},addTags:{brand:"Tesco Extra","brand:wikidata":"Q25172225","brand:wikipedia":"en:Tesco Extra",name:"Tesco Extra",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Tesco Metro":{name:"Tesco Metro",icon:"maki-grocery",imageURL:"https://graph.facebook.com/tesco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q57551648",shop:"supermarket"},addTags:{brand:"Tesco Metro","brand:wikidata":"Q57551648",name:"Tesco Metro",shop:"supermarket"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/The Co-operative Food (UK)":{name:"The Co-operative Food (UK)",icon:"maki-grocery",imageURL:"https://graph.facebook.com/coopukfood/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3277439",shop:"supermarket"},addTags:{brand:"The Co-operative Food","brand:wikidata":"Q3277439","brand:wikipedia":"en:Co-op Food",name:"The Co-operative Food",shop:"supermarket"},countryCodes:["gb"],terms:["coop","coop food","cooperative food","the cooperative"],matchScore:2,suggestion:true},"shop/supermarket/The Fresh Market":{name:"The Fresh Market",icon:"maki-grocery",imageURL:"https://graph.facebook.com/TheFreshMarket/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7735265",shop:"supermarket"},addTags:{brand:"The Fresh Market","brand:wikidata":"Q7735265","brand:wikipedia":"en:The Fresh Market",name:"The Fresh Market",shop:"supermarket"},countryCodes:["us"],terms:["fresh market"],matchScore:2,suggestion:true},"shop/supermarket/Todis":{name:"Todis",icon:"maki-grocery",imageURL:"https://graph.facebook.com/todisbuongiornoconvenienza/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3992174",shop:"supermarket"},addTags:{brand:"Todis","brand:wikidata":"Q3992174","brand:wikipedia":"it:Todis",name:"Todis",shop:"supermarket"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Tommy":{name:"Tommy",icon:"maki-grocery",imageURL:"https://graph.facebook.com/tommyprodavaonice/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12643718",shop:"supermarket"},addTags:{brand:"Tommy","brand:wikidata":"Q12643718","brand:wikipedia":"hr:Tommy",name:"Tommy",shop:"supermarket"},countryCodes:["hr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Top Market":{name:"Top Market",icon:"maki-grocery",imageURL:"https://graph.facebook.com/topmarketpolska/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q9360044",shop:"supermarket"},addTags:{brand:"Top Market","brand:wikidata":"Q9360044","brand:wikipedia":"pl:Top Market",name:"Top Market",shop:"supermarket"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Tops":{name:"Tops",icon:"maki-grocery",imageURL:"https://graph.facebook.com/topsfriendlymarkets/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7825137",shop:"supermarket"},addTags:{brand:"Tops","brand:wikidata":"Q7825137","brand:wikipedia":"en:Tops Friendly Markets",name:"Tops",official_name:"Tops Friendly Markets",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Tottus":{name:"Tottus",icon:"maki-grocery",imageURL:"https://graph.facebook.com/TottusPeru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7828510",shop:"supermarket"},addTags:{brand:"Tottus","brand:wikidata":"Q7828510","brand:wikipedia":"en:Tottus",name:"Tottus",shop:"supermarket"},countryCodes:["cl","pe"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Trader Joe's":{name:"Trader Joe's",icon:"maki-grocery",imageURL:"https://graph.facebook.com/156443021054392/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q688825",shop:"supermarket"},addTags:{brand:"Trader Joe's","brand:wikidata":"Q688825","brand:wikipedia":"en:Trader Joe's",name:"Trader Joe's",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Treff 3000":{name:"Treff 3000",icon:"maki-grocery",imageURL:"https://graph.facebook.com/EDEKA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q701755",shop:"supermarket"},addTags:{brand:"Treff 3000","brand:wikidata":"Q701755","brand:wikipedia":"de:Edeka",name:"Treff 3000",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Tuodì":{name:"Tuodì",icon:"maki-grocery",imageURL:"https://graph.facebook.com/TUODI.it/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3706995",shop:"supermarket"},addTags:{brand:"Tuodì","brand:wikidata":"Q3706995","brand:wikipedia":"it:Tuodì",name:"Tuodì",shop:"supermarket"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/U Express":{name:"U Express",icon:"maki-grocery",imageURL:"https://graph.facebook.com/ULesCommercants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2529029",shop:"supermarket"},addTags:{brand:"U Express","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"U Express",shop:"supermarket"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Unimarc":{name:"Unimarc",icon:"maki-grocery",imageURL:"https://graph.facebook.com/unimarc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6156244",shop:"supermarket"},addTags:{brand:"Unimarc","brand:wikidata":"Q6156244","brand:wikipedia":"es:Unimarc",name:"Unimarc",shop:"supermarket"},countryCodes:["cl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Unimarkt":{name:"Unimarkt",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Unimarkt/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1169599",shop:"supermarket"},addTags:{brand:"Unimarkt","brand:wikidata":"Q1169599","brand:wikipedia":"de:Unimarkt",name:"Unimarkt",shop:"supermarket"},countryCodes:["at"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Vea":{name:"Vea",icon:"maki-grocery",imageURL:"https://pbs.twimg.com/profile_images/760081378868391936/qPOPFsTZ_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q5858167",shop:"supermarket"},addTags:{brand:"Vea","brand:wikidata":"Q5858167","brand:wikipedia":"es:Vea (supermercado)",name:"Vea",shop:"supermarket"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/VinMart":{name:"VinMart",icon:"maki-grocery",imageURL:"https://graph.facebook.com/sieuthivinmart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q60245505",shop:"supermarket"},addTags:{brand:"VinMart","brand:wikidata":"Q60245505","brand:wikipedia":"vi:VinMart",name:"VinMart",shop:"supermarket"},countryCodes:["vn"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Volg":{name:"Volg",icon:"maki-grocery",imageURL:"https://graph.facebook.com/1953378021650189/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2530746",shop:"supermarket"},addTags:{brand:"Volg","brand:wikidata":"Q2530746","brand:wikipedia":"de:Volg",name:"Volg",shop:"supermarket"},countryCodes:["ch","li"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Vomar":{name:"Vomar",icon:"maki-grocery",imageURL:"https://graph.facebook.com/vomarvoordeelmarkt/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3202837",shop:"supermarket"},addTags:{brand:"Vomar","brand:wikidata":"Q3202837","brand:wikipedia":"nl:Vomar",name:"Vomar",shop:"supermarket"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Vons":{name:"Vons",icon:"maki-grocery",imageURL:"https://graph.facebook.com/vons/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7941609",shop:"supermarket"},addTags:{brand:"Vons","brand:wikidata":"Q7941609","brand:wikipedia":"en:Vons",name:"Vons",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Waitrose":{name:"Waitrose",icon:"maki-grocery",imageURL:"https://graph.facebook.com/waitroseandpartners/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q771734",shop:"supermarket"},addTags:{brand:"Waitrose","brand:wikidata":"Q771734","brand:wikipedia":"en:Waitrose & Partners",name:"Waitrose",shop:"supermarket"},countryCodes:["gb","je"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Walmart Neighborhood Market":{name:"Walmart Neighborhood Market",icon:"maki-grocery",imageURL:"https://graph.facebook.com/walmart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q483551",shop:"supermarket"},addTags:{brand:"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"en:Walmart",name:"Walmart Neighborhood Market",shop:"supermarket"},countryCodes:["ca","mx","us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Walmart Supercenter":{name:"Walmart Supercenter",icon:"maki-grocery",imageURL:"https://graph.facebook.com/walmart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q483551",shop:"supermarket"},addTags:{brand:"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"en:Walmart",name:"Walmart Supercenter",shop:"supermarket"},terms:["walmart supercentre"],matchScore:2,suggestion:true},"shop/supermarket/Wasgau":{name:"Wasgau",icon:"maki-grocery",imageURL:"https://graph.facebook.com/wasgau/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2536857",shop:"supermarket"},addTags:{brand:"Wasgau","brand:wikidata":"Q2536857","brand:wikipedia":"de:Wasgau (Unternehmen)",name:"Wasgau",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Wegmans":{name:"Wegmans",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Wegmans/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11288478",shop:"supermarket"},addTags:{brand:"Wegmans","brand:wikidata":"Q11288478","brand:wikipedia":"en:Wegmans",name:"Wegmans",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Weis":{name:"Weis",icon:"maki-grocery",imageURL:"https://graph.facebook.com/WeisMarkets/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7980370",shop:"supermarket"},addTags:{brand:"Weis","brand:wikidata":"Q7980370","brand:wikipedia":"en:Weis Markets",name:"Weis",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Whole Foods Market":{name:"Whole Foods Market",icon:"maki-grocery",imageURL:"https://graph.facebook.com/WholeFoods/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1809448",shop:"supermarket"},addTags:{brand:"Whole Foods Market","brand:wikidata":"Q1809448","brand:wikipedia":"en:Whole Foods Market",name:"Whole Foods Market",shop:"supermarket"},countryCodes:["ca","gb","us"],terms:["whole foods"],matchScore:2,suggestion:true},"shop/supermarket/Willys":{name:"Willys",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Willys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10720214",shop:"supermarket"},addTags:{brand:"Willys","brand:wikidata":"Q10720214","brand:wikipedia":"sv:Willys",name:"Willys",shop:"supermarket"},countryCodes:["se"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/WinCo Foods":{name:"WinCo Foods",icon:"maki-grocery",imageURL:"https://graph.facebook.com/winco.official.page/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q8023592",shop:"supermarket"},addTags:{brand:"WinCo Foods","brand:wikidata":"Q8023592","brand:wikipedia":"en:WinCo Foods",name:"WinCo Foods",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Winn-Dixie":{name:"Winn-Dixie",icon:"maki-grocery",imageURL:"https://graph.facebook.com/winndixie/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1264366",shop:"supermarket"},addTags:{brand:"Winn-Dixie","brand:wikidata":"Q1264366","brand:wikipedia":"en:Winn-Dixie",name:"Winn-Dixie",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Woolworths":{name:"Woolworths",icon:"maki-grocery",imageURL:"https://graph.facebook.com/woolworths/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3249145",shop:"supermarket"},addTags:{brand:"Woolworths","brand:wikidata":"Q3249145","brand:wikipedia":"en:Woolworths Supermarkets",name:"Woolworths",shop:"supermarket"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Your Independent Grocer":{name:"Your Independent Grocer",icon:"maki-grocery",imageURL:"https://graph.facebook.com/YourIndependentGrocer/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q8058833",shop:"supermarket"},addTags:{brand:"Your Independent Grocer","brand:wikidata":"Q8058833","brand:wikipedia":"en:Your Independent Grocer",name:"Your Independent Grocer",shop:"supermarket"},countryCodes:["ca"],terms:["independent"],matchScore:2,suggestion:true},"shop/supermarket/basic":{name:"basic",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBasic%20logo.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q809994",shop:"supermarket"},addTags:{brand:"basic","brand:wikidata":"Q809994","brand:wikipedia":"de:Basic AG",name:"basic",organic:"only",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/denn's Biomarkt":{name:"denn's Biomarkt",icon:"maki-grocery",imageURL:"https://graph.facebook.com/dennsBiomarkt/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q48883773",shop:"supermarket"},addTags:{brand:"denn's Biomarkt","brand:wikidata":"Q48883773","brand:wikipedia":"de:Dennree",name:"denn's Biomarkt",organic:"only",shop:"supermarket"},countryCodes:["at","de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/fakta":{name:"fakta",icon:"maki-grocery",imageURL:"https://graph.facebook.com/fakta/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3172238",shop:"supermarket"},addTags:{brand:"fakta","brand:wikidata":"Q3172238","brand:wikipedia":"en:Fakta",name:"fakta",shop:"supermarket"},countryCodes:["dk"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Şok":{name:"Şok",icon:"maki-grocery",imageURL:"https://graph.facebook.com/SokMarketler/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q19613992",shop:"supermarket"},addTags:{brand:"Şok","brand:wikidata":"Q19613992","brand:wikipedia":"tr:Şok (market)",name:"Şok",shop:"supermarket"},countryCodes:["tr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/ΑΒ Βασιλόπουλος":{name:"ΑΒ Βασιλόπουλος",icon:"maki-grocery",imageURL:"https://graph.facebook.com/ab.vassilopoulos.sa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4721807",shop:"supermarket"},addTags:{brand:"ΑΒ Βασιλόπουλος","brand:el":"ΑΒ Βασιλόπουλος","brand:en":"AB Vassilopoulos","brand:wikidata":"Q4721807","brand:wikipedia":"el:Άλφα Βήτα Βασιλόπουλος",name:"ΑΒ Βασιλόπουλος","name:el":"ΑΒ Βασιλόπουλος","name:en":"AB Vassilopoulos",shop:"supermarket"},countryCodes:["gr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Γαλαξίας":{name:"Γαλαξίας",icon:"maki-grocery",imageURL:"https://graph.facebook.com/galaxias.sm/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5518063",shop:"supermarket"},addTags:{brand:"Γαλαξίας","brand:el":"Γαλαξίας","brand:en":"Galaxias","brand:wikidata":"Q5518063","brand:wikipedia":"el:Γαλαξίας (σούπερ μάρκετ)",name:"Γαλαξίας","name:el":"Γαλαξίας","name:en":"Galaxias",shop:"supermarket"},countryCodes:["gr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Μασούτης":{name:"Μασούτης",icon:"maki-grocery",imageURL:"https://graph.facebook.com/masoutis/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6783887",shop:"supermarket"},addTags:{brand:"Μασούτης","brand:el":"Μασούτης","brand:en":"Masoutis","brand:wikidata":"Q6783887","brand:wikipedia":"en:Masoutis",name:"Μασούτης","name:el":"Μασούτης","name:en":"Masoutis",shop:"supermarket"},countryCodes:["gr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Σκλαβενίτης":{name:"Σκλαβενίτης",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q7536037",shop:"supermarket"},addTags:{brand:"Σκλαβενίτης","brand:el":"Σκλαβενίτης","brand:en":"Sklavenitis","brand:wikidata":"Q7536037","brand:wikipedia":"el:Σκλαβενίτης",name:"Σκλαβενίτης","name:el":"Σκλαβενίτης","name:en":"Sklavenitis",shop:"supermarket"},countryCodes:["gr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Абсолют (Russia)":{name:"Абсолют (Russia)",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q62389597",shop:"supermarket"},addTags:{brand:"Абсолют","brand:wikidata":"Q62389597",name:"Абсолют",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Абсолют (Ukraine)":{name:"Абсолют (Ukraine)",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q62389546",shop:"supermarket"},addTags:{brand:"Абсолют","brand:wikidata":"Q62389546",name:"Абсолют",shop:"supermarket"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Азбука Вкуса":{name:"Азбука Вкуса",icon:"maki-grocery",imageURL:"https://graph.facebook.com/azbukavkusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4058209",shop:"supermarket"},addTags:{brand:"Азбука Вкуса","brand:en":"Azbuka Vkusa","brand:wikidata":"Q4058209","brand:wikipedia":"en:Azbuka Vkusa",name:"Азбука Вкуса","name:en":"Azbuka Vkusa",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Атак":{name:"Атак",icon:"maki-grocery",imageURL:"https://pbs.twimg.com/profile_images/1565040269/logo_schiever_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q2868738",shop:"supermarket"},addTags:{brand:"Атак","brand:en":"Atac","brand:wikidata":"Q2868738","brand:wikipedia":"ru:Atac",name:"Атак","name:en":"Atac",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Ашан":{name:"Ашан",icon:"maki-grocery",imageURL:"https://graph.facebook.com/auchan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q758603",shop:"supermarket"},addTags:{brand:"Ашан","brand:en":"Auchan","brand:wikidata":"Q758603","brand:wikipedia":"ru:Auchan",name:"Ашан","name:en":"Auchan",shop:"supermarket"},countryCodes:["ru","ua"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Брусничка":{name:"Брусничка",icon:"maki-grocery",imageURL:"https://graph.facebook.com/freshmarket.brusnichka/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q21656645",shop:"supermarket"},addTags:{brand:"Брусничка","brand:en":"Brusnichka","brand:wikidata":"Q21656645","brand:wikipedia":"uk:Брусничка (торгова мережа)",name:"Брусничка","name:en":"Brusnichka",shop:"supermarket"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Виктория":{name:"Виктория",icon:"maki-grocery",imageURL:"https://graph.facebook.com/SupermarketVictoria/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4111046",shop:"supermarket"},addTags:{brand:"Виктория","brand:wikidata":"Q4111046","brand:wikipedia":"ru:Виктория (сеть магазинов)",name:"Виктория",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Виталюр":{name:"Виталюр",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q55663075",shop:"supermarket"},addTags:{brand:"Виталюр","brand:wikidata":"Q55663075","brand:wikipedia":"ru:Виталюр",name:"Виталюр",shop:"supermarket"},countryCodes:["by"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Вопак":{name:"Вопак",icon:"maki-grocery",imageURL:"https://graph.facebook.com/vopak.com.ua/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q30966107",shop:"supermarket"},addTags:{brand:"Вопак","brand:en":"Vopak","brand:wikidata":"Q30966107","brand:wikipedia":"uk:Вопак",name:"Вопак","name:en":"Vopak",shop:"supermarket"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Гроздь":{name:"Гроздь",icon:"maki-grocery",imageURL:"https://graph.facebook.com/grozdmag/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q21638412",shop:"supermarket"},addTags:{brand:"Гроздь","brand:wikidata":"Q21638412","brand:wikipedia":"ru:Гроздь (сеть магазинов)",name:"Гроздь",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Гулливер":{name:"Гулливер",icon:"maki-grocery",imageURL:"https://graph.facebook.com/gullivermarket/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q58003470",shop:"supermarket"},addTags:{brand:"Гулливер","brand:wikidata":"Q58003470",name:"Гулливер",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Десяточка":{name:"Десяточка",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q61876182",shop:"supermarket"},addTags:{brand:"Десяточка","brand:en":"Desyatochka","brand:wikidata":"Q61876182",name:"Десяточка",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Дикси":{name:"Дикси",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Dixyclub/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4161561",shop:"supermarket"},addTags:{brand:"Дикси","brand:en":"Dixy","brand:wikidata":"Q4161561","brand:wikipedia":"ru:Дикси (сеть магазинов)",name:"Дикси",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Евроопт":{name:"Евроопт",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Eurooptby/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2565040",shop:"supermarket"},addTags:{brand:"Евроопт","brand:en":"Euroopt","brand:ru":"Евроопт","brand:wikidata":"Q2565040","brand:wikipedia":"be:Еўрагандаль",name:"Евроопт","name:en":"Euroopt","name:ru":"Евроопт",shop:"supermarket"},countryCodes:["by"],terms:["евроопт market"],matchScore:2,suggestion:true},"shop/supermarket/Карусель":{name:"Карусель",icon:"maki-grocery",imageURL:"https://graph.facebook.com/karuselgiper/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4216307",shop:"supermarket"},addTags:{brand:"Карусель","brand:en":"Karusel","brand:wikidata":"Q4216307","brand:wikipedia":"ru:Карусель (сеть магазинов)",name:"Карусель","name:en":"Karusel",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Кировский":{name:"Кировский",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Kirovskii/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63301903",shop:"supermarket"},addTags:{brand:"Кировский","brand:wikidata":"Q63301903",name:"Кировский",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Командор":{name:"Командор",icon:"maki-grocery",imageURL:"https://graph.facebook.com/prkomandor/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61876152",shop:"supermarket"},addTags:{brand:"Командор","brand:en":"Komandor","brand:wikidata":"Q61876152",name:"Командор",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Красный Яр":{name:"Красный Яр",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q1786753",shop:"supermarket"},addTags:{brand:"Красный Яр","brand:en":"Krasnyj Jar","brand:wikidata":"Q1786753","brand:wikipedia":"ru:Красный Яр",name:"Красный Яр",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Лента":{name:"Лента",icon:"maki-grocery",imageURL:"https://graph.facebook.com/lentacom/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4258608",shop:"supermarket"},addTags:{brand:"Лента","brand:en":"Lenta","brand:wikidata":"Q4258608","brand:wikipedia":"ru:Лента (сеть магазинов)",name:"Лента","name:en":"Lenta",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Магнит":{name:"Магнит",icon:"maki-grocery",imageURL:"https://graph.facebook.com/magnitretail/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q940518",shop:"supermarket"},addTags:{brand:"Магнит","brand:en":"Magnit","brand:wikidata":"Q940518","brand:wikipedia":"ru:Магнит (сеть магазинов)",name:"Магнит","name:en":"Magnit",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Мария-Ра":{name:"Мария-Ра",icon:"maki-grocery",imageURL:"https://graph.facebook.com/mariarashop/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4281631",shop:"supermarket"},addTags:{brand:"Мария-Ра","brand:en":"Maria-ra","brand:wikidata":"Q4281631","brand:wikipedia":"ru:Мария-Ра",name:"Мария-Ра","name:en":"Maria-ra",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Монетка":{name:"Монетка",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q4301704",shop:"supermarket"},addTags:{brand:"Монетка","brand:en":"Monetka","brand:wikidata":"Q4301704","brand:wikipedia":"ru:Монетка (сеть магазинов)",name:"Монетка","name:en":"Monetka",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Народная 7Я семьЯ":{name:"Народная 7Я семьЯ",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2F7Family.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q4032436",shop:"supermarket"},addTags:{brand:"Народная 7Я семьЯ","brand:en":"People's 7th Family","brand:wikidata":"Q4032436","brand:wikipedia":"ru:Народная 7Я семья",name:"Народная 7Я семьЯ","name:en":"People's 7th Family",shop:"supermarket"},countryCodes:["ru"],terms:["семья"],matchScore:2,suggestion:true},"shop/supermarket/Перекрёсток":{name:"Перекрёсток",icon:"maki-grocery",imageURL:"https://graph.facebook.com/perekrestok/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1684639",shop:"supermarket"},addTags:{brand:"Перекрёсток","brand:en":"Perekryostok","brand:wikidata":"Q1684639","brand:wikipedia":"en:Perekrestok (supermarket chain)",name:"Перекрёсток",shop:"supermarket"},countryCodes:["ru"],terms:["перекресток"],matchScore:2,suggestion:true},"shop/supermarket/Покупочка":{name:"Покупочка",icon:"maki-grocery",imageURL:"https://graph.facebook.com/121978851838251/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q58003270",shop:"supermarket"},addTags:{brand:"Покупочка","brand:wikidata":"Q58003270",name:"Покупочка",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Полушка":{name:"Полушка",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q4371080",shop:"supermarket"},addTags:{brand:"Полушка","brand:en":"Polushka","brand:wikidata":"Q4371080","brand:wikipedia":"ru:Полушка (сеть магазинов)",name:"Полушка","name:en":"Polushka",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Пятёрочка":{name:"Пятёрочка",icon:"maki-grocery",imageURL:"https://graph.facebook.com/pyaterochka/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1768969",shop:"supermarket"},addTags:{brand:"Пятёрочка","brand:en":"Pyaterochka","brand:wikidata":"Q1768969","brand:wikipedia":"ru:Пятёрочка",name:"Пятёрочка","name:en":"Pyaterochka",shop:"supermarket"},countryCodes:["ru"],terms:["пятерочка"],matchScore:2,suggestion:true},"shop/supermarket/Радеж":{name:"Радеж",icon:"maki-grocery",imageURL:"https://graph.facebook.com/radezhshop/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4387165",shop:"supermarket"},addTags:{brand:"Радеж","brand:en":"Radezh","brand:wikidata":"Q4387165","brand:wikipedia":"ru:Радеж (торговая сеть)",name:"Радеж","name:en":"Radezh",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Рукавичка":{name:"Рукавичка",icon:"maki-grocery",imageURL:"https://graph.facebook.com/rukavychka.ua/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q20092568",shop:"supermarket"},addTags:{brand:"Рукавичка","brand:en":"Rukavychka","brand:wikidata":"Q20092568","brand:wikipedia":"uk:Рукавичка (торгова мережа)",name:"Рукавичка","name:en":"Rukavychka",shop:"supermarket"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Светофор":{name:"Светофор",icon:"maki-grocery",imageURL:"https://graph.facebook.com/svetoforkryj/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61875920",shop:"supermarket"},addTags:{brand:"Светофор","brand:en":"Svetofor","brand:wikidata":"Q61875920",name:"Светофор",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Семишагофф":{name:"Семишагофф",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q58003374",shop:"supermarket"},addTags:{brand:"Семишагофф","brand:wikidata":"Q58003374",name:"Семишагофф",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Сільпо":{name:"Сільпо",icon:"maki-grocery",imageURL:"https://graph.facebook.com/silpo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4419434",shop:"supermarket"},addTags:{brand:"Сільпо","brand:en":"Silpo","brand:wikidata":"Q4419434","brand:wikipedia":"en:Silpo",name:"Сільпо","name:en":"Silpo",shop:"supermarket"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Таврия В":{name:"Таврия В",icon:"maki-grocery",imageURL:"https://graph.facebook.com/tavriavonline/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61823146",shop:"supermarket"},addTags:{brand:"Таврия В","brand:wikidata":"Q61823146","brand:wikipedia":"uk:Таврія В",name:"Таврия В",shop:"supermarket"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Фора":{name:"Фора",icon:"maki-grocery",imageURL:"https://graph.facebook.com/fora.ukraine/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12165977",shop:"supermarket"},addTags:{brand:"Фора","brand:en":"Fora","brand:wikidata":"Q12165977","brand:wikipedia":"uk:Фора (мережа магазинів)",name:"Фора","name:en":"Fora",shop:"supermarket"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Фуршет":{name:"Фуршет",icon:"maki-grocery",imageURL:"https://graph.facebook.com/furshetcom/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4493564",shop:"supermarket"},addTags:{brand:"Фуршет","brand:en":"Furshet","brand:wikidata":"Q4493564","brand:wikipedia":"uk:Фуршет (мережа супермаркетів)",name:"Фуршет","name:en":"Furshet",shop:"supermarket"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Эдельвейс":{name:"Эдельвейс",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q57979368",shop:"supermarket"},addTags:{brand:"Эдельвейс","brand:en":"Edelveis","brand:wikidata":"Q57979368",name:"Эдельвейс","name:en":"Edelveis",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/いなげや":{name:"いなげや",icon:"maki-grocery",imageURL:"https://graph.facebook.com/151131734909829/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17193392",shop:"supermarket"},addTags:{brand:"いなげや","brand:en":"Inageya","brand:ja":"いなげや","brand:wikidata":"Q17193392","brand:wikipedia":"ja:いなげや",name:"いなげや","name:en":"Inageya","name:ja":"いなげや",shop:"supermarket"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/まいばすけっと":{name:"まいばすけっと",icon:"maki-grocery",imageURL:"https://graph.facebook.com/mybasket.official/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11278154",shop:"supermarket"},addTags:{brand:"まいばすけっと","brand:en":"My Basket","brand:ja":"まいばすけっと","brand:wikidata":"Q11278154","brand:wikipedia":"ja:まいばすけっと",name:"まいばすけっと","name:en":"My Basket","name:ja":"まいばすけっと",shop:"supermarket"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/イオン":{name:"イオン",icon:"maki-grocery",imageURL:"https://graph.facebook.com/aeonretail.english/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11285951",shop:"supermarket"},addTags:{brand:"イオン","brand:en":"AEON","brand:ja":"イオン","brand:wikidata":"Q11285951","brand:wikipedia":"ja:イオン (店舗ブランド)",name:"イオン","name:en":"AEON","name:ja":"イオン",shop:"supermarket"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/イトーヨーカドー":{name:"イトーヨーカドー",icon:"maki-grocery",imageURL:"https://graph.facebook.com/itoyokado/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3088746",shop:"supermarket"},addTags:{brand:"イトーヨーカドー","brand:en":"Ito-Yokado","brand:ja":"イトーヨーカドー","brand:wikidata":"Q3088746","brand:wikipedia":"en:Ito-Yokado",name:"イトーヨーカドー","name:en":"Ito-Yokado","name:ja":"イトーヨーカドー",shop:"supermarket"},countryCodes:["jp"],terms:["イトーヨーカ堂"],matchScore:2,suggestion:true},"shop/supermarket/カスミ":{name:"カスミ",icon:"maki-grocery",imageURL:"https://graph.facebook.com/kasumi.fanpage/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11294160",shop:"supermarket"},addTags:{brand:"カスミ","brand:en":"Kasumi","brand:ja":"カスミ","brand:wikidata":"Q11294160","brand:wikipedia":"ja:カスミ",name:"カスミ","name:en":"Kasumi","name:ja":"カスミ",shop:"supermarket"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/バロー":{name:"バロー",icon:"maki-grocery",imageURL:"https://graph.facebook.com/138259402886129/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11328346",shop:"supermarket"},addTags:{brand:"バロー","brand:en":"Valor","brand:ja":"バロー","brand:wikidata":"Q11328346","brand:wikipedia":"ja:バロー (チェーンストア)",name:"バロー","name:en":"Valor","name:ja":"バロー",shop:"supermarket"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/マックスバリュ":{name:"マックスバリュ",icon:"maki-grocery",imageURL:"https://graph.facebook.com/158243057524643/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1960109",shop:"supermarket"},addTags:{brand:"マックスバリュ","brand:en":"Maxvalu Tokai","brand:ja":"マックスバリュ","brand:wikidata":"Q1960109","brand:wikipedia":"en:MaxValu",name:"マックスバリュ","name:en":"Maxvalu Tokai","name:ja":"マックスバリュ",shop:"supermarket"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/マルエツ":{name:"マルエツ",icon:"maki-grocery",imageURL:"https://graph.facebook.com/maruetsu.rakuten/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11341197",shop:"supermarket"},addTags:{brand:"マルエツ","brand:en":"Maruetsu","brand:ja":"マルエツ","brand:wikidata":"Q11341197","brand:wikipedia":"ja:マルエツ",name:"マルエツ","name:en":"Maruetsu","name:ja":"マルエツ",shop:"supermarket"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/ヤオコー":{name:"ヤオコー",icon:"maki-grocery",imageURL:"https://graph.facebook.com/yaokococoro/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11344967",shop:"supermarket"},addTags:{brand:"ヤオコー","brand:en":"Yaoko","brand:ja":"ヤオコー","brand:wikidata":"Q11344967","brand:wikipedia":"ja:ヤオコー",name:"ヤオコー","name:en":"Yaoko","name:ja":"ヤオコー",shop:"supermarket"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/ヨークベニマル":{name:"ヨークベニマル",icon:"maki-grocery",imageURL:"https://graph.facebook.com/ybfan89/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11346199",shop:"supermarket"},addTags:{brand:"ヨークベニマル","brand:en":"York Benimaru","brand:ja":"ヨークベニマル","brand:wikidata":"Q11346199","brand:wikipedia":"ja:ヨークベニマル",name:"ヨークベニマル","name:en":"York Benimaru","name:ja":"ヨークベニマル",shop:"supermarket"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/ヨークマート":{name:"ヨークマート",icon:"maki-grocery",imageURL:"https://graph.facebook.com/137658762945673/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11346201",shop:"supermarket"},addTags:{brand:"ヨークマート","brand:en":"YorkMart","brand:ja":"ヨークマート","brand:wikidata":"Q11346201","brand:wikipedia":"ja:ヨークマート",name:"ヨークマート","name:en":"YorkMart","name:ja":"ヨークマート",shop:"supermarket"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/ライフ":{name:"ライフ",icon:"maki-grocery",imageURL:"https://graph.facebook.com/lifecorp428/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11346476",shop:"supermarket"},addTags:{brand:"ライフ","brand:en":"Life","brand:ja":"ライフ","brand:wikidata":"Q11346476","brand:wikipedia":"ja:ライフコーポレーション",name:"ライフ","name:en":"Life","name:ja":"ライフ",shop:"supermarket"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/全聯":{name:"全聯",icon:"maki-grocery",imageURL:"https://graph.facebook.com/pxmartchannel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7262792",shop:"supermarket"},addTags:{brand:"全聯","brand:en":"Pxmart","brand:wikidata":"Q7262792","brand:wikipedia":"en:PX Mart",name:"全聯","name:en":"Pxmart",shop:"supermarket"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/全聯福利中心":{name:"全聯福利中心",icon:"maki-grocery",imageURL:"https://graph.facebook.com/pxmartchannel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7262792",shop:"supermarket"},addTags:{brand:"全聯福利中心","brand:en":"Pxmart","brand:wikidata":"Q7262792","brand:wikipedia":"en:PX Mart",name:"全聯福利中心","name:en":"Pxmart",shop:"supermarket"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/家乐福":{name:"家乐福",icon:"maki-grocery",imageURL:"https://graph.facebook.com/carrefour/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q217599",shop:"supermarket"},addTags:{brand:"家乐福","brand:wikidata":"Q217599","brand:wikipedia":"wuu:家乐福",name:"家乐福",shop:"supermarket"},countryCodes:["cn"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/惠康 Wellcome":{name:"惠康 Wellcome",icon:"maki-grocery",imageURL:"https://graph.facebook.com/wellcome.supermarket/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q706247",shop:"supermarket"},addTags:{brand:"惠康 Wellcome","brand:en":"Wellcome","brand:wikidata":"Q706247","brand:wikipedia":"zh:惠康",name:"惠康 Wellcome","name:en":"Wellcome",shop:"supermarket"},countryCodes:["hk"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/業務スーパー":{name:"業務スーパー",icon:"maki-grocery",imageURL:"https://graph.facebook.com/gsjdf/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11590183",shop:"supermarket"},addTags:{brand:"業務スーパー","brand:en":"Gyōmu sūpā","brand:ja":"業務スーパー","brand:wikidata":"Q11590183","brand:wikipedia":"ja:神戸物産",name:"業務スーパー","name:en":"Gyōmu sūpā","name:ja":"業務スーパー",shop:"supermarket"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/沃尔玛":{name:"沃尔玛",icon:"maki-grocery",imageURL:"https://graph.facebook.com/walmart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q483551",shop:"supermarket"},addTags:{brand:"沃尔玛","brand:en":"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"wuu:沃尔玛",name:"沃尔玛","name:en":"Walmart",shop:"supermarket"},countryCodes:["cn"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/美廉社":{name:"美廉社",icon:"maki-grocery",imageURL:"https://graph.facebook.com/simplemart1/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q15914017",shop:"supermarket"},addTags:{brand:"美廉社","brand:en":"Simple Mart","brand:wikidata":"Q15914017","brand:wikipedia":"zh:美廉社",name:"美廉社","name:en":"Simple Mart",shop:"supermarket"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/西友":{name:"西友",icon:"maki-grocery",imageURL:"https://graph.facebook.com/yourrepo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3108542",shop:"supermarket"},addTags:{brand:"西友","brand:en":"Seiyu Group","brand:wikidata":"Q3108542","brand:wikipedia":"en:Seiyu Group",name:"西友","name:en":"Seiyu Group",shop:"supermarket"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/頂好":{name:"頂好",icon:"maki-grocery",imageURL:"https://graph.facebook.com/wellcome.supermarket/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q706247",shop:"supermarket"},addTags:{brand:"頂好","brand:en":"Wellcome","brand:wikidata":"Q706247","brand:wikipedia":"en:Wellcome",name:"頂好","name:en":"Wellcome",shop:"supermarket"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/頂好超市":{name:"頂好超市",icon:"maki-grocery",imageURL:"https://graph.facebook.com/wellcome.supermarket/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q706247",shop:"supermarket"},addTags:{brand:"頂好超市","brand:en":"Wellcome","brand:wikidata":"Q706247","brand:wikipedia":"en:Wellcome",name:"頂好超市","name:en":"Wellcome",shop:"supermarket"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/롯데마트":{name:"롯데마트",icon:"maki-grocery",imageURL:"https://graph.facebook.com/lottemart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q326715",shop:"supermarket"},addTags:{brand:"롯데마트","brand:ko":"롯데마트","brand:wikidata":"Q326715","brand:wikipedia":"ko:롯데마트",name:"롯데마트","name:en":"Lotte Mart","name:ko":"롯데마트",shop:"supermarket"},countryCodes:["kr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/하나로마트":{name:"하나로마트",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q12590611",shop:"supermarket"},addTags:{brand:"하나로마트","brand:en":"Hanaro Mart","brand:ko":"하나로마트","brand:wikidata":"Q12590611","brand:wikipedia":"ko:농협유통",name:"하나로마트","name:ko":"하나로마트",shop:"supermarket"},countryCodes:["kr"],terms:[],matchScore:2,suggestion:true},"shop/tea/DavidsTea":{name:"DavidsTea",icon:"maki-teahouse",imageURL:"https://pbs.twimg.com/profile_images/1134536272062685184/YvIzsQOi_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q3019129",shop:"tea"},addTags:{brand:"DavidsTea","brand:wikidata":"Q3019129","brand:wikipedia":"en:DavidsTea",name:"DavidsTea",shop:"tea"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/tea/T2":{name:"T2",icon:"maki-teahouse",imageURL:"https://graph.facebook.com/T2Tea/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q48802134",shop:"tea"},addTags:{brand:"T2","brand:wikidata":"Q48802134","brand:wikipedia":"en:T2 (Australian company)",name:"T2",shop:"tea"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"shop/tea/TeeGschwendner":{name:"TeeGschwendner",icon:"maki-teahouse",imageURL:"https://graph.facebook.com/TeeGschwendner/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2399969",shop:"tea"},addTags:{brand:"TeeGschwendner","brand:wikidata":"Q2399969","brand:wikipedia":"de:TeeGschwendner",name:"TeeGschwendner",shop:"tea"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/ticket/Boutique Grandes Lignes":{name:"Boutique Grandes Lignes",icon:"fas-ticket-alt",imageURL:"https://graph.facebook.com/SNCFOFFICIEL/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q13646",shop:"ticket"},addTags:{brand:"Boutique Grandes Lignes","brand:wikidata":"Q13646","brand:wikipedia":"fr:Société nationale des chemins de fer français",name:"Boutique Grandes Lignes",shop:"ticket"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/ticket/DB Reisezentrum":{name:"DB Reisezentrum",icon:"fas-ticket-alt",imageURL:"https://graph.facebook.com/348950735250586/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q15842100",shop:"ticket"},addTags:{brand:"DB Reisezentrum","brand:wikidata":"Q15842100","brand:wikipedia":"de:Reisezentrum",name:"DB Reisezentrum",shop:"ticket"},countryCodes:["de"],terms:["reisezentrum"],matchScore:2,suggestion:true},"shop/ticket/Guichet Transilien":{name:"Guichet Transilien",icon:"fas-ticket-alt",imageURL:"https://pbs.twimg.com/profile_images/776102546045865984/-NPGF3eG_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q389554",shop:"ticket"},addTags:{brand:"Guichet Transilien","brand:wikidata":"Q389554","brand:wikipedia":"fr:Transilien",name:"Guichet Transilien",shop:"ticket"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/tobacco/Nemzeti Dohánybolt":{name:"Nemzeti Dohánybolt",icon:"maki-shop",geometry:["point","area"],tags:{"brand:wikidata":"Q20639040",shop:"tobacco"},addTags:{brand:"Nemzeti Dohánybolt","brand:wikidata":"Q20639040","brand:wikipedia":"en:Dohánybolt",name:"Nemzeti Dohánybolt",shop:"tobacco"},countryCodes:["hu"],terms:["dohánybolt"],matchScore:2,suggestion:true},"shop/toys/Build-A-Bear Workshop":{name:"Build-A-Bear Workshop",icon:"fas-space-shuttle",imageURL:"https://graph.facebook.com/Buildabear/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1002992",shop:"toys"},addTags:{brand:"Build-A-Bear Workshop","brand:wikidata":"Q1002992","brand:wikipedia":"en:Build-A-Bear Workshop",name:"Build-A-Bear Workshop",shop:"toys"},countryCodes:["ca","gb","us"],terms:["build a bear"],matchScore:2,suggestion:true},"shop/toys/Dráčik":{name:"Dráčik",icon:"fas-space-shuttle",imageURL:"https://graph.facebook.com/2185187834828492/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q57653669",shop:"toys"},addTags:{brand:"Dráčik","brand:wikidata":"Q57653669",name:"Dráčik",shop:"toys"},countryCodes:["cz","sk"],terms:[],matchScore:2,suggestion:true},"shop/toys/Intertoys":{name:"Intertoys",icon:"fas-space-shuttle",imageURL:"https://graph.facebook.com/Intertoys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1891407",shop:"toys"},addTags:{brand:"Intertoys","brand:wikidata":"Q1891407","brand:wikipedia":"nl:Intertoys",name:"Intertoys",shop:"toys"},countryCodes:["be","de","nl"],terms:[],matchScore:2,suggestion:true},"shop/toys/JouéClub":{name:"JouéClub",icon:"fas-space-shuttle",imageURL:"https://graph.facebook.com/JoueClubFr/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3187152",shop:"toys"},addTags:{brand:"JouéClub","brand:wikidata":"Q3187152","brand:wikipedia":"fr:JouéClub",name:"JouéClub",shop:"toys"},countryCodes:["ad","fr","it","lb","ma","qa"],terms:[],matchScore:2,suggestion:true},"shop/toys/King Jouet":{name:"King Jouet",icon:"fas-space-shuttle",imageURL:"https://graph.facebook.com/KingJouet/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3197009",shop:"toys"},addTags:{brand:"King Jouet","brand:en":"King Toy","brand:wikidata":"Q3197009","brand:wikipedia":"fr:King Jouet",name:"King Jouet","name:en":"King Toy",shop:"toys"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/toys/La Grande Récré":{name:"La Grande Récré",icon:"fas-space-shuttle",imageURL:"https://graph.facebook.com/lagranderecre/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3209556",shop:"toys"},addTags:{brand:"La Grande Récré","brand:wikidata":"Q3209556","brand:wikipedia":"fr:La Grande Récré (magasin)",name:"La Grande Récré",shop:"toys"},countryCodes:["be","ci","es","fr","ma"],terms:[],matchScore:2,suggestion:true},"shop/toys/Lego":{name:"Lego",icon:"fas-space-shuttle",imageURL:"https://graph.facebook.com/lego/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1063455",shop:"toys"},addTags:{brand:"Lego","brand:wikidata":"Q1063455","brand:wikipedia":"en:The Lego Group",name:"Lego",shop:"toys"},terms:["lego store"],matchScore:2,suggestion:true},"shop/toys/Lekia":{name:"Lekia",icon:"fas-space-shuttle",imageURL:"https://graph.facebook.com/lekiasweden/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q56303274",shop:"toys"},addTags:{brand:"Lekia","brand:wikidata":"Q56303274","brand:wikipedia":"sv:Lekia",name:"Lekia",shop:"toys"},countryCodes:["no","se"],terms:[],matchScore:2,suggestion:true},"shop/toys/Maxi Toys":{name:"Maxi Toys",icon:"fas-space-shuttle",imageURL:"https://graph.facebook.com/MaxiToys.FR/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16663879",shop:"toys"},addTags:{brand:"Maxi Toys","brand:wikidata":"Q16663879","brand:wikipedia":"fr:Maxi Toys",name:"Maxi Toys",shop:"toys"},countryCodes:["be","de","fr","it"],terms:[],matchScore:2,suggestion:true},"shop/toys/Smyths":{name:"Smyths",icon:"fas-space-shuttle",imageURL:"https://pbs.twimg.com/profile_images/1067119121245048834/S_SSe3Yd_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q7546779",shop:"toys"},addTags:{brand:"Smyths","brand:wikidata":"Q7546779","brand:wikipedia":"en:Smyths",name:"Smyths",shop:"toys"},countryCodes:["at","ch","de","gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/toys/The Entertainer":{name:"The Entertainer",icon:"fas-space-shuttle",imageURL:"https://graph.facebook.com/TheEntertainerToyShop/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7732289",shop:"toys"},addTags:{brand:"The Entertainer","brand:wikidata":"Q7732289","brand:wikipedia":"en:The Entertainer (retailer)",name:"The Entertainer",shop:"toys"},countryCodes:["gb","je"],terms:[],matchScore:2,suggestion:true},"shop/toys/Toys R Us":{name:"Toys R Us",icon:"fas-space-shuttle",imageURL:"https://graph.facebook.com/toysrus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q696334",shop:"toys"},addTags:{brand:"Toys R Us","brand:wikidata":"Q696334","brand:wikipedia":"en:Toys \"R\" Us",name:"Toys R Us",shop:"toys"},terms:[],matchScore:2,suggestion:true},"shop/toys/Детский мир":{name:"Детский мир",icon:"fas-space-shuttle",imageURL:"https://graph.facebook.com/detmir/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16643324",shop:"toys"},addTags:{brand:"Детский мир","brand:en":"Detskiy Mir","brand:wikidata":"Q16643324","brand:wikipedia":"en:Detsky Mir",name:"Детский мир","name:en":"Detskiy Mir",shop:"toys"},countryCodes:["by","kg","kz","ru","ua","uz"],terms:[],matchScore:2,suggestion:true},"shop/toys/Кораблик":{name:"Кораблик",icon:"fas-space-shuttle",imageURL:"https://graph.facebook.com/korablik.ru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q57653416",shop:"toys"},addTags:{brand:"Кораблик","brand:wikidata":"Q57653416",name:"Кораблик",shop:"toys"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/trade/84 Lumber":{name:"84 Lumber",icon:"maki-shop",imageURL:"https://graph.facebook.com/84lumber/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4644779",shop:"trade"},addTags:{brand:"84 Lumber","brand:wikidata":"Q4644779","brand:wikipedia":"en:84 Lumber",name:"84 Lumber",shop:"trade",trade:"building_supplies"},countryCodes:["us"],terms:["84","eighty-four lumber"],matchScore:2,suggestion:true},"shop/trade/Fastenal":{name:"Fastenal",icon:"maki-shop",imageURL:"https://graph.facebook.com/fastenalcompany/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3067119",shop:"trade"},addTags:{brand:"Fastenal","brand:wikidata":"Q3067119","brand:wikipedia":"en:Fastenal",name:"Fastenal",shop:"trade"},countryCodes:["ca","pa","us"],terms:[],matchScore:2,suggestion:true},"shop/trade/Grainger":{name:"Grainger",icon:"maki-shop",imageURL:"https://graph.facebook.com/grainger/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1627894",shop:"trade"},addTags:{brand:"Grainger","brand:wikidata":"Q1627894","brand:wikipedia":"en:W. W. Grainger",name:"Grainger",shop:"trade"},countryCodes:["ca","us"],terms:["granger","w. w. grainger"],matchScore:2,suggestion:true},"shop/travel_agency/American Automobile Association":{name:"American Automobile Association",icon:"fas-suitcase",imageURL:"https://graph.facebook.com/AAAFanPage/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q463436",shop:"travel_agency"},addTags:{brand:"American Automobile Association","brand:wikidata":"Q463436","brand:wikipedia":"en:American Automobile Association",name:"American Automobile Association",shop:"travel_agency",short_name:"AAA"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/travel_agency/Coral Travel":{name:"Coral Travel",icon:"fas-suitcase",imageURL:"https://graph.facebook.com/coraltravelofficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q58011479",shop:"travel_agency"},addTags:{brand:"Coral Travel","brand:wikidata":"Q58011479",name:"Coral Travel",shop:"travel_agency"},countryCodes:["pl","ru","ua"],terms:[],matchScore:2,suggestion:true},"shop/travel_agency/D-reizen":{name:"D-reizen",icon:"fas-suitcase",imageURL:"https://graph.facebook.com/dreizenvakanties/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2445498",shop:"travel_agency"},addTags:{brand:"D-reizen","brand:wikidata":"Q2445498","brand:wikipedia":"nl:D-reizen",name:"D-reizen",shop:"travel_agency"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/travel_agency/DER Reisebüro":{name:"DER Reisebüro",icon:"fas-suitcase",imageURL:"https://graph.facebook.com/DER/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q56729186",shop:"travel_agency"},addTags:{brand:"DER Reisebüro","brand:wikidata":"Q56729186","brand:wikipedia":"de:Deutsches Reisebüro",name:"DER Reisebüro",shop:"travel_agency"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/travel_agency/First Reisebüro":{name:"First Reisebüro",icon:"fas-suitcase",imageURL:"https://graph.facebook.com/TUIDeutschland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q573103",shop:"travel_agency"},addTags:{brand:"First Reisebüro","brand:wikidata":"Q573103","brand:wikipedia":"en:TUI Group",name:"First Reisebüro",shop:"travel_agency"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/travel_agency/Flight Centre":{name:"Flight Centre",icon:"fas-suitcase",imageURL:"https://graph.facebook.com/flightcentreAU/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5459202",shop:"travel_agency"},addTags:{brand:"Flight Centre","brand:wikidata":"Q5459202","brand:wikipedia":"en:Flight Centre",name:"Flight Centre",shop:"travel_agency"},terms:[],matchScore:2,suggestion:true},"shop/travel_agency/Halcón Viajes":{name:"Halcón Viajes",icon:"fas-suitcase",imageURL:"https://graph.facebook.com/halconviajes.oficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q57591939",shop:"travel_agency"},addTags:{brand:"Halcón Viajes","brand:wikidata":"Q57591939",name:"Halcón Viajes",shop:"travel_agency"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"shop/travel_agency/Havas Voyages":{name:"Havas Voyages",icon:"fas-suitcase",imageURL:"https://graph.facebook.com/havas.voyages/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q57628091",shop:"travel_agency"},addTags:{brand:"Havas Voyages","brand:wikidata":"Q57628091",name:"Havas Voyages",shop:"travel_agency"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/travel_agency/Liberty Travel":{name:"Liberty Travel",icon:"fas-suitcase",imageURL:"https://graph.facebook.com/LibertyTravel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17031665",shop:"travel_agency"},addTags:{brand:"Liberty Travel","brand:wikidata":"Q17031665","brand:wikipedia":"en:Liberty Travel",name:"Liberty Travel",shop:"travel_agency"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/travel_agency/Reiseland":{name:"Reiseland",icon:"fas-suitcase",imageURL:"https://graph.facebook.com/reiseland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q40387610",shop:"travel_agency"},addTags:{brand:"Reiseland","brand:wikidata":"Q40387610","brand:wikipedia":"de:OTTO Reisen",name:"Reiseland",shop:"travel_agency"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/travel_agency/Selectour":{name:"Selectour",icon:"fas-suitcase",imageURL:"https://graph.facebook.com/SelectourVoyages/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3478073",shop:"travel_agency"},addTags:{brand:"Selectour","brand:wikidata":"Q3478073","brand:wikipedia":"fr:Selectour",name:"Selectour",shop:"travel_agency"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/travel_agency/TUI (Group)":{name:"TUI (Group)",icon:"fas-suitcase",imageURL:"https://graph.facebook.com/TUIDeutschland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q573103",shop:"travel_agency"},addTags:{brand:"TUI","brand:wikidata":"Q573103","brand:wikipedia":"en:TUI Group",name:"TUI",shop:"travel_agency"},terms:["tui reisecenter"],matchScore:2,suggestion:true},"shop/travel_agency/TUI (UK)":{name:"TUI (UK)",icon:"fas-suitcase",imageURL:"https://graph.facebook.com/worldofTUI/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7795876",shop:"travel_agency"},addTags:{brand:"TUI","brand:wikidata":"Q7795876","brand:wikipedia":"en:TUI UK",name:"TUI",shop:"travel_agency"},countryCodes:["gb"],terms:["thomson"],matchScore:2,suggestion:true},"shop/travel_agency/The Co-operative Travel":{name:"The Co-operative Travel",icon:"fas-suitcase",imageURL:"https://graph.facebook.com/cooperativetraveluk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7726526",shop:"travel_agency"},addTags:{brand:"The Co-operative Travel","brand:wikidata":"Q7726526","brand:wikipedia":"en:The Co-operative Travel",name:"The Co-operative Travel",shop:"travel_agency"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/travel_agency/Thomas Cook":{name:"Thomas Cook",icon:"fas-suitcase",imageURL:"https://graph.facebook.com/thomascook/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2141800",shop:"travel_agency"},addTags:{brand:"Thomas Cook","brand:wikidata":"Q2141800","brand:wikipedia":"en:Thomas Cook Group",name:"Thomas Cook",shop:"travel_agency"},terms:[],matchScore:2,suggestion:true},"shop/travel_agency/Поехали с нами":{name:"Поехали с нами",icon:"fas-suitcase",imageURL:"https://graph.facebook.com/PoehaliSNamiua/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q25439141",shop:"travel_agency"},addTags:{brand:"Поехали с нами","brand:wikidata":"Q25439141","brand:wikipedia":"uk:Поїхали з нами",name:"Поехали с нами",shop:"travel_agency"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"shop/tyres/Big O Tires":{name:"Big O Tires",icon:"maki-shop",imageURL:"https://graph.facebook.com/BigOTires/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4906085",shop:"tyres"},addTags:{brand:"Big O Tires","brand:wikidata":"Q4906085","brand:wikipedia":"en:Big O Tires",name:"Big O Tires",shop:"tyres"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/tyres/Bridgestone":{name:"Bridgestone",icon:"maki-shop",imageURL:"https://graph.facebook.com/BridgestoneTires/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q179433",shop:"tyres"},addTags:{brand:"Bridgestone","brand:wikidata":"Q179433","brand:wikipedia":"en:Bridgestone",name:"Bridgestone",shop:"tyres"},terms:[],matchScore:2,suggestion:true},"shop/tyres/Discount Tire":{name:"Discount Tire",icon:"maki-shop",imageURL:"https://graph.facebook.com/DiscountTire/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5281735",shop:"tyres"},addTags:{brand:"Discount Tire","brand:wikidata":"Q5281735","brand:wikipedia":"en:Discount Tire",name:"Discount Tire",shop:"tyres"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/tyres/Express Oil Change & Tire Engineers":{name:"Express Oil Change & Tire Engineers",icon:"maki-shop",imageURL:"https://graph.facebook.com/expressoil/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q39057654",shop:"tyres"},addTags:{brand:"Express Oil Change & Tire Engineers","brand:wikidata":"Q39057654","brand:wikipedia":"en:Express Oil Change & Tire Engineers",name:"Express Oil Change & Tire Engineers",shop:"tyres"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/tyres/Les Schwab Tire Center":{name:"Les Schwab Tire Center",icon:"maki-shop",imageURL:"https://graph.facebook.com/lesschwab/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6529977",shop:"tyres"},addTags:{brand:"Les Schwab Tire Center","brand:wikidata":"Q6529977","brand:wikipedia":"en:Les Schwab Tire Centers",name:"Les Schwab Tire Center",shop:"tyres"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/tyres/Michelin":{name:"Michelin",icon:"maki-shop",imageURL:"https://graph.facebook.com/MichelinSustainableMobility/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q151107",shop:"tyres"},addTags:{brand:"Michelin","brand:wikidata":"Q151107","brand:wikipedia":"en:Michelin",name:"Michelin",shop:"tyres"},terms:[],matchScore:2,suggestion:true},"shop/tyres/Tire Discounters":{name:"Tire Discounters",icon:"maki-shop",imageURL:"https://graph.facebook.com/TireDiscounters/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q29093639",shop:"tyres"},addTags:{brand:"Tire Discounters","brand:wikidata":"Q29093639","brand:wikipedia":"en:Tire Discounters",name:"Tire Discounters",shop:"tyres"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/tyres/Tires Plus":{name:"Tires Plus",icon:"maki-shop",imageURL:"https://pbs.twimg.com/profile_images/378800000821067695/d59e0a647859aabacc690ebb962670aa_bigger.jpeg",geometry:["point","area"],tags:{"brand:wikidata":"Q64015091",shop:"tyres"},addTags:{brand:"Tires Plus","brand:wikidata":"Q64015091",name:"Tires Plus",shop:"tyres"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/tyres/Vianor":{name:"Vianor",icon:"maki-shop",imageURL:"https://graph.facebook.com/VianorSuomi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10714920",shop:"tyres"},addTags:{brand:"Vianor","brand:wikidata":"Q10714920","brand:wikipedia":"sv:Vianor",name:"Vianor",shop:"tyres"},terms:[],matchScore:2,suggestion:true},"shop/vacuum_cleaner/Oreck":{name:"Oreck",icon:"maki-shop",geometry:["point","area"],tags:{"brand:wikidata":"Q57273844",shop:"vacuum_cleaner"},addTags:{brand:"Oreck","brand:wikidata":"Q57273844",name:"Oreck",shop:"vacuum_cleaner"},countryCodes:["us"],terms:["oreck vacuums"],matchScore:2,suggestion:true},"shop/variety_store/99 Cents Only Stores":{name:"99 Cents Only Stores",icon:"maki-shop",imageURL:"https://graph.facebook.com/99CentsOnly/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4646294",shop:"variety_store"},addTags:{brand:"99 Cents Only Stores","brand:wikidata":"Q4646294","brand:wikipedia":"en:99 Cents Only Stores",name:"99 Cents Only Stores",shop:"variety_store"},countryCodes:["us"],terms:["99 cent only stores","99 cents only"],matchScore:2,suggestion:true},"shop/variety_store/Action":{name:"Action",icon:"maki-shop",imageURL:"https://graph.facebook.com/actiondotcom/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2634111",shop:"variety_store"},addTags:{brand:"Action","brand:wikidata":"Q2634111","brand:wikipedia":"nl:Action (winkel)",name:"Action",shop:"variety_store"},countryCodes:["at","be","de","fr","nl","pl"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/B&M Bargains":{name:"B&M Bargains",icon:"maki-shop",imageURL:"https://graph.facebook.com/bmstores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4836931",shop:"variety_store"},addTags:{brand:"B&M Bargains","brand:wikidata":"Q4836931","brand:wikipedia":"en:B & M",name:"B&M Bargains",shop:"variety_store"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/Big Bazar":{name:"Big Bazar",icon:"maki-shop",imageURL:"https://graph.facebook.com/bigbazarbv/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q15873104",shop:"variety_store"},addTags:{brand:"Big Bazar","brand:wikidata":"Q15873104","brand:wikipedia":"nl:Big Bazar",name:"Big Bazar",shop:"variety_store"},countryCodes:["be","nl"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/Daiso Japan":{name:"Daiso Japan",icon:"maki-shop",imageURL:"https://graph.facebook.com/daisojapanusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q866991",shop:"variety_store"},addTags:{brand:"Daiso","brand:wikidata":"Q866991",name:"Daiso Japan",shop:"variety_store",short_name:"Daiso"},countryCodes:["au","us"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/Dollar General":{name:"Dollar General",icon:"maki-shop",imageURL:"https://graph.facebook.com/dollargeneral/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q145168",shop:"variety_store"},addTags:{brand:"Dollar General","brand:wikidata":"Q145168","brand:wikipedia":"en:Dollar General",name:"Dollar General",shop:"variety_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/Dollar Tree":{name:"Dollar Tree",icon:"maki-shop",imageURL:"https://pbs.twimg.com/profile_images/509405558898561024/27hmihjq_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q5289230",shop:"variety_store"},addTags:{brand:"Dollar Tree","brand:wikidata":"Q5289230","brand:wikipedia":"en:Dollar Tree",name:"Dollar Tree",shop:"variety_store"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/Dollarama":{name:"Dollarama",icon:"maki-shop",imageURL:"https://graph.facebook.com/415845051799232/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3033947",shop:"variety_store"},addTags:{brand:"Dollarama","brand:wikidata":"Q3033947","brand:wikipedia":"en:Dollarama",name:"Dollarama",shop:"variety_store"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/EuroShop":{name:"EuroShop",icon:"maki-shop",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FEuroshop%20LOGO.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q15846763",shop:"variety_store"},addTags:{brand:"EuroShop","brand:wikidata":"Q15846763","brand:wikipedia":"de:Schum EuroShop",name:"EuroShop",shop:"variety_store"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/Family Dollar":{name:"Family Dollar",icon:"maki-shop",imageURL:"https://graph.facebook.com/familydollar/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5433101",shop:"variety_store"},addTags:{brand:"Family Dollar","brand:wikidata":"Q5433101","brand:wikipedia":"en:Family Dollar",name:"Family Dollar",shop:"variety_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/Five Below":{name:"Five Below",icon:"maki-shop",imageURL:"https://graph.facebook.com/FiveBelow/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5455836",shop:"variety_store"},addTags:{brand:"Five Below","brand:wikidata":"Q5455836","brand:wikipedia":"en:Five Below",name:"Five Below",shop:"variety_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/Fix Price":{name:"Fix Price",icon:"maki-shop",imageURL:"https://graph.facebook.com/fixprice.russia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4038791",shop:"variety_store"},addTags:{brand:"Fix Price","brand:wikidata":"Q4038791","brand:wikipedia":"ru:Fix Price (сеть магазинов)",name:"Fix Price",shop:"variety_store"},countryCodes:["by","ru"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/Flying Tiger Copenhagen":{name:"Flying Tiger Copenhagen",icon:"maki-shop",imageURL:"https://graph.facebook.com/flyingtigercph/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2786319",shop:"variety_store"},addTags:{brand:"Flying Tiger Copenhagen","brand:wikidata":"Q2786319","brand:wikipedia":"en:Flying Tiger Copenhagen",name:"Flying Tiger Copenhagen",shop:"variety_store",short_name:"Flying Tiger"},terms:["tgr","tiger"],matchScore:2,suggestion:true},"shop/variety_store/GiFi":{name:"GiFi",icon:"maki-shop",imageURL:"https://graph.facebook.com/GiFi.Officiel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3105439",shop:"variety_store"},addTags:{brand:"GiFi","brand:wikidata":"Q3105439","brand:wikipedia":"fr:Gifi",name:"GiFi",shop:"variety_store"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/Home Bargains":{name:"Home Bargains",icon:"maki-shop",imageURL:"https://graph.facebook.com/homebargains/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5888229",shop:"variety_store"},addTags:{brand:"Home Bargains","brand:wikidata":"Q5888229","brand:wikipedia":"en:Home Bargains",name:"Home Bargains",shop:"variety_store"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/Mäc-Geiz":{name:"Mäc-Geiz",icon:"maki-shop",imageURL:"https://graph.facebook.com/1652809328274529/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1957126",shop:"variety_store"},addTags:{brand:"Mäc-Geiz","brand:wikidata":"Q1957126","brand:wikipedia":"de:Mäc-Geiz",name:"Mäc-Geiz",shop:"variety_store"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/NOZ":{name:"NOZ",icon:"maki-shop",imageURL:"https://graph.facebook.com/UniversNOZ/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3345688",shop:"variety_store"},addTags:{brand:"NOZ","brand:wikidata":"Q3345688","brand:wikipedia":"fr:Noz",name:"NOZ",shop:"variety_store"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/Poundland":{name:"Poundland",icon:"maki-shop",imageURL:"https://graph.facebook.com/Poundland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1434528",shop:"variety_store"},addTags:{brand:"Poundland","brand:wikidata":"Q1434528","brand:wikipedia":"en:Poundland",name:"Poundland",shop:"variety_store"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/Poundstretcher":{name:"Poundstretcher",icon:"maki-shop",imageURL:"https://graph.facebook.com/Poundstretcher/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7235675",shop:"variety_store"},addTags:{brand:"Poundstretcher","brand:wikidata":"Q7235675","brand:wikipedia":"en:Poundstretcher",name:"Poundstretcher",shop:"variety_store"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/Poundworld":{name:"Poundworld",icon:"maki-shop",imageURL:"https://graph.facebook.com/PoundWorld/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16967516",shop:"variety_store"},addTags:{brand:"Poundworld","brand:wikidata":"Q16967516","brand:wikipedia":"en:Poundworld",name:"Poundworld",shop:"variety_store"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/Roses":{name:"Roses",icon:"maki-shop",geometry:["point","area"],tags:{"brand:wikidata":"Q7368644",shop:"variety_store"},addTags:{brand:"Roses","brand:wikidata":"Q7368644","brand:wikipedia":"en:Roses (store)",name:"Roses",shop:"variety_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/TEDi":{name:"TEDi",icon:"maki-shop",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FTEDi-Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1364603",shop:"variety_store"},addTags:{brand:"TEDi","brand:wikidata":"Q1364603","brand:wikipedia":"de:TEDi",name:"TEDi",shop:"variety_store"},countryCodes:["at","de","es","hr","si","sk"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/Tokmanni":{name:"Tokmanni",icon:"maki-shop",imageURL:"https://graph.facebook.com/Tokmanni.fi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q13423470",shop:"variety_store"},addTags:{brand:"Tokmanni","brand:wikidata":"Q13423470","brand:wikipedia":"fi:Tokmanni",name:"Tokmanni",shop:"variety_store"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/Wilko":{name:"Wilko",icon:"maki-shop",imageURL:"https://graph.facebook.com/LoveWilko/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q8002536",shop:"variety_store"},addTags:{brand:"Wilko","brand:wikidata":"Q8002536","brand:wikipedia":"en:Wilko (retailer)",name:"Wilko",shop:"variety_store"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/キャンドゥ":{name:"キャンドゥ",icon:"maki-shop",imageURL:"https://pbs.twimg.com/profile_images/986887047209091072/PPjs7xOK_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q11297367",shop:"variety_store"},addTags:{brand:"キャンドゥ","brand:en":"CAN DO","brand:ja":"キャンドゥ","brand:wikidata":"Q11297367","brand:wikipedia":"ja:キャンドゥ",name:"キャンドゥ","name:en":"CAN DO","name:ja":"キャンドゥ",shop:"variety_store"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/セリア":{name:"セリア",icon:"maki-shop",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSeria%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q11314509",shop:"variety_store"},addTags:{brand:"セリア","brand:en":"Seria","brand:ja":"セリア","brand:wikidata":"Q11314509","brand:wikipedia":"ja:セリア (100円ショップ)",name:"セリア","name:en":"Seria","name:ja":"セリア",shop:"variety_store"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/ダイソー":{name:"ダイソー",icon:"maki-shop",imageURL:"https://graph.facebook.com/daisojapanusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q866991",shop:"variety_store"},addTags:{brand:"ダイソー","brand:en":"Daiso","brand:ja":"ダイソー","brand:wikidata":"Q866991","brand:wikipedia":"ja:大創産業",name:"ダイソー","name:en":"Daiso","name:ja":"ダイソー",shop:"variety_store"},countryCodes:["jp"],terms:["ザ・ダイソー"],matchScore:2,suggestion:true},"shop/variety_store/ダイレックス":{name:"ダイレックス",icon:"maki-shop",geometry:["point","area"],tags:{"brand:wikidata":"Q11317051",shop:"variety_store"},addTags:{brand:"ダイレックス","brand:en":"Direx","brand:ja":"ダイレックス","brand:wikidata":"Q11317051","brand:wikipedia":"ja:ダイレックス (ディスカウントストア)",name:"ダイレックス","name:en":"Direx","name:ja":"ダイレックス",shop:"variety_store"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/トライアル":{name:"トライアル",icon:"maki-shop",geometry:["point","area"],tags:{"brand:wikidata":"Q11321723",shop:"variety_store"},addTags:{brand:"トライアル","brand:en":"Trial","brand:ja":"トライアル","brand:wikidata":"Q11321723","brand:wikipedia":"ja:トライアルカンパニー",name:"トライアル","name:en":"Trial","name:ja":"トライアル",shop:"variety_store"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/ドン・キホーテ":{name:"ドン・キホーテ",icon:"maki-shop",imageURL:"https://pbs.twimg.com/profile_images/1098907826305421312/KCKaI33I_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q1185381",shop:"variety_store"},addTags:{brand:"ドン・キホーテ","brand:en":"Don Quijote","brand:ja":"ドン・キホーテ","brand:wikidata":"Q1185381","brand:wikipedia":"ja:ドン・キホーテ (企業)",name:"ドン・キホーテ","name:en":"Don Quijote","name:ja":"ドン・キホーテ",opening_hours:"24/7",shop:"variety_store",short_name:"ドンキ","short_name:en":"Donki","short_name:ja":"ドンキ"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/video_games/EB Games":{name:"EB Games",icon:"maki-gaming",imageURL:"https://graph.facebook.com/ebgamescanada/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4993686",shop:"video_games"},addTags:{brand:"EB Games","brand:wikidata":"Q4993686","brand:wikipedia":"en:EB Games",name:"EB Games",shop:"video_games"},countryCodes:["au","ca","nz"],terms:[],matchScore:2,suggestion:true},"shop/video_games/Game":{name:"Game",icon:"maki-gaming",imageURL:"https://pbs.twimg.com/profile_images/925661697230163968/GTdV1FP7_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q5519813",shop:"video_games"},addTags:{brand:"Game","brand:wikidata":"Q5519813","brand:wikipedia":"en:Game (retailer)",name:"Game",shop:"video_games"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/video_games/GameStop":{name:"GameStop",icon:"maki-gaming",imageURL:"https://graph.facebook.com/GameStop/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q202210",shop:"video_games"},addTags:{brand:"GameStop","brand:wikidata":"Q202210","brand:wikipedia":"en:GameStop",name:"GameStop",shop:"video_games"},terms:[],matchScore:2,suggestion:true},"shop/video_games/Micromania":{name:"Micromania",icon:"maki-gaming",imageURL:"https://graph.facebook.com/MicromaniaFr/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3312221",shop:"video_games"},addTags:{brand:"Micromania","brand:wikidata":"Q3312221","brand:wikipedia":"en:Micromania (video game retailer)",name:"Micromania",shop:"video_games"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/video/Blockbuster":{name:"Blockbuster",icon:"temaki-movie_rental",imageURL:"https://pbs.twimg.com/profile_images/378800000679852472/9ee706eca6f5d0b9fbc3a57d014ec807_bigger.jpeg",geometry:["point","area"],tags:{"brand:wikidata":"Q884711",shop:"video"},addTags:{brand:"Blockbuster","brand:wikidata":"Q884711","brand:wikipedia":"en:Blockbuster LLC",name:"Blockbuster",shop:"video"},terms:[],matchScore:2,suggestion:true},"shop/video/Family Video":{name:"Family Video",icon:"temaki-movie_rental",imageURL:"https://graph.facebook.com/FamilyVideo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5433297",shop:"video"},addTags:{brand:"Family Video","brand:wikidata":"Q5433297","brand:wikipedia":"en:Family Video",name:"Family Video",shop:"video"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/video/TSUTAYA":{name:"TSUTAYA",icon:"temaki-movie_rental",imageURL:"https://graph.facebook.com/TSUTAYA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5193457",shop:"video"},addTags:{brand:"TSUTAYA","brand:wikidata":"Q5193457","brand:wikipedia":"ja:カルチュア・コンビニエンス・クラブ",name:"TSUTAYA",shop:"video"},terms:[],matchScore:2,suggestion:true},"shop/video/ゲオ":{name:"ゲオ",icon:"temaki-movie_rental",imageURL:"https://graph.facebook.com/geomediashop/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5533938",shop:"video"},addTags:{brand:"GEO","brand:ja":"GEO","brand:wikidata":"Q5533938","brand:wikipedia":"ja:ゲオ",name:"ゲオ","name:en":"GEO","name:ja":"ゲオ",shop:"video"},countryCodes:["jp"],terms:["geo"],matchScore:2,suggestion:true},"shop/watches/Fossil":{name:"Fossil",icon:"maki-watch",imageURL:"https://graph.facebook.com/Fossil/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q356212",shop:"watches"},addTags:{brand:"Fossil","brand:wikidata":"Q356212","brand:wikipedia":"en:Fossil Group",name:"Fossil",shop:"watches"},countryCodes:["de","us"],terms:[],matchScore:2,suggestion:true},"shop/watches/Omega":{name:"Omega",icon:"maki-watch",imageURL:"https://graph.facebook.com/omega/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q659224",shop:"watches"},addTags:{brand:"Omega","brand:wikidata":"Q659224","brand:wikipedia":"en:Omega SA",name:"Omega",shop:"watches"},countryCodes:["ch","fr"],terms:[],matchScore:2,suggestion:true},"shop/watches/Rolex":{name:"Rolex",icon:"maki-watch",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FRolex%20Bienne%2004.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q62288",shop:"watches"},addTags:{brand:"Rolex","brand:wikidata":"Q62288","brand:wikipedia":"en:Rolex",name:"Rolex",shop:"watches"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/watches/Swatch":{name:"Swatch",icon:"maki-watch",imageURL:"https://graph.facebook.com/SwatchUS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q573422",shop:"watches"},addTags:{brand:"Swatch","brand:wikidata":"Q573422","brand:wikipedia":"en:Swatch",name:"Swatch",shop:"watches"},terms:[],matchScore:2,suggestion:true},"shop/wholesale/BJ's Wholesale Club":{name:"BJ's Wholesale Club",icon:"maki-warehouse",imageURL:"https://graph.facebook.com/bjswholesaleclub/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4835754",shop:"wholesale"},addTags:{brand:"BJ's Wholesale Club","brand:wikidata":"Q4835754","brand:wikipedia":"en:BJ's Wholesale Club",name:"BJ's Wholesale Club",shop:"wholesale"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/wholesale/Costco":{name:"Costco",icon:"maki-warehouse",imageURL:"https://graph.facebook.com/Costco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q715583",shop:"wholesale"},addTags:{brand:"Costco","brand:wikidata":"Q715583","brand:wikipedia":"en:Costco",name:"Costco",shop:"wholesale"},terms:["costco wholesale"],matchScore:2,suggestion:true},"shop/wholesale/Makro":{name:"Makro",icon:"maki-warehouse",imageURL:"https://graph.facebook.com/makrohipermayorista/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q704606",shop:"wholesale"},addTags:{brand:"Makro","brand:wikidata":"Q704606","brand:wikipedia":"en:Makro",name:"Makro",shop:"wholesale"},terms:[],matchScore:2,suggestion:true},"shop/wholesale/Metro":{name:"Metro",icon:"maki-warehouse",imageURL:"https://graph.facebook.com/metro.deutschland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q13610282",shop:"wholesale"},addTags:{brand:"Metro","brand:wikidata":"Q13610282","brand:wikipedia":"en:Metro Cash and Carry",name:"Metro",shop:"wholesale"},terms:[],matchScore:2,suggestion:true},"shop/wholesale/Sam's Club":{name:"Sam's Club",icon:"maki-warehouse",imageURL:"https://graph.facebook.com/samsclub/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1972120",shop:"wholesale"},addTags:{brand:"Sam's Club","brand:wikidata":"Q1972120","brand:wikipedia":"en:Sam's Club",name:"Sam's Club",shop:"wholesale"},terms:[],matchScore:2,suggestion:true},"shop/wholesale/コストコ":{name:"コストコ",icon:"maki-warehouse",imageURL:"https://graph.facebook.com/Costco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q715583",shop:"wholesale"},addTags:{brand:"コストコ","brand:en":"Costco","brand:ja":"コストコ","brand:wikidata":"Q715583","brand:wikipedia":"ja:コストコ",name:"コストコ","name:en":"Costco","name:ja":"コストコ",shop:"wholesale"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"tourism/hotel/B&B Hôtel":{name:"B&B Hôtel",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/bbhotels.france/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q794939",tourism:"hotel"},addTags:{brand:"B&B Hôtel","brand:wikidata":"Q794939","brand:wikipedia":"en:B&B Hotels",name:"B&B Hôtel",tourism:"hotel"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"tourism/hotel/Best Western":{name:"Best Western",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/BestWestern/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q830334",tourism:"hotel"},addTags:{brand:"Best Western","brand:wikidata":"Q830334","brand:wikipedia":"en:Best Western",name:"Best Western",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Best Western Plus":{name:"Best Western Plus",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/BestWestern/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q830334",tourism:"hotel"},addTags:{brand:"Best Western","brand:wikidata":"Q830334","brand:wikipedia":"en:Best Western",name:"Best Western Plus",tourism:"hotel"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"tourism/hotel/Campanile":{name:"Campanile",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/campanile/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2412064",tourism:"hotel"},addTags:{brand:"Campanile","brand:wikidata":"Q2412064","brand:wikipedia":"fr:Campanile (chaîne d'hôtels)",name:"Campanile",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Candlewood Suites":{name:"Candlewood Suites",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/CandlewoodSuites/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5032010",tourism:"hotel"},addTags:{brand:"Candlewood Suites","brand:wikidata":"Q5032010","brand:wikipedia":"en:Candlewood Suites",name:"Candlewood Suites",tourism:"hotel"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"tourism/hotel/Comfort Inn":{name:"Comfort Inn",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/choicehotels/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1075788",tourism:"hotel"},addTags:{brand:"Comfort Inn","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Comfort Inn",tourism:"hotel"},countryCodes:["ca","gb","us"],terms:[],matchScore:2,suggestion:true},"tourism/hotel/Comfort Inn & Suites":{name:"Comfort Inn & Suites",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/choicehotels/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1075788",tourism:"hotel"},addTags:{brand:"Comfort Inn & Suites","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Comfort Inn & Suites",tourism:"hotel"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"tourism/hotel/Comfort Suites":{name:"Comfort Suites",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/choicehotels/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1075788",tourism:"hotel"},addTags:{brand:"Comfort Suites","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Comfort Suites",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Country Inn & Suites":{name:"Country Inn & Suites",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/countryinn/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5177332",tourism:"hotel"},addTags:{brand:"Country Inn & Suites","brand:wikidata":"Q5177332","brand:wikipedia":"en:Country Inns & Suites",name:"Country Inn & Suites",tourism:"hotel"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"tourism/hotel/Courtyard by Marriott":{name:"Courtyard by Marriott",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/courtyard/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1053170",tourism:"hotel"},addTags:{brand:"Courtyard by Marriott","brand:wikidata":"Q1053170","brand:wikipedia":"en:Courtyard by Marriott",name:"Courtyard by Marriott",tourism:"hotel"},countryCodes:["ca","us"],terms:["courtyard marriott"],matchScore:2,suggestion:true},"tourism/hotel/Crowne Plaza":{name:"Crowne Plaza",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/crowneplaza/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2746220",tourism:"hotel"},addTags:{brand:"Crowne Plaza","brand:wikidata":"Q2746220","brand:wikipedia":"en:Crowne Plaza",name:"Crowne Plaza",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Days Inn":{name:"Days Inn",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/DaysInn/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1047239",tourism:"hotel"},addTags:{brand:"Days Inn","brand:wikidata":"Q1047239","brand:wikipedia":"en:Days Inn",name:"Days Inn",tourism:"hotel"},countryCodes:["ca","gb","us"],terms:[],matchScore:2,suggestion:true},"tourism/hotel/Embassy Suites":{name:"Embassy Suites",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/EmbassySuites/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5369524",tourism:"hotel"},addTags:{brand:"Embassy Suites","brand:wikidata":"Q5369524","brand:wikipedia":"en:Embassy Suites by Hilton",name:"Embassy Suites",tourism:"hotel"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"tourism/hotel/Extended Stay America":{name:"Extended Stay America",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/ExtendedStayAmerica/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5421850",tourism:"hotel"},addTags:{brand:"Extended Stay America","brand:wikidata":"Q5421850","brand:wikipedia":"en:Extended Stay America",name:"Extended Stay America",tourism:"hotel"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"tourism/hotel/Fairfield Inn":{name:"Fairfield Inn",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/fairfieldbymarriott/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5430314",tourism:"hotel"},addTags:{brand:"Fairfield Inn","brand:wikidata":"Q5430314","brand:wikipedia":"en:Fairfield Inn by Marriott",name:"Fairfield Inn",tourism:"hotel"},countryCodes:["ca","us"],terms:["fairfield inn & suites","fairfield inn and suites"],matchScore:2,suggestion:true},"tourism/hotel/Formule 1":{name:"Formule 1",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/HotelF1/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1630895",tourism:"hotel"},addTags:{brand:"Formule 1","brand:wikidata":"Q1630895","brand:wikipedia":"en:Hotel Formule 1",name:"Formule 1",tourism:"hotel"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"tourism/hotel/Grand Hyatt":{name:"Grand Hyatt",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/hyatt/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1425063",tourism:"hotel"},addTags:{brand:"Grand Hyatt","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Grand Hyatt",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Hampton":{name:"Hampton",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/hamptonbyhilton/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5646230",tourism:"hotel"},addTags:{alt_name:"Hampton Inn",brand:"Hampton","brand:wikidata":"Q5646230","brand:wikipedia":"en:Hampton by Hilton",name:"Hampton",tourism:"hotel"},countryCodes:["us"],terms:["hampton inn & suites","hampton inn and suites"],matchScore:2,suggestion:true},"tourism/hotel/Hilton":{name:"Hilton",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/hilton/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q598884",tourism:"hotel"},addTags:{brand:"Hilton","brand:wikidata":"Q598884","brand:wikipedia":"en:Hilton Hotels & Resorts",name:"Hilton",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Hilton Garden Inn":{name:"Hilton Garden Inn",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/HiltonGardenInn/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1162859",tourism:"hotel"},addTags:{brand:"Hilton Garden Inn","brand:wikidata":"Q1162859","brand:wikipedia":"en:Hilton Garden Inn",name:"Hilton Garden Inn",tourism:"hotel"},countryCodes:["ca","mx","us"],terms:[],matchScore:2,suggestion:true},"tourism/hotel/Holiday Inn":{name:"Holiday Inn",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/HolidayInn/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2717882",tourism:"hotel"},addTags:{brand:"Holiday Inn","brand:wikidata":"Q2717882","brand:wikipedia":"en:Holiday Inn",name:"Holiday Inn",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Holiday Inn Express":{name:"Holiday Inn Express",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/holidayinnexpress/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5880423",tourism:"hotel"},addTags:{brand:"Holiday Inn Express","brand:wikidata":"Q5880423","brand:wikipedia":"en:Holiday Inn Express",name:"Holiday Inn Express",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Holiday Inn Express & Suites":{name:"Holiday Inn Express & Suites",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/holidayinnexpress/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5880423",tourism:"hotel"},addTags:{brand:"Holiday Inn Express & Suites","brand:wikidata":"Q5880423","brand:wikipedia":"en:Holiday Inn Express",name:"Holiday Inn Express & Suites",tourism:"hotel"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"tourism/hotel/Home2 Suites":{name:"Home2 Suites",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/Home2Suites/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5887912",tourism:"hotel"},addTags:{brand:"Home2 Suites","brand:wikidata":"Q5887912","brand:wikipedia":"en:Home2 Suites by Hilton",name:"Home2 Suites",official_name:"Home2 Suites by Hilton",tourism:"hotel"},countryCodes:["ca","mx","us"],terms:["home2"],matchScore:2,suggestion:true},"tourism/hotel/Homewood Suites":{name:"Homewood Suites",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/HomewoodSuites/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5890701",tourism:"hotel"},addTags:{brand:"Homewood Suites","brand:wikidata":"Q5890701","brand:wikipedia":"en:Homewood Suites by Hilton",name:"Homewood Suites",tourism:"hotel"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"tourism/hotel/Hyatt":{name:"Hyatt",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/hyatt/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1425063",tourism:"hotel"},addTags:{brand:"Hyatt","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Hyatt",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Hyatt Centric":{name:"Hyatt Centric",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/hyatt/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1425063",tourism:"hotel"},addTags:{brand:"Hyatt Centric","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Hyatt Centric",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Hyatt House":{name:"Hyatt House",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/hyatt/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1425063",tourism:"hotel"},addTags:{brand:"Hyatt House","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Hyatt House",tourism:"hotel"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"tourism/hotel/Hyatt Place":{name:"Hyatt Place",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/hyatt/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1425063",tourism:"hotel"},addTags:{brand:"Hyatt","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Hyatt Place",tourism:"hotel"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"tourism/hotel/Hyatt Regency":{name:"Hyatt Regency",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/hyatt/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1425063",tourism:"hotel"},addTags:{brand:"Hyatt Regency","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Hyatt Regency",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Ibis":{name:"Ibis",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/ibishotels.fr/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q920166",tourism:"hotel"},addTags:{brand:"Ibis","brand:wikidata":"Q920166","brand:wikipedia":"en:Ibis (hotel)",name:"Ibis",tourism:"hotel"},terms:["hotel ibis","ibis hotel"],matchScore:2,suggestion:true},"tourism/hotel/Ibis Budget":{name:"Ibis Budget",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/ibisbudget.fr/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1458135",tourism:"hotel"},addTags:{brand:"Ibis Budget","brand:wikidata":"Q1458135","brand:wikipedia":"en:Ibis Budget",name:"Ibis Budget",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Ibis Styles":{name:"Ibis Styles",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/ibisstyles.fr/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3147425",tourism:"hotel"},addTags:{brand:"Ibis Styles","brand:wikidata":"Q3147425","brand:wikipedia":"en:Ibis Styles",name:"Ibis Styles",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Kyriad":{name:"Kyriad",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/kyriadindia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11751808",tourism:"hotel"},addTags:{brand:"Kyriad","brand:wikidata":"Q11751808","brand:wikipedia":"pl:Kyriad",name:"Kyriad",tourism:"hotel"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"tourism/hotel/La Quinta":{name:"La Quinta",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/laquinta/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6464734",tourism:"hotel"},addTags:{brand:"La Quinta","brand:wikidata":"Q6464734","brand:wikipedia":"en:La Quinta Inns & Suites",name:"La Quinta",tourism:"hotel"},countryCodes:["us"],terms:["la quinta inn & suites","la quinta inn and suites","la quinta inns & suites","la quinta inns and suites"],matchScore:2,suggestion:true},"tourism/hotel/Le Méridien":{name:"Le Méridien",icon:"fas-concierge-bell",imageURL:"https://pbs.twimg.com/profile_images/444194265032163329/ioAHiave_bigger.jpeg",geometry:["point","area"],tags:{"brand:wikidata":"Q261077",tourism:"hotel"},addTags:{brand:"Le Méridien","brand:wikidata":"Q261077","brand:wikipedia":"en:Le Méridien",name:"Le Méridien",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Marriott":{name:"Marriott",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/marriottinternational/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1141173",tourism:"hotel"},addTags:{brand:"Marriott","brand:wikidata":"Q1141173","brand:wikipedia":"en:Marriott International",name:"Marriott",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Mercure":{name:"Mercure",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/MercureHotels/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1709809",tourism:"hotel"},addTags:{brand:"Mercure","brand:wikidata":"Q1709809","brand:wikipedia":"en:Mercure (hotel)",name:"Mercure",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Novotel":{name:"Novotel",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/Novotelhotels/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q420545",tourism:"hotel"},addTags:{brand:"Novotel","brand:wikidata":"Q420545","brand:wikipedia":"en:Novotel",name:"Novotel",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Park Hyatt":{name:"Park Hyatt",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/hyatt/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1425063",tourism:"hotel"},addTags:{brand:"Park Hyatt","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Park Hyatt",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Premier Inn":{name:"Premier Inn",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/premierinn/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2108626",tourism:"hotel"},addTags:{brand:"Premier Inn","brand:wikidata":"Q2108626","brand:wikipedia":"en:Premier Inn",name:"Premier Inn",tourism:"hotel"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"tourism/hotel/Première Classe":{name:"Première Classe",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/PremiereClasseHotels/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5964551",tourism:"hotel"},addTags:{brand:"Première Classe","brand:wikidata":"Q5964551","brand:wikipedia":"en:Hôtel Première Classe",name:"Première Classe",tourism:"hotel"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"tourism/hotel/Quality Inn":{name:"Quality Inn",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/choicehotels/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1075788",tourism:"hotel"},addTags:{brand:"Quality Inn","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Quality Inn",tourism:"hotel"},countryCodes:["ca","mx","us"],terms:[],matchScore:2,suggestion:true},"tourism/hotel/Quality Inn & Suites":{name:"Quality Inn & Suites",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/choicehotels/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1075788",tourism:"hotel"},addTags:{brand:"Quality Inn & Suites","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Quality Inn & Suites",tourism:"hotel"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"tourism/hotel/Ramada":{name:"Ramada",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/ramada/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1502859",tourism:"hotel"},addTags:{brand:"Ramada","brand:wikidata":"Q1502859","brand:wikipedia":"en:Ramada",name:"Ramada",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Red Roof Inn":{name:"Red Roof Inn",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/redroofinn/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7304949",tourism:"hotel"},addTags:{brand:"Red Roof Inn","brand:wikidata":"Q7304949","brand:wikipedia":"en:Red Roof Inn",name:"Red Roof Inn",tourism:"hotel"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"tourism/hotel/Renaissance Hotel":{name:"Renaissance Hotel",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/RenaissanceHotels/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2143252",tourism:"hotel"},addTags:{brand:"Renaissance Hotels","brand:wikidata":"Q2143252","brand:wikipedia":"en:Renaissance Hotels",name:"Renaissance Hotel",tourism:"hotel"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"tourism/hotel/Residence Inn":{name:"Residence Inn",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/residenceinn/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7315394",tourism:"hotel"},addTags:{brand:"Residence Inn","brand:wikidata":"Q7315394","brand:wikipedia":"en:Residence Inn by Marriott",name:"Residence Inn",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Sheraton":{name:"Sheraton",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/Sheraton/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q634831",tourism:"hotel"},addTags:{brand:"Sheraton","brand:wikidata":"Q634831","brand:wikipedia":"en:Sheraton Hotels and Resorts",name:"Sheraton",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Sleep Inn":{name:"Sleep Inn",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/choicehotels/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1075788",tourism:"hotel"},addTags:{brand:"Sleep Inn","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Sleep Inn",tourism:"hotel"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"tourism/hotel/Staybridge Suites":{name:"Staybridge Suites",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/StaybridgeSuites/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7605116",tourism:"hotel"},addTags:{brand:"Staybridge Suites","brand:wikidata":"Q7605116","brand:wikipedia":"en:Staybridge Suites",name:"Staybridge Suites",tourism:"hotel"},countryCodes:["ca","gb","us"],terms:[],matchScore:2,suggestion:true},"tourism/hotel/Travelodge":{name:"Travelodge",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/Travelodge/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7836087",tourism:"hotel"},addTags:{brand:"Travelodge","brand:wikidata":"Q7836087","brand:wikipedia":"en:Travelodge",name:"Travelodge",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/W Hotels":{name:"W Hotels",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/WHotels/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7958488",tourism:"hotel"},addTags:{brand:"W Hotels","brand:wikidata":"Q7958488","brand:wikipedia":"en:W Hotels",name:"W Hotels",short_name:"W",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/東横イン":{name:"東横イン",icon:"fas-concierge-bell",geometry:["point","area"],tags:{"brand:wikidata":"Q1320541",tourism:"hotel"},addTags:{brand:"東横イン","brand:en":"Toyoko Inn","brand:ja":"東横イン","brand:wikidata":"Q1320541","brand:wikipedia":"en:Toyoko Inn",name:"東横イン","name:en":"Toyoko Inn","name:ja":"東横イン",tourism:"hotel"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"tourism/motel/Econo Lodge":{name:"Econo Lodge",icon:"maki-lodging",imageURL:"https://graph.facebook.com/choicehotels/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5333330",tourism:"motel"},addTags:{brand:"Econo Lodge","brand:wikidata":"Q5333330","brand:wikipedia":"en:Econo Lodge",name:"Econo Lodge",tourism:"motel"},terms:[],matchScore:2,suggestion:true},"tourism/motel/Motel 6":{name:"Motel 6",icon:"maki-lodging",imageURL:"https://graph.facebook.com/motel6/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2188884",tourism:"motel"},addTags:{brand:"Motel 6","brand:wikidata":"Q2188884","brand:wikipedia":"en:Motel 6",name:"Motel 6",tourism:"motel"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"tourism/motel/Rodeway Inn":{name:"Rodeway Inn",icon:"maki-lodging",imageURL:"https://graph.facebook.com/choicehotels/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7356709",tourism:"motel"},addTags:{brand:"Rodeway Inn","brand:wikidata":"Q7356709","brand:wikipedia":"en:Rodeway Inn",name:"Rodeway Inn",tourism:"motel"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"tourism/motel/Super 8":{name:"Super 8",icon:"maki-lodging",imageURL:"https://graph.facebook.com/Super8/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5364003",tourism:"motel"},addTags:{brand:"Super 8","brand:wikidata":"Q5364003","brand:wikipedia":"en:Super 8 Motels",name:"Super 8",tourism:"motel"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true}};
24703
24704         var defaults = {area:["category-landuse","category-building","category-water","category-natural","leisure/park","amenity/hospital","amenity/place_of_worship","amenity/cafe","amenity/restaurant","area"],line:["category-road_major","category-road_minor","category-rail","category-path","category-waterway","category-barrier","category-natural","category-utility","line"],point:["category-natural","leisure/park","amenity/hospital","amenity/place_of_worship","amenity/cafe","amenity/restaurant","amenity/fast_food","amenity/bar","amenity/bank","shop/supermarket","point"],vertex:["highway/crossing/marked","highway/crossing/unmarked","railway/level_crossing","highway/traffic_signals","highway/turning_circle","highway/turning_loop","traffic_calming","highway/mini_roundabout","highway/motorway_junction","point"],relation:["category-route","category-restriction","public_transport/stop_area","type/boundary","type/waterway","type/multipolygon","type/enforcement","type/site","relation"]};
24705
24706         var categories = {"category-barrier":{icon:"maki-roadblock",name:"Barrier Features",members:["barrier/fence","barrier/wall","barrier/ditch","barrier/gate","barrier/hedge","barrier/kerb","barrier"]},"category-building":{icon:"maki-building",name:"Building Features",members:["building","building/house","building/apartments","building/garage","building/retail","building/commercial","building/industrial","building/residential"]},"category-golf":{icon:"maki-golf",name:"Golf Features",members:["golf/fairway","golf/green","golf/lateral_water_hazard","golf/rough","golf/bunker","golf/tee","golf/water_hazard","golf/driving_range","golf/hole","golf/cartpath","golf/path"]},"category-landuse":{icon:"maki-landuse",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":{icon:"maki-natural",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","natural/coastline","natural/tree_row","natural/peak","natural/cliff","natural/beach"]},"category-path":{icon:"temaki-pedestrian",name:"Paths",members:["highway/path","highway/footway","highway/footway/marked","highway/footway/sidewalk","highway/steps","highway/cycleway","highway/bridleway","highway/pedestrian_line"]},"category-rail":{icon:"iD-railway-rail",name:"Rails",members:["railway/rail","railway/disused","railway/tram","railway/subway","railway/narrow_gauge","railway/light_rail","railway/monorail","railway/funicular"]},"category-restriction":{icon:"iD-restriction",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_major":{icon:"iD-highway-unclassified",name:"Major Roads",members:["highway/motorway","highway/trunk","highway/primary","highway/secondary","highway/tertiary","highway/motorway_link","highway/trunk_link","highway/primary_link","highway/secondary_link","highway/tertiary_link"]},"category-road_minor":{icon:"iD-highway-unclassified",name:"Minor Roads",members:["highway/unclassified","highway/residential","highway/living_street","highway/service","highway/track"]},"category-road_service":{icon:"iD-highway-service",name:"Service Roads",members:["highway/service","highway/service/parking_aisle","highway/service/driveway","highway/service/alley","highway/service/emergency_access","highway/service/drive-through"]},"category-route":{icon:"iD-route",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-utility":{icon:"iD-power-line",name:"Utility Features",members:["power/line","power/minor_line","man_made/pipeline","power/cable/underground"]},"category-water":{icon:"maki-water",name:"Water Bodies",members:["natural/water","natural/water/pond","natural/water/basin","natural/water/lake","natural/water/reservoir"]},"category-waterway":{icon:"iD-waterway-stream",name:"Waterways",members:["waterway/stream","waterway/drain","waterway/river","waterway/canal","waterway/ditch","natural/water/stream","natural/water/river","natural/water/canal"]}};
24707
24708         var fields = {access_simple:{key:"access",type:"combo",label:"Allowed Access",options:["yes","permissive","private","customers","permit","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 allowed by law; a right of way"},no:{title:"Prohibited",description:"Access not allowed to the general public"},permissive:{title:"Permissive",description:"Access allowed until such time as the owner revokes the permission"},"private":{title:"Private",description:"Access allowed only with permission of the owner on an individual basis"},designated:{title:"Designated",description:"Access allowed according to signs or specific local laws"},destination:{title:"Destination",description:"Access allowed only to reach a destination"},dismount:{title:"Dismount",description:"Access allowed but rider must dismount"},permit:{title:"Permit",description:"Access allowed only with a valid permit or license"}}}},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",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"},air_conditioning:{key:"air_conditioning",type:"check",label:"Air Conditioning"},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"},architect:{key:"architect",type:"text",label:"Architect"},"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"},attraction:{key:"attraction",type:"typeCombo",label:"Type"},backrest:{key:"backrest",type:"check",label:"Backrest"},bar:{key:"bar",type:"check",label:"Bar"},barrier:{key:"barrier",type:"typeCombo",label:"Type"},basin:{key:"basin",type:"combo",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:"Beauty Specialty"},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"},"bridge/support":{key:"bridge:support",type:"combo",label:"Type"},building_area:{key:"building",type:"combo","default":"yes",geometry:"area",label:"Building"},building:{key:"building",type:"combo",label:"Building"},"building/levels_building":{key:"building:levels",type:"number",minValue:0,label:"Building Levels",placeholder:"2, 4, 6...",prerequisiteTag:{key:"building",valueNot:"no"}},"building/material":{key:"building:material",type:"combo",label:"Material"},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..."},cash_in:{key:"cash_in",type:"check",label:"Cash In"},castle_type:{key:"castle_type",type:"combo",label:"Type"},check_date:{key:"check_date",type:"text",label:"Last Checked Date"},clothes:{key:"clothes",type:"semiCombo",label:"Clothes"},club:{key:"club",type:"typeCombo",label:"Type"},collection_times:{key:"collection_times",type:"text",label:"Collection Times"},colour:{key:"colour",type:"text",label:"Color"},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"},consulate:{key:"consulate",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",options:["silage","water","oil","fuel","slurry","gas","manure","sewage"]},conveying:{key:"conveying",type:"typeCombo",label:"Movement Direction",strings:{options:{forward:"Forward",backward:"Backward",reversible:"Reversible"}}},country:{key:"country",type:"combo",label:"Country"},couplings:{key:"couplings",type:"number",minValue:1,label:"Couplings",placeholder:"1, 2, 3..."},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","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",prerequisiteTag:{key:"religion"}},denotation:{key:"denotation",type:"combo",label:"Denotation"},departures_board:{key:"departures_board",type:"combo",label:"Departures Board",strings:{options:{yes:"Yes",timetable:"Timetable",realtime:"Realtime",no:"None"}}},description:{key:"description",type:"textarea",label:"Description",universal:true},design:{key:"design",type:"combo",label:"Design"},destination_oneway:{key:"destination",type:"semiCombo",label:"Destinations",prerequisiteTag:{key:"oneway",value:"yes"},snake_case:false},"destination/ref_oneway":{key:"destination:ref",type:"semiCombo",label:"Destination Road Numbers",prerequisiteTag:{key:"oneway",value:"yes"},snake_case:false},"destination/symbol_oneway":{key:"destination:symbol",type:"semiCombo",label:"Destination Symbols",prerequisiteTag:{key:"oneway",value:"yes"}},devices:{key:"devices",type:"number",minValue:0,label:"Devices",placeholder:"1, 2, 3..."},diameter:{key:"diameter",type:"combo",label:"Diameter",snake_case:false,placeholder:"5 mm, 10 cm, 15 in…"},diaper:{key:"diaper",type:"combo",label:"Diaper Changing Available",options:["yes","no","room","1","2","3","4","5"]},diet_multi:{key:"diet:",type:"multiCombo",label:"Diet Types"},diplomatic:{key:"diplomatic",type:"combo",label:"Type"},"diplomatic/services":{key:"diplomatic:services:",type:"multiCombo",label:"Services"},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 Affected",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:"Distance"},dock:{key:"dock",type:"combo",label:"Type"},dog:{key:"dog",type:"combo",label:"Dogs",strings:{options:{yes:"Allowed",leashed:"Leashed Only",no:"Not Allowed"}}},door_type:{key:"door",type:"typeCombo",label:"Type"},door:{key:"door",type:"combo",label:"Door"},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",label:"Email"},embankment:{key:"embankment",type:"typeCombo",label:"Type",placeholder:"Default"},embassy:{key:"embassy",type:"combo",label:"Type"},emergency_combo:{key:"emergency",type:"combo",label:"Type"},emergency:{key:"emergency",type:"check",label:"Emergency"},enforcement:{key:"enforcement",type:"combo",label:"Type"},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",placeholder:"+31 42 123 4567"},fee:{key:"fee",type:"check",label:"Fee"},fence_type:{key:"fence_type",type:"combo",label:"Type"},"fire_hydrant/diameter":{key:"fire_hydrant:diameter",type:"combo",label:"Diameter (mm, in, or letters)",snake_case:false},"fire_hydrant/pressure":{key:"fire_hydrant:pressure",type:"combo",label:"Pressure (bar)",snake_case:false},"fire_hydrant/type":{key:"fire_hydrant:type",type:"combo",label:"Shape",strings:{options:{pillar:"Pillar/Aboveground",underground:"Underground",wall:"Wall",pipe:"Capped Pipe"}}},fireplace:{key:"fireplace",type:"check",label:"Fireplace"},fishing:{key:"fishing",type:"combo",label:"Fishing"},fitness_station:{key:"fitness_station",type:"typeCombo",label:"Equipment Type"},fixme:{key:"fixme",type:"textarea",label:"Fix Me",universal:true},"flag/type":{key:"flag:type",type:"combo",label:"Flag Type"},floating:{key:"floating",type:"check",label:"Floating"},flood_prone:{key:"flood_prone",type:"check",label:"Flood Prone"},ford:{key:"ford",type:"typeCombo",label:"Type",placeholder:"Default"},frequency_electrified:{key:"frequency",type:"combo",label:"Operating Frequency",prerequisiteTag:{key:"electrified",valueNot:"no"}},frequency:{key:"frequency",type:"combo",label:"Operating Frequency"},from:{key:"from",type:"text",label:"From"},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:"typeCombo",label:"Power Output",placeholder:"50 MW, 100 MW, 200 MW...",snake_case:false},"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"},guest_house:{key:"guest_house",type:"combo",label:"Type"},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_building:{key:"height",minValue:0,type:"number",label:"Building Height (Meters)",prerequisiteTag:{key:"building",valueNot:"no"}},height:{key:"height",minValue:0,type:"number",label:"Height (Meters)"},highspeed:{key:"highspeed",type:"check",label:"High-Speed"},highway:{key:"highway",type:"typeCombo",label:"Type"},historic:{key:"historic",type:"typeCombo",label:"Type"},"historic/civilization":{key:"historic:civilization",type:"combo",label:"Historic Civilization"},"historic/wreck/date_sunk":{key:"wreck:date_sunk",type:"text",label:"Date Sunk"},"historic/wreck/visible_at_high_tide":{key:"wreck:visible_at_high_tide",type:"check",label:"Visible At High Tide"},"historic/wreck/visible_at_low_tide":{key:"wreck:visible_at_low_tide",type:"check",label:"Visible At Low Tide"},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_type:{key:"indoor",type:"typeCombo",label:"Type"},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_yes:{key:"intermittent",type:"check",label:"Intermittent","default":"yes"},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",prerequisiteTag:{key:"internet_access",valueNot:"no"}},"internet_access/ssid":{key:"internet_access:ssid",type:"text",label:"Wifi Network Name",prerequisiteTag:{key:"internet_access",valueNot:"no"}},interval:{key:"interval",type:"text",label:"Interval"},junction_line:{key:"junction",type:"combo",label:"Junction",strings:{options:{roundabout:"Roundabout",circular:"Traffic Circle",jughandle:"Jughandle"}}},"junction/ref_oneway":{key:"junction:ref",type:"text",label:"Junction Number",prerequisiteTag:{key:"oneway",value:"yes"}},kerb:{key:"kerb",type:"combo",label:"Curb"},"kerb/height":{key:"kerb:height",type:"combo",snake_case:false,label:"Height"},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..."},language_multi:{key:"language:",type:"multiCombo",label:"Languages"},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..."},liaison:{key:"liaison",type:"combo",label:"Type"},lit:{key:"lit",type:"check",label:"Lit"},location_pool:{key:"location",type:"typeCombo",label:"Location",strings:{options:{outdoor:"Outdoor",indoor:"Indoor",roof:"Rooftop"}}},location:{key:"location",type:"combo",label:"Location"},lock:{key:"lock",type:"check",label:"Lock"},man_made:{key:"man_made",type:"typeCombo",label:"Type"},manhole:{key:"manhole",type:"typeCombo",label:"Type"},manufacturer:{key:"manufacturer",type:"combo",snake_case:false,caseSensitive:true,label:"Manufacturer"},map_size:{key:"map_size",type:"typeCombo",label:"Coverage"},map_type:{key:"map_type",type:"typeCombo",label:"Type"},material:{key:"material",type:"combo",label:"Material"},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_bridge:{key:"maxweight",type:"combo",label:"Max Weight",snake_case:false,prerequisiteTag:{key:"bridge",valueNot:"no"}},maxweight:{key:"maxweight",type:"combo",label:"Max Weight",snake_case:false},memorial:{key:"memorial",type:"typeCombo",label:"Type"},microbrewery:{key:"microbrewery",type:"check",label:"Microbrewery"},minspeed:{key:"minspeed",type:"maxspeed",label:"Minimum Speed Limit",placeholder:"20, 30, 40..."},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"}}},"oneway/bicycle":{key:"oneway:bicycle",type:"check",label:"One Way (Bicycles)",prerequisiteTag:{key:"oneway"}},opening_date:{key:"opening_date",type:"text",label:"Expected Opening Date"},opening_hours:{key:"opening_hours",type:"combo",label:"Hours",placeholder:"Unknown",snake_case:false},operator:{key:"operator",type:"text",label:"Operator"},"operator/type":{key:"operator:type",type:"combo",label:"Operator Type",prerequisiteTag:{key:"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_fee:{key:"payment:",type:"multiCombo",label:"Payment Types",prerequisiteTag:{key:"fee",valueNot:"no"}},payment_multi:{key:"payment:",type:"multiCombo",label:"Payment Types"},phases:{key:"phases",type:"number",minValue:1,label:"Phases",placeholder:"1, 2, 3..."},phone:{key:"phone",type:"tel",icon:"maki-telephone",label:"Telephone",placeholder:"+31 42 123 4567"},"piste/difficulty_downhill":{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/difficulty_nordic":{key:"piste:difficulty",type:"combo",label:"Difficulty",placeholder:"Easy, Intermediate, Advanced...",strings:{options:{novice:"Novice - Flat, no effort needed",easy:"Easy - Soft hills, short steep section",intermediate:"Intermediate - Steep section",advanced:"Advanced - Narrow, steep or icy section, sharp turn",expert:"Expert - Dangerous terrain around"}}},"piste/difficulty_skitour":{key:"piste:difficulty",type:"combo",label:"Difficulty",placeholder:"Easy, Intermediate, Advanced...",strings:{options:{novice:"Novice - L: <30° incline",easy:"Easy - WS: 30-35° incline",intermediate:"Intermediate - ZS: 35-40° incline",advanced:"Advanced - S: 40-45° incline",expert:"Expert - SS: 45–50° incline",freeride:"Freeride - AS: 50–55° incline",extreme:"Extreme - EX: >55° incline"}}},"piste/difficulty":{key:"piste:difficulty",type:"combo",label:"Difficulty",placeholder:"Easy, Intermediate, Advanced...",strings:{options:{novice:"Novice",easy:"Easy",intermediate:"Intermediate",advanced:"Advanced",expert:"Expert",freeride:"Freeride",extreme:"Extreme"}}},"piste/grooming_downhill":{key:"piste:grooming",type:"combo",label:"Grooming",strings:{options:{classic:"Classic",mogul:"Mogul",backcountry:"Backcountry - no grooming"}}},"piste/grooming_hike":{key:"piste:grooming",type:"combo",label:"Grooming",strings:{options:{classic:"Classic - Winter Hiking",backcountry:"Backcountry - Snowshoeing"}}},"piste/grooming_nordic":{key:"piste:grooming",type:"combo",label:"Grooming",strings:{options:{classic:"Classic",backcountry:"Backcountry, no grooming","classic+skating":"Classic and Skating",scooter:"Scooter/Snowmobile",skating:"Skating"}}},"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",connection:"Connection"}}},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:{key:"playground",type:"combo",label:"Type"},"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"},polling_station:{key:"polling_station",type:"check",label:"Polling Place"},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 Affected",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"},recycling_type:{key:"recycling_type",type:"combo",label:"Type",placeholder:"Container, Center",strings:{options:{container:"Container",centre:"Center"}}},ref_aeroway_gate:{key:"ref",type:"text",label:"Gate Number"},ref_golf_hole:{key:"ref",type:"text",label:"Hole Number",placeholder:"1-18"},ref_highway_junction:{key:"ref",type:"text",label:"Junction Number"},ref_platform:{key:"ref",type:"text",label:"Platform Number"},ref_road_number:{key:"ref",type:"text",label:"Road Number"},ref_room_number:{key:"ref",type:"text",label:"Room 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"},reservation:{key:"reservation",type:"combo",label:"Reservations",strings:{options:{yes:"Accepted",no:"Not Accepted",required:"Required",recommended:"Recommended"}}},resort:{key:"resort",type:"combo",label:"Type"},resource:{key:"resource",type:"semiCombo",label:"Resources"},restriction:{key:"restriction",type:"combo",label:"Type"},restrictions:{type:"restrictions",geometry:"vertex",icon:"iD-restrictions",reference:{rtype:"restriction"},label:"Turn Restrictions"},"roof/colour":{key:"roof:colour",type:"combo",label:"Roof Color"},room:{key:"room",type:"combo",label:"Type"},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"}}},salt:{key:"salt",type:"check",label:"Salt"},sanitary_dump_station:{key:"sanitary_dump_station",type:"check",label:"Toilet Disposal"},screen:{key:"screen",type:"number",label:"Screens",placeholder:"1, 4, 8…",minValue:0},scuba_diving:{key:"scuba_diving:",type:"multiCombo",label:"Services",options:["repair","courses","rental","filling","air_filling","nitrox_filling","trimix_filling","oxygen_filling"]},"seamark/beacon_isolated_danger/shape":{key:"seamark:beacon_isolated_danger:shape",type:"combo",label:"Shape"},"seamark/beacon_lateral/category":{key:"seamark:beacon_lateral:category",type:"combo",label:"Category",strings:{options:{port:"Port",starboard:"Starboard",waterway_left:"Waterway Left",waterway_right:"Waterway Right",danger_left:"Danger Left",danger_right:"Danger Right"}}},"seamark/beacon_lateral/colour":{key:"seamark:beacon_lateral:colour",type:"combo",label:"Color",strings:{options:{red:"Red",green:"Green",grey:"Grey"}}},"seamark/beacon_lateral/shape":{key:"seamark:beacon_lateral:shape",type:"combo",label:"Shape"},"seamark/beacon_lateral/system":{key:"seamark:beacon_lateral:system",type:"combo",label:"System",strings:{options:{"iala-a":"IALA A","iala-b":"IALA B",cevni:"CEVNI",other:"Other"}}},"seamark/buoy_lateral/category":{key:"seamark:buoy_lateral:category",type:"combo",label:"Category",strings:{options:{port:"Port",starboard:"Starboard",channel_left:"Channel Left",channel_right:"Channel Right",waterway_left:"Waterway Left",waterway_right:"Waterway Right",danger_left:"Danger Left",danger_right:"Danger Right",preferred_channel_port:"Preferred Channel Port",preferred_channel_starboard:"Preferred Channel Starboard"}}},"seamark/buoy_lateral/colour":{key:"seamark:buoy_lateral:colour",type:"combo",label:"Color",strings:{options:{red:"Red",green:"Green","red;white;red;white":"Red-White-Red-White","green;white;green;white":"Green-White-Green-White","red;green;red":"Red-Green-Red","green;red;green":"Green-Red-Green",white:"White",yellow:"Yellow"}}},"seamark/buoy_lateral/shape":{key:"seamark:buoy_lateral:shape",type:"combo",label:"Shape"},"seamark/buoy_lateral/system":{key:"seamark:buoy_lateral:system",type:"combo",label:"System",strings:{options:{"iala-a":"IALA A","iala-b":"IALA B",cevni:"CEVNI",other:"Other"}}},"seamark/mooring/category":{key:"seamark:mooring:category",type:"combo",label:"Category"},"seamark/type":{key:"seamark:type",type:"combo",label:"Seamark"},"seamark/wreck/category":{key:"seamark:wreck:category",type:"combo",label:"Category"},seasonal:{key:"seasonal",type:"check",label:"Seasonal"},seats:{key:"seats",type:"number",minValue:0,label:"Seats",placeholder:"2, 4, 6..."},second_hand:{key:"second_hand",type:"combo",label:"Sells Used",placeholder:"Yes, No, Only",strings:{options:{yes:"Yes",no:"No",only:"Only"}}},self_service:{key:"self_service",type:"check",label:"Self-Service"},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_type:{key:"site_type",type:"combo",label:"Site Type"},site:{key:"site",type:"combo",label:"Type"},smoking:{key:"smoking",type:"combo",label:"Smoking",placeholder:"No, Separated, Yes...",strings:{options:{no:"No smoking anywhere",separated:"In smoking areas, not physically isolated",isolated:"In smoking areas, physically isolated",outside:"Allowed outside",yes:"Allowed everywhere",dedicated:"Dedicated to smokers (e.g. smokers' club)"}}},smoothness:{key:"smoothness",type:"combo",label:"Smoothness",placeholder:"Thin Rollers, Wheels, Off-Road...",strings:{options:{excellent:"Thin Rollers: rollerblade, skateboard",good:"Thin Wheels: racing bike",intermediate:"Wheels: city bike, wheelchair, scooter",bad:"Robust Wheels: trekking bike, car, rickshaw",very_bad:"High Clearance: light duty off-road vehicle",horrible:"Off-Road: heavy duty off-road vehicle",very_horrible:"Specialized off-road: tractor, ATV",impassable:"Impassable / No wheeled vehicle"}}},social_facility_for:{key:"social_facility:for",type:"combo",label:"People Served"},social_facility:{key:"social_facility",type:"combo",label:"Type"},source:{key:"source",type:"semiCombo",icon:"source",universal:true,label:"Sources",snake_case:false,caseSensitive:true,options:["survey","local knowledge","gps","aerial imagery","streetlevel imagery"]},sport_ice:{key:"sport",type:"semiCombo",label:"Sports",options:["ice_skating","ice_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:"combo",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"}}},street_cabinet:{key:"street_cabinet",type:"combo",label:"Type"},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"},"survey/date":{key:"survey:date",type:"text",label:"Last Survey Date"},swimming_pool:{key:"swimming_pool",type:"combo",label:"Type"},"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"}}},target:{key:"target",type:"combo",label:"Target"},tidal:{key:"tidal",type:"check",label:"Tidal"},to:{key:"to",type:"text",label:"To"},"toilets/disposal":{key:"toilets:disposal",type:"combo",label:"Disposal",strings:{options:{flush:"Flush",pitlatrine:"Pit Latrine",chemical:"Chemical",bucket:"Bucket"}}},"toilets/handwashing":{key:"toilets:handwashing",type:"check",label:"Handwashing"},"toilets/position":{key:"toilets:position",type:"semiCombo",label:"Positions"},toll:{key:"toll",type:"check",label:"Toll"},tomb:{key:"tomb",type:"typeCombo",label:"Type"},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_sign:{key:"traffic_sign",type:"typeCombo",label:"Traffic Sign"},"traffic_sign/direction":{key:"traffic_sign:direction",type:"combo",label:"Direction Affected",strings:{options:{forward:"Forward",backward:"Backward",both:"Both / All"}}},traffic_signals:{key:"traffic_signals",type:"combo",label:"Type","default":"signal"},"traffic_signals/direction":{key:"traffic_signals:direction",type:"combo",label:"Direction Affected",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"},trench:{key:"trench",type:"combo",label:"Type"},trolley_wire:{key:"trolley_wire",type:"check",label:"Overhead Trolley Wires"},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"}}},valve:{key:"valve",type:"combo",label:"Type"},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_electrified:{key:"voltage",type:"combo",label:"Voltage",prerequisiteTag:{key:"electrified",valueNot:"no"}},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_source:{key:"water_source","default":"main",type:"combo",label:"Water Source"},water_volume:{key:"water_volume",type:"number",label:"Water Reserve Volume (m³)",snake_case:false},water:{key:"water",type:"combo",label:"Type"},waterway:{key:"waterway",type:"typeCombo",label:"Type"},website:{key:"website",type:"url",icon:"website",placeholder:"https://example.com",label:"Website"},wetland:{key:"wetland",type:"combo",label:"Type"},wheelchair:{key:"wheelchair",type:"radio",options:["yes","limited","no"],icon:"maki-wheelchair",label:"Wheelchair Access"},wholesale:{key:"wholesale",type:"typeCombo",label:"Wholesale"},width:{key:"width",type:"number",minValue:0,label:"Width (Meters)"},wikidata:{key:"wikidata",keys:["wikidata","wikipedia"],type:"wikidata",icon:"wikipedia",universal:true,label:"Wikidata"},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"}}}};
24709
24710         var quickselect = createCommonjsModule(function (module, exports) {
24711         (function (global, factory) {
24712                  module.exports = factory() ;
24713         }(commonjsGlobal, (function () {
24714         function quickselect(arr, k, left, right, compare) {
24715             quickselectStep(arr, k, left || 0, right || (arr.length - 1), compare || defaultCompare);
24716         }
24717
24718         function quickselectStep(arr, k, left, right, compare) {
24719
24720             while (right > left) {
24721                 if (right - left > 600) {
24722                     var n = right - left + 1;
24723                     var m = k - left + 1;
24724                     var z = Math.log(n);
24725                     var s = 0.5 * Math.exp(2 * z / 3);
24726                     var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);
24727                     var newLeft = Math.max(left, Math.floor(k - m * s / n + sd));
24728                     var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));
24729                     quickselectStep(arr, k, newLeft, newRight, compare);
24730                 }
24731
24732                 var t = arr[k];
24733                 var i = left;
24734                 var j = right;
24735
24736                 swap(arr, left, k);
24737                 if (compare(arr[right], t) > 0) swap(arr, left, right);
24738
24739                 while (i < j) {
24740                     swap(arr, i, j);
24741                     i++;
24742                     j--;
24743                     while (compare(arr[i], t) < 0) i++;
24744                     while (compare(arr[j], t) > 0) j--;
24745                 }
24746
24747                 if (compare(arr[left], t) === 0) swap(arr, left, j);
24748                 else {
24749                     j++;
24750                     swap(arr, j, right);
24751                 }
24752
24753                 if (j <= k) left = j + 1;
24754                 if (k <= j) right = j - 1;
24755             }
24756         }
24757
24758         function swap(arr, i, j) {
24759             var tmp = arr[i];
24760             arr[i] = arr[j];
24761             arr[j] = tmp;
24762         }
24763
24764         function defaultCompare(a, b) {
24765             return a < b ? -1 : a > b ? 1 : 0;
24766         }
24767
24768         return quickselect;
24769
24770         })));
24771         });
24772
24773         var rbush_1 = rbush;
24774         var default_1 = rbush;
24775
24776
24777
24778         function rbush(maxEntries, format) {
24779             if (!(this instanceof rbush)) return new rbush(maxEntries, format);
24780
24781             // max entries in a node is 9 by default; min node fill is 40% for best performance
24782             this._maxEntries = Math.max(4, maxEntries || 9);
24783             this._minEntries = Math.max(2, Math.ceil(this._maxEntries * 0.4));
24784
24785             if (format) {
24786                 this._initFormat(format);
24787             }
24788
24789             this.clear();
24790         }
24791
24792         rbush.prototype = {
24793
24794             all: function () {
24795                 return this._all(this.data, []);
24796             },
24797
24798             search: function (bbox) {
24799
24800                 var node = this.data,
24801                     result = [],
24802                     toBBox = this.toBBox;
24803
24804                 if (!intersects$1(bbox, node)) return result;
24805
24806                 var nodesToSearch = [],
24807                     i, len, child, childBBox;
24808
24809                 while (node) {
24810                     for (i = 0, len = node.children.length; i < len; i++) {
24811
24812                         child = node.children[i];
24813                         childBBox = node.leaf ? toBBox(child) : child;
24814
24815                         if (intersects$1(bbox, childBBox)) {
24816                             if (node.leaf) result.push(child);
24817                             else if (contains$4(bbox, childBBox)) this._all(child, result);
24818                             else nodesToSearch.push(child);
24819                         }
24820                     }
24821                     node = nodesToSearch.pop();
24822                 }
24823
24824                 return result;
24825             },
24826
24827             collides: function (bbox) {
24828
24829                 var node = this.data,
24830                     toBBox = this.toBBox;
24831
24832                 if (!intersects$1(bbox, node)) return false;
24833
24834                 var nodesToSearch = [],
24835                     i, len, child, childBBox;
24836
24837                 while (node) {
24838                     for (i = 0, len = node.children.length; i < len; i++) {
24839
24840                         child = node.children[i];
24841                         childBBox = node.leaf ? toBBox(child) : child;
24842
24843                         if (intersects$1(bbox, childBBox)) {
24844                             if (node.leaf || contains$4(bbox, childBBox)) return true;
24845                             nodesToSearch.push(child);
24846                         }
24847                     }
24848                     node = nodesToSearch.pop();
24849                 }
24850
24851                 return false;
24852             },
24853
24854             load: function (data) {
24855                 if (!(data && data.length)) return this;
24856
24857                 if (data.length < this._minEntries) {
24858                     for (var i = 0, len = data.length; i < len; i++) {
24859                         this.insert(data[i]);
24860                     }
24861                     return this;
24862                 }
24863
24864                 // recursively build the tree with the given data from scratch using OMT algorithm
24865                 var node = this._build(data.slice(), 0, data.length - 1, 0);
24866
24867                 if (!this.data.children.length) {
24868                     // save as is if tree is empty
24869                     this.data = node;
24870
24871                 } else if (this.data.height === node.height) {
24872                     // split root if trees have the same height
24873                     this._splitRoot(this.data, node);
24874
24875                 } else {
24876                     if (this.data.height < node.height) {
24877                         // swap trees if inserted one is bigger
24878                         var tmpNode = this.data;
24879                         this.data = node;
24880                         node = tmpNode;
24881                     }
24882
24883                     // insert the small tree into the large tree at appropriate level
24884                     this._insert(node, this.data.height - node.height - 1, true);
24885                 }
24886
24887                 return this;
24888             },
24889
24890             insert: function (item) {
24891                 if (item) this._insert(item, this.data.height - 1);
24892                 return this;
24893             },
24894
24895             clear: function () {
24896                 this.data = createNode([]);
24897                 return this;
24898             },
24899
24900             remove: function (item, equalsFn) {
24901                 if (!item) return this;
24902
24903                 var node = this.data,
24904                     bbox = this.toBBox(item),
24905                     path = [],
24906                     indexes = [],
24907                     i, parent, index, goingUp;
24908
24909                 // depth-first iterative tree traversal
24910                 while (node || path.length) {
24911
24912                     if (!node) { // go up
24913                         node = path.pop();
24914                         parent = path[path.length - 1];
24915                         i = indexes.pop();
24916                         goingUp = true;
24917                     }
24918
24919                     if (node.leaf) { // check current node
24920                         index = findItem(item, node.children, equalsFn);
24921
24922                         if (index !== -1) {
24923                             // item found, remove the item and condense tree upwards
24924                             node.children.splice(index, 1);
24925                             path.push(node);
24926                             this._condense(path);
24927                             return this;
24928                         }
24929                     }
24930
24931                     if (!goingUp && !node.leaf && contains$4(node, bbox)) { // go down
24932                         path.push(node);
24933                         indexes.push(i);
24934                         i = 0;
24935                         parent = node;
24936                         node = node.children[0];
24937
24938                     } else if (parent) { // go right
24939                         i++;
24940                         node = parent.children[i];
24941                         goingUp = false;
24942
24943                     } else node = null; // nothing found
24944                 }
24945
24946                 return this;
24947             },
24948
24949             toBBox: function (item) { return item; },
24950
24951             compareMinX: compareNodeMinX,
24952             compareMinY: compareNodeMinY,
24953
24954             toJSON: function () { return this.data; },
24955
24956             fromJSON: function (data) {
24957                 this.data = data;
24958                 return this;
24959             },
24960
24961             _all: function (node, result) {
24962                 var nodesToSearch = [];
24963                 while (node) {
24964                     if (node.leaf) result.push.apply(result, node.children);
24965                     else nodesToSearch.push.apply(nodesToSearch, node.children);
24966
24967                     node = nodesToSearch.pop();
24968                 }
24969                 return result;
24970             },
24971
24972             _build: function (items, left, right, height) {
24973
24974                 var N = right - left + 1,
24975                     M = this._maxEntries,
24976                     node;
24977
24978                 if (N <= M) {
24979                     // reached leaf level; return leaf
24980                     node = createNode(items.slice(left, right + 1));
24981                     calcBBox(node, this.toBBox);
24982                     return node;
24983                 }
24984
24985                 if (!height) {
24986                     // target height of the bulk-loaded tree
24987                     height = Math.ceil(Math.log(N) / Math.log(M));
24988
24989                     // target number of root entries to maximize storage utilization
24990                     M = Math.ceil(N / Math.pow(M, height - 1));
24991                 }
24992
24993                 node = createNode([]);
24994                 node.leaf = false;
24995                 node.height = height;
24996
24997                 // split the items into M mostly square tiles
24998
24999                 var N2 = Math.ceil(N / M),
25000                     N1 = N2 * Math.ceil(Math.sqrt(M)),
25001                     i, j, right2, right3;
25002
25003                 multiSelect(items, left, right, N1, this.compareMinX);
25004
25005                 for (i = left; i <= right; i += N1) {
25006
25007                     right2 = Math.min(i + N1 - 1, right);
25008
25009                     multiSelect(items, i, right2, N2, this.compareMinY);
25010
25011                     for (j = i; j <= right2; j += N2) {
25012
25013                         right3 = Math.min(j + N2 - 1, right2);
25014
25015                         // pack each entry recursively
25016                         node.children.push(this._build(items, j, right3, height - 1));
25017                     }
25018                 }
25019
25020                 calcBBox(node, this.toBBox);
25021
25022                 return node;
25023             },
25024
25025             _chooseSubtree: function (bbox, node, level, path) {
25026
25027                 var i, len, child, targetNode, area, enlargement, minArea, minEnlargement;
25028
25029                 while (true) {
25030                     path.push(node);
25031
25032                     if (node.leaf || path.length - 1 === level) break;
25033
25034                     minArea = minEnlargement = Infinity;
25035
25036                     for (i = 0, len = node.children.length; i < len; i++) {
25037                         child = node.children[i];
25038                         area = bboxArea(child);
25039                         enlargement = enlargedArea(bbox, child) - area;
25040
25041                         // choose entry with the least area enlargement
25042                         if (enlargement < minEnlargement) {
25043                             minEnlargement = enlargement;
25044                             minArea = area < minArea ? area : minArea;
25045                             targetNode = child;
25046
25047                         } else if (enlargement === minEnlargement) {
25048                             // otherwise choose one with the smallest area
25049                             if (area < minArea) {
25050                                 minArea = area;
25051                                 targetNode = child;
25052                             }
25053                         }
25054                     }
25055
25056                     node = targetNode || node.children[0];
25057                 }
25058
25059                 return node;
25060             },
25061
25062             _insert: function (item, level, isNode) {
25063
25064                 var toBBox = this.toBBox,
25065                     bbox = isNode ? item : toBBox(item),
25066                     insertPath = [];
25067
25068                 // find the best node for accommodating the item, saving all nodes along the path too
25069                 var node = this._chooseSubtree(bbox, this.data, level, insertPath);
25070
25071                 // put the item into the node
25072                 node.children.push(item);
25073                 extend$1(node, bbox);
25074
25075                 // split on node overflow; propagate upwards if necessary
25076                 while (level >= 0) {
25077                     if (insertPath[level].children.length > this._maxEntries) {
25078                         this._split(insertPath, level);
25079                         level--;
25080                     } else break;
25081                 }
25082
25083                 // adjust bboxes along the insertion path
25084                 this._adjustParentBBoxes(bbox, insertPath, level);
25085             },
25086
25087             // split overflowed node into two
25088             _split: function (insertPath, level) {
25089
25090                 var node = insertPath[level],
25091                     M = node.children.length,
25092                     m = this._minEntries;
25093
25094                 this._chooseSplitAxis(node, m, M);
25095
25096                 var splitIndex = this._chooseSplitIndex(node, m, M);
25097
25098                 var newNode = createNode(node.children.splice(splitIndex, node.children.length - splitIndex));
25099                 newNode.height = node.height;
25100                 newNode.leaf = node.leaf;
25101
25102                 calcBBox(node, this.toBBox);
25103                 calcBBox(newNode, this.toBBox);
25104
25105                 if (level) insertPath[level - 1].children.push(newNode);
25106                 else this._splitRoot(node, newNode);
25107             },
25108
25109             _splitRoot: function (node, newNode) {
25110                 // split root node
25111                 this.data = createNode([node, newNode]);
25112                 this.data.height = node.height + 1;
25113                 this.data.leaf = false;
25114                 calcBBox(this.data, this.toBBox);
25115             },
25116
25117             _chooseSplitIndex: function (node, m, M) {
25118
25119                 var i, bbox1, bbox2, overlap, area, minOverlap, minArea, index;
25120
25121                 minOverlap = minArea = Infinity;
25122
25123                 for (i = m; i <= M - m; i++) {
25124                     bbox1 = distBBox(node, 0, i, this.toBBox);
25125                     bbox2 = distBBox(node, i, M, this.toBBox);
25126
25127                     overlap = intersectionArea(bbox1, bbox2);
25128                     area = bboxArea(bbox1) + bboxArea(bbox2);
25129
25130                     // choose distribution with minimum overlap
25131                     if (overlap < minOverlap) {
25132                         minOverlap = overlap;
25133                         index = i;
25134
25135                         minArea = area < minArea ? area : minArea;
25136
25137                     } else if (overlap === minOverlap) {
25138                         // otherwise choose distribution with minimum area
25139                         if (area < minArea) {
25140                             minArea = area;
25141                             index = i;
25142                         }
25143                     }
25144                 }
25145
25146                 return index;
25147             },
25148
25149             // sorts node children by the best axis for split
25150             _chooseSplitAxis: function (node, m, M) {
25151
25152                 var compareMinX = node.leaf ? this.compareMinX : compareNodeMinX,
25153                     compareMinY = node.leaf ? this.compareMinY : compareNodeMinY,
25154                     xMargin = this._allDistMargin(node, m, M, compareMinX),
25155                     yMargin = this._allDistMargin(node, m, M, compareMinY);
25156
25157                 // if total distributions margin value is minimal for x, sort by minX,
25158                 // otherwise it's already sorted by minY
25159                 if (xMargin < yMargin) node.children.sort(compareMinX);
25160             },
25161
25162             // total margin of all possible split distributions where each node is at least m full
25163             _allDistMargin: function (node, m, M, compare) {
25164
25165                 node.children.sort(compare);
25166
25167                 var toBBox = this.toBBox,
25168                     leftBBox = distBBox(node, 0, m, toBBox),
25169                     rightBBox = distBBox(node, M - m, M, toBBox),
25170                     margin = bboxMargin(leftBBox) + bboxMargin(rightBBox),
25171                     i, child;
25172
25173                 for (i = m; i < M - m; i++) {
25174                     child = node.children[i];
25175                     extend$1(leftBBox, node.leaf ? toBBox(child) : child);
25176                     margin += bboxMargin(leftBBox);
25177                 }
25178
25179                 for (i = M - m - 1; i >= m; i--) {
25180                     child = node.children[i];
25181                     extend$1(rightBBox, node.leaf ? toBBox(child) : child);
25182                     margin += bboxMargin(rightBBox);
25183                 }
25184
25185                 return margin;
25186             },
25187
25188             _adjustParentBBoxes: function (bbox, path, level) {
25189                 // adjust bboxes along the given tree path
25190                 for (var i = level; i >= 0; i--) {
25191                     extend$1(path[i], bbox);
25192                 }
25193             },
25194
25195             _condense: function (path) {
25196                 // go through the path, removing empty nodes and updating bboxes
25197                 for (var i = path.length - 1, siblings; i >= 0; i--) {
25198                     if (path[i].children.length === 0) {
25199                         if (i > 0) {
25200                             siblings = path[i - 1].children;
25201                             siblings.splice(siblings.indexOf(path[i]), 1);
25202
25203                         } else this.clear();
25204
25205                     } else calcBBox(path[i], this.toBBox);
25206                 }
25207             },
25208
25209             _initFormat: function (format) {
25210                 // data format (minX, minY, maxX, maxY accessors)
25211
25212                 // uses eval-type function compilation instead of just accepting a toBBox function
25213                 // because the algorithms are very sensitive to sorting functions performance,
25214                 // so they should be dead simple and without inner calls
25215
25216                 var compareArr = ['return a', ' - b', ';'];
25217
25218                 this.compareMinX = new Function('a', 'b', compareArr.join(format[0]));
25219                 this.compareMinY = new Function('a', 'b', compareArr.join(format[1]));
25220
25221                 this.toBBox = new Function('a',
25222                     'return {minX: a' + format[0] +
25223                     ', minY: a' + format[1] +
25224                     ', maxX: a' + format[2] +
25225                     ', maxY: a' + format[3] + '};');
25226             }
25227         };
25228
25229         function findItem(item, items, equalsFn) {
25230             if (!equalsFn) return items.indexOf(item);
25231
25232             for (var i = 0; i < items.length; i++) {
25233                 if (equalsFn(item, items[i])) return i;
25234             }
25235             return -1;
25236         }
25237
25238         // calculate node's bbox from bboxes of its children
25239         function calcBBox(node, toBBox) {
25240             distBBox(node, 0, node.children.length, toBBox, node);
25241         }
25242
25243         // min bounding rectangle of node children from k to p-1
25244         function distBBox(node, k, p, toBBox, destNode) {
25245             if (!destNode) destNode = createNode(null);
25246             destNode.minX = Infinity;
25247             destNode.minY = Infinity;
25248             destNode.maxX = -Infinity;
25249             destNode.maxY = -Infinity;
25250
25251             for (var i = k, child; i < p; i++) {
25252                 child = node.children[i];
25253                 extend$1(destNode, node.leaf ? toBBox(child) : child);
25254             }
25255
25256             return destNode;
25257         }
25258
25259         function extend$1(a, b) {
25260             a.minX = Math.min(a.minX, b.minX);
25261             a.minY = Math.min(a.minY, b.minY);
25262             a.maxX = Math.max(a.maxX, b.maxX);
25263             a.maxY = Math.max(a.maxY, b.maxY);
25264             return a;
25265         }
25266
25267         function compareNodeMinX(a, b) { return a.minX - b.minX; }
25268         function compareNodeMinY(a, b) { return a.minY - b.minY; }
25269
25270         function bboxArea(a)   { return (a.maxX - a.minX) * (a.maxY - a.minY); }
25271         function bboxMargin(a) { return (a.maxX - a.minX) + (a.maxY - a.minY); }
25272
25273         function enlargedArea(a, b) {
25274             return (Math.max(b.maxX, a.maxX) - Math.min(b.minX, a.minX)) *
25275                    (Math.max(b.maxY, a.maxY) - Math.min(b.minY, a.minY));
25276         }
25277
25278         function intersectionArea(a, b) {
25279             var minX = Math.max(a.minX, b.minX),
25280                 minY = Math.max(a.minY, b.minY),
25281                 maxX = Math.min(a.maxX, b.maxX),
25282                 maxY = Math.min(a.maxY, b.maxY);
25283
25284             return Math.max(0, maxX - minX) *
25285                    Math.max(0, maxY - minY);
25286         }
25287
25288         function contains$4(a, b) {
25289             return a.minX <= b.minX &&
25290                    a.minY <= b.minY &&
25291                    b.maxX <= a.maxX &&
25292                    b.maxY <= a.maxY;
25293         }
25294
25295         function intersects$1(a, b) {
25296             return b.minX <= a.maxX &&
25297                    b.minY <= a.maxY &&
25298                    b.maxX >= a.minX &&
25299                    b.maxY >= a.minY;
25300         }
25301
25302         function createNode(children) {
25303             return {
25304                 children: children,
25305                 height: 1,
25306                 leaf: true,
25307                 minX: Infinity,
25308                 minY: Infinity,
25309                 maxX: -Infinity,
25310                 maxY: -Infinity
25311             };
25312         }
25313
25314         // sort an array so that items come in groups of n unsorted items, with groups sorted between each other;
25315         // combines selection algorithm with binary divide & conquer approach
25316
25317         function multiSelect(arr, left, right, n, compare) {
25318             var stack = [left, right],
25319                 mid;
25320
25321             while (stack.length) {
25322                 right = stack.pop();
25323                 left = stack.pop();
25324
25325                 if (right - left <= n) continue;
25326
25327                 mid = left + Math.ceil((right - left) / n / 2) * n;
25328                 quickselect(arr, mid, left, right, compare);
25329
25330                 stack.push(left, mid, mid, right);
25331             }
25332         }
25333         rbush_1.default = default_1;
25334
25335         var lineclip_1 = lineclip;
25336
25337         lineclip.polyline = lineclip;
25338         lineclip.polygon = polygonclip;
25339
25340
25341         // Cohen-Sutherland line clippign algorithm, adapted to efficiently
25342         // handle polylines rather than just segments
25343
25344         function lineclip(points, bbox, result) {
25345
25346             var len = points.length,
25347                 codeA = bitCode(points[0], bbox),
25348                 part = [],
25349                 i, a, b, codeB, lastCode;
25350
25351             if (!result) result = [];
25352
25353             for (i = 1; i < len; i++) {
25354                 a = points[i - 1];
25355                 b = points[i];
25356                 codeB = lastCode = bitCode(b, bbox);
25357
25358                 while (true) {
25359
25360                     if (!(codeA | codeB)) { // accept
25361                         part.push(a);
25362
25363                         if (codeB !== lastCode) { // segment went outside
25364                             part.push(b);
25365
25366                             if (i < len - 1) { // start a new line
25367                                 result.push(part);
25368                                 part = [];
25369                             }
25370                         } else if (i === len - 1) {
25371                             part.push(b);
25372                         }
25373                         break;
25374
25375                     } else if (codeA & codeB) { // trivial reject
25376                         break;
25377
25378                     } else if (codeA) { // a outside, intersect with clip edge
25379                         a = intersect$1(a, b, codeA, bbox);
25380                         codeA = bitCode(a, bbox);
25381
25382                     } else { // b outside
25383                         b = intersect$1(a, b, codeB, bbox);
25384                         codeB = bitCode(b, bbox);
25385                     }
25386                 }
25387
25388                 codeA = lastCode;
25389             }
25390
25391             if (part.length) result.push(part);
25392
25393             return result;
25394         }
25395
25396         // Sutherland-Hodgeman polygon clipping algorithm
25397
25398         function polygonclip(points, bbox) {
25399
25400             var result, edge, prev, prevInside, i, p, inside;
25401
25402             // clip against each side of the clip rectangle
25403             for (edge = 1; edge <= 8; edge *= 2) {
25404                 result = [];
25405                 prev = points[points.length - 1];
25406                 prevInside = !(bitCode(prev, bbox) & edge);
25407
25408                 for (i = 0; i < points.length; i++) {
25409                     p = points[i];
25410                     inside = !(bitCode(p, bbox) & edge);
25411
25412                     // if segment goes through the clip window, add an intersection
25413                     if (inside !== prevInside) result.push(intersect$1(prev, p, edge, bbox));
25414
25415                     if (inside) result.push(p); // add a point if it's inside
25416
25417                     prev = p;
25418                     prevInside = inside;
25419                 }
25420
25421                 points = result;
25422
25423                 if (!points.length) break;
25424             }
25425
25426             return result;
25427         }
25428
25429         // intersect a segment against one of the 4 lines that make up the bbox
25430
25431         function intersect$1(a, b, edge, bbox) {
25432             return edge & 8 ? [a[0] + (b[0] - a[0]) * (bbox[3] - a[1]) / (b[1] - a[1]), bbox[3]] : // top
25433                    edge & 4 ? [a[0] + (b[0] - a[0]) * (bbox[1] - a[1]) / (b[1] - a[1]), bbox[1]] : // bottom
25434                    edge & 2 ? [bbox[2], a[1] + (b[1] - a[1]) * (bbox[2] - a[0]) / (b[0] - a[0])] : // right
25435                    edge & 1 ? [bbox[0], a[1] + (b[1] - a[1]) * (bbox[0] - a[0]) / (b[0] - a[0])] : // left
25436                    null;
25437         }
25438
25439         // bit code reflects the point position relative to the bbox:
25440
25441         //         left  mid  right
25442         //    top  1001  1000  1010
25443         //    mid  0001  0000  0010
25444         // bottom  0101  0100  0110
25445
25446         function bitCode(p, bbox) {
25447             var code = 0;
25448
25449             if (p[0] < bbox[0]) code |= 1; // left
25450             else if (p[0] > bbox[2]) code |= 2; // right
25451
25452             if (p[1] < bbox[1]) code |= 4; // bottom
25453             else if (p[1] > bbox[3]) code |= 8; // top
25454
25455             return code;
25456         }
25457
25458         var whichPolygon_1 = whichPolygon;
25459
25460         function whichPolygon(data) {
25461             var bboxes = [];
25462             for (var i = 0; i < data.features.length; i++) {
25463                 var feature = data.features[i];
25464                 var coords = feature.geometry.coordinates;
25465
25466                 if (feature.geometry.type === 'Polygon') {
25467                     bboxes.push(treeItem(coords, feature.properties));
25468
25469                 } else if (feature.geometry.type === 'MultiPolygon') {
25470                     for (var j = 0; j < coords.length; j++) {
25471                         bboxes.push(treeItem(coords[j], feature.properties));
25472                     }
25473                 }
25474             }
25475
25476             var tree = rbush_1().load(bboxes);
25477
25478             function query(p, multi) {
25479                 var output = [],
25480                     result = tree.search({
25481                         minX: p[0],
25482                         minY: p[1],
25483                         maxX: p[0],
25484                         maxY: p[1]
25485                     });
25486                 for (var i = 0; i < result.length; i++) {
25487                     if (insidePolygon(result[i].coords, p)) {
25488                         if (multi)
25489                             output.push(result[i].props);
25490                         else
25491                             return result[i].props;
25492                     }
25493                 }
25494                 return multi && output.length ? output : null;
25495             }
25496
25497             query.tree = tree;
25498             query.bbox = function queryBBox(bbox) {
25499                 var output = [];
25500                 var result = tree.search({
25501                     minX: bbox[0],
25502                     minY: bbox[1],
25503                     maxX: bbox[2],
25504                     maxY: bbox[3]
25505                 });
25506                 for (var i = 0; i < result.length; i++) {
25507                     if (polygonIntersectsBBox(result[i].coords, bbox)) {
25508                         output.push(result[i].props);
25509                     }
25510                 }
25511                 return output;
25512             };
25513
25514             return query;
25515         }
25516
25517         function polygonIntersectsBBox(polygon, bbox) {
25518             var bboxCenter = [
25519                 (bbox[0] + bbox[2]) / 2,
25520                 (bbox[1] + bbox[3]) / 2
25521             ];
25522             if (insidePolygon(polygon, bboxCenter)) return true;
25523             for (var i = 0; i < polygon.length; i++) {
25524                 if (lineclip_1(polygon[i], bbox).length > 0) return true;
25525             }
25526             return false;
25527         }
25528
25529         // ray casting algorithm for detecting if point is in polygon
25530         function insidePolygon(rings, p) {
25531             var inside = false;
25532             for (var i = 0, len = rings.length; i < len; i++) {
25533                 var ring = rings[i];
25534                 for (var j = 0, len2 = ring.length, k = len2 - 1; j < len2; k = j++) {
25535                     if (rayIntersect(p, ring[j], ring[k])) inside = !inside;
25536                 }
25537             }
25538             return inside;
25539         }
25540
25541         function rayIntersect(p, p1, p2) {
25542             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]);
25543         }
25544
25545         function treeItem(coords, props) {
25546             var item = {
25547                 minX: Infinity,
25548                 minY: Infinity,
25549                 maxX: -Infinity,
25550                 maxY: -Infinity,
25551                 coords: coords,
25552                 props: props
25553             };
25554
25555             for (var i = 0; i < coords[0].length; i++) {
25556                 var p = coords[0][i];
25557                 item.minX = Math.min(item.minX, p[0]);
25558                 item.minY = Math.min(item.minY, p[1]);
25559                 item.maxX = Math.max(item.maxX, p[0]);
25560                 item.maxY = Math.max(item.maxY, p[1]);
25561             }
25562             return item;
25563         }
25564
25565         // index the osm-community-index
25566         var ociFeatureCollection = Object.values(features$2).map(function(feature) {
25567             // workaround for which-polygon: only supports `properties`, not `id`
25568             // https://github.com/mapbox/which-polygon/pull/6
25569             feature.properties = {
25570                 id: feature.id,
25571                 area: d3_geoArea(feature)   // also precompute areas
25572             };
25573             return feature;
25574         });
25575
25576
25577         var data = {
25578             community: {
25579                 features: features$2,
25580                 resources: resources,
25581                 query: whichPolygon_1({
25582                     type: 'FeatureCollection',
25583                     features: ociFeatureCollection
25584                 })
25585             },
25586             imagery: dataImagery,  //legacy
25587             presets: {
25588                 presets: presets,
25589                 defaults: defaults,
25590                 categories: categories,
25591                 fields: fields
25592             }
25593         };
25594
25595         // http://2ality.com/2015/01/es6-set-operations.html
25596
25597         // Difference (a \ b): create a set that contains those elements of set a that are not in set b.
25598         // This operation is also sometimes called minus (-).
25599         // var a = [1,2,3];
25600         // var b = [4,3,2];
25601         // utilArrayDifference(a, b)
25602         //   [1]
25603         // utilArrayDifference(b, a)
25604         //   [4]
25605         function utilArrayDifference(a, b) {
25606             var other = new Set(b);
25607             return Array.from(new Set(a))
25608                 .filter(function(v) { return !other.has(v); });
25609         }
25610
25611         // Intersection (a ∩ b): create a set that contains those elements of set a that are also in set b.
25612         // var a = [1,2,3];
25613         // var b = [4,3,2];
25614         // utilArrayIntersection(a, b)
25615         //   [2,3]
25616         function utilArrayIntersection(a, b) {
25617             var other = new Set(b);
25618             return Array.from(new Set(a))
25619                 .filter(function(v) { return other.has(v); });
25620         }
25621
25622         // Union (a ∪ b): create a set that contains the elements of both set a and set b.
25623         // var a = [1,2,3];
25624         // var b = [4,3,2];
25625         // utilArrayUnion(a, b)
25626         //   [1,2,3,4]
25627         function utilArrayUnion(a, b) {
25628             var result = new Set(a);
25629             b.forEach(function(v) { result.add(v); });
25630             return Array.from(result);
25631         }
25632
25633         // Returns an Array with all the duplicates removed
25634         // var a = [1,1,2,3,3];
25635         // utilArrayUniq(a)
25636         //   [1,2,3]
25637         function utilArrayUniq(a) {
25638             return Array.from(new Set(a));
25639         }
25640
25641
25642         // Splits array into chunks of given chunk size
25643         // var a = [1,2,3,4,5,6,7];
25644         // utilArrayChunk(a, 3);
25645         //   [[1,2,3],[4,5,6],[7]];
25646         function utilArrayChunk(a, chunkSize) {
25647             if (!chunkSize || chunkSize < 0) return [a.slice()];
25648
25649             var result = new Array(Math.ceil(a.length / chunkSize));
25650             return Array.from(result, function(item, i) {
25651                 return a.slice(i * chunkSize, i * chunkSize + chunkSize);
25652             });
25653         }
25654
25655
25656         // Flattens two level array into a single level
25657         // var a = [[1,2,3],[4,5,6],[7]];
25658         // utilArrayFlatten(a);
25659         //   [1,2,3,4,5,6,7];
25660         function utilArrayFlatten(a) {
25661             return a.reduce(function(acc, val) {
25662                 return acc.concat(val);
25663             }, []);
25664         }
25665
25666
25667         // Groups the items of the Array according to the given key
25668         // `key` can be passed as a property or as a key function
25669         //
25670         // var pets = [
25671         //     { type: 'Dog', name: 'Spot' },
25672         //     { type: 'Cat', name: 'Tiger' },
25673         //     { type: 'Dog', name: 'Rover' },
25674         //     { type: 'Cat', name: 'Leo' }
25675         // ];
25676         //
25677         // utilArrayGroupBy(pets, 'type')
25678         //   {
25679         //     'Dog': [{type: 'Dog', name: 'Spot'}, {type: 'Dog', name: 'Rover'}],
25680         //     'Cat': [{type: 'Cat', name: 'Tiger'}, {type: 'Cat', name: 'Leo'}]
25681         //   }
25682         //
25683         // utilArrayGroupBy(pets, function(item) { return item.name.length; })
25684         //   {
25685         //     3: [{type: 'Cat', name: 'Leo'}],
25686         //     4: [{type: 'Dog', name: 'Spot'}],
25687         //     5: [{type: 'Cat', name: 'Tiger'}, {type: 'Dog', name: 'Rover'}]
25688         //   }
25689         function utilArrayGroupBy(a, key) {
25690             return a.reduce(function(acc, item) {
25691                 var group = (typeof key === 'function') ? key(item) : item[key];
25692                 (acc[group] = acc[group] || []).push(item);
25693                 return acc;
25694             }, {});
25695         }
25696
25697
25698         // Returns an Array with all the duplicates removed
25699         // where uniqueness determined by the given key
25700         // `key` can be passed as a property or as a key function
25701         //
25702         // var pets = [
25703         //     { type: 'Dog', name: 'Spot' },
25704         //     { type: 'Cat', name: 'Tiger' },
25705         //     { type: 'Dog', name: 'Rover' },
25706         //     { type: 'Cat', name: 'Leo' }
25707         // ];
25708         //
25709         // utilArrayUniqBy(pets, 'type')
25710         //   [
25711         //     { type: 'Dog', name: 'Spot' },
25712         //     { type: 'Cat', name: 'Tiger' }
25713         //   ]
25714         //
25715         // utilArrayUniqBy(pets, function(item) { return item.name.length; })
25716         //   [
25717         //     { type: 'Dog', name: 'Spot' },
25718         //     { type: 'Cat', name: 'Tiger' },
25719         //     { type: 'Cat', name: 'Leo' }
25720         //   }
25721         function utilArrayUniqBy(a, key) {
25722             var seen = new Set();
25723             return a.reduce(function(acc, item) {
25724                 var val = (typeof key === 'function') ? key(item) : item[key];
25725                 if (val && !seen.has(val)) {
25726                     seen.add(val);
25727                     acc.push(item);
25728                 }
25729                 return acc;
25730             }, []);
25731         }
25732
25733         var remove$1 = removeDiacritics;
25734
25735         var replacementList = [
25736           {
25737             base: ' ',
25738             chars: "\u00A0",
25739           }, {
25740             base: '0',
25741             chars: "\u07C0",
25742           }, {
25743             base: 'A',
25744             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",
25745           }, {
25746             base: 'AA',
25747             chars: "\uA732",
25748           }, {
25749             base: 'AE',
25750             chars: "\u00C6\u01FC\u01E2",
25751           }, {
25752             base: 'AO',
25753             chars: "\uA734",
25754           }, {
25755             base: 'AU',
25756             chars: "\uA736",
25757           }, {
25758             base: 'AV',
25759             chars: "\uA738\uA73A",
25760           }, {
25761             base: 'AY',
25762             chars: "\uA73C",
25763           }, {
25764             base: 'B',
25765             chars: "\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0181",
25766           }, {
25767             base: 'C',
25768             chars: "\u24b8\uff23\uA73E\u1E08\u0106\u0043\u0108\u010A\u010C\u00C7\u0187\u023B",
25769           }, {
25770             base: 'D',
25771             chars: "\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018A\u0189\u1D05\uA779",
25772           }, {
25773             base: 'Dh',
25774             chars: "\u00D0",
25775           }, {
25776             base: 'DZ',
25777             chars: "\u01F1\u01C4",
25778           }, {
25779             base: 'Dz',
25780             chars: "\u01F2\u01C5",
25781           }, {
25782             base: 'E',
25783             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",
25784           }, {
25785             base: 'F',
25786             chars: "\uA77C\u24BB\uFF26\u1E1E\u0191\uA77B",
25787           }, {
25788             base: 'G',
25789             chars: "\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E\u0262",
25790           }, {
25791             base: 'H',
25792             chars: "\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D",
25793           }, {
25794             base: 'I',
25795             chars: "\u24BE\uFF29\xCC\xCD\xCE\u0128\u012A\u012C\u0130\xCF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197",
25796           }, {
25797             base: 'J',
25798             chars: "\u24BF\uFF2A\u0134\u0248\u0237",
25799           }, {
25800             base: 'K',
25801             chars: "\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2",
25802           }, {
25803             base: 'L',
25804             chars: "\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780",
25805           }, {
25806             base: 'LJ',
25807             chars: "\u01C7",
25808           }, {
25809             base: 'Lj',
25810             chars: "\u01C8",
25811           }, {
25812             base: 'M',
25813             chars: "\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C\u03FB",
25814           }, {
25815             base: 'N',
25816             chars: "\uA7A4\u0220\u24C3\uFF2E\u01F8\u0143\xD1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u019D\uA790\u1D0E",
25817           }, {
25818             base: 'NJ',
25819             chars: "\u01CA",
25820           }, {
25821             base: 'Nj',
25822             chars: "\u01CB",
25823           }, {
25824             base: 'O',
25825             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",
25826           }, {
25827             base: 'OE',
25828             chars: "\u0152",
25829           }, {
25830             base: 'OI',
25831             chars: "\u01A2",
25832           }, {
25833             base: 'OO',
25834             chars: "\uA74E",
25835           }, {
25836             base: 'OU',
25837             chars: "\u0222",
25838           }, {
25839             base: 'P',
25840             chars: "\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754",
25841           }, {
25842             base: 'Q',
25843             chars: "\u24C6\uFF31\uA756\uA758\u024A",
25844           }, {
25845             base: 'R',
25846             chars: "\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782",
25847           }, {
25848             base: 'S',
25849             chars: "\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784",
25850           }, {
25851             base: 'T',
25852             chars: "\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786",
25853           }, {
25854             base: 'Th',
25855             chars: "\u00DE",
25856           }, {
25857             base: 'TZ',
25858             chars: "\uA728",
25859           }, {
25860             base: 'U',
25861             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",
25862           }, {
25863             base: 'V',
25864             chars: "\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245",
25865           }, {
25866             base: 'VY',
25867             chars: "\uA760",
25868           }, {
25869             base: 'W',
25870             chars: "\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72",
25871           }, {
25872             base: 'X',
25873             chars: "\u24CD\uFF38\u1E8A\u1E8C",
25874           }, {
25875             base: 'Y',
25876             chars: "\u24CE\uFF39\u1EF2\xDD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE",
25877           }, {
25878             base: 'Z',
25879             chars: "\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762",
25880           }, {
25881             base: 'a',
25882             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",
25883           }, {
25884             base: 'aa',
25885             chars: "\uA733",
25886           }, {
25887             base: 'ae',
25888             chars: "\u00E6\u01FD\u01E3",
25889           }, {
25890             base: 'ao',
25891             chars: "\uA735",
25892           }, {
25893             base: 'au',
25894             chars: "\uA737",
25895           }, {
25896             base: 'av',
25897             chars: "\uA739\uA73B",
25898           }, {
25899             base: 'ay',
25900             chars: "\uA73D",
25901           }, {
25902             base: 'b',
25903             chars: "\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253\u0182",
25904           }, {
25905             base: 'c',
25906             chars: "\uFF43\u24D2\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184",
25907           }, {
25908             base: 'd',
25909             chars: "\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\u018B\u13E7\u0501\uA7AA",
25910           }, {
25911             base: 'dh',
25912             chars: "\u00F0",
25913           }, {
25914             base: 'dz',
25915             chars: "\u01F3\u01C6",
25916           }, {
25917             base: 'e',
25918             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",
25919           }, {
25920             base: 'f',
25921             chars: "\u24D5\uFF46\u1E1F\u0192",
25922           }, {
25923             base: 'ff',
25924             chars: "\uFB00",
25925           }, {
25926             base: 'fi',
25927             chars: "\uFB01",
25928           }, {
25929             base: 'fl',
25930             chars: "\uFB02",
25931           }, {
25932             base: 'ffi',
25933             chars: "\uFB03",
25934           }, {
25935             base: 'ffl',
25936             chars: "\uFB04",
25937           }, {
25938             base: 'g',
25939             chars: "\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\uA77F\u1D79",
25940           }, {
25941             base: 'h',
25942             chars: "\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265",
25943           }, {
25944             base: 'hv',
25945             chars: "\u0195",
25946           }, {
25947             base: 'i',
25948             chars: "\u24D8\uFF49\xEC\xED\xEE\u0129\u012B\u012D\xEF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131",
25949           }, {
25950             base: 'j',
25951             chars: "\u24D9\uFF4A\u0135\u01F0\u0249",
25952           }, {
25953             base: 'k',
25954             chars: "\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3",
25955           }, {
25956             base: 'l',
25957             chars: "\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747\u026D",
25958           }, {
25959             base: 'lj',
25960             chars: "\u01C9",
25961           }, {
25962             base: 'm',
25963             chars: "\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F",
25964           }, {
25965             base: 'n',
25966             chars: "\u24DD\uFF4E\u01F9\u0144\xF1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5\u043B\u0509",
25967           }, {
25968             base: 'nj',
25969             chars: "\u01CC",
25970           }, {
25971             base: 'o',
25972             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",
25973           }, {
25974             base: 'oe',
25975             chars: "\u0153",
25976           }, {
25977             base: 'oi',
25978             chars: "\u01A3",
25979           }, {
25980             base: 'oo',
25981             chars: "\uA74F",
25982           }, {
25983             base: 'ou',
25984             chars: "\u0223",
25985           }, {
25986             base: 'p',
25987             chars: "\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755\u03C1",
25988           }, {
25989             base: 'q',
25990             chars: "\u24E0\uFF51\u024B\uA757\uA759",
25991           }, {
25992             base: 'r',
25993             chars: "\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783",
25994           }, {
25995             base: 's',
25996             chars: "\u24E2\uFF53\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B\u0282",
25997           }, {
25998             base: 'ss',
25999             chars: "\xDF",
26000           }, {
26001             base: 't',
26002             chars: "\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787",
26003           }, {
26004             base: 'th',
26005             chars: "\u00FE",
26006           }, {
26007             base: 'tz',
26008             chars: "\uA729",
26009           }, {
26010             base: 'u',
26011             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",
26012           }, {
26013             base: 'v',
26014             chars: "\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C",
26015           }, {
26016             base: 'vy',
26017             chars: "\uA761",
26018           }, {
26019             base: 'w',
26020             chars: "\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73",
26021           }, {
26022             base: 'x',
26023             chars: "\u24E7\uFF58\u1E8B\u1E8D",
26024           }, {
26025             base: 'y',
26026             chars: "\u24E8\uFF59\u1EF3\xFD\u0177\u1EF9\u0233\u1E8F\xFF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF",
26027           }, {
26028             base: 'z',
26029             chars: "\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763",
26030           }
26031         ];
26032
26033         var diacriticsMap = {};
26034         for (var i$1 = 0; i$1 < replacementList.length; i$1 += 1) {
26035           var chars = replacementList[i$1].chars;
26036           for (var j = 0; j < chars.length; j += 1) {
26037             diacriticsMap[chars[j]] = replacementList[i$1].base;
26038           }
26039         }
26040
26041         function removeDiacritics(str) {
26042           return str.replace(/[^\u0000-\u007e]/g, function(c) {
26043             return diacriticsMap[c] || c;
26044           });
26045         }
26046
26047         var replacementList_1 = replacementList;
26048         var diacriticsMap_1 = diacriticsMap;
26049
26050         var diacritics = {
26051                 remove: remove$1,
26052                 replacementList: replacementList_1,
26053                 diacriticsMap: diacriticsMap_1
26054         };
26055
26056         var isArabic_1 = createCommonjsModule(function (module, exports) {
26057         Object.defineProperty(exports, "__esModule", { value: true });
26058         var arabicBlocks = [
26059             [0x0600, 0x06FF],
26060             [0x0750, 0x077F],
26061             [0x08A0, 0x08FF],
26062             [0xFB50, 0xFDFF],
26063             [0xFE70, 0xFEFF],
26064             [0x10E60, 0x10E7F],
26065             [0x1EC70, 0x1ECBF],
26066             [0x1EE00, 0x1EEFF] // Mathematical Alphabetic symbols https://www.unicode.org/charts/PDF/U1EE00.pdf
26067         ];
26068         function isArabic(char) {
26069             if (char.length > 1) {
26070                 // allow the newer chars?
26071                 throw new Error('isArabic works on only one-character strings');
26072             }
26073             var code = char.charCodeAt(0);
26074             for (var i = 0; i < arabicBlocks.length; i++) {
26075                 var block = arabicBlocks[i];
26076                 if (code >= block[0] && code <= block[1]) {
26077                     return true;
26078                 }
26079             }
26080             return false;
26081         }
26082         exports.isArabic = isArabic;
26083         function isMath(char) {
26084             if (char.length > 2) {
26085                 // allow the newer chars?
26086                 throw new Error('isMath works on only one-character strings');
26087             }
26088             var code = char.charCodeAt(0);
26089             return (code >= 0x660 && code <= 0x66C);
26090         }
26091         exports.isMath = isMath;
26092         });
26093
26094         unwrapExports(isArabic_1);
26095         var isArabic_2 = isArabic_1.isArabic;
26096         var isArabic_3 = isArabic_1.isMath;
26097
26098         var unicodeArabic = createCommonjsModule(function (module, exports) {
26099         Object.defineProperty(exports, "__esModule", { value: true });
26100         var arabicReference = {
26101             "alef": {
26102                 "normal": [
26103                     "\u0627"
26104                 ],
26105                 "madda_above": {
26106                     "normal": [
26107                         "\u0627\u0653",
26108                         "\u0622"
26109                     ],
26110                     "isolated": "\uFE81",
26111                     "final": "\uFE82"
26112                 },
26113                 "hamza_above": {
26114                     "normal": [
26115                         "\u0627\u0654",
26116                         "\u0623"
26117                     ],
26118                     "isolated": "\uFE83",
26119                     "final": "\uFE84"
26120                 },
26121                 "hamza_below": {
26122                     "normal": [
26123                         "\u0627\u0655",
26124                         "\u0625"
26125                     ],
26126                     "isolated": "\uFE87",
26127                     "final": "\uFE88"
26128                 },
26129                 "wasla": {
26130                     "normal": "\u0671",
26131                     "isolated": "\uFB50",
26132                     "final": "\uFB51"
26133                 },
26134                 "wavy_hamza_above": [
26135                     "\u0672"
26136                 ],
26137                 "wavy_hamza_below": [
26138                     "\u0627\u065F",
26139                     "\u0673"
26140                 ],
26141                 "high_hamza": [
26142                     "\u0675",
26143                     "\u0627\u0674"
26144                 ],
26145                 "indic_two_above": [
26146                     "\u0773"
26147                 ],
26148                 "indic_three_above": [
26149                     "\u0774"
26150                 ],
26151                 "fathatan": {
26152                     "normal": [
26153                         "\u0627\u064B"
26154                     ],
26155                     "final": "\uFD3C",
26156                     "isolated": "\uFD3D"
26157                 },
26158                 "isolated": "\uFE8D",
26159                 "final": "\uFE8E"
26160             },
26161             "beh": {
26162                 "normal": [
26163                     "\u0628"
26164                 ],
26165                 "dotless": [
26166                     "\u066E"
26167                 ],
26168                 "three_dots_horizontally_below": [
26169                     "\u0750"
26170                 ],
26171                 "dot_below_three_dots_above": [
26172                     "\u0751"
26173                 ],
26174                 "three_dots_pointing_upwards_below": [
26175                     "\u0752"
26176                 ],
26177                 "three_dots_pointing_upwards_below_two_dots_above": [
26178                     "\u0753"
26179                 ],
26180                 "two_dots_below_dot_above": [
26181                     "\u0754"
26182                 ],
26183                 "inverted_small_v_below": [
26184                     "\u0755"
26185                 ],
26186                 "small_v": [
26187                     "\u0756"
26188                 ],
26189                 "small_v_below": [
26190                     "\u08A0"
26191                 ],
26192                 "hamza_above": [
26193                     "\u08A1"
26194                 ],
26195                 "small_meem_above": [
26196                     "\u08B6"
26197                 ],
26198                 "isolated": "\uFE8F",
26199                 "final": "\uFE90",
26200                 "initial": "\uFE91",
26201                 "medial": "\uFE92"
26202             },
26203             "teh marbuta": {
26204                 "normal": [
26205                     "\u0629"
26206                 ],
26207                 "isolated": "\uFE93",
26208                 "final": "\uFE94"
26209             },
26210             "teh": {
26211                 "normal": [
26212                     "\u062A"
26213                 ],
26214                 "ring": [
26215                     "\u067C"
26216                 ],
26217                 "three_dots_above_downwards": [
26218                     "\u067D"
26219                 ],
26220                 "small_teh_above": [
26221                     "\u08B8"
26222                 ],
26223                 "isolated": "\uFE95",
26224                 "final": "\uFE96",
26225                 "initial": "\uFE97",
26226                 "medial": "\uFE98"
26227             },
26228             "theh": {
26229                 "normal": [
26230                     "\u062B"
26231                 ],
26232                 "isolated": "\uFE99",
26233                 "final": "\uFE9A",
26234                 "initial": "\uFE9B",
26235                 "medial": "\uFE9C"
26236             },
26237             "jeem": {
26238                 "normal": [
26239                     "\u062C"
26240                 ],
26241                 "two_dots_above": [
26242                     "\u08A2"
26243                 ],
26244                 "isolated": "\uFE9D",
26245                 "final": "\uFE9E",
26246                 "initial": "\uFE9F",
26247                 "medial": "\uFEA0"
26248             },
26249             "hah": {
26250                 "normal": [
26251                     "\u062D"
26252                 ],
26253                 "hamza_above": [
26254                     "\u0681"
26255                 ],
26256                 "two_dots_vertical_above": [
26257                     "\u0682"
26258                 ],
26259                 "three_dots_above": [
26260                     "\u0685"
26261                 ],
26262                 "two_dots_above": [
26263                     "\u0757"
26264                 ],
26265                 "three_dots_pointing_upwards_below": [
26266                     "\u0758"
26267                 ],
26268                 "small_tah_below": [
26269                     "\u076E"
26270                 ],
26271                 "small_tah_two_dots": [
26272                     "\u076F"
26273                 ],
26274                 "small_tah_above": [
26275                     "\u0772"
26276                 ],
26277                 "indic_four_below": [
26278                     "\u077C"
26279                 ],
26280                 "isolated": "\uFEA1",
26281                 "final": "\uFEA2",
26282                 "initial": "\uFEA3",
26283                 "medial": "\uFEA4"
26284             },
26285             "khah": {
26286                 "normal": [
26287                     "\u062E"
26288                 ],
26289                 "isolated": "\uFEA5",
26290                 "final": "\uFEA6",
26291                 "initial": "\uFEA7",
26292                 "medial": "\uFEA8"
26293             },
26294             "dal": {
26295                 "normal": [
26296                     "\u062F"
26297                 ],
26298                 "ring": [
26299                     "\u0689"
26300                 ],
26301                 "dot_below": [
26302                     "\u068A"
26303                 ],
26304                 "dot_below_small_tah": [
26305                     "\u068B"
26306                 ],
26307                 "three_dots_above_downwards": [
26308                     "\u068F"
26309                 ],
26310                 "four_dots_above": [
26311                     "\u0690"
26312                 ],
26313                 "inverted_v": [
26314                     "\u06EE"
26315                 ],
26316                 "two_dots_vertically_below_small_tah": [
26317                     "\u0759"
26318                 ],
26319                 "inverted_small_v_below": [
26320                     "\u075A"
26321                 ],
26322                 "three_dots_below": [
26323                     "\u08AE"
26324                 ],
26325                 "isolated": "\uFEA9",
26326                 "final": "\uFEAA"
26327             },
26328             "thal": {
26329                 "normal": [
26330                     "\u0630"
26331                 ],
26332                 "isolated": "\uFEAB",
26333                 "final": "\uFEAC"
26334             },
26335             "reh": {
26336                 "normal": [
26337                     "\u0631"
26338                 ],
26339                 "small_v": [
26340                     "\u0692"
26341                 ],
26342                 "ring": [
26343                     "\u0693"
26344                 ],
26345                 "dot_below": [
26346                     "\u0694"
26347                 ],
26348                 "small_v_below": [
26349                     "\u0695"
26350                 ],
26351                 "dot_below_dot_above": [
26352                     "\u0696"
26353                 ],
26354                 "two_dots_above": [
26355                     "\u0697"
26356                 ],
26357                 "four_dots_above": [
26358                     "\u0699"
26359                 ],
26360                 "inverted_v": [
26361                     "\u06EF"
26362                 ],
26363                 "stroke": [
26364                     "\u075B"
26365                 ],
26366                 "two_dots_vertically_above": [
26367                     "\u076B"
26368                 ],
26369                 "hamza_above": [
26370                     "\u076C"
26371                 ],
26372                 "small_tah_two_dots": [
26373                     "\u0771"
26374                 ],
26375                 "loop": [
26376                     "\u08AA"
26377                 ],
26378                 "small_noon_above": [
26379                     "\u08B9"
26380                 ],
26381                 "isolated": "\uFEAD",
26382                 "final": "\uFEAE"
26383             },
26384             "zain": {
26385                 "normal": [
26386                     "\u0632"
26387                 ],
26388                 "inverted_v_above": [
26389                     "\u08B2"
26390                 ],
26391                 "isolated": "\uFEAF",
26392                 "final": "\uFEB0"
26393             },
26394             "seen": {
26395                 "normal": [
26396                     "\u0633"
26397                 ],
26398                 "dot_below_dot_above": [
26399                     "\u069A"
26400                 ],
26401                 "three_dots_below": [
26402                     "\u069B"
26403                 ],
26404                 "three_dots_below_three_dots_above": [
26405                     "\u069C"
26406                 ],
26407                 "four_dots_above": [
26408                     "\u075C"
26409                 ],
26410                 "two_dots_vertically_above": [
26411                     "\u076D"
26412                 ],
26413                 "small_tah_two_dots": [
26414                     "\u0770"
26415                 ],
26416                 "indic_four_above": [
26417                     "\u077D"
26418                 ],
26419                 "inverted_v": [
26420                     "\u077E"
26421                 ],
26422                 "isolated": "\uFEB1",
26423                 "final": "\uFEB2",
26424                 "initial": "\uFEB3",
26425                 "medial": "\uFEB4"
26426             },
26427             "sheen": {
26428                 "normal": [
26429                     "\u0634"
26430                 ],
26431                 "dot_below": [
26432                     "\u06FA"
26433                 ],
26434                 "isolated": "\uFEB5",
26435                 "final": "\uFEB6",
26436                 "initial": "\uFEB7",
26437                 "medial": "\uFEB8"
26438             },
26439             "sad": {
26440                 "normal": [
26441                     "\u0635"
26442                 ],
26443                 "two_dots_below": [
26444                     "\u069D"
26445                 ],
26446                 "three_dots_above": [
26447                     "\u069E"
26448                 ],
26449                 "three_dots_below": [
26450                     "\u08AF"
26451                 ],
26452                 "isolated": "\uFEB9",
26453                 "final": "\uFEBA",
26454                 "initial": "\uFEBB",
26455                 "medial": "\uFEBC"
26456             },
26457             "dad": {
26458                 "normal": [
26459                     "\u0636"
26460                 ],
26461                 "dot_below": [
26462                     "\u06FB"
26463                 ],
26464                 "isolated": "\uFEBD",
26465                 "final": "\uFEBE",
26466                 "initial": "\uFEBF",
26467                 "medial": "\uFEC0"
26468             },
26469             "tah": {
26470                 "normal": [
26471                     "\u0637"
26472                 ],
26473                 "three_dots_above": [
26474                     "\u069F"
26475                 ],
26476                 "two_dots_above": [
26477                     "\u08A3"
26478                 ],
26479                 "isolated": "\uFEC1",
26480                 "final": "\uFEC2",
26481                 "initial": "\uFEC3",
26482                 "medial": "\uFEC4"
26483             },
26484             "zah": {
26485                 "normal": [
26486                     "\u0638"
26487                 ],
26488                 "isolated": "\uFEC5",
26489                 "final": "\uFEC6",
26490                 "initial": "\uFEC7",
26491                 "medial": "\uFEC8"
26492             },
26493             "ain": {
26494                 "normal": [
26495                     "\u0639"
26496                 ],
26497                 "three_dots_above": [
26498                     "\u06A0"
26499                 ],
26500                 "two_dots_above": [
26501                     "\u075D"
26502                 ],
26503                 "three_dots_pointing_downwards_above": [
26504                     "\u075E"
26505                 ],
26506                 "two_dots_vertically_above": [
26507                     "\u075F"
26508                 ],
26509                 "three_dots_below": [
26510                     "\u08B3"
26511                 ],
26512                 "isolated": "\uFEC9",
26513                 "final": "\uFECA",
26514                 "initial": "\uFECB",
26515                 "medial": "\uFECC"
26516             },
26517             "ghain": {
26518                 "normal": [
26519                     "\u063A"
26520                 ],
26521                 "dot_below": [
26522                     "\u06FC"
26523                 ],
26524                 "isolated": "\uFECD",
26525                 "final": "\uFECE",
26526                 "initial": "\uFECF",
26527                 "medial": "\uFED0"
26528             },
26529             "feh": {
26530                 "normal": [
26531                     "\u0641"
26532                 ],
26533                 "dotless": [
26534                     "\u06A1"
26535                 ],
26536                 "dot_moved_below": [
26537                     "\u06A2"
26538                 ],
26539                 "dot_below": [
26540                     "\u06A3"
26541                 ],
26542                 "three_dots_below": [
26543                     "\u06A5"
26544                 ],
26545                 "two_dots_below": [
26546                     "\u0760"
26547                 ],
26548                 "three_dots_pointing_upwards_below": [
26549                     "\u0761"
26550                 ],
26551                 "dot_below_three_dots_above": [
26552                     "\u08A4"
26553                 ],
26554                 "isolated": "\uFED1",
26555                 "final": "\uFED2",
26556                 "initial": "\uFED3",
26557                 "medial": "\uFED4"
26558             },
26559             "qaf": {
26560                 "normal": [
26561                     "\u0642"
26562                 ],
26563                 "dotless": [
26564                     "\u066F"
26565                 ],
26566                 "dot_above": [
26567                     "\u06A7"
26568                 ],
26569                 "three_dots_above": [
26570                     "\u06A8"
26571                 ],
26572                 "dot_below": [
26573                     "\u08A5"
26574                 ],
26575                 "isolated": "\uFED5",
26576                 "final": "\uFED6",
26577                 "initial": "\uFED7",
26578                 "medial": "\uFED8"
26579             },
26580             "kaf": {
26581                 "normal": [
26582                     "\u0643"
26583                 ],
26584                 "swash": [
26585                     "\u06AA"
26586                 ],
26587                 "ring": [
26588                     "\u06AB"
26589                 ],
26590                 "dot_above": [
26591                     "\u06AC"
26592                 ],
26593                 "three_dots_below": [
26594                     "\u06AE"
26595                 ],
26596                 "two_dots_above": [
26597                     "\u077F"
26598                 ],
26599                 "dot_below": [
26600                     "\u08B4"
26601                 ],
26602                 "isolated": "\uFED9",
26603                 "final": "\uFEDA",
26604                 "initial": "\uFEDB",
26605                 "medial": "\uFEDC"
26606             },
26607             "lam": {
26608                 "normal": [
26609                     "\u0644"
26610                 ],
26611                 "small_v": [
26612                     "\u06B5"
26613                 ],
26614                 "dot_above": [
26615                     "\u06B6"
26616                 ],
26617                 "three_dots_above": [
26618                     "\u06B7"
26619                 ],
26620                 "three_dots_below": [
26621                     "\u06B8"
26622                 ],
26623                 "bar": [
26624                     "\u076A"
26625                 ],
26626                 "double_bar": [
26627                     "\u08A6"
26628                 ],
26629                 "isolated": "\uFEDD",
26630                 "final": "\uFEDE",
26631                 "initial": "\uFEDF",
26632                 "medial": "\uFEE0"
26633             },
26634             "meem": {
26635                 "normal": [
26636                     "\u0645"
26637                 ],
26638                 "dot_above": [
26639                     "\u0765"
26640                 ],
26641                 "dot_below": [
26642                     "\u0766"
26643                 ],
26644                 "three_dots_above": [
26645                     "\u08A7"
26646                 ],
26647                 "isolated": "\uFEE1",
26648                 "final": "\uFEE2",
26649                 "initial": "\uFEE3",
26650                 "medial": "\uFEE4"
26651             },
26652             "noon": {
26653                 "normal": [
26654                     "\u0646"
26655                 ],
26656                 "dot_below": [
26657                     "\u06B9"
26658                 ],
26659                 "ring": [
26660                     "\u06BC"
26661                 ],
26662                 "three_dots_above": [
26663                     "\u06BD"
26664                 ],
26665                 "two_dots_below": [
26666                     "\u0767"
26667                 ],
26668                 "small_tah": [
26669                     "\u0768"
26670                 ],
26671                 "small_v": [
26672                     "\u0769"
26673                 ],
26674                 "isolated": "\uFEE5",
26675                 "final": "\uFEE6",
26676                 "initial": "\uFEE7",
26677                 "medial": "\uFEE8"
26678             },
26679             "heh": {
26680                 "normal": [
26681                     "\u0647"
26682                 ],
26683                 "isolated": "\uFEE9",
26684                 "final": "\uFEEA",
26685                 "initial": "\uFEEB",
26686                 "medial": "\uFEEC"
26687             },
26688             "waw": {
26689                 "normal": [
26690                     "\u0648"
26691                 ],
26692                 "hamza_above": {
26693                     "normal": [
26694                         "\u0624",
26695                         "\u0648\u0654"
26696                     ],
26697                     "isolated": "\uFE85",
26698                     "final": "\uFE86"
26699                 },
26700                 "high_hamza": [
26701                     "\u0676",
26702                     "\u0648\u0674"
26703                 ],
26704                 "ring": [
26705                     "\u06C4"
26706                 ],
26707                 "two_dots_above": [
26708                     "\u06CA"
26709                 ],
26710                 "dot_above": [
26711                     "\u06CF"
26712                 ],
26713                 "indic_two_above": [
26714                     "\u0778"
26715                 ],
26716                 "indic_three_above": [
26717                     "\u0779"
26718                 ],
26719                 "dot_within": [
26720                     "\u08AB"
26721                 ],
26722                 "isolated": "\uFEED",
26723                 "final": "\uFEEE"
26724             },
26725             "alef_maksura": {
26726                 "normal": [
26727                     "\u0649"
26728                 ],
26729                 "hamza_above": [
26730                     "\u0626",
26731                     "\u064A\u0654"
26732                 ],
26733                 "initial": "\uFBE8",
26734                 "medial": "\uFBE9",
26735                 "isolated": "\uFEEF",
26736                 "final": "\uFEF0"
26737             },
26738             "yeh": {
26739                 "normal": [
26740                     "\u064A"
26741                 ],
26742                 "hamza_above": {
26743                     "normal": [
26744                         "\u0626",
26745                         "\u0649\u0654"
26746                     ],
26747                     "isolated": "\uFE89",
26748                     "final": "\uFE8A",
26749                     "initial": "\uFE8B",
26750                     "medial": "\uFE8C"
26751                 },
26752                 "two_dots_below_hamza_above": [
26753                     "\u08A8"
26754                 ],
26755                 "high_hamza": [
26756                     "\u0678",
26757                     "\u064A\u0674"
26758                 ],
26759                 "tail": [
26760                     "\u06CD"
26761                 ],
26762                 "small_v": [
26763                     "\u06CE"
26764                 ],
26765                 "three_dots_below": [
26766                     "\u06D1"
26767                 ],
26768                 "two_dots_below_dot_above": [
26769                     "\u08A9"
26770                 ],
26771                 "two_dots_below_small_noon_above": [
26772                     "\u08BA"
26773                 ],
26774                 "isolated": "\uFEF1",
26775                 "final": "\uFEF2",
26776                 "initial": "\uFEF3",
26777                 "medial": "\uFEF4"
26778             },
26779             "tteh": {
26780                 "normal": [
26781                     "\u0679"
26782                 ],
26783                 "isolated": "\uFB66",
26784                 "final": "\uFB67",
26785                 "initial": "\uFB68",
26786                 "medial": "\uFB69"
26787             },
26788             "tteheh": {
26789                 "normal": [
26790                     "\u067A"
26791                 ],
26792                 "isolated": "\uFB5E",
26793                 "final": "\uFB5F",
26794                 "initial": "\uFB60",
26795                 "medial": "\uFB61"
26796             },
26797             "beeh": {
26798                 "normal": [
26799                     "\u067B"
26800                 ],
26801                 "isolated": "\uFB52",
26802                 "final": "\uFB53",
26803                 "initial": "\uFB54",
26804                 "medial": "\uFB55"
26805             },
26806             "peh": {
26807                 "normal": [
26808                     "\u067E"
26809                 ],
26810                 "small_meem_above": [
26811                     "\u08B7"
26812                 ],
26813                 "isolated": "\uFB56",
26814                 "final": "\uFB57",
26815                 "initial": "\uFB58",
26816                 "medial": "\uFB59"
26817             },
26818             "teheh": {
26819                 "normal": [
26820                     "\u067F"
26821                 ],
26822                 "isolated": "\uFB62",
26823                 "final": "\uFB63",
26824                 "initial": "\uFB64",
26825                 "medial": "\uFB65"
26826             },
26827             "beheh": {
26828                 "normal": [
26829                     "\u0680"
26830                 ],
26831                 "isolated": "\uFB5A",
26832                 "final": "\uFB5B",
26833                 "initial": "\uFB5C",
26834                 "medial": "\uFB5D"
26835             },
26836             "nyeh": {
26837                 "normal": [
26838                     "\u0683"
26839                 ],
26840                 "isolated": "\uFB76",
26841                 "final": "\uFB77",
26842                 "initial": "\uFB78",
26843                 "medial": "\uFB79"
26844             },
26845             "dyeh": {
26846                 "normal": [
26847                     "\u0684"
26848                 ],
26849                 "isolated": "\uFB72",
26850                 "final": "\uFB73",
26851                 "initial": "\uFB74",
26852                 "medial": "\uFB75"
26853             },
26854             "tcheh": {
26855                 "normal": [
26856                     "\u0686"
26857                 ],
26858                 "dot_above": [
26859                     "\u06BF"
26860                 ],
26861                 "isolated": "\uFB7A",
26862                 "final": "\uFB7B",
26863                 "initial": "\uFB7C",
26864                 "medial": "\uFB7D"
26865             },
26866             "tcheheh": {
26867                 "normal": [
26868                     "\u0687"
26869                 ],
26870                 "isolated": "\uFB7E",
26871                 "final": "\uFB7F",
26872                 "initial": "\uFB80",
26873                 "medial": "\uFB81"
26874             },
26875             "ddal": {
26876                 "normal": [
26877                     "\u0688"
26878                 ],
26879                 "isolated": "\uFB88",
26880                 "final": "\uFB89"
26881             },
26882             "dahal": {
26883                 "normal": [
26884                     "\u068C"
26885                 ],
26886                 "isolated": "\uFB84",
26887                 "final": "\uFB85"
26888             },
26889             "ddahal": {
26890                 "normal": [
26891                     "\u068D"
26892                 ],
26893                 "isolated": "\uFB82",
26894                 "final": "\uFB83"
26895             },
26896             "dul": {
26897                 "normal": [
26898                     "\u068F",
26899                     "\u068E"
26900                 ],
26901                 "isolated": "\uFB86",
26902                 "final": "\uFB87"
26903             },
26904             "rreh": {
26905                 "normal": [
26906                     "\u0691"
26907                 ],
26908                 "isolated": "\uFB8C",
26909                 "final": "\uFB8D"
26910             },
26911             "jeh": {
26912                 "normal": [
26913                     "\u0698"
26914                 ],
26915                 "isolated": "\uFB8A",
26916                 "final": "\uFB8B"
26917             },
26918             "veh": {
26919                 "normal": [
26920                     "\u06A4"
26921                 ],
26922                 "isolated": "\uFB6A",
26923                 "final": "\uFB6B",
26924                 "initial": "\uFB6C",
26925                 "medial": "\uFB6D"
26926             },
26927             "peheh": {
26928                 "normal": [
26929                     "\u06A6"
26930                 ],
26931                 "isolated": "\uFB6E",
26932                 "final": "\uFB6F",
26933                 "initial": "\uFB70",
26934                 "medial": "\uFB71"
26935             },
26936             "keheh": {
26937                 "normal": [
26938                     "\u06A9"
26939                 ],
26940                 "dot_above": [
26941                     "\u0762"
26942                 ],
26943                 "three_dots_above": [
26944                     "\u0763"
26945                 ],
26946                 "three_dots_pointing_upwards_below": [
26947                     "\u0764"
26948                 ],
26949                 "isolated": "\uFB8E",
26950                 "final": "\uFB8F",
26951                 "initial": "\uFB90",
26952                 "medial": "\uFB91"
26953             },
26954             "ng": {
26955                 "normal": [
26956                     "\u06AD"
26957                 ],
26958                 "isolated": "\uFBD3",
26959                 "final": "\uFBD4",
26960                 "initial": "\uFBD5",
26961                 "medial": "\uFBD6"
26962             },
26963             "gaf": {
26964                 "normal": [
26965                     "\u06AF"
26966                 ],
26967                 "ring": [
26968                     "\u06B0"
26969                 ],
26970                 "two_dots_below": [
26971                     "\u06B2"
26972                 ],
26973                 "three_dots_above": [
26974                     "\u06B4"
26975                 ],
26976                 "inverted_stroke": [
26977                     "\u08B0"
26978                 ],
26979                 "isolated": "\uFB92",
26980                 "final": "\uFB93",
26981                 "initial": "\uFB94",
26982                 "medial": "\uFB95"
26983             },
26984             "ngoeh": {
26985                 "normal": [
26986                     "\u06B1"
26987                 ],
26988                 "isolated": "\uFB9A",
26989                 "final": "\uFB9B",
26990                 "initial": "\uFB9C",
26991                 "medial": "\uFB9D"
26992             },
26993             "gueh": {
26994                 "normal": [
26995                     "\u06B3"
26996                 ],
26997                 "isolated": "\uFB96",
26998                 "final": "\uFB97",
26999                 "initial": "\uFB98",
27000                 "medial": "\uFB99"
27001             },
27002             "noon ghunna": {
27003                 "normal": [
27004                     "\u06BA"
27005                 ],
27006                 "isolated": "\uFB9E",
27007                 "final": "\uFB9F"
27008             },
27009             "rnoon": {
27010                 "normal": [
27011                     "\u06BB"
27012                 ],
27013                 "isolated": "\uFBA0",
27014                 "final": "\uFBA1",
27015                 "initial": "\uFBA2",
27016                 "medial": "\uFBA3"
27017             },
27018             "heh doachashmee": {
27019                 "normal": [
27020                     "\u06BE"
27021                 ],
27022                 "isolated": "\uFBAA",
27023                 "final": "\uFBAB",
27024                 "initial": "\uFBAC",
27025                 "medial": "\uFBAD"
27026             },
27027             "heh goal": {
27028                 "normal": [
27029                     "\u06C1"
27030                 ],
27031                 "hamza_above": [
27032                     "\u06C1\u0654",
27033                     "\u06C2"
27034                 ],
27035                 "isolated": "\uFBA6",
27036                 "final": "\uFBA7",
27037                 "initial": "\uFBA8",
27038                 "medial": "\uFBA9"
27039             },
27040             "teh marbuta goal": {
27041                 "normal": [
27042                     "\u06C3"
27043                 ]
27044             },
27045             "kirghiz oe": {
27046                 "normal": [
27047                     "\u06C5"
27048                 ],
27049                 "isolated": "\uFBE0",
27050                 "final": "\uFBE1"
27051             },
27052             "oe": {
27053                 "normal": [
27054                     "\u06C6"
27055                 ],
27056                 "isolated": "\uFBD9",
27057                 "final": "\uFBDA"
27058             },
27059             "u": {
27060                 "normal": [
27061                     "\u06C7"
27062                 ],
27063                 "hamza_above": {
27064                     "normal": [
27065                         "\u0677",
27066                         "\u06C7\u0674"
27067                     ],
27068                     "isolated": "\uFBDD"
27069                 },
27070                 "isolated": "\uFBD7",
27071                 "final": "\uFBD8"
27072             },
27073             "yu": {
27074                 "normal": [
27075                     "\u06C8"
27076                 ],
27077                 "isolated": "\uFBDB",
27078                 "final": "\uFBDC"
27079             },
27080             "kirghiz yu": {
27081                 "normal": [
27082                     "\u06C9"
27083                 ],
27084                 "isolated": "\uFBE2",
27085                 "final": "\uFBE3"
27086             },
27087             "ve": {
27088                 "normal": [
27089                     "\u06CB"
27090                 ],
27091                 "isolated": "\uFBDE",
27092                 "final": "\uFBDF"
27093             },
27094             "farsi yeh": {
27095                 "normal": [
27096                     "\u06CC"
27097                 ],
27098                 "indic_two_above": [
27099                     "\u0775"
27100                 ],
27101                 "indic_three_above": [
27102                     "\u0776"
27103                 ],
27104                 "indic_four_above": [
27105                     "\u0777"
27106                 ],
27107                 "isolated": "\uFBFC",
27108                 "final": "\uFBFD",
27109                 "initial": "\uFBFE",
27110                 "medial": "\uFBFF"
27111             },
27112             "e": {
27113                 "normal": [
27114                     "\u06D0"
27115                 ],
27116                 "isolated": "\uFBE4",
27117                 "final": "\uFBE5",
27118                 "initial": "\uFBE6",
27119                 "medial": "\uFBE7"
27120             },
27121             "yeh barree": {
27122                 "normal": [
27123                     "\u06D2"
27124                 ],
27125                 "hamza_above": {
27126                     "normal": [
27127                         "\u06D2\u0654",
27128                         "\u06D3"
27129                     ],
27130                     "isolated": "\uFBB0",
27131                     "final": "\uFBB1"
27132                 },
27133                 "indic_two_above": [
27134                     "\u077A"
27135                 ],
27136                 "indic_three_above": [
27137                     "\u077B"
27138                 ],
27139                 "isolated": "\uFBAE",
27140                 "final": "\uFBAF"
27141             },
27142             "ae": {
27143                 "normal": [
27144                     "\u06D5"
27145                 ],
27146                 "isolated": "\u06D5",
27147                 "final": "\uFEEA",
27148                 "yeh_above": {
27149                     "normal": [
27150                         "\u06C0",
27151                         "\u06D5\u0654"
27152                     ],
27153                     "isolated": "\uFBA4",
27154                     "final": "\uFBA5"
27155                 }
27156             },
27157             "rohingya yeh": {
27158                 "normal": [
27159                     "\u08AC"
27160                 ]
27161             },
27162             "low alef": {
27163                 "normal": [
27164                     "\u08AD"
27165                 ]
27166             },
27167             "straight waw": {
27168                 "normal": [
27169                     "\u08B1"
27170                 ]
27171             },
27172             "african feh": {
27173                 "normal": [
27174                     "\u08BB"
27175                 ]
27176             },
27177             "african qaf": {
27178                 "normal": [
27179                     "\u08BC"
27180                 ]
27181             },
27182             "african noon": {
27183                 "normal": [
27184                     "\u08BD"
27185                 ]
27186             }
27187         };
27188         exports.default = arabicReference;
27189         });
27190
27191         unwrapExports(unicodeArabic);
27192
27193         var unicodeLigatures = createCommonjsModule(function (module, exports) {
27194         Object.defineProperty(exports, "__esModule", { value: true });
27195         var ligatureReference = {
27196             "\u0626\u0627": {
27197                 "isolated": "\uFBEA",
27198                 "final": "\uFBEB"
27199             },
27200             "\u0626\u06D5": {
27201                 "isolated": "\uFBEC",
27202                 "final": "\uFBED"
27203             },
27204             "\u0626\u0648": {
27205                 "isolated": "\uFBEE",
27206                 "final": "\uFBEF"
27207             },
27208             "\u0626\u06C7": {
27209                 "isolated": "\uFBF0",
27210                 "final": "\uFBF1"
27211             },
27212             "\u0626\u06C6": {
27213                 "isolated": "\uFBF2",
27214                 "final": "\uFBF3"
27215             },
27216             "\u0626\u06C8": {
27217                 "isolated": "\uFBF4",
27218                 "final": "\uFBF5"
27219             },
27220             "\u0626\u06D0": {
27221                 "isolated": "\uFBF6",
27222                 "final": "\uFBF7",
27223                 "initial": "\uFBF8"
27224             },
27225             "\u0626\u0649": {
27226                 "uighur_kirghiz": {
27227                     "isolated": "\uFBF9",
27228                     "final": "\uFBFA",
27229                     "initial": "\uFBFB"
27230                 },
27231                 "isolated": "\uFC03",
27232                 "final": "\uFC68"
27233             },
27234             "\u0626\u062C": {
27235                 "isolated": "\uFC00",
27236                 "initial": "\uFC97"
27237             },
27238             "\u0626\u062D": {
27239                 "isolated": "\uFC01",
27240                 "initial": "\uFC98"
27241             },
27242             "\u0626\u0645": {
27243                 "isolated": "\uFC02",
27244                 "final": "\uFC66",
27245                 "initial": "\uFC9A",
27246                 "medial": "\uFCDF"
27247             },
27248             "\u0626\u064A": {
27249                 "isolated": "\uFC04",
27250                 "final": "\uFC69"
27251             },
27252             "\u0628\u062C": {
27253                 "isolated": "\uFC05",
27254                 "initial": "\uFC9C"
27255             },
27256             "\u0628\u062D": {
27257                 "isolated": "\uFC06",
27258                 "initial": "\uFC9D"
27259             },
27260             "\u0628\u062E": {
27261                 "isolated": "\uFC07",
27262                 "initial": "\uFC9E"
27263             },
27264             "\u0628\u0645": {
27265                 "isolated": "\uFC08",
27266                 "final": "\uFC6C",
27267                 "initial": "\uFC9F",
27268                 "medial": "\uFCE1"
27269             },
27270             "\u0628\u0649": {
27271                 "isolated": "\uFC09",
27272                 "final": "\uFC6E"
27273             },
27274             "\u0628\u064A": {
27275                 "isolated": "\uFC0A",
27276                 "final": "\uFC6F"
27277             },
27278             "\u062A\u062C": {
27279                 "isolated": "\uFC0B",
27280                 "initial": "\uFCA1"
27281             },
27282             "\u062A\u062D": {
27283                 "isolated": "\uFC0C",
27284                 "initial": "\uFCA2"
27285             },
27286             "\u062A\u062E": {
27287                 "isolated": "\uFC0D",
27288                 "initial": "\uFCA3"
27289             },
27290             "\u062A\u0645": {
27291                 "isolated": "\uFC0E",
27292                 "final": "\uFC72",
27293                 "initial": "\uFCA4",
27294                 "medial": "\uFCE3"
27295             },
27296             "\u062A\u0649": {
27297                 "isolated": "\uFC0F",
27298                 "final": "\uFC74"
27299             },
27300             "\u062A\u064A": {
27301                 "isolated": "\uFC10",
27302                 "final": "\uFC75"
27303             },
27304             "\u062B\u062C": {
27305                 "isolated": "\uFC11"
27306             },
27307             "\u062B\u0645": {
27308                 "isolated": "\uFC12",
27309                 "final": "\uFC78",
27310                 "initial": "\uFCA6",
27311                 "medial": "\uFCE5"
27312             },
27313             "\u062B\u0649": {
27314                 "isolated": "\uFC13",
27315                 "final": "\uFC7A"
27316             },
27317             "\u062B\u0648": {
27318                 "isolated": "\uFC14"
27319             },
27320             "\u062C\u062D": {
27321                 "isolated": "\uFC15",
27322                 "initial": "\uFCA7"
27323             },
27324             "\u062C\u0645": {
27325                 "isolated": "\uFC16",
27326                 "initial": "\uFCA8"
27327             },
27328             "\u062D\u062C": {
27329                 "isolated": "\uFC17",
27330                 "initial": "\uFCA9"
27331             },
27332             "\u062D\u0645": {
27333                 "isolated": "\uFC18",
27334                 "initial": "\uFCAA"
27335             },
27336             "\u062E\u062C": {
27337                 "isolated": "\uFC19",
27338                 "initial": "\uFCAB"
27339             },
27340             "\u062E\u062D": {
27341                 "isolated": "\uFC1A"
27342             },
27343             "\u062E\u0645": {
27344                 "isolated": "\uFC1B",
27345                 "initial": "\uFCAC"
27346             },
27347             "\u0633\u062C": {
27348                 "isolated": "\uFC1C",
27349                 "initial": "\uFCAD",
27350                 "medial": "\uFD34"
27351             },
27352             "\u0633\u062D": {
27353                 "isolated": "\uFC1D",
27354                 "initial": "\uFCAE",
27355                 "medial": "\uFD35"
27356             },
27357             "\u0633\u062E": {
27358                 "isolated": "\uFC1E",
27359                 "initial": "\uFCAF",
27360                 "medial": "\uFD36"
27361             },
27362             "\u0633\u0645": {
27363                 "isolated": "\uFC1F",
27364                 "initial": "\uFCB0",
27365                 "medial": "\uFCE7"
27366             },
27367             "\u0635\u062D": {
27368                 "isolated": "\uFC20",
27369                 "initial": "\uFCB1"
27370             },
27371             "\u0635\u0645": {
27372                 "isolated": "\uFC21",
27373                 "initial": "\uFCB3"
27374             },
27375             "\u0636\u062C": {
27376                 "isolated": "\uFC22",
27377                 "initial": "\uFCB4"
27378             },
27379             "\u0636\u062D": {
27380                 "isolated": "\uFC23",
27381                 "initial": "\uFCB5"
27382             },
27383             "\u0636\u062E": {
27384                 "isolated": "\uFC24",
27385                 "initial": "\uFCB6"
27386             },
27387             "\u0636\u0645": {
27388                 "isolated": "\uFC25",
27389                 "initial": "\uFCB7"
27390             },
27391             "\u0637\u062D": {
27392                 "isolated": "\uFC26",
27393                 "initial": "\uFCB8"
27394             },
27395             "\u0637\u0645": {
27396                 "isolated": "\uFC27",
27397                 "initial": "\uFD33",
27398                 "medial": "\uFD3A"
27399             },
27400             "\u0638\u0645": {
27401                 "isolated": "\uFC28",
27402                 "initial": "\uFCB9",
27403                 "medial": "\uFD3B"
27404             },
27405             "\u0639\u062C": {
27406                 "isolated": "\uFC29",
27407                 "initial": "\uFCBA"
27408             },
27409             "\u0639\u0645": {
27410                 "isolated": "\uFC2A",
27411                 "initial": "\uFCBB"
27412             },
27413             "\u063A\u062C": {
27414                 "isolated": "\uFC2B",
27415                 "initial": "\uFCBC"
27416             },
27417             "\u063A\u0645": {
27418                 "isolated": "\uFC2C",
27419                 "initial": "\uFCBD"
27420             },
27421             "\u0641\u062C": {
27422                 "isolated": "\uFC2D",
27423                 "initial": "\uFCBE"
27424             },
27425             "\u0641\u062D": {
27426                 "isolated": "\uFC2E",
27427                 "initial": "\uFCBF"
27428             },
27429             "\u0641\u062E": {
27430                 "isolated": "\uFC2F",
27431                 "initial": "\uFCC0"
27432             },
27433             "\u0641\u0645": {
27434                 "isolated": "\uFC30",
27435                 "initial": "\uFCC1"
27436             },
27437             "\u0641\u0649": {
27438                 "isolated": "\uFC31",
27439                 "final": "\uFC7C"
27440             },
27441             "\u0641\u064A": {
27442                 "isolated": "\uFC32",
27443                 "final": "\uFC7D"
27444             },
27445             "\u0642\u062D": {
27446                 "isolated": "\uFC33",
27447                 "initial": "\uFCC2"
27448             },
27449             "\u0642\u0645": {
27450                 "isolated": "\uFC34",
27451                 "initial": "\uFCC3"
27452             },
27453             "\u0642\u0649": {
27454                 "isolated": "\uFC35",
27455                 "final": "\uFC7E"
27456             },
27457             "\u0642\u064A": {
27458                 "isolated": "\uFC36",
27459                 "final": "\uFC7F"
27460             },
27461             "\u0643\u0627": {
27462                 "isolated": "\uFC37",
27463                 "final": "\uFC80"
27464             },
27465             "\u0643\u062C": {
27466                 "isolated": "\uFC38",
27467                 "initial": "\uFCC4"
27468             },
27469             "\u0643\u062D": {
27470                 "isolated": "\uFC39",
27471                 "initial": "\uFCC5"
27472             },
27473             "\u0643\u062E": {
27474                 "isolated": "\uFC3A",
27475                 "initial": "\uFCC6"
27476             },
27477             "\u0643\u0644": {
27478                 "isolated": "\uFC3B",
27479                 "final": "\uFC81",
27480                 "initial": "\uFCC7",
27481                 "medial": "\uFCEB"
27482             },
27483             "\u0643\u0645": {
27484                 "isolated": "\uFC3C",
27485                 "final": "\uFC82",
27486                 "initial": "\uFCC8",
27487                 "medial": "\uFCEC"
27488             },
27489             "\u0643\u0649": {
27490                 "isolated": "\uFC3D",
27491                 "final": "\uFC83"
27492             },
27493             "\u0643\u064A": {
27494                 "isolated": "\uFC3E",
27495                 "final": "\uFC84"
27496             },
27497             "\u0644\u062C": {
27498                 "isolated": "\uFC3F",
27499                 "initial": "\uFCC9"
27500             },
27501             "\u0644\u062D": {
27502                 "isolated": "\uFC40",
27503                 "initial": "\uFCCA"
27504             },
27505             "\u0644\u062E": {
27506                 "isolated": "\uFC41",
27507                 "initial": "\uFCCB"
27508             },
27509             "\u0644\u0645": {
27510                 "isolated": "\uFC42",
27511                 "final": "\uFC85",
27512                 "initial": "\uFCCC",
27513                 "medial": "\uFCED"
27514             },
27515             "\u0644\u0649": {
27516                 "isolated": "\uFC43",
27517                 "final": "\uFC86"
27518             },
27519             "\u0644\u064A": {
27520                 "isolated": "\uFC44",
27521                 "final": "\uFC87"
27522             },
27523             "\u0645\u062C": {
27524                 "isolated": "\uFC45",
27525                 "initial": "\uFCCE"
27526             },
27527             "\u0645\u062D": {
27528                 "isolated": "\uFC46",
27529                 "initial": "\uFCCF"
27530             },
27531             "\u0645\u062E": {
27532                 "isolated": "\uFC47",
27533                 "initial": "\uFCD0"
27534             },
27535             "\u0645\u0645": {
27536                 "isolated": "\uFC48",
27537                 "final": "\uFC89",
27538                 "initial": "\uFCD1"
27539             },
27540             "\u0645\u0649": {
27541                 "isolated": "\uFC49"
27542             },
27543             "\u0645\u064A": {
27544                 "isolated": "\uFC4A"
27545             },
27546             "\u0646\u062C": {
27547                 "isolated": "\uFC4B",
27548                 "initial": "\uFCD2"
27549             },
27550             "\u0646\u062D": {
27551                 "isolated": "\uFC4C",
27552                 "initial": "\uFCD3"
27553             },
27554             "\u0646\u062E": {
27555                 "isolated": "\uFC4D",
27556                 "initial": "\uFCD4"
27557             },
27558             "\u0646\u0645": {
27559                 "isolated": "\uFC4E",
27560                 "final": "\uFC8C",
27561                 "initial": "\uFCD5",
27562                 "medial": "\uFCEE"
27563             },
27564             "\u0646\u0649": {
27565                 "isolated": "\uFC4F",
27566                 "final": "\uFC8E"
27567             },
27568             "\u0646\u064A": {
27569                 "isolated": "\uFC50",
27570                 "final": "\uFC8F"
27571             },
27572             "\u0647\u062C": {
27573                 "isolated": "\uFC51",
27574                 "initial": "\uFCD7"
27575             },
27576             "\u0647\u0645": {
27577                 "isolated": "\uFC52",
27578                 "initial": "\uFCD8"
27579             },
27580             "\u0647\u0649": {
27581                 "isolated": "\uFC53"
27582             },
27583             "\u0647\u064A": {
27584                 "isolated": "\uFC54"
27585             },
27586             "\u064A\u062C": {
27587                 "isolated": "\uFC55",
27588                 "initial": "\uFCDA"
27589             },
27590             "\u064A\u062D": {
27591                 "isolated": "\uFC56",
27592                 "initial": "\uFCDB"
27593             },
27594             "\u064A\u062E": {
27595                 "isolated": "\uFC57",
27596                 "initial": "\uFCDC"
27597             },
27598             "\u064A\u0645": {
27599                 "isolated": "\uFC58",
27600                 "final": "\uFC93",
27601                 "initial": "\uFCDD",
27602                 "medial": "\uFCF0"
27603             },
27604             "\u064A\u0649": {
27605                 "isolated": "\uFC59",
27606                 "final": "\uFC95"
27607             },
27608             "\u064A\u064A": {
27609                 "isolated": "\uFC5A",
27610                 "final": "\uFC96"
27611             },
27612             "\u0630\u0670": {
27613                 "isolated": "\uFC5B"
27614             },
27615             "\u0631\u0670": {
27616                 "isolated": "\uFC5C"
27617             },
27618             "\u0649\u0670": {
27619                 "isolated": "\uFC5D",
27620                 "final": "\uFC90"
27621             },
27622             "\u064C\u0651": {
27623                 "isolated": "\uFC5E"
27624             },
27625             "\u064D\u0651": {
27626                 "isolated": "\uFC5F"
27627             },
27628             "\u064E\u0651": {
27629                 "isolated": "\uFC60"
27630             },
27631             "\u064F\u0651": {
27632                 "isolated": "\uFC61"
27633             },
27634             "\u0650\u0651": {
27635                 "isolated": "\uFC62"
27636             },
27637             "\u0651\u0670": {
27638                 "isolated": "\uFC63"
27639             },
27640             "\u0626\u0631": {
27641                 "final": "\uFC64"
27642             },
27643             "\u0626\u0632": {
27644                 "final": "\uFC65"
27645             },
27646             "\u0626\u0646": {
27647                 "final": "\uFC67"
27648             },
27649             "\u0628\u0631": {
27650                 "final": "\uFC6A"
27651             },
27652             "\u0628\u0632": {
27653                 "final": "\uFC6B"
27654             },
27655             "\u0628\u0646": {
27656                 "final": "\uFC6D"
27657             },
27658             "\u062A\u0631": {
27659                 "final": "\uFC70"
27660             },
27661             "\u062A\u0632": {
27662                 "final": "\uFC71"
27663             },
27664             "\u062A\u0646": {
27665                 "final": "\uFC73"
27666             },
27667             "\u062B\u0631": {
27668                 "final": "\uFC76"
27669             },
27670             "\u062B\u0632": {
27671                 "final": "\uFC77"
27672             },
27673             "\u062B\u0646": {
27674                 "final": "\uFC79"
27675             },
27676             "\u062B\u064A": {
27677                 "final": "\uFC7B"
27678             },
27679             "\u0645\u0627": {
27680                 "final": "\uFC88"
27681             },
27682             "\u0646\u0631": {
27683                 "final": "\uFC8A"
27684             },
27685             "\u0646\u0632": {
27686                 "final": "\uFC8B"
27687             },
27688             "\u0646\u0646": {
27689                 "final": "\uFC8D"
27690             },
27691             "\u064A\u0631": {
27692                 "final": "\uFC91"
27693             },
27694             "\u064A\u0632": {
27695                 "final": "\uFC92"
27696             },
27697             "\u064A\u0646": {
27698                 "final": "\uFC94"
27699             },
27700             "\u0626\u062E": {
27701                 "initial": "\uFC99"
27702             },
27703             "\u0626\u0647": {
27704                 "initial": "\uFC9B",
27705                 "medial": "\uFCE0"
27706             },
27707             "\u0628\u0647": {
27708                 "initial": "\uFCA0",
27709                 "medial": "\uFCE2"
27710             },
27711             "\u062A\u0647": {
27712                 "initial": "\uFCA5",
27713                 "medial": "\uFCE4"
27714             },
27715             "\u0635\u062E": {
27716                 "initial": "\uFCB2"
27717             },
27718             "\u0644\u0647": {
27719                 "initial": "\uFCCD"
27720             },
27721             "\u0646\u0647": {
27722                 "initial": "\uFCD6",
27723                 "medial": "\uFCEF"
27724             },
27725             "\u0647\u0670": {
27726                 "initial": "\uFCD9"
27727             },
27728             "\u064A\u0647": {
27729                 "initial": "\uFCDE",
27730                 "medial": "\uFCF1"
27731             },
27732             "\u062B\u0647": {
27733                 "medial": "\uFCE6"
27734             },
27735             "\u0633\u0647": {
27736                 "medial": "\uFCE8",
27737                 "initial": "\uFD31"
27738             },
27739             "\u0634\u0645": {
27740                 "medial": "\uFCE9",
27741                 "isolated": "\uFD0C",
27742                 "final": "\uFD28",
27743                 "initial": "\uFD30"
27744             },
27745             "\u0634\u0647": {
27746                 "medial": "\uFCEA",
27747                 "initial": "\uFD32"
27748             },
27749             "\u0640\u064E\u0651": {
27750                 "medial": "\uFCF2"
27751             },
27752             "\u0640\u064F\u0651": {
27753                 "medial": "\uFCF3"
27754             },
27755             "\u0640\u0650\u0651": {
27756                 "medial": "\uFCF4"
27757             },
27758             "\u0637\u0649": {
27759                 "isolated": "\uFCF5",
27760                 "final": "\uFD11"
27761             },
27762             "\u0637\u064A": {
27763                 "isolated": "\uFCF6",
27764                 "final": "\uFD12"
27765             },
27766             "\u0639\u0649": {
27767                 "isolated": "\uFCF7",
27768                 "final": "\uFD13"
27769             },
27770             "\u0639\u064A": {
27771                 "isolated": "\uFCF8",
27772                 "final": "\uFD14"
27773             },
27774             "\u063A\u0649": {
27775                 "isolated": "\uFCF9",
27776                 "final": "\uFD15"
27777             },
27778             "\u063A\u064A": {
27779                 "isolated": "\uFCFA",
27780                 "final": "\uFD16"
27781             },
27782             "\u0633\u0649": {
27783                 "isolated": "\uFCFB"
27784             },
27785             "\u0633\u064A": {
27786                 "isolated": "\uFCFC",
27787                 "final": "\uFD18"
27788             },
27789             "\u0634\u0649": {
27790                 "isolated": "\uFCFD",
27791                 "final": "\uFD19"
27792             },
27793             "\u0634\u064A": {
27794                 "isolated": "\uFCFE",
27795                 "final": "\uFD1A"
27796             },
27797             "\u062D\u0649": {
27798                 "isolated": "\uFCFF",
27799                 "final": "\uFD1B"
27800             },
27801             "\u062D\u064A": {
27802                 "isolated": "\uFD00",
27803                 "final": "\uFD1C"
27804             },
27805             "\u062C\u0649": {
27806                 "isolated": "\uFD01",
27807                 "final": "\uFD1D"
27808             },
27809             "\u062C\u064A": {
27810                 "isolated": "\uFD02",
27811                 "final": "\uFD1E"
27812             },
27813             "\u062E\u0649": {
27814                 "isolated": "\uFD03",
27815                 "final": "\uFD1F"
27816             },
27817             "\u062E\u064A": {
27818                 "isolated": "\uFD04",
27819                 "final": "\uFD20"
27820             },
27821             "\u0635\u0649": {
27822                 "isolated": "\uFD05",
27823                 "final": "\uFD21"
27824             },
27825             "\u0635\u064A": {
27826                 "isolated": "\uFD06",
27827                 "final": "\uFD22"
27828             },
27829             "\u0636\u0649": {
27830                 "isolated": "\uFD07",
27831                 "final": "\uFD23"
27832             },
27833             "\u0636\u064A": {
27834                 "isolated": "\uFD08",
27835                 "final": "\uFD24"
27836             },
27837             "\u0634\u062C": {
27838                 "isolated": "\uFD09",
27839                 "final": "\uFD25",
27840                 "initial": "\uFD2D",
27841                 "medial": "\uFD37"
27842             },
27843             "\u0634\u062D": {
27844                 "isolated": "\uFD0A",
27845                 "final": "\uFD26",
27846                 "initial": "\uFD2E",
27847                 "medial": "\uFD38"
27848             },
27849             "\u0634\u062E": {
27850                 "isolated": "\uFD0B",
27851                 "final": "\uFD27",
27852                 "initial": "\uFD2F",
27853                 "medial": "\uFD39"
27854             },
27855             "\u0634\u0631": {
27856                 "isolated": "\uFD0D",
27857                 "final": "\uFD29"
27858             },
27859             "\u0633\u0631": {
27860                 "isolated": "\uFD0E",
27861                 "final": "\uFD2A"
27862             },
27863             "\u0635\u0631": {
27864                 "isolated": "\uFD0F",
27865                 "final": "\uFD2B"
27866             },
27867             "\u0636\u0631": {
27868                 "isolated": "\uFD10",
27869                 "final": "\uFD2C"
27870             },
27871             "\u0633\u0639": {
27872                 "final": "\uFD17"
27873             },
27874             "\u062A\u062C\u0645": {
27875                 "initial": "\uFD50"
27876             },
27877             "\u062A\u062D\u062C": {
27878                 "final": "\uFD51",
27879                 "initial": "\uFD52"
27880             },
27881             "\u062A\u062D\u0645": {
27882                 "initial": "\uFD53"
27883             },
27884             "\u062A\u062E\u0645": {
27885                 "initial": "\uFD54"
27886             },
27887             "\u062A\u0645\u062C": {
27888                 "initial": "\uFD55"
27889             },
27890             "\u062A\u0645\u062D": {
27891                 "initial": "\uFD56"
27892             },
27893             "\u062A\u0645\u062E": {
27894                 "initial": "\uFD57"
27895             },
27896             "\u062C\u0645\u062D": {
27897                 "final": "\uFD58",
27898                 "initial": "\uFD59"
27899             },
27900             "\u062D\u0645\u064A": {
27901                 "final": "\uFD5A"
27902             },
27903             "\u062D\u0645\u0649": {
27904                 "final": "\uFD5B"
27905             },
27906             "\u0633\u062D\u062C": {
27907                 "initial": "\uFD5C"
27908             },
27909             "\u0633\u062C\u062D": {
27910                 "initial": "\uFD5D"
27911             },
27912             "\u0633\u062C\u0649": {
27913                 "final": "\uFD5E"
27914             },
27915             "\u0633\u0645\u062D": {
27916                 "final": "\uFD5F",
27917                 "initial": "\uFD60"
27918             },
27919             "\u0633\u0645\u062C": {
27920                 "initial": "\uFD61"
27921             },
27922             "\u0633\u0645\u0645": {
27923                 "final": "\uFD62",
27924                 "initial": "\uFD63"
27925             },
27926             "\u0635\u062D\u062D": {
27927                 "final": "\uFD64",
27928                 "initial": "\uFD65"
27929             },
27930             "\u0635\u0645\u0645": {
27931                 "final": "\uFD66",
27932                 "initial": "\uFDC5"
27933             },
27934             "\u0634\u062D\u0645": {
27935                 "final": "\uFD67",
27936                 "initial": "\uFD68"
27937             },
27938             "\u0634\u062C\u064A": {
27939                 "final": "\uFD69"
27940             },
27941             "\u0634\u0645\u062E": {
27942                 "final": "\uFD6A",
27943                 "initial": "\uFD6B"
27944             },
27945             "\u0634\u0645\u0645": {
27946                 "final": "\uFD6C",
27947                 "initial": "\uFD6D"
27948             },
27949             "\u0636\u062D\u0649": {
27950                 "final": "\uFD6E"
27951             },
27952             "\u0636\u062E\u0645": {
27953                 "final": "\uFD6F",
27954                 "initial": "\uFD70"
27955             },
27956             "\u0636\u0645\u062D": {
27957                 "final": "\uFD71"
27958             },
27959             "\u0637\u0645\u062D": {
27960                 "initial": "\uFD72"
27961             },
27962             "\u0637\u0645\u0645": {
27963                 "initial": "\uFD73"
27964             },
27965             "\u0637\u0645\u064A": {
27966                 "final": "\uFD74"
27967             },
27968             "\u0639\u062C\u0645": {
27969                 "final": "\uFD75",
27970                 "initial": "\uFDC4"
27971             },
27972             "\u0639\u0645\u0645": {
27973                 "final": "\uFD76",
27974                 "initial": "\uFD77"
27975             },
27976             "\u0639\u0645\u0649": {
27977                 "final": "\uFD78"
27978             },
27979             "\u063A\u0645\u0645": {
27980                 "final": "\uFD79"
27981             },
27982             "\u063A\u0645\u064A": {
27983                 "final": "\uFD7A"
27984             },
27985             "\u063A\u0645\u0649": {
27986                 "final": "\uFD7B"
27987             },
27988             "\u0641\u062E\u0645": {
27989                 "final": "\uFD7C",
27990                 "initial": "\uFD7D"
27991             },
27992             "\u0642\u0645\u062D": {
27993                 "final": "\uFD7E",
27994                 "initial": "\uFDB4"
27995             },
27996             "\u0642\u0645\u0645": {
27997                 "final": "\uFD7F"
27998             },
27999             "\u0644\u062D\u0645": {
28000                 "final": "\uFD80",
28001                 "initial": "\uFDB5"
28002             },
28003             "\u0644\u062D\u064A": {
28004                 "final": "\uFD81"
28005             },
28006             "\u0644\u062D\u0649": {
28007                 "final": "\uFD82"
28008             },
28009             "\u0644\u062C\u062C": {
28010                 "initial": "\uFD83",
28011                 "final": "\uFD84"
28012             },
28013             "\u0644\u062E\u0645": {
28014                 "final": "\uFD85",
28015                 "initial": "\uFD86"
28016             },
28017             "\u0644\u0645\u062D": {
28018                 "final": "\uFD87",
28019                 "initial": "\uFD88"
28020             },
28021             "\u0645\u062D\u062C": {
28022                 "initial": "\uFD89"
28023             },
28024             "\u0645\u062D\u0645": {
28025                 "initial": "\uFD8A"
28026             },
28027             "\u0645\u062D\u064A": {
28028                 "final": "\uFD8B"
28029             },
28030             "\u0645\u062C\u062D": {
28031                 "initial": "\uFD8C"
28032             },
28033             "\u0645\u062C\u0645": {
28034                 "initial": "\uFD8D"
28035             },
28036             "\u0645\u062E\u062C": {
28037                 "initial": "\uFD8E"
28038             },
28039             "\u0645\u062E\u0645": {
28040                 "initial": "\uFD8F"
28041             },
28042             "\u0645\u062C\u062E": {
28043                 "initial": "\uFD92"
28044             },
28045             "\u0647\u0645\u062C": {
28046                 "initial": "\uFD93"
28047             },
28048             "\u0647\u0645\u0645": {
28049                 "initial": "\uFD94"
28050             },
28051             "\u0646\u062D\u0645": {
28052                 "initial": "\uFD95"
28053             },
28054             "\u0646\u062D\u0649": {
28055                 "final": "\uFD96"
28056             },
28057             "\u0646\u062C\u0645": {
28058                 "final": "\uFD97",
28059                 "initial": "\uFD98"
28060             },
28061             "\u0646\u062C\u0649": {
28062                 "final": "\uFD99"
28063             },
28064             "\u0646\u0645\u064A": {
28065                 "final": "\uFD9A"
28066             },
28067             "\u0646\u0645\u0649": {
28068                 "final": "\uFD9B"
28069             },
28070             "\u064A\u0645\u0645": {
28071                 "final": "\uFD9C",
28072                 "initial": "\uFD9D"
28073             },
28074             "\u0628\u062E\u064A": {
28075                 "final": "\uFD9E"
28076             },
28077             "\u062A\u062C\u064A": {
28078                 "final": "\uFD9F"
28079             },
28080             "\u062A\u062C\u0649": {
28081                 "final": "\uFDA0"
28082             },
28083             "\u062A\u062E\u064A": {
28084                 "final": "\uFDA1"
28085             },
28086             "\u062A\u062E\u0649": {
28087                 "final": "\uFDA2"
28088             },
28089             "\u062A\u0645\u064A": {
28090                 "final": "\uFDA3"
28091             },
28092             "\u062A\u0645\u0649": {
28093                 "final": "\uFDA4"
28094             },
28095             "\u062C\u0645\u064A": {
28096                 "final": "\uFDA5"
28097             },
28098             "\u062C\u062D\u0649": {
28099                 "final": "\uFDA6"
28100             },
28101             "\u062C\u0645\u0649": {
28102                 "final": "\uFDA7"
28103             },
28104             "\u0633\u062E\u0649": {
28105                 "final": "\uFDA8"
28106             },
28107             "\u0635\u062D\u064A": {
28108                 "final": "\uFDA9"
28109             },
28110             "\u0634\u062D\u064A": {
28111                 "final": "\uFDAA"
28112             },
28113             "\u0636\u062D\u064A": {
28114                 "final": "\uFDAB"
28115             },
28116             "\u0644\u062C\u064A": {
28117                 "final": "\uFDAC"
28118             },
28119             "\u0644\u0645\u064A": {
28120                 "final": "\uFDAD"
28121             },
28122             "\u064A\u062D\u064A": {
28123                 "final": "\uFDAE"
28124             },
28125             "\u064A\u062C\u064A": {
28126                 "final": "\uFDAF"
28127             },
28128             "\u064A\u0645\u064A": {
28129                 "final": "\uFDB0"
28130             },
28131             "\u0645\u0645\u064A": {
28132                 "final": "\uFDB1"
28133             },
28134             "\u0642\u0645\u064A": {
28135                 "final": "\uFDB2"
28136             },
28137             "\u0646\u062D\u064A": {
28138                 "final": "\uFDB3"
28139             },
28140             "\u0639\u0645\u064A": {
28141                 "final": "\uFDB6"
28142             },
28143             "\u0643\u0645\u064A": {
28144                 "final": "\uFDB7"
28145             },
28146             "\u0646\u062C\u062D": {
28147                 "initial": "\uFDB8",
28148                 "final": "\uFDBD"
28149             },
28150             "\u0645\u062E\u064A": {
28151                 "final": "\uFDB9"
28152             },
28153             "\u0644\u062C\u0645": {
28154                 "initial": "\uFDBA",
28155                 "final": "\uFDBC"
28156             },
28157             "\u0643\u0645\u0645": {
28158                 "final": "\uFDBB",
28159                 "initial": "\uFDC3"
28160             },
28161             "\u062C\u062D\u064A": {
28162                 "final": "\uFDBE"
28163             },
28164             "\u062D\u062C\u064A": {
28165                 "final": "\uFDBF"
28166             },
28167             "\u0645\u062C\u064A": {
28168                 "final": "\uFDC0"
28169             },
28170             "\u0641\u0645\u064A": {
28171                 "final": "\uFDC1"
28172             },
28173             "\u0628\u062D\u064A": {
28174                 "final": "\uFDC2"
28175             },
28176             "\u0633\u062E\u064A": {
28177                 "final": "\uFDC6"
28178             },
28179             "\u0646\u062C\u064A": {
28180                 "final": "\uFDC7"
28181             },
28182             "\u0644\u0622": {
28183                 "isolated": "\uFEF5",
28184                 "final": "\uFEF6"
28185             },
28186             "\u0644\u0623": {
28187                 "isolated": "\uFEF7",
28188                 "final": "\uFEF8"
28189             },
28190             "\u0644\u0625": {
28191                 "isolated": "\uFEF9",
28192                 "final": "\uFEFA"
28193             },
28194             "\u0644\u0627": {
28195                 "isolated": "\uFEFB",
28196                 "final": "\uFEFC"
28197             },
28198             "words": {
28199                 "\u0635\u0644\u06D2": "\uFDF0",
28200                 "\u0642\u0644\u06D2": "\uFDF1",
28201                 "\u0627\u0644\u0644\u0647": "\uFDF2",
28202                 "\u0627\u0643\u0628\u0631": "\uFDF3",
28203                 "\u0645\u062D\u0645\u062F": "\uFDF4",
28204                 "\u0635\u0644\u0639\u0645": "\uFDF5",
28205                 "\u0631\u0633\u0648\u0644": "\uFDF6",
28206                 "\u0639\u0644\u064A\u0647": "\uFDF7",
28207                 "\u0648\u0633\u0644\u0645": "\uFDF8",
28208                 "\u0635\u0644\u0649": "\uFDF9",
28209                 "\u0635\u0644\u0649\u0627\u0644\u0644\u0647\u0639\u0644\u064A\u0647\u0648\u0633\u0644\u0645": "\uFDFA",
28210                 "\u062C\u0644\u062C\u0644\u0627\u0644\u0647": "\uFDFB",
28211                 "\u0631\u06CC\u0627\u0644": "\uFDFC"
28212             }
28213         };
28214         exports.default = ligatureReference;
28215         });
28216
28217         unwrapExports(unicodeLigatures);
28218
28219         var reference = createCommonjsModule(function (module, exports) {
28220         Object.defineProperty(exports, "__esModule", { value: true });
28221
28222
28223         var letterList = Object.keys(unicodeArabic.default);
28224         exports.letterList = letterList;
28225         var ligatureList = Object.keys(unicodeLigatures.default);
28226         exports.ligatureList = ligatureList;
28227         var ligatureWordList = Object.keys(unicodeLigatures.default.words);
28228         exports.ligatureWordList = ligatureWordList;
28229         var lams = '\u0644\u06B5\u06B6\u06B7\u06B8';
28230         exports.lams = lams;
28231         var alefs = '\u0627\u0622\u0623\u0625\u0671\u0672\u0673\u0675\u0773\u0774';
28232         exports.alefs = alefs;
28233         // for (var l = 1; l < lams.length; l++) {
28234         //   console.log('-');
28235         //   for (var a = 0; a < alefs.length; a++) {
28236         //     console.log(a + ': ' + lams[l] + alefs[a]);
28237         //   }
28238         // }
28239         var tashkeel = '\u0605\u0640\u0670\u0674\u06DF\u06E7\u06E8';
28240         exports.tashkeel = tashkeel;
28241         function addToTashkeel(start, finish) {
28242             for (var i = start; i <= finish; i++) {
28243                 exports.tashkeel = tashkeel += String.fromCharCode(i);
28244             }
28245         }
28246         addToTashkeel(0x0610, 0x061A);
28247         addToTashkeel(0x064B, 0x065F);
28248         addToTashkeel(0x06D6, 0x06DC);
28249         addToTashkeel(0x06E0, 0x06E4);
28250         addToTashkeel(0x06EA, 0x06ED);
28251         addToTashkeel(0x08D3, 0x08E1);
28252         addToTashkeel(0x08E3, 0x08FF);
28253         addToTashkeel(0xFE70, 0xFE7F);
28254         var lineBreakers = '\u0627\u0629\u0648\u06C0\u06CF\u06FD\u06FE\u076B\u076C\u0771\u0773\u0774\u0778\u0779\u08E2\u08B1\u08B2\u08B9';
28255         exports.lineBreakers = lineBreakers;
28256         function addToLineBreakers(start, finish) {
28257             for (var i = start; i <= finish; i++) {
28258                 exports.lineBreakers = lineBreakers += String.fromCharCode(i);
28259             }
28260         }
28261         addToLineBreakers(0x0600, 0x061F); // it's OK to include tashkeel in this range as it is ignored
28262         addToLineBreakers(0x0621, 0x0625);
28263         addToLineBreakers(0x062F, 0x0632);
28264         addToLineBreakers(0x0660, 0x066D); // numerals, math
28265         addToLineBreakers(0x0671, 0x0677);
28266         addToLineBreakers(0x0688, 0x0699);
28267         addToLineBreakers(0x06C3, 0x06CB);
28268         addToLineBreakers(0x06D2, 0x06F9);
28269         addToLineBreakers(0x0759, 0x075B);
28270         addToLineBreakers(0x08AA, 0x08AE);
28271         addToLineBreakers(0xFB50, 0xFDFD); // presentation forms look like they could connect, but never do
28272         // Presentation Forms A includes diacritics but they are meant to stand alone
28273         addToLineBreakers(0xFE80, 0xFEFC); // presentation forms look like they could connect, but never do
28274         // numerals, math
28275         addToLineBreakers(0x10E60, 0x10E7F);
28276         addToLineBreakers(0x1EC70, 0x1ECBF);
28277         addToLineBreakers(0x1EE00, 0x1EEFF);
28278         });
28279
28280         unwrapExports(reference);
28281         var reference_1 = reference.letterList;
28282         var reference_2 = reference.ligatureList;
28283         var reference_3 = reference.ligatureWordList;
28284         var reference_4 = reference.lams;
28285         var reference_5 = reference.alefs;
28286         var reference_6 = reference.tashkeel;
28287         var reference_7 = reference.lineBreakers;
28288
28289         var GlyphSplitter_1 = createCommonjsModule(function (module, exports) {
28290         Object.defineProperty(exports, "__esModule", { value: true });
28291
28292
28293         function GlyphSplitter(word) {
28294             var letters = [];
28295             var lastLetter = '';
28296             word.split('').forEach(function (letter) {
28297                 if (isArabic_1.isArabic(letter)) {
28298                     if (reference.tashkeel.indexOf(letter) > -1) {
28299                         letters[letters.length - 1] += letter;
28300                     }
28301                     else if (lastLetter.length && ((reference.lams.indexOf(lastLetter) === 0 && reference.alefs.indexOf(letter) > -1) || (reference.lams.indexOf(lastLetter) > 0 && reference.alefs.indexOf(letter) === 0))) {
28302                         // valid LA forms
28303                         letters[letters.length - 1] += letter;
28304                     }
28305                     else {
28306                         letters.push(letter);
28307                     }
28308                 }
28309                 else {
28310                     letters.push(letter);
28311                 }
28312                 if (reference.tashkeel.indexOf(letter) === -1) {
28313                     lastLetter = letter;
28314                 }
28315             });
28316             return letters;
28317         }
28318         exports.GlyphSplitter = GlyphSplitter;
28319         });
28320
28321         unwrapExports(GlyphSplitter_1);
28322         var GlyphSplitter_2 = GlyphSplitter_1.GlyphSplitter;
28323
28324         var BaselineSplitter_1 = createCommonjsModule(function (module, exports) {
28325         Object.defineProperty(exports, "__esModule", { value: true });
28326
28327
28328         function BaselineSplitter(word) {
28329             var letters = [];
28330             var lastLetter = '';
28331             word.split('').forEach(function (letter) {
28332                 if (isArabic_1.isArabic(letter) && isArabic_1.isArabic(lastLetter)) {
28333                     if (lastLetter.length && reference.tashkeel.indexOf(letter) > -1) {
28334                         letters[letters.length - 1] += letter;
28335                     }
28336                     else if (reference.lineBreakers.indexOf(lastLetter) > -1) {
28337                         letters.push(letter);
28338                     }
28339                     else {
28340                         letters[letters.length - 1] += letter;
28341                     }
28342                 }
28343                 else {
28344                     letters.push(letter);
28345                 }
28346                 if (reference.tashkeel.indexOf(letter) === -1) {
28347                     // don't allow tashkeel to hide line break
28348                     lastLetter = letter;
28349                 }
28350             });
28351             return letters;
28352         }
28353         exports.BaselineSplitter = BaselineSplitter;
28354         });
28355
28356         unwrapExports(BaselineSplitter_1);
28357         var BaselineSplitter_2 = BaselineSplitter_1.BaselineSplitter;
28358
28359         var Normalization = createCommonjsModule(function (module, exports) {
28360         Object.defineProperty(exports, "__esModule", { value: true });
28361
28362
28363
28364
28365         function Normal(word, breakPresentationForm) {
28366             // default is to turn initial/isolated/medial/final presentation form to generic
28367             if (typeof breakPresentationForm === 'undefined') {
28368                 breakPresentationForm = true;
28369             }
28370             var returnable = '';
28371             word.split('').forEach(function (letter) {
28372                 if (!isArabic_1.isArabic(letter)) {
28373                     returnable += letter;
28374                     return;
28375                 }
28376                 for (var w = 0; w < reference.letterList.length; w++) {
28377                     // ok so we are checking this potential lettertron
28378                     var letterForms = unicodeArabic.default[reference.letterList[w]];
28379                     var versions = Object.keys(letterForms);
28380                     for (var v = 0; v < versions.length; v++) {
28381                         var localVersion = letterForms[versions[v]];
28382                         if (typeof localVersion === 'object' && typeof localVersion.indexOf === 'undefined') {
28383                             // look at this embedded object
28384                             var embeddedForms = Object.keys(localVersion);
28385                             for (var ef = 0; ef < embeddedForms.length; ef++) {
28386                                 var form = localVersion[embeddedForms[ef]];
28387                                 if (form === letter || (typeof form === 'object' && form.indexOf && form.indexOf(letter) > -1)) {
28388                                     // match
28389                                     // console.log('embedded match');
28390                                     if (form === letter) {
28391                                         // match exact
28392                                         if (breakPresentationForm && localVersion['normal'] && ['isolated', 'initial', 'medial', 'final'].indexOf(embeddedForms[ef]) > -1) {
28393                                             // replace presentation form
28394                                             // console.log('keeping normal form of the letter');
28395                                             if (typeof localVersion['normal'] === 'object') {
28396                                                 returnable += localVersion['normal'][0];
28397                                             }
28398                                             else {
28399                                                 returnable += localVersion['normal'];
28400                                             }
28401                                             return;
28402                                         }
28403                                         // console.log('keeping this letter');
28404                                         returnable += letter;
28405                                         return;
28406                                     }
28407                                     else if (typeof form === 'object' && form.indexOf && form.indexOf(letter) > -1) {
28408                                         // match
28409                                         returnable += form[0];
28410                                         // console.log('added the first letter from the same array');
28411                                         return;
28412                                     }
28413                                 }
28414                             }
28415                         }
28416                         else if (localVersion === letter) {
28417                             // match exact
28418                             if (breakPresentationForm && letterForms['normal'] && ['isolated', 'initial', 'medial', 'final'].indexOf(versions[v]) > -1) {
28419                                 // replace presentation form
28420                                 // console.log('keeping normal form of the letter');
28421                                 if (typeof letterForms['normal'] === 'object') {
28422                                     returnable += letterForms['normal'][0];
28423                                 }
28424                                 else {
28425                                     returnable += letterForms['normal'];
28426                                 }
28427                                 return;
28428                             }
28429                             // console.log('keeping this letter');
28430                             returnable += letter;
28431                             return;
28432                         }
28433                         else if (typeof localVersion === 'object' && localVersion.indexOf && localVersion.indexOf(letter) > -1) {
28434                             // match
28435                             returnable += localVersion[0];
28436                             // console.log('added the first letter from the same array');
28437                             return;
28438                         }
28439                     }
28440                 }
28441                 // try ligatures
28442                 for (var v2 = 0; v2 < reference.ligatureList.length; v2++) {
28443                     var normalForm = reference.ligatureList[v2];
28444                     if (normalForm !== 'words') {
28445                         var ligForms = Object.keys(unicodeLigatures.default[normalForm]);
28446                         for (var f = 0; f < ligForms.length; f++) {
28447                             if (unicodeLigatures.default[normalForm][ligForms[f]] === letter) {
28448                                 returnable += normalForm;
28449                                 return;
28450                             }
28451                         }
28452                     }
28453                 }
28454                 // try words ligatures
28455                 for (var v3 = 0; v3 < reference.ligatureWordList.length; v3++) {
28456                     var normalForm = reference.ligatureWordList[v3];
28457                     if (unicodeLigatures.default.words[normalForm] === letter) {
28458                         returnable += normalForm;
28459                         return;
28460                     }
28461                 }
28462                 returnable += letter;
28463                 // console.log('kept the letter')
28464             });
28465             return returnable;
28466         }
28467         exports.Normal = Normal;
28468         });
28469
28470         unwrapExports(Normalization);
28471         var Normalization_1 = Normalization.Normal;
28472
28473         var CharShaper_1 = createCommonjsModule(function (module, exports) {
28474         Object.defineProperty(exports, "__esModule", { value: true });
28475
28476
28477
28478         function CharShaper(letter, form) {
28479             if (!isArabic_1.isArabic(letter)) {
28480                 // fail not Arabic
28481                 throw new Error('Not Arabic');
28482             }
28483             if (letter === "\u0621") {
28484                 // hamza alone
28485                 return "\u0621";
28486             }
28487             for (var w = 0; w < reference.letterList.length; w++) {
28488                 // ok so we are checking this potential lettertron
28489                 var letterForms = unicodeArabic.default[reference.letterList[w]];
28490                 var versions = Object.keys(letterForms);
28491                 for (var v = 0; v < versions.length; v++) {
28492                     var localVersion = letterForms[versions[v]];
28493                     if ((localVersion === letter) ||
28494                         (typeof localVersion === 'object' && localVersion.indexOf && localVersion.indexOf(letter) > -1)) {
28495                         if (versions.indexOf(form) > -1) {
28496                             return letterForms[form];
28497                         }
28498                     }
28499                     else if (typeof localVersion === 'object' && typeof localVersion.indexOf === 'undefined') {
28500                         // check embedded
28501                         var embeddedVersions = Object.keys(localVersion);
28502                         for (var ev = 0; ev < embeddedVersions.length; ev++) {
28503                             if ((localVersion[embeddedVersions[ev]] === letter) ||
28504                                 (typeof localVersion[embeddedVersions[ev]] === 'object' && localVersion[embeddedVersions[ev]].indexOf && localVersion[embeddedVersions[ev]].indexOf(letter) > -1)) {
28505                                 if (embeddedVersions.indexOf(form) > -1) {
28506                                     return localVersion[form];
28507                                 }
28508                             }
28509                         }
28510                     }
28511                 }
28512             }
28513         }
28514         exports.CharShaper = CharShaper;
28515         });
28516
28517         unwrapExports(CharShaper_1);
28518         var CharShaper_2 = CharShaper_1.CharShaper;
28519
28520         var WordShaper_1 = createCommonjsModule(function (module, exports) {
28521         Object.defineProperty(exports, "__esModule", { value: true });
28522
28523
28524
28525
28526         function WordShaper(word) {
28527             var state = 'initial';
28528             var output = '';
28529             for (var w = 0; w < word.length; w++) {
28530                 var nextLetter = ' ';
28531                 for (var nxw = w + 1; nxw < word.length; nxw++) {
28532                     if (!isArabic_1.isArabic(word[nxw])) {
28533                         break;
28534                     }
28535                     if (reference.tashkeel.indexOf(word[nxw]) === -1) {
28536                         nextLetter = word[nxw];
28537                         break;
28538                     }
28539                 }
28540                 if (!isArabic_1.isArabic(word[w]) || isArabic_1.isMath(word[w])) {
28541                     // space or other non-Arabic
28542                     output += word[w];
28543                     state = 'initial';
28544                 }
28545                 else if (reference.tashkeel.indexOf(word[w]) > -1) {
28546                     // tashkeel - add without changing state
28547                     output += word[w];
28548                 }
28549                 else if ((nextLetter === ' ') // last Arabic letter in this word
28550                     || (reference.lineBreakers.indexOf(word[w]) > -1)) { // the current letter is known to break lines
28551                     output += CharShaper_1.CharShaper(word[w], state === 'initial' ? 'isolated' : 'final');
28552                     state = 'initial';
28553                 }
28554                 else if (reference.lams.indexOf(word[w]) > -1 && reference.alefs.indexOf(nextLetter) > -1) {
28555                     // LA letters - advance an additional letter after this
28556                     output += unicodeLigatures.default[word[w] + nextLetter][(state === 'initial' ? 'isolated' : 'final')];
28557                     while (word[w] !== nextLetter) {
28558                         w++;
28559                     }
28560                     state = 'initial';
28561                 }
28562                 else {
28563                     output += CharShaper_1.CharShaper(word[w], state);
28564                     state = 'medial';
28565                 }
28566             }
28567             return output;
28568         }
28569         exports.WordShaper = WordShaper;
28570         });
28571
28572         unwrapExports(WordShaper_1);
28573         var WordShaper_2 = WordShaper_1.WordShaper;
28574
28575         var ParentLetter_1 = createCommonjsModule(function (module, exports) {
28576         Object.defineProperty(exports, "__esModule", { value: true });
28577
28578
28579
28580         function ParentLetter(letter) {
28581             if (!isArabic_1.isArabic(letter)) {
28582                 throw new Error('Not an Arabic letter');
28583             }
28584             for (var w = 0; w < reference.letterList.length; w++) {
28585                 // ok so we are checking this potential lettertron
28586                 var letterForms = unicodeArabic.default[reference.letterList[w]];
28587                 var versions = Object.keys(letterForms);
28588                 for (var v = 0; v < versions.length; v++) {
28589                     var localVersion = letterForms[versions[v]];
28590                     if (typeof localVersion === 'object' && typeof localVersion.indexOf === 'undefined') {
28591                         // look at this embedded object
28592                         var embeddedForms = Object.keys(localVersion);
28593                         for (var ef = 0; ef < embeddedForms.length; ef++) {
28594                             var form = localVersion[embeddedForms[ef]];
28595                             if (form === letter || (typeof form === 'object' && form.indexOf && form.indexOf(letter) > -1)) {
28596                                 // match
28597                                 return localVersion;
28598                             }
28599                         }
28600                     }
28601                     else if (localVersion === letter || (typeof localVersion === 'object' && localVersion.indexOf && localVersion.indexOf(letter) > -1)) {
28602                         // match
28603                         return letterForms;
28604                     }
28605                 }
28606                 return null;
28607             }
28608         }
28609         exports.ParentLetter = ParentLetter;
28610         function GrandparentLetter(letter) {
28611             if (!isArabic_1.isArabic(letter)) {
28612                 throw new Error('Not an Arabic letter');
28613             }
28614             for (var w = 0; w < reference.letterList.length; w++) {
28615                 // ok so we are checking this potential lettertron
28616                 var letterForms = unicodeArabic.default[reference.letterList[w]];
28617                 var versions = Object.keys(letterForms);
28618                 for (var v = 0; v < versions.length; v++) {
28619                     var localVersion = letterForms[versions[v]];
28620                     if (typeof localVersion === 'object' && typeof localVersion.indexOf === 'undefined') {
28621                         // look at this embedded object
28622                         var embeddedForms = Object.keys(localVersion);
28623                         for (var ef = 0; ef < embeddedForms.length; ef++) {
28624                             var form = localVersion[embeddedForms[ef]];
28625                             if (form === letter || (typeof form === 'object' && form.indexOf && form.indexOf(letter) > -1)) {
28626                                 // match
28627                                 return letterForms;
28628                             }
28629                         }
28630                     }
28631                     else if (localVersion === letter || (typeof localVersion === 'object' && localVersion.indexOf && localVersion.indexOf(letter) > -1)) {
28632                         // match
28633                         return letterForms;
28634                     }
28635                 }
28636                 return null;
28637             }
28638         }
28639         exports.GrandparentLetter = GrandparentLetter;
28640         });
28641
28642         unwrapExports(ParentLetter_1);
28643         var ParentLetter_2 = ParentLetter_1.ParentLetter;
28644         var ParentLetter_3 = ParentLetter_1.GrandparentLetter;
28645
28646         var lib$1 = createCommonjsModule(function (module, exports) {
28647         Object.defineProperty(exports, "__esModule", { value: true });
28648
28649         exports.isArabic = isArabic_1.isArabic;
28650
28651         exports.GlyphSplitter = GlyphSplitter_1.GlyphSplitter;
28652
28653         exports.BaselineSplitter = BaselineSplitter_1.BaselineSplitter;
28654
28655         exports.Normal = Normalization.Normal;
28656
28657         exports.CharShaper = CharShaper_1.CharShaper;
28658
28659         exports.WordShaper = WordShaper_1.WordShaper;
28660
28661         exports.ParentLetter = ParentLetter_1.ParentLetter;
28662         exports.GrandparentLetter = ParentLetter_1.GrandparentLetter;
28663         });
28664
28665         unwrapExports(lib$1);
28666         var lib_1 = lib$1.isArabic;
28667         var lib_2 = lib$1.GlyphSplitter;
28668         var lib_3 = lib$1.BaselineSplitter;
28669         var lib_4 = lib$1.Normal;
28670         var lib_5 = lib$1.CharShaper;
28671         var lib_6 = lib$1.WordShaper;
28672         var lib_7 = lib$1.ParentLetter;
28673         var lib_8 = lib$1.GrandparentLetter;
28674
28675         // see https://github.com/openstreetmap/iD/pull/3707
28676
28677         var rtlRegex = /[\u0590-\u05FF\u0600-\u06FF\u0780-\u07BF]/;
28678
28679         function fixRTLTextForSvg(inputText) {
28680             var ret = '', rtlBuffer = [];
28681             var arabicRegex = /[\u0600-\u06FF]/g;
28682             var arabicMath = /[\u0660-\u066C]+/g;
28683             var thaanaVowel = /[\u07A6-\u07B0]/;
28684             var hebrewSign = /[\u0591-\u05bd\u05bf\u05c1-\u05c5\u05c7]/;
28685
28686             if (!arabicRegex.test(inputText)) {
28687                 // Hebrew or Thaana RTL script
28688                 for (var n = 0; n < inputText.length; n++) {
28689                     var c = inputText[n];
28690                     if ((thaanaVowel.test(c) || hebrewSign.test(c)) && rtlBuffer.length) {
28691                         rtlBuffer[rtlBuffer.length - 1] += c;
28692                     } else if (rtlRegex.test(c)) {
28693                         rtlBuffer.push(c);
28694                     } else if (c === ' ' && rtlBuffer.length) {
28695                         // whitespace within RTL text
28696                         rtlBuffer = [rtlBuffer.reverse().join('') + ' '];
28697                     } else {
28698                         // non-RTL character
28699                         ret += rtlBuffer.reverse().join('') + c;
28700                         rtlBuffer = [];
28701                     }
28702                 }
28703                 ret += rtlBuffer.reverse().join('');
28704                 return ret;
28705             } else {
28706                 var label = lib_6(inputText).split('').reverse().join('');
28707                 // prevent Arabic numbers from being reversed
28708                 var numericSwaps = label.match(arabicMath) || [];
28709                 for (var i = 0; i < numericSwaps.length; i++) {
28710                     if (numericSwaps[i].length > 1) {
28711                         label = label.replace(numericSwaps[i], numericSwaps[i].split('').reverse().join(''));
28712                     }
28713                 }
28714                 return label;
28715             }
28716         }
28717
28718         var translations = Object.create(null);
28719
28720         var currentLocale = 'en';
28721         var textDirection = 'ltr';
28722
28723         function setLocale(val) {
28724             if (translations[val] !== undefined) {
28725                 currentLocale = val;
28726             } else if (translations[val.split('-')[0]]) {
28727                 currentLocale = val.split('-')[0];
28728             }
28729         }
28730
28731         function addTranslation(id, value) {
28732             translations[id] = value;
28733         }
28734
28735         /**
28736          * Given a string identifier, try to find that string in the current
28737          * language, and return it.  This function will be called recursively
28738          * with locale `en` if a string can not be found in the requested language.
28739          *
28740          * @param {string}   s   string identifier
28741          * @param {object?}  o   object of token replacements and default string
28742          * @param {string?}  loc locale to use
28743          * @returns {string?} locale string
28744          */
28745         function t(s, o, loc) {
28746             loc = loc || currentLocale;
28747
28748             var path = s
28749                 .split('.')
28750                 .map(function (s) { return s.replace(/<TX_DOT>/g, '.'); })
28751                 .reverse();
28752
28753             var rep = translations[loc];
28754
28755             while (rep !== undefined && path.length) {
28756                 rep = rep[path.pop()];
28757             }
28758
28759             if (rep !== undefined) {
28760                 if (o) {
28761                     for (var k in o) {
28762                         var variable = '{' + k + '}';
28763                         var re = new RegExp(variable, 'g'); // check globally for variables
28764                         rep = rep.replace(re, o[k]);
28765                     }
28766                 }
28767                 return rep;
28768             }
28769
28770             if (loc !== 'en') {
28771                 return t(s, o, 'en');
28772             }
28773
28774             if (o && 'default' in o) {
28775                 return o.default;
28776             }
28777
28778             var missing = 'Missing ' + loc + ' translation: ' + s;
28779             if (typeof console !== 'undefined') console.error(missing); // eslint-disable-line
28780
28781             return missing;
28782         }
28783
28784         /**
28785          * Given string 'ltr' or 'rtl', save that setting
28786          *
28787          * @param {string} dir ltr or rtl
28788          */
28789
28790         function setTextDirection(dir) {
28791             textDirection = dir;
28792         }
28793
28794         var detected;
28795
28796         function utilDetect(force) {
28797             if (detected && !force) return detected;
28798             detected = {};
28799
28800             var ua = navigator.userAgent,
28801                 m = null,
28802                 q = utilStringQs(window.location.hash.substring(1));
28803
28804             m = ua.match(/(edge)\/?\s*(\.?\d+(\.\d+)*)/i);   // Edge
28805             if (m !== null) {
28806                 detected.browser = m[1];
28807                 detected.version = m[2];
28808             }
28809             if (!detected.browser) {
28810                 m = ua.match(/Trident\/.*rv:([0-9]{1,}[\.0-9]{0,})/i);   // IE11
28811                 if (m !== null) {
28812                     detected.browser = 'msie';
28813                     detected.version = m[1];
28814                 }
28815             }
28816             if (!detected.browser) {
28817                 m = ua.match(/(opr)\/?\s*(\.?\d+(\.\d+)*)/i);   // Opera 15+
28818                 if (m !== null) {
28819                     detected.browser = 'Opera';
28820                     detected.version = m[2];
28821                 }
28822             }
28823             if (!detected.browser) {
28824                 m = ua.match(/(opera|chrome|safari|firefox|msie)\/?\s*(\.?\d+(\.\d+)*)/i);
28825                 if (m !== null) {
28826                     detected.browser = m[1];
28827                     detected.version = m[2];
28828                     m = ua.match(/version\/([\.\d]+)/i);
28829                     if (m !== null) detected.version = m[1];
28830                 }
28831             }
28832             if (!detected.browser) {
28833                 detected.browser = navigator.appName;
28834                 detected.version = navigator.appVersion;
28835             }
28836
28837             // keep major.minor version only..
28838             detected.version = detected.version.split(/\W/).slice(0,2).join('.');
28839
28840             if (detected.browser.toLowerCase() === 'msie') {
28841                 detected.ie = true;
28842                 detected.browser = 'Internet Explorer';
28843                 detected.support = parseFloat(detected.version) >= 11;
28844             } else {
28845                 detected.ie = false;
28846                 detected.support = true;
28847             }
28848
28849             // Added due to incomplete svg style support. See #715
28850             detected.opera = (detected.browser.toLowerCase() === 'opera' && parseFloat(detected.version) < 15 );
28851
28852             // Set locale based on url param (format 'en-US') or browser lang (default)
28853             if (q.hasOwnProperty('locale')) {
28854                 detected.locale = q.locale;
28855                 detected.language = q.locale.split('-')[0];
28856             } else {
28857                 detected.locale = (navigator.language || navigator.userLanguage || 'en-US');
28858                 detected.language = detected.locale.split('-')[0];
28859
28860                 // Search `navigator.languages` for a better locale. Prefer the first language,
28861                 // unless the second language is a culture-specific version of the first one, see #3842
28862                 if (navigator.languages && navigator.languages.length > 0) {
28863                     var code0 = navigator.languages[0],
28864                         parts0 = code0.split('-');
28865
28866                     detected.locale = code0;
28867                     detected.language = parts0[0];
28868
28869                     if (navigator.languages.length > 1 && parts0.length === 1) {
28870                         var code1 = navigator.languages[1],
28871                             parts1 = code1.split('-');
28872
28873                         if (parts1[0] === parts0[0]) {
28874                             detected.locale = code1;
28875                         }
28876                     }
28877                 }
28878             }
28879
28880             // Loaded locale is stored in currentLocale
28881             // return that instead (except in the situation where 'en' might override 'en-US')
28882             var loadedLocale = currentLocale || 'en';
28883             if (loadedLocale !== 'en') {
28884                 detected.locale = loadedLocale;
28885                 detected.language = detected.locale.split('-')[0];
28886             }
28887
28888             // detect text direction
28889             var lang = dataLocales[detected.locale];
28890             if ((lang && lang.rtl) || (q.rtl === 'true')) {
28891                 detected.textDirection = 'rtl';
28892             } else {
28893                 detected.textDirection = 'ltr';
28894             }
28895             setTextDirection(detected.textDirection);
28896
28897             // detect host
28898             var loc = window.top.location;
28899             var origin = loc.origin;
28900             if (!origin) {  // for unpatched IE11
28901                 origin = loc.protocol + '//' + loc.hostname + (loc.port ? ':' + loc.port: '');
28902             }
28903
28904             detected.host = origin + loc.pathname;
28905
28906             detected.filedrop = (window.FileReader && 'ondrop' in window);
28907
28908             detected.download = !(detected.ie || detected.browser.toLowerCase() === 'edge');
28909
28910             detected.cssfilters = !(detected.ie || detected.browser.toLowerCase() === 'edge');
28911
28912             function nav(x) {
28913                 return navigator.userAgent.indexOf(x) !== -1;
28914             }
28915
28916             if (nav('Win')) {
28917                 detected.os = 'win';
28918                 detected.platform = 'Windows';
28919             }
28920             else if (nav('Mac')) {
28921                 detected.os = 'mac';
28922                 detected.platform = 'Macintosh';
28923             }
28924             else if (nav('X11') || nav('Linux')) {
28925                 detected.os = 'linux';
28926                 detected.platform = 'Linux';
28927             }
28928             else {
28929                 detected.os = 'win';
28930                 detected.platform = 'Unknown';
28931             }
28932
28933             return detected;
28934         }
28935
28936         function utilTagText(entity) {
28937             var obj = (entity && entity.tags) || {};
28938             return Object.keys(obj)
28939                 .map(function(k) { return k + '=' + obj[k]; })
28940                 .join(', ');
28941         }
28942
28943
28944         function utilTagDiff(oldTags, newTags) {
28945             var tagDiff = [];
28946             var keys = utilArrayUnion(Object.keys(oldTags), Object.keys(newTags)).sort();
28947             keys.forEach(function(k) {
28948                 var oldVal = oldTags[k];
28949                 var newVal = newTags[k];
28950
28951                 if (oldVal && (!newVal || newVal !== oldVal)) {
28952                     tagDiff.push({
28953                         type: '-',
28954                         key: k,
28955                         oldVal: oldVal,
28956                         newVal: newVal,
28957                         display: '- ' + k + '=' + oldVal
28958                     });
28959                 }
28960                 if (newVal && (!oldVal || newVal !== oldVal)) {
28961                     tagDiff.push({
28962                         type: '+',
28963                         key: k,
28964                         oldVal: oldVal,
28965                         newVal: newVal,
28966                         display: '+ ' + k + '=' + newVal
28967                     });
28968                 }
28969             });
28970             return tagDiff;
28971         }
28972
28973
28974         function utilEntitySelector(ids) {
28975             return ids.length ? '.' + ids.join(',.') : 'nothing';
28976         }
28977
28978
28979         // returns an selector to select entity ids for:
28980         //  - entityIDs passed in
28981         //  - shallow descendant entityIDs for any of those entities that are relations
28982         function utilEntityOrMemberSelector(ids, graph) {
28983             var seen = new Set(ids);
28984             ids.forEach(collectShallowDescendants);
28985             return utilEntitySelector(Array.from(seen));
28986
28987             function collectShallowDescendants(id) {
28988                 var entity = graph.hasEntity(id);
28989                 if (!entity || entity.type !== 'relation') return;
28990
28991                 entity.members
28992                     .map(function(member) { return member.id; })
28993                     .forEach(function(id) { seen.add(id); });
28994             }
28995         }
28996
28997
28998         // returns an selector to select entity ids for:
28999         //  - entityIDs passed in
29000         //  - deep descendant entityIDs for any of those entities that are relations
29001         function utilEntityOrDeepMemberSelector(ids, graph) {
29002             var seen = new Set();
29003             ids.forEach(collectDeepDescendants);
29004             return utilEntitySelector(Array.from(seen));
29005
29006             function collectDeepDescendants(id) {
29007                 if (seen.has(id)) return;
29008                 seen.add(id);
29009
29010                 var entity = graph.hasEntity(id);
29011                 if (!entity || entity.type !== 'relation') return;
29012
29013                 entity.members
29014                     .map(function(member) { return member.id; })
29015                     .forEach(collectDeepDescendants);   // recurse
29016             }
29017         }
29018
29019
29020         // Adds or removes highlight styling for the specified entities
29021         function utilHighlightEntities(ids, highlighted, context) {
29022             context.surface()
29023                 .selectAll(utilEntityOrDeepMemberSelector(ids, context.graph()))
29024                 .classed('highlighted', highlighted);
29025         }
29026
29027
29028         // returns an Array that is the union of:
29029         //  - nodes for any nodeIDs passed in
29030         //  - child nodes of any wayIDs passed in
29031         //  - descendant member and child nodes of relationIDs passed in
29032         function utilGetAllNodes(ids, graph) {
29033             var seen = new Set();
29034             var nodes = new Set();
29035
29036             ids.forEach(collectNodes);
29037             return Array.from(nodes);
29038
29039             function collectNodes(id) {
29040                 if (seen.has(id)) return;
29041                 seen.add(id);
29042
29043                 var entity = graph.hasEntity(id);
29044                 if (!entity) return;
29045
29046                 if (entity.type === 'node') {
29047                     nodes.add(entity);
29048                 } else if (entity.type === 'way') {
29049                     entity.nodes.forEach(collectNodes);
29050                 } else {
29051                     entity.members
29052                         .map(function(member) { return member.id; })
29053                         .forEach(collectNodes);   // recurse
29054                 }
29055             }
29056         }
29057
29058
29059         function utilDisplayName(entity) {
29060             var localizedNameKey = 'name:' + utilDetect().locale.toLowerCase().split('-')[0];
29061             var name = entity.tags[localizedNameKey] || entity.tags.name || '';
29062             var network = entity.tags.cycle_network || entity.tags.network;
29063
29064             if (!name && entity.tags.ref) {
29065                 name = entity.tags.ref;
29066                 if (network) {
29067                     name = network + ' ' + name;
29068                 }
29069             }
29070
29071             return name;
29072         }
29073
29074
29075         function utilDisplayNameForPath(entity) {
29076             var name = utilDisplayName(entity);
29077             var isFirefox = utilDetect().browser.toLowerCase().indexOf('firefox') > -1;
29078
29079             if (!isFirefox && name && rtlRegex.test(name)) {
29080                 name = fixRTLTextForSvg(name);
29081             }
29082
29083             return name;
29084         }
29085
29086
29087         function utilDisplayType(id) {
29088             return {
29089                 n: t('inspector.node'),
29090                 w: t('inspector.way'),
29091                 r: t('inspector.relation')
29092             }[id.charAt(0)];
29093         }
29094
29095
29096         function utilDisplayLabel(entity, context) {
29097             var displayName = utilDisplayName(entity);
29098             if (displayName) {
29099                 // use the display name if there is one
29100                 return displayName;
29101             }
29102             var preset = utilPreset(entity, context);
29103             if (preset && preset.name()) {
29104                 // use the preset name if there is a match
29105                 return preset.name();
29106             }
29107             // fallback to the display type (node/way/relation)
29108             return utilDisplayType(entity.id);
29109         }
29110
29111
29112         function utilPreset(entity, context) {
29113             return context.presets().match(entity, context.graph());
29114         }
29115
29116
29117         function utilEntityRoot(entityType) {
29118             return {
29119                 node: 'n',
29120                 way: 'w',
29121                 relation: 'r'
29122             }[entityType];
29123         }
29124
29125
29126         function utilStringQs(str) {
29127             return str.split('&').reduce(function(obj, pair){
29128                 var parts = pair.split('=');
29129                 if (parts.length === 2) {
29130                     obj[parts[0]] = (null === parts[1]) ? '' : decodeURIComponent(parts[1]);
29131                 }
29132                 return obj;
29133             }, {});
29134         }
29135
29136
29137         function utilQsString(obj, noencode) {
29138             // encode everything except special characters used in certain hash parameters:
29139             // "/" in map states, ":", ",", {" and "}" in background
29140             function softEncode(s) {
29141                 return encodeURIComponent(s).replace(/(%2F|%3A|%2C|%7B|%7D)/g, decodeURIComponent);
29142             }
29143
29144             return Object.keys(obj).sort().map(function(key) {
29145                 return encodeURIComponent(key) + '=' + (
29146                     noencode ? softEncode(obj[key]) : encodeURIComponent(obj[key]));
29147             }).join('&');
29148         }
29149
29150
29151         function utilPrefixDOMProperty(property) {
29152             var prefixes = ['webkit', 'ms', 'moz', 'o'];
29153             var i = -1;
29154             var n = prefixes.length;
29155             var s = document.body;
29156
29157             if (property in s)
29158                 return property;
29159
29160             property = property.substr(0, 1).toUpperCase() + property.substr(1);
29161
29162             while (++i < n) {
29163                 if (prefixes[i] + property in s) {
29164                     return prefixes[i] + property;
29165                 }
29166             }
29167
29168             return false;
29169         }
29170
29171
29172         function utilPrefixCSSProperty(property) {
29173             var prefixes = ['webkit', 'ms', 'Moz', 'O'];
29174             var i = -1;
29175             var n = prefixes.length;
29176             var s = document.body.style;
29177
29178             if (property.toLowerCase() in s) {
29179                 return property.toLowerCase();
29180             }
29181
29182             while (++i < n) {
29183                 if (prefixes[i] + property in s) {
29184                     return '-' + prefixes[i].toLowerCase() + property.replace(/([A-Z])/g, '-$1').toLowerCase();
29185                 }
29186             }
29187
29188             return false;
29189         }
29190
29191
29192         var transformProperty;
29193         function utilSetTransform(el, x, y, scale) {
29194             var prop = transformProperty = transformProperty || utilPrefixCSSProperty('Transform');
29195             var translate = utilDetect().opera ? 'translate('   + x + 'px,' + y + 'px)'
29196                 : 'translate3d(' + x + 'px,' + y + 'px,0)';
29197             return el.style(prop, translate + (scale ? ' scale(' + scale + ')' : ''));
29198         }
29199
29200
29201         // Calculates Levenshtein distance between two strings
29202         // see:  https://en.wikipedia.org/wiki/Levenshtein_distance
29203         // first converts the strings to lowercase and replaces diacritic marks with ascii equivalents.
29204         function utilEditDistance(a, b) {
29205             a = remove$1(a.toLowerCase());
29206             b = remove$1(b.toLowerCase());
29207             if (a.length === 0) return b.length;
29208             if (b.length === 0) return a.length;
29209             var matrix = [];
29210             for (var i = 0; i <= b.length; i++) { matrix[i] = [i]; }
29211             for (var j = 0; j <= a.length; j++) { matrix[0][j] = j; }
29212             for (i = 1; i <= b.length; i++) {
29213                 for (j = 1; j <= a.length; j++) {
29214                     if (b.charAt(i-1) === a.charAt(j-1)) {
29215                         matrix[i][j] = matrix[i-1][j-1];
29216                     } else {
29217                         matrix[i][j] = Math.min(matrix[i-1][j-1] + 1, // substitution
29218                             Math.min(matrix[i][j-1] + 1, // insertion
29219                             matrix[i-1][j] + 1)); // deletion
29220                     }
29221                 }
29222             }
29223             return matrix[b.length][a.length];
29224         }
29225
29226
29227         // a d3.mouse-alike which
29228         // 1. Only works on HTML elements, not SVG
29229         // 2. Does not cause style recalculation
29230         function utilFastMouse(container) {
29231             var rect = container.getBoundingClientRect();
29232             var rectLeft = rect.left;
29233             var rectTop = rect.top;
29234             var clientLeft = +container.clientLeft;
29235             var clientTop = +container.clientTop;
29236
29237             if (textDirection === 'rtl') {
29238                 rectLeft = 0;
29239             }
29240             return function(e) {
29241                 return [
29242                     e.clientX - rectLeft - clientLeft,
29243                     e.clientY - rectTop - clientTop];
29244             };
29245         }
29246
29247
29248         function utilAsyncMap(inputs, func, callback) {
29249             var remaining = inputs.length;
29250             var results = [];
29251             var errors = [];
29252
29253             inputs.forEach(function(d, i) {
29254                 func(d, function done(err, data) {
29255                     errors[i] = err;
29256                     results[i] = data;
29257                     remaining--;
29258                     if (!remaining) callback(errors, results);
29259                 });
29260             });
29261         }
29262
29263
29264         // wraps an index to an interval [0..length-1]
29265         function utilWrap(index, length) {
29266             if (index < 0) {
29267                 index += Math.ceil(-index/length)*length;
29268             }
29269             return index % length;
29270         }
29271
29272
29273         /**
29274          * a replacement for functor
29275          *
29276          * @param {*} value any value
29277          * @returns {Function} a function that returns that value or the value if it's a function
29278          */
29279         function utilFunctor(value) {
29280             if (typeof value === 'function') return value;
29281             return function() {
29282                 return value;
29283             };
29284         }
29285
29286
29287         function utilNoAuto(selection) {
29288             var isText = (selection.size() && selection.node().tagName.toLowerCase() === 'textarea');
29289
29290             return selection
29291                 // assign 'new-password' even for non-password fields to prevent browsers (Chrome) ignoring 'off'
29292                 .attr('autocomplete', 'new-password')
29293                 .attr('autocorrect', 'off')
29294                 .attr('autocapitalize', 'off')
29295                 .attr('spellcheck', isText ? 'true' : 'false');
29296         }
29297
29298
29299         // https://stackoverflow.com/questions/194846/is-there-any-kind-of-hash-code-function-in-javascript
29300         // https://werxltd.com/wp/2010/05/13/javascript-implementation-of-javas-string-hashcode-method/
29301         function utilHashcode(str) {
29302             var hash = 0;
29303             if (str.length === 0) {
29304                 return hash;
29305             }
29306             for (var i = 0; i < str.length; i++) {
29307                 var char = str.charCodeAt(i);
29308                 hash = ((hash << 5) - hash) + char;
29309                 hash = hash & hash; // Convert to 32bit integer
29310             }
29311             return hash;
29312         }
29313
29314         function utilCleanTags(tags) {
29315             var out = {};
29316             for (var k in tags) {
29317                 if (!k) continue;
29318                 var v = tags[k];
29319                 if (v !== undefined) {
29320                     out[k] = cleanValue(k, v);
29321                 }
29322             }
29323
29324             return out;
29325
29326
29327             function cleanValue(k, v) {
29328                 function keepSpaces(k) {
29329                     return /_hours|_times|:conditional$/.test(k);
29330                 }
29331
29332                 function skip(k) {
29333                     return /^(description|note|fixme)$/.test(k);
29334                 }
29335
29336                 if (skip(k)) return v;
29337
29338                 var cleaned = v
29339                     .split(';')
29340                     .map(function(s) { return s.trim(); })
29341                     .join(keepSpaces(k) ? '; ' : ';');
29342
29343                 // The code below is not intended to validate websites and emails.
29344                 // It is only intended to prevent obvious copy-paste errors. (#2323)
29345                 // clean website- and email-like tags
29346                 if (k.indexOf('website') !== -1 ||
29347                     k.indexOf('email') !== -1 ||
29348                     cleaned.indexOf('http') === 0) {
29349                     cleaned = cleaned
29350                         .replace(/[\u200B-\u200F\uFEFF]/g, '');  // strip LRM and other zero width chars
29351
29352                 }
29353
29354                 return cleaned;
29355             }
29356         }
29357
29358         // Like selection.property('value', ...), but avoids no-op value sets,
29359         // which can result in layout/repaint thrashing in some situations.
29360         function utilGetSetValue(selection, value) {
29361             function d3_selection_value(value) {
29362                 function valueNull() {
29363                     delete this.value;
29364                 }
29365
29366                 function valueConstant() {
29367                     if (this.value !== value) {
29368                         this.value = value;
29369                     }
29370                 }
29371
29372                 function valueFunction() {
29373                     var x = value.apply(this, arguments);
29374                     if (x == null) {
29375                         delete this.value;
29376                     } else if (this.value !== x) {
29377                         this.value = x;
29378                     }
29379                 }
29380
29381                 return value == null
29382                     ? valueNull : (typeof value === 'function'
29383                     ? valueFunction : valueConstant);
29384             }
29385
29386             if (arguments.length === 1) {
29387                 return selection.property('value');
29388             }
29389
29390             return selection.each(d3_selection_value(value));
29391         }
29392
29393         function utilKeybinding(namespace) {
29394             var _keybindings = {};
29395
29396
29397             function testBindings(isCapturing) {
29398                 var didMatch = false;
29399                 var bindings = Object.keys(_keybindings).map(function(id) { return _keybindings[id]; });
29400                 var i, binding;
29401
29402                 // Most key shortcuts will accept either lower or uppercase ('h' or 'H'),
29403                 // so we don't strictly match on the shift key, but we prioritize
29404                 // shifted keybindings first, and fallback to unshifted only if no match.
29405                 // (This lets us differentiate between '←'/'⇧←' or '⌘Z'/'⌘⇧Z')
29406
29407                 // priority match shifted keybindings first
29408                 for (i = 0; i < bindings.length; i++) {
29409                     binding = bindings[i];
29410                     if (!binding.event.modifiers.shiftKey) continue;  // no shift
29411                     if (!!binding.capture !== isCapturing) continue;
29412                     if (matches(binding, true)) {
29413                         binding.callback();
29414                         didMatch = true;
29415                     }
29416                 }
29417
29418                 // then unshifted keybindings
29419                 if (didMatch) return;
29420                 for (i = 0; i < bindings.length; i++) {
29421                     binding = bindings[i];
29422                     if (binding.event.modifiers.shiftKey) continue;   // shift
29423                     if (!!binding.capture !== isCapturing) continue;
29424                     if (matches(binding, false)) {
29425                         binding.callback();
29426                     }
29427                 }
29428
29429
29430                 function matches(binding, testShift) {
29431                     var event$1 = event;
29432                     var isMatch = false;
29433                     var tryKeyCode = true;
29434
29435                     // Prefer a match on `KeyboardEvent.key`
29436                     if (event$1.key !== undefined) {
29437                         tryKeyCode = (event$1.key.charCodeAt(0) > 255);  // outside ISO-Latin-1
29438                         isMatch = true;
29439
29440                         if (binding.event.key === undefined) {
29441                             isMatch = false;
29442                         } else if (Array.isArray(binding.event.key)) {
29443                             if (binding.event.key.map(function(s) { return s.toLowerCase(); }).indexOf(event$1.key.toLowerCase()) === -1)
29444                                 isMatch = false;
29445                         } else {
29446                             if (event$1.key.toLowerCase() !== binding.event.key.toLowerCase())
29447                                 isMatch = false;
29448                         }
29449                     }
29450
29451                     // Fallback match on `KeyboardEvent.keyCode`, can happen if:
29452                     // - browser doesn't support `KeyboardEvent.key`
29453                     // - `KeyboardEvent.key` is outside ISO-Latin-1 range (cyrillic?)
29454                     if (!isMatch && tryKeyCode) {
29455                         isMatch = (event$1.keyCode === binding.event.keyCode);
29456                     }
29457
29458                     if (!isMatch) return false;
29459
29460                     // test modifier keys
29461                     if (!(event$1.ctrlKey && event$1.altKey)) {  // if both are set, assume AltGr and skip it - #4096
29462                         if (event$1.ctrlKey !== binding.event.modifiers.ctrlKey) return false;
29463                         if (event$1.altKey !== binding.event.modifiers.altKey) return false;
29464                     }
29465                     if (event$1.metaKey !== binding.event.modifiers.metaKey) return false;
29466                     if (testShift && event$1.shiftKey !== binding.event.modifiers.shiftKey) return false;
29467
29468                     return true;
29469                 }
29470             }
29471
29472
29473             function capture() {
29474                 testBindings(true);
29475             }
29476
29477
29478             function bubble() {
29479                 var tagName = d3_select(event.target).node().tagName;
29480                 if (tagName === 'INPUT' || tagName === 'SELECT' || tagName === 'TEXTAREA') {
29481                     return;
29482                 }
29483                 testBindings(false);
29484             }
29485
29486
29487             function keybinding(selection) {
29488                 selection = selection || d3_select(document);
29489                 selection.on('keydown.capture.' + namespace, capture, true);
29490                 selection.on('keydown.bubble.' + namespace, bubble, false);
29491                 return keybinding;
29492             }
29493
29494             // was: keybinding.off()
29495             keybinding.unbind = function(selection) {
29496                 _keybindings = [];
29497                 selection = selection || d3_select(document);
29498                 selection.on('keydown.capture.' + namespace, null);
29499                 selection.on('keydown.bubble.' + namespace, null);
29500                 return keybinding;
29501             };
29502
29503
29504             keybinding.clear = function() {
29505                 _keybindings = {};
29506                 return keybinding;
29507             };
29508
29509
29510             // Remove one or more keycode bindings.
29511             keybinding.off = function(codes, capture) {
29512                 var arr = utilArrayUniq([].concat(codes));
29513
29514                 for (var i = 0; i < arr.length; i++) {
29515                     var id = arr[i] + (capture ? '-capture' : '-bubble');
29516                     delete _keybindings[id];
29517                 }
29518                 return keybinding;
29519             };
29520
29521
29522             // Add one or more keycode bindings.
29523             keybinding.on = function(codes, callback, capture) {
29524                 if (typeof callback !== 'function') {
29525                     return keybinding.off(codes, capture);
29526                 }
29527
29528                 var arr = utilArrayUniq([].concat(codes));
29529
29530                 for (var i = 0; i < arr.length; i++) {
29531                     var id = arr[i] + (capture ? '-capture' : '-bubble');
29532                     var binding = {
29533                         id: id,
29534                         capture: capture,
29535                         callback: callback,
29536                         event: {
29537                             key: undefined,  // preferred
29538                             keyCode: 0,      // fallback
29539                             modifiers: {
29540                                 shiftKey: false,
29541                                 ctrlKey: false,
29542                                 altKey: false,
29543                                 metaKey: false
29544                             }
29545                         }
29546                     };
29547
29548                     if (_keybindings[id]) {
29549                         console.warn('warning: duplicate keybinding for "' + id + '"'); // eslint-disable-line no-console
29550                     }
29551
29552                     _keybindings[id] = binding;
29553
29554                     var matches = arr[i].toLowerCase().match(/(?:(?:[^+⇧⌃⌥⌘])+|[⇧⌃⌥⌘]|\+\+|^\+$)/g);
29555                     for (var j = 0; j < matches.length; j++) {
29556                         // Normalise matching errors
29557                         if (matches[j] === '++') matches[j] = '+';
29558
29559                         if (matches[j] in utilKeybinding.modifierCodes) {
29560                             var prop = utilKeybinding.modifierProperties[utilKeybinding.modifierCodes[matches[j]]];
29561                             binding.event.modifiers[prop] = true;
29562                         } else {
29563                             binding.event.key = utilKeybinding.keys[matches[j]] || matches[j];
29564                             if (matches[j] in utilKeybinding.keyCodes) {
29565                                 binding.event.keyCode = utilKeybinding.keyCodes[matches[j]];
29566                             }
29567                         }
29568                     }
29569                 }
29570
29571                 return keybinding;
29572             };
29573
29574
29575             return keybinding;
29576         }
29577
29578
29579         /*
29580          * See https://github.com/keithamus/jwerty
29581          */
29582
29583         utilKeybinding.modifierCodes = {
29584             // Shift key, ⇧
29585             '⇧': 16, shift: 16,
29586             // CTRL key, on Mac: ⌃
29587             '⌃': 17, ctrl: 17,
29588             // ALT key, on Mac: ⌥ (Alt)
29589             '⌥': 18, alt: 18, option: 18,
29590             // META, on Mac: ⌘ (CMD), on Windows (Win), on Linux (Super)
29591             '⌘': 91, meta: 91, cmd: 91, 'super': 91, win: 91
29592         };
29593
29594         utilKeybinding.modifierProperties = {
29595             16: 'shiftKey',
29596             17: 'ctrlKey',
29597             18: 'altKey',
29598             91: 'metaKey'
29599         };
29600
29601         utilKeybinding.keys = {
29602             // Backspace key, on Mac: ⌫ (Backspace)
29603             '⌫': 'Backspace', backspace: 'Backspace',
29604             // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥
29605             '⇥': 'Tab', '⇆': 'Tab', tab: 'Tab',
29606             // Return key, ↩
29607             '↩': 'Enter', 'return': 'Enter', enter: 'Enter', '⌅': 'Enter',
29608             // Pause/Break key
29609             'pause': 'Pause', 'pause-break': 'Pause',
29610             // Caps Lock key, ⇪
29611             '⇪': 'CapsLock', caps: 'CapsLock', 'caps-lock': 'CapsLock',
29612             // Escape key, on Mac: ⎋, on Windows: Esc
29613             '⎋': ['Escape', 'Esc'], escape: ['Escape', 'Esc'], esc: ['Escape', 'Esc'],
29614             // Space key
29615             space: [' ', 'Spacebar'],
29616             // Page-Up key, or pgup, on Mac: ↖
29617             '↖': 'PageUp', pgup: 'PageUp', 'page-up': 'PageUp',
29618             // Page-Down key, or pgdown, on Mac: ↘
29619             '↘': 'PageDown', pgdown: 'PageDown', 'page-down': 'PageDown',
29620             // END key, on Mac: ⇟
29621             '⇟': 'End', end: 'End',
29622             // HOME key, on Mac: ⇞
29623             '⇞': 'Home', home: 'Home',
29624             // Insert key, or ins
29625             ins: 'Insert', insert: 'Insert',
29626             // Delete key, on Mac: ⌦ (Delete)
29627             '⌦': ['Delete', 'Del'], del: ['Delete', 'Del'], 'delete': ['Delete', 'Del'],
29628             // Left Arrow Key, or ←
29629             '←': ['ArrowLeft', 'Left'], left: ['ArrowLeft', 'Left'], 'arrow-left': ['ArrowLeft', 'Left'],
29630             // Up Arrow Key, or ↑
29631             '↑': ['ArrowUp', 'Up'], up: ['ArrowUp', 'Up'], 'arrow-up': ['ArrowUp', 'Up'],
29632             // Right Arrow Key, or →
29633             '→': ['ArrowRight', 'Right'], right: ['ArrowRight', 'Right'], 'arrow-right': ['ArrowRight', 'Right'],
29634             // Up Arrow Key, or ↓
29635             '↓': ['ArrowDown', 'Down'], down: ['ArrowDown', 'Down'], 'arrow-down': ['ArrowDown', 'Down'],
29636             // odities, stuff for backward compatibility (browsers and code):
29637             // Num-Multiply, or *
29638             '*': ['*', 'Multiply'], star: ['*', 'Multiply'], asterisk: ['*', 'Multiply'], multiply: ['*', 'Multiply'],
29639             // Num-Plus or +
29640             '+': ['+', 'Add'], 'plus': ['+', 'Add'],
29641             // Num-Subtract, or -
29642             '-': ['-', 'Subtract'], subtract: ['-', 'Subtract'], 'dash': ['-', 'Subtract'],
29643             // Semicolon
29644             semicolon: ';',
29645             // = or equals
29646             equals: '=',
29647             // Comma, or ,
29648             comma: ',',
29649             // Period, or ., or full-stop
29650             period: '.', 'full-stop': '.',
29651             // Slash, or /, or forward-slash
29652             slash: '/', 'forward-slash': '/',
29653             // Tick, or `, or back-quote
29654             tick: '`', 'back-quote': '`',
29655             // Open bracket, or [
29656             'open-bracket': '[',
29657             // Back slash, or \
29658             'back-slash': '\\',
29659             // Close backet, or ]
29660             'close-bracket': ']',
29661             // Apostrophe, or Quote, or '
29662             quote: '\'', apostrophe: '\'',
29663             // NUMPAD 0-9
29664             'num-0': '0',
29665             'num-1': '1',
29666             'num-2': '2',
29667             'num-3': '3',
29668             'num-4': '4',
29669             'num-5': '5',
29670             'num-6': '6',
29671             'num-7': '7',
29672             'num-8': '8',
29673             'num-9': '9',
29674             // F1-F25
29675             f1: 'F1',
29676             f2: 'F2',
29677             f3: 'F3',
29678             f4: 'F4',
29679             f5: 'F5',
29680             f6: 'F6',
29681             f7: 'F7',
29682             f8: 'F8',
29683             f9: 'F9',
29684             f10: 'F10',
29685             f11: 'F11',
29686             f12: 'F12',
29687             f13: 'F13',
29688             f14: 'F14',
29689             f15: 'F15',
29690             f16: 'F16',
29691             f17: 'F17',
29692             f18: 'F18',
29693             f19: 'F19',
29694             f20: 'F20',
29695             f21: 'F21',
29696             f22: 'F22',
29697             f23: 'F23',
29698             f24: 'F24',
29699             f25: 'F25'
29700         };
29701
29702         utilKeybinding.keyCodes = {
29703             // Backspace key, on Mac: ⌫ (Backspace)
29704             '⌫': 8, backspace: 8,
29705             // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥
29706             '⇥': 9, '⇆': 9, tab: 9,
29707             // Return key, ↩
29708             '↩': 13, 'return': 13, enter: 13, '⌅': 13,
29709             // Pause/Break key
29710             'pause': 19, 'pause-break': 19,
29711             // Caps Lock key, ⇪
29712             '⇪': 20, caps: 20, 'caps-lock': 20,
29713             // Escape key, on Mac: ⎋, on Windows: Esc
29714             '⎋': 27, escape: 27, esc: 27,
29715             // Space key
29716             space: 32,
29717             // Page-Up key, or pgup, on Mac: ↖
29718             '↖': 33, pgup: 33, 'page-up': 33,
29719             // Page-Down key, or pgdown, on Mac: ↘
29720             '↘': 34, pgdown: 34, 'page-down': 34,
29721             // END key, on Mac: ⇟
29722             '⇟': 35, end: 35,
29723             // HOME key, on Mac: ⇞
29724             '⇞': 36, home: 36,
29725             // Insert key, or ins
29726             ins: 45, insert: 45,
29727             // Delete key, on Mac: ⌦ (Delete)
29728             '⌦': 46, del: 46, 'delete': 46,
29729             // Left Arrow Key, or ←
29730             '←': 37, left: 37, 'arrow-left': 37,
29731             // Up Arrow Key, or ↑
29732             '↑': 38, up: 38, 'arrow-up': 38,
29733             // Right Arrow Key, or →
29734             '→': 39, right: 39, 'arrow-right': 39,
29735             // Up Arrow Key, or ↓
29736             '↓': 40, down: 40, 'arrow-down': 40,
29737             // odities, printing characters that come out wrong:
29738             // Firefox Equals
29739             'ffequals': 61,
29740             // Num-Multiply, or *
29741             '*': 106, star: 106, asterisk: 106, multiply: 106,
29742             // Num-Plus or +
29743             '+': 107, 'plus': 107,
29744             // Num-Subtract, or -
29745             '-': 109, subtract: 109,
29746             // Firefox Plus
29747             'ffplus': 171,
29748             // Firefox Minus
29749             'ffminus': 173,
29750             // Semicolon
29751             ';': 186, semicolon: 186,
29752             // = or equals
29753             '=': 187, 'equals': 187,
29754             // Comma, or ,
29755             ',': 188, comma: 188,
29756             // Dash / Underscore key
29757             'dash': 189,
29758             // Period, or ., or full-stop
29759             '.': 190, period: 190, 'full-stop': 190,
29760             // Slash, or /, or forward-slash
29761             '/': 191, slash: 191, 'forward-slash': 191,
29762             // Tick, or `, or back-quote
29763             '`': 192, tick: 192, 'back-quote': 192,
29764             // Open bracket, or [
29765             '[': 219, 'open-bracket': 219,
29766             // Back slash, or \
29767             '\\': 220, 'back-slash': 220,
29768             // Close backet, or ]
29769             ']': 221, 'close-bracket': 221,
29770             // Apostrophe, or Quote, or '
29771             '\'': 222, quote: 222, apostrophe: 222
29772         };
29773
29774         // NUMPAD 0-9
29775         var i$2 = 95, n = 0;
29776         while (++i$2 < 106) {
29777             utilKeybinding.keyCodes['num-' + n] = i$2;
29778             ++n;
29779         }
29780
29781         // 0-9
29782         i$2 = 47; n = 0;
29783         while (++i$2 < 58) {
29784             utilKeybinding.keyCodes[n] = i$2;
29785             ++n;
29786         }
29787
29788         // F1-F25
29789         i$2 = 111; n = 1;
29790         while (++i$2 < 136) {
29791             utilKeybinding.keyCodes['f' + n] = i$2;
29792             ++n;
29793         }
29794
29795         // a-z
29796         i$2 = 64;
29797         while (++i$2 < 91) {
29798             utilKeybinding.keyCodes[String.fromCharCode(i$2).toLowerCase()] = i$2;
29799         }
29800
29801         function utilObjectOmit(obj, omitKeys) {
29802             return Object.keys(obj).reduce(function(result, key) {
29803                 if (omitKeys.indexOf(key) === -1) {
29804                     result[key] = obj[key];  // keep
29805                 }
29806                 return result;
29807             }, {});
29808         }
29809
29810         // Copies a variable number of methods from source to target.
29811         function utilRebind(target, source) {
29812             var i = 1, n = arguments.length, method;
29813             while (++i < n) {
29814                 target[method = arguments[i]] = d3_rebind(target, source, source[method]);
29815             }
29816             return target;
29817         }
29818
29819         // Method is assumed to be a standard D3 getter-setter:
29820         // If passed with no arguments, gets the value.
29821         // If passed with arguments, sets the value and returns the target.
29822         function d3_rebind(target, source, method) {
29823             return function() {
29824                 var value = method.apply(source, arguments);
29825                 return value === source ? target : value;
29826             };
29827         }
29828
29829         // A per-domain session mutex backed by a cookie and dead man's
29830         // switch. If the session crashes, the mutex will auto-release
29831         // after 5 seconds.
29832
29833         // This accepts a string and returns an object that complies with utilSessionMutexType
29834         function utilSessionMutex(name) {
29835             var mutex = {};
29836             var intervalID;
29837
29838             function renew() {
29839                 var expires = new Date();
29840                 expires.setSeconds(expires.getSeconds() + 5);
29841                 document.cookie = name + '=1; expires=' + expires.toUTCString();
29842             }
29843
29844             mutex.lock = function () {
29845                 if (intervalID) return true;
29846                 var cookie = document.cookie.replace(new RegExp('(?:(?:^|.*;)\\s*' + name + '\\s*\\=\\s*([^;]*).*$)|^.*$'), '$1');
29847                 if (cookie) return false;
29848                 renew();
29849                 intervalID = window.setInterval(renew, 4000);
29850                 return true;
29851             };
29852
29853             mutex.unlock = function () {
29854                 if (!intervalID) return;
29855                 document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:00 GMT';
29856                 clearInterval(intervalID);
29857                 intervalID = null;
29858             };
29859
29860             mutex.locked = function () {
29861                 return !!intervalID;
29862             };
29863
29864             return mutex;
29865         }
29866
29867         function utilTiler() {
29868             var _size = [256, 256];
29869             var _scale = 256;
29870             var _tileSize = 256;
29871             var _zoomExtent = [0, 20];
29872             var _translate = [_size[0] / 2, _size[1] / 2];
29873             var _margin = 0;
29874             var _skipNullIsland = false;
29875
29876
29877             function clamp(num, min, max) {
29878                 return Math.max(min, Math.min(num, max));
29879             }
29880
29881
29882             function nearNullIsland(tile) {
29883                 var x = tile[0];
29884                 var y = tile[1];
29885                 var z = tile[2];
29886                 if (z >= 7) {
29887                     var center = Math.pow(2, z - 1);
29888                     var width = Math.pow(2, z - 6);
29889                     var min = center - (width / 2);
29890                     var max = center + (width / 2) - 1;
29891                     return x >= min && x <= max && y >= min && y <= max;
29892                 }
29893                 return false;
29894             }
29895
29896
29897             function tiler() {
29898                 var z = geoScaleToZoom(_scale / (2 * Math.PI), _tileSize);
29899                 var z0 = clamp(Math.round(z), _zoomExtent[0], _zoomExtent[1]);
29900                 var tileMin = 0;
29901                 var tileMax = Math.pow(2, z0) - 1;
29902                 var log2ts = Math.log(_tileSize) * Math.LOG2E;
29903                 var k = Math.pow(2, z - z0 + log2ts);
29904                 var origin = [
29905                     (_translate[0] - _scale / 2) / k,
29906                     (_translate[1] - _scale / 2) / k
29907                 ];
29908
29909                 var cols = d3_range(
29910                     clamp(Math.floor(-origin[0]) - _margin,               tileMin, tileMax + 1),
29911                     clamp(Math.ceil(_size[0] / k - origin[0]) + _margin,  tileMin, tileMax + 1)
29912                 );
29913                 var rows = d3_range(
29914                     clamp(Math.floor(-origin[1]) - _margin,               tileMin, tileMax + 1),
29915                     clamp(Math.ceil(_size[1] / k - origin[1]) + _margin,  tileMin, tileMax + 1)
29916                 );
29917
29918                 var tiles = [];
29919                 for (var i = 0; i < rows.length; i++) {
29920                     var y = rows[i];
29921                     for (var j = 0; j < cols.length; j++) {
29922                         var x = cols[j];
29923
29924                         if (i >= _margin && i <= rows.length - _margin &&
29925                             j >= _margin && j <= cols.length - _margin) {
29926                             tiles.unshift([x, y, z0]);  // tiles in view at beginning
29927                         } else {
29928                             tiles.push([x, y, z0]);     // tiles in margin at the end
29929                         }
29930                     }
29931                 }
29932
29933                 tiles.translate = origin;
29934                 tiles.scale = k;
29935
29936                 return tiles;
29937             }
29938
29939
29940             /**
29941              * getTiles() returns an array of tiles that cover the map view
29942              */
29943             tiler.getTiles = function(projection) {
29944                 var origin = [
29945                     projection.scale() * Math.PI - projection.translate()[0],
29946                     projection.scale() * Math.PI - projection.translate()[1]
29947                 ];
29948
29949                 this
29950                     .size(projection.clipExtent()[1])
29951                     .scale(projection.scale() * 2 * Math.PI)
29952                     .translate(projection.translate());
29953
29954                 var tiles = tiler();
29955                 var ts = tiles.scale;
29956
29957                 return tiles
29958                     .map(function(tile) {
29959                         if (_skipNullIsland && nearNullIsland(tile)) {
29960                             return false;
29961                         }
29962                         var x = tile[0] * ts - origin[0];
29963                         var y = tile[1] * ts - origin[1];
29964                         return {
29965                             id: tile.toString(),
29966                             xyz: tile,
29967                             extent: geoExtent(
29968                                 projection.invert([x, y + ts]),
29969                                 projection.invert([x + ts, y])
29970                             )
29971                         };
29972                     }).filter(Boolean);
29973             };
29974
29975
29976             /**
29977              * getGeoJSON() returns a FeatureCollection for debugging tiles
29978              */
29979             tiler.getGeoJSON = function(projection) {
29980                 var features = tiler.getTiles(projection).map(function(tile) {
29981                     return {
29982                         type: 'Feature',
29983                         properties: {
29984                             id: tile.id,
29985                             name: tile.id
29986                         },
29987                         geometry: {
29988                             type: 'Polygon',
29989                             coordinates: [ tile.extent.polygon() ]
29990                         }
29991                     };
29992                 });
29993
29994                 return {
29995                     type: 'FeatureCollection',
29996                     features: features
29997                 };
29998             };
29999
30000
30001             tiler.tileSize = function(val) {
30002                 if (!arguments.length) return _tileSize;
30003                 _tileSize = val;
30004                 return tiler;
30005             };
30006
30007
30008             tiler.zoomExtent = function(val) {
30009                 if (!arguments.length) return _zoomExtent;
30010                 _zoomExtent = val;
30011                 return tiler;
30012             };
30013
30014
30015             tiler.size = function(val) {
30016                 if (!arguments.length) return _size;
30017                 _size = val;
30018                 return tiler;
30019             };
30020
30021
30022             tiler.scale = function(val) {
30023                 if (!arguments.length) return _scale;
30024                 _scale = val;
30025                 return tiler;
30026             };
30027
30028
30029             tiler.translate = function(val) {
30030                 if (!arguments.length) return _translate;
30031                 _translate = val;
30032                 return tiler;
30033             };
30034
30035
30036             // number to extend the rows/columns beyond those covering the viewport
30037             tiler.margin = function(val) {
30038                 if (!arguments.length) return _margin;
30039                 _margin = +val;
30040                 return tiler;
30041             };
30042
30043
30044             tiler.skipNullIsland = function(val) {
30045                 if (!arguments.length) return _skipNullIsland;
30046                 _skipNullIsland = val;
30047                 return tiler;
30048             };
30049
30050
30051             return tiler;
30052         }
30053
30054         function utilTriggerEvent(target, type) {
30055             target.each(function() {
30056                 var evt = document.createEvent('HTMLEvents');
30057                 evt.initEvent(type, true, true);
30058                 this.dispatchEvent(evt);
30059             });
30060         }
30061
30062         function osmEntity(attrs) {
30063             // For prototypal inheritance.
30064             if (this instanceof osmEntity) return;
30065
30066             // Create the appropriate subtype.
30067             if (attrs && attrs.type) {
30068                 return osmEntity[attrs.type].apply(this, arguments);
30069             } else if (attrs && attrs.id) {
30070                 return osmEntity[osmEntity.id.type(attrs.id)].apply(this, arguments);
30071             }
30072
30073             // Initialize a generic Entity (used only in tests).
30074             return (new osmEntity()).initialize(arguments);
30075         }
30076
30077
30078         osmEntity.id = function(type) {
30079             return osmEntity.id.fromOSM(type, osmEntity.id.next[type]--);
30080         };
30081
30082
30083         osmEntity.id.next = {
30084             changeset: -1, node: -1, way: -1, relation: -1
30085         };
30086
30087
30088         osmEntity.id.fromOSM = function(type, id) {
30089             return type[0] + id;
30090         };
30091
30092
30093         osmEntity.id.toOSM = function(id) {
30094             return id.slice(1);
30095         };
30096
30097
30098         osmEntity.id.type = function(id) {
30099             return { 'c': 'changeset', 'n': 'node', 'w': 'way', 'r': 'relation' }[id[0]];
30100         };
30101
30102
30103         // A function suitable for use as the second argument to d3.selection#data().
30104         osmEntity.key = function(entity) {
30105             return entity.id + 'v' + (entity.v || 0);
30106         };
30107
30108         var _deprecatedTagValuesByKey;
30109
30110         osmEntity.deprecatedTagValuesByKey = function() {
30111             if (!_deprecatedTagValuesByKey) {
30112                 _deprecatedTagValuesByKey = {};
30113                 dataDeprecated.forEach(function(d) {
30114                     var oldKeys = Object.keys(d.old);
30115                     if (oldKeys.length === 1) {
30116                         var oldKey = oldKeys[0];
30117                         var oldValue = d.old[oldKey];
30118                         if (oldValue !== '*') {
30119                             if (!_deprecatedTagValuesByKey[oldKey]) {
30120                                 _deprecatedTagValuesByKey[oldKey] = [oldValue];
30121                             } else {
30122                                 _deprecatedTagValuesByKey[oldKey].push(oldValue);
30123                             }
30124                         }
30125                     }
30126                 });
30127             }
30128             return _deprecatedTagValuesByKey;
30129         };
30130
30131
30132         osmEntity.prototype = {
30133
30134             tags: {},
30135
30136
30137             initialize: function(sources) {
30138                 for (var i = 0; i < sources.length; ++i) {
30139                     var source = sources[i];
30140                     for (var prop in source) {
30141                         if (Object.prototype.hasOwnProperty.call(source, prop)) {
30142                             if (source[prop] === undefined) {
30143                                 delete this[prop];
30144                             } else {
30145                                 this[prop] = source[prop];
30146                             }
30147                         }
30148                     }
30149                 }
30150
30151                 if (!this.id && this.type) {
30152                     this.id = osmEntity.id(this.type);
30153                 }
30154                 if (!this.hasOwnProperty('visible')) {
30155                     this.visible = true;
30156                 }
30157
30158                 return this;
30159             },
30160
30161
30162             copy: function(resolver, copies) {
30163                 if (copies[this.id])
30164                     return copies[this.id];
30165
30166                 var copy = osmEntity(this, { id: undefined, user: undefined, version: undefined });
30167                 copies[this.id] = copy;
30168
30169                 return copy;
30170             },
30171
30172
30173             osmId: function() {
30174                 return osmEntity.id.toOSM(this.id);
30175             },
30176
30177
30178             isNew: function() {
30179                 return this.osmId() < 0;
30180             },
30181
30182
30183             update: function(attrs) {
30184                 return osmEntity(this, attrs, { v: 1 + (this.v || 0) });
30185             },
30186
30187
30188             mergeTags: function(tags) {
30189                 var merged = Object.assign({}, this.tags);   // shallow copy
30190                 var changed = false;
30191                 for (var k in tags) {
30192                     var t1 = merged[k];
30193                     var t2 = tags[k];
30194                     if (!t1) {
30195                         changed = true;
30196                         merged[k] = t2;
30197                     } else if (t1 !== t2) {
30198                         changed = true;
30199                         merged[k] = utilArrayUnion(t1.split(/;\s*/), t2.split(/;\s*/)).join(';');
30200                     }
30201                 }
30202                 return changed ? this.update({ tags: merged }) : this;
30203             },
30204
30205
30206             intersects: function(extent, resolver) {
30207                 return this.extent(resolver).intersects(extent);
30208             },
30209
30210
30211             hasNonGeometryTags: function() {
30212                 return Object.keys(this.tags).some(function(k) { return k !== 'area'; });
30213             },
30214
30215             hasParentRelations: function(resolver) {
30216                 return resolver.parentRelations(this).length > 0;
30217             },
30218
30219             hasInterestingTags: function() {
30220                 return Object.keys(this.tags).some(osmIsInterestingTag);
30221             },
30222
30223             hasWikidata: function() {
30224                 return !!this.tags.wikidata || !!this.tags['brand:wikidata'];
30225             },
30226
30227             isHighwayIntersection: function() {
30228                 return false;
30229             },
30230
30231             isDegenerate: function() {
30232                 return true;
30233             },
30234
30235             deprecatedTags: function() {
30236                 var tags = this.tags;
30237
30238                 // if there are no tags, none can be deprecated
30239                 if (Object.keys(tags).length === 0) return [];
30240
30241                 var deprecated = [];
30242                 dataDeprecated.forEach(function(d) {
30243                     var matchesDeprecatedTags = Object.keys(d.old).every(function(key) {
30244                         if (!tags[key]) return false;
30245                         if (d.old[key] === '*') return true;
30246
30247                         var vals = tags[key].split(';').filter(Boolean);
30248                         if (vals.length === 0) {
30249                             return false;
30250                         } else if (vals.length > 1) {
30251                             return vals.indexOf(d.old[key]) !== -1;
30252                         } else {
30253                             if (tags[key] === d.old[key]) {
30254                                 if (d.old[key] === d.replace[key]) {
30255                                     return !Object.keys(d.replace).every(function(key) {
30256                                         return tags[key] === d.replace[key];
30257                                     });
30258                                 } else {
30259                                     return true;
30260                                 }
30261                             }
30262                         }
30263                         return false;
30264                     });
30265                     if (matchesDeprecatedTags) {
30266                         deprecated.push(d);
30267                     }
30268                 });
30269
30270                 return deprecated;
30271             }
30272         };
30273
30274         function osmLanes(entity) {
30275             if (entity.type !== 'way') return null;
30276             if (!entity.tags.highway) return null;
30277
30278             var tags = entity.tags;
30279             var isOneWay = entity.isOneWay();
30280             var laneCount = getLaneCount(tags, isOneWay);
30281             var maxspeed = parseMaxspeed(tags);
30282
30283             var laneDirections = parseLaneDirections(tags, isOneWay, laneCount);
30284             var forward = laneDirections.forward;
30285             var backward = laneDirections.backward;
30286             var bothways = laneDirections.bothways;
30287
30288             // parse the piped string 'x|y|z' format
30289             var turnLanes = {};
30290             turnLanes.unspecified = parseTurnLanes(tags['turn:lanes']);
30291             turnLanes.forward = parseTurnLanes(tags['turn:lanes:forward']);
30292             turnLanes.backward = parseTurnLanes(tags['turn:lanes:backward']);
30293
30294             var maxspeedLanes = {};
30295             maxspeedLanes.unspecified = parseMaxspeedLanes(tags['maxspeed:lanes'], maxspeed);
30296             maxspeedLanes.forward = parseMaxspeedLanes(tags['maxspeed:lanes:forward'], maxspeed);
30297             maxspeedLanes.backward = parseMaxspeedLanes(tags['maxspeed:lanes:backward'], maxspeed);
30298
30299             var psvLanes = {};
30300             psvLanes.unspecified = parseMiscLanes(tags['psv:lanes']);
30301             psvLanes.forward = parseMiscLanes(tags['psv:lanes:forward']);
30302             psvLanes.backward = parseMiscLanes(tags['psv:lanes:backward']);
30303
30304             var busLanes = {};
30305             busLanes.unspecified = parseMiscLanes(tags['bus:lanes']);
30306             busLanes.forward = parseMiscLanes(tags['bus:lanes:forward']);
30307             busLanes.backward = parseMiscLanes(tags['bus:lanes:backward']);
30308
30309             var taxiLanes = {};
30310             taxiLanes.unspecified = parseMiscLanes(tags['taxi:lanes']);
30311             taxiLanes.forward = parseMiscLanes(tags['taxi:lanes:forward']);
30312             taxiLanes.backward = parseMiscLanes(tags['taxi:lanes:backward']);
30313
30314             var hovLanes = {};
30315             hovLanes.unspecified = parseMiscLanes(tags['hov:lanes']);
30316             hovLanes.forward = parseMiscLanes(tags['hov:lanes:forward']);
30317             hovLanes.backward = parseMiscLanes(tags['hov:lanes:backward']);
30318
30319             var hgvLanes = {};
30320             hgvLanes.unspecified = parseMiscLanes(tags['hgv:lanes']);
30321             hgvLanes.forward = parseMiscLanes(tags['hgv:lanes:forward']);
30322             hgvLanes.backward = parseMiscLanes(tags['hgv:lanes:backward']);
30323
30324             var bicyclewayLanes = {};
30325             bicyclewayLanes.unspecified = parseBicycleWay(tags['bicycleway:lanes']);
30326             bicyclewayLanes.forward = parseBicycleWay(tags['bicycleway:lanes:forward']);
30327             bicyclewayLanes.backward = parseBicycleWay(tags['bicycleway:lanes:backward']);
30328
30329             var lanesObj = {
30330                 forward: [],
30331                 backward: [],
30332                 unspecified: []
30333             };
30334
30335             // map forward/backward/unspecified of each lane type to lanesObj
30336             mapToLanesObj(lanesObj, turnLanes, 'turnLane');
30337             mapToLanesObj(lanesObj, maxspeedLanes, 'maxspeed');
30338             mapToLanesObj(lanesObj, psvLanes, 'psv');
30339             mapToLanesObj(lanesObj, busLanes, 'bus');
30340             mapToLanesObj(lanesObj, taxiLanes, 'taxi');
30341             mapToLanesObj(lanesObj, hovLanes, 'hov');
30342             mapToLanesObj(lanesObj, hgvLanes, 'hgv');
30343             mapToLanesObj(lanesObj, bicyclewayLanes, 'bicycleway');
30344
30345             return {
30346                 metadata: {
30347                     count: laneCount,
30348                     oneway: isOneWay,
30349                     forward: forward,
30350                     backward: backward,
30351                     bothways: bothways,
30352                     turnLanes: turnLanes,
30353                     maxspeed: maxspeed,
30354                     maxspeedLanes: maxspeedLanes,
30355                     psvLanes: psvLanes,
30356                     busLanes: busLanes,
30357                     taxiLanes: taxiLanes,
30358                     hovLanes: hovLanes,
30359                     hgvLanes: hgvLanes,
30360                     bicyclewayLanes: bicyclewayLanes
30361                 },
30362                 lanes: lanesObj
30363             };
30364         }
30365
30366
30367         function getLaneCount(tags, isOneWay) {
30368             var count;
30369             if (tags.lanes) {
30370                 count = parseInt(tags.lanes, 10);
30371                 if (count > 0) {
30372                     return count;
30373                 }
30374             }
30375
30376
30377             switch (tags.highway) {
30378                 case 'trunk':
30379                 case 'motorway':
30380                     count = isOneWay ? 2 : 4;
30381                     break;
30382                 default:
30383                     count = isOneWay ? 1 : 2;
30384                     break;
30385             }
30386
30387             return count;
30388         }
30389
30390
30391         function parseMaxspeed(tags) {
30392             var maxspeed = tags.maxspeed;
30393             if (!maxspeed) return;
30394
30395             var maxspeedRegex = /^([0-9][\.0-9]+?)(?:[ ]?(?:km\/h|kmh|kph|mph|knots))?$/;
30396             if (!maxspeedRegex.test(maxspeed)) return;
30397
30398             return parseInt(maxspeed, 10);
30399         }
30400
30401
30402         function parseLaneDirections(tags, isOneWay, laneCount) {
30403             var forward = parseInt(tags['lanes:forward'], 10);
30404             var backward = parseInt(tags['lanes:backward'], 10);
30405             var bothways = parseInt(tags['lanes:both_ways'], 10) > 0 ? 1 : 0;
30406
30407             if (parseInt(tags.oneway, 10) === -1) {
30408                 forward = 0;
30409                 bothways = 0;
30410                 backward = laneCount;
30411             }
30412             else if (isOneWay) {
30413                 forward = laneCount;
30414                 bothways = 0;
30415                 backward = 0;
30416             }
30417             else if (isNaN(forward) && isNaN(backward)) {
30418                 backward = Math.floor((laneCount - bothways) / 2);
30419                 forward = laneCount - bothways - backward;
30420             }
30421             else if (isNaN(forward)) {
30422                 if (backward > laneCount - bothways) {
30423                     backward = laneCount - bothways;
30424                 }
30425                 forward = laneCount - bothways - backward;
30426             }
30427             else if (isNaN(backward)) {
30428                 if (forward > laneCount - bothways) {
30429                     forward = laneCount - bothways;
30430                 }
30431                 backward = laneCount - bothways - forward;
30432             }
30433             return {
30434                 forward: forward,
30435                 backward: backward,
30436                 bothways: bothways
30437             };
30438         }
30439
30440
30441         function parseTurnLanes(tag){
30442             if (!tag) return;
30443
30444             var validValues = [
30445                 'left', 'slight_left', 'sharp_left', 'through', 'right', 'slight_right',
30446                 'sharp_right', 'reverse', 'merge_to_left', 'merge_to_right', 'none'
30447             ];
30448
30449             return tag.split('|')
30450                 .map(function (s) {
30451                     if (s === '') s = 'none';
30452                     return s.split(';')
30453                         .map(function (d) {
30454                             return validValues.indexOf(d) === -1 ? 'unknown': d;
30455                         });
30456                 });
30457         }
30458
30459
30460         function parseMaxspeedLanes(tag, maxspeed) {
30461             if (!tag) return;
30462
30463             return tag.split('|')
30464                 .map(function (s) {
30465                     if (s === 'none') return s;
30466                     var m = parseInt(s, 10);
30467                     if (s === '' || m === maxspeed) return null;
30468                     return isNaN(m) ? 'unknown': m;
30469                 });
30470         }
30471
30472
30473         function parseMiscLanes(tag) {
30474             if (!tag) return;
30475
30476             var validValues = [
30477                 'yes', 'no', 'designated'
30478             ];
30479
30480             return tag.split('|')
30481                 .map(function (s) {
30482                     if (s === '') s = 'no';
30483                     return validValues.indexOf(s) === -1 ? 'unknown': s;
30484                 });
30485         }
30486
30487
30488         function parseBicycleWay(tag) {
30489             if (!tag) return;
30490
30491             var validValues = [
30492                 'yes', 'no', 'designated', 'lane'
30493             ];
30494
30495             return tag.split('|')
30496                 .map(function (s) {
30497                     if (s === '') s = 'no';
30498                     return validValues.indexOf(s) === -1 ? 'unknown': s;
30499                 });
30500         }
30501
30502
30503         function mapToLanesObj(lanesObj, data, key) {
30504             if (data.forward) data.forward.forEach(function(l, i) {
30505                 if (!lanesObj.forward[i]) lanesObj.forward[i] = {};
30506                 lanesObj.forward[i][key] = l;
30507             });
30508             if (data.backward) data.backward.forEach(function(l, i) {
30509                 if (!lanesObj.backward[i]) lanesObj.backward[i] = {};
30510                 lanesObj.backward[i][key] = l;
30511             });
30512             if (data.unspecified) data.unspecified.forEach(function(l, i) {
30513                 if (!lanesObj.unspecified[i]) lanesObj.unspecified[i] = {};
30514                 lanesObj.unspecified[i][key] = l;
30515             });
30516         }
30517
30518         function osmWay() {
30519             if (!(this instanceof osmWay)) {
30520                 return (new osmWay()).initialize(arguments);
30521             } else if (arguments.length) {
30522                 this.initialize(arguments);
30523             }
30524         }
30525
30526
30527         osmEntity.way = osmWay;
30528
30529         osmWay.prototype = Object.create(osmEntity.prototype);
30530
30531
30532         Object.assign(osmWay.prototype, {
30533             type: 'way',
30534             nodes: [],
30535
30536
30537             copy: function(resolver, copies) {
30538                 if (copies[this.id]) return copies[this.id];
30539
30540                 var copy = osmEntity.prototype.copy.call(this, resolver, copies);
30541
30542                 var nodes = this.nodes.map(function(id) {
30543                     return resolver.entity(id).copy(resolver, copies).id;
30544                 });
30545
30546                 copy = copy.update({ nodes: nodes });
30547                 copies[this.id] = copy;
30548
30549                 return copy;
30550             },
30551
30552
30553             extent: function(resolver) {
30554                 return resolver.transient(this, 'extent', function() {
30555                     var extent = geoExtent();
30556                     for (var i = 0; i < this.nodes.length; i++) {
30557                         var node = resolver.hasEntity(this.nodes[i]);
30558                         if (node) {
30559                             extent._extend(node.extent());
30560                         }
30561                     }
30562                     return extent;
30563                 });
30564             },
30565
30566
30567             first: function() {
30568                 return this.nodes[0];
30569             },
30570
30571
30572             last: function() {
30573                 return this.nodes[this.nodes.length - 1];
30574             },
30575
30576
30577             contains: function(node) {
30578                 return this.nodes.indexOf(node) >= 0;
30579             },
30580
30581
30582             affix: function(node) {
30583                 if (this.nodes[0] === node) return 'prefix';
30584                 if (this.nodes[this.nodes.length - 1] === node) return 'suffix';
30585             },
30586
30587
30588             layer: function() {
30589                 // explicit layer tag, clamp between -10, 10..
30590                 if (isFinite(this.tags.layer)) {
30591                     return Math.max(-10, Math.min(+(this.tags.layer), 10));
30592                 }
30593
30594                 // implied layer tag..
30595                 if (this.tags.covered === 'yes') return -1;
30596                 if (this.tags.location === 'overground') return 1;
30597                 if (this.tags.location === 'underground') return -1;
30598                 if (this.tags.location === 'underwater') return -10;
30599
30600                 if (this.tags.power === 'line') return 10;
30601                 if (this.tags.power === 'minor_line') return 10;
30602                 if (this.tags.aerialway) return 10;
30603                 if (this.tags.bridge) return 1;
30604                 if (this.tags.cutting) return -1;
30605                 if (this.tags.tunnel) return -1;
30606                 if (this.tags.waterway) return -1;
30607                 if (this.tags.man_made === 'pipeline') return -10;
30608                 if (this.tags.boundary) return -10;
30609                 return 0;
30610             },
30611
30612
30613             isOneWay: function() {
30614                 // explicit oneway tag..
30615                 var values = {
30616                     'yes': true,
30617                     '1': true,
30618                     '-1': true,
30619                     'reversible': true,
30620                     'alternating': true,
30621                     'no': false,
30622                     '0': false
30623                 };
30624                 if (values[this.tags.oneway] !== undefined) {
30625                     return values[this.tags.oneway];
30626                 }
30627
30628                 // implied oneway tag..
30629                 for (var key in this.tags) {
30630                     if (key in osmOneWayTags && (this.tags[key] in osmOneWayTags[key]))
30631                         return true;
30632                 }
30633                 return false;
30634             },
30635
30636             // Some identifier for tag that implies that this way is "sided",
30637             // i.e. the right side is the 'inside' (e.g. the right side of a
30638             // natural=cliff is lower).
30639             sidednessIdentifier: function() {
30640                 for (var key in this.tags) {
30641                     var value = this.tags[key];
30642                     if (key in osmRightSideIsInsideTags && (value in osmRightSideIsInsideTags[key])) {
30643                         if (osmRightSideIsInsideTags[key][value] === true) {
30644                             return key;
30645                         } else {
30646                             // if the map's value is something other than a
30647                             // literal true, we should use it so we can
30648                             // special case some keys (e.g. natural=coastline
30649                             // is handled differently to other naturals).
30650                             return osmRightSideIsInsideTags[key][value];
30651                         }
30652                     }
30653                 }
30654
30655                 return null;
30656             },
30657
30658             isSided: function() {
30659                 if (this.tags.two_sided === 'yes') {
30660                     return false;
30661                 }
30662
30663                 return this.sidednessIdentifier() !== null;
30664             },
30665
30666             lanes: function() {
30667                 return osmLanes(this);
30668             },
30669
30670
30671             isClosed: function() {
30672                 return this.nodes.length > 1 && this.first() === this.last();
30673             },
30674
30675
30676             isConvex: function(resolver) {
30677                 if (!this.isClosed() || this.isDegenerate()) return null;
30678
30679                 var nodes = utilArrayUniq(resolver.childNodes(this));
30680                 var coords = nodes.map(function(n) { return n.loc; });
30681                 var curr = 0;
30682                 var prev = 0;
30683
30684                 for (var i = 0; i < coords.length; i++) {
30685                     var o = coords[(i+1) % coords.length];
30686                     var a = coords[i];
30687                     var b = coords[(i+2) % coords.length];
30688                     var res = geoVecCross(a, b, o);
30689
30690                     curr = (res > 0) ? 1 : (res < 0) ? -1 : 0;
30691                     if (curr === 0) {
30692                         continue;
30693                     } else if (prev && curr !== prev) {
30694                         return false;
30695                     }
30696                     prev = curr;
30697                 }
30698                 return true;
30699             },
30700
30701             // returns an object with the tag that implies this is an area, if any
30702             tagSuggestingArea: function() {
30703                 if (this.tags.area === 'yes') return { area: 'yes' };
30704                 if (this.tags.area === 'no') return null;
30705
30706                 // `highway` and `railway` are typically linear features, but there
30707                 // are a few exceptions that should be treated as areas, even in the
30708                 // absence of a proper `area=yes` or `areaKeys` tag.. see #4194
30709                 var lineKeys = {
30710                     highway: {
30711                         rest_area: true,
30712                         services: true
30713                     },
30714                     railway: {
30715                         roundhouse: true,
30716                         station: true,
30717                         traverser: true,
30718                         turntable: true,
30719                         wash: true
30720                     }
30721                 };
30722                 var returnTags = {};
30723                 for (var key in this.tags) {
30724                     if (key in osmAreaKeys && !(this.tags[key] in osmAreaKeys[key])) {
30725                         returnTags[key] = this.tags[key];
30726                         return returnTags;
30727                     }
30728                     if (key in lineKeys && this.tags[key] in lineKeys[key]) {
30729                         returnTags[key] = this.tags[key];
30730                         return returnTags;
30731                     }
30732                 }
30733                 return null;
30734             },
30735
30736             isArea: function() {
30737                 if (this.tags.area === 'yes')
30738                     return true;
30739                 if (!this.isClosed() || this.tags.area === 'no')
30740                     return false;
30741                 return this.tagSuggestingArea() !== null;
30742             },
30743
30744
30745             isDegenerate: function() {
30746                 return (new Set(this.nodes).size < (this.isArea() ? 3 : 2));
30747             },
30748
30749
30750             areAdjacent: function(n1, n2) {
30751                 for (var i = 0; i < this.nodes.length; i++) {
30752                     if (this.nodes[i] === n1) {
30753                         if (this.nodes[i - 1] === n2) return true;
30754                         if (this.nodes[i + 1] === n2) return true;
30755                     }
30756                 }
30757                 return false;
30758             },
30759
30760
30761             geometry: function(graph) {
30762                 return graph.transient(this, 'geometry', function() {
30763                     return this.isArea() ? 'area' : 'line';
30764                 });
30765             },
30766
30767
30768             // If this way is not closed, append the beginning node to the end of the nodelist to close it.
30769             close: function() {
30770                 if (this.isClosed() || !this.nodes.length) return this;
30771
30772                 var nodes = this.nodes.slice();
30773                 nodes = nodes.filter(noRepeatNodes);
30774                 nodes.push(nodes[0]);
30775                 return this.update({ nodes: nodes });
30776             },
30777
30778
30779             // If this way is closed, remove any connector nodes from the end of the nodelist to unclose it.
30780             unclose: function() {
30781                 if (!this.isClosed()) return this;
30782
30783                 var nodes = this.nodes.slice();
30784                 var connector = this.first();
30785                 var i = nodes.length - 1;
30786
30787                 // remove trailing connectors..
30788                 while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
30789                     nodes.splice(i, 1);
30790                     i = nodes.length - 1;
30791                 }
30792
30793                 nodes = nodes.filter(noRepeatNodes);
30794                 return this.update({ nodes: nodes });
30795             },
30796
30797
30798             // Adds a node (id) in front of the node which is currently at position index.
30799             // If index is undefined, the node will be added to the end of the way for linear ways,
30800             //   or just before the final connecting node for circular ways.
30801             // Consecutive duplicates are eliminated including existing ones.
30802             // Circularity is always preserved when adding a node.
30803             addNode: function(id, index) {
30804                 var nodes = this.nodes.slice();
30805                 var isClosed = this.isClosed();
30806                 var max = isClosed ? nodes.length - 1 : nodes.length;
30807
30808                 if (index === undefined) {
30809                     index = max;
30810                 }
30811
30812                 if (index < 0 || index > max) {
30813                     throw new RangeError('index ' + index + ' out of range 0..' + max);
30814                 }
30815
30816                 // If this is a closed way, remove all connector nodes except the first one
30817                 // (there may be duplicates) and adjust index if necessary..
30818                 if (isClosed) {
30819                     var connector = this.first();
30820
30821                     // leading connectors..
30822                     var i = 1;
30823                     while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
30824                         nodes.splice(i, 1);
30825                         if (index > i) index--;
30826                     }
30827
30828                     // trailing connectors..
30829                     i = nodes.length - 1;
30830                     while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
30831                         nodes.splice(i, 1);
30832                         if (index > i) index--;
30833                         i = nodes.length - 1;
30834                     }
30835                 }
30836
30837                 nodes.splice(index, 0, id);
30838                 nodes = nodes.filter(noRepeatNodes);
30839
30840                 // If the way was closed before, append a connector node to keep it closed..
30841                 if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
30842                     nodes.push(nodes[0]);
30843                 }
30844
30845                 return this.update({ nodes: nodes });
30846             },
30847
30848
30849             // Replaces the node which is currently at position index with the given node (id).
30850             // Consecutive duplicates are eliminated including existing ones.
30851             // Circularity is preserved when updating a node.
30852             updateNode: function(id, index) {
30853                 var nodes = this.nodes.slice();
30854                 var isClosed = this.isClosed();
30855                 var max = nodes.length - 1;
30856
30857                 if (index === undefined || index < 0 || index > max) {
30858                     throw new RangeError('index ' + index + ' out of range 0..' + max);
30859                 }
30860
30861                 // If this is a closed way, remove all connector nodes except the first one
30862                 // (there may be duplicates) and adjust index if necessary..
30863                 if (isClosed) {
30864                     var connector = this.first();
30865
30866                     // leading connectors..
30867                     var i = 1;
30868                     while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
30869                         nodes.splice(i, 1);
30870                         if (index > i) index--;
30871                     }
30872
30873                     // trailing connectors..
30874                     i = nodes.length - 1;
30875                     while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
30876                         nodes.splice(i, 1);
30877                         if (index === i) index = 0;  // update leading connector instead
30878                         i = nodes.length - 1;
30879                     }
30880                 }
30881
30882                 nodes.splice(index, 1, id);
30883                 nodes = nodes.filter(noRepeatNodes);
30884
30885                 // If the way was closed before, append a connector node to keep it closed..
30886                 if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
30887                     nodes.push(nodes[0]);
30888                 }
30889
30890                 return this.update({nodes: nodes});
30891             },
30892
30893
30894             // Replaces each occurrence of node id needle with replacement.
30895             // Consecutive duplicates are eliminated including existing ones.
30896             // Circularity is preserved.
30897             replaceNode: function(needleID, replacementID) {
30898                 var nodes = this.nodes.slice();
30899                 var isClosed = this.isClosed();
30900
30901                 for (var i = 0; i < nodes.length; i++) {
30902                     if (nodes[i] === needleID) {
30903                         nodes[i] = replacementID;
30904                     }
30905                 }
30906
30907                 nodes = nodes.filter(noRepeatNodes);
30908
30909                 // If the way was closed before, append a connector node to keep it closed..
30910                 if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
30911                     nodes.push(nodes[0]);
30912                 }
30913
30914                 return this.update({nodes: nodes});
30915             },
30916
30917
30918             // Removes each occurrence of node id.
30919             // Consecutive duplicates are eliminated including existing ones.
30920             // Circularity is preserved.
30921             removeNode: function(id) {
30922                 var nodes = this.nodes.slice();
30923                 var isClosed = this.isClosed();
30924
30925                 nodes = nodes
30926                     .filter(function(node) { return node !== id; })
30927                     .filter(noRepeatNodes);
30928
30929                 // If the way was closed before, append a connector node to keep it closed..
30930                 if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
30931                     nodes.push(nodes[0]);
30932                 }
30933
30934                 return this.update({nodes: nodes});
30935             },
30936
30937
30938             asJXON: function(changeset_id) {
30939                 var r = {
30940                     way: {
30941                         '@id': this.osmId(),
30942                         '@version': this.version || 0,
30943                         nd: this.nodes.map(function(id) {
30944                             return { keyAttributes: { ref: osmEntity.id.toOSM(id) } };
30945                         }, this),
30946                         tag: Object.keys(this.tags).map(function(k) {
30947                             return { keyAttributes: { k: k, v: this.tags[k] } };
30948                         }, this)
30949                     }
30950                 };
30951                 if (changeset_id) {
30952                     r.way['@changeset'] = changeset_id;
30953                 }
30954                 return r;
30955             },
30956
30957
30958             asGeoJSON: function(resolver) {
30959                 return resolver.transient(this, 'GeoJSON', function() {
30960                     var coordinates = resolver.childNodes(this)
30961                         .map(function(n) { return n.loc; });
30962
30963                     if (this.isArea() && this.isClosed()) {
30964                         return {
30965                             type: 'Polygon',
30966                             coordinates: [coordinates]
30967                         };
30968                     } else {
30969                         return {
30970                             type: 'LineString',
30971                             coordinates: coordinates
30972                         };
30973                     }
30974                 });
30975             },
30976
30977
30978             area: function(resolver) {
30979                 return resolver.transient(this, 'area', function() {
30980                     var nodes = resolver.childNodes(this);
30981
30982                     var json = {
30983                         type: 'Polygon',
30984                         coordinates: [ nodes.map(function(n) { return n.loc; }) ]
30985                     };
30986
30987                     if (!this.isClosed() && nodes.length) {
30988                         json.coordinates[0].push(nodes[0].loc);
30989                     }
30990
30991                     var area = d3_geoArea(json);
30992
30993                     // Heuristic for detecting counterclockwise winding order. Assumes
30994                     // that OpenStreetMap polygons are not hemisphere-spanning.
30995                     if (area > 2 * Math.PI) {
30996                         json.coordinates[0] = json.coordinates[0].reverse();
30997                         area = d3_geoArea(json);
30998                     }
30999
31000                     return isNaN(area) ? 0 : area;
31001                 });
31002             }
31003         });
31004
31005
31006         // Filter function to eliminate consecutive duplicates.
31007         function noRepeatNodes(node, i, arr) {
31008             return i === 0 || node !== arr[i - 1];
31009         }
31010
31011         // "Old" multipolyons, previously known as "simple" multipolygons, are as follows:
31012         //
31013         // 1. Relation tagged with `type=multipolygon` and no interesting tags.
31014         // 2. One and only one member with the `outer` role. Must be a way with interesting tags.
31015         // 3. No members without a role.
31016         //
31017         // Old multipolygons are no longer recommended but are still rendered as areas by iD.
31018
31019         function osmOldMultipolygonOuterMemberOfRelation(entity, graph) {
31020             if (entity.type !== 'relation' ||
31021                 !entity.isMultipolygon()
31022                 || Object.keys(entity.tags).filter(osmIsInterestingTag).length > 1) {
31023                 return false;
31024             }
31025
31026             var outerMember;
31027             for (var memberIndex in entity.members) {
31028                 var member = entity.members[memberIndex];
31029                 if (!member.role || member.role === 'outer') {
31030                     if (outerMember) return false;
31031                     if (member.type !== 'way') return false;
31032                     if (!graph.hasEntity(member.id)) return false;
31033
31034                     outerMember = graph.entity(member.id);
31035
31036                     if (Object.keys(outerMember.tags).filter(osmIsInterestingTag).length === 0) {
31037                         return false;
31038                     }
31039                 }
31040             }
31041
31042             return outerMember;
31043         }
31044
31045         // For fixing up rendering of multipolygons with tags on the outer member.
31046         // https://github.com/openstreetmap/iD/issues/613
31047         function osmIsOldMultipolygonOuterMember(entity, graph) {
31048             if (entity.type !== 'way' || Object.keys(entity.tags).filter(osmIsInterestingTag).length === 0)
31049                 return false;
31050
31051             var parents = graph.parentRelations(entity);
31052             if (parents.length !== 1)
31053                 return false;
31054
31055             var parent = parents[0];
31056             if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1)
31057                 return false;
31058
31059             var members = parent.members, member;
31060             for (var i = 0; i < members.length; i++) {
31061                 member = members[i];
31062                 if (member.id === entity.id && member.role && member.role !== 'outer')
31063                     return false; // Not outer member
31064                 if (member.id !== entity.id && (!member.role || member.role === 'outer'))
31065                     return false; // Not a simple multipolygon
31066             }
31067
31068             return parent;
31069         }
31070
31071
31072         function osmOldMultipolygonOuterMember(entity, graph) {
31073             if (entity.type !== 'way')
31074                 return false;
31075
31076             var parents = graph.parentRelations(entity);
31077             if (parents.length !== 1)
31078                 return false;
31079
31080             var parent = parents[0];
31081             if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1)
31082                 return false;
31083
31084             var members = parent.members, member, outerMember;
31085             for (var i = 0; i < members.length; i++) {
31086                 member = members[i];
31087                 if (!member.role || member.role === 'outer') {
31088                     if (outerMember)
31089                         return false; // Not a simple multipolygon
31090                     outerMember = member;
31091                 }
31092             }
31093
31094             if (!outerMember)
31095                 return false;
31096
31097             var outerEntity = graph.hasEntity(outerMember.id);
31098             if (!outerEntity || !Object.keys(outerEntity.tags).filter(osmIsInterestingTag).length)
31099                 return false;
31100
31101             return outerEntity;
31102         }
31103
31104
31105         // Join `toJoin` array into sequences of connecting ways.
31106
31107         // Segments which share identical start/end nodes will, as much as possible,
31108         // be connected with each other.
31109         //
31110         // The return value is a nested array. Each constituent array contains elements
31111         // of `toJoin` which have been determined to connect.
31112         //
31113         // Each consitituent array also has a `nodes` property whose value is an
31114         // ordered array of member nodes, with appropriate order reversal and
31115         // start/end coordinate de-duplication.
31116         //
31117         // Members of `toJoin` must have, at minimum, `type` and `id` properties.
31118         // Thus either an array of `osmWay`s or a relation member array may be used.
31119         //
31120         // If an member is an `osmWay`, its tags and childnodes may be reversed via
31121         // `actionReverse` in the output.
31122         //
31123         // The returned sequences array also has an `actions` array property, containing
31124         // any reversal actions that should be applied to the graph, should the calling
31125         // code attempt to actually join the given ways.
31126         //
31127         // Incomplete members (those for which `graph.hasEntity(element.id)` returns
31128         // false) and non-way members are ignored.
31129         //
31130         function osmJoinWays(toJoin, graph) {
31131             function resolve(member) {
31132                 return graph.childNodes(graph.entity(member.id));
31133             }
31134
31135             function reverse(item) {
31136                 var action = actionReverse(item.id, { reverseOneway: true });
31137                 sequences.actions.push(action);
31138                 return (item instanceof osmWay) ? action(graph).entity(item.id) : item;
31139             }
31140
31141             // make a copy containing only the items to join
31142             toJoin = toJoin.filter(function(member) {
31143                 return member.type === 'way' && graph.hasEntity(member.id);
31144             });
31145
31146             // Are the things we are joining relation members or `osmWays`?
31147             // If `osmWays`, skip the "prefer a forward path" code below (see #4872)
31148             var i;
31149             var joinAsMembers = true;
31150             for (i = 0; i < toJoin.length; i++) {
31151                 if (toJoin[i] instanceof osmWay) {
31152                     joinAsMembers = false;
31153                     break;
31154                 }
31155             }
31156
31157             var sequences = [];
31158             sequences.actions = [];
31159
31160             while (toJoin.length) {
31161                 // start a new sequence
31162                 var item = toJoin.shift();
31163                 var currWays = [item];
31164                 var currNodes = resolve(item).slice();
31165                 var doneSequence = false;
31166
31167                 // add to it
31168                 while (toJoin.length && !doneSequence) {
31169                     var start = currNodes[0];
31170                     var end = currNodes[currNodes.length - 1];
31171                     var fn = null;
31172                     var nodes = null;
31173
31174                     // Find the next way/member to join.
31175                     for (i = 0; i < toJoin.length; i++) {
31176                         item = toJoin[i];
31177                         nodes = resolve(item);
31178
31179                         // (for member ordering only, not way ordering - see #4872)
31180                         // Strongly prefer to generate a forward path that preserves the order
31181                         // of the members array. For multipolygons and most relations, member
31182                         // order does not matter - but for routes, it does. (see #4589)
31183                         // If we started this sequence backwards (i.e. next member way attaches to
31184                         // the start node and not the end node), reverse the initial way before continuing.
31185                         if (joinAsMembers && currWays.length === 1 && nodes[0] !== end && nodes[nodes.length - 1] !== end &&
31186                             (nodes[nodes.length - 1] === start || nodes[0] === start)
31187                         ) {
31188                             currWays[0] = reverse(currWays[0]);
31189                             currNodes.reverse();
31190                             start = currNodes[0];
31191                             end = currNodes[currNodes.length - 1];
31192                         }
31193
31194                         if (nodes[0] === end) {
31195                             fn = currNodes.push;               // join to end
31196                             nodes = nodes.slice(1);
31197                             break;
31198                         } else if (nodes[nodes.length - 1] === end) {
31199                             fn = currNodes.push;               // join to end
31200                             nodes = nodes.slice(0, -1).reverse();
31201                             item = reverse(item);
31202                             break;
31203                         } else if (nodes[nodes.length - 1] === start) {
31204                             fn = currNodes.unshift;            // join to beginning
31205                             nodes = nodes.slice(0, -1);
31206                             break;
31207                         } else if (nodes[0] === start) {
31208                             fn = currNodes.unshift;            // join to beginning
31209                             nodes = nodes.slice(1).reverse();
31210                             item = reverse(item);
31211                             break;
31212                         } else {
31213                             fn = nodes = null;
31214                         }
31215                     }
31216
31217                     if (!nodes) {     // couldn't find a joinable way/member
31218                         doneSequence = true;
31219                         break;
31220                     }
31221
31222                     fn.apply(currWays, [item]);
31223                     fn.apply(currNodes, nodes);
31224
31225                     toJoin.splice(i, 1);
31226                 }
31227
31228                 currWays.nodes = currNodes;
31229                 sequences.push(currWays);
31230             }
31231
31232             return sequences;
31233         }
31234
31235         function actionAddMember(relationId, member, memberIndex, insertPair) {
31236
31237             return function action(graph) {
31238                 var relation = graph.entity(relationId);
31239
31240                 // There are some special rules for Public Transport v2 routes.
31241                 var isPTv2 = /stop|platform/.test(member.role);
31242
31243                 if ((isNaN(memberIndex) || insertPair) && member.type === 'way' && !isPTv2) {
31244                     // Try to perform sensible inserts based on how the ways join together
31245                     graph = addWayMember(relation, graph);
31246                 } else {
31247                     // see https://wiki.openstreetmap.org/wiki/Public_transport#Service_routes
31248                     // Stops and Platforms for PTv2 should be ordered first.
31249                     // hack: We do not currently have the ability to place them in the exactly correct order.
31250                     if (isPTv2 && isNaN(memberIndex)) {
31251                         memberIndex = 0;
31252                     }
31253
31254                     graph = graph.replace(relation.addMember(member, memberIndex));
31255                 }
31256
31257                 return graph;
31258             };
31259
31260
31261             // Add a way member into the relation "wherever it makes sense".
31262             // In this situation we were not supplied a memberIndex.
31263             function addWayMember(relation, graph) {
31264                 var groups, tempWay, item, i, j, k;
31265
31266                 // remove PTv2 stops and platforms before doing anything.
31267                 var PTv2members = [];
31268                 var members = [];
31269                 for (i = 0; i < relation.members.length; i++) {
31270                     var m = relation.members[i];
31271                     if (/stop|platform/.test(m.role)) {
31272                         PTv2members.push(m);
31273                     } else {
31274                         members.push(m);
31275                     }
31276                 }
31277                 relation = relation.update({ members: members });
31278
31279
31280                 if (insertPair) {
31281                     // We're adding a member that must stay paired with an existing member.
31282                     // (This feature is used by `actionSplit`)
31283                     //
31284                     // This is tricky because the members may exist multiple times in the
31285                     // member list, and with different A-B/B-A ordering and different roles.
31286                     // (e.g. a bus route that loops out and back - #4589).
31287                     //
31288                     // Replace the existing member with a temporary way,
31289                     // so that `osmJoinWays` can treat the pair like a single way.
31290                     tempWay = osmWay({ id: 'wTemp', nodes: insertPair.nodes });
31291                     graph = graph.replace(tempWay);
31292                     var tempMember = { id: tempWay.id, type: 'way', role: member.role };
31293                     var tempRelation = relation.replaceMember({id: insertPair.originalID}, tempMember, true);
31294                     groups = utilArrayGroupBy(tempRelation.members, 'type');
31295                     groups.way = groups.way || [];
31296
31297                 } else {
31298                     // Add the member anywhere, one time. Just push and let `osmJoinWays` decide where to put it.
31299                     groups = utilArrayGroupBy(relation.members, 'type');
31300                     groups.way = groups.way || [];
31301                     groups.way.push(member);
31302                 }
31303
31304                 members = withIndex(groups.way);
31305                 var joined = osmJoinWays(members, graph);
31306
31307                 // `joined` might not contain all of the way members,
31308                 // But will contain only the completed (downloaded) members
31309                 for (i = 0; i < joined.length; i++) {
31310                     var segment = joined[i];
31311                     var nodes = segment.nodes.slice();
31312                     var startIndex = segment[0].index;
31313
31314                     // j = array index in `members` where this segment starts
31315                     for (j = 0; j < members.length; j++) {
31316                         if (members[j].index === startIndex) {
31317                             break;
31318                         }
31319                     }
31320
31321                     // k = each member in segment
31322                     for (k = 0; k < segment.length; k++) {
31323                         item = segment[k];
31324                         var way = graph.entity(item.id);
31325
31326                         // If this is a paired item, generate members in correct order and role
31327                         if (tempWay && item.id === tempWay.id) {
31328                             if (nodes[0].id === insertPair.nodes[0]) {
31329                                 item.pair = [
31330                                     { id: insertPair.originalID, type: 'way', role: item.role },
31331                                     { id: insertPair.insertedID, type: 'way', role: item.role }
31332                                 ];
31333                             } else {
31334                                 item.pair = [
31335                                     { id: insertPair.insertedID, type: 'way', role: item.role },
31336                                     { id: insertPair.originalID, type: 'way', role: item.role }
31337                                 ];
31338                             }
31339                         }
31340
31341                         // reorder `members` if necessary
31342                         if (k > 0) {
31343                             if (j+k >= members.length || item.index !== members[j+k].index) {
31344                                 moveMember(members, item.index, j+k);
31345                             }
31346                         }
31347
31348                         nodes.splice(0, way.nodes.length - 1);
31349                     }
31350                 }
31351
31352                 if (tempWay) {
31353                     graph = graph.remove(tempWay);
31354                 }
31355
31356                 // Final pass: skip dead items, split pairs, remove index properties
31357                 var wayMembers = [];
31358                 for (i = 0; i < members.length; i++) {
31359                     item = members[i];
31360                     if (item.index === -1) continue;
31361
31362                     if (item.pair) {
31363                         wayMembers.push(item.pair[0]);
31364                         wayMembers.push(item.pair[1]);
31365                     } else {
31366                         wayMembers.push(utilObjectOmit(item, ['index']));
31367                     }
31368                 }
31369
31370                 // Put stops and platforms first, then nodes, ways, relations
31371                 // This is recommended for Public Transport v2 routes:
31372                 // see https://wiki.openstreetmap.org/wiki/Public_transport#Service_routes
31373                 var newMembers = PTv2members.concat( (groups.node || []), wayMembers, (groups.relation || []) );
31374
31375                 return graph.replace(relation.update({ members: newMembers }));
31376
31377
31378                 // `moveMember()` changes the `members` array in place by splicing
31379                 // the item with `.index = findIndex` to where it belongs,
31380                 // and marking the old position as "dead" with `.index = -1`
31381                 //
31382                 // j=5, k=0                jk
31383                 // segment                 5 4 7 6
31384                 // members       0 1 2 3 4 5 6 7 8 9        keep 5 in j+k
31385                 //
31386                 // j=5, k=1                j k
31387                 // segment                 5 4 7 6
31388                 // members       0 1 2 3 4 5 6 7 8 9        move 4 to j+k
31389                 // members       0 1 2 3 x 5 4 6 7 8 9      moved
31390                 //
31391                 // j=5, k=2                j   k
31392                 // segment                 5 4 7 6
31393                 // members       0 1 2 3 x 5 4 6 7 8 9      move 7 to j+k
31394                 // members       0 1 2 3 x 5 4 7 6 x 8 9    moved
31395                 //
31396                 // j=5, k=3                j     k
31397                 // segment                 5 4 7 6
31398                 // members       0 1 2 3 x 5 4 7 6 x 8 9    keep 6 in j+k
31399                 //
31400                 function moveMember(arr, findIndex, toIndex) {
31401                     for (var i = 0; i < arr.length; i++) {
31402                         if (arr[i].index === findIndex) {
31403                             break;
31404                         }
31405                     }
31406
31407                     var item = Object.assign({}, arr[i]);   // shallow copy
31408                     arr[i].index = -1;   // mark as dead
31409                     item.index = toIndex;
31410                     arr.splice(toIndex, 0, item);
31411                 }
31412
31413
31414                 // This is the same as `Relation.indexedMembers`,
31415                 // Except we don't want to index all the members, only the ways
31416                 function withIndex(arr) {
31417                     var result = new Array(arr.length);
31418                     for (var i = 0; i < arr.length; i++) {
31419                         result[i] = Object.assign({}, arr[i]);   // shallow copy
31420                         result[i].index = i;
31421                     }
31422                     return result;
31423                 }
31424             }
31425
31426         }
31427
31428         function actionAddMidpoint(midpoint, node) {
31429             return function(graph) {
31430                 graph = graph.replace(node.move(midpoint.loc));
31431
31432                 var parents = utilArrayIntersection(
31433                     graph.parentWays(graph.entity(midpoint.edge[0])),
31434                     graph.parentWays(graph.entity(midpoint.edge[1]))
31435                 );
31436
31437                 parents.forEach(function(way) {
31438                     for (var i = 0; i < way.nodes.length - 1; i++) {
31439                         if (geoEdgeEqual([way.nodes[i], way.nodes[i + 1]], midpoint.edge)) {
31440                             graph = graph.replace(graph.entity(way.id).addNode(node.id, i + 1));
31441
31442                             // Add only one midpoint on doubled-back segments,
31443                             // turning them into self-intersections.
31444                             return;
31445                         }
31446                     }
31447                 });
31448
31449                 return graph;
31450             };
31451         }
31452
31453         // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/AddNodeToWayAction.as
31454         function actionAddVertex(wayId, nodeId, index) {
31455             return function(graph) {
31456                 return graph.replace(graph.entity(wayId).addNode(nodeId, index));
31457             };
31458         }
31459
31460         function actionChangeMember(relationId, member, memberIndex) {
31461             return function(graph) {
31462                 return graph.replace(graph.entity(relationId).updateMember(member, memberIndex));
31463             };
31464         }
31465
31466         function actionChangePreset(entityID, oldPreset, newPreset, skipFieldDefaults) {
31467             return function action(graph) {
31468                 var entity = graph.entity(entityID);
31469                 var geometry = entity.geometry(graph);
31470                 var tags = entity.tags;
31471
31472                 if (oldPreset) tags = oldPreset.unsetTags(tags, geometry);
31473                 if (newPreset) tags = newPreset.setTags(tags, geometry, skipFieldDefaults);
31474
31475                 return graph.replace(entity.update({tags: tags}));
31476             };
31477         }
31478
31479         function actionChangeTags(entityId, tags) {
31480             return function(graph) {
31481                 var entity = graph.entity(entityId);
31482                 return graph.replace(entity.update({tags: tags}));
31483             };
31484         }
31485
31486         function osmNode() {
31487             if (!(this instanceof osmNode)) {
31488                 return (new osmNode()).initialize(arguments);
31489             } else if (arguments.length) {
31490                 this.initialize(arguments);
31491             }
31492         }
31493
31494         osmEntity.node = osmNode;
31495
31496         osmNode.prototype = Object.create(osmEntity.prototype);
31497
31498         Object.assign(osmNode.prototype, {
31499             type: 'node',
31500             loc: [9999, 9999],
31501
31502             extent: function() {
31503                 return new geoExtent(this.loc);
31504             },
31505
31506
31507             geometry: function(graph) {
31508                 return graph.transient(this, 'geometry', function() {
31509                     return graph.isPoi(this) ? 'point' : 'vertex';
31510                 });
31511             },
31512
31513
31514             move: function(loc) {
31515                 return this.update({loc: loc});
31516             },
31517
31518
31519             isDegenerate: function() {
31520                 return !(
31521                     Array.isArray(this.loc) && this.loc.length === 2 &&
31522                     this.loc[0] >= -180 && this.loc[0] <= 180 &&
31523                     this.loc[1] >= -90 && this.loc[1] <= 90
31524                 );
31525             },
31526
31527
31528             // Inspect tags and geometry to determine which direction(s) this node/vertex points
31529             directions: function(resolver, projection) {
31530                 var val;
31531                 var i;
31532
31533                 // which tag to use?
31534                 if (this.isHighwayIntersection(resolver) && (this.tags.stop || '').toLowerCase() === 'all') {
31535                     // all-way stop tag on a highway intersection
31536                     val = 'all';
31537                 } else {
31538                     // generic direction tag
31539                     val = (this.tags.direction || '').toLowerCase();
31540
31541                     // better suffix-style direction tag
31542                     var re = /:direction$/i;
31543                     var keys = Object.keys(this.tags);
31544                     for (i = 0; i < keys.length; i++) {
31545                         if (re.test(keys[i])) {
31546                             val = this.tags[keys[i]].toLowerCase();
31547                             break;
31548                         }
31549                     }
31550                 }
31551
31552                 if (val === '') return [];
31553
31554                 var cardinal = {
31555                     north: 0,               n: 0,
31556                     northnortheast: 22,     nne: 22,
31557                     northeast: 45,          ne: 45,
31558                     eastnortheast: 67,      ene: 67,
31559                     east: 90,               e: 90,
31560                     eastsoutheast: 112,     ese: 112,
31561                     southeast: 135,         se: 135,
31562                     southsoutheast: 157,    sse: 157,
31563                     south: 180,             s: 180,
31564                     southsouthwest: 202,    ssw: 202,
31565                     southwest: 225,         sw: 225,
31566                     westsouthwest: 247,     wsw: 247,
31567                     west: 270,              w: 270,
31568                     westnorthwest: 292,     wnw: 292,
31569                     northwest: 315,         nw: 315,
31570                     northnorthwest: 337,    nnw: 337
31571                 };
31572
31573
31574                 var values = val.split(';');
31575                 var results = [];
31576
31577                 values.forEach(function(v) {
31578                     // swap cardinal for numeric directions
31579                     if (cardinal[v] !== undefined) {
31580                         v = cardinal[v];
31581                     }
31582
31583                     // numeric direction - just add to results
31584                     if (v !== '' && !isNaN(+v)) {
31585                         results.push(+v);
31586                         return;
31587                     }
31588
31589                     // string direction - inspect parent ways
31590                     var lookBackward =
31591                         (this.tags['traffic_sign:backward'] || v === 'backward' || v === 'both' || v === 'all');
31592                     var lookForward =
31593                         (this.tags['traffic_sign:forward'] || v === 'forward' || v === 'both' || v === 'all');
31594
31595                     if (!lookForward && !lookBackward) return;
31596
31597                     var nodeIds = {};
31598                     resolver.parentWays(this).forEach(function(parent) {
31599                         var nodes = parent.nodes;
31600                         for (i = 0; i < nodes.length; i++) {
31601                             if (nodes[i] === this.id) {  // match current entity
31602                                 if (lookForward && i > 0) {
31603                                     nodeIds[nodes[i - 1]] = true;  // look back to prev node
31604                                 }
31605                                 if (lookBackward && i < nodes.length - 1) {
31606                                     nodeIds[nodes[i + 1]] = true;  // look ahead to next node
31607                                 }
31608                             }
31609                         }
31610                     }, this);
31611
31612                     Object.keys(nodeIds).forEach(function(nodeId) {
31613                         // +90 because geoAngle returns angle from X axis, not Y (north)
31614                         results.push(
31615                             (geoAngle(this, resolver.entity(nodeId), projection) * (180 / Math.PI)) + 90
31616                         );
31617                     }, this);
31618
31619                 }, this);
31620
31621                 return utilArrayUniq(results);
31622             },
31623
31624
31625             isEndpoint: function(resolver) {
31626                 return resolver.transient(this, 'isEndpoint', function() {
31627                     var id = this.id;
31628                     return resolver.parentWays(this).filter(function(parent) {
31629                         return !parent.isClosed() && !!parent.affix(id);
31630                     }).length > 0;
31631                 });
31632             },
31633
31634
31635             isConnected: function(resolver) {
31636                 return resolver.transient(this, 'isConnected', function() {
31637                     var parents = resolver.parentWays(this);
31638
31639                     function isLine(entity) {
31640                         return entity.geometry(resolver) === 'line' &&
31641                             entity.hasInterestingTags();
31642                     }
31643
31644                     // vertex is connected to multiple parent lines
31645                     if (parents.length > 1 && parents.some(isLine)) {
31646                         return true;
31647
31648                     } else if (parents.length === 1) {
31649                         var way = parents[0];
31650                         var nodes = way.nodes.slice();
31651                         if (way.isClosed()) { nodes.pop(); }  // ignore connecting node if closed
31652
31653                         // return true if vertex appears multiple times (way is self intersecting)
31654                         return nodes.indexOf(this.id) !== nodes.lastIndexOf(this.id);
31655                     }
31656
31657                     return false;
31658                 });
31659             },
31660
31661
31662             isIntersection: function(resolver) {
31663                 return resolver.transient(this, 'isIntersection', function() {
31664                     return resolver.parentWays(this).filter(function(parent) {
31665                         return (parent.tags.highway ||
31666                             parent.tags.waterway ||
31667                             parent.tags.railway ||
31668                             parent.tags.aeroway) &&
31669                             parent.geometry(resolver) === 'line';
31670                     }).length > 1;
31671                 });
31672             },
31673
31674
31675             isHighwayIntersection: function(resolver) {
31676                 return resolver.transient(this, 'isHighwayIntersection', function() {
31677                     return resolver.parentWays(this).filter(function(parent) {
31678                         return parent.tags.highway && parent.geometry(resolver) === 'line';
31679                     }).length > 1;
31680                 });
31681             },
31682
31683
31684             isOnAddressLine: function(resolver) {
31685                 return resolver.transient(this, 'isOnAddressLine', function() {
31686                     return resolver.parentWays(this).filter(function(parent) {
31687                         return parent.tags.hasOwnProperty('addr:interpolation') &&
31688                             parent.geometry(resolver) === 'line';
31689                     }).length > 0;
31690                 });
31691             },
31692
31693
31694             asJXON: function(changeset_id) {
31695                 var r = {
31696                     node: {
31697                         '@id': this.osmId(),
31698                         '@lon': this.loc[0],
31699                         '@lat': this.loc[1],
31700                         '@version': (this.version || 0),
31701                         tag: Object.keys(this.tags).map(function(k) {
31702                             return { keyAttributes: { k: k, v: this.tags[k] } };
31703                         }, this)
31704                     }
31705                 };
31706                 if (changeset_id) r.node['@changeset'] = changeset_id;
31707                 return r;
31708             },
31709
31710
31711             asGeoJSON: function() {
31712                 return {
31713                     type: 'Point',
31714                     coordinates: this.loc
31715                 };
31716             }
31717         });
31718
31719         function actionCircularize(wayId, projection, maxAngle) {
31720             maxAngle = (maxAngle || 20) * Math.PI / 180;
31721
31722
31723             var action = function(graph, t) {
31724                 if (t === null || !isFinite(t)) t = 1;
31725                 t = Math.min(Math.max(+t, 0), 1);
31726
31727                 var way = graph.entity(wayId);
31728                 var origNodes = {};
31729
31730                 graph.childNodes(way).forEach(function(node) {
31731                     if (!origNodes[node.id]) origNodes[node.id] = node;
31732                 });
31733
31734                 if (!way.isConvex(graph)) {
31735                     graph = action.makeConvex(graph);
31736                 }
31737
31738                 var nodes = utilArrayUniq(graph.childNodes(way));
31739                 var keyNodes = nodes.filter(function(n) { return graph.parentWays(n).length !== 1; });
31740                 var points = nodes.map(function(n) { return projection(n.loc); });
31741                 var keyPoints = keyNodes.map(function(n) { return projection(n.loc); });
31742                 var centroid = (points.length === 2) ? geoVecInterp(points[0], points[1], 0.5) : d3_polygonCentroid(points);
31743                 var radius = d3_median(points, function(p) { return geoVecLength(centroid, p); });
31744                 var sign = d3_polygonArea(points) > 0 ? 1 : -1;
31745                 var ids, i, j, k;
31746
31747                 // we need atleast two key nodes for the algorithm to work
31748                 if (!keyNodes.length) {
31749                     keyNodes = [nodes[0]];
31750                     keyPoints = [points[0]];
31751                 }
31752
31753                 if (keyNodes.length === 1) {
31754                     var index = nodes.indexOf(keyNodes[0]);
31755                     var oppositeIndex = Math.floor((index + nodes.length / 2) % nodes.length);
31756
31757                     keyNodes.push(nodes[oppositeIndex]);
31758                     keyPoints.push(points[oppositeIndex]);
31759                 }
31760
31761                 // key points and nodes are those connected to the ways,
31762                 // they are projected onto the circle, inbetween nodes are moved
31763                 // to constant intervals between key nodes, extra inbetween nodes are
31764                 // added if necessary.
31765                 for (i = 0; i < keyPoints.length; i++) {
31766                     var nextKeyNodeIndex = (i + 1) % keyNodes.length;
31767                     var startNode = keyNodes[i];
31768                     var endNode = keyNodes[nextKeyNodeIndex];
31769                     var startNodeIndex = nodes.indexOf(startNode);
31770                     var endNodeIndex = nodes.indexOf(endNode);
31771                     var numberNewPoints = -1;
31772                     var indexRange = endNodeIndex - startNodeIndex;
31773                     var nearNodes = {};
31774                     var inBetweenNodes = [];
31775                     var startAngle, endAngle, totalAngle, eachAngle;
31776                     var angle, loc, node, origNode;
31777
31778                     if (indexRange < 0) {
31779                         indexRange += nodes.length;
31780                     }
31781
31782                     // position this key node
31783                     var distance = geoVecLength(centroid, keyPoints[i]) || 1e-4;
31784                     keyPoints[i] = [
31785                         centroid[0] + (keyPoints[i][0] - centroid[0]) / distance * radius,
31786                         centroid[1] + (keyPoints[i][1] - centroid[1]) / distance * radius
31787                     ];
31788                     loc = projection.invert(keyPoints[i]);
31789                     node = keyNodes[i];
31790                     origNode = origNodes[node.id];
31791                     node = node.move(geoVecInterp(origNode.loc, loc, t));
31792                     graph = graph.replace(node);
31793
31794                     // figure out the between delta angle we want to match to
31795                     startAngle = Math.atan2(keyPoints[i][1] - centroid[1], keyPoints[i][0] - centroid[0]);
31796                     endAngle = Math.atan2(keyPoints[nextKeyNodeIndex][1] - centroid[1], keyPoints[nextKeyNodeIndex][0] - centroid[0]);
31797                     totalAngle = endAngle - startAngle;
31798
31799                     // detects looping around -pi/pi
31800                     if (totalAngle * sign > 0) {
31801                         totalAngle = -sign * (2 * Math.PI - Math.abs(totalAngle));
31802                     }
31803
31804                     do {
31805                         numberNewPoints++;
31806                         eachAngle = totalAngle / (indexRange + numberNewPoints);
31807                     } while (Math.abs(eachAngle) > maxAngle);
31808
31809
31810                     // move existing nodes
31811                     for (j = 1; j < indexRange; j++) {
31812                         angle = startAngle + j * eachAngle;
31813                         loc = projection.invert([
31814                             centroid[0] + Math.cos(angle) * radius,
31815                             centroid[1] + Math.sin(angle) * radius
31816                         ]);
31817
31818                         node = nodes[(j + startNodeIndex) % nodes.length];
31819                         origNode = origNodes[node.id];
31820                         nearNodes[node.id] = angle;
31821
31822                         node = node.move(geoVecInterp(origNode.loc, loc, t));
31823                         graph = graph.replace(node);
31824                     }
31825
31826                     // add new inbetween nodes if necessary
31827                     for (j = 0; j < numberNewPoints; j++) {
31828                         angle = startAngle + (indexRange + j) * eachAngle;
31829                         loc = projection.invert([
31830                             centroid[0] + Math.cos(angle) * radius,
31831                             centroid[1] + Math.sin(angle) * radius
31832                         ]);
31833
31834                         // choose a nearnode to use as the original
31835                         var min = Infinity;
31836                         for (var nodeId in nearNodes) {
31837                             var nearAngle = nearNodes[nodeId];
31838                             var dist = Math.abs(nearAngle - angle);
31839                             if (dist < min) {
31840                                 dist = min;
31841                                 origNode = origNodes[nodeId];
31842                             }
31843                         }
31844
31845                         node = osmNode({ loc: geoVecInterp(origNode.loc, loc, t) });
31846                         graph = graph.replace(node);
31847
31848                         nodes.splice(endNodeIndex + j, 0, node);
31849                         inBetweenNodes.push(node.id);
31850                     }
31851
31852                     // Check for other ways that share these keyNodes..
31853                     // If keyNodes are adjacent in both ways,
31854                     // we can add inBetween nodes to that shared way too..
31855                     if (indexRange === 1 && inBetweenNodes.length) {
31856                         var startIndex1 = way.nodes.lastIndexOf(startNode.id);
31857                         var endIndex1 = way.nodes.lastIndexOf(endNode.id);
31858                         var wayDirection1 = (endIndex1 - startIndex1);
31859                         if (wayDirection1 < -1) { wayDirection1 = 1; }
31860
31861                         var parentWays = graph.parentWays(keyNodes[i]);
31862                         for (j = 0; j < parentWays.length; j++) {
31863                             var sharedWay = parentWays[j];
31864                             if (sharedWay === way) continue;
31865
31866                             if (sharedWay.areAdjacent(startNode.id, endNode.id)) {
31867                                 var startIndex2 = sharedWay.nodes.lastIndexOf(startNode.id);
31868                                 var endIndex2 = sharedWay.nodes.lastIndexOf(endNode.id);
31869                                 var wayDirection2 = (endIndex2 - startIndex2);
31870                                 var insertAt = endIndex2;
31871                                 if (wayDirection2 < -1) { wayDirection2 = 1; }
31872
31873                                 if (wayDirection1 !== wayDirection2) {
31874                                     inBetweenNodes.reverse();
31875                                     insertAt = startIndex2;
31876                                 }
31877                                 for (k = 0; k < inBetweenNodes.length; k++) {
31878                                     sharedWay = sharedWay.addNode(inBetweenNodes[k], insertAt + k);
31879                                 }
31880                                 graph = graph.replace(sharedWay);
31881                             }
31882                         }
31883                     }
31884
31885                 }
31886
31887                 // update the way to have all the new nodes
31888                 ids = nodes.map(function(n) { return n.id; });
31889                 ids.push(ids[0]);
31890
31891                 way = way.update({nodes: ids});
31892                 graph = graph.replace(way);
31893
31894                 return graph;
31895             };
31896
31897
31898             action.makeConvex = function(graph) {
31899                 var way = graph.entity(wayId);
31900                 var nodes = utilArrayUniq(graph.childNodes(way));
31901                 var points = nodes.map(function(n) { return projection(n.loc); });
31902                 var sign = d3_polygonArea(points) > 0 ? 1 : -1;
31903                 var hull = d3_polygonHull(points);
31904                 var i, j;
31905
31906                 // D3 convex hulls go counterclockwise..
31907                 if (sign === -1) {
31908                     nodes.reverse();
31909                     points.reverse();
31910                 }
31911
31912                 for (i = 0; i < hull.length - 1; i++) {
31913                     var startIndex = points.indexOf(hull[i]);
31914                     var endIndex = points.indexOf(hull[i+1]);
31915                     var indexRange = (endIndex - startIndex);
31916
31917                     if (indexRange < 0) {
31918                         indexRange += nodes.length;
31919                     }
31920
31921                     // move interior nodes to the surface of the convex hull..
31922                     for (j = 1; j < indexRange; j++) {
31923                         var point = geoVecInterp(hull[i], hull[i+1], j / indexRange);
31924                         var node = nodes[(j + startIndex) % nodes.length].move(projection.invert(point));
31925                         graph = graph.replace(node);
31926                     }
31927                 }
31928                 return graph;
31929             };
31930
31931
31932             action.disabled = function(graph) {
31933                 if (!graph.entity(wayId).isClosed()) {
31934                     return 'not_closed';
31935                 }
31936             };
31937
31938
31939             action.transitionable = true;
31940
31941
31942             return action;
31943         }
31944
31945         // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteWayAction.as
31946         function actionDeleteWay(wayID) {
31947
31948             function canDeleteNode(node, graph) {
31949                 // don't delete nodes still attached to ways or relations
31950                 if (graph.parentWays(node).length ||
31951                     graph.parentRelations(node).length) return false;
31952
31953                 var geometries = osmNodeGeometriesForTags(node.tags);
31954                 // don't delete if this node can be a standalone point
31955                 if (geometries.point) return false;
31956                 // delete if this node only be a vertex
31957                 if (geometries.vertex) return true;
31958
31959                 // iD doesn't know if this should be a point or vertex,
31960                 // so only delete if there are no interesting tags
31961                 return !node.hasInterestingTags();
31962             }
31963
31964
31965             var action = function(graph) {
31966                 var way = graph.entity(wayID);
31967
31968                 graph.parentRelations(way).forEach(function(parent) {
31969                     parent = parent.removeMembersWithID(wayID);
31970                     graph = graph.replace(parent);
31971
31972                     if (parent.isDegenerate()) {
31973                         graph = actionDeleteRelation(parent.id)(graph);
31974                     }
31975                 });
31976
31977                 (new Set(way.nodes)).forEach(function(nodeID) {
31978                     graph = graph.replace(way.removeNode(nodeID));
31979
31980                     var node = graph.entity(nodeID);
31981                     if (canDeleteNode(node, graph)) {
31982                         graph = graph.remove(node);
31983                     }
31984                 });
31985
31986                 return graph.remove(way);
31987             };
31988
31989
31990             return action;
31991         }
31992
31993         function actionDeleteMultiple(ids) {
31994             var actions = {
31995                 way: actionDeleteWay,
31996                 node: actionDeleteNode,
31997                 relation: actionDeleteRelation
31998             };
31999
32000
32001             var action = function(graph) {
32002                 ids.forEach(function(id) {
32003                     if (graph.hasEntity(id)) { // It may have been deleted aready.
32004                         graph = actions[graph.entity(id).type](id)(graph);
32005                     }
32006                 });
32007
32008                 return graph;
32009             };
32010
32011
32012             return action;
32013         }
32014
32015         // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteRelationAction.as
32016         function actionDeleteRelation(relationID, allowUntaggedMembers) {
32017
32018             function canDeleteEntity(entity, graph) {
32019                 return !graph.parentWays(entity).length &&
32020                     !graph.parentRelations(entity).length &&
32021                     (!entity.hasInterestingTags() && !allowUntaggedMembers);
32022             }
32023
32024
32025             var action = function(graph) {
32026                 var relation = graph.entity(relationID);
32027
32028                 graph.parentRelations(relation)
32029                     .forEach(function(parent) {
32030                         parent = parent.removeMembersWithID(relationID);
32031                         graph = graph.replace(parent);
32032
32033                         if (parent.isDegenerate()) {
32034                             graph = actionDeleteRelation(parent.id)(graph);
32035                         }
32036                     });
32037
32038                 var memberIDs = utilArrayUniq(relation.members.map(function(m) { return m.id; }));
32039                 memberIDs.forEach(function(memberID) {
32040                     graph = graph.replace(relation.removeMembersWithID(memberID));
32041
32042                     var entity = graph.entity(memberID);
32043                     if (canDeleteEntity(entity, graph)) {
32044                         graph = actionDeleteMultiple([memberID])(graph);
32045                     }
32046                 });
32047
32048                 return graph.remove(relation);
32049             };
32050
32051
32052             return action;
32053         }
32054
32055         // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteNodeAction.as
32056         function actionDeleteNode(nodeId) {
32057             var action = function(graph) {
32058                 var node = graph.entity(nodeId);
32059
32060                 graph.parentWays(node)
32061                     .forEach(function(parent) {
32062                         parent = parent.removeNode(nodeId);
32063                         graph = graph.replace(parent);
32064
32065                         if (parent.isDegenerate()) {
32066                             graph = actionDeleteWay(parent.id)(graph);
32067                         }
32068                     });
32069
32070                 graph.parentRelations(node)
32071                     .forEach(function(parent) {
32072                         parent = parent.removeMembersWithID(nodeId);
32073                         graph = graph.replace(parent);
32074
32075                         if (parent.isDegenerate()) {
32076                             graph = actionDeleteRelation(parent.id)(graph);
32077                         }
32078                     });
32079
32080                 return graph.remove(node);
32081             };
32082
32083
32084             return action;
32085         }
32086
32087         // Connect the ways at the given nodes.
32088         //
32089         // First choose a node to be the survivor, with preference given
32090         // to an existing (not new) node.
32091         //
32092         // Tags and relation memberships of of non-surviving nodes are merged
32093         // to the survivor.
32094         //
32095         // This is the inverse of `iD.actionDisconnect`.
32096         //
32097         // Reference:
32098         //   https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeNodesAction.as
32099         //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/MergeNodesAction.java
32100         //
32101         function actionConnect(nodeIDs) {
32102             var action = function(graph) {
32103                 var survivor;
32104                 var node;
32105                 var parents;
32106                 var i, j;
32107
32108                 // Choose a survivor node, prefer an existing (not new) node - #4974
32109                 for (i = 0; i < nodeIDs.length; i++) {
32110                     survivor = graph.entity(nodeIDs[i]);
32111                     if (survivor.version) break;  // found one
32112                 }
32113
32114                 // Replace all non-surviving nodes with the survivor and merge tags.
32115                 for (i = 0; i < nodeIDs.length; i++) {
32116                     node = graph.entity(nodeIDs[i]);
32117                     if (node.id === survivor.id) continue;
32118
32119                     parents = graph.parentWays(node);
32120                     for (j = 0; j < parents.length; j++) {
32121                         if (!parents[j].areAdjacent(node.id, survivor.id)) {
32122                             graph = graph.replace(parents[j].replaceNode(node.id, survivor.id));
32123                         }
32124                     }
32125
32126                     parents = graph.parentRelations(node);
32127                     for (j = 0; j < parents.length; j++) {
32128                         graph = graph.replace(parents[j].replaceMember(node, survivor));
32129                     }
32130
32131                     survivor = survivor.mergeTags(node.tags);
32132                     graph = actionDeleteNode(node.id)(graph);
32133                 }
32134
32135                 graph = graph.replace(survivor);
32136
32137                 return graph;
32138             };
32139
32140
32141             action.disabled = function(graph) {
32142                 var seen = {};
32143                 var restrictionIDs = [];
32144                 var survivor;
32145                 var node, way;
32146                 var relations, relation, role;
32147                 var i, j, k;
32148
32149                 // Choose a survivor node, prefer an existing (not new) node - #4974
32150                 for (i = 0; i < nodeIDs.length; i++) {
32151                     survivor = graph.entity(nodeIDs[i]);
32152                     if (survivor.version) break;  // found one
32153                 }
32154
32155                 // 1. disable if the nodes being connected have conflicting relation roles
32156                 for (i = 0; i < nodeIDs.length; i++) {
32157                     node = graph.entity(nodeIDs[i]);
32158                     relations = graph.parentRelations(node);
32159
32160                     for (j = 0; j < relations.length; j++) {
32161                         relation = relations[j];
32162                         role = relation.memberById(node.id).role || '';
32163
32164                         // if this node is a via node in a restriction, remember for later
32165                         if (relation.hasFromViaTo()) {
32166                             restrictionIDs.push(relation.id);
32167                         }
32168
32169                         if (seen[relation.id] !== undefined && seen[relation.id] !== role) {
32170                             return 'relation';
32171                         } else {
32172                             seen[relation.id] = role;
32173                         }
32174                     }
32175                 }
32176
32177                 // gather restrictions for parent ways
32178                 for (i = 0; i < nodeIDs.length; i++) {
32179                     node = graph.entity(nodeIDs[i]);
32180
32181                     var parents = graph.parentWays(node);
32182                     for (j = 0; j < parents.length; j++) {
32183                         var parent = parents[j];
32184                         relations = graph.parentRelations(parent);
32185
32186                         for (k = 0; k < relations.length; k++) {
32187                             relation = relations[k];
32188                             if (relation.hasFromViaTo()) {
32189                                 restrictionIDs.push(relation.id);
32190                             }
32191                         }
32192                     }
32193                 }
32194
32195
32196                 // test restrictions
32197                 restrictionIDs = utilArrayUniq(restrictionIDs);
32198                 for (i = 0; i < restrictionIDs.length; i++) {
32199                     relation = graph.entity(restrictionIDs[i]);
32200                     if (!relation.isComplete(graph)) continue;
32201
32202                     var memberWays = relation.members
32203                         .filter(function(m) { return m.type === 'way'; })
32204                         .map(function(m) { return graph.entity(m.id); });
32205
32206                     memberWays = utilArrayUniq(memberWays);
32207                     var f = relation.memberByRole('from');
32208                     var t = relation.memberByRole('to');
32209                     var isUturn = (f.id === t.id);
32210
32211                     // 2a. disable if connection would damage a restriction
32212                     // (a key node is a node at the junction of ways)
32213                     var nodes = { from: [], via: [], to: [], keyfrom: [], keyto: [] };
32214                     for (j = 0; j < relation.members.length; j++) {
32215                         collectNodes(relation.members[j], nodes);
32216                     }
32217
32218                     nodes.keyfrom = utilArrayUniq(nodes.keyfrom.filter(hasDuplicates));
32219                     nodes.keyto = utilArrayUniq(nodes.keyto.filter(hasDuplicates));
32220
32221                     var filter = keyNodeFilter(nodes.keyfrom, nodes.keyto);
32222                     nodes.from = nodes.from.filter(filter);
32223                     nodes.via = nodes.via.filter(filter);
32224                     nodes.to = nodes.to.filter(filter);
32225
32226                     var connectFrom = false;
32227                     var connectVia = false;
32228                     var connectTo = false;
32229                     var connectKeyFrom = false;
32230                     var connectKeyTo = false;
32231
32232                     for (j = 0; j < nodeIDs.length; j++) {
32233                         var n = nodeIDs[j];
32234                         if (nodes.from.indexOf(n) !== -1)    { connectFrom = true; }
32235                         if (nodes.via.indexOf(n) !== -1)     { connectVia = true; }
32236                         if (nodes.to.indexOf(n) !== -1)      { connectTo = true; }
32237                         if (nodes.keyfrom.indexOf(n) !== -1) { connectKeyFrom = true; }
32238                         if (nodes.keyto.indexOf(n) !== -1)   { connectKeyTo = true; }
32239                     }
32240                     if (connectFrom && connectTo && !isUturn) { return 'restriction'; }
32241                     if (connectFrom && connectVia) { return 'restriction'; }
32242                     if (connectTo   && connectVia) { return 'restriction'; }
32243
32244                     // connecting to a key node -
32245                     // if both nodes are on a member way (i.e. part of the turn restriction),
32246                     // the connecting node must be adjacent to the key node.
32247                     if (connectKeyFrom || connectKeyTo) {
32248                         if (nodeIDs.length !== 2) { return 'restriction'; }
32249
32250                         var n0 = null;
32251                         var n1 = null;
32252                         for (j = 0; j < memberWays.length; j++) {
32253                             way = memberWays[j];
32254                             if (way.contains(nodeIDs[0])) { n0 = nodeIDs[0]; }
32255                             if (way.contains(nodeIDs[1])) { n1 = nodeIDs[1]; }
32256                         }
32257
32258                         if (n0 && n1) {    // both nodes are part of the restriction
32259                             var ok = false;
32260                             for (j = 0; j < memberWays.length; j++) {
32261                                 way = memberWays[j];
32262                                 if (way.areAdjacent(n0, n1)) {
32263                                     ok = true;
32264                                     break;
32265                                 }
32266                             }
32267                             if (!ok) {
32268                                 return 'restriction';
32269                             }
32270                         }
32271                     }
32272
32273                     // 2b. disable if nodes being connected will destroy a member way in a restriction
32274                     // (to test, make a copy and try actually connecting the nodes)
32275                     for (j = 0; j < memberWays.length; j++) {
32276                         way = memberWays[j].update({});   // make copy
32277                         for (k = 0; k < nodeIDs.length; k++) {
32278                             if (nodeIDs[k] === survivor.id) continue;
32279
32280                             if (way.areAdjacent(nodeIDs[k], survivor.id)) {
32281                                 way = way.removeNode(nodeIDs[k]);
32282                             } else {
32283                                 way = way.replaceNode(nodeIDs[k], survivor.id);
32284                             }
32285                         }
32286                         if (way.isDegenerate()) {
32287                             return 'restriction';
32288                         }
32289                     }
32290                 }
32291
32292                 return false;
32293
32294
32295                 // if a key node appears multiple times (indexOf !== lastIndexOf) it's a FROM-VIA or TO-VIA junction
32296                 function hasDuplicates(n, i, arr) {
32297                     return arr.indexOf(n) !== arr.lastIndexOf(n);
32298                 }
32299
32300                 function keyNodeFilter(froms, tos) {
32301                     return function(n) {
32302                         return froms.indexOf(n) === -1 && tos.indexOf(n) === -1;
32303                     };
32304                 }
32305
32306                 function collectNodes(member, collection) {
32307                     var entity = graph.hasEntity(member.id);
32308                     if (!entity) return;
32309
32310                     var role = member.role || '';
32311                     if (!collection[role]) {
32312                         collection[role] = [];
32313                     }
32314
32315                     if (member.type === 'node') {
32316                         collection[role].push(member.id);
32317                         if (role === 'via') {
32318                             collection.keyfrom.push(member.id);
32319                             collection.keyto.push(member.id);
32320                         }
32321
32322                     } else if (member.type === 'way') {
32323                         collection[role].push.apply(collection[role], entity.nodes);
32324                         if (role === 'from' || role === 'via') {
32325                             collection.keyfrom.push(entity.first());
32326                             collection.keyfrom.push(entity.last());
32327                         }
32328                         if (role === 'to' || role === 'via') {
32329                             collection.keyto.push(entity.first());
32330                             collection.keyto.push(entity.last());
32331                         }
32332                     }
32333                 }
32334             };
32335
32336
32337             return action;
32338         }
32339
32340         function actionCopyEntities(ids, fromGraph) {
32341             var _copies = {};
32342
32343
32344             var action = function(graph) {
32345                 ids.forEach(function(id) {
32346                     fromGraph.entity(id).copy(fromGraph, _copies);
32347                 });
32348
32349                 for (var id in _copies) {
32350                     graph = graph.replace(_copies[id]);
32351                 }
32352
32353                 return graph;
32354             };
32355
32356
32357             action.copies = function() {
32358                 return _copies;
32359             };
32360
32361
32362             return action;
32363         }
32364
32365         function actionDeleteMember(relationId, memberIndex) {
32366             return function(graph) {
32367                 var relation = graph.entity(relationId)
32368                     .removeMember(memberIndex);
32369
32370                 graph = graph.replace(relation);
32371
32372                 if (relation.isDegenerate())
32373                     graph = actionDeleteRelation(relation.id)(graph);
32374
32375                 return graph;
32376             };
32377         }
32378
32379         function actionDiscardTags(difference) {
32380
32381             return function(graph) {
32382                 function discardTags(entity) {
32383                     var tags = {};
32384                     var keys = Object.keys(entity.tags);
32385                     var discarded = false;
32386
32387                     for (var i = 0; i < keys.length; i++) {
32388                         var k = keys[i];
32389                         if (dataDiscarded[k] || !entity.tags[k]) {
32390                             discarded = true;
32391                         } else {
32392                             tags[k] = entity.tags[k];
32393                         }
32394                     }
32395
32396                     if (discarded) {
32397                         graph = graph.replace(entity.update({ tags: tags }));
32398                     }
32399                 }
32400
32401                 difference.modified().forEach(discardTags);
32402                 difference.created().forEach(discardTags);
32403
32404                 return graph;
32405             };
32406         }
32407
32408         // Disconect the ways at the given node.
32409         //
32410         // Optionally, disconnect only the given ways.
32411         //
32412         // For testing convenience, accepts an ID to assign to the (first) new node.
32413         // Normally, this will be undefined and the way will automatically
32414         // be assigned a new ID.
32415         //
32416         // This is the inverse of `iD.actionConnect`.
32417         //
32418         // Reference:
32419         //   https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/UnjoinNodeAction.as
32420         //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/UnGlueAction.java
32421         //
32422         function actionDisconnect(nodeId, newNodeId) {
32423             var wayIds;
32424
32425
32426             var action = function(graph) {
32427                 var node = graph.entity(nodeId);
32428                 var connections = action.connections(graph);
32429
32430                 connections.forEach(function(connection) {
32431                     var way = graph.entity(connection.wayID);
32432                     var newNode = osmNode({id: newNodeId, loc: node.loc, tags: node.tags});
32433
32434                     graph = graph.replace(newNode);
32435                     if (connection.index === 0 && way.isArea()) {
32436                         // replace shared node with shared node..
32437                         graph = graph.replace(way.replaceNode(way.nodes[0], newNode.id));
32438                     } else if (way.isClosed() && connection.index === way.nodes.length - 1) {
32439                         // replace closing node with new new node..
32440                         graph = graph.replace(way.unclose().addNode(newNode.id));
32441                     } else {
32442                         // replace shared node with multiple new nodes..
32443                         graph = graph.replace(way.updateNode(newNode.id, connection.index));
32444                     }
32445                 });
32446
32447                 return graph;
32448             };
32449
32450
32451             action.connections = function(graph) {
32452                 var candidates = [];
32453                 var keeping = false;
32454                 var parentWays = graph.parentWays(graph.entity(nodeId));
32455
32456                 parentWays.forEach(function(way) {
32457                     if (wayIds && wayIds.indexOf(way.id) === -1) {
32458                         keeping = true;
32459                         return;
32460                     }
32461                     if (way.isArea() && (way.nodes[0] === nodeId)) {
32462                         candidates.push({ wayID: way.id, index: 0 });
32463                     } else {
32464                         way.nodes.forEach(function(waynode, index) {
32465                             if (waynode === nodeId) {
32466                                 if (way.isClosed() && parentWays.length > 1 && wayIds && wayIds.indexOf(way.id) !== -1 && index === way.nodes.length-1) {
32467                                     return;
32468                                 }
32469                                 candidates.push({ wayID: way.id, index: index });
32470                             }
32471                         });
32472                     }
32473                 });
32474
32475                 return keeping ? candidates : candidates.slice(1);
32476             };
32477
32478
32479             action.disabled = function(graph) {
32480                 var connections = action.connections(graph);
32481                 if (connections.length === 0)
32482                     return 'not_connected';
32483
32484                 var parentWays = graph.parentWays(graph.entity(nodeId));
32485                 var seenRelationIds = {};
32486                 var sharedRelation;
32487
32488                 parentWays.forEach(function(way) {
32489                     var relations = graph.parentRelations(way);
32490                     relations.forEach(function(relation) {
32491                         if (relation.id in seenRelationIds) {
32492                             if (wayIds) {
32493                                 if (wayIds.indexOf(way.id) !== -1 ||
32494                                     wayIds.indexOf(seenRelationIds[relation.id]) !== -1) {
32495                                     sharedRelation = relation;
32496                                 }
32497                             } else {
32498                                 sharedRelation = relation;
32499                             }
32500                         } else {
32501                             seenRelationIds[relation.id] = way.id;
32502                         }
32503                     });
32504                 });
32505
32506                 if (sharedRelation)
32507                     return 'relation';
32508             };
32509
32510
32511             action.limitWays = function(val) {
32512                 if (!arguments.length) return wayIds;
32513                 wayIds = val;
32514                 return action;
32515             };
32516
32517
32518             return action;
32519         }
32520
32521         function actionExtract(entityID, projection) {
32522
32523             var extractedNodeID;
32524
32525             var action = function(graph) {
32526                 var entity = graph.entity(entityID);
32527
32528                 if (entity.type === 'node') {
32529                     return extractFromNode(entity, graph);
32530                 }
32531
32532                 return extractFromArea(entity, graph);
32533             };
32534
32535             function extractFromNode(node, graph) {
32536
32537                 extractedNodeID = node.id;
32538
32539                 // Create a new node to replace the one we will detach
32540                 var replacement = osmNode({ loc: node.loc });
32541                 graph = graph.replace(replacement);
32542
32543                 // Process each way in turn, updating the graph as we go
32544                 graph = graph.parentWays(node)
32545                     .reduce(function(accGraph, parentWay) {
32546                         return accGraph.replace(parentWay.replaceNode(entityID, replacement.id));
32547                     }, graph);
32548
32549                 // Process any relations too
32550                 return graph.parentRelations(node)
32551                     .reduce(function(accGraph, parentRel) {
32552                         return accGraph.replace(parentRel.replaceMember(node, replacement));
32553                     }, graph);
32554             }
32555
32556             function extractFromArea(entity, graph) {
32557
32558                 var keysToCopyAndRetain = ['source', 'wheelchair'];
32559                 var keysToRetain = ['type'];
32560                 var buildingKeysToRetain = ['architect', 'building', 'height', 'layer'];
32561
32562                 var centroid = d3_geoPath(projection).centroid(entity.asGeoJSON(graph, true));
32563
32564                 var isBuilding = entity.tags.building;
32565
32566                 var areaTags = Object.assign({}, entity.tags);  // shallow copy
32567                 var pointTags = {};
32568                 for (var key in areaTags) {
32569
32570                     if (keysToRetain.indexOf(key) !== -1) {
32571                         continue;
32572                     }
32573
32574                     if (isBuilding) {
32575                         // don't transfer building-related tags
32576                         if (buildingKeysToRetain.indexOf(key) !== -1 ||
32577                             key.match(/^building:.{1,}/) ||
32578                             key.match(/^roof:.{1,}/)) continue;
32579                     }
32580
32581                     // copy the tag from the area to the point
32582                     pointTags[key] = areaTags[key];
32583
32584                     // leave addresses and some other tags so they're on both features
32585                     if (keysToCopyAndRetain.indexOf(key) !== -1 || key.match(/^addr:.{1,}/)) {
32586                         continue;
32587                     }
32588
32589                     // remove the tag from the area
32590                     delete areaTags[key];
32591                 }
32592
32593                 if (!isBuilding) {
32594                     // ensure that the area keeps the area geometry
32595                     areaTags.area = 'yes';
32596                 }
32597
32598                 var replacement = osmNode({ loc: centroid, tags: pointTags });
32599                 graph = graph.replace(replacement);
32600
32601                 extractedNodeID = replacement.id;
32602
32603                 return graph.replace(entity.update({tags: areaTags}));
32604             }
32605
32606             action.getExtractedNodeID = function() {
32607                 return extractedNodeID;
32608             };
32609
32610             action.disabled = function(graph) {
32611                 var entity = graph.entity(entityID);
32612
32613                 if (entity.type === 'node') {
32614                     var parentRels = graph.parentRelations(entity);
32615                     for (var i = 0; i < parentRels.length; i++) {
32616                         var relation = parentRels[i];
32617                         if (!relation.hasFromViaTo()) continue;
32618
32619                         for (var j = 0; j < relation.members.length; j++) {
32620                             var m = relation.members[j];
32621                             if (m.id === entityID && (m.role === 'via' || m.role === 'location_hint')) {
32622                                 return 'restriction';
32623                             }
32624                         }
32625                     }
32626                 }
32627
32628                 return false;
32629             };
32630
32631
32632             return action;
32633         }
32634
32635         // Join ways at the end node they share.
32636         //
32637         // This is the inverse of `iD.actionSplit`.
32638         //
32639         // Reference:
32640         //   https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeWaysAction.as
32641         //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/CombineWayAction.java
32642         //
32643         function actionJoin(ids) {
32644
32645             function groupEntitiesByGeometry(graph) {
32646                 var entities = ids.map(function(id) { return graph.entity(id); });
32647                 return Object.assign(
32648                     { line: [] },
32649                     utilArrayGroupBy(entities, function(entity) { return entity.geometry(graph); })
32650                 );
32651             }
32652
32653
32654             var action = function(graph) {
32655                 var ways = ids.map(graph.entity, graph);
32656                 var survivorID = ways[0].id;
32657
32658                 // if any of the ways are sided (e.g. coastline, cliff, kerb)
32659                 // sort them first so they establish the overall order - #6033
32660                 ways.sort(function(a, b) {
32661                     var aSided = a.isSided();
32662                     var bSided = b.isSided();
32663                     return (aSided && !bSided) ? -1
32664                         : (bSided && !aSided) ? 1
32665                         : 0;
32666                 });
32667
32668                 // Prefer to keep an existing way.
32669                 for (var i = 0; i < ways.length; i++) {
32670                     if (!ways[i].isNew()) {
32671                         survivorID = ways[i].id;
32672                         break;
32673                     }
32674                 }
32675
32676                 var sequences = osmJoinWays(ways, graph);
32677                 var joined = sequences[0];
32678
32679                 // We might need to reverse some of these ways before joining them.  #4688
32680                 // `joined.actions` property will contain any actions we need to apply.
32681                 graph = sequences.actions.reduce(function(g, action) { return action(g); }, graph);
32682
32683                 var survivor = graph.entity(survivorID);
32684                 survivor = survivor.update({ nodes: joined.nodes.map(function(n) { return n.id; }) });
32685                 graph = graph.replace(survivor);
32686
32687                 joined.forEach(function(way) {
32688                     if (way.id === survivorID) return;
32689
32690                     graph.parentRelations(way).forEach(function(parent) {
32691                         graph = graph.replace(parent.replaceMember(way, survivor));
32692                     });
32693
32694                     survivor = survivor.mergeTags(way.tags);
32695
32696                     graph = graph.replace(survivor);
32697                     graph = actionDeleteWay(way.id)(graph);
32698                 });
32699
32700                 return graph;
32701             };
32702
32703
32704             action.disabled = function(graph) {
32705                 var geometries = groupEntitiesByGeometry(graph);
32706                 if (ids.length < 2 || ids.length !== geometries.line.length) {
32707                     return 'not_eligible';
32708                 }
32709
32710                 var joined = osmJoinWays(ids.map(graph.entity, graph), graph);
32711                 if (joined.length > 1) {
32712                     return 'not_adjacent';
32713                 }
32714
32715                 // Loop through all combinations of path-pairs
32716                 // to check potential intersections between all pairs
32717                 for (var i = 0; i < ids.length - 1; i++) {
32718                     for (var j = i + 1; j < ids.length; j++) {
32719                         var path1 = graph.childNodes(graph.entity(ids[i]))
32720                             .map(function(e) { return e.loc; });
32721                         var path2 = graph.childNodes(graph.entity(ids[j]))
32722                             .map(function(e) { return e.loc; });
32723                         var intersections = geoPathIntersections(path1, path2);
32724
32725                         // Check if intersections are just nodes lying on top of
32726                         // each other/the line, as opposed to crossing it
32727                         var common = utilArrayIntersection(
32728                             joined[0].nodes.map(function(n) { return n.loc.toString(); }),
32729                             intersections.map(function(n) { return n.toString(); })
32730                         );
32731                         if (common.length !== intersections.length) {
32732                             return 'paths_intersect';
32733                         }
32734                     }
32735                 }
32736
32737                 var nodeIds = joined[0].nodes.map(function(n) { return n.id; }).slice(1, -1);
32738                 var relation;
32739                 var tags = {};
32740                 var conflicting = false;
32741
32742                 joined[0].forEach(function(way) {
32743                     var parents = graph.parentRelations(way);
32744                     parents.forEach(function(parent) {
32745                         if (parent.isRestriction() && parent.members.some(function(m) { return nodeIds.indexOf(m.id) >= 0; })) {
32746                             relation = parent;
32747                         }
32748                     });
32749
32750                     for (var k in way.tags) {
32751                         if (!(k in tags)) {
32752                             tags[k] = way.tags[k];
32753                         } else if (tags[k] && osmIsInterestingTag(k) && tags[k] !== way.tags[k]) {
32754                             conflicting = true;
32755                         }
32756                     }
32757                 });
32758
32759                 if (relation) {
32760                     return 'restriction';
32761                 }
32762
32763                 if (conflicting) {
32764                     return 'conflicting_tags';
32765                 }
32766             };
32767
32768
32769             return action;
32770         }
32771
32772         function actionMerge(ids) {
32773
32774             function groupEntitiesByGeometry(graph) {
32775                 var entities = ids.map(function(id) { return graph.entity(id); });
32776                 return Object.assign(
32777                     { point: [], area: [], line: [], relation: [] },
32778                     utilArrayGroupBy(entities, function(entity) { return entity.geometry(graph); })
32779                 );
32780             }
32781
32782
32783             var action = function(graph) {
32784                 var geometries = groupEntitiesByGeometry(graph);
32785                 var target = geometries.area[0] || geometries.line[0];
32786                 var points = geometries.point;
32787
32788                 points.forEach(function(point) {
32789                     target = target.mergeTags(point.tags);
32790                     graph = graph.replace(target);
32791
32792                     graph.parentRelations(point).forEach(function(parent) {
32793                         graph = graph.replace(parent.replaceMember(point, target));
32794                     });
32795
32796                     var nodes = utilArrayUniq(graph.childNodes(target));
32797                     var removeNode = point;
32798
32799                     for (var i = 0; i < nodes.length; i++) {
32800                         var node = nodes[i];
32801                         if (graph.parentWays(node).length > 1 ||
32802                             graph.parentRelations(node).length ||
32803                             node.hasInterestingTags()) {
32804                             continue;
32805                         }
32806
32807                         // Found an uninteresting child node on the target way.
32808                         // Move orig point into its place to preserve point's history. #3683
32809                         graph = graph.replace(point.update({ tags: {}, loc: node.loc }));
32810                         target = target.replaceNode(node.id, point.id);
32811                         graph = graph.replace(target);
32812                         removeNode = node;
32813                         break;
32814                     }
32815
32816                     graph = graph.remove(removeNode);
32817                 });
32818
32819                 return graph;
32820             };
32821
32822
32823             action.disabled = function(graph) {
32824                 var geometries = groupEntitiesByGeometry(graph);
32825                 if (geometries.point.length === 0 ||
32826                     (geometries.area.length + geometries.line.length) !== 1 ||
32827                     geometries.relation.length !== 0) {
32828                     return 'not_eligible';
32829                 }
32830             };
32831
32832
32833             return action;
32834         }
32835
32836         // `actionMergeNodes` is just a combination of:
32837         //
32838         // 1. move all the nodes to a common location
32839         // 2. `actionConnect` them
32840
32841         function actionMergeNodes(nodeIDs, loc) {
32842
32843             // If there is a single "interesting" node, use that as the location.
32844             // Otherwise return the average location of all the nodes.
32845             function chooseLoc(graph) {
32846                 if (!nodeIDs.length) return null;
32847                 var sum = [0,0];
32848                 var interestingCount = 0;
32849                 var interestingLoc;
32850
32851                 for (var i = 0; i < nodeIDs.length; i++) {
32852                     var node = graph.entity(nodeIDs[i]);
32853                     if (node.hasInterestingTags()) {
32854                         interestingLoc = (++interestingCount === 1) ? node.loc : null;
32855                     }
32856                     sum = geoVecAdd(sum, node.loc);
32857                 }
32858
32859                 return interestingLoc || geoVecScale(sum, 1 / nodeIDs.length);
32860             }
32861
32862
32863             var action = function(graph) {
32864                 if (nodeIDs.length < 2) return graph;
32865                 var toLoc = loc;
32866                 if (!toLoc) {
32867                     toLoc = chooseLoc(graph);
32868                 }
32869
32870                 for (var i = 0; i < nodeIDs.length; i++) {
32871                     var node = graph.entity(nodeIDs[i]);
32872                     if (node.loc !== toLoc) {
32873                         graph = graph.replace(node.move(toLoc));
32874                     }
32875                 }
32876
32877                 return actionConnect(nodeIDs)(graph);
32878             };
32879
32880
32881             action.disabled = function(graph) {
32882                 if (nodeIDs.length < 2) return 'not_eligible';
32883
32884                 for (var i = 0; i < nodeIDs.length; i++) {
32885                     var entity = graph.entity(nodeIDs[i]);
32886                     if (entity.type !== 'node') return 'not_eligible';
32887                 }
32888
32889                 return actionConnect(nodeIDs).disabled(graph);
32890             };
32891
32892             return action;
32893         }
32894
32895         function osmChangeset() {
32896             if (!(this instanceof osmChangeset)) {
32897                 return (new osmChangeset()).initialize(arguments);
32898             } else if (arguments.length) {
32899                 this.initialize(arguments);
32900             }
32901         }
32902
32903
32904         osmEntity.changeset = osmChangeset;
32905
32906         osmChangeset.prototype = Object.create(osmEntity.prototype);
32907
32908         Object.assign(osmChangeset.prototype, {
32909
32910             type: 'changeset',
32911
32912
32913             extent: function() {
32914                 return new geoExtent();
32915             },
32916
32917
32918             geometry: function() {
32919                 return 'changeset';
32920             },
32921
32922
32923             asJXON: function() {
32924                 return {
32925                     osm: {
32926                         changeset: {
32927                             tag: Object.keys(this.tags).map(function(k) {
32928                                 return { '@k': k, '@v': this.tags[k] };
32929                             }, this),
32930                             '@version': 0.6,
32931                             '@generator': 'iD'
32932                         }
32933                     }
32934                 };
32935             },
32936
32937
32938             // Generate [osmChange](http://wiki.openstreetmap.org/wiki/OsmChange)
32939             // XML. Returns a string.
32940             osmChangeJXON: function(changes) {
32941                 var changeset_id = this.id;
32942
32943                 function nest(x, order) {
32944                     var groups = {};
32945                     for (var i = 0; i < x.length; i++) {
32946                         var tagName = Object.keys(x[i])[0];
32947                         if (!groups[tagName]) groups[tagName] = [];
32948                         groups[tagName].push(x[i][tagName]);
32949                     }
32950                     var ordered = {};
32951                     order.forEach(function(o) {
32952                         if (groups[o]) ordered[o] = groups[o];
32953                     });
32954                     return ordered;
32955                 }
32956
32957
32958                 // sort relations in a changeset by dependencies
32959                 function sort(changes) {
32960
32961                     // find a referenced relation in the current changeset
32962                     function resolve(item) {
32963                         return relations.find(function(relation) {
32964                             return item.keyAttributes.type === 'relation'
32965                                 && item.keyAttributes.ref === relation['@id'];
32966                         });
32967                     }
32968
32969                     // a new item is an item that has not been already processed
32970                     function isNew(item) {
32971                         return !sorted[ item['@id'] ] && !processing.find(function(proc) {
32972                             return proc['@id'] === item['@id'];
32973                         });
32974                     }
32975
32976                     var processing = [];
32977                     var sorted = {};
32978                     var relations = changes.relation;
32979
32980                     if (!relations) return changes;
32981
32982                     for (var i = 0; i < relations.length; i++) {
32983                         var relation = relations[i];
32984
32985                         // skip relation if already sorted
32986                         if (!sorted[relation['@id']]) {
32987                             processing.push(relation);
32988                         }
32989
32990                         while (processing.length > 0) {
32991                             var next = processing[0],
32992                             deps = next.member.map(resolve).filter(Boolean).filter(isNew);
32993                             if (deps.length === 0) {
32994                                 sorted[next['@id']] = next;
32995                                 processing.shift();
32996                             } else {
32997                                 processing = deps.concat(processing);
32998                             }
32999                         }
33000                     }
33001
33002                     changes.relation = Object.values(sorted);
33003                     return changes;
33004                 }
33005
33006                 function rep(entity) {
33007                     return entity.asJXON(changeset_id);
33008                 }
33009
33010                 return {
33011                     osmChange: {
33012                         '@version': 0.6,
33013                         '@generator': 'iD',
33014                         'create': sort(nest(changes.created.map(rep), ['node', 'way', 'relation'])),
33015                         'modify': nest(changes.modified.map(rep), ['node', 'way', 'relation']),
33016                         'delete': Object.assign(nest(changes.deleted.map(rep), ['relation', 'way', 'node']), { '@if-unused': true })
33017                     }
33018                 };
33019             },
33020
33021
33022             asGeoJSON: function() {
33023                 return {};
33024             }
33025
33026         });
33027
33028         function osmNote() {
33029             if (!(this instanceof osmNote)) {
33030                 return (new osmNote()).initialize(arguments);
33031             } else if (arguments.length) {
33032                 this.initialize(arguments);
33033             }
33034         }
33035
33036
33037         osmNote.id = function() {
33038             return osmNote.id.next--;
33039         };
33040
33041
33042         osmNote.id.next = -1;
33043
33044
33045         Object.assign(osmNote.prototype, {
33046
33047             type: 'note',
33048
33049             initialize: function(sources) {
33050                 for (var i = 0; i < sources.length; ++i) {
33051                     var source = sources[i];
33052                     for (var prop in source) {
33053                         if (Object.prototype.hasOwnProperty.call(source, prop)) {
33054                             if (source[prop] === undefined) {
33055                                 delete this[prop];
33056                             } else {
33057                                 this[prop] = source[prop];
33058                             }
33059                         }
33060                     }
33061                 }
33062
33063                 if (!this.id) {
33064                     this.id = osmNote.id() + '';  // as string
33065                 }
33066
33067                 return this;
33068             },
33069
33070             extent: function() {
33071                 return new geoExtent(this.loc);
33072             },
33073
33074             update: function(attrs) {
33075                 return osmNote(this, attrs); // {v: 1 + (this.v || 0)}
33076             },
33077
33078             isNew: function() {
33079                 return this.id < 0;
33080             },
33081
33082             move: function(loc) {
33083                 return this.update({ loc: loc });
33084             }
33085
33086         });
33087
33088         function osmRelation() {
33089             if (!(this instanceof osmRelation)) {
33090                 return (new osmRelation()).initialize(arguments);
33091             } else if (arguments.length) {
33092                 this.initialize(arguments);
33093             }
33094         }
33095
33096
33097         osmEntity.relation = osmRelation;
33098
33099         osmRelation.prototype = Object.create(osmEntity.prototype);
33100
33101
33102         osmRelation.creationOrder = function(a, b) {
33103             var aId = parseInt(osmEntity.id.toOSM(a.id), 10);
33104             var bId = parseInt(osmEntity.id.toOSM(b.id), 10);
33105
33106             if (aId < 0 || bId < 0) return aId - bId;
33107             return bId - aId;
33108         };
33109
33110
33111         Object.assign(osmRelation.prototype, {
33112             type: 'relation',
33113             members: [],
33114
33115
33116             copy: function(resolver, copies) {
33117                 if (copies[this.id]) return copies[this.id];
33118
33119                 var copy = osmEntity.prototype.copy.call(this, resolver, copies);
33120
33121                 var members = this.members.map(function(member) {
33122                     return Object.assign({}, member, { id: resolver.entity(member.id).copy(resolver, copies).id });
33123                 });
33124
33125                 copy = copy.update({members: members});
33126                 copies[this.id] = copy;
33127
33128                 return copy;
33129             },
33130
33131
33132             extent: function(resolver, memo) {
33133                 return resolver.transient(this, 'extent', function() {
33134                     if (memo && memo[this.id]) return geoExtent();
33135                     memo = memo || {};
33136                     memo[this.id] = true;
33137
33138                     var extent = geoExtent();
33139                     for (var i = 0; i < this.members.length; i++) {
33140                         var member = resolver.hasEntity(this.members[i].id);
33141                         if (member) {
33142                             extent._extend(member.extent(resolver, memo));
33143                         }
33144                     }
33145                     return extent;
33146                 });
33147             },
33148
33149
33150             geometry: function(graph) {
33151                 return graph.transient(this, 'geometry', function() {
33152                     return this.isMultipolygon() ? 'area' : 'relation';
33153                 });
33154             },
33155
33156
33157             isDegenerate: function() {
33158                 return this.members.length === 0;
33159             },
33160
33161
33162             // Return an array of members, each extended with an 'index' property whose value
33163             // is the member index.
33164             indexedMembers: function() {
33165                 var result = new Array(this.members.length);
33166                 for (var i = 0; i < this.members.length; i++) {
33167                     result[i] = Object.assign({}, this.members[i], {index: i});
33168                 }
33169                 return result;
33170             },
33171
33172
33173             // Return the first member with the given role. A copy of the member object
33174             // is returned, extended with an 'index' property whose value is the member index.
33175             memberByRole: function(role) {
33176                 for (var i = 0; i < this.members.length; i++) {
33177                     if (this.members[i].role === role) {
33178                         return Object.assign({}, this.members[i], {index: i});
33179                     }
33180                 }
33181             },
33182
33183             // Same as memberByRole, but returns all members with the given role
33184             membersByRole: function(role) {
33185                 var result = [];
33186                 for (var i = 0; i < this.members.length; i++) {
33187                     if (this.members[i].role === role) {
33188                         result.push(Object.assign({}, this.members[i], {index: i}));
33189                     }
33190                 }
33191                 return result;
33192             },
33193
33194             // Return the first member with the given id. A copy of the member object
33195             // is returned, extended with an 'index' property whose value is the member index.
33196             memberById: function(id) {
33197                 for (var i = 0; i < this.members.length; i++) {
33198                     if (this.members[i].id === id) {
33199                         return Object.assign({}, this.members[i], {index: i});
33200                     }
33201                 }
33202             },
33203
33204
33205             // Return the first member with the given id and role. A copy of the member object
33206             // is returned, extended with an 'index' property whose value is the member index.
33207             memberByIdAndRole: function(id, role) {
33208                 for (var i = 0; i < this.members.length; i++) {
33209                     if (this.members[i].id === id && this.members[i].role === role) {
33210                         return Object.assign({}, this.members[i], {index: i});
33211                     }
33212                 }
33213             },
33214
33215
33216             addMember: function(member, index) {
33217                 var members = this.members.slice();
33218                 members.splice(index === undefined ? members.length : index, 0, member);
33219                 return this.update({members: members});
33220             },
33221
33222
33223             updateMember: function(member, index) {
33224                 var members = this.members.slice();
33225                 members.splice(index, 1, Object.assign({}, members[index], member));
33226                 return this.update({members: members});
33227             },
33228
33229
33230             removeMember: function(index) {
33231                 var members = this.members.slice();
33232                 members.splice(index, 1);
33233                 return this.update({members: members});
33234             },
33235
33236
33237             removeMembersWithID: function(id) {
33238                 var members = this.members.filter(function(m) { return m.id !== id; });
33239                 return this.update({members: members});
33240             },
33241
33242             moveMember: function(fromIndex, toIndex) {
33243                 var members = this.members.slice();
33244                 members.splice(toIndex, 0, members.splice(fromIndex, 1)[0]);
33245                 return this.update({members: members});
33246             },
33247
33248
33249             // Wherever a member appears with id `needle.id`, replace it with a member
33250             // with id `replacement.id`, type `replacement.type`, and the original role,
33251             // By default, adding a duplicate member (by id and role) is prevented.
33252             // Return an updated relation.
33253             replaceMember: function(needle, replacement, keepDuplicates) {
33254                 if (!this.memberById(needle.id)) return this;
33255
33256                 var members = [];
33257
33258                 for (var i = 0; i < this.members.length; i++) {
33259                     var member = this.members[i];
33260                     if (member.id !== needle.id) {
33261                         members.push(member);
33262                     } else if (keepDuplicates || !this.memberByIdAndRole(replacement.id, member.role)) {
33263                         members.push({ id: replacement.id, type: replacement.type, role: member.role });
33264                     }
33265                 }
33266
33267                 return this.update({ members: members });
33268             },
33269
33270
33271             asJXON: function(changeset_id) {
33272                 var r = {
33273                     relation: {
33274                         '@id': this.osmId(),
33275                         '@version': this.version || 0,
33276                         member: this.members.map(function(member) {
33277                             return {
33278                                 keyAttributes: {
33279                                     type: member.type,
33280                                     role: member.role,
33281                                     ref: osmEntity.id.toOSM(member.id)
33282                                 }
33283                             };
33284                         }, this),
33285                         tag: Object.keys(this.tags).map(function(k) {
33286                             return { keyAttributes: { k: k, v: this.tags[k] } };
33287                         }, this)
33288                     }
33289                 };
33290                 if (changeset_id) {
33291                     r.relation['@changeset'] = changeset_id;
33292                 }
33293                 return r;
33294             },
33295
33296
33297             asGeoJSON: function(resolver) {
33298                 return resolver.transient(this, 'GeoJSON', function () {
33299                     if (this.isMultipolygon()) {
33300                         return {
33301                             type: 'MultiPolygon',
33302                             coordinates: this.multipolygon(resolver)
33303                         };
33304                     } else {
33305                         return {
33306                             type: 'FeatureCollection',
33307                             properties: this.tags,
33308                             features: this.members.map(function (member) {
33309                                 return Object.assign({role: member.role}, resolver.entity(member.id).asGeoJSON(resolver));
33310                             })
33311                         };
33312                     }
33313                 });
33314             },
33315
33316
33317             area: function(resolver) {
33318                 return resolver.transient(this, 'area', function() {
33319                     return d3_geoArea(this.asGeoJSON(resolver));
33320                 });
33321             },
33322
33323
33324             isMultipolygon: function() {
33325                 return this.tags.type === 'multipolygon';
33326             },
33327
33328
33329             isComplete: function(resolver) {
33330                 for (var i = 0; i < this.members.length; i++) {
33331                     if (!resolver.hasEntity(this.members[i].id)) {
33332                         return false;
33333                     }
33334                 }
33335                 return true;
33336             },
33337
33338
33339             hasFromViaTo: function() {
33340                 return (
33341                     this.members.some(function(m) { return m.role === 'from'; }) &&
33342                     this.members.some(function(m) { return m.role === 'via'; }) &&
33343                     this.members.some(function(m) { return m.role === 'to'; })
33344                 );
33345             },
33346
33347
33348             isRestriction: function() {
33349                 return !!(this.tags.type && this.tags.type.match(/^restriction:?/));
33350             },
33351
33352
33353             isValidRestriction: function() {
33354                 if (!this.isRestriction()) return false;
33355
33356                 var froms = this.members.filter(function(m) { return m.role === 'from'; });
33357                 var vias = this.members.filter(function(m) { return m.role === 'via'; });
33358                 var tos = this.members.filter(function(m) { return m.role === 'to'; });
33359
33360                 if (froms.length !== 1 && this.tags.restriction !== 'no_entry') return false;
33361                 if (froms.some(function(m) { return m.type !== 'way'; })) return false;
33362
33363                 if (tos.length !== 1 && this.tags.restriction !== 'no_exit') return false;
33364                 if (tos.some(function(m) { return m.type !== 'way'; })) return false;
33365
33366                 if (vias.length === 0) return false;
33367                 if (vias.length > 1 && vias.some(function(m) { return m.type !== 'way'; })) return false;
33368
33369                 return true;
33370             },
33371
33372
33373             // Returns an array [A0, ... An], each Ai being an array of node arrays [Nds0, ... Ndsm],
33374             // where Nds0 is an outer ring and subsequent Ndsi's (if any i > 0) being inner rings.
33375             //
33376             // This corresponds to the structure needed for rendering a multipolygon path using a
33377             // `evenodd` fill rule, as well as the structure of a GeoJSON MultiPolygon geometry.
33378             //
33379             // In the case of invalid geometries, this function will still return a result which
33380             // includes the nodes of all way members, but some Nds may be unclosed and some inner
33381             // rings not matched with the intended outer ring.
33382             //
33383             multipolygon: function(resolver) {
33384                 var outers = this.members.filter(function(m) { return 'outer' === (m.role || 'outer'); });
33385                 var inners = this.members.filter(function(m) { return 'inner' === m.role; });
33386
33387                 outers = osmJoinWays(outers, resolver);
33388                 inners = osmJoinWays(inners, resolver);
33389
33390                 outers = outers.map(function(outer) {
33391                     return outer.nodes.map(function(node) { return node.loc; });
33392                 });
33393                 inners = inners.map(function(inner) {
33394                     return inner.nodes.map(function(node) { return node.loc; });
33395                 });
33396
33397                 var result = outers.map(function(o) {
33398                     // Heuristic for detecting counterclockwise winding order. Assumes
33399                     // that OpenStreetMap polygons are not hemisphere-spanning.
33400                     return [d3_geoArea({ type: 'Polygon', coordinates: [o] }) > 2 * Math.PI ? o.reverse() : o];
33401                 });
33402
33403                 function findOuter(inner) {
33404                     var o, outer;
33405
33406                     for (o = 0; o < outers.length; o++) {
33407                         outer = outers[o];
33408                         if (geoPolygonContainsPolygon(outer, inner))
33409                             return o;
33410                     }
33411
33412                     for (o = 0; o < outers.length; o++) {
33413                         outer = outers[o];
33414                         if (geoPolygonIntersectsPolygon(outer, inner, false))
33415                             return o;
33416                     }
33417                 }
33418
33419                 for (var i = 0; i < inners.length; i++) {
33420                     var inner = inners[i];
33421
33422                     if (d3_geoArea({ type: 'Polygon', coordinates: [inner] }) < 2 * Math.PI) {
33423                         inner = inner.reverse();
33424                     }
33425
33426                     var o = findOuter(inners[i]);
33427                     if (o !== undefined) {
33428                         result[o].push(inners[i]);
33429                     } else {
33430                         result.push([inners[i]]); // Invalid geometry
33431                     }
33432                 }
33433
33434                 return result;
33435             }
33436         });
33437
33438         var services = {improveOSM:{errorTypes:{ow:{icon:"fas-long-arrow-alt-right",category:"routing"},"mr-both":{icon:"maki-car",category:"geometry"},"mr-parking":{icon:"maki-parking",category:"geometry"},"mr-path":{icon:"maki-shoe",category:"geometry"},"mr-road":{icon:"maki-car",category:"geometry"},tr:{icon:"temaki-junction",category:"routing"}}},keepRight:{errorTypes:{}}};
33439
33440         function qaError() {
33441             if (!(this instanceof qaError)) {
33442                 return (new qaError()).initialize(arguments);
33443             } else if (arguments.length) {
33444                 this.initialize(arguments);
33445             }
33446         }
33447
33448         // Generic handling for services without nice IDs
33449         qaError.id = function() {
33450             return qaError.id.next--;
33451         };
33452
33453         qaError.id.next = -1;
33454
33455         Object.assign(qaError.prototype, {
33456             type: 'qaError',
33457
33458             // All errors need a position
33459             loc: [0, 0],
33460
33461             // These should be passed in, used to retrieve from qa_errors.json
33462             service: '',
33463             error_type: '',
33464
33465             initialize: function(sources) {
33466                 for (var i = 0; i < sources.length; ++i) {
33467                     var source = sources[i];
33468                     for (var prop in source) {
33469                         if (Object.prototype.hasOwnProperty.call(source, prop)) {
33470                             if (source[prop] === undefined) {
33471                                 delete this[prop];
33472                             } else {
33473                                 this[prop] = source[prop];
33474                             }
33475                         }
33476                     }
33477                 }
33478
33479                 // Extract common error information from data
33480                 if (this.service && this.error_type) {
33481                     var serviceInfo = services[this.service];
33482
33483                     if (serviceInfo) {
33484                         var errInfo = serviceInfo.errorTypes[this.error_type];
33485
33486                         if (errInfo) {
33487                             this.icon = errInfo.icon;
33488                             this.category = errInfo.category;
33489                         }
33490                     }
33491                 }
33492
33493                 // All errors must have an ID for selection
33494                 if (!this.id) {
33495                     this.id = qaError.id() + '';  // as string
33496                 }
33497
33498                 return this;
33499             },
33500
33501             update: function(attrs) {
33502                 return qaError(this, attrs); // {v: 1 + (this.v || 0)}
33503             }
33504         });
33505
33506         // Split a way at the given node.
33507         //
33508         // Optionally, split only the given ways, if multiple ways share
33509         // the given node.
33510         //
33511         // This is the inverse of `iD.actionJoin`.
33512         //
33513         // For testing convenience, accepts an ID to assign to the new way.
33514         // Normally, this will be undefined and the way will automatically
33515         // be assigned a new ID.
33516         //
33517         // Reference:
33518         //   https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/SplitWayAction.as
33519         //
33520         function actionSplit(nodeId, newWayIds) {
33521             var _wayIDs;
33522
33523             // If the way is closed, we need to search for a partner node
33524             // to split the way at.
33525             //
33526             // The following looks for a node that is both far away from
33527             // the initial node in terms of way segment length and nearby
33528             // in terms of beeline-distance. This assures that areas get
33529             // split on the most "natural" points (independent of the number
33530             // of nodes).
33531             // For example: bone-shaped areas get split across their waist
33532             // line, circles across the diameter.
33533             function splitArea(nodes, idxA, graph) {
33534                 var lengths = new Array(nodes.length);
33535                 var length;
33536                 var i;
33537                 var best = 0;
33538                 var idxB;
33539
33540                 function wrap(index) {
33541                     return utilWrap(index, nodes.length);
33542                 }
33543
33544                 function dist(nA, nB) {
33545                     var locA = graph.entity(nA).loc;
33546                     var locB = graph.entity(nB).loc;
33547                     var epsilon = 1e-6;
33548                     return (locA && locB) ? geoSphericalDistance(locA, locB) : epsilon;
33549                 }
33550
33551                 // calculate lengths
33552                 length = 0;
33553                 for (i = wrap(idxA + 1); i !== idxA; i = wrap(i + 1)) {
33554                     length += dist(nodes[i], nodes[wrap(i - 1)]);
33555                     lengths[i] = length;
33556                 }
33557
33558                 length = 0;
33559                 for (i = wrap(idxA - 1); i !== idxA; i = wrap(i - 1)) {
33560                     length += dist(nodes[i], nodes[wrap(i + 1)]);
33561                     if (length < lengths[i]) {
33562                         lengths[i] = length;
33563                     }
33564                 }
33565
33566                 // determine best opposite node to split
33567                 for (i = 0; i < nodes.length; i++) {
33568                     var cost = lengths[i] / dist(nodes[idxA], nodes[i]);
33569                     if (cost > best) {
33570                         idxB = i;
33571                         best = cost;
33572                     }
33573                 }
33574
33575                 return idxB;
33576             }
33577
33578
33579             function split(graph, wayA, newWayId) {
33580                 var wayB = osmWay({ id: newWayId, tags: wayA.tags });   // `wayB` is the NEW way
33581                 var origNodes = wayA.nodes.slice();
33582                 var nodesA;
33583                 var nodesB;
33584                 var isArea = wayA.isArea();
33585                 var isOuter = osmIsOldMultipolygonOuterMember(wayA, graph);
33586
33587                 if (wayA.isClosed()) {
33588                     var nodes = wayA.nodes.slice(0, -1);
33589                     var idxA = nodes.indexOf(nodeId);
33590                     var idxB = splitArea(nodes, idxA, graph);
33591
33592                     if (idxB < idxA) {
33593                         nodesA = nodes.slice(idxA).concat(nodes.slice(0, idxB + 1));
33594                         nodesB = nodes.slice(idxB, idxA + 1);
33595                     } else {
33596                         nodesA = nodes.slice(idxA, idxB + 1);
33597                         nodesB = nodes.slice(idxB).concat(nodes.slice(0, idxA + 1));
33598                     }
33599                 } else {
33600                     var idx = wayA.nodes.indexOf(nodeId, 1);
33601                     nodesA = wayA.nodes.slice(0, idx + 1);
33602                     nodesB = wayA.nodes.slice(idx);
33603                 }
33604
33605                 wayA = wayA.update({ nodes: nodesA });
33606                 wayB = wayB.update({ nodes: nodesB });
33607
33608                 graph = graph.replace(wayA);
33609                 graph = graph.replace(wayB);
33610
33611                 graph.parentRelations(wayA).forEach(function(relation) {
33612                     var member;
33613
33614                     // Turn restrictions - make sure:
33615                     // 1. Splitting a FROM/TO way - only `wayA` OR `wayB` remains in relation
33616                     //    (whichever one is connected to the VIA node/ways)
33617                     // 2. Splitting a VIA way - `wayB` remains in relation as a VIA way
33618                     if (relation.hasFromViaTo()) {
33619                         var f = relation.memberByRole('from');
33620                         var v = relation.membersByRole('via');
33621                         var t = relation.memberByRole('to');
33622                         var i;
33623
33624                         // 1. split a FROM/TO
33625                         if (f.id === wayA.id || t.id === wayA.id) {
33626                             var keepB = false;
33627                             if (v.length === 1 && v[0].type === 'node') {   // check via node
33628                                 keepB = wayB.contains(v[0].id);
33629                             } else {                                        // check via way(s)
33630                                 for (i = 0; i < v.length; i++) {
33631                                     if (v[i].type === 'way') {
33632                                         var wayVia = graph.hasEntity(v[i].id);
33633                                         if (wayVia && utilArrayIntersection(wayB.nodes, wayVia.nodes).length) {
33634                                             keepB = true;
33635                                             break;
33636                                         }
33637                                     }
33638                                 }
33639                             }
33640
33641                             if (keepB) {
33642                                 relation = relation.replaceMember(wayA, wayB);
33643                                 graph = graph.replace(relation);
33644                             }
33645
33646                         // 2. split a VIA
33647                         } else {
33648                             for (i = 0; i < v.length; i++) {
33649                                 if (v[i].type === 'way' && v[i].id === wayA.id) {
33650                                     member = {
33651                                         id: wayB.id,
33652                                         type: 'way',
33653                                         role: 'via'
33654                                     };
33655                                     graph = actionAddMember(relation.id, member, v[i].index + 1)(graph);
33656                                     break;
33657                                 }
33658                             }
33659                         }
33660
33661                     // All other relations (Routes, Multipolygons, etc):
33662                     // 1. Both `wayA` and `wayB` remain in the relation
33663                     // 2. But must be inserted as a pair (see `actionAddMember` for details)
33664                     } else {
33665                         if (relation === isOuter) {
33666                             graph = graph.replace(relation.mergeTags(wayA.tags));
33667                             graph = graph.replace(wayA.update({ tags: {} }));
33668                             graph = graph.replace(wayB.update({ tags: {} }));
33669                         }
33670
33671                         member = {
33672                             id: wayB.id,
33673                             type: 'way',
33674                             role: relation.memberById(wayA.id).role
33675                         };
33676
33677                         var insertPair = {
33678                             originalID: wayA.id,
33679                             insertedID: wayB.id,
33680                             nodes: origNodes
33681                         };
33682
33683                         graph = actionAddMember(relation.id, member, undefined, insertPair)(graph);
33684                     }
33685                 });
33686
33687                 if (!isOuter && isArea) {
33688                     var multipolygon = osmRelation({
33689                         tags: Object.assign({}, wayA.tags, { type: 'multipolygon' }),
33690                         members: [
33691                             { id: wayA.id, role: 'outer', type: 'way' },
33692                             { id: wayB.id, role: 'outer', type: 'way' }
33693                         ]
33694                     });
33695
33696                     graph = graph.replace(multipolygon);
33697                     graph = graph.replace(wayA.update({ tags: {} }));
33698                     graph = graph.replace(wayB.update({ tags: {} }));
33699                 }
33700
33701                 return graph;
33702             }
33703
33704
33705             var action = function(graph) {
33706                 var candidates = action.ways(graph);
33707                 for (var i = 0; i < candidates.length; i++) {
33708                     graph = split(graph, candidates[i], newWayIds && newWayIds[i]);
33709                 }
33710                 return graph;
33711             };
33712
33713
33714             action.ways = function(graph) {
33715                 var node = graph.entity(nodeId);
33716                 var parents = graph.parentWays(node);
33717                 var hasLines = parents.some(function(parent) {
33718                     return parent.geometry(graph) === 'line';
33719                 });
33720
33721                 return parents.filter(function(parent) {
33722                     if (_wayIDs && _wayIDs.indexOf(parent.id) === -1)
33723                         return false;
33724
33725                     if (!_wayIDs && hasLines && parent.geometry(graph) !== 'line')
33726                         return false;
33727
33728                     if (parent.isClosed()) {
33729                         return true;
33730                     }
33731
33732                     for (var i = 1; i < parent.nodes.length - 1; i++) {
33733                         if (parent.nodes[i] === nodeId) {
33734                             return true;
33735                         }
33736                     }
33737
33738                     return false;
33739                 });
33740             };
33741
33742
33743             action.disabled = function(graph) {
33744                 var candidates = action.ways(graph);
33745                 if (candidates.length === 0 || (_wayIDs && _wayIDs.length !== candidates.length)) {
33746                     return 'not_eligible';
33747                 }
33748             };
33749
33750
33751             action.limitWays = function(val) {
33752                 if (!arguments.length) return _wayIDs;
33753                 _wayIDs = val;
33754                 return action;
33755             };
33756
33757
33758             return action;
33759         }
33760
33761         function coreGraph(other, mutable) {
33762             if (!(this instanceof coreGraph)) return new coreGraph(other, mutable);
33763
33764             if (other instanceof coreGraph) {
33765                 var base = other.base();
33766                 this.entities = Object.assign(Object.create(base.entities), other.entities);
33767                 this._parentWays = Object.assign(Object.create(base.parentWays), other._parentWays);
33768                 this._parentRels = Object.assign(Object.create(base.parentRels), other._parentRels);
33769
33770             } else {
33771                 this.entities = Object.create({});
33772                 this._parentWays = Object.create({});
33773                 this._parentRels = Object.create({});
33774                 this.rebase(other || [], [this]);
33775             }
33776
33777             this.transients = {};
33778             this._childNodes = {};
33779             this.frozen = !mutable;
33780         }
33781
33782
33783         coreGraph.prototype = {
33784
33785             hasEntity: function(id) {
33786                 return this.entities[id];
33787             },
33788
33789
33790             entity: function(id) {
33791                 var entity = this.entities[id];
33792
33793                 //https://github.com/openstreetmap/iD/issues/3973#issuecomment-307052376
33794                 if (!entity) {
33795                     entity = this.entities.__proto__[id];  // eslint-disable-line no-proto
33796                 }
33797
33798                 if (!entity) {
33799                     throw new Error('entity ' + id + ' not found');
33800                 }
33801                 return entity;
33802             },
33803
33804
33805             transient: function(entity, key, fn) {
33806                 var id = entity.id;
33807                 var transients = this.transients[id] || (this.transients[id] = {});
33808
33809                 if (transients[key] !== undefined) {
33810                     return transients[key];
33811                 }
33812
33813                 transients[key] = fn.call(entity);
33814
33815                 return transients[key];
33816             },
33817
33818
33819             parentWays: function(entity) {
33820                 var parents = this._parentWays[entity.id];
33821                 var result = [];
33822                 if (parents) {
33823                     parents.forEach(function(id) {
33824                         result.push(this.entity(id));
33825                     }, this);
33826                 }
33827                 return result;
33828             },
33829
33830
33831             isPoi: function(entity) {
33832                 var parents = this._parentWays[entity.id];
33833                 return !parents || parents.size === 0;
33834             },
33835
33836
33837             isShared: function(entity) {
33838                 var parents = this._parentWays[entity.id];
33839                 return parents && parents.size > 1;
33840             },
33841
33842
33843             parentRelations: function(entity) {
33844                 var parents = this._parentRels[entity.id];
33845                 var result = [];
33846                 if (parents) {
33847                     parents.forEach(function(id) {
33848                         result.push(this.entity(id));
33849                     }, this);
33850                 }
33851                 return result;
33852             },
33853
33854             parentMultipolygons: function(entity) {
33855                 return this.parentRelations(entity).filter(function(relation) {
33856                     return relation.isMultipolygon();
33857                 });
33858             },
33859
33860
33861             childNodes: function(entity) {
33862                 if (this._childNodes[entity.id]) return this._childNodes[entity.id];
33863                 if (!entity.nodes) return [];
33864
33865                 var nodes = [];
33866                 for (var i = 0; i < entity.nodes.length; i++) {
33867                     nodes[i] = this.entity(entity.nodes[i]);
33868                 }
33869
33870                 this._childNodes[entity.id] = nodes;
33871                 return this._childNodes[entity.id];
33872             },
33873
33874
33875             base: function() {
33876                 return {
33877                     'entities': Object.getPrototypeOf(this.entities),
33878                     'parentWays': Object.getPrototypeOf(this._parentWays),
33879                     'parentRels': Object.getPrototypeOf(this._parentRels)
33880                 };
33881             },
33882
33883
33884             // Unlike other graph methods, rebase mutates in place. This is because it
33885             // is used only during the history operation that merges newly downloaded
33886             // data into each state. To external consumers, it should appear as if the
33887             // graph always contained the newly downloaded data.
33888             rebase: function(entities, stack, force) {
33889                 var base = this.base();
33890                 var i, j, k, id;
33891
33892                 for (i = 0; i < entities.length; i++) {
33893                     var entity = entities[i];
33894
33895                     if (!entity.visible || (!force && base.entities[entity.id]))
33896                         continue;
33897
33898                     // Merging data into the base graph
33899                     base.entities[entity.id] = entity;
33900                     this._updateCalculated(undefined, entity, base.parentWays, base.parentRels);
33901
33902                     // Restore provisionally-deleted nodes that are discovered to have an extant parent
33903                     if (entity.type === 'way') {
33904                         for (j = 0; j < entity.nodes.length; j++) {
33905                             id = entity.nodes[j];
33906                             for (k = 1; k < stack.length; k++) {
33907                                 var ents = stack[k].entities;
33908                                 if (ents.hasOwnProperty(id) && ents[id] === undefined) {
33909                                     delete ents[id];
33910                                 }
33911                             }
33912                         }
33913                     }
33914                 }
33915
33916                 for (i = 0; i < stack.length; i++) {
33917                     stack[i]._updateRebased();
33918                 }
33919             },
33920
33921
33922             _updateRebased: function() {
33923                 var base = this.base();
33924
33925                 Object.keys(this._parentWays).forEach(function(child) {
33926                     if (base.parentWays[child]) {
33927                         base.parentWays[child].forEach(function(id) {
33928                             if (!this.entities.hasOwnProperty(id)) {
33929                                 this._parentWays[child].add(id);
33930                             }
33931                         }, this);
33932                     }
33933                 }, this);
33934
33935                 Object.keys(this._parentRels).forEach(function(child) {
33936                     if (base.parentRels[child]) {
33937                         base.parentRels[child].forEach(function(id) {
33938                             if (!this.entities.hasOwnProperty(id)) {
33939                                 this._parentRels[child].add(id);
33940                             }
33941                         }, this);
33942                     }
33943                 }, this);
33944
33945                 this.transients = {};
33946
33947                 // this._childNodes is not updated, under the assumption that
33948                 // ways are always downloaded with their child nodes.
33949             },
33950
33951
33952             // Updates calculated properties (parentWays, parentRels) for the specified change
33953             _updateCalculated: function(oldentity, entity, parentWays, parentRels) {
33954                 parentWays = parentWays || this._parentWays;
33955                 parentRels = parentRels || this._parentRels;
33956
33957                 var type = entity && entity.type || oldentity && oldentity.type;
33958                 var removed, added, i;
33959
33960                 if (type === 'way') {   // Update parentWays
33961                     if (oldentity && entity) {
33962                         removed = utilArrayDifference(oldentity.nodes, entity.nodes);
33963                         added = utilArrayDifference(entity.nodes, oldentity.nodes);
33964                     } else if (oldentity) {
33965                         removed = oldentity.nodes;
33966                         added = [];
33967                     } else if (entity) {
33968                         removed = [];
33969                         added = entity.nodes;
33970                     }
33971                     for (i = 0; i < removed.length; i++) {
33972                         // make a copy of prototype property, store as own property, and update..
33973                         parentWays[removed[i]] = new Set(parentWays[removed[i]]);
33974                         parentWays[removed[i]].delete(oldentity.id);
33975                     }
33976                     for (i = 0; i < added.length; i++) {
33977                         // make a copy of prototype property, store as own property, and update..
33978                         parentWays[added[i]] = new Set(parentWays[added[i]]);
33979                         parentWays[added[i]].add(entity.id);
33980                     }
33981
33982                 } else if (type === 'relation') {   // Update parentRels
33983
33984                     // diff only on the IDs since the same entity can be a member multiple times with different roles
33985                     var oldentityMemberIDs = oldentity ? oldentity.members.map(function(m) { return m.id; }) : [];
33986                     var entityMemberIDs = entity ? entity.members.map(function(m) { return m.id; }) : [];
33987
33988                     if (oldentity && entity) {
33989                         removed = utilArrayDifference(oldentityMemberIDs, entityMemberIDs);
33990                         added = utilArrayDifference(entityMemberIDs, oldentityMemberIDs);
33991                     } else if (oldentity) {
33992                         removed = oldentityMemberIDs;
33993                         added = [];
33994                     } else if (entity) {
33995                         removed = [];
33996                         added = entityMemberIDs;
33997                     }
33998                     for (i = 0; i < removed.length; i++) {
33999                         // make a copy of prototype property, store as own property, and update..
34000                         parentRels[removed[i]] = new Set(parentRels[removed[i]]);
34001                         parentRels[removed[i]].delete(oldentity.id);
34002                     }
34003                     for (i = 0; i < added.length; i++) {
34004                         // make a copy of prototype property, store as own property, and update..
34005                         parentRels[added[i]] = new Set(parentRels[added[i]]);
34006                         parentRels[added[i]].add(entity.id);
34007                     }
34008                 }
34009             },
34010
34011
34012             replace: function(entity) {
34013                 if (this.entities[entity.id] === entity) return this;
34014
34015                 return this.update(function() {
34016                     this._updateCalculated(this.entities[entity.id], entity);
34017                     this.entities[entity.id] = entity;
34018                 });
34019             },
34020
34021
34022             remove: function(entity) {
34023                 return this.update(function() {
34024                     this._updateCalculated(entity, undefined);
34025                     this.entities[entity.id] = undefined;
34026                 });
34027             },
34028
34029
34030             revert: function(id) {
34031                 var baseEntity = this.base().entities[id];
34032                 var headEntity = this.entities[id];
34033                 if (headEntity === baseEntity) return this;
34034
34035                 return this.update(function() {
34036                     this._updateCalculated(headEntity, baseEntity);
34037                     delete this.entities[id];
34038                 });
34039             },
34040
34041
34042             update: function() {
34043                 var graph = this.frozen ? coreGraph(this, true) : this;
34044                 for (var i = 0; i < arguments.length; i++) {
34045                     arguments[i].call(graph, graph);
34046                 }
34047
34048                 if (this.frozen) graph.frozen = true;
34049
34050                 return graph;
34051             },
34052
34053
34054             // Obliterates any existing entities
34055             load: function(entities) {
34056                 var base = this.base();
34057                 this.entities = Object.create(base.entities);
34058
34059                 for (var i in entities) {
34060                     this.entities[i] = entities[i];
34061                     this._updateCalculated(base.entities[i], this.entities[i]);
34062                 }
34063
34064                 return this;
34065             }
34066         };
34067
34068         function osmTurn(turn) {
34069             if (!(this instanceof osmTurn)) {
34070                 return new osmTurn(turn);
34071             }
34072             Object.assign(this, turn);
34073         }
34074
34075
34076         function osmIntersection(graph, startVertexId, maxDistance) {
34077             maxDistance = maxDistance || 30;    // in meters
34078             var vgraph = coreGraph();           // virtual graph
34079             var i, j, k;
34080
34081
34082             function memberOfRestriction(entity) {
34083                 return graph.parentRelations(entity)
34084                     .some(function(r) { return r.isRestriction(); });
34085             }
34086
34087             function isRoad(way) {
34088                 if (way.isArea() || way.isDegenerate()) return false;
34089                 var roads = {
34090                     'motorway': true,
34091                     'motorway_link': true,
34092                     'trunk': true,
34093                     'trunk_link': true,
34094                     'primary': true,
34095                     'primary_link': true,
34096                     'secondary': true,
34097                     'secondary_link': true,
34098                     'tertiary': true,
34099                     'tertiary_link': true,
34100                     'residential': true,
34101                     'unclassified': true,
34102                     'living_street': true,
34103                     'service': true,
34104                     'road': true,
34105                     'track': true
34106                 };
34107                 return roads[way.tags.highway];
34108             }
34109
34110
34111             var startNode = graph.entity(startVertexId);
34112             var checkVertices = [startNode];
34113             var checkWays;
34114             var vertices = [];
34115             var vertexIds = [];
34116             var vertex;
34117             var ways = [];
34118             var wayIds = [];
34119             var way;
34120             var nodes = [];
34121             var node;
34122             var parents = [];
34123             var parent;
34124
34125             // `actions` will store whatever actions must be performed to satisfy
34126             // preconditions for adding a turn restriction to this intersection.
34127             //  - Remove any existing degenerate turn restrictions (missing from/to, etc)
34128             //  - Reverse oneways so that they are drawn in the forward direction
34129             //  - Split ways on key vertices
34130             var actions = [];
34131
34132
34133             // STEP 1:  walk the graph outwards from starting vertex to search
34134             //  for more key vertices and ways to include in the intersection..
34135
34136             while (checkVertices.length) {
34137                 vertex = checkVertices.pop();
34138
34139                 // check this vertex for parent ways that are roads
34140                 checkWays = graph.parentWays(vertex);
34141                 var hasWays = false;
34142                 for (i = 0; i < checkWays.length; i++) {
34143                     way = checkWays[i];
34144                     if (!isRoad(way) && !memberOfRestriction(way)) continue;
34145
34146                     ways.push(way);   // it's a road, or it's already in a turn restriction
34147                     hasWays = true;
34148
34149                     // check the way's children for more key vertices
34150                     nodes = utilArrayUniq(graph.childNodes(way));
34151                     for (j = 0; j < nodes.length; j++) {
34152                         node = nodes[j];
34153                         if (node === vertex) continue;                                           // same thing
34154                         if (vertices.indexOf(node) !== -1) continue;                             // seen it already
34155                         if (geoSphericalDistance(node.loc, startNode.loc) > maxDistance) continue;   // too far from start
34156
34157                         // a key vertex will have parents that are also roads
34158                         var hasParents = false;
34159                         parents = graph.parentWays(node);
34160                         for (k = 0; k < parents.length; k++) {
34161                             parent = parents[k];
34162                             if (parent === way) continue;                 // same thing
34163                             if (ways.indexOf(parent) !== -1) continue;    // seen it already
34164                             if (!isRoad(parent)) continue;                // not a road
34165                             hasParents = true;
34166                             break;
34167                         }
34168
34169                         if (hasParents) {
34170                             checkVertices.push(node);
34171                         }
34172                     }
34173                 }
34174
34175                 if (hasWays) {
34176                     vertices.push(vertex);
34177                 }
34178             }
34179
34180             vertices = utilArrayUniq(vertices);
34181             ways = utilArrayUniq(ways);
34182
34183
34184             // STEP 2:  Build a virtual graph containing only the entities in the intersection..
34185             // Everything done after this step should act on the virtual graph
34186             // Any actions that must be performed later to the main graph go in `actions` array
34187             ways.forEach(function(way) {
34188                 graph.childNodes(way).forEach(function(node) {
34189                     vgraph = vgraph.replace(node);
34190                 });
34191
34192                 vgraph = vgraph.replace(way);
34193
34194                 graph.parentRelations(way).forEach(function(relation) {
34195                     if (relation.isRestriction()) {
34196                         if (relation.isValidRestriction(graph)) {
34197                             vgraph = vgraph.replace(relation);
34198                         } else if (relation.isComplete(graph)) {
34199                             actions.push(actionDeleteRelation(relation.id));
34200                         }
34201                     }
34202                 });
34203             });
34204
34205
34206             // STEP 3:  Force all oneways to be drawn in the forward direction
34207             ways.forEach(function(w) {
34208                 var way = vgraph.entity(w.id);
34209                 if (way.tags.oneway === '-1') {
34210                     var action = actionReverse(way.id, { reverseOneway: true });
34211                     actions.push(action);
34212                     vgraph = action(vgraph);
34213                 }
34214             });
34215
34216
34217             // STEP 4:  Split ways on key vertices
34218             var origCount = osmEntity.id.next.way;
34219             vertices.forEach(function(v) {
34220                 // This is an odd way to do it, but we need to find all the ways that
34221                 // will be split here, then split them one at a time to ensure that these
34222                 // actions can be replayed on the main graph exactly in the same order.
34223                 // (It is unintuitive, but the order of ways returned from graph.parentWays()
34224                 // is arbitrary, depending on how the main graph and vgraph were built)
34225                 var splitAll = actionSplit(v.id);
34226                 if (!splitAll.disabled(vgraph)) {
34227                     splitAll.ways(vgraph).forEach(function(way) {
34228                         var splitOne = actionSplit(v.id).limitWays([way.id]);
34229                         actions.push(splitOne);
34230                         vgraph = splitOne(vgraph);
34231                     });
34232                 }
34233             });
34234
34235             // In here is where we should also split the intersection at nearby junction.
34236             //   for https://github.com/mapbox/iD-internal/issues/31
34237             // nearbyVertices.forEach(function(v) {
34238             // });
34239
34240             // Reasons why we reset the way id count here:
34241             //  1. Continuity with way ids created by the splits so that we can replay
34242             //     these actions later if the user decides to create a turn restriction
34243             //  2. Avoids churning way ids just by hovering over a vertex
34244             //     and displaying the turn restriction editor
34245             osmEntity.id.next.way = origCount;
34246
34247
34248             // STEP 5:  Update arrays to point to vgraph entities
34249             vertexIds = vertices.map(function(v) { return v.id; });
34250             vertices = [];
34251             ways = [];
34252
34253             vertexIds.forEach(function(id) {
34254                 var vertex = vgraph.entity(id);
34255                 var parents = vgraph.parentWays(vertex);
34256                 vertices.push(vertex);
34257                 ways = ways.concat(parents);
34258             });
34259
34260             vertices = utilArrayUniq(vertices);
34261             ways = utilArrayUniq(ways);
34262
34263             vertexIds = vertices.map(function(v) { return v.id; });
34264             wayIds = ways.map(function(w) { return w.id; });
34265
34266
34267             // STEP 6:  Update the ways with some metadata that will be useful for
34268             // walking the intersection graph later and rendering turn arrows.
34269
34270             function withMetadata(way, vertexIds) {
34271                 var __oneWay = way.isOneWay();
34272
34273                 // which affixes are key vertices?
34274                 var __first = (vertexIds.indexOf(way.first()) !== -1);
34275                 var __last = (vertexIds.indexOf(way.last()) !== -1);
34276
34277                 // what roles is this way eligible for?
34278                 var __via = (__first && __last);
34279                 var __from = ((__first && !__oneWay) || __last);
34280                 var __to = (__first || (__last && !__oneWay));
34281
34282                 return way.update({
34283                     __first:  __first,
34284                     __last:  __last,
34285                     __from:  __from,
34286                     __via: __via,
34287                     __to:  __to,
34288                     __oneWay:  __oneWay
34289                 });
34290             }
34291
34292             ways = [];
34293             wayIds.forEach(function(id) {
34294                 var way = withMetadata(vgraph.entity(id), vertexIds);
34295                 vgraph = vgraph.replace(way);
34296                 ways.push(way);
34297             });
34298
34299
34300             // STEP 7:  Simplify - This is an iterative process where we:
34301             //  1. Find trivial vertices with only 2 parents
34302             //  2. trim off the leaf way from those vertices and remove from vgraph
34303
34304             var keepGoing;
34305             var removeWayIds = [];
34306             var removeVertexIds = [];
34307
34308             do {
34309                 keepGoing = false;
34310                 checkVertices = vertexIds.slice();
34311
34312                 for (i = 0; i < checkVertices.length; i++) {
34313                     var vertexId = checkVertices[i];
34314                     vertex = vgraph.hasEntity(vertexId);
34315
34316                     if (!vertex) {
34317                         if (vertexIds.indexOf(vertexId) !== -1) {
34318                             vertexIds.splice(vertexIds.indexOf(vertexId), 1);   // stop checking this one
34319                         }
34320                         removeVertexIds.push(vertexId);
34321                         continue;
34322                     }
34323
34324                     parents = vgraph.parentWays(vertex);
34325                     if (parents.length < 3) {
34326                         if (vertexIds.indexOf(vertexId) !== -1) {
34327                             vertexIds.splice(vertexIds.indexOf(vertexId), 1);   // stop checking this one
34328                         }
34329                     }
34330
34331                     if (parents.length === 2) {     // vertex with 2 parents is trivial
34332                         var a = parents[0];
34333                         var b = parents[1];
34334                         var aIsLeaf = a && !a.__via;
34335                         var bIsLeaf = b && !b.__via;
34336                         var leaf, survivor;
34337
34338                         if (aIsLeaf && !bIsLeaf) {
34339                             leaf = a;
34340                             survivor = b;
34341                         } else if (!aIsLeaf && bIsLeaf) {
34342                             leaf = b;
34343                             survivor = a;
34344                         }
34345
34346                         if (leaf && survivor) {
34347                             survivor = withMetadata(survivor, vertexIds);      // update survivor way
34348                             vgraph = vgraph.replace(survivor).remove(leaf);    // update graph
34349                             removeWayIds.push(leaf.id);
34350                             keepGoing = true;
34351                         }
34352                     }
34353
34354                     parents = vgraph.parentWays(vertex);
34355
34356                     if (parents.length < 2) {     // vertex is no longer a key vertex
34357                         if (vertexIds.indexOf(vertexId) !== -1) {
34358                             vertexIds.splice(vertexIds.indexOf(vertexId), 1);   // stop checking this one
34359                         }
34360                         removeVertexIds.push(vertexId);
34361                         keepGoing = true;
34362                     }
34363
34364                     if (parents.length < 1) {     // vertex is no longer attached to anything
34365                         vgraph = vgraph.remove(vertex);
34366                     }
34367
34368                 }
34369             } while (keepGoing);
34370
34371
34372             vertices = vertices
34373                 .filter(function(vertex) { return removeVertexIds.indexOf(vertex.id) === -1; })
34374                 .map(function(vertex) { return vgraph.entity(vertex.id); });
34375             ways = ways
34376                 .filter(function(way) { return removeWayIds.indexOf(way.id) === -1; })
34377                 .map(function(way) { return vgraph.entity(way.id); });
34378
34379
34380             // OK!  Here is our intersection..
34381             var intersection = {
34382                 graph: vgraph,
34383                 actions: actions,
34384                 vertices: vertices,
34385                 ways: ways,
34386             };
34387
34388
34389
34390             // Get all the valid turns through this intersection given a starting way id.
34391             // This operates on the virtual graph for everything.
34392             //
34393             // Basically, walk through all possible paths from starting way,
34394             //   honoring the existing turn restrictions as we go (watch out for loops!)
34395             //
34396             // For each path found, generate and return a `osmTurn` datastructure.
34397             //
34398             intersection.turns = function(fromWayId, maxViaWay) {
34399                 if (!fromWayId) return [];
34400                 if (!maxViaWay) maxViaWay = 0;
34401
34402                 var vgraph = intersection.graph;
34403                 var keyVertexIds = intersection.vertices.map(function(v) { return v.id; });
34404
34405                 var start = vgraph.entity(fromWayId);
34406                 if (!start || !(start.__from || start.__via)) return [];
34407
34408                 // maxViaWay=0   from-*-to              (0 vias)
34409                 // maxViaWay=1   from-*-via-*-to        (1 via max)
34410                 // maxViaWay=2   from-*-via-*-via-*-to  (2 vias max)
34411                 var maxPathLength = (maxViaWay * 2) + 3;
34412                 var turns = [];
34413
34414                 step(start);
34415                 return turns;
34416
34417
34418                 // traverse the intersection graph and find all the valid paths
34419                 function step(entity, currPath, currRestrictions, matchedRestriction) {
34420                     currPath = (currPath || []).slice();  // shallow copy
34421                     if (currPath.length >= maxPathLength) return;
34422                     currPath.push(entity.id);
34423                     currRestrictions = (currRestrictions || []).slice();  // shallow copy
34424                     var i, j;
34425
34426                     if (entity.type === 'node') {
34427                         var parents = vgraph.parentWays(entity);
34428                         var nextWays = [];
34429
34430                         // which ways can we step into?
34431                         for (i = 0; i < parents.length; i++) {
34432                             var way = parents[i];
34433
34434                             // if next way is a oneway incoming to this vertex, skip
34435                             if (way.__oneWay && way.nodes[0] !== entity.id) continue;
34436
34437                             // if we have seen it before (allowing for an initial u-turn), skip
34438                             if (currPath.indexOf(way.id) !== -1 && currPath.length >= 3) continue;
34439
34440                             // Check all "current" restrictions (where we've already walked the `FROM`)
34441                             var restrict = undefined;
34442                             for (j = 0; j < currRestrictions.length; j++) {
34443                                 var restriction = currRestrictions[j];
34444                                 var f = restriction.memberByRole('from');
34445                                 var v = restriction.membersByRole('via');
34446                                 var t = restriction.memberByRole('to');
34447                                 var isOnly = /^only_/.test(restriction.tags.restriction);
34448
34449                                 // Does the current path match this turn restriction?
34450                                 var matchesFrom = (f.id === fromWayId);
34451                                 var matchesViaTo = false;
34452                                 var isAlongOnlyPath = false;
34453
34454                                 if (t.id === way.id) {     // match TO
34455
34456                                     if (v.length === 1 && v[0].type === 'node') {    // match VIA node
34457                                         matchesViaTo = (v[0].id === entity.id && (
34458                                             (matchesFrom && currPath.length === 2) ||
34459                                             (!matchesFrom && currPath.length > 2)
34460                                         ));
34461
34462                                     } else {                                         // match all VIA ways
34463                                         var pathVias = [];
34464                                         for (k = 2; k < currPath.length; k +=2 ) {   // k = 2 skips FROM
34465                                             pathVias.push(currPath[k]);              // (path goes way-node-way...)
34466                                         }
34467                                         var restrictionVias = [];
34468                                         for (k = 0; k < v.length; k++) {
34469                                             if (v[k].type === 'way') {
34470                                                 restrictionVias.push(v[k].id);
34471                                             }
34472                                         }
34473                                         var diff = utilArrayDifference(pathVias, restrictionVias);
34474                                         matchesViaTo = !diff.length;
34475                                     }
34476
34477                                 } else if (isOnly) {
34478                                     for (k = 0; k < v.length; k++) {
34479                                         // way doesn't match TO, but is one of the via ways along the path of an "only"
34480                                         if (v[k].type === 'way' && v[k].id === way.id) {
34481                                             isAlongOnlyPath = true;
34482                                             break;
34483                                         }
34484                                     }
34485                                 }
34486
34487                                 if (matchesViaTo) {
34488                                     if (isOnly) {
34489                                         restrict = { id: restriction.id, direct: matchesFrom, from: f.id, only: true, end: true };
34490                                     } else {
34491                                         restrict = { id: restriction.id, direct: matchesFrom, from: f.id, no: true, end: true };
34492                                     }
34493                                 } else {    // indirect - caused by a different nearby restriction
34494                                     if (isAlongOnlyPath) {
34495                                         restrict = { id: restriction.id, direct: false, from: f.id, only: true, end: false };
34496                                     } else if (isOnly) {
34497                                         restrict = { id: restriction.id, direct: false, from: f.id, no: true, end: true };
34498                                     }
34499                                 }
34500
34501                                 // stop looking if we find a "direct" restriction (matching FROM, VIA, TO)
34502                                 if (restrict && restrict.direct)
34503                                     break;
34504                             }
34505
34506                             nextWays.push({ way: way, restrict: restrict });
34507                         }
34508
34509                         nextWays.forEach(function(nextWay) {
34510                             step(nextWay.way, currPath, currRestrictions, nextWay.restrict);
34511                         });
34512
34513
34514                     } else {  // entity.type === 'way'
34515                         if (currPath.length >= 3) {     // this is a "complete" path..
34516                             var turnPath = currPath.slice();   // shallow copy
34517
34518                             // an indirect restriction - only include the partial path (starting at FROM)
34519                             if (matchedRestriction && matchedRestriction.direct === false) {
34520                                 for (i = 0; i < turnPath.length; i++) {
34521                                     if (turnPath[i] === matchedRestriction.from) {
34522                                         turnPath = turnPath.slice(i);
34523                                         break;
34524                                     }
34525                                 }
34526                             }
34527
34528                             var turn = pathToTurn(turnPath);
34529                             if (turn) {
34530                                 if (matchedRestriction) {
34531                                     turn.restrictionID = matchedRestriction.id;
34532                                     turn.no = matchedRestriction.no;
34533                                     turn.only = matchedRestriction.only;
34534                                     turn.direct = matchedRestriction.direct;
34535                                 }
34536                                 turns.push(osmTurn(turn));
34537                             }
34538
34539                             if (currPath[0] === currPath[2]) return;   // if we made a u-turn - stop here
34540                         }
34541
34542                         if (matchedRestriction && matchedRestriction.end) return;  // don't advance any further
34543
34544                         // which nodes can we step into?
34545                         var n1 = vgraph.entity(entity.first());
34546                         var n2 = vgraph.entity(entity.last());
34547                         var dist = geoSphericalDistance(n1.loc, n2.loc);
34548                         var nextNodes = [];
34549
34550                         if (currPath.length > 1) {
34551                             if (dist > maxDistance) return;   // the next node is too far
34552                             if (!entity.__via) return;        // this way is a leaf / can't be a via
34553                         }
34554
34555                         if (!entity.__oneWay &&                     // bidirectional..
34556                             keyVertexIds.indexOf(n1.id) !== -1 &&   // key vertex..
34557                             currPath.indexOf(n1.id) === -1) {       // haven't seen it yet..
34558                             nextNodes.push(n1);                     // can advance to first node
34559                         }
34560                         if (keyVertexIds.indexOf(n2.id) !== -1 &&   // key vertex..
34561                             currPath.indexOf(n2.id) === -1) {       // haven't seen it yet..
34562                             nextNodes.push(n2);                     // can advance to last node
34563                         }
34564
34565                         nextNodes.forEach(function(nextNode) {
34566                             // gather restrictions FROM this way
34567                             var fromRestrictions = vgraph.parentRelations(entity).filter(function(r) {
34568                                 if (!r.isRestriction()) return false;
34569
34570                                 var f = r.memberByRole('from');
34571                                 if (!f || f.id !== entity.id) return false;
34572
34573                                 var isOnly = /^only_/.test(r.tags.restriction);
34574                                 if (!isOnly) return true;
34575
34576                                 // `only_` restrictions only matter along the direction of the VIA - #4849
34577                                 var isOnlyVia = false;
34578                                 var v = r.membersByRole('via');
34579                                 if (v.length === 1 && v[0].type === 'node') {   // via node
34580                                     isOnlyVia = (v[0].id === nextNode.id);
34581                                 } else {                                        // via way(s)
34582                                     for (var i = 0; i < v.length; i++) {
34583                                         if (v[i].type !== 'way') continue;
34584                                         var viaWay = vgraph.entity(v[i].id);
34585                                         if (viaWay.first() === nextNode.id || viaWay.last() === nextNode.id) {
34586                                             isOnlyVia = true;
34587                                             break;
34588                                         }
34589                                     }
34590                                 }
34591                                 return isOnlyVia;
34592                             });
34593
34594                             step(nextNode, currPath, currRestrictions.concat(fromRestrictions), false);
34595                         });
34596                     }
34597                 }
34598
34599
34600                 // assumes path is alternating way-node-way of odd length
34601                 function pathToTurn(path) {
34602                     if (path.length < 3) return;
34603                     var fromWayId, fromNodeId, fromVertexId;
34604                     var toWayId, toNodeId, toVertexId;
34605                     var viaWayIds, viaNodeId, isUturn;
34606
34607                     fromWayId = path[0];
34608                     toWayId = path[path.length - 1];
34609
34610                     if (path.length === 3 && fromWayId === toWayId) {  // u turn
34611                         var way = vgraph.entity(fromWayId);
34612                         if (way.__oneWay) return null;
34613
34614                         isUturn = true;
34615                         viaNodeId = fromVertexId = toVertexId = path[1];
34616                         fromNodeId = toNodeId = adjacentNode(fromWayId, viaNodeId);
34617
34618                     } else {
34619                         isUturn = false;
34620                         fromVertexId = path[1];
34621                         fromNodeId = adjacentNode(fromWayId, fromVertexId);
34622                         toVertexId = path[path.length - 2];
34623                         toNodeId = adjacentNode(toWayId, toVertexId);
34624
34625                         if (path.length === 3) {
34626                             viaNodeId = path[1];
34627                         } else {
34628                             viaWayIds = path.filter(function(entityId) { return entityId[0] === 'w'; });
34629                             viaWayIds = viaWayIds.slice(1, viaWayIds.length - 1);  // remove first, last
34630                         }
34631                     }
34632
34633                     return {
34634                         key:  path.join('_'),
34635                         path: path,
34636                         from: { node: fromNodeId, way:  fromWayId, vertex: fromVertexId },
34637                         via:  { node: viaNodeId,  ways: viaWayIds },
34638                         to:   { node: toNodeId,   way:  toWayId, vertex: toVertexId },
34639                         u:    isUturn
34640                     };
34641
34642
34643                     function adjacentNode(wayId, affixId) {
34644                         var nodes = vgraph.entity(wayId).nodes;
34645                         return affixId === nodes[0] ? nodes[1] : nodes[nodes.length - 2];
34646                     }
34647                 }
34648
34649             };
34650
34651             return intersection;
34652         }
34653
34654
34655         function osmInferRestriction(graph, turn, projection) {
34656             var fromWay = graph.entity(turn.from.way);
34657             var fromNode = graph.entity(turn.from.node);
34658             var fromVertex = graph.entity(turn.from.vertex);
34659             var toWay = graph.entity(turn.to.way);
34660             var toNode = graph.entity(turn.to.node);
34661             var toVertex = graph.entity(turn.to.vertex);
34662
34663             var fromOneWay = (fromWay.tags.oneway === 'yes');
34664             var toOneWay = (toWay.tags.oneway === 'yes');
34665             var angle = (geoAngle(fromVertex, fromNode, projection) -
34666                         geoAngle(toVertex, toNode, projection)) * 180 / Math.PI;
34667
34668             while (angle < 0)
34669                 angle += 360;
34670
34671             if (fromNode === toNode)
34672                 return 'no_u_turn';
34673             if ((angle < 23 || angle > 336) && fromOneWay && toOneWay)
34674                 return 'no_u_turn';   // wider tolerance for u-turn if both ways are oneway
34675             if ((angle < 40 || angle > 319) && fromOneWay && toOneWay && turn.from.vertex !== turn.to.vertex)
34676                 return 'no_u_turn';   // even wider tolerance for u-turn if there is a via way (from !== to)
34677             if (angle < 158)
34678                 return 'no_right_turn';
34679             if (angle > 202)
34680                 return 'no_left_turn';
34681
34682             return 'no_straight_on';
34683         }
34684
34685         function actionMergePolygon(ids, newRelationId) {
34686
34687             function groupEntities(graph) {
34688                 var entities = ids.map(function (id) { return graph.entity(id); });
34689                 var geometryGroups = utilArrayGroupBy(entities, function(entity) {
34690                     if (entity.type === 'way' && entity.isClosed()) {
34691                         return 'closedWay';
34692                     } else if (entity.type === 'relation' && entity.isMultipolygon()) {
34693                         return 'multipolygon';
34694                     } else {
34695                         return 'other';
34696                     }
34697                 });
34698
34699                 return Object.assign(
34700                     { closedWay: [], multipolygon: [], other: [] },
34701                     geometryGroups
34702                 );
34703             }
34704
34705
34706             var action = function(graph) {
34707                 var entities = groupEntities(graph);
34708
34709                 // An array representing all the polygons that are part of the multipolygon.
34710                 //
34711                 // Each element is itself an array of objects with an id property, and has a
34712                 // locs property which is an array of the locations forming the polygon.
34713                 var polygons = entities.multipolygon.reduce(function(polygons, m) {
34714                     return polygons.concat(osmJoinWays(m.members, graph));
34715                 }, []).concat(entities.closedWay.map(function(d) {
34716                     var member = [{id: d.id}];
34717                     member.nodes = graph.childNodes(d);
34718                     return member;
34719                 }));
34720
34721                 // contained is an array of arrays of boolean values,
34722                 // where contained[j][k] is true iff the jth way is
34723                 // contained by the kth way.
34724                 var contained = polygons.map(function(w, i) {
34725                     return polygons.map(function(d, n) {
34726                         if (i === n) return null;
34727                         return geoPolygonContainsPolygon(
34728                             d.nodes.map(function(n) { return n.loc; }),
34729                             w.nodes.map(function(n) { return n.loc; })
34730                         );
34731                     });
34732                 });
34733
34734                 // Sort all polygons as either outer or inner ways
34735                 var members = [];
34736                 var outer = true;
34737
34738                 while (polygons.length) {
34739                     extractUncontained(polygons);
34740                     polygons = polygons.filter(isContained);
34741                     contained = contained.filter(isContained).map(filterContained);
34742                 }
34743
34744                 function isContained(d, i) {
34745                     return contained[i].some(function(val) { return val; });
34746                 }
34747
34748                 function filterContained(d) {
34749                     return d.filter(isContained);
34750                 }
34751
34752                 function extractUncontained(polygons) {
34753                     polygons.forEach(function(d, i) {
34754                         if (!isContained(d, i)) {
34755                             d.forEach(function(member) {
34756                                 members.push({
34757                                     type: 'way',
34758                                     id: member.id,
34759                                     role: outer ? 'outer' : 'inner'
34760                                 });
34761                             });
34762                         }
34763                     });
34764                     outer = !outer;
34765                 }
34766
34767                 // Move all tags to one relation
34768                 var relation = entities.multipolygon[0] ||
34769                     osmRelation({ id: newRelationId, tags: { type: 'multipolygon' }});
34770
34771                 entities.multipolygon.slice(1).forEach(function(m) {
34772                     relation = relation.mergeTags(m.tags);
34773                     graph = graph.remove(m);
34774                 });
34775
34776                 entities.closedWay.forEach(function(way) {
34777                     function isThisOuter(m) {
34778                         return m.id === way.id && m.role !== 'inner';
34779                     }
34780                     if (members.some(isThisOuter)) {
34781                         relation = relation.mergeTags(way.tags);
34782                         graph = graph.replace(way.update({ tags: {} }));
34783                     }
34784                 });
34785
34786                 return graph.replace(relation.update({
34787                     members: members,
34788                     tags: utilObjectOmit(relation.tags, ['area'])
34789                 }));
34790             };
34791
34792
34793             action.disabled = function(graph) {
34794                 var entities = groupEntities(graph);
34795                 if (entities.other.length > 0 ||
34796                     entities.closedWay.length + entities.multipolygon.length < 2)
34797                     return 'not_eligible';
34798                 if (!entities.multipolygon.every(function(r) { return r.isComplete(graph); }))
34799                     return 'incomplete_relation';
34800             };
34801
34802
34803             return action;
34804         }
34805
34806         var isArray$3 = Array.isArray;
34807         var keyList = Object.keys;
34808         var hasProp = Object.prototype.hasOwnProperty;
34809
34810         var fastDeepEqual = function equal(a, b) {
34811           if (a === b) return true;
34812
34813           if (a && b && typeof a == 'object' && typeof b == 'object') {
34814             var arrA = isArray$3(a)
34815               , arrB = isArray$3(b)
34816               , i
34817               , length
34818               , key;
34819
34820             if (arrA && arrB) {
34821               length = a.length;
34822               if (length != b.length) return false;
34823               for (i = length; i-- !== 0;)
34824                 if (!equal(a[i], b[i])) return false;
34825               return true;
34826             }
34827
34828             if (arrA != arrB) return false;
34829
34830             var dateA = a instanceof Date
34831               , dateB = b instanceof Date;
34832             if (dateA != dateB) return false;
34833             if (dateA && dateB) return a.getTime() == b.getTime();
34834
34835             var regexpA = a instanceof RegExp
34836               , regexpB = b instanceof RegExp;
34837             if (regexpA != regexpB) return false;
34838             if (regexpA && regexpB) return a.toString() == b.toString();
34839
34840             var keys = keyList(a);
34841             length = keys.length;
34842
34843             if (length !== keyList(b).length)
34844               return false;
34845
34846             for (i = length; i-- !== 0;)
34847               if (!hasProp.call(b, keys[i])) return false;
34848
34849             for (i = length; i-- !== 0;) {
34850               key = keys[i];
34851               if (!equal(a[key], b[key])) return false;
34852             }
34853
34854             return true;
34855           }
34856
34857           return a!==a && b!==b;
34858         };
34859
34860         // Text diff algorithm following Hunt and McIlroy 1976.
34861         // J. W. Hunt and M. D. McIlroy, An algorithm for differential file
34862         // comparison, Bell Telephone Laboratories CSTR #41 (1976)
34863         // http://www.cs.dartmouth.edu/~doug/
34864         //
34865         // Expects two arrays of strings.
34866         function LCS(file1, file2) {
34867           var equivalenceClasses;
34868           var file2indices;
34869           var newCandidate;
34870           var candidates;
34871           var line;
34872           var c, i, j, jX, r, s;
34873
34874           equivalenceClasses = {};
34875           for (j = 0; j < file2.length; j++) {
34876             line = file2[j];
34877             if (equivalenceClasses[line]) {
34878               equivalenceClasses[line].push(j);
34879             } else {
34880               equivalenceClasses[line] = [j];
34881             }
34882           }
34883
34884           candidates = [
34885             { file1index: -1, file2index: -1, chain: null }
34886           ];
34887
34888           for (i = 0; i < file1.length; i++) {
34889             line = file1[i];
34890             file2indices = equivalenceClasses[line] || [];
34891
34892             r = 0;
34893             c = candidates[0];
34894
34895             for (jX = 0; jX < file2indices.length; jX++) {
34896               j = file2indices[jX];
34897
34898               for (s = r; s < candidates.length; s++) {
34899                 if ((candidates[s].file2index < j) && ((s === candidates.length - 1) || (candidates[s + 1].file2index > j))) {
34900                   break;
34901                 }
34902               }
34903
34904               if (s < candidates.length) {
34905                 newCandidate = { file1index: i, file2index: j, chain: candidates[s] };
34906                 if (r === candidates.length) {
34907                   candidates.push(c);
34908                 } else {
34909                   candidates[r] = c;
34910                 }
34911                 r = s + 1;
34912                 c = newCandidate;
34913                 if (r === candidates.length) {
34914                   break; // no point in examining further (j)s
34915                 }
34916               }
34917             }
34918
34919             candidates[r] = c;
34920           }
34921
34922           // At this point, we know the LCS: it's in the reverse of the
34923           // linked-list through .chain of candidates[candidates.length - 1].
34924
34925           return candidates[candidates.length - 1];
34926         }
34927
34928
34929         // We apply the LCS to give a simple representation of the
34930         // offsets and lengths of mismatched chunks in the input
34931         // files. This is used by diff3MergeIndices below.
34932         function diffIndices(file1, file2) {
34933           var result = [];
34934           var tail1 = file1.length;
34935           var tail2 = file2.length;
34936
34937           for (var candidate = LCS(file1, file2);
34938              candidate !== null;
34939              candidate = candidate.chain)
34940           {
34941             var mismatchLength1 = tail1 - candidate.file1index - 1;
34942             var mismatchLength2 = tail2 - candidate.file2index - 1;
34943             tail1 = candidate.file1index;
34944             tail2 = candidate.file2index;
34945
34946             if (mismatchLength1 || mismatchLength2) {
34947               result.push({
34948                 file1: [tail1 + 1, mismatchLength1],
34949                 file2: [tail2 + 1, mismatchLength2]
34950               });
34951             }
34952           }
34953
34954           result.reverse();
34955           return result;
34956         }
34957
34958
34959         // Given three files, A, O, and B, where both A and B are
34960         // independently derived from O, returns a fairly complicated
34961         // internal representation of merge decisions it's taken. The
34962         // interested reader may wish to consult
34963         //
34964         // Sanjeev Khanna, Keshav Kunal, and Benjamin C. Pierce.
34965         // 'A Formal Investigation of ' In Arvind and Prasad,
34966         // editors, Foundations of Software Technology and Theoretical
34967         // Computer Science (FSTTCS), December 2007.
34968         //
34969         // (http://www.cis.upenn.edu/~bcpierce/papers/diff3-short.pdf)
34970         function diff3MergeIndices(a, o, b) {
34971           var i;
34972           var m1 = diffIndices(o, a);
34973           var m2 = diffIndices(o, b);
34974
34975           var hunks = [];
34976           function addHunk(h, side) {
34977             hunks.push([h.file1[0], side, h.file1[1], h.file2[0], h.file2[1]]);
34978           }
34979           for (i = 0; i < m1.length; i++) { addHunk(m1[i], 0); }
34980           for (i = 0; i < m2.length; i++) { addHunk(m2[i], 2); }
34981           hunks.sort(function (x, y) { return x[0] - y[0]; });
34982
34983           var result = [];
34984           var commonOffset = 0;
34985           function copyCommon(targetOffset) {
34986             if (targetOffset > commonOffset) {
34987               result.push([1, commonOffset, targetOffset - commonOffset]);
34988               commonOffset = targetOffset;
34989             }
34990           }
34991
34992           for (var hunkIndex = 0; hunkIndex < hunks.length; hunkIndex++) {
34993             var firstHunkIndex = hunkIndex;
34994             var hunk = hunks[hunkIndex];
34995             var regionLhs = hunk[0];
34996             var regionRhs = regionLhs + hunk[2];
34997             while (hunkIndex < hunks.length - 1) {
34998               var maybeOverlapping = hunks[hunkIndex + 1];
34999               var maybeLhs = maybeOverlapping[0];
35000               if (maybeLhs > regionRhs) {
35001                 break;
35002               }
35003               regionRhs = Math.max(regionRhs, maybeLhs + maybeOverlapping[2]);
35004               hunkIndex++;
35005             }
35006
35007             copyCommon(regionLhs);
35008             if (firstHunkIndex === hunkIndex) {
35009               // The 'overlap' was only one hunk long, meaning that
35010               // there's no conflict here. Either a and o were the
35011               // same, or b and o were the same.
35012               if (hunk[4] > 0) {
35013                 result.push([hunk[1], hunk[3], hunk[4]]);
35014               }
35015             } else {
35016               // A proper conflict. Determine the extents of the
35017               // regions involved from a, o and b. Effectively merge
35018               // all the hunks on the left into one giant hunk, and
35019               // do the same for the right; then, correct for skew
35020               // in the regions of o that each side changed, and
35021               // report appropriate spans for the three sides.
35022               var regions = {
35023                 0: [a.length, -1, o.length, -1],
35024                 2: [b.length, -1, o.length, -1]
35025               };
35026               for (i = firstHunkIndex; i <= hunkIndex; i++) {
35027                 hunk = hunks[i];
35028                 var side = hunk[1];
35029                 var r = regions[side];
35030                 var oLhs = hunk[0];
35031                 var oRhs = oLhs + hunk[2];
35032                 var abLhs = hunk[3];
35033                 var abRhs = abLhs + hunk[4];
35034                 r[0] = Math.min(abLhs, r[0]);
35035                 r[1] = Math.max(abRhs, r[1]);
35036                 r[2] = Math.min(oLhs, r[2]);
35037                 r[3] = Math.max(oRhs, r[3]);
35038               }
35039               var aLhs = regions[0][0] + (regionLhs - regions[0][2]);
35040               var aRhs = regions[0][1] + (regionRhs - regions[0][3]);
35041               var bLhs = regions[2][0] + (regionLhs - regions[2][2]);
35042               var bRhs = regions[2][1] + (regionRhs - regions[2][3]);
35043               result.push([-1,
35044                            aLhs,      aRhs      - aLhs,
35045                            regionLhs, regionRhs - regionLhs,
35046                            bLhs,      bRhs      - bLhs]);
35047             }
35048             commonOffset = regionRhs;
35049           }
35050
35051           copyCommon(o.length);
35052           return result;
35053         }
35054
35055
35056         // Applies the output of diff3MergeIndices to actually
35057         // construct the merged file; the returned result alternates
35058         // between 'ok' and 'conflict' blocks.
35059         function diff3Merge(a, o, b, excludeFalseConflicts) {
35060           var result = [];
35061           var files = [a, o, b];
35062           var indices = diff3MergeIndices(a, o, b);
35063
35064           var okLines = [];
35065           function flushOk() {
35066             if (okLines.length) {
35067               result.push({ok: okLines});
35068             }
35069             okLines = [];
35070           }
35071           function pushOk(xs) {
35072             for (var j = 0; j < xs.length; j++) {
35073               okLines.push(xs[j]);
35074             }
35075           }
35076
35077           function isTrueConflict(rec) {
35078             if (rec[2] !== rec[6]) return true;
35079             var aoff = rec[1];
35080             var boff = rec[5];
35081             for (var j = 0; j < rec[2]; j++) {
35082               if (a[j + aoff] !== b[j + boff]) {
35083                 return true;
35084               }
35085             }
35086             return false;
35087           }
35088
35089           for (var i = 0; i < indices.length; i++) {
35090             var x = indices[i];
35091             var side = x[0];
35092             if (side === -1) {
35093               if (excludeFalseConflicts && !isTrueConflict(x)) {
35094                 pushOk(files[0].slice(x[1], x[1] + x[2]));
35095               } else {
35096                 flushOk();
35097                 result.push({
35098                   conflict: {
35099                     a: a.slice(x[1], x[1] + x[2]),
35100                     aIndex: x[1],
35101                     o: o.slice(x[3], x[3] + x[4]),
35102                     oIndex: x[3],
35103                     b: b.slice(x[5], x[5] + x[6]),
35104                     bIndex: x[5]
35105                   }
35106                 });
35107               }
35108             } else {
35109               pushOk(files[side].slice(x[1], x[1] + x[2]));
35110             }
35111           }
35112
35113           flushOk();
35114           return result;
35115         }
35116
35117         function actionMergeRemoteChanges(id, localGraph, remoteGraph, formatUser) {
35118             var _option = 'safe';  // 'safe', 'force_local', 'force_remote'
35119             var _conflicts = [];
35120
35121
35122             function user(d) {
35123                 return (typeof formatUser === 'function') ? formatUser(d) : d;
35124             }
35125
35126
35127             function mergeLocation(remote, target) {
35128                 function pointEqual(a, b) {
35129                     var epsilon = 1e-6;
35130                     return (Math.abs(a[0] - b[0]) < epsilon) && (Math.abs(a[1] - b[1]) < epsilon);
35131                 }
35132
35133                 if (_option === 'force_local' || pointEqual(target.loc, remote.loc)) {
35134                     return target;
35135                 }
35136                 if (_option === 'force_remote') {
35137                     return target.update({loc: remote.loc});
35138                 }
35139
35140                 _conflicts.push(t('merge_remote_changes.conflict.location', { user: user(remote.user) }));
35141                 return target;
35142             }
35143
35144
35145             function mergeNodes(base, remote, target) {
35146                 if (_option === 'force_local' || fastDeepEqual(target.nodes, remote.nodes)) {
35147                     return target;
35148                 }
35149                 if (_option === 'force_remote') {
35150                     return target.update({nodes: remote.nodes});
35151                 }
35152
35153                 var ccount = _conflicts.length;
35154                 var o = base.nodes || [];
35155                 var a = target.nodes || [];
35156                 var b = remote.nodes || [];
35157                 var nodes = [];
35158                 var hunks = diff3Merge(a, o, b, true);
35159
35160                 for (var i = 0; i < hunks.length; i++) {
35161                     var hunk = hunks[i];
35162                     if (hunk.ok) {
35163                         nodes.push.apply(nodes, hunk.ok);
35164                     } else {
35165                         // for all conflicts, we can assume c.a !== c.b
35166                         // because `diff3Merge` called with `true` option to exclude false conflicts..
35167                         var c = hunk.conflict;
35168                         if (fastDeepEqual(c.o, c.a)) {  // only changed remotely
35169                             nodes.push.apply(nodes, c.b);
35170                         } else if (fastDeepEqual(c.o, c.b)) {  // only changed locally
35171                             nodes.push.apply(nodes, c.a);
35172                         } else {       // changed both locally and remotely
35173                             _conflicts.push(t('merge_remote_changes.conflict.nodelist', { user: user(remote.user) }));
35174                             break;
35175                         }
35176                     }
35177                 }
35178
35179                 return (_conflicts.length === ccount) ? target.update({nodes: nodes}) : target;
35180             }
35181
35182
35183             function mergeChildren(targetWay, children, updates, graph) {
35184                 function isUsed(node, targetWay) {
35185                     var hasInterestingParent = graph.parentWays(node)
35186                         .some(function(way) { return way.id !== targetWay.id; });
35187
35188                     return node.hasInterestingTags() ||
35189                         hasInterestingParent ||
35190                         graph.parentRelations(node).length > 0;
35191                 }
35192
35193                 var ccount = _conflicts.length;
35194
35195                 for (var i = 0; i < children.length; i++) {
35196                     var id = children[i];
35197                     var node = graph.hasEntity(id);
35198
35199                     // remove unused childNodes..
35200                     if (targetWay.nodes.indexOf(id) === -1) {
35201                         if (node && !isUsed(node, targetWay)) {
35202                             updates.removeIds.push(id);
35203                         }
35204                         continue;
35205                     }
35206
35207                     // restore used childNodes..
35208                     var local = localGraph.hasEntity(id);
35209                     var remote = remoteGraph.hasEntity(id);
35210                     var target;
35211
35212                     if (_option === 'force_remote' && remote && remote.visible) {
35213                         updates.replacements.push(remote);
35214
35215                     } else if (_option === 'force_local' && local) {
35216                         target = osmEntity(local);
35217                         if (remote) {
35218                             target = target.update({ version: remote.version });
35219                         }
35220                         updates.replacements.push(target);
35221
35222                     } else if (_option === 'safe' && local && remote && local.version !== remote.version) {
35223                         target = osmEntity(local, { version: remote.version });
35224                         if (remote.visible) {
35225                             target = mergeLocation(remote, target);
35226                         } else {
35227                             _conflicts.push(t('merge_remote_changes.conflict.deleted', { user: user(remote.user) }));
35228                         }
35229
35230                         if (_conflicts.length !== ccount) break;
35231                         updates.replacements.push(target);
35232                     }
35233                 }
35234
35235                 return targetWay;
35236             }
35237
35238
35239             function updateChildren(updates, graph) {
35240                 for (var i = 0; i < updates.replacements.length; i++) {
35241                     graph = graph.replace(updates.replacements[i]);
35242                 }
35243                 if (updates.removeIds.length) {
35244                     graph = actionDeleteMultiple(updates.removeIds)(graph);
35245                 }
35246                 return graph;
35247             }
35248
35249
35250             function mergeMembers(remote, target) {
35251                 if (_option === 'force_local' || fastDeepEqual(target.members, remote.members)) {
35252                     return target;
35253                 }
35254                 if (_option === 'force_remote') {
35255                     return target.update({members: remote.members});
35256                 }
35257
35258                 _conflicts.push(t('merge_remote_changes.conflict.memberlist', { user: user(remote.user) }));
35259                 return target;
35260             }
35261
35262
35263             function mergeTags(base, remote, target) {
35264                 if (_option === 'force_local' || fastDeepEqual(target.tags, remote.tags)) {
35265                     return target;
35266                 }
35267                 if (_option === 'force_remote') {
35268                     return target.update({tags: remote.tags});
35269                 }
35270
35271                 var ccount = _conflicts.length;
35272                 var o = base.tags || {};
35273                 var a = target.tags || {};
35274                 var b = remote.tags || {};
35275                 var keys = utilArrayUnion(utilArrayUnion(Object.keys(o), Object.keys(a)), Object.keys(b))
35276                     .filter(function(k) { return !dataDiscarded[k]; });
35277                 var tags = Object.assign({}, a);   // shallow copy
35278                 var changed = false;
35279
35280                 for (var i = 0; i < keys.length; i++) {
35281                     var k = keys[i];
35282
35283                     if (o[k] !== b[k] && a[k] !== b[k]) {    // changed remotely..
35284                         if (o[k] !== a[k]) {      // changed locally..
35285                             _conflicts.push(t('merge_remote_changes.conflict.tags',
35286                                 { tag: k, local: a[k], remote: b[k], user: user(remote.user) }));
35287
35288                         } else {                  // unchanged locally, accept remote change..
35289                             if (b.hasOwnProperty(k)) {
35290                                 tags[k] = b[k];
35291                             } else {
35292                                 delete tags[k];
35293                             }
35294                             changed = true;
35295                         }
35296                     }
35297                 }
35298
35299                 return (changed && _conflicts.length === ccount) ? target.update({tags: tags}) : target;
35300             }
35301
35302
35303             //  `graph.base()` is the common ancestor of the two graphs.
35304             //  `localGraph` contains user's edits up to saving
35305             //  `remoteGraph` contains remote edits to modified nodes
35306             //  `graph` must be a descendent of `localGraph` and may include
35307             //      some conflict resolution actions performed on it.
35308             //
35309             //                  --- ... --- `localGraph` -- ... -- `graph`
35310             //                 /
35311             //  `graph.base()` --- ... --- `remoteGraph`
35312             //
35313             var action = function(graph) {
35314                 var updates = { replacements: [], removeIds: [] };
35315                 var base = graph.base().entities[id];
35316                 var local = localGraph.entity(id);
35317                 var remote = remoteGraph.entity(id);
35318                 var target = osmEntity(local, { version: remote.version });
35319
35320                 // delete/undelete
35321                 if (!remote.visible) {
35322                     if (_option === 'force_remote') {
35323                         return actionDeleteMultiple([id])(graph);
35324
35325                     } else if (_option === 'force_local') {
35326                         if (target.type === 'way') {
35327                             target = mergeChildren(target, utilArrayUniq(local.nodes), updates, graph);
35328                             graph = updateChildren(updates, graph);
35329                         }
35330                         return graph.replace(target);
35331
35332                     } else {
35333                         _conflicts.push(t('merge_remote_changes.conflict.deleted', { user: user(remote.user) }));
35334                         return graph;  // do nothing
35335                     }
35336                 }
35337
35338                 // merge
35339                 if (target.type === 'node') {
35340                     target = mergeLocation(remote, target);
35341
35342                 } else if (target.type === 'way') {
35343                     // pull in any child nodes that may not be present locally..
35344                     graph.rebase(remoteGraph.childNodes(remote), [graph], false);
35345                     target = mergeNodes(base, remote, target);
35346                     target = mergeChildren(target, utilArrayUnion(local.nodes, remote.nodes), updates, graph);
35347
35348                 } else if (target.type === 'relation') {
35349                     target = mergeMembers(remote, target);
35350                 }
35351
35352                 target = mergeTags(base, remote, target);
35353
35354                 if (!_conflicts.length) {
35355                     graph = updateChildren(updates, graph).replace(target);
35356                 }
35357
35358                 return graph;
35359             };
35360
35361
35362             action.withOption = function(opt) {
35363                 _option = opt;
35364                 return action;
35365             };
35366
35367
35368             action.conflicts = function() {
35369                 return _conflicts;
35370             };
35371
35372
35373             return action;
35374         }
35375
35376         // https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/command/MoveCommand.java
35377         // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MoveNodeAction.as
35378         function actionMove(moveIDs, tryDelta, projection, cache) {
35379             var _delta = tryDelta;
35380
35381             function setupCache(graph) {
35382                 function canMove(nodeID) {
35383                     // Allow movement of any node that is in the selectedIDs list..
35384                     if (moveIDs.indexOf(nodeID) !== -1) return true;
35385
35386                     // Allow movement of a vertex where 2 ways meet..
35387                     var parents = graph.parentWays(graph.entity(nodeID));
35388                     if (parents.length < 3) return true;
35389
35390                     // Restrict movement of a vertex where >2 ways meet, unless all parentWays are moving too..
35391                     var parentsMoving = parents.every(function(way) { return cache.moving[way.id]; });
35392                     if (!parentsMoving) delete cache.moving[nodeID];
35393
35394                     return parentsMoving;
35395                 }
35396
35397                 function cacheEntities(ids) {
35398                     for (var i = 0; i < ids.length; i++) {
35399                         var id = ids[i];
35400                         if (cache.moving[id]) continue;
35401                         cache.moving[id] = true;
35402
35403                         var entity = graph.hasEntity(id);
35404                         if (!entity) continue;
35405
35406                         if (entity.type === 'node') {
35407                             cache.nodes.push(id);
35408                             cache.startLoc[id] = entity.loc;
35409                         } else if (entity.type === 'way') {
35410                             cache.ways.push(id);
35411                             cacheEntities(entity.nodes);
35412                         } else {
35413                             cacheEntities(entity.members.map(function(member) {
35414                                 return member.id;
35415                             }));
35416                         }
35417                     }
35418                 }
35419
35420                 function cacheIntersections(ids) {
35421                     function isEndpoint(way, id) {
35422                         return !way.isClosed() && !!way.affix(id);
35423                     }
35424
35425                     for (var i = 0; i < ids.length; i++) {
35426                         var id = ids[i];
35427
35428                         // consider only intersections with 1 moved and 1 unmoved way.
35429                         var childNodes = graph.childNodes(graph.entity(id));
35430                         for (var j = 0; j < childNodes.length; j++) {
35431                             var node = childNodes[j];
35432                             var parents = graph.parentWays(node);
35433                             if (parents.length !== 2) continue;
35434
35435                             var moved = graph.entity(id);
35436                             var unmoved = null;
35437                             for (var k = 0; k < parents.length; k++) {
35438                                 var way = parents[k];
35439                                 if (!cache.moving[way.id]) {
35440                                     unmoved = way;
35441                                     break;
35442                                 }
35443                             }
35444                             if (!unmoved) continue;
35445
35446                             // exclude ways that are overly connected..
35447                             if (utilArrayIntersection(moved.nodes, unmoved.nodes).length > 2) continue;
35448                             if (moved.isArea() || unmoved.isArea()) continue;
35449
35450                             cache.intersections.push({
35451                                 nodeId: node.id,
35452                                 movedId: moved.id,
35453                                 unmovedId: unmoved.id,
35454                                 movedIsEP: isEndpoint(moved, node.id),
35455                                 unmovedIsEP: isEndpoint(unmoved, node.id)
35456                             });
35457                         }
35458                     }
35459                 }
35460
35461
35462                 if (!cache) {
35463                     cache = {};
35464                 }
35465                 if (!cache.ok) {
35466                     cache.moving = {};
35467                     cache.intersections = [];
35468                     cache.replacedVertex = {};
35469                     cache.startLoc = {};
35470                     cache.nodes = [];
35471                     cache.ways = [];
35472
35473                     cacheEntities(moveIDs);
35474                     cacheIntersections(cache.ways);
35475                     cache.nodes = cache.nodes.filter(canMove);
35476
35477                     cache.ok = true;
35478                 }
35479             }
35480
35481
35482             // Place a vertex where the moved vertex used to be, to preserve way shape..
35483             //
35484             //  Start:
35485             //      b ---- e
35486             //     / \
35487             //    /   \
35488             //   /     \
35489             //  a       c
35490             //
35491             //      *               node '*' added to preserve shape
35492             //     / \
35493             //    /   b ---- e      way `b,e` moved here:
35494             //   /     \
35495             //  a       c
35496             //
35497             //
35498             function replaceMovedVertex(nodeId, wayId, graph, delta) {
35499                 var way = graph.entity(wayId);
35500                 var moved = graph.entity(nodeId);
35501                 var movedIndex = way.nodes.indexOf(nodeId);
35502                 var len, prevIndex, nextIndex;
35503
35504                 if (way.isClosed()) {
35505                     len = way.nodes.length - 1;
35506                     prevIndex = (movedIndex + len - 1) % len;
35507                     nextIndex = (movedIndex + len + 1) % len;
35508                 } else {
35509                     len = way.nodes.length;
35510                     prevIndex = movedIndex - 1;
35511                     nextIndex = movedIndex + 1;
35512                 }
35513
35514                 var prev = graph.hasEntity(way.nodes[prevIndex]);
35515                 var next = graph.hasEntity(way.nodes[nextIndex]);
35516
35517                 // Don't add orig vertex at endpoint..
35518                 if (!prev || !next) return graph;
35519
35520                 var key = wayId + '_' + nodeId;
35521                 var orig = cache.replacedVertex[key];
35522                 if (!orig) {
35523                     orig = osmNode();
35524                     cache.replacedVertex[key] = orig;
35525                     cache.startLoc[orig.id] = cache.startLoc[nodeId];
35526                 }
35527
35528                 var start, end;
35529                 if (delta) {
35530                     start = projection(cache.startLoc[nodeId]);
35531                     end = projection.invert(geoVecAdd(start, delta));
35532                 } else {
35533                     end = cache.startLoc[nodeId];
35534                 }
35535                 orig = orig.move(end);
35536
35537                 var angle = Math.abs(geoAngle(orig, prev, projection) -
35538                         geoAngle(orig, next, projection)) * 180 / Math.PI;
35539
35540                 // Don't add orig vertex if it would just make a straight line..
35541                 if (angle > 175 && angle < 185) return graph;
35542
35543                 // moving forward or backward along way?
35544                 var p1 = [prev.loc, orig.loc, moved.loc, next.loc].map(projection);
35545                 var p2 = [prev.loc, moved.loc, orig.loc, next.loc].map(projection);
35546                 var d1 = geoPathLength(p1);
35547                 var d2 = geoPathLength(p2);
35548                 var insertAt = (d1 <= d2) ? movedIndex : nextIndex;
35549
35550                 // moving around closed loop?
35551                 if (way.isClosed() && insertAt === 0) insertAt = len;
35552
35553                 way = way.addNode(orig.id, insertAt);
35554                 return graph.replace(orig).replace(way);
35555             }
35556
35557
35558             // Remove duplicate vertex that might have been added by
35559             // replaceMovedVertex.  This is done after the unzorro checks.
35560             function removeDuplicateVertices(wayId, graph) {
35561                 var way = graph.entity(wayId);
35562                 var epsilon = 1e-6;
35563                 var prev, curr;
35564
35565                 function isInteresting(node, graph) {
35566                     return graph.parentWays(node).length > 1 ||
35567                         graph.parentRelations(node).length ||
35568                         node.hasInterestingTags();
35569                 }
35570
35571                 for (var i = 0; i < way.nodes.length; i++) {
35572                     curr = graph.entity(way.nodes[i]);
35573
35574                     if (prev && curr && geoVecEqual(prev.loc, curr.loc, epsilon)) {
35575                         if (!isInteresting(prev, graph)) {
35576                             way = way.removeNode(prev.id);
35577                             graph = graph.replace(way).remove(prev);
35578                         } else if (!isInteresting(curr, graph)) {
35579                             way = way.removeNode(curr.id);
35580                             graph = graph.replace(way).remove(curr);
35581                         }
35582                     }
35583
35584                     prev = curr;
35585                 }
35586
35587                 return graph;
35588             }
35589
35590
35591             // Reorder nodes around intersections that have moved..
35592             //
35593             //  Start:                way1.nodes: b,e         (moving)
35594             //  a - b - c ----- d     way2.nodes: a,b,c,d     (static)
35595             //      |                 vertex: b
35596             //      e                 isEP1: true,  isEP2, false
35597             //
35598             //  way1 `b,e` moved here:
35599             //  a ----- c = b - d
35600             //              |
35601             //              e
35602             //
35603             //  reorder nodes         way1.nodes: b,e
35604             //  a ----- c - b - d     way2.nodes: a,c,b,d
35605             //              |
35606             //              e
35607             //
35608             function unZorroIntersection(intersection, graph) {
35609                 var vertex = graph.entity(intersection.nodeId);
35610                 var way1 = graph.entity(intersection.movedId);
35611                 var way2 = graph.entity(intersection.unmovedId);
35612                 var isEP1 = intersection.movedIsEP;
35613                 var isEP2 = intersection.unmovedIsEP;
35614
35615                 // don't move the vertex if it is the endpoint of both ways.
35616                 if (isEP1 && isEP2) return graph;
35617
35618                 var nodes1 = graph.childNodes(way1).filter(function(n) { return n !== vertex; });
35619                 var nodes2 = graph.childNodes(way2).filter(function(n) { return n !== vertex; });
35620
35621                 if (way1.isClosed() && way1.first() === vertex.id) nodes1.push(nodes1[0]);
35622                 if (way2.isClosed() && way2.first() === vertex.id) nodes2.push(nodes2[0]);
35623
35624                 var edge1 = !isEP1 && geoChooseEdge(nodes1, projection(vertex.loc), projection);
35625                 var edge2 = !isEP2 && geoChooseEdge(nodes2, projection(vertex.loc), projection);
35626                 var loc;
35627
35628                 // snap vertex to nearest edge (or some point between them)..
35629                 if (!isEP1 && !isEP2) {
35630                     var epsilon = 1e-6, maxIter = 10;
35631                     for (var i = 0; i < maxIter; i++) {
35632                         loc = geoVecInterp(edge1.loc, edge2.loc, 0.5);
35633                         edge1 = geoChooseEdge(nodes1, projection(loc), projection);
35634                         edge2 = geoChooseEdge(nodes2, projection(loc), projection);
35635                         if (Math.abs(edge1.distance - edge2.distance) < epsilon) break;
35636                     }
35637                 } else if (!isEP1) {
35638                     loc = edge1.loc;
35639                 } else {
35640                     loc = edge2.loc;
35641                 }
35642
35643                 graph = graph.replace(vertex.move(loc));
35644
35645                 // if zorro happened, reorder nodes..
35646                 if (!isEP1 && edge1.index !== way1.nodes.indexOf(vertex.id)) {
35647                     way1 = way1.removeNode(vertex.id).addNode(vertex.id, edge1.index);
35648                     graph = graph.replace(way1);
35649                 }
35650                 if (!isEP2 && edge2.index !== way2.nodes.indexOf(vertex.id)) {
35651                     way2 = way2.removeNode(vertex.id).addNode(vertex.id, edge2.index);
35652                     graph = graph.replace(way2);
35653                 }
35654
35655                 return graph;
35656             }
35657
35658
35659             function cleanupIntersections(graph) {
35660                 for (var i = 0; i < cache.intersections.length; i++) {
35661                     var obj = cache.intersections[i];
35662                     graph = replaceMovedVertex(obj.nodeId, obj.movedId, graph, _delta);
35663                     graph = replaceMovedVertex(obj.nodeId, obj.unmovedId, graph, null);
35664                     graph = unZorroIntersection(obj, graph);
35665                     graph = removeDuplicateVertices(obj.movedId, graph);
35666                     graph = removeDuplicateVertices(obj.unmovedId, graph);
35667                 }
35668
35669                 return graph;
35670             }
35671
35672
35673             // check if moving way endpoint can cross an unmoved way, if so limit delta..
35674             function limitDelta(graph) {
35675                 function moveNode(loc) {
35676                     return geoVecAdd(projection(loc), _delta);
35677                 }
35678
35679                 for (var i = 0; i < cache.intersections.length; i++) {
35680                     var obj = cache.intersections[i];
35681
35682                     // Don't limit movement if this is vertex joins 2 endpoints..
35683                     if (obj.movedIsEP && obj.unmovedIsEP) continue;
35684                     // Don't limit movement if this vertex is not an endpoint anyway..
35685                     if (!obj.movedIsEP) continue;
35686
35687                     var node = graph.entity(obj.nodeId);
35688                     var start = projection(node.loc);
35689                     var end = geoVecAdd(start, _delta);
35690                     var movedNodes = graph.childNodes(graph.entity(obj.movedId));
35691                     var movedPath = movedNodes.map(function(n) { return moveNode(n.loc); });
35692                     var unmovedNodes = graph.childNodes(graph.entity(obj.unmovedId));
35693                     var unmovedPath = unmovedNodes.map(function(n) { return projection(n.loc); });
35694                     var hits = geoPathIntersections(movedPath, unmovedPath);
35695
35696                     for (var j = 0; i < hits.length; i++) {
35697                         if (geoVecEqual(hits[j], end)) continue;
35698                         var edge = geoChooseEdge(unmovedNodes, end, projection);
35699                         _delta = geoVecSubtract(projection(edge.loc), start);
35700                     }
35701                 }
35702             }
35703
35704
35705             var action = function(graph) {
35706                 if (_delta[0] === 0 && _delta[1] === 0) return graph;
35707
35708                 setupCache(graph);
35709
35710                 if (cache.intersections.length) {
35711                     limitDelta(graph);
35712                 }
35713
35714                 for (var i = 0; i < cache.nodes.length; i++) {
35715                     var node = graph.entity(cache.nodes[i]);
35716                     var start = projection(node.loc);
35717                     var end = geoVecAdd(start, _delta);
35718                     graph = graph.replace(node.move(projection.invert(end)));
35719                 }
35720
35721                 if (cache.intersections.length) {
35722                     graph = cleanupIntersections(graph);
35723                 }
35724
35725                 return graph;
35726             };
35727
35728
35729             action.delta = function() {
35730                 return _delta;
35731             };
35732
35733
35734             return action;
35735         }
35736
35737         function actionMoveMember(relationId, fromIndex, toIndex) {
35738             return function(graph) {
35739                 return graph.replace(graph.entity(relationId).moveMember(fromIndex, toIndex));
35740             };
35741         }
35742
35743         function actionMoveNode(nodeID, toLoc) {
35744
35745             var action = function(graph, t) {
35746                 if (t === null || !isFinite(t)) t = 1;
35747                 t = Math.min(Math.max(+t, 0), 1);
35748
35749                 var node = graph.entity(nodeID);
35750                 return graph.replace(
35751                     node.move(geoVecInterp(node.loc, toLoc, t))
35752                 );
35753             };
35754
35755             action.transitionable = true;
35756
35757             return action;
35758         }
35759
35760         function actionNoop() {
35761             return function(graph) {
35762                 return graph;
35763             };
35764         }
35765
35766         function actionOrthogonalize(wayID, projection, vertexID, degThresh, ep) {
35767             var epsilon = ep || 1e-4;
35768             var threshold = degThresh || 13;  // degrees within right or straight to alter
35769
35770             // We test normalized dot products so we can compare as cos(angle)
35771             var lowerThreshold = Math.cos((90 - threshold) * Math.PI / 180);
35772             var upperThreshold = Math.cos(threshold * Math.PI / 180);
35773
35774
35775             var action = function(graph, t) {
35776                 if (t === null || !isFinite(t)) t = 1;
35777                 t = Math.min(Math.max(+t, 0), 1);
35778
35779                 var way = graph.entity(wayID);
35780                 way = way.removeNode('');   // sanity check - remove any consecutive duplicates
35781
35782                 if (way.tags.nonsquare) {
35783                     var tags = Object.assign({}, way.tags);
35784                     // since we're squaring, remove indication that this is physically unsquare
35785                     delete tags.nonsquare;
35786                     way = way.update({tags: tags});
35787                 }
35788
35789                 graph = graph.replace(way);
35790
35791                 var isClosed = way.isClosed();
35792                 var nodes = graph.childNodes(way).slice();  // shallow copy
35793                 if (isClosed) nodes.pop();
35794
35795                 if (vertexID !== undefined) {
35796                     nodes = nodeSubset(nodes, vertexID, isClosed);
35797                     if (nodes.length !== 3) return graph;
35798                 }
35799
35800                 // note: all geometry functions here use the unclosed node/point/coord list
35801
35802                 var nodeCount = {};
35803                 var points = [];
35804                 var corner = { i: 0, dotp: 1 };
35805                 var node, point, loc, score, motions, i, j;
35806
35807                 for (i = 0; i < nodes.length; i++) {
35808                     node = nodes[i];
35809                     nodeCount[node.id] = (nodeCount[node.id] || 0) + 1;
35810                     points.push({ id: node.id, coord: projection(node.loc) });
35811                 }
35812
35813
35814                 if (points.length === 3) {   // move only one vertex for right triangle
35815                     for (i = 0; i < 1000; i++) {
35816                         motions = points.map(calcMotion);
35817
35818                         points[corner.i].coord = geoVecAdd(points[corner.i].coord, motions[corner.i]);
35819                         score = corner.dotp;
35820                         if (score < epsilon) {
35821                             break;
35822                         }
35823                     }
35824
35825                     node = graph.entity(nodes[corner.i].id);
35826                     loc = projection.invert(points[corner.i].coord);
35827                     graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
35828
35829                 } else {
35830                     var straights = [];
35831                     var simplified = [];
35832
35833                     // Remove points from nearly straight sections..
35834                     // This produces a simplified shape to orthogonalize
35835                     for (i = 0; i < points.length; i++) {
35836                         point = points[i];
35837                         var dotp = 0;
35838                         if (isClosed || (i > 0 && i < points.length - 1)) {
35839                             var a = points[(i - 1 + points.length) % points.length];
35840                             var b = points[(i + 1) % points.length];
35841                             dotp = Math.abs(geoOrthoNormalizedDotProduct(a.coord, b.coord, point.coord));
35842                         }
35843
35844                         if (dotp > upperThreshold) {
35845                             straights.push(point);
35846                         } else {
35847                             simplified.push(point);
35848                         }
35849                     }
35850
35851                     // Orthogonalize the simplified shape
35852                     var bestPoints = clonePoints(simplified);
35853                     var originalPoints = clonePoints(simplified);
35854
35855                     score = Infinity;
35856                     for (i = 0; i < 1000; i++) {
35857                         motions = simplified.map(calcMotion);
35858
35859                         for (j = 0; j < motions.length; j++) {
35860                             simplified[j].coord = geoVecAdd(simplified[j].coord, motions[j]);
35861                         }
35862                         var newScore = geoOrthoCalcScore(simplified, isClosed, epsilon, threshold);
35863                         if (newScore < score) {
35864                             bestPoints = clonePoints(simplified);
35865                             score = newScore;
35866                         }
35867                         if (score < epsilon) {
35868                             break;
35869                         }
35870                     }
35871
35872                     var bestCoords = bestPoints.map(function(p) { return p.coord; });
35873                     if (isClosed) bestCoords.push(bestCoords[0]);
35874
35875                     // move the nodes that should move
35876                     for (i = 0; i < bestPoints.length; i++) {
35877                         point = bestPoints[i];
35878                         if (!geoVecEqual(originalPoints[i].coord, point.coord)) {
35879                             node = graph.entity(point.id);
35880                             loc = projection.invert(point.coord);
35881                             graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
35882                         }
35883                     }
35884
35885                     // move the nodes along straight segments
35886                     for (i = 0; i < straights.length; i++) {
35887                         point = straights[i];
35888                         if (nodeCount[point.id] > 1) continue;   // skip self-intersections
35889
35890                         node = graph.entity(point.id);
35891
35892                         if (t === 1 &&
35893                             graph.parentWays(node).length === 1 &&
35894                             graph.parentRelations(node).length === 0 &&
35895                             !node.hasInterestingTags()
35896                         ) {
35897                             // remove uninteresting points..
35898                             graph = actionDeleteNode(node.id)(graph);
35899
35900                         } else {
35901                             // move interesting points to the nearest edge..
35902                             var choice = geoVecProject(point.coord, bestCoords);
35903                             if (choice) {
35904                                 loc = projection.invert(choice.target);
35905                                 graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
35906                             }
35907                         }
35908                     }
35909                 }
35910
35911                 return graph;
35912
35913
35914                 function clonePoints(array) {
35915                     return array.map(function(p) {
35916                         return { id: p.id, coord: [p.coord[0], p.coord[1]] };
35917                     });
35918                 }
35919
35920
35921                 function calcMotion(point, i, array) {
35922                     // don't try to move the endpoints of a non-closed way.
35923                     if (!isClosed && (i === 0 || i === array.length - 1)) return [0, 0];
35924                     // don't try to move a node that appears more than once (self intersection)
35925                     if (nodeCount[array[i].id] > 1) return [0, 0];
35926
35927                     var a = array[(i - 1 + array.length) % array.length].coord;
35928                     var origin = point.coord;
35929                     var b = array[(i + 1) % array.length].coord;
35930                     var p = geoVecSubtract(a, origin);
35931                     var q = geoVecSubtract(b, origin);
35932
35933                     var scale = 2 * Math.min(geoVecLength(p), geoVecLength(q));
35934                     p = geoVecNormalize(p);
35935                     q = geoVecNormalize(q);
35936
35937                     var dotp = (p[0] * q[0] + p[1] * q[1]);
35938                     var val = Math.abs(dotp);
35939
35940                     if (val < lowerThreshold) {  // nearly orthogonal
35941                         corner.i = i;
35942                         corner.dotp = val;
35943                         var vec = geoVecNormalize(geoVecAdd(p, q));
35944                         return geoVecScale(vec, 0.1 * dotp * scale);
35945                     }
35946
35947                     return [0, 0];   // do nothing
35948                 }
35949             };
35950
35951
35952             // if we are only orthogonalizing one vertex,
35953             // get that vertex and the previous and next
35954             function nodeSubset(nodes, vertexID, isClosed) {
35955                 var first = isClosed ? 0 : 1;
35956                 var last = isClosed ? nodes.length : nodes.length - 1;
35957
35958                 for (var i = first; i < last; i++) {
35959                     if (nodes[i].id === vertexID) {
35960                         return [
35961                             nodes[(i - 1 + nodes.length) % nodes.length],
35962                             nodes[i],
35963                             nodes[(i + 1) % nodes.length]
35964                         ];
35965                     }
35966                 }
35967
35968                 return [];
35969             }
35970
35971
35972             action.disabled = function(graph) {
35973                 var way = graph.entity(wayID);
35974                 way = way.removeNode('');  // sanity check - remove any consecutive duplicates
35975                 graph = graph.replace(way);
35976
35977                 var isClosed = way.isClosed();
35978                 var nodes = graph.childNodes(way).slice();  // shallow copy
35979                 if (isClosed) nodes.pop();
35980
35981                 var allowStraightAngles = false;
35982                 if (vertexID !== undefined) {
35983                     allowStraightAngles = true;
35984                     nodes = nodeSubset(nodes, vertexID, isClosed);
35985                     if (nodes.length !== 3) return 'end_vertex';
35986                 }
35987
35988                 var coords = nodes.map(function(n) { return projection(n.loc); });
35989                 var score = geoOrthoCanOrthogonalize(coords, isClosed, epsilon, threshold, allowStraightAngles);
35990
35991                 if (score === null) {
35992                     return 'not_squarish';
35993                 } else if (score === 0) {
35994                     return 'square_enough';
35995                 } else {
35996                     return false;
35997                 }
35998             };
35999
36000
36001             action.transitionable = true;
36002
36003             return action;
36004         }
36005
36006         // `actionRestrictTurn` creates a turn restriction relation.
36007         //
36008         // `turn` must be an `osmTurn` object
36009         // see osm/intersection.js, pathToTurn()
36010         //
36011         // This specifies a restriction of type `restriction` when traveling from
36012         // `turn.from.way` toward `turn.to.way` via `turn.via.node` OR `turn.via.ways`.
36013         // (The action does not check that these entities form a valid intersection.)
36014         //
36015         // From, to, and via ways should be split before calling this action.
36016         // (old versions of the code would split the ways here, but we no longer do it)
36017         //
36018         // For testing convenience, accepts a restrictionID to assign to the new
36019         // relation. Normally, this will be undefined and the relation will
36020         // automatically be assigned a new ID.
36021         //
36022         function actionRestrictTurn(turn, restrictionType, restrictionID) {
36023
36024             return function(graph) {
36025                 var fromWay = graph.entity(turn.from.way);
36026                 var toWay = graph.entity(turn.to.way);
36027                 var viaNode = turn.via.node && graph.entity(turn.via.node);
36028                 var viaWays = turn.via.ways && turn.via.ways.map(function(id) { return graph.entity(id); });
36029                 var members = [];
36030
36031                 members.push({ id: fromWay.id, type: 'way',  role: 'from' });
36032
36033                 if (viaNode) {
36034                     members.push({ id: viaNode.id,  type: 'node', role: 'via' });
36035                 } else if (viaWays) {
36036                     viaWays.forEach(function(viaWay) {
36037                         members.push({ id: viaWay.id,  type: 'way', role: 'via' });
36038                     });
36039                 }
36040
36041                 members.push({ id: toWay.id, type: 'way',  role: 'to' });
36042
36043                 return graph.replace(osmRelation({
36044                     id: restrictionID,
36045                     tags: {
36046                         type: 'restriction',
36047                         restriction: restrictionType
36048                     },
36049                     members: members
36050                 }));
36051             };
36052         }
36053
36054         function actionRevert(id) {
36055             var action = function(graph) {
36056                 var entity = graph.hasEntity(id),
36057                     base = graph.base().entities[id];
36058
36059                 if (entity && !base) {    // entity will be removed..
36060                     if (entity.type === 'node') {
36061                         graph.parentWays(entity)
36062                             .forEach(function(parent) {
36063                                 parent = parent.removeNode(id);
36064                                 graph = graph.replace(parent);
36065
36066                                 if (parent.isDegenerate()) {
36067                                     graph = actionDeleteWay(parent.id)(graph);
36068                                 }
36069                             });
36070                     }
36071
36072                     graph.parentRelations(entity)
36073                         .forEach(function(parent) {
36074                             parent = parent.removeMembersWithID(id);
36075                             graph = graph.replace(parent);
36076
36077                             if (parent.isDegenerate()) {
36078                                 graph = actionDeleteRelation(parent.id)(graph);
36079                             }
36080                         });
36081                 }
36082
36083                 return graph.revert(id);
36084             };
36085
36086             return action;
36087         }
36088
36089         function actionRotate(rotateIds, pivot, angle, projection) {
36090
36091             var action = function(graph) {
36092                 return graph.update(function(graph) {
36093                     utilGetAllNodes(rotateIds, graph).forEach(function(node) {
36094                         var point = geoRotate([projection(node.loc)], angle, pivot)[0];
36095                         graph = graph.replace(node.move(projection.invert(point)));
36096                     });
36097                 });
36098             };
36099
36100             return action;
36101         }
36102
36103         /* Align nodes along their common axis */
36104         function actionStraightenNodes(nodeIDs, projection) {
36105
36106             function positionAlongWay(a, o, b) {
36107                 return geoVecDot(a, b, o) / geoVecDot(b, b, o);
36108             }
36109
36110
36111             var action = function(graph, t) {
36112                 if (t === null || !isFinite(t)) t = 1;
36113                 t = Math.min(Math.max(+t, 0), 1);
36114
36115                 var nodes = nodeIDs.map(function(id) { return graph.entity(id); });
36116                 var points = nodes.map(function(n) { return projection(n.loc); });
36117                 var ssr = geoGetSmallestSurroundingRectangle(points);
36118
36119                 // Choose line pq = axis of symmetry.
36120                 // The shape's surrounding rectangle has 2 axes of symmetry.
36121                 // Snap points to the long axis
36122                 var p1 = [(ssr.poly[0][0] + ssr.poly[1][0]) / 2, (ssr.poly[0][1] + ssr.poly[1][1]) / 2 ];
36123                 var q1 = [(ssr.poly[2][0] + ssr.poly[3][0]) / 2, (ssr.poly[2][1] + ssr.poly[3][1]) / 2 ];
36124                 var p2 = [(ssr.poly[3][0] + ssr.poly[4][0]) / 2, (ssr.poly[3][1] + ssr.poly[4][1]) / 2 ];
36125                 var q2 = [(ssr.poly[1][0] + ssr.poly[2][0]) / 2, (ssr.poly[1][1] + ssr.poly[2][1]) / 2 ];
36126                 var p, q;
36127
36128                 var isLong = (geoVecLength(p1, q1) > geoVecLength(p2, q2));
36129                 if (isLong) {
36130                     p = p1;
36131                     q = q1;
36132                 } else {
36133                     p = p2;
36134                     q = q2;
36135                 }
36136
36137                 // Move points onto line pq
36138                 for (var i = 0; i < points.length; i++) {
36139                     var node = nodes[i];
36140                     var point = points[i];
36141                     var u = positionAlongWay(point, p, q);
36142                     var point2 = geoVecInterp(p, q, u);
36143                     var loc2 = projection.invert(point2);
36144                     graph = graph.replace(node.move(geoVecInterp(node.loc, loc2, t)));
36145                 }
36146
36147                 return graph;
36148             };
36149
36150
36151             action.disabled = function() {
36152                 return false;
36153             };
36154
36155
36156             action.transitionable = true;
36157
36158
36159             return action;
36160         }
36161
36162         /*
36163          * Based on https://github.com/openstreetmap/potlatch2/net/systemeD/potlatch2/tools/Straighten.as
36164          */
36165         function actionStraightenWay(selectedIDs, projection) {
36166
36167             function positionAlongWay(a, o, b) {
36168                 return geoVecDot(a, b, o) / geoVecDot(b, b, o);
36169             }
36170
36171             // Return all selected ways as a continuous, ordered array of nodes
36172             function allNodes(graph) {
36173                 var nodes = [];
36174                 var startNodes = [];
36175                 var endNodes = [];
36176                 var remainingWays = [];
36177                 var selectedWays = selectedIDs.filter(function(w) {
36178                     return graph.entity(w).type === 'way';
36179                 });
36180                 var selectedNodes = selectedIDs.filter(function(n) {
36181                     return graph.entity(n).type === 'node';
36182                 });
36183
36184                 for (var i = 0; i < selectedWays.length; i++) {
36185                     var way = graph.entity(selectedWays[i]);
36186                     nodes = way.nodes.slice(0);
36187                     remainingWays.push(nodes);
36188                     startNodes.push(nodes[0]);
36189                     endNodes.push(nodes[nodes.length-1]);
36190                 }
36191
36192                 // Remove duplicate end/startNodes (duplicate nodes cannot be at the line end,
36193                 //   and need to be removed so currNode difference calculation below works)
36194                 // i.e. ["n-1", "n-1", "n-2"] => ["n-2"]
36195                 startNodes = startNodes.filter(function(n) {
36196                     return startNodes.indexOf(n) === startNodes.lastIndexOf(n);
36197                 });
36198                 endNodes = endNodes.filter(function(n) {
36199                     return endNodes.indexOf(n) === endNodes.lastIndexOf(n);
36200                 });
36201
36202                 // Choose the initial endpoint to start from
36203                 var currNode = utilArrayDifference(startNodes, endNodes)
36204                     .concat(utilArrayDifference(endNodes, startNodes))[0];
36205                 var nextWay = [];
36206                 nodes = [];
36207
36208                 // Create nested function outside of loop to avoid "function in loop" lint error
36209                 var getNextWay = function(currNode, remainingWays) {
36210                     return remainingWays.filter(function(way) {
36211                         return way[0] === currNode || way[way.length-1] === currNode;
36212                     })[0];
36213                 };
36214
36215                 // Add nodes to end of nodes array, until all ways are added
36216                 while (remainingWays.length) {
36217                     nextWay = getNextWay(currNode, remainingWays);
36218                     remainingWays = utilArrayDifference(remainingWays, [nextWay]);
36219
36220                     if (nextWay[0] !== currNode) {
36221                         nextWay.reverse();
36222                     }
36223                     nodes = nodes.concat(nextWay);
36224                     currNode = nodes[nodes.length-1];
36225                 }
36226
36227                 // If user selected 2 nodes to straighten between, then slice nodes array to those nodes
36228                 if (selectedNodes.length === 2) {
36229                     var startNodeIdx = nodes.indexOf(selectedNodes[0]);
36230                     var endNodeIdx = nodes.indexOf(selectedNodes[1]);
36231                     var sortedStartEnd = [startNodeIdx, endNodeIdx];
36232
36233                     sortedStartEnd.sort(function(a, b) { return a - b; });
36234                     nodes = nodes.slice(sortedStartEnd[0], sortedStartEnd[1]+1);
36235                 }
36236
36237                 return nodes.map(function(n) { return graph.entity(n); });
36238             }
36239
36240
36241             var action = function(graph, t) {
36242                 if (t === null || !isFinite(t)) t = 1;
36243                 t = Math.min(Math.max(+t, 0), 1);
36244
36245                 var nodes = allNodes(graph);
36246                 var points = nodes.map(function(n) { return projection(n.loc); });
36247                 var startPoint = points[0];
36248                 var endPoint = points[points.length-1];
36249                 var toDelete = [];
36250                 var i;
36251
36252                 for (i = 1; i < points.length-1; i++) {
36253                     var node = nodes[i];
36254                     var point = points[i];
36255
36256                     if (t < 1 || graph.parentWays(node).length > 1 ||
36257                         graph.parentRelations(node).length ||
36258                         node.hasInterestingTags()
36259                     ) {
36260                         var u = positionAlongWay(point, startPoint, endPoint);
36261                         var p = geoVecInterp(startPoint, endPoint, u);
36262                         var loc2 = projection.invert(p);
36263                         graph = graph.replace(node.move(geoVecInterp(node.loc, loc2, t)));
36264
36265                     } else {
36266                         // safe to delete
36267                         if (toDelete.indexOf(node) === -1) {
36268                             toDelete.push(node);
36269                         }
36270                     }
36271                 }
36272
36273                 for (i = 0; i < toDelete.length; i++) {
36274                     graph = actionDeleteNode(toDelete[i].id)(graph);
36275                 }
36276
36277                 return graph;
36278             };
36279
36280
36281             action.disabled = function(graph) {
36282                 // check way isn't too bendy
36283                 var nodes = allNodes(graph);
36284                 var points = nodes.map(function(n) { return projection(n.loc); });
36285                 var startPoint = points[0];
36286                 var endPoint = points[points.length-1];
36287                 var threshold = 0.2 * geoVecLength(startPoint, endPoint);
36288                 var i;
36289
36290                 if (threshold === 0) {
36291                     return 'too_bendy';
36292                 }
36293
36294                 for (i = 1; i < points.length - 1; i++) {
36295                     var point = points[i];
36296                     var u = positionAlongWay(point, startPoint, endPoint);
36297                     var p = geoVecInterp(startPoint, endPoint, u);
36298                     var dist = geoVecLength(p, point);
36299
36300                     // to bendy if point is off by 20% of total start/end distance in projected space
36301                     if (isNaN(dist) || dist > threshold) {
36302                         return 'too_bendy';
36303                     }
36304                 }
36305             };
36306
36307             action.transitionable = true;
36308
36309
36310             return action;
36311         }
36312
36313         // `actionUnrestrictTurn` deletes a turn restriction relation.
36314         //
36315         // `turn` must be an `osmTurn` object with a `restrictionID` property.
36316         // see osm/intersection.js, pathToTurn()
36317         //
36318         function actionUnrestrictTurn(turn) {
36319             return function(graph) {
36320                 return actionDeleteRelation(turn.restrictionID)(graph);
36321             };
36322         }
36323
36324         /* Reflect the given area around its axis of symmetry */
36325         function actionReflect(reflectIds, projection) {
36326             var _useLongAxis = true;
36327
36328
36329             var action = function(graph, t) {
36330                 if (t === null || !isFinite(t)) t = 1;
36331                 t = Math.min(Math.max(+t, 0), 1);
36332
36333                 var nodes = utilGetAllNodes(reflectIds, graph);
36334                 var points = nodes.map(function(n) { return projection(n.loc); });
36335                 var ssr = geoGetSmallestSurroundingRectangle(points);
36336
36337                 // Choose line pq = axis of symmetry.
36338                 // The shape's surrounding rectangle has 2 axes of symmetry.
36339                 // Reflect across the longer axis by default.
36340                 var p1 = [(ssr.poly[0][0] + ssr.poly[1][0]) / 2, (ssr.poly[0][1] + ssr.poly[1][1]) / 2 ];
36341                 var q1 = [(ssr.poly[2][0] + ssr.poly[3][0]) / 2, (ssr.poly[2][1] + ssr.poly[3][1]) / 2 ];
36342                 var p2 = [(ssr.poly[3][0] + ssr.poly[4][0]) / 2, (ssr.poly[3][1] + ssr.poly[4][1]) / 2 ];
36343                 var q2 = [(ssr.poly[1][0] + ssr.poly[2][0]) / 2, (ssr.poly[1][1] + ssr.poly[2][1]) / 2 ];
36344                 var p, q;
36345
36346                 var isLong = (geoVecLength(p1, q1) > geoVecLength(p2, q2));
36347                 if ((_useLongAxis && isLong) || (!_useLongAxis && !isLong)) {
36348                     p = p1;
36349                     q = q1;
36350                 } else {
36351                     p = p2;
36352                     q = q2;
36353                 }
36354
36355                 // reflect c across pq
36356                 // http://math.stackexchange.com/questions/65503/point-reflection-over-a-line
36357                 var dx = q[0] - p[0];
36358                 var dy = q[1] - p[1];
36359                 var a = (dx * dx - dy * dy) / (dx * dx + dy * dy);
36360                 var b = 2 * dx * dy / (dx * dx + dy * dy);
36361                 for (var i = 0; i < nodes.length; i++) {
36362                     var node = nodes[i];
36363                     var c = projection(node.loc);
36364                     var c2 = [
36365                         a * (c[0] - p[0]) + b * (c[1] - p[1]) + p[0],
36366                         b * (c[0] - p[0]) - a * (c[1] - p[1]) + p[1]
36367                     ];
36368                     var loc2 = projection.invert(c2);
36369                     node = node.move(geoVecInterp(node.loc, loc2, t));
36370                     graph = graph.replace(node);
36371                 }
36372
36373                 return graph;
36374             };
36375
36376
36377             action.useLongAxis = function(val) {
36378                 if (!arguments.length) return _useLongAxis;
36379                 _useLongAxis = val;
36380                 return action;
36381             };
36382
36383
36384             action.transitionable = true;
36385
36386
36387             return action;
36388         }
36389
36390         function actionUpgradeTags(entityId, oldTags, replaceTags) {
36391
36392             return function(graph) {
36393                 var entity = graph.entity(entityId);
36394                 var tags = Object.assign({}, entity.tags);  // shallow copy
36395                 var transferValue;
36396                 var semiIndex;
36397
36398                 for (var oldTagKey in oldTags) {
36399                     if (oldTags[oldTagKey] === '*') {
36400                         transferValue = tags[oldTagKey];
36401                         delete tags[oldTagKey];
36402                     } else {
36403                         var vals = tags[oldTagKey].split(';').filter(Boolean);
36404                         var oldIndex = vals.indexOf(oldTags[oldTagKey]);
36405                         if (vals.length === 1 || oldIndex === -1) {
36406                             delete tags[oldTagKey];
36407                         } else {
36408                             if (replaceTags && replaceTags[oldTagKey]) {
36409                                 // replacing a value within a semicolon-delimited value, note the index
36410                                 semiIndex = oldIndex;
36411                             }
36412                             vals.splice(oldIndex, 1);
36413                             tags[oldTagKey] = vals.join(';');
36414                         }
36415                     }
36416                 }
36417
36418                 if (replaceTags) {
36419                     for (var replaceKey in replaceTags) {
36420                         var replaceValue = replaceTags[replaceKey];
36421                         if (replaceValue === '*') {
36422                             if (tags[replaceKey] && tags[replaceKey] !== 'no') {
36423                                 // allow any pre-existing value except `no` (troll tag)
36424                                 continue;
36425                             } else {
36426                                 // otherwise assume `yes` is okay
36427                                 tags[replaceKey] = 'yes';
36428                             }
36429                         } else if (replaceValue === '$1') {
36430                             tags[replaceKey] = transferValue;
36431                         } else {
36432                             if (tags[replaceKey] && oldTags[replaceKey] && semiIndex !== undefined) {
36433                                 // don't override preexisting values
36434                                 var existingVals = tags[replaceKey].split(';').filter(Boolean);
36435                                 if (existingVals.indexOf(replaceValue) === -1) {
36436                                     existingVals.splice(semiIndex, 0, replaceValue);
36437                                     tags[replaceKey] = existingVals.join(';');
36438                                 }
36439                             } else {
36440                                 tags[replaceKey] = replaceValue;
36441                             }
36442                         }
36443                     }
36444                 }
36445
36446                 return graph.replace(entity.update({ tags: tags }));
36447             };
36448         }
36449
36450         function behaviorEdit(context) {
36451
36452             function behavior() {
36453                 context.map()
36454                     .minzoom(context.minEditableZoom());
36455             }
36456
36457
36458             behavior.off = function() {
36459                 context.map()
36460                     .minzoom(0);
36461             };
36462
36463             return behavior;
36464         }
36465
36466         /*
36467            The hover behavior adds the `.hover` class on mouseover to all elements to which
36468            the identical datum is bound, and removes it on mouseout.
36469
36470            The :hover pseudo-class is insufficient for iD's purposes because a datum's visual
36471            representation may consist of several elements scattered throughout the DOM hierarchy.
36472            Only one of these elements can have the :hover pseudo-class, but all of them will
36473            have the .hover class.
36474          */
36475         function behaviorHover(context) {
36476             var dispatch$1 = dispatch('hover');
36477             var _selection = d3_select(null);
36478             var _newNodeId = null;
36479             var _initialNodeID = null;
36480             var _buttonDown;
36481             var _altDisables;
36482             var _ignoreVertex;
36483             var _target;
36484
36485
36486             function keydown() {
36487                 if (_altDisables && event.keyCode === utilKeybinding.modifierCodes.alt) {
36488                     _selection.selectAll('.hover')
36489                         .classed('hover-suppressed', true)
36490                         .classed('hover', false);
36491
36492                     _selection
36493                         .classed('hover-disabled', true);
36494
36495                     dispatch$1.call('hover', this, null);
36496                 }
36497             }
36498
36499
36500             function keyup() {
36501                 if (_altDisables && event.keyCode === utilKeybinding.modifierCodes.alt) {
36502                     _selection.selectAll('.hover-suppressed')
36503                         .classed('hover-suppressed', false)
36504                         .classed('hover', true);
36505
36506                     _selection
36507                         .classed('hover-disabled', false);
36508
36509                     dispatch$1.call('hover', this, _target ? _target.id : null);
36510                 }
36511             }
36512
36513
36514             function behavior(selection) {
36515                 _selection = selection;
36516
36517                 if (_initialNodeID) {
36518                     _newNodeId = _initialNodeID;
36519                     _initialNodeID = null;
36520                 } else {
36521                     _newNodeId = null;
36522                 }
36523
36524                 _selection
36525                     .on('mouseover.hover', mouseover)
36526                     .on('mouseout.hover', mouseout)
36527                     .on('mousedown.hover', mousedown);
36528
36529                 d3_select(window)
36530                     .on('keydown.hover', keydown)
36531                     .on('keyup.hover', keyup);
36532
36533
36534                 function mouseover() {
36535                     if (_buttonDown) return;
36536                     var target = event.target;
36537                     enter(target ? target.__data__ : null);
36538                 }
36539
36540
36541                 function mouseout() {
36542                     if (_buttonDown) return;
36543                     var target = event.relatedTarget;
36544                     enter(target ? target.__data__ : null);
36545                 }
36546
36547
36548                 function mousedown() {
36549                     _buttonDown = true;
36550                     d3_select(window)
36551                         .on('mouseup.hover', mouseup, true);
36552                 }
36553
36554
36555                 function mouseup() {
36556                     _buttonDown = false;
36557                     d3_select(window)
36558                         .on('mouseup.hover', null, true);
36559                 }
36560
36561                 function allowsVertex(d) {
36562                     return d.geometry(context.graph()) === 'vertex' || context.presets().allowsVertex(d, context.graph());
36563                 }
36564
36565                 function modeAllowsHover(target) {
36566                     var mode = context.mode();
36567                     if (mode.id === 'add-point') {
36568                         return mode.preset.matchGeometry('vertex') ||
36569                             (target.type !== 'way' && target.geometry(context.graph()) !== 'vertex');
36570                     }
36571                     return true;
36572                 }
36573
36574                 function enter(datum) {
36575                     if (datum === _target) return;
36576                     _target = datum;
36577
36578                     _selection.selectAll('.hover')
36579                         .classed('hover', false);
36580                     _selection.selectAll('.hover-suppressed')
36581                         .classed('hover-suppressed', false);
36582
36583                     // What are we hovering over?
36584                     var entity, selector;
36585                     if (datum && datum.__featurehash__) {
36586                         entity = datum;
36587                         selector = '.data' + datum.__featurehash__;
36588
36589                     } else if (datum instanceof qaError) {
36590                         entity = datum;
36591                         selector = '.' + datum.service + '.error_id-' + datum.id;
36592
36593                     } else if (datum instanceof osmNote) {
36594                         entity = datum;
36595                         selector = '.note-' + datum.id;
36596
36597                     } else if (datum instanceof osmEntity) {
36598                         entity = datum;
36599                         selector = '.' + entity.id;
36600                         if (entity.type === 'relation') {
36601                             entity.members.forEach(function(member) { selector += ', .' + member.id; });
36602                         }
36603                     } else if (datum && datum.properties && (datum.properties.entity instanceof osmEntity)) {
36604                         entity = datum.properties.entity;
36605                         selector = '.' + entity.id;
36606                         if (entity.type === 'relation') {
36607                             entity.members.forEach(function(member) { selector += ', .' + member.id; });
36608                         }
36609                     }
36610
36611                     var mode = context.mode();
36612
36613                     // Update hover state and dispatch event
36614                     if (entity && entity.id !== _newNodeId) {
36615                         // If drawing a way, don't hover on a node that was just placed. #3974
36616
36617                         if ((mode.id === 'draw-line' || mode.id === 'draw-area') && !_newNodeId && entity.type === 'node') {
36618                             _newNodeId = entity.id;
36619                             return;
36620                         }
36621
36622                         var suppressed = (_altDisables && event && event.altKey) ||
36623                             (entity.type === 'node' && _ignoreVertex && !allowsVertex(entity)) ||
36624                             !modeAllowsHover(entity);
36625                         _selection.selectAll(selector)
36626                             .classed(suppressed ? 'hover-suppressed' : 'hover', true);
36627
36628                         dispatch$1.call('hover', this, !suppressed && entity);
36629
36630                     } else {
36631                         dispatch$1.call('hover', this, null);
36632                     }
36633                 }
36634             }
36635
36636
36637             behavior.off = function(selection) {
36638                 selection.selectAll('.hover')
36639                     .classed('hover', false);
36640                 selection.selectAll('.hover-suppressed')
36641                     .classed('hover-suppressed', false);
36642                 selection
36643                     .classed('hover-disabled', false);
36644
36645                 selection
36646                     .on('mouseover.hover', null)
36647                     .on('mouseout.hover', null)
36648                     .on('mousedown.hover', null);
36649
36650                 d3_select(window)
36651                     .on('keydown.hover', null)
36652                     .on('keyup.hover', null);
36653             };
36654
36655
36656             behavior.altDisables = function(val) {
36657                 if (!arguments.length) return _altDisables;
36658                 _altDisables = val;
36659                 return behavior;
36660             };
36661
36662             behavior.ignoreVertex = function(val) {
36663                 if (!arguments.length) return _ignoreVertex;
36664                 _ignoreVertex = val;
36665                 return behavior;
36666             };
36667
36668             behavior.initialNodeID = function(nodeId) {
36669                 _initialNodeID = nodeId;
36670                 return behavior;
36671             };
36672
36673             return utilRebind(behavior, dispatch$1, 'on');
36674         }
36675
36676         function refresh(selection, node) {
36677             var cr = node.getBoundingClientRect();
36678             var prop = [cr.width, cr.height];
36679             selection.property('__dimensions__', prop);
36680             return prop;
36681         }
36682
36683         function utilGetDimensions(selection, force) {
36684             if (!selection || selection.empty()) {
36685                 return [0, 0];
36686             }
36687             var node = selection.node(),
36688                 cached = selection.property('__dimensions__');
36689             return (!cached || force) ? refresh(selection, node) : cached;
36690         }
36691
36692
36693         function utilSetDimensions(selection, dimensions) {
36694             if (!selection || selection.empty()) {
36695                 return selection;
36696             }
36697             var node = selection.node();
36698             if (dimensions === null) {
36699                 refresh(selection, node);
36700                 return selection;
36701             }
36702             return selection
36703                 .property('__dimensions__', [dimensions[0], dimensions[1]])
36704                 .attr('width', dimensions[0])
36705                 .attr('height', dimensions[1]);
36706         }
36707
36708         function behaviorTail() {
36709             var container;
36710             var xmargin = 25;
36711             var tooltipSize = [0, 0];
36712             var selectionSize = [0, 0];
36713             var _text;
36714
36715
36716             function behavior(selection) {
36717                 if (!_text) return;
36718
36719                 d3_select(window)
36720                     .on('resize.tail', function() { selectionSize = utilGetDimensions(selection); });
36721
36722                 container = d3_select(document.body)
36723                     .append('div')
36724                     .style('display', 'none')
36725                     .attr('class', 'tail tooltip-inner');
36726
36727                 container.append('div')
36728                     .text(_text);
36729
36730                 selection
36731                     .on('mousemove.tail', mousemove)
36732                     .on('mouseenter.tail', mouseenter)
36733                     .on('mouseleave.tail', mouseleave);
36734
36735                 container
36736                     .on('mousemove.tail', mousemove);
36737
36738                 tooltipSize = utilGetDimensions(container);
36739                 selectionSize = utilGetDimensions(selection);
36740
36741
36742                 function show() {
36743                     container.style('display', 'block');
36744                     tooltipSize = utilGetDimensions(container);
36745                 }
36746
36747
36748                 function mousemove() {
36749                     if (container.style('display') === 'none') show();
36750                     var xoffset = ((event.clientX + tooltipSize[0] + xmargin) > selectionSize[0]) ?
36751                         -tooltipSize[0] - xmargin : xmargin;
36752                     container.classed('left', xoffset > 0);
36753                     utilSetTransform(container, event.clientX + xoffset, event.clientY);
36754                 }
36755
36756
36757                 function mouseleave() {
36758                     if (event.relatedTarget !== container.node()) {
36759                         container.style('display', 'none');
36760                     }
36761                 }
36762
36763
36764                 function mouseenter() {
36765                     if (event.relatedTarget !== container.node()) {
36766                         show();
36767                     }
36768                 }
36769             }
36770
36771
36772             behavior.off = function(selection) {
36773                 if (!_text) return;
36774
36775                 container
36776                     .on('mousemove.tail', null)
36777                     .remove();
36778
36779                 selection
36780                     .on('mousemove.tail', null)
36781                     .on('mouseenter.tail', null)
36782                     .on('mouseleave.tail', null);
36783
36784                 d3_select(window)
36785                     .on('resize.tail', null);
36786             };
36787
36788
36789             behavior.text = function(val) {
36790                 if (!arguments.length) return _text;
36791                 _text = val;
36792                 return behavior;
36793             };
36794
36795
36796             return behavior;
36797         }
36798
36799         var _usedTails = {};
36800         var _disableSpace = false;
36801         var _lastSpace = null;
36802
36803
36804         function behaviorDraw(context) {
36805             var dispatch$1 = dispatch(
36806                 'move', 'click', 'clickWay', 'clickNode', 'undo', 'cancel', 'finish'
36807             );
36808
36809             var keybinding = utilKeybinding('draw');
36810
36811             var _hover = behaviorHover(context).altDisables(true).ignoreVertex(true)
36812                 .on('hover', context.ui().sidebar.hover);
36813             var tail = behaviorTail();
36814             var edit = behaviorEdit(context);
36815
36816             var closeTolerance = 4;
36817             var tolerance = 12;
36818             var _mouseLeave = false;
36819             var _lastMouse = null;
36820
36821
36822             // related code
36823             // - `mode/drag_node.js` `datum()`
36824             function datum() {
36825                 var mode = context.mode();
36826                 var isNote = mode && (mode.id.indexOf('note') !== -1);
36827                 if (event.altKey || isNote) return {};
36828
36829                 var element;
36830                 if (event.type === 'keydown') {
36831                     element = _lastMouse && _lastMouse.target;
36832                 } else {
36833                     element = event.target;
36834                 }
36835
36836                 // When drawing, snap only to touch targets..
36837                 // (this excludes area fills and active drawing elements)
36838                 var d = element.__data__;
36839                 return (d && d.properties && d.properties.target) ? d : {};
36840             }
36841
36842
36843             function mousedown() {
36844
36845                 function point() {
36846                     var p = context.container().node();
36847                     return touchId !== null ? d3_touches(p).filter(function(p) {
36848                         return p.identifier === touchId;
36849                     })[0] : d3_mouse(p);
36850                 }
36851
36852                 var element = d3_select(this);
36853                 var touchId = event.touches ? event.changedTouches[0].identifier : null;
36854                 var t1 = +new Date();
36855                 var p1 = point();
36856
36857                 element.on('mousemove.draw', null);
36858
36859                 d3_select(window).on('mouseup.draw', function() {
36860                     var t2 = +new Date();
36861                     var p2 = point();
36862                     var dist = geoVecLength(p1, p2);
36863
36864                     element.on('mousemove.draw', mousemove);
36865                     d3_select(window).on('mouseup.draw', null);
36866
36867                     if (dist < closeTolerance || (dist < tolerance && (t2 - t1) < 500)) {
36868                         // Prevent a quick second click
36869                         d3_select(window).on('click.draw-block', function() {
36870                             event.stopPropagation();
36871                         }, true);
36872
36873                         context.map().dblclickEnable(false);
36874
36875                         window.setTimeout(function() {
36876                             context.map().dblclickEnable(true);
36877                             d3_select(window).on('click.draw-block', null);
36878                         }, 500);
36879
36880                         click();
36881                     }
36882                 }, true);
36883             }
36884
36885
36886             function mousemove() {
36887                 _lastMouse = event;
36888                 dispatch$1.call('move', this, datum());
36889             }
36890
36891
36892             function mouseenter() {
36893                 _mouseLeave = false;
36894             }
36895
36896
36897             function mouseleave() {
36898                 _mouseLeave = true;
36899             }
36900
36901             function allowsVertex(d) {
36902                 return d.geometry(context.graph()) === 'vertex' || context.presets().allowsVertex(d, context.graph());
36903             }
36904
36905             // related code
36906             // - `mode/drag_node.js`     `doMode()`
36907             // - `behavior/draw.js`      `click()`
36908             // - `behavior/draw_way.js`  `move()`
36909             function click() {
36910                 var d = datum();
36911                 var target = d && d.properties && d.properties.entity;
36912
36913                 var mode = context.mode();
36914
36915                 if (target && target.type === 'node' && allowsVertex(target)) {   // Snap to a node
36916                     dispatch$1.call('clickNode', this, target, d);
36917                     return;
36918
36919                 } else if (target && target.type === 'way' && (mode.id !== 'add-point' || mode.preset.matchGeometry('vertex'))) {   // Snap to a way
36920                     var choice = geoChooseEdge(
36921                         context.childNodes(target), context.mouse(), context.projection, context.activeID()
36922                     );
36923                     if (choice) {
36924                         var edge = [target.nodes[choice.index - 1], target.nodes[choice.index]];
36925                         dispatch$1.call('clickWay', this, choice.loc, edge, d);
36926                         return;
36927                     }
36928                 } else if (mode.id !== 'add-point' || mode.preset.matchGeometry('point')) {
36929                     dispatch$1.call('click', this, context.map().mouseCoordinates(), d);
36930                 }
36931
36932             }
36933
36934
36935             function space() {
36936                 event.preventDefault();
36937                 event.stopPropagation();
36938
36939                 var currSpace = context.mouse();
36940                 if (_disableSpace && _lastSpace) {
36941                     var dist = geoVecLength(_lastSpace, currSpace);
36942                     if (dist > tolerance) {
36943                         _disableSpace = false;
36944                     }
36945                 }
36946
36947                 if (_disableSpace || _mouseLeave || !_lastMouse) return;
36948
36949                 // user must move mouse or release space bar to allow another click
36950                 _lastSpace = currSpace;
36951                 _disableSpace = true;
36952
36953                 d3_select(window).on('keyup.space-block', function() {
36954                     event.preventDefault();
36955                     event.stopPropagation();
36956                     _disableSpace = false;
36957                     d3_select(window).on('keyup.space-block', null);
36958                 });
36959
36960                 click();
36961             }
36962
36963
36964             function backspace() {
36965                 event.preventDefault();
36966                 dispatch$1.call('undo');
36967             }
36968
36969
36970             function del() {
36971                 event.preventDefault();
36972                 dispatch$1.call('cancel');
36973             }
36974
36975
36976             function ret() {
36977                 event.preventDefault();
36978                 dispatch$1.call('finish');
36979             }
36980
36981
36982             function behavior(selection) {
36983                 context.install(_hover);
36984                 context.install(edit);
36985
36986                 if (!context.inIntro() && !_usedTails[tail.text()]) {
36987                     context.install(tail);
36988                 }
36989
36990                 keybinding
36991                     .on('⌫', backspace)
36992                     .on('⌦', del)
36993                     .on('⎋', ret)
36994                     .on('↩', ret)
36995                     .on('space', space)
36996                     .on('⌥space', space);
36997
36998                 selection
36999                     .on('mouseenter.draw', mouseenter)
37000                     .on('mouseleave.draw', mouseleave)
37001                     .on('mousedown.draw', mousedown)
37002                     .on('mousemove.draw', mousemove);
37003
37004                 d3_select(document)
37005                     .call(keybinding);
37006
37007                 return behavior;
37008             }
37009
37010
37011             behavior.off = function(selection) {
37012                 context.ui().sidebar.hover.cancel();
37013                 context.uninstall(_hover);
37014                 context.uninstall(edit);
37015
37016                 if (!context.inIntro() && !_usedTails[tail.text()]) {
37017                     context.uninstall(tail);
37018                     _usedTails[tail.text()] = true;
37019                 }
37020
37021                 selection
37022                     .on('mouseenter.draw', null)
37023                     .on('mouseleave.draw', null)
37024                     .on('mousedown.draw', null)
37025                     .on('mousemove.draw', null);
37026
37027                 d3_select(window)
37028                     .on('mouseup.draw', null);
37029                     // note: keyup.space-block, click.draw-block should remain
37030
37031                 d3_select(document)
37032                     .call(keybinding.unbind);
37033             };
37034
37035
37036             behavior.tail = function(_) {
37037                 tail.text(_);
37038                 return behavior;
37039             };
37040
37041             behavior.hover = function() {
37042                 return _hover;
37043             };
37044
37045
37046             return utilRebind(behavior, dispatch$1, 'on');
37047         }
37048
37049         function behaviorBreathe() {
37050             var duration = 800;
37051             var steps = 4;
37052             var selector = '.selected.shadow, .selected .shadow';
37053             var _selected = d3_select(null);
37054             var _classed = '';
37055             var _params = {};
37056             var _done = false;
37057             var _timer;
37058
37059
37060             function ratchetyInterpolator(a, b, steps, units) {
37061                 a = parseFloat(a);
37062                 b = parseFloat(b);
37063                 var sample = quantize()
37064                     .domain([0, 1])
37065                     .range(d3_quantize(d3_interpolateNumber(a, b), steps));
37066
37067                 return function(t) {
37068                     return String(sample(t)) + (units || '');
37069                 };
37070             }
37071
37072
37073             function reset(selection) {
37074                 selection
37075                     .style('stroke-opacity', null)
37076                     .style('stroke-width', null)
37077                     .style('fill-opacity', null)
37078                     .style('r', null);
37079             }
37080
37081
37082             function setAnimationParams(transition, fromTo) {
37083                 var toFrom = (fromTo === 'from' ? 'to' : 'from');
37084
37085                 transition
37086                     .styleTween('stroke-opacity', function(d) {
37087                         return ratchetyInterpolator(
37088                             _params[d.id][toFrom].opacity,
37089                             _params[d.id][fromTo].opacity,
37090                             steps
37091                         );
37092                     })
37093                     .styleTween('stroke-width', function(d) {
37094                         return ratchetyInterpolator(
37095                             _params[d.id][toFrom].width,
37096                             _params[d.id][fromTo].width,
37097                             steps,
37098                             'px'
37099                         );
37100                     })
37101                     .styleTween('fill-opacity', function(d) {
37102                         return ratchetyInterpolator(
37103                             _params[d.id][toFrom].opacity,
37104                             _params[d.id][fromTo].opacity,
37105                             steps
37106                         );
37107                     })
37108                     .styleTween('r', function(d) {
37109                         return ratchetyInterpolator(
37110                             _params[d.id][toFrom].width,
37111                             _params[d.id][fromTo].width,
37112                             steps,
37113                             'px'
37114                         );
37115                     });
37116             }
37117
37118
37119             function calcAnimationParams(selection) {
37120                 selection
37121                     .call(reset)
37122                     .each(function(d) {
37123                         var s = d3_select(this);
37124                         var tag = s.node().tagName;
37125                         var p = {'from': {}, 'to': {}};
37126                         var opacity;
37127                         var width;
37128
37129                         // determine base opacity and width
37130                         if (tag === 'circle') {
37131                             opacity = parseFloat(s.style('fill-opacity') || 0.5);
37132                             width = parseFloat(s.style('r') || 15.5);
37133                         } else {
37134                             opacity = parseFloat(s.style('stroke-opacity') || 0.7);
37135                             width = parseFloat(s.style('stroke-width') || 10);
37136                         }
37137
37138                         // calculate from/to interpolation params..
37139                         p.tag = tag;
37140                         p.from.opacity = opacity * 0.6;
37141                         p.to.opacity = opacity * 1.25;
37142                         p.from.width = width * 0.7;
37143                         p.to.width = width * (tag === 'circle' ? 1.5 : 1);
37144                         _params[d.id] = p;
37145                     });
37146             }
37147
37148
37149             function run(surface, fromTo) {
37150                 var toFrom = (fromTo === 'from' ? 'to' : 'from');
37151                 var currSelected = surface.selectAll(selector);
37152                 var currClassed = surface.attr('class');
37153
37154                 if (_done || currSelected.empty()) {
37155                     _selected.call(reset);
37156                     return;
37157                 }
37158
37159                 if (!fastDeepEqual(currSelected.data(), _selected.data()) || currClassed !== _classed) {
37160                     _selected.call(reset);
37161                     _classed = currClassed;
37162                     _selected = currSelected.call(calcAnimationParams);
37163                 }
37164
37165                 _selected
37166                     .transition()
37167                     .duration(duration)
37168                     .call(setAnimationParams, fromTo)
37169                     .on('end', function() {
37170                         surface.call(run, toFrom);
37171                     });
37172             }
37173
37174
37175             function behavior(surface) {
37176                 _done = false;
37177                 _timer = timer(function() {
37178                     // wait for elements to actually become selected
37179                     if (surface.selectAll(selector).empty()) {
37180                         return false;
37181                     }
37182
37183                     surface.call(run, 'from');
37184                     _timer.stop();
37185                     return true;
37186                 }, 20);
37187             }
37188
37189
37190             behavior.off = function() {
37191                 _done = true;
37192                 if (_timer) {
37193                     _timer.stop();
37194                 }
37195                 _selected
37196                     .interrupt()
37197                     .call(reset);
37198             };
37199
37200
37201             return behavior;
37202         }
37203
37204         // Translate a MacOS key command into the appropriate Windows/Linux equivalent.
37205         // For example, ⌘Z -> Ctrl+Z
37206         var uiCmd = function (code) {
37207             var detected = utilDetect();
37208
37209             if (detected.os === 'mac') {
37210                 return code;
37211             }
37212
37213             if (detected.os === 'win') {
37214                 if (code === '⌘⇧Z') return 'Ctrl+Y';
37215             }
37216
37217             var result = '',
37218                 replacements = {
37219                     '⌘': 'Ctrl',
37220                     '⇧': 'Shift',
37221                     '⌥': 'Alt',
37222                     '⌫': 'Backspace',
37223                     '⌦': 'Delete'
37224                 };
37225
37226             for (var i = 0; i < code.length; i++) {
37227                 if (code[i] in replacements) {
37228                     result += replacements[code[i]] + (i < code.length - 1 ? '+' : '');
37229                 } else {
37230                     result += code[i];
37231                 }
37232             }
37233
37234             return result;
37235         };
37236
37237
37238         // return a display-focused string for a given keyboard code
37239         uiCmd.display = function(code) {
37240             if (code.length !== 1) return code;
37241
37242             var detected = utilDetect();
37243             var mac = (detected.os === 'mac');
37244             var replacements = {
37245                 '⌘': mac ? '⌘ ' + t('shortcuts.key.cmd')    : t('shortcuts.key.ctrl'),
37246                 '⇧': mac ? '⇧ ' + t('shortcuts.key.shift')  : t('shortcuts.key.shift'),
37247                 '⌥': mac ? '⌥ ' + t('shortcuts.key.option') : t('shortcuts.key.alt'),
37248                 '⌃': mac ? '⌃ ' + t('shortcuts.key.ctrl')   : t('shortcuts.key.ctrl'),
37249                 '⌫': mac ? '⌫ ' + t('shortcuts.key.delete') : t('shortcuts.key.backspace'),
37250                 '⌦': mac ? '⌦ ' + t('shortcuts.key.del')    : t('shortcuts.key.del'),
37251                 '↖': mac ? '↖ ' + t('shortcuts.key.pgup')   : t('shortcuts.key.pgup'),
37252                 '↘': mac ? '↘ ' + t('shortcuts.key.pgdn')   : t('shortcuts.key.pgdn'),
37253                 '⇞': mac ? '⇞ ' + t('shortcuts.key.home')   : t('shortcuts.key.home'),
37254                 '⇟': mac ? '⇟ ' + t('shortcuts.key.end')    : t('shortcuts.key.end'),
37255                 '↵': mac ? '↵ ' + t('shortcuts.key.return') : t('shortcuts.key.enter'),
37256                 '⎋': mac ? '⎋ ' + t('shortcuts.key.esc')    : t('shortcuts.key.esc'),
37257             };
37258
37259             return replacements[code] || code;
37260         };
37261
37262         function behaviorCopy(context) {
37263
37264             function groupEntities(ids, graph) {
37265                 var entities = ids.map(function (id) { return graph.entity(id); });
37266                 return Object.assign(
37267                     { relation: [], way: [], node: [] },
37268                     utilArrayGroupBy(entities, 'type')
37269                 );
37270             }
37271
37272
37273             function getDescendants(id, graph, descendants) {
37274                 var entity = graph.entity(id);
37275                 var children;
37276
37277                 descendants = descendants || {};
37278
37279                 if (entity.type === 'relation') {
37280                     children = entity.members.map(function(m) { return m.id; });
37281                 } else if (entity.type === 'way') {
37282                     children = entity.nodes;
37283                 } else {
37284                     children = [];
37285                 }
37286
37287                 for (var i = 0; i < children.length; i++) {
37288                     if (!descendants[children[i]]) {
37289                         descendants[children[i]] = true;
37290                         descendants = getDescendants(children[i], graph, descendants);
37291                     }
37292                 }
37293
37294                 return descendants;
37295             }
37296
37297
37298             function getSelectionText() {
37299                 return window.getSelection().toString();
37300             }
37301
37302
37303             function doCopy() {
37304                 if (!getSelectionText()) {
37305                     event.preventDefault();
37306                 }
37307
37308                 var graph = context.graph();
37309                 var selected = groupEntities(context.selectedIDs(), graph);
37310                 var canCopy = [];
37311                 var skip = {};
37312                 var entity;
37313                 var i;
37314
37315                 for (i = 0; i < selected.relation.length; i++) {
37316                     entity = selected.relation[i];
37317                     if (!skip[entity.id] && entity.isComplete(graph)) {
37318                         canCopy.push(entity.id);
37319                         skip = getDescendants(entity.id, graph, skip);
37320                     }
37321                 }
37322                 for (i = 0; i < selected.way.length; i++) {
37323                     entity = selected.way[i];
37324                     if (!skip[entity.id]) {
37325                         canCopy.push(entity.id);
37326                         skip = getDescendants(entity.id, graph, skip);
37327                     }
37328                 }
37329                 for (i = 0; i < selected.node.length; i++) {
37330                     entity = selected.node[i];
37331                     if (!skip[entity.id]) {
37332                         canCopy.push(entity.id);
37333                     }
37334                 }
37335
37336                 context.copyIDs(canCopy);
37337             }
37338
37339
37340             function behavior() {
37341                 context.keybinding().on(uiCmd('⌘C'), doCopy);
37342                 return behavior;
37343             }
37344
37345             behavior.off = function() {
37346                 context.keybinding().off(uiCmd('⌘C'));
37347             };
37348
37349
37350             return behavior;
37351         }
37352
37353         var _flashTimer;
37354
37355
37356         function uiFlash() {
37357             var _duration = 2000;
37358             var _iconName = '#iD-icon-no';
37359             var _iconClass = 'disabled';
37360             var _text = '';
37361             var _textClass;
37362
37363
37364             function flash() {
37365                 if (_flashTimer) {
37366                     _flashTimer.stop();
37367                 }
37368
37369                 d3_select('#footer-wrap')
37370                     .attr('class', 'footer-hide');
37371                 d3_select('#flash-wrap')
37372                     .attr('class', 'footer-show');
37373
37374                 var content = d3_select('#flash-wrap').selectAll('.flash-content')
37375                     .data([0]);
37376
37377                 // Enter
37378                 var contentEnter = content.enter()
37379                     .append('div')
37380                     .attr('class', 'flash-content');
37381
37382                 var iconEnter = contentEnter
37383                     .append('svg')
37384                     .attr('class', 'flash-icon')
37385                     .append('g')
37386                     .attr('transform', 'translate(10,10)');
37387
37388                 iconEnter
37389                     .append('circle')
37390                     .attr('r', 9);
37391
37392                 iconEnter
37393                     .append('use')
37394                     .attr('transform', 'translate(-7,-7)')
37395                     .attr('width', '14')
37396                     .attr('height', '14');
37397
37398                 contentEnter
37399                     .append('div')
37400                     .attr('class', 'flash-text');
37401
37402
37403                 // Update
37404                 content = content
37405                     .merge(contentEnter);
37406
37407                 content
37408                     .selectAll('.flash-icon')
37409                     .attr('class', 'flash-icon ' + (_iconClass || ''));
37410
37411                 content
37412                     .selectAll('.flash-icon use')
37413                     .attr('xlink:href', _iconName);
37414
37415                 content
37416                     .selectAll('.flash-text')
37417                     .attr('class', 'flash-text ' + (_textClass || ''))
37418                     .text(_text);
37419
37420
37421                 _flashTimer = d3_timeout(function() {
37422                     _flashTimer = null;
37423                     d3_select('#footer-wrap')
37424                         .attr('class', 'footer-show');
37425                     d3_select('#flash-wrap')
37426                         .attr('class', 'footer-hide');
37427                 }, _duration);
37428
37429                 return content;
37430             }
37431
37432
37433             flash.duration = function(_) {
37434                 if (!arguments.length) return _duration;
37435                 _duration = _;
37436                 return flash;
37437             };
37438
37439             flash.text = function(_) {
37440                 if (!arguments.length) return _text;
37441                 _text = _;
37442                 return flash;
37443             };
37444
37445             flash.textClass = function(_) {
37446                 if (!arguments.length) return _textClass;
37447                 _textClass = _;
37448                 return flash;
37449             };
37450
37451             flash.iconName = function(_) {
37452                 if (!arguments.length) return _iconName;
37453                 _iconName = _;
37454                 return flash;
37455             };
37456
37457             flash.iconClass = function(_) {
37458                 if (!arguments.length) return _iconClass;
37459                 _iconClass = _;
37460                 return flash;
37461             };
37462
37463             return flash;
37464         }
37465
37466         /* Creates a keybinding behavior for an operation */
37467         function behaviorOperation(context) {
37468             var _operation;
37469
37470             function keypress() {
37471                 event.preventDefault();
37472                 var disabled = _operation.disabled();
37473                 var flash;
37474
37475                 if (disabled) {
37476                     flash = uiFlash()
37477                         .duration(4000)
37478                         .iconName('#iD-operation-' + _operation.id)
37479                         .iconClass('operation disabled')
37480                         .text(_operation.tooltip);
37481
37482                     flash();
37483
37484                 } else {
37485                     flash = uiFlash()
37486                         .duration(2000)
37487                         .iconName('#iD-operation-' + _operation.id)
37488                         .iconClass('operation')
37489                         .text(_operation.annotation() || _operation.title);
37490
37491                     flash();
37492                     _operation();
37493                 }
37494             }
37495
37496
37497             function behavior() {
37498                 if (_operation && _operation.available()) {
37499                     context.keybinding()
37500                         .on(_operation.keys, keypress);
37501                 }
37502
37503                 return behavior;
37504             }
37505
37506
37507             behavior.off = function() {
37508                 context.keybinding()
37509                     .off(_operation.keys);
37510             };
37511
37512
37513             behavior.which = function (_) {
37514                 if (!arguments.length) return _operation;
37515                 _operation = _;
37516                 return behavior;
37517             };
37518
37519
37520             return behavior;
37521         }
37522
37523         function operationCircularize(selectedIDs, context) {
37524             var entityID = selectedIDs[0];
37525             var entity = context.entity(entityID);
37526             var extent = entity.extent(context.graph());
37527             var geometry = context.geometry(entityID);
37528             var action = actionCircularize(entityID, context.projection);
37529             var nodes = utilGetAllNodes(selectedIDs, context.graph());
37530             var coords = nodes.map(function(n) { return n.loc; });
37531
37532             var operation = function() {
37533                 context.perform(action, operation.annotation());
37534
37535                 window.setTimeout(function() {
37536                     context.validator().validate();
37537                 }, 300);  // after any transition
37538             };
37539
37540
37541             operation.available = function() {
37542                 return selectedIDs.length === 1 &&
37543                     entity.type === 'way' &&
37544                     new Set(entity.nodes).size > 1;
37545             };
37546
37547
37548             // don't cache this because the visible extent could change
37549             operation.disabled = function() {
37550                 var actionDisabled = action.disabled(context.graph());
37551                 if (actionDisabled) {
37552                     return actionDisabled;
37553                 } else if (extent.percentContainedIn(context.extent()) < 0.8) {
37554                     return 'too_large';
37555                 } else if (someMissing()) {
37556                     return 'not_downloaded';
37557                 } else if (selectedIDs.some(context.hasHiddenConnections)) {
37558                     return 'connected_to_hidden';
37559                 }
37560
37561                 return false;
37562
37563
37564                 function someMissing() {
37565                     if (context.inIntro()) return false;
37566                     var osm = context.connection();
37567                     if (osm) {
37568                         var missing = coords.filter(function(loc) { return !osm.isDataLoaded(loc); });
37569                         if (missing.length) {
37570                             missing.forEach(function(loc) { context.loadTileAtLoc(loc); });
37571                             return true;
37572                         }
37573                     }
37574                     return false;
37575                 }
37576             };
37577
37578
37579             operation.tooltip = function() {
37580                 var disable = operation.disabled();
37581                 return disable ?
37582                     t('operations.circularize.' + disable) :
37583                     t('operations.circularize.description.' + geometry);
37584             };
37585
37586
37587             operation.annotation = function() {
37588                 return t('operations.circularize.annotation.' + geometry);
37589             };
37590
37591
37592             operation.id = 'circularize';
37593             operation.keys = [t('operations.circularize.key')];
37594             operation.title = t('operations.circularize.title');
37595             operation.behavior = behaviorOperation(context).which(operation);
37596
37597             return operation;
37598         }
37599
37600         function operationDelete(selectedIDs, context) {
37601             var multi = (selectedIDs.length === 1 ? 'single' : 'multiple');
37602             var action = actionDeleteMultiple(selectedIDs);
37603             var nodes = utilGetAllNodes(selectedIDs, context.graph());
37604             var coords = nodes.map(function(n) { return n.loc; });
37605             var extent = nodes.reduce(function(extent, node) {
37606                 return extent.extend(node.extent(context.graph()));
37607             }, geoExtent());
37608
37609
37610             var operation = function() {
37611                 var nextSelectedID;
37612                 var nextSelectedLoc;
37613
37614                 if (selectedIDs.length === 1) {
37615                     var id = selectedIDs[0];
37616                     var entity = context.entity(id);
37617                     var geometry = context.geometry(id);
37618                     var parents = context.graph().parentWays(entity);
37619                     var parent = parents[0];
37620
37621                     // Select the next closest node in the way.
37622                     if (geometry === 'vertex') {
37623                         var nodes = parent.nodes;
37624                         var i = nodes.indexOf(id);
37625
37626                         if (i === 0) {
37627                             i++;
37628                         } else if (i === nodes.length - 1) {
37629                             i--;
37630                         } else {
37631                             var a = geoSphericalDistance(entity.loc, context.entity(nodes[i - 1]).loc);
37632                             var b = geoSphericalDistance(entity.loc, context.entity(nodes[i + 1]).loc);
37633                             i = a < b ? i - 1 : i + 1;
37634                         }
37635
37636                         nextSelectedID = nodes[i];
37637                         nextSelectedLoc = context.entity(nextSelectedID).loc;
37638                     }
37639                 }
37640
37641                 context.perform(action, operation.annotation());
37642                 context.validator().validate();
37643
37644                 if (nextSelectedID && nextSelectedLoc) {
37645                     if (context.hasEntity(nextSelectedID)) {
37646                         context.enter(modeSelect(context, [nextSelectedID]).follow(true));
37647                     } else {
37648                         context.map().centerEase(nextSelectedLoc);
37649                         context.enter(modeBrowse(context));
37650                     }
37651                 } else {
37652                     context.enter(modeBrowse(context));
37653                 }
37654
37655             };
37656
37657
37658             operation.available = function() {
37659                 return true;
37660             };
37661
37662
37663             operation.disabled = function() {
37664                 if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
37665                     return 'too_large';
37666                 } else if (someMissing()) {
37667                     return 'not_downloaded';
37668                 } else if (selectedIDs.some(context.hasHiddenConnections)) {
37669                     return 'connected_to_hidden';
37670                 } else if (selectedIDs.some(protectedMember)) {
37671                     return 'part_of_relation';
37672                 } else if (selectedIDs.some(incompleteRelation)) {
37673                     return 'incomplete_relation';
37674                 } else if (selectedIDs.some(hasWikidataTag)) {
37675                     return 'has_wikidata_tag';
37676                 }
37677
37678                 return false;
37679
37680
37681                 function someMissing() {
37682                     if (context.inIntro()) return false;
37683                     var osm = context.connection();
37684                     if (osm) {
37685                         var missing = coords.filter(function(loc) { return !osm.isDataLoaded(loc); });
37686                         if (missing.length) {
37687                             missing.forEach(function(loc) { context.loadTileAtLoc(loc); });
37688                             return true;
37689                         }
37690                     }
37691                     return false;
37692                 }
37693
37694                 function hasWikidataTag(id) {
37695                     var entity = context.entity(id);
37696                     return entity.tags.wikidata && entity.tags.wikidata.trim().length > 0;
37697                 }
37698
37699                 function incompleteRelation(id) {
37700                     var entity = context.entity(id);
37701                     return entity.type === 'relation' && !entity.isComplete(context.graph());
37702                 }
37703
37704                 function protectedMember(id) {
37705                     var entity = context.entity(id);
37706                     if (entity.type !== 'way') return false;
37707
37708                     var parents = context.graph().parentRelations(entity);
37709                     for (var i = 0; i < parents.length; i++) {
37710                         var parent = parents[i];
37711                         var type = parent.tags.type;
37712                         var role = parent.memberById(id).role || 'outer';
37713                         if (type === 'route' || type === 'boundary' || (type === 'multipolygon' && role === 'outer')) {
37714                             return true;
37715                         }
37716                     }
37717                     return false;
37718                 }
37719             };
37720
37721
37722             operation.tooltip = function() {
37723                 var disable = operation.disabled();
37724                 return disable ?
37725                     t('operations.delete.' + disable + '.' + multi) :
37726                     t('operations.delete.description' + '.' + multi);
37727             };
37728
37729
37730             operation.annotation = function() {
37731                 return selectedIDs.length === 1 ?
37732                     t('operations.delete.annotation.' + context.geometry(selectedIDs[0])) :
37733                     t('operations.delete.annotation.multiple', { n: selectedIDs.length });
37734             };
37735
37736
37737             operation.id = 'delete';
37738             operation.keys = [uiCmd('⌘⌫'), uiCmd('⌘⌦'), uiCmd('⌦')];
37739             operation.title = t('operations.delete.title');
37740             operation.behavior = behaviorOperation(context).which(operation);
37741
37742             return operation;
37743         }
37744
37745         function operationOrthogonalize(selectedIDs, context) {
37746             var _entityID;
37747             var _entity;
37748             var _geometry;
37749             var action = chooseAction();
37750             var nodes = utilGetAllNodes(selectedIDs, context.graph());
37751             var coords = nodes.map(function(n) { return n.loc; });
37752
37753
37754             function chooseAction() {
37755                 if (selectedIDs.length !== 1) return null;
37756
37757                 _entityID = selectedIDs[0];
37758                 _entity = context.entity(_entityID);
37759                 _geometry = context.geometry(_entityID);
37760
37761                 // square a line/area
37762                 if (_entity.type === 'way' && new Set(_entity.nodes).size > 2 ) {
37763                     return actionOrthogonalize(_entityID, context.projection);
37764
37765                 // square a single vertex
37766                 } else if (_geometry === 'vertex') {
37767                     var graph = context.graph();
37768                     var parents = graph.parentWays(_entity);
37769                     if (parents.length === 1) {
37770                         var way = parents[0];
37771                         if (way.nodes.indexOf(_entityID) !== -1) {
37772                             return actionOrthogonalize(way.id, context.projection, _entityID);
37773                         }
37774                     }
37775                 }
37776
37777                 return null;
37778             }
37779
37780
37781             var operation = function() {
37782                 if (!action) return;
37783
37784                 context.perform(action, operation.annotation());
37785
37786                 window.setTimeout(function() {
37787                     context.validator().validate();
37788                 }, 300);  // after any transition
37789             };
37790
37791
37792             operation.available = function() {
37793                 return Boolean(action);
37794             };
37795
37796
37797             // don't cache this because the visible extent could change
37798             operation.disabled = function() {
37799                 if (!action) return '';
37800
37801                 var actionDisabled = action.disabled(context.graph());
37802                 if (actionDisabled) {
37803                     return actionDisabled;
37804                 } else if (_geometry !== 'vertex' &&
37805                            _entity.extent(context.graph()).percentContainedIn(context.extent()) < 0.8) {
37806                     return 'too_large';
37807                 } else if (someMissing()) {
37808                     return 'not_downloaded';
37809                 } else if (selectedIDs.some(context.hasHiddenConnections)) {
37810                     return 'connected_to_hidden';
37811                 }
37812
37813                 return false;
37814
37815
37816                 function someMissing() {
37817                     if (context.inIntro()) return false;
37818                     var osm = context.connection();
37819                     if (osm) {
37820                         var missing = coords.filter(function(loc) { return !osm.isDataLoaded(loc); });
37821                         if (missing.length) {
37822                             missing.forEach(function(loc) { context.loadTileAtLoc(loc); });
37823                             return true;
37824                         }
37825                     }
37826                     return false;
37827                 }
37828             };
37829
37830
37831             operation.tooltip = function() {
37832                 var disable = operation.disabled();
37833                 return disable ?
37834                     t('operations.orthogonalize.' + disable) :
37835                     t('operations.orthogonalize.description.' + _geometry);
37836             };
37837
37838
37839             operation.annotation = function() {
37840                 return t('operations.orthogonalize.annotation.' + _geometry);
37841             };
37842
37843
37844             operation.id = 'orthogonalize';
37845             operation.keys = [t('operations.orthogonalize.key')];
37846             operation.title = t('operations.orthogonalize.title');
37847             operation.behavior = behaviorOperation(context).which(operation);
37848
37849             return operation;
37850         }
37851
37852         function operationReflectShort(selectedIDs, context) {
37853             return operationReflect(selectedIDs, context, 'short');
37854         }
37855
37856
37857         function operationReflectLong(selectedIDs, context) {
37858             return operationReflect(selectedIDs, context, 'long');
37859         }
37860
37861
37862         function operationReflect(selectedIDs, context, axis) {
37863             axis = axis || 'long';
37864             var multi = (selectedIDs.length === 1 ? 'single' : 'multiple');
37865             var nodes = utilGetAllNodes(selectedIDs, context.graph());
37866             var coords = nodes.map(function(n) { return n.loc; });
37867             var extent = nodes.reduce(function(extent, node) {
37868                 return extent.extend(node.extent(context.graph()));
37869             }, geoExtent());
37870
37871
37872             var operation = function() {
37873                 var action = actionReflect(selectedIDs, context.projection)
37874                     .useLongAxis(Boolean(axis === 'long'));
37875
37876                 context.perform(action, operation.annotation());
37877
37878                 window.setTimeout(function() {
37879                     context.validator().validate();
37880                 }, 300);  // after any transition
37881             };
37882
37883
37884             operation.available = function() {
37885                 return nodes.length >= 3;
37886             };
37887
37888
37889             // don't cache this because the visible extent could change
37890             operation.disabled = function() {
37891                 if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
37892                     return 'too_large';
37893                 } else if (someMissing()) {
37894                     return 'not_downloaded';
37895                 } else if (selectedIDs.some(context.hasHiddenConnections)) {
37896                     return 'connected_to_hidden';
37897                 } else if (selectedIDs.some(incompleteRelation)) {
37898                     return 'incomplete_relation';
37899                 }
37900
37901                 return false;
37902
37903
37904                 function someMissing() {
37905                     if (context.inIntro()) return false;
37906                     var osm = context.connection();
37907                     if (osm) {
37908                         var missing = coords.filter(function(loc) { return !osm.isDataLoaded(loc); });
37909                         if (missing.length) {
37910                             missing.forEach(function(loc) { context.loadTileAtLoc(loc); });
37911                             return true;
37912                         }
37913                     }
37914                     return false;
37915                 }
37916
37917                 function incompleteRelation(id) {
37918                     var entity = context.entity(id);
37919                     return entity.type === 'relation' && !entity.isComplete(context.graph());
37920                 }
37921             };
37922
37923
37924             operation.tooltip = function() {
37925                 var disable = operation.disabled();
37926                 return disable ?
37927                     t('operations.reflect.' + disable + '.' + multi) :
37928                     t('operations.reflect.description.' + axis + '.' + multi);
37929             };
37930
37931
37932             operation.annotation = function() {
37933                 return t('operations.reflect.annotation.' + axis + '.' + multi);
37934             };
37935
37936
37937             operation.id = 'reflect-' + axis;
37938             operation.keys = [t('operations.reflect.key.' + axis)];
37939             operation.title = t('operations.reflect.title.' + axis);
37940             operation.behavior = behaviorOperation(context).which(operation);
37941
37942             return operation;
37943         }
37944
37945         function operationMove(selectedIDs, context) {
37946             var multi = (selectedIDs.length === 1 ? 'single' : 'multiple');
37947             var nodes = utilGetAllNodes(selectedIDs, context.graph());
37948             var coords = nodes.map(function(n) { return n.loc; });
37949             var extent = nodes.reduce(function(extent, node) {
37950                 return extent.extend(node.extent(context.graph()));
37951             }, geoExtent());
37952
37953
37954             var operation = function() {
37955                 context.enter(modeMove(context, selectedIDs));
37956             };
37957
37958
37959             operation.available = function() {
37960                 return selectedIDs.length > 1 ||
37961                     context.entity(selectedIDs[0]).type !== 'node';
37962             };
37963
37964
37965             operation.disabled = function() {
37966                 if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
37967                     return 'too_large';
37968                 } else if (someMissing()) {
37969                     return 'not_downloaded';
37970                 } else if (selectedIDs.some(context.hasHiddenConnections)) {
37971                     return 'connected_to_hidden';
37972                 } else if (selectedIDs.some(incompleteRelation)) {
37973                     return 'incomplete_relation';
37974                 }
37975
37976                 return false;
37977
37978
37979                 function someMissing() {
37980                     if (context.inIntro()) return false;
37981                     var osm = context.connection();
37982                     if (osm) {
37983                         var missing = coords.filter(function(loc) { return !osm.isDataLoaded(loc); });
37984                         if (missing.length) {
37985                             missing.forEach(function(loc) { context.loadTileAtLoc(loc); });
37986                             return true;
37987                         }
37988                     }
37989                     return false;
37990                 }
37991
37992                 function incompleteRelation(id) {
37993                     var entity = context.entity(id);
37994                     return entity.type === 'relation' && !entity.isComplete(context.graph());
37995                 }
37996             };
37997
37998
37999             operation.tooltip = function() {
38000                 var disable = operation.disabled();
38001                 return disable ?
38002                     t('operations.move.' + disable + '.' + multi) :
38003                     t('operations.move.description.' + multi);
38004             };
38005
38006
38007             operation.annotation = function() {
38008                 return selectedIDs.length === 1 ?
38009                     t('operations.move.annotation.' + context.geometry(selectedIDs[0])) :
38010                     t('operations.move.annotation.multiple');
38011             };
38012
38013
38014             operation.id = 'move';
38015             operation.keys = [t('operations.move.key')];
38016             operation.title = t('operations.move.title');
38017             operation.behavior = behaviorOperation(context).which(operation);
38018
38019             return operation;
38020         }
38021
38022         function modeRotate(context, entityIDs) {
38023             var mode = {
38024                 id: 'rotate',
38025                 button: 'browse'
38026             };
38027
38028             var keybinding = utilKeybinding('rotate');
38029             var behaviors = [
38030                 behaviorEdit(context),
38031                 operationCircularize(entityIDs, context).behavior,
38032                 operationDelete(entityIDs, context).behavior,
38033                 operationMove(entityIDs, context).behavior,
38034                 operationOrthogonalize(entityIDs, context).behavior,
38035                 operationReflectLong(entityIDs, context).behavior,
38036                 operationReflectShort(entityIDs, context).behavior
38037             ];
38038             var annotation = entityIDs.length === 1 ?
38039                 t('operations.rotate.annotation.' + context.geometry(entityIDs[0])) :
38040                 t('operations.rotate.annotation.multiple');
38041
38042             var _prevGraph;
38043             var _prevAngle;
38044             var _prevTransform;
38045             var _pivot;
38046
38047
38048             function doRotate() {
38049                 var fn;
38050                 if (context.graph() !== _prevGraph) {
38051                     fn = context.perform;
38052                 } else {
38053                     fn = context.replace;
38054                 }
38055
38056                 // projection changed, recalculate _pivot
38057                 var projection = context.projection;
38058                 var currTransform = projection.transform();
38059                 if (!_prevTransform ||
38060                     currTransform.k !== _prevTransform.k ||
38061                     currTransform.x !== _prevTransform.x ||
38062                     currTransform.y !== _prevTransform.y) {
38063
38064                     var nodes = utilGetAllNodes(entityIDs, context.graph());
38065                     var points = nodes.map(function(n) { return projection(n.loc); });
38066
38067                     if (points.length === 1) {  // degenerate case
38068                         _pivot = points[0];
38069                     } else if (points.length === 2) {
38070                         _pivot = geoVecInterp(points[0], points[1], 0.5);
38071                     } else {
38072                         _pivot = d3_polygonCentroid(d3_polygonHull(points));
38073                     }
38074                     _prevAngle = undefined;
38075                 }
38076
38077
38078                 var currMouse = context.mouse();
38079                 var currAngle = Math.atan2(currMouse[1] - _pivot[1], currMouse[0] - _pivot[0]);
38080
38081                 if (typeof _prevAngle === 'undefined') _prevAngle = currAngle;
38082                 var delta = currAngle - _prevAngle;
38083
38084                 fn(actionRotate(entityIDs, _pivot, delta, projection));
38085
38086                 _prevTransform = currTransform;
38087                 _prevAngle = currAngle;
38088                 _prevGraph = context.graph();
38089             }
38090
38091
38092             function finish() {
38093                 event.stopPropagation();
38094                 context.replace(actionNoop(), annotation);
38095                 context.enter(modeSelect(context, entityIDs));
38096             }
38097
38098
38099             function cancel() {
38100                 context.pop();
38101                 context.enter(modeSelect(context, entityIDs));
38102             }
38103
38104
38105             function undone() {
38106                 context.enter(modeBrowse(context));
38107             }
38108
38109
38110             mode.enter = function() {
38111                 context.features().forceVisible(entityIDs);
38112
38113                 behaviors.forEach(context.install);
38114
38115                 context.surface()
38116                     .on('mousemove.rotate', doRotate)
38117                     .on('click.rotate', finish);
38118
38119                 context.history()
38120                     .on('undone.rotate', undone);
38121
38122                 keybinding
38123                     .on('⎋', cancel)
38124                     .on('↩', finish);
38125
38126                 d3_select(document)
38127                     .call(keybinding);
38128             };
38129
38130
38131             mode.exit = function() {
38132                 behaviors.forEach(context.uninstall);
38133
38134                 context.surface()
38135                     .on('mousemove.rotate', null)
38136                     .on('click.rotate', null);
38137
38138                 context.history()
38139                     .on('undone.rotate', null);
38140
38141                 d3_select(document)
38142                     .call(keybinding.unbind);
38143
38144                 context.features().forceVisible([]);
38145             };
38146
38147
38148             mode.selectedIDs = function() {
38149                 if (!arguments.length) return entityIDs;
38150                 // no assign
38151                 return mode;
38152             };
38153
38154
38155             return mode;
38156         }
38157
38158         function operationRotate(selectedIDs, context) {
38159             var multi = (selectedIDs.length === 1 ? 'single' : 'multiple');
38160             var nodes = utilGetAllNodes(selectedIDs, context.graph());
38161             var coords = nodes.map(function(n) { return n.loc; });
38162             var extent = nodes.reduce(function(extent, node) {
38163                 return extent.extend(node.extent(context.graph()));
38164             }, geoExtent());
38165
38166
38167             var operation = function() {
38168                 context.enter(modeRotate(context, selectedIDs));
38169             };
38170
38171
38172             operation.available = function() {
38173                 return nodes.length >= 2;
38174             };
38175
38176
38177             operation.disabled = function() {
38178
38179                 if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
38180                     return 'too_large';
38181                 } else if (someMissing()) {
38182                     return 'not_downloaded';
38183                 } else if (selectedIDs.some(context.hasHiddenConnections)) {
38184                     return 'connected_to_hidden';
38185                 } else if (selectedIDs.some(incompleteRelation)) {
38186                     return 'incomplete_relation';
38187                 }
38188
38189                 return false;
38190
38191
38192                 function someMissing() {
38193                     if (context.inIntro()) return false;
38194                     var osm = context.connection();
38195                     if (osm) {
38196                         var missing = coords.filter(function(loc) { return !osm.isDataLoaded(loc); });
38197                         if (missing.length) {
38198                             missing.forEach(function(loc) { context.loadTileAtLoc(loc); });
38199                             return true;
38200                         }
38201                     }
38202                     return false;
38203                 }
38204
38205                 function incompleteRelation(id) {
38206                     var entity = context.entity(id);
38207                     return entity.type === 'relation' && !entity.isComplete(context.graph());
38208                 }
38209             };
38210
38211
38212             operation.tooltip = function() {
38213                 var disable = operation.disabled();
38214                 return disable ?
38215                     t('operations.rotate.' + disable + '.' + multi) :
38216                     t('operations.rotate.description.' + multi);
38217             };
38218
38219
38220             operation.annotation = function() {
38221                 return selectedIDs.length === 1 ?
38222                     t('operations.rotate.annotation.' + context.geometry(selectedIDs[0])) :
38223                     t('operations.rotate.annotation.multiple');
38224             };
38225
38226
38227             operation.id = 'rotate';
38228             operation.keys = [t('operations.rotate.key')];
38229             operation.title = t('operations.rotate.title');
38230             operation.behavior = behaviorOperation(context).which(operation);
38231
38232             return operation;
38233         }
38234
38235         function modeMove(context, entityIDs, baseGraph) {
38236             var mode = {
38237                 id: 'move',
38238                 button: 'browse'
38239             };
38240
38241             var keybinding = utilKeybinding('move');
38242             var behaviors = [
38243                 behaviorEdit(context),
38244                 operationCircularize(entityIDs, context).behavior,
38245                 operationDelete(entityIDs, context).behavior,
38246                 operationOrthogonalize(entityIDs, context).behavior,
38247                 operationReflectLong(entityIDs, context).behavior,
38248                 operationReflectShort(entityIDs, context).behavior,
38249                 operationRotate(entityIDs, context).behavior
38250             ];
38251             var annotation = entityIDs.length === 1 ?
38252                 t('operations.move.annotation.' + context.geometry(entityIDs[0])) :
38253                 t('operations.move.annotation.multiple');
38254
38255             var _prevGraph;
38256             var _cache;
38257             var _origin;
38258             var _nudgeInterval;
38259
38260
38261             function doMove(nudge) {
38262                 nudge = nudge || [0, 0];
38263
38264                 var fn;
38265                 if (_prevGraph !== context.graph()) {
38266                     _cache = {};
38267                     _origin = context.map().mouseCoordinates();
38268                     fn = context.perform;
38269                 } else {
38270                     fn = context.overwrite;
38271                 }
38272
38273                 var currMouse = context.mouse();
38274                 var origMouse = context.projection(_origin);
38275                 var delta = geoVecSubtract(geoVecSubtract(currMouse, origMouse), nudge);
38276
38277                 fn(actionMove(entityIDs, delta, context.projection, _cache));
38278                 _prevGraph = context.graph();
38279             }
38280
38281
38282             function startNudge(nudge) {
38283                 if (_nudgeInterval) window.clearInterval(_nudgeInterval);
38284                 _nudgeInterval = window.setInterval(function() {
38285                     context.pan(nudge);
38286                     doMove(nudge);
38287                 }, 50);
38288             }
38289
38290
38291             function stopNudge() {
38292                 if (_nudgeInterval) {
38293                     window.clearInterval(_nudgeInterval);
38294                     _nudgeInterval = null;
38295                 }
38296             }
38297
38298
38299             function move() {
38300                 doMove();
38301                 var nudge = geoViewportEdge(context.mouse(), context.map().dimensions());
38302                 if (nudge) {
38303                     startNudge(nudge);
38304                 } else {
38305                     stopNudge();
38306                 }
38307             }
38308
38309
38310             function finish() {
38311                 event.stopPropagation();
38312                 context.replace(actionNoop(), annotation);
38313                 context.enter(modeSelect(context, entityIDs));
38314                 stopNudge();
38315             }
38316
38317
38318             function cancel() {
38319                 if (baseGraph) {
38320                     while (context.graph() !== baseGraph) context.pop();
38321                     context.enter(modeBrowse(context));
38322                 } else {
38323                     context.pop();
38324                     context.enter(modeSelect(context, entityIDs));
38325                 }
38326                 stopNudge();
38327             }
38328
38329
38330             function undone() {
38331                 context.enter(modeBrowse(context));
38332             }
38333
38334
38335             mode.enter = function() {
38336                 _origin = context.map().mouseCoordinates();
38337                 _prevGraph = null;
38338                 _cache = {};
38339
38340                 context.features().forceVisible(entityIDs);
38341
38342                 behaviors.forEach(context.install);
38343
38344                 context.surface()
38345                     .on('mousemove.move', move)
38346                     .on('click.move', finish);
38347
38348                 context.history()
38349                     .on('undone.move', undone);
38350
38351                 keybinding
38352                     .on('⎋', cancel)
38353                     .on('↩', finish);
38354
38355                 d3_select(document)
38356                     .call(keybinding);
38357             };
38358
38359
38360             mode.exit = function() {
38361                 stopNudge();
38362
38363                 behaviors.forEach(function(behavior) {
38364                     context.uninstall(behavior);
38365                 });
38366
38367                 context.surface()
38368                     .on('mousemove.move', null)
38369                     .on('click.move', null);
38370
38371                 context.history()
38372                     .on('undone.move', null);
38373
38374                 d3_select(document)
38375                     .call(keybinding.unbind);
38376
38377                 context.features().forceVisible([]);
38378             };
38379
38380
38381             mode.selectedIDs = function() {
38382                 if (!arguments.length) return entityIDs;
38383                 // no assign
38384                 return mode;
38385             };
38386
38387
38388             return mode;
38389         }
38390
38391         function behaviorPaste(context) {
38392
38393             function doPaste() {
38394                 event.preventDefault();
38395
38396                 var baseGraph = context.graph();
38397                 var mouse = context.mouse();
38398                 var projection = context.projection;
38399                 var viewport = geoExtent(projection.clipExtent()).polygon();
38400
38401                 if (!geoPointInPolygon(mouse, viewport)) return;
38402
38403                 var extent = geoExtent();
38404                 var oldIDs = context.copyIDs();
38405                 var oldGraph = context.copyGraph();
38406                 var newIDs = [];
38407
38408                 if (!oldIDs.length) return;
38409
38410                 var action = actionCopyEntities(oldIDs, oldGraph);
38411                 context.perform(action);
38412
38413                 var copies = action.copies();
38414                 var originals = new Set();
38415                 Object.values(copies).forEach(function(entity) { originals.add(entity.id); });
38416
38417                 for (var id in copies) {
38418                     var oldEntity = oldGraph.entity(id);
38419                     var newEntity = copies[id];
38420
38421                     extent._extend(oldEntity.extent(oldGraph));
38422
38423                     // Exclude child nodes from newIDs if their parent way was also copied.
38424                     var parents = context.graph().parentWays(newEntity);
38425                     var parentCopied = parents.some(function(parent) {
38426                         return originals.has(parent.id);
38427                     });
38428
38429                     if (!parentCopied) {
38430                         newIDs.push(newEntity.id);
38431                     }
38432                 }
38433
38434                 // Put pasted objects where mouse pointer is..
38435                 var center = projection(extent.center());
38436                 var delta = geoVecSubtract(mouse, center);
38437
38438                 context.perform(actionMove(newIDs, delta, projection));
38439                 context.enter(modeMove(context, newIDs, baseGraph));
38440             }
38441
38442
38443             function behavior() {
38444                 context.keybinding().on(uiCmd('⌘V'), doPaste);
38445                 return behavior;
38446             }
38447
38448
38449             behavior.off = function() {
38450                 context.keybinding().off(uiCmd('⌘V'));
38451             };
38452
38453
38454             return behavior;
38455         }
38456
38457         /*
38458             `behaviorDrag` is like `d3_behavior.drag`, with the following differences:
38459
38460             * The `origin` function is expected to return an [x, y] tuple rather than an
38461               {x, y} object.
38462             * The events are `start`, `move`, and `end`.
38463               (https://github.com/mbostock/d3/issues/563)
38464             * The `start` event is not dispatched until the first cursor movement occurs.
38465               (https://github.com/mbostock/d3/pull/368)
38466             * The `move` event has a `point` and `delta` [x, y] tuple properties rather
38467               than `x`, `y`, `dx`, and `dy` properties.
38468             * The `end` event is not dispatched if no movement occurs.
38469             * An `off` function is available that unbinds the drag's internal event handlers.
38470          */
38471
38472         function behaviorDrag() {
38473             var dispatch$1 = dispatch('start', 'move', 'end');
38474             var _origin = null;
38475             var _selector = '';
38476             var _event;
38477             var _target;
38478             var _surface;
38479
38480
38481             var d3_event_userSelectProperty = utilPrefixCSSProperty('UserSelect');
38482             var d3_event_userSelectSuppress = function() {
38483                     var selection$1 = selection();
38484                     var select = selection$1.style(d3_event_userSelectProperty);
38485                     selection$1.style(d3_event_userSelectProperty, 'none');
38486                     return function() {
38487                         selection$1.style(d3_event_userSelectProperty, select);
38488                     };
38489                 };
38490
38491
38492             function d3_eventCancel() {
38493                 event.stopPropagation();
38494                 event.preventDefault();
38495             }
38496
38497
38498             function eventOf(thiz, argumentz) {
38499                 return function(e1) {
38500                     e1.target = behavior;
38501                     customEvent(e1, dispatch$1.apply, dispatch$1, [e1.type, thiz, argumentz]);
38502                 };
38503             }
38504
38505
38506             function dragstart() {
38507                 _target = this;
38508                 _event = eventOf(_target, arguments);
38509
38510                 var eventTarget = event.target;
38511                 var touchId = event.touches ? event.changedTouches[0].identifier : null;
38512                 var offset;
38513                 var startOrigin = point();
38514                 var started = false;
38515                 var selectEnable = d3_event_userSelectSuppress();
38516
38517                 d3_select(window)
38518                     .on(touchId !== null ? 'touchmove.drag-' + touchId : 'mousemove.drag', dragmove)
38519                     .on(touchId !== null ? 'touchend.drag-' + touchId : 'mouseup.drag', dragend, true);
38520
38521                 if (_origin) {
38522                     offset = _origin.apply(_target, arguments);
38523                     offset = [offset[0] - startOrigin[0], offset[1] - startOrigin[1]];
38524                 } else {
38525                     offset = [0, 0];
38526                 }
38527
38528                 if (touchId === null) {
38529                     event.stopPropagation();
38530                 }
38531
38532
38533                 function point() {
38534                     var p = _surface || _target.parentNode;
38535                     return touchId !== null ? d3_touches(p).filter(function(p) {
38536                         return p.identifier === touchId;
38537                     })[0] : d3_mouse(p);
38538                 }
38539
38540
38541                 function dragmove() {
38542                     var p = point();
38543                     var dx = p[0] - startOrigin[0];
38544                     var dy = p[1] - startOrigin[1];
38545
38546                     if (dx === 0 && dy === 0)
38547                         return;
38548
38549                     startOrigin = p;
38550                     d3_eventCancel();
38551
38552                     if (!started) {
38553                         started = true;
38554                         _event({ type: 'start' });
38555                     } else {
38556                         _event({
38557                             type: 'move',
38558                             point: [p[0] + offset[0],  p[1] + offset[1]],
38559                             delta: [dx, dy]
38560                         });
38561                     }
38562                 }
38563
38564
38565                 function dragend() {
38566                     if (started) {
38567                         _event({ type: 'end' });
38568
38569                         d3_eventCancel();
38570                         if (event.target === eventTarget) {
38571                             d3_select(window)
38572                                 .on('click.drag', click, true);
38573                         }
38574                     }
38575
38576                     d3_select(window)
38577                         .on(touchId !== null ? 'touchmove.drag-' + touchId : 'mousemove.drag', null)
38578                         .on(touchId !== null ? 'touchend.drag-' + touchId : 'mouseup.drag', null);
38579
38580                     selectEnable();
38581                 }
38582
38583
38584                 function click() {
38585                     d3_eventCancel();
38586                     d3_select(window)
38587                         .on('click.drag', null);
38588                 }
38589             }
38590
38591
38592             function behavior(selection) {
38593                 var matchesSelector = utilPrefixDOMProperty('matchesSelector');
38594                 var delegate = dragstart;
38595
38596                 if (_selector) {
38597                     delegate = function() {
38598                         var root = this;
38599                         var target = event.target;
38600                         for (; target && target !== root; target = target.parentNode) {
38601                             var datum = target.__data__;
38602
38603                             var entity = datum instanceof osmNote ? datum
38604                                 : datum && datum.properties && datum.properties.entity;
38605
38606                             if (entity && target[matchesSelector](_selector)) {
38607                                 return dragstart.call(target, entity);
38608                             }
38609                         }
38610                     };
38611                 }
38612
38613                 selection
38614                     .on('mousedown.drag' + _selector, delegate)
38615                     .on('touchstart.drag' + _selector, delegate);
38616             }
38617
38618
38619             behavior.off = function(selection) {
38620                 selection
38621                     .on('mousedown.drag' + _selector, null)
38622                     .on('touchstart.drag' + _selector, null);
38623             };
38624
38625
38626             behavior.selector = function(_) {
38627                 if (!arguments.length) return _selector;
38628                 _selector = _;
38629                 return behavior;
38630             };
38631
38632
38633             behavior.origin = function(_) {
38634                 if (!arguments.length) return _origin;
38635                 _origin = _;
38636                 return behavior;
38637             };
38638
38639
38640             behavior.cancel = function() {
38641                 d3_select(window)
38642                     .on('mousemove.drag', null)
38643                     .on('mouseup.drag', null);
38644                 return behavior;
38645             };
38646
38647
38648             behavior.target = function() {
38649                 if (!arguments.length) return _target;
38650                 _target = arguments[0];
38651                 _event = eventOf(_target, Array.prototype.slice.call(arguments, 1));
38652                 return behavior;
38653             };
38654
38655
38656             behavior.surface = function() {
38657                 if (!arguments.length) return _surface;
38658                 _surface = arguments[0];
38659                 return behavior;
38660             };
38661
38662
38663             return utilRebind(behavior, dispatch$1, 'on');
38664         }
38665
38666         function modeDragNode(context) {
38667             var mode = {
38668                 id: 'drag-node',
38669                 button: 'browse'
38670             };
38671             var hover = behaviorHover(context).altDisables(true)
38672                 .on('hover', context.ui().sidebar.hover);
38673             var edit = behaviorEdit(context);
38674
38675             var _nudgeInterval;
38676             var _restoreSelectedIDs = [];
38677             var _wasMidpoint = false;
38678             var _isCancelled = false;
38679             var _activeEntity;
38680             var _startLoc;
38681             var _lastLoc;
38682
38683
38684             function startNudge(entity, nudge) {
38685                 if (_nudgeInterval) window.clearInterval(_nudgeInterval);
38686                 _nudgeInterval = window.setInterval(function() {
38687                     context.pan(nudge);
38688                     doMove(entity, nudge);
38689                 }, 50);
38690             }
38691
38692
38693             function stopNudge() {
38694                 if (_nudgeInterval) {
38695                     window.clearInterval(_nudgeInterval);
38696                     _nudgeInterval = null;
38697                 }
38698             }
38699
38700
38701             function moveAnnotation(entity) {
38702                 return t('operations.move.annotation.' + entity.geometry(context.graph()));
38703             }
38704
38705
38706             function connectAnnotation(nodeEntity, targetEntity) {
38707                 var nodeGeometry = nodeEntity.geometry(context.graph());
38708                 var targetGeometry = targetEntity.geometry(context.graph());
38709                 if (nodeGeometry === 'vertex' && targetGeometry === 'vertex') {
38710                     var nodeParentWayIDs = context.graph().parentWays(nodeEntity);
38711                     var targetParentWayIDs = context.graph().parentWays(targetEntity);
38712                     var sharedParentWays = utilArrayIntersection(nodeParentWayIDs, targetParentWayIDs);
38713                     // if both vertices are part of the same way
38714                     if (sharedParentWays.length !== 0) {
38715                         // if the nodes are next to each other, they are merged
38716                         if (sharedParentWays[0].areAdjacent(nodeEntity.id, targetEntity.id)) {
38717                             return t('operations.connect.annotation.from_vertex.to_adjacent_vertex');
38718                         }
38719                         return t('operations.connect.annotation.from_vertex.to_sibling_vertex');
38720                     }
38721                 }
38722                 return t('operations.connect.annotation.from_' + nodeGeometry + '.to_' + targetGeometry);
38723             }
38724
38725
38726             function shouldSnapToNode(target) {
38727                 if (!_activeEntity) return false;
38728                 return _activeEntity.geometry(context.graph()) !== 'vertex' ||
38729                     (target.geometry(context.graph()) === 'vertex' || context.presets().allowsVertex(target, context.graph()));
38730             }
38731
38732
38733             function origin(entity) {
38734                 return context.projection(entity.loc);
38735             }
38736
38737
38738             function keydown() {
38739                 if (event.keyCode === utilKeybinding.modifierCodes.alt) {
38740                     if (context.surface().classed('nope')) {
38741                         context.surface()
38742                             .classed('nope-suppressed', true);
38743                     }
38744                     context.surface()
38745                         .classed('nope', false)
38746                         .classed('nope-disabled', true);
38747                 }
38748             }
38749
38750
38751             function keyup() {
38752                 if (event.keyCode === utilKeybinding.modifierCodes.alt) {
38753                     if (context.surface().classed('nope-suppressed')) {
38754                         context.surface()
38755                             .classed('nope', true);
38756                     }
38757                     context.surface()
38758                         .classed('nope-suppressed', false)
38759                         .classed('nope-disabled', false);
38760                 }
38761             }
38762
38763
38764             function start(entity) {
38765                 _wasMidpoint = entity.type === 'midpoint';
38766                 var hasHidden = context.features().hasHiddenConnections(entity, context.graph());
38767                 _isCancelled = event.sourceEvent.shiftKey || hasHidden;
38768
38769
38770                 if (_isCancelled) {
38771                     if (hasHidden) {
38772                         uiFlash()
38773                             .duration(4000)
38774                             .text(t('modes.drag_node.connected_to_hidden'))();
38775                     }
38776                     return drag.cancel();
38777                 }
38778
38779                 if (_wasMidpoint) {
38780                     var midpoint = entity;
38781                     entity = osmNode();
38782                     context.perform(actionAddMidpoint(midpoint, entity));
38783                     entity = context.entity(entity.id);   // get post-action entity
38784
38785                     var vertex = context.surface().selectAll('.' + entity.id);
38786                     drag.target(vertex.node(), entity);
38787
38788                 } else {
38789                     context.perform(actionNoop());
38790                 }
38791
38792                 _activeEntity = entity;
38793                 _startLoc = entity.loc;
38794
38795                 hover.ignoreVertex(entity.geometry(context.graph()) === 'vertex');
38796
38797                 context.surface().selectAll('.' + _activeEntity.id)
38798                     .classed('active', true);
38799
38800                 context.enter(mode);
38801             }
38802
38803
38804             // related code
38805             // - `behavior/draw.js` `datum()`
38806             function datum() {
38807                 var event$1 = event && event.sourceEvent;
38808                 if (!event$1 || event$1.altKey) {
38809                     return {};
38810                 } else {
38811                     // When dragging, snap only to touch targets..
38812                     // (this excludes area fills and active drawing elements)
38813                     var d = event$1.target.__data__;
38814                     return (d && d.properties && d.properties.target) ? d : {};
38815                 }
38816             }
38817
38818
38819             function doMove(entity, nudge) {
38820                 nudge = nudge || [0, 0];
38821
38822                 var currPoint = (event && event.point) || context.projection(_lastLoc);
38823                 var currMouse = geoVecSubtract(currPoint, nudge);
38824                 var loc = context.projection.invert(currMouse);
38825
38826                 if (!_nudgeInterval) {   // If not nudging at the edge of the viewport, try to snap..
38827                     // related code
38828                     // - `mode/drag_node.js`     `doMode()`
38829                     // - `behavior/draw.js`      `click()`
38830                     // - `behavior/draw_way.js`  `move()`
38831                     var d = datum();
38832                     var target = d && d.properties && d.properties.entity;
38833                     var targetLoc = target && target.loc;
38834                     var targetNodes = d && d.properties && d.properties.nodes;
38835                     var edge;
38836
38837                     if (targetLoc) {   // snap to node/vertex - a point target with `.loc`
38838                         if (shouldSnapToNode(target)) {
38839                             loc = targetLoc;
38840                         }
38841
38842                     } else if (targetNodes) {   // snap to way - a line target with `.nodes`
38843                         edge = geoChooseEdge(targetNodes, context.mouse(), context.projection, end.id);
38844                         if (edge) {
38845                             loc = edge.loc;
38846                         }
38847                     }
38848                 }
38849
38850                 context.replace(
38851                     actionMoveNode(entity.id, loc)
38852                 );
38853
38854                 // Below here: validations
38855                 var isInvalid = false;
38856
38857                 // Check if this connection to `target` could cause relations to break..
38858                 if (target) {
38859                     isInvalid = hasRelationConflict(entity, target, edge, context.graph());
38860                 }
38861
38862                 // Check if this drag causes the geometry to break..
38863                 if (!isInvalid) {
38864                     isInvalid = hasInvalidGeometry(entity, context.graph());
38865                 }
38866
38867
38868                 var nope = context.surface().classed('nope');
38869                 if (isInvalid === 'relation' || isInvalid === 'restriction') {
38870                     if (!nope) {   // about to nope - show hint
38871                         uiFlash()
38872                             .duration(4000)
38873                             .text(t('operations.connect.' + isInvalid,
38874                                 { relation: context.presets().item('type/restriction').name() }
38875                             ))();
38876                     }
38877                 } else {
38878                     if (nope) {   // about to un-nope, remove hint
38879                         uiFlash()
38880                             .duration(1)
38881                             .text('')();
38882                     }
38883                 }
38884
38885
38886                 var nopeDisabled = context.surface().classed('nope-disabled');
38887                 if (nopeDisabled) {
38888                     context.surface()
38889                         .classed('nope', false)
38890                         .classed('nope-suppressed', isInvalid);
38891                 } else {
38892                     context.surface()
38893                         .classed('nope', isInvalid)
38894                         .classed('nope-suppressed', false);
38895                 }
38896
38897                 _lastLoc = loc;
38898             }
38899
38900
38901             // Uses `actionConnect.disabled()` to know whether this connection is ok..
38902             function hasRelationConflict(entity, target, edge, graph) {
38903                 var testGraph = graph.update();  // copy
38904
38905                 // if snapping to way - add midpoint there and consider that the target..
38906                 if (edge) {
38907                     var midpoint = osmNode();
38908                     var action = actionAddMidpoint({
38909                         loc: edge.loc,
38910                         edge: [target.nodes[edge.index - 1], target.nodes[edge.index]]
38911                     }, midpoint);
38912
38913                     testGraph = action(testGraph);
38914                     target = midpoint;
38915                 }
38916
38917                 // can we connect to it?
38918                 var ids = [entity.id, target.id];
38919                 return actionConnect(ids).disabled(testGraph);
38920             }
38921
38922
38923             function hasInvalidGeometry(entity, graph) {
38924                 var parents = graph.parentWays(entity);
38925                 var i, j, k;
38926
38927                 for (i = 0; i < parents.length; i++) {
38928                     var parent = parents[i];
38929                     var nodes = [];
38930                     var activeIndex = null;    // which multipolygon ring contains node being dragged
38931
38932                     // test any parent multipolygons for valid geometry
38933                     var relations = graph.parentRelations(parent);
38934                     for (j = 0; j < relations.length; j++) {
38935                         if (!relations[j].isMultipolygon()) continue;
38936
38937                         var rings = osmJoinWays(relations[j].members, graph);
38938
38939                         // find active ring and test it for self intersections
38940                         for (k = 0; k < rings.length; k++) {
38941                             nodes = rings[k].nodes;
38942                             if (nodes.find(function(n) { return n.id === entity.id; })) {
38943                                 activeIndex = k;
38944                                 if (geoHasSelfIntersections(nodes, entity.id)) {
38945                                     return true;
38946                                 }
38947                             }
38948                             rings[k].coords = nodes.map(function(n) { return n.loc; });
38949                         }
38950
38951                         // test active ring for intersections with other rings in the multipolygon
38952                         for (k = 0; k < rings.length; k++) {
38953                             if (k === activeIndex) continue;
38954
38955                             // make sure active ring doesnt cross passive rings
38956                             if (geoHasLineIntersections(rings[activeIndex].nodes, rings[k].nodes, entity.id)) {
38957                                 return true;
38958                             }
38959                         }
38960                     }
38961
38962
38963                     // If we still haven't tested this node's parent way for self-intersections.
38964                     // (because it's not a member of a multipolygon), test it now.
38965                     if (activeIndex === null) {
38966                         nodes = parent.nodes.map(function(nodeID) { return graph.entity(nodeID); });
38967                         if (nodes.length && geoHasSelfIntersections(nodes, entity.id)) {
38968                             return true;
38969                         }
38970                     }
38971
38972                 }
38973
38974                 return false;
38975             }
38976
38977
38978             function move(entity) {
38979                 if (_isCancelled) return;
38980                 event.sourceEvent.stopPropagation();
38981
38982                 context.surface().classed('nope-disabled', event.sourceEvent.altKey);
38983
38984                 _lastLoc = context.projection.invert(event.point);
38985
38986                 doMove(entity);
38987                 var nudge = geoViewportEdge(event.point, context.map().dimensions());
38988                 if (nudge) {
38989                     startNudge(entity, nudge);
38990                 } else {
38991                     stopNudge();
38992                 }
38993             }
38994
38995             function end(entity) {
38996                 if (_isCancelled) return;
38997
38998                 var d = datum();
38999                 var nope = (d && d.properties && d.properties.nope) || context.surface().classed('nope');
39000                 var target = d && d.properties && d.properties.entity;   // entity to snap to
39001
39002                 if (nope) {   // bounce back
39003                     context.perform(
39004                         _actionBounceBack(entity.id, _startLoc)
39005                     );
39006
39007                 } else if (target && target.type === 'way') {
39008                     var choice = geoChooseEdge(context.childNodes(target), context.mouse(), context.projection, entity.id);
39009                     context.replace(
39010                         actionAddMidpoint({
39011                             loc: choice.loc,
39012                             edge: [target.nodes[choice.index - 1], target.nodes[choice.index]]
39013                         }, entity),
39014                         connectAnnotation(entity, target)
39015                     );
39016
39017                 } else if (target && target.type === 'node' && shouldSnapToNode(target)) {
39018                     context.replace(
39019                         actionConnect([target.id, entity.id]),
39020                         connectAnnotation(entity, target)
39021                     );
39022
39023                 } else if (_wasMidpoint) {
39024                     context.replace(
39025                         actionNoop(),
39026                         t('operations.add.annotation.vertex')
39027                     );
39028
39029                 } else {
39030                     context.replace(
39031                         actionNoop(),
39032                         moveAnnotation(entity)
39033                     );
39034                 }
39035
39036                 var reselection = _restoreSelectedIDs.filter(function(id) {
39037                     return context.graph().hasEntity(id);
39038                 });
39039
39040                 if (reselection.length) {
39041                     context.enter(modeSelect(context, reselection));
39042                 } else {
39043                     context.enter(modeBrowse(context));
39044                 }
39045             }
39046
39047
39048             function _actionBounceBack(nodeID, toLoc) {
39049                 var moveNode = actionMoveNode(nodeID, toLoc);
39050                 var action = function(graph, t) {
39051                     // last time through, pop off the bounceback perform.
39052                     // it will then overwrite the initial perform with a moveNode that does nothing
39053                     if (t === 1) context.pop();
39054                     return moveNode(graph, t);
39055                 };
39056                 action.transitionable = true;
39057                 return action;
39058             }
39059
39060
39061             function cancel() {
39062                 drag.cancel();
39063                 context.enter(modeBrowse(context));
39064             }
39065
39066
39067             var drag = behaviorDrag()
39068                 .selector('.layer-touch.points .target')
39069                 .surface(d3_select('#map').node())
39070                 .origin(origin)
39071                 .on('start', start)
39072                 .on('move', move)
39073                 .on('end', end);
39074
39075
39076             mode.enter = function() {
39077                 context.install(hover);
39078                 context.install(edit);
39079
39080                 d3_select(window)
39081                     .on('keydown.drawWay', keydown)
39082                     .on('keyup.drawWay', keyup);
39083
39084                 context.history()
39085                     .on('undone.drag-node', cancel);
39086             };
39087
39088
39089             mode.exit = function() {
39090                 context.ui().sidebar.hover.cancel();
39091                 context.uninstall(hover);
39092                 context.uninstall(edit);
39093
39094                 d3_select(window)
39095                     .on('keydown.hover', null)
39096                     .on('keyup.hover', null);
39097
39098                 context.history()
39099                     .on('undone.drag-node', null);
39100
39101                 _activeEntity = null;
39102
39103                 context.surface()
39104                     .classed('nope', false)
39105                     .classed('nope-suppressed', false)
39106                     .classed('nope-disabled', false)
39107                     .selectAll('.active')
39108                     .classed('active', false);
39109
39110                 stopNudge();
39111             };
39112
39113
39114             mode.selectedIDs = function() {
39115                 if (!arguments.length) return _activeEntity ? [_activeEntity.id] : [];
39116                 // no assign
39117                 return mode;
39118             };
39119
39120
39121             mode.activeID = function() {
39122                 if (!arguments.length) return _activeEntity && _activeEntity.id;
39123                 // no assign
39124                 return mode;
39125             };
39126
39127
39128             mode.restoreSelectedIDs = function(_) {
39129                 if (!arguments.length) return _restoreSelectedIDs;
39130                 _restoreSelectedIDs = _;
39131                 return mode;
39132             };
39133
39134
39135             mode.behavior = drag;
39136
39137
39138             return mode;
39139         }
39140
39141         var localizeStrings = {"this node":"this_node","this way":"this_way","this relation":"this_relation","this one-way":"this_oneway","this highway":"this_highway","this railway":"this_railway","this waterway":"this_waterway","this cycleway":"this_cycleway","this footpath":"this_footpath","this cycleway/footpath":"this_cycleway_footpath","this riverbank":"this_riverbank","this crossing":"this_crossing","this railway crossing":"this_railway_crossing","this bridge":"this_bridge","this tunnel":"this_tunnel","this boundary":"this_boundary","this turn-restriction":"this_turn_restriction","this roundabout":"this_roundabout","this mini-roundabout":"this_mini_roundabout","this track":"this_track","this feature":"this_feature",highway:"highway",railway:"railway",waterway:"waterway",cycleway:"cycleway",cycleway_footpath:"cycleway/footpath",riverbank:"riverbank",place_of_worship:"place_of_worship",pub:"pub",restaurant:"restaurant",school:"school",university:"university",hospital:"hospital",library:"library",theatre:"theatre",courthouse:"courthouse",bank:"bank",cinema:"cinema",pharmacy:"pharmacy",cafe:"cafe",fast_food:"fast_food",fuel:"fuel",from:"from",to:"to","left-hand":"left_hand","right-hand":"right_hand"};
39142         var errorTypes = {"20":{title:"multiple nodes on the same spot",severity:"warning",description:"There is more than one node in this spot. Offending node IDs: $1",IDs:["20"],regex:"IDs: ((?:#\\d+,?)+)"},"30":{title:"non-closed_areas",severity:"error",description:"This way is tagged with '$1' and should be closed-loop.",IDs:["this",""],regex:"(this way) is tagged with '(.+)'"},"40":{title:"dead-ended one-ways",severity:"error",description:"The first node (id $1) of this one-way is not connected to any other way",IDs:["n","this"],regex:"\\(id (\\d+)\\) of (this one-way)"},"41":{title:"",severity:"error",description:"The last node (id $1) of this one-way is not connected to any other way",IDs:["n","this"],regex:"\\(id (\\d+)\\) of (this one-way)"},"42":{title:"",severity:"error",description:"This node cannot be reached because one-ways only lead away from here",IDs:["this"],regex:"(this node)"},"43":{title:"",severity:"error",description:"You cannot escape from this node because one-ways only lead to here",IDs:["this"],regex:"(this node)"},"50":{title:"almost-junctions",severity:"error",description:"This node is very close but not connected to way #$1",IDs:["this","w"],regex:"(this node) is very close but not connected to way #(\\d+)"},"60":{title:"deprecated tags",severity:"warning",description:"This $1 uses deprecated tag $2. Please use $3 instead!",IDs:["this","",""],regex:"(this (?:node|way|relation)) uses deprecated tag '(.+)'\\. Please use &quot;(.+)&quot;"},"70":{title:"missing tags",severity:"error",description:"This $1 has an empty tag: $2",IDs:["this",""],regex:"(this (?:node|way|relation)) has an empty tag: &quot;(.+)=&quot;"},"71":{title:"",severity:"error",description:"This way has no tags",IDs:["this"],regex:"(this way)"},"72":{title:"",severity:"error",description:"This node is not member of any way and does not have any tags",IDs:["this"],regex:"(this node)"},"73":{title:"",severity:"error",description:"This way has a $1 tag but no highway tag",IDs:["this",""],regex:"(this way) has a (.+) tag"},"74":{title:"missing tags",severity:"error",description:"This $1 has an empty tag: $2",IDs:["this",""],regex:"(this (?:node|way|relation)) has an empty tag: &quot;(.+)=&quot;"},"75":{description:"This (node|way|relation) has a name \\((.+)\\) but no other tag",IDs:["this",""],regex:"(this (?:node|way|relation)) has a name \\((.+)\\)"},"90":{title:"motorways without ref",severity:"error",description:"This way is tagged as motorway and therefore needs a ref nat_ref or int_ref tag",IDs:["this"],regex:"(this way)"},"100":{title:"places of worship without religion",severity:"error",description:"This $1 is tagged as place of worship and therefore needs a religion tag",IDs:["this"],regex:"(this (?:node|way|relation))"},"110":{title:"point of interest without name",severity:"error",description:"This node is tagged as $1 and therefore needs a name tag",IDs:["this",""],regex:"(this (?:node|way|relation)) is tagged as (.+) and"},"120":{title:"ways without nodes",severity:"error",description:"This way has just one single node",IDs:["this"],regex:"(this way)"},"130":{title:"floating islands",severity:"error",description:"This way is not connected to the rest of the map",IDs:["this"],regex:"(this way)"},"150":{title:"railway crossing without tag",severity:"error",description:"This crossing of a highway and a railway needs to be tagged as railway=crossing or railway=level_crossing",IDs:["this"],regex:"(this crossing)"},"160":{title:"wrongly used railway tag",severity:"error",description:"There are ways in different layers coming together in this railway crossing. There are ways tagged as tunnel or bridge coming together in this railway crossing",IDs:["this"],regex:"(this railway crossing)"},"170":{title:"FIXME tagged items",severity:"error",description:"This feature has a FIXME tag: (.*)",IDs:["this"],regex:"(this feature) has a FIXME tag: (.*)"},"180":{title:"relations without type",severity:"error",description:"This relation has no type tag which is mandatory for relations",IDs:["this"],regex:"(this relation)"},"190":{title:"intersections without junctions",severity:"error",description:"This $1 intersects the $2 #$3 but there is no junction node",IDs:["this","","w"],regex:"(this .+) intersects the (.+) #(\\d+)"},"200":{title:"overlapping ways",severity:"error",description:"This $1 overlaps the $2 #$3",IDs:["this","","w"],regex:"(this .+) overlaps the (.+) #(\\d+)"},"210":{title:"loopings",severity:"error",description:"These errors contain self intersecting ways"},"211":{title:"",severity:"error",description:"This way contains more than one node at least twice. Nodes are $1.",IDs:["this","211"],regex:"(this way) contains more than one node at least twice. Nodes are ((?:#\\d+(?:, )?)+)\\."},"212":{title:"",severity:"error",description:"This way has only two different nodes and contains one of them more than once",IDs:["this"],regex:"(this way)"},"220":{title:"misspelled tags",severity:"error",description:"This $1 is tagged '$2' where $3 looks like $4",regex:"(this (?:node|way|relation)) is tagged '(.+)' where &quot;(.+)&quot; looks like &quot;(.+)&quot;"},"221":{title:"",severity:"error",description:"The key of this $1's tag is 'key': $2",regex:"(this (?:node|way|relation))\\'s tag is \\'key\\': (.+)"},"230":{title:"layer conflicts",severity:"error",description:"This node is a junction of ways on different layers.",IDs:["this"],regex:"(this node)"},"231":{title:"mixed layers intersection",severity:"error",description:"This node is a junction of ways on different layers: $1",IDs:["this","231"],regex:"(this node) is a junction of ways on different layers: (.+)"},"232":{title:"strange layers",severity:"error",description:"This $1 is tagged with layer $2. This need not be an error, but it looks strange",IDs:["this",""],regex:"(this (?:bridge|tunnel)) is tagged with layer (-?\\d+)\\."},"270":{title:"motorways connected directly",severity:"error",description:"This node is a junction of a motorway and a highway other than motorway, motorway_link, trunk, rest_area or construction. Service or unclassified is only valid if it has access=no/private or it leads to a motorway service area or if it is a service=parking_aisle.",IDs:["this"],regex:"(this node)"},"280":{title:"boundaries",severity:"error",description:"Administrative Boundaries can be expressed either by tagging ways or by adding them to a relation. They should be closed-loop sequences of ways, they must not self-intersect or split and they must have a name and an admin_level."},"281":{title:"missing name",severity:"error",description:"This boundary has no name",IDs:["this"],regex:"(this boundary)"},"282":{title:"missing admin level",severity:"error",description:"The boundary of $1 has no (?:valid numeric)?admin_level",regex:"of (.+) has"},"283":{title:"no closed loop",severity:"error",description:"The boundary of $1 is not closed-loop",regex:"boundary of (.+) is"},"284":{title:"splitting boundary",severity:"error",description:"The boundary of $1 splits here",regex:"boundary of (.+) splits"},"285":{title:"admin_level too high",severity:"error",description:"This boundary-way has admin_level $1 but belongs to a relation with lower admin_level (higher priority); it should have the lowest admin_level of all relations",IDs:["this",""],regex:"(this boundary)-way has admin_level (-?\\d+) but"},"290":{title:"restrictions",severity:"error",description:"Analyses all relations tagged type=restriction or following variations type=restriction:hgv type=restriction:caravan type=restriction:motorcar type=restriction:bus type=restriction:agricultural type=restriction:motorcycle type=restriction:bicycle and type=restriction:hazmat"},"291":{title:"missing type",severity:"error",description:"This turn-restriction has no (?:known )?restriction type",IDs:["this"],regex:"(this turn-restriction) has"},"292":{title:"missing from way",severity:"error",description:"This turn-restriction needs exactly one from member. This one has $1",IDs:["this",""],regex:"(this turn-restriction) needs.+has (\\d+)"},"293":{title:"missing to way",severity:"error",description:"This turn-restriction needs exactly one to member. This one has $1",IDs:["this",""],regex:"(this turn-restriction) needs.+has (\\d+)"},"294":{title:"from or to not a way",severity:"error",description:"From- and To-members of this turn-restriction need to be ways. $1",IDs:["this","294"],regex:"(this turn-restriction)~.+ways\\. ((?:(?:from|to) (?:node|relation) #\\d+,?)+)"},"295":{title:"via is not on the way ends",severity:"error",description:"via (node #$1) is not the first or the last member of (from|to) (way #$3)",IDs:["this","n","","w"],regex:"(this turn-restriction)~via \\(node #(\\d+)\\).+ of (from|to) \\(way #(\\d+)\\)"},"296":{title:"wrong restriction angle",severity:"error",description:"This turn-restriction type is $1, but angle is $2 degrees. Maybe the restriction type is not appropriate?",IDs:["this","",""],regex:"(this turn-restriction)~.+is (\\w+), but angle is (-?\\d+)"},"297":{title:"wrong direction of to member",severity:"error",description:"wrong direction of to way $1",IDs:["this","w"],regex:"(this turn-restriction)~.+to way (\\d+)"},"298":{title:"already restricted by oneway",severity:"error",description:"entry already prohibited by oneway tag on $1",IDs:["this","w"],regex:"(this turn-restriction)~.+tag on (\\d+)"},"300":{title:"missing maxspeed",severity:"warning",description:"This highway is missing a maxspeed tag",IDs:["this"],regex:"(this highway)"},"310":{title:"roundabouts",severity:"error",description:"Analyses ways with tag junction=roundabout. More then one way can form a roundabout. It supports tag oneway=-1"},"311":{title:"not closed loop",severity:"error",description:"This way is part of a roundabout but is not closed-loop. (split carriageways approaching a roundabout should not be tagged as roundabout)",IDs:["this"],regex:"(this way)"},"312":{title:"wrong direction",severity:"error",description:"If this ((?:mini_)?roundabout) is in a country with (left|right)-hand traffic then its orientation goes the wrong way around",IDs:["this",""],regex:"(this (?:mini_)?roundabout) is in a country with ((?:left|right)-hand)"},"313":{title:"faintly connected",severity:"error",description:"This roundabout has only $1 other roads connected. Roundabouts typically have three",IDs:["this",""],regex:"(this roundabout) has only (\\d) other"},"320":{title:"*_link connections",severity:"error",description:"This way is tagged as highway=$1_link but doesn't have a connection to any other $1 or $1_link",IDs:["this","","","",""],regex:"(this way) is tagged as (highway=.+) but doesn't have a connection to any other (.+) or (.+)"},"350":{title:"bridge-tags",severity:"error",description:"This bridge does not have a tag in common with its surrounding ways that shows the purpose of this bridge. There should be one of these tags: (.+)",NOTE:"Group can be arbitrary list of form: key=value,key=value,key=value...",IDs:["this",""],regex:"(this bridge).*tags: (.+)"},"360":{title:"language unknown",severity:"warning",description:"It would be nice if this (node|way|relation) had an additional tag 'name:XX=(.+)' where XX shows the language of its name '\\2'",IDs:["this",""],regex:"(this (?:node|way|relation)) had an additional tag 'name:XX=(.+)' where"},"370":{title:"doubled places",severity:"error",description:"This node has tags in common with the surrounding way #$1 ((?:\\(including the name '.+'\\) )?)and seems to be redundand",IDs:["this","w","370"],regex:"(this node) has tags in common with the surrounding way #(\\d+) ((?:\\(including the name '.+'\\) )?)and"},"380":{title:"non-physical use of sport-tag",severity:"error",description:"This way is tagged sport=$1 but has no physical tag like e.g. leisure, building, amenity or highway",IDs:["this",""],regex:"(this way) is tagged (sport=.+) but"},"390":{title:"missing tracktype",severity:"warning",description:"This track doesn''t have a tracktype",IDs:["this"],regex:"(this track)"},"400":{title:"geometry glitches",severity:"error",description:""},"401":{title:"missing turn restriction",severity:"error",description:"ways $1 and $2 join in a very sharp angle here and there is no oneway tag or turn restriction that prevents turning( from way (\\1|\\2) to (\\1|\\2))?",IDs:["w","w"],regex:"ways (\\d+) and (\\d+) join"},"402":{title:"impossible angles",severity:"error",description:"this way bends in a very sharp angle here",IDs:["this"],regex:"(this way)"},"410":{title:"website",severity:"error",description:"Web pages are analyzed. Web page is defined by any of the following tags website=* url=* website:mobile=* contact:website=* contact:url=* image=* source:website=* or source:url=*"},"411":{title:"http error",severity:"error",description:"The URL (<a target=_blank href=$1>$1</a>) cannot be opened (HTTP status code $2)",IDs:["this","url",""],regex:"(this feature)~.+ href=([^>]+)>.+ code (\\d+)\\)"},"412":{title:"domain hijacking",severity:"error",description:"Possible domain squatting: <a target=_blank href=$1>$1</a>. Suspicious text is: \"$2\"",IDs:["this","url",""],regex:"(this feature)~.+ href=([^>]+)>.+ is: &quot;(.+)&quot;"},"413":{title:"non-match",severity:"error",description:"Content of the URL (<a target=_blank href=$1>$1</a>) did not contain these keywords: ($2)",IDs:["this","url",""],regex:"(this feature)~.+ href=([^>]+)>.+ keywords: \\((.+)\\)"}};
39143
39144         var tiler = utilTiler();
39145         var dispatch$1 = dispatch('loaded');
39146
39147         var _krCache;
39148         var _krZoom = 14;
39149         var _krUrlRoot = 'https://www.keepright.at/';
39150
39151         var _krRuleset = [
39152             // no 20 - multiple node on same spot - these are mostly boundaries overlapping roads
39153             30, 40, 50, 60, 70, 90, 100, 110, 120, 130, 150, 160, 170, 180,
39154             190, 191, 192, 193, 194, 195, 196, 197, 198,
39155             200, 201, 202, 203, 204, 205, 206, 207, 208, 210, 220,
39156             230, 231, 232, 270, 280, 281, 282, 283, 284, 285,
39157             290, 291, 292, 293, 294, 295, 296, 297, 298, 300, 310, 311, 312, 313,
39158             320, 350, 360, 370, 380, 390, 400, 401, 402, 410, 411, 412, 413
39159         ];
39160
39161
39162         function abortRequest(controller) {
39163             if (controller) {
39164                 controller.abort();
39165             }
39166         }
39167
39168         function abortUnwantedRequests(cache, tiles) {
39169             Object.keys(cache.inflightTile).forEach(function(k) {
39170                 var wanted = tiles.find(function(tile) { return k === tile.id; });
39171                 if (!wanted) {
39172                     abortRequest(cache.inflightTile[k]);
39173                     delete cache.inflightTile[k];
39174                 }
39175             });
39176         }
39177
39178
39179         function encodeErrorRtree(d) {
39180             return { minX: d.loc[0], minY: d.loc[1], maxX: d.loc[0], maxY: d.loc[1], data: d };
39181         }
39182
39183
39184         // replace or remove error from rtree
39185         function updateRtree(item, replace) {
39186             _krCache.rtree.remove(item, function isEql(a, b) {
39187                 return a.data.id === b.data.id;
39188             });
39189
39190             if (replace) {
39191                 _krCache.rtree.insert(item);
39192             }
39193         }
39194
39195
39196         function tokenReplacements(d) {
39197             if (!(d instanceof qaError)) return;
39198
39199             var htmlRegex = new RegExp(/<\/[a-z][\s\S]*>/);
39200             var replacements = {};
39201
39202             var errorTemplate = errorTypes[d.which_type];
39203             if (!errorTemplate) {
39204                 /* eslint-disable no-console */
39205                 console.log('No Template: ', d.which_type);
39206                 console.log('  ', d.description);
39207                 /* eslint-enable no-console */
39208                 return;
39209             }
39210
39211             // some descriptions are just fixed text
39212             if (!errorTemplate.regex) return;
39213
39214             // regex pattern should match description with variable details captured
39215             var errorRegex = new RegExp(errorTemplate.regex, 'i');
39216             var errorMatch = errorRegex.exec(d.description);
39217             if (!errorMatch) {
39218                 /* eslint-disable no-console */
39219                 console.log('Unmatched: ', d.which_type);
39220                 console.log('  ', d.description);
39221                 console.log('  ', errorRegex);
39222                 /* eslint-enable no-console */
39223                 return;
39224             }
39225
39226             for (var i = 1; i < errorMatch.length; i++) {   // skip first
39227                 var capture = errorMatch[i];
39228                 var idType;
39229
39230                 idType = 'IDs' in errorTemplate ? errorTemplate.IDs[i-1] : '';
39231                 if (idType && capture) {   // link IDs if present in the capture
39232                     capture = parseError(capture, idType);
39233                 } else if (htmlRegex.test(capture)) {   // escape any html in non-IDs
39234                     capture = '\\' +  capture + '\\';
39235                 } else {
39236                     var compare = capture.toLowerCase();
39237                     if (localizeStrings[compare]) {   // some replacement strings can be localized
39238                         capture = t('QA.keepRight.error_parts.' + localizeStrings[compare]);
39239                     }
39240                 }
39241
39242                 replacements['var' + i] = capture;
39243             }
39244
39245             return replacements;
39246         }
39247
39248
39249         function parseError(capture, idType) {
39250             var compare = capture.toLowerCase();
39251             if (localizeStrings[compare]) {   // some replacement strings can be localized
39252                 capture = t('QA.keepRight.error_parts.' + localizeStrings[compare]);
39253             }
39254
39255             switch (idType) {
39256                 // link a string like "this node"
39257                 case 'this':
39258                     capture = linkErrorObject(capture);
39259                     break;
39260
39261                 case 'url':
39262                     capture = linkURL(capture);
39263                     break;
39264
39265                 // link an entity ID
39266                 case 'n':
39267                 case 'w':
39268                 case 'r':
39269                     capture = linkEntity(idType + capture);
39270                     break;
39271
39272                 // some errors have more complex ID lists/variance
39273                 case '20':
39274                     capture = parse20(capture);
39275                     break;
39276                 case '211':
39277                     capture = parse211(capture);
39278                     break;
39279                 case '231':
39280                     capture = parse231(capture);
39281                     break;
39282                 case '294':
39283                     capture = parse294(capture);
39284                     break;
39285                 case '370':
39286                     capture = parse370(capture);
39287                     break;
39288             }
39289
39290             return capture;
39291
39292
39293             function linkErrorObject(d) {
39294                 return '<a class="error_object_link">' + d + '</a>';
39295             }
39296
39297             function linkEntity(d) {
39298                 return '<a class="error_entity_link">' + d + '</a>';
39299             }
39300
39301             function linkURL(d) {
39302                 return '<a class="kr_external_link" target="_blank" href="' + d + '">' + d + '</a>';
39303             }
39304
39305             // arbitrary node list of form: #ID, #ID, #ID...
39306             function parse211(capture) {
39307                 var newList = [];
39308                 var items = capture.split(', ');
39309
39310                 items.forEach(function(item) {
39311                     // ID has # at the front
39312                     var id = linkEntity('n' + item.slice(1));
39313                     newList.push(id);
39314                 });
39315
39316                 return newList.join(', ');
39317             }
39318
39319             // arbitrary way list of form: #ID(layer),#ID(layer),#ID(layer)...
39320             function parse231(capture) {
39321                 var newList = [];
39322                 // unfortunately 'layer' can itself contain commas, so we split on '),'
39323                 var items = capture.split('),');
39324
39325                 items.forEach(function(item) {
39326                     var match = item.match(/\#(\d+)\((.+)\)?/);
39327                     if (match !== null && match.length > 2) {
39328                         newList.push(linkEntity('w' + match[1]) + ' ' +
39329                             t('QA.keepRight.errorTypes.231.layer', { layer: match[2] })
39330                         );
39331                     }
39332                 });
39333
39334                 return newList.join(', ');
39335             }
39336
39337             // arbitrary node/relation list of form: from node #ID,to relation #ID,to node #ID...
39338             function parse294(capture) {
39339                 var newList = [];
39340                 var items = capture.split(',');
39341
39342                 items.forEach(function(item) {
39343                     var role;
39344                     var idType;
39345                     var id;
39346
39347                     // item of form "from/to node/relation #ID"
39348                     item = item.split(' ');
39349
39350                     // to/from role is more clear in quotes
39351                     role = '"' + item[0] + '"';
39352
39353                     // first letter of node/relation provides the type
39354                     idType = item[1].slice(0,1);
39355
39356                     // ID has # at the front
39357                     id = item[2].slice(1);
39358                     id = linkEntity(idType + id);
39359
39360                     item = [role, item[1], id].join(' ');
39361                     newList.push(item);
39362                 });
39363
39364                 return newList.join(', ');
39365             }
39366
39367             // may or may not include the string "(including the name 'name')"
39368             function parse370(capture) {
39369                 if (!capture) return '';
39370
39371                 var match = capture.match(/\(including the name (\'.+\')\)/);
39372                 if (match !== null && match.length) {
39373                     return t('QA.keepRight.errorTypes.370.including_the_name', { name: match[1] });
39374                 }
39375                 return '';
39376             }
39377
39378             // arbitrary node list of form: #ID,#ID,#ID...
39379             function parse20(capture) {
39380                 var newList = [];
39381                 var items = capture.split(',');
39382
39383                 items.forEach(function(item) {
39384                     // ID has # at the front
39385                     var id = linkEntity('n' + item.slice(1));
39386                     newList.push(id);
39387                 });
39388
39389                 return newList.join(', ');
39390             }
39391         }
39392
39393
39394         var serviceKeepRight = {
39395             init: function() {
39396                 if (!_krCache) {
39397                     this.reset();
39398                 }
39399
39400                 this.event = utilRebind(this, dispatch$1, 'on');
39401             },
39402
39403             reset: function() {
39404                 if (_krCache) {
39405                     Object.values(_krCache.inflightTile).forEach(abortRequest);
39406                 }
39407
39408                 _krCache = {
39409                     data: {},
39410                     loadedTile: {},
39411                     inflightTile: {},
39412                     inflightPost: {},
39413                     closed: {},
39414                     rtree: rbush_1()
39415                 };
39416             },
39417
39418
39419             // KeepRight API:  http://osm.mueschelsoft.de/keepright/interfacing.php
39420             loadErrors: function(projection) {
39421                 var options = { format: 'geojson' };
39422                 var rules = _krRuleset.join();
39423
39424                 // determine the needed tiles to cover the view
39425                 var tiles = tiler
39426                     .zoomExtent([_krZoom, _krZoom])
39427                     .getTiles(projection);
39428
39429                 // abort inflight requests that are no longer needed
39430                 abortUnwantedRequests(_krCache, tiles);
39431
39432                 // issue new requests..
39433                 tiles.forEach(function(tile) {
39434                     if (_krCache.loadedTile[tile.id] || _krCache.inflightTile[tile.id]) return;
39435
39436                     var rect = tile.extent.rectangle();
39437                     var params = Object.assign({}, options, { left: rect[0], bottom: rect[3], right: rect[2], top: rect[1] });
39438                     var url = _krUrlRoot + 'export.php?' + utilQsString(params) + '&ch=' + rules;
39439
39440                     var controller = new AbortController();
39441                     _krCache.inflightTile[tile.id] = controller;
39442
39443                     d3_json(url, { signal: controller.signal })
39444                         .then(function(data) {
39445                             delete _krCache.inflightTile[tile.id];
39446                             _krCache.loadedTile[tile.id] = true;
39447                             if (!data || !data.features || !data.features.length) {
39448                                 throw new Error('No Data');
39449                             }
39450
39451                             data.features.forEach(function(feature) {
39452                                 var loc = feature.geometry.coordinates;
39453                                 var props = feature.properties;
39454
39455                                 // if there is a parent, save its error type e.g.:
39456                                 //  Error 191 = "highway-highway"
39457                                 //  Error 190 = "intersections without junctions"  (parent)
39458                                 var errorType = props.error_type;
39459                                 var errorTemplate = errorTypes[errorType];
39460                                 var parentErrorType = (Math.floor(errorType / 10) * 10).toString();
39461
39462                                 // try to handle error type directly, fallback to parent error type.
39463                                 var whichType = errorTemplate ? errorType : parentErrorType;
39464                                 var whichTemplate = errorTypes[whichType];
39465
39466                                 // Rewrite a few of the errors at this point..
39467                                 // This is done to make them easier to linkify and translate.
39468                                 switch (whichType) {
39469                                     case '170':
39470                                         props.description = 'This feature has a FIXME tag: ' + props.description;
39471                                         break;
39472                                     case '292':
39473                                     case '293':
39474                                         props.description = props.description.replace('A turn-', 'This turn-');
39475                                         break;
39476                                     case '294':
39477                                     case '295':
39478                                     case '296':
39479                                     case '297':
39480                                     case '298':
39481                                         props.description = 'This turn-restriction~' + props.description;
39482                                         break;
39483                                     case '300':
39484                                         props.description = 'This highway is missing a maxspeed tag';
39485                                         break;
39486                                     case '411':
39487                                     case '412':
39488                                     case '413':
39489                                         props.description = 'This feature~' + props.description;
39490                                         break;
39491                                 }
39492
39493                                 // - move markers slightly so it doesn't obscure the geometry,
39494                                 // - then move markers away from other coincident markers
39495                                 var coincident = false;
39496                                 do {
39497                                     // first time, move marker up. after that, move marker right.
39498                                     var delta = coincident ? [0.00001, 0] : [0, 0.00001];
39499                                     loc = geoVecAdd(loc, delta);
39500                                     var bbox = geoExtent(loc).bbox();
39501                                     coincident = _krCache.rtree.search(bbox).length;
39502                                 } while (coincident);
39503
39504                                 var d = new qaError({
39505                                     // Required values
39506                                     loc: loc,
39507                                     service: 'keepRight',
39508                                     error_type: errorType,
39509                                     // Extra values for this service
39510                                     id: props.error_id,
39511                                     comment: props.comment || null,
39512                                     description: props.description || '',
39513                                     error_id: props.error_id,
39514                                     which_type: whichType,
39515                                     parent_error_type: parentErrorType,
39516                                     severity: whichTemplate.severity || 'error',
39517                                     object_id: props.object_id,
39518                                     object_type: props.object_type,
39519                                     schema: props.schema,
39520                                     title: props.title
39521                                 });
39522
39523                                 d.replacements = tokenReplacements(d);
39524
39525                                 _krCache.data[d.id] = d;
39526                                 _krCache.rtree.insert(encodeErrorRtree(d));
39527                             });
39528
39529                             dispatch$1.call('loaded');
39530                         })
39531                         .catch(function() {
39532                             delete _krCache.inflightTile[tile.id];
39533                             _krCache.loadedTile[tile.id] = true;
39534                         });
39535
39536                 });
39537             },
39538
39539
39540             postKeepRightUpdate: function(d, callback) {
39541                 if (_krCache.inflightPost[d.id]) {
39542                     return callback({ message: 'Error update already inflight', status: -2 }, d);
39543                 }
39544
39545                 var that = this;
39546                 var params = { schema: d.schema, id: d.error_id };
39547
39548                 if (d.state) {
39549                     params.st = d.state;
39550                 }
39551                 if (d.newComment !== undefined) {
39552                     params.co = d.newComment;
39553                 }
39554
39555                 // NOTE: This throws a CORS err, but it seems successful.
39556                 // We don't care too much about the response, so this is fine.
39557                 var url = _krUrlRoot + 'comment.php?' + utilQsString(params);
39558
39559                 var controller = new AbortController();
39560                 _krCache.inflightPost[d.id] = controller;
39561
39562                 fetch(url, { method: 'POST', signal: controller.signal })
39563                     .then(function(response) {
39564                         delete _krCache.inflightPost[d.id];
39565                         if (!response.ok) {
39566                             throw new Error(response.status + ' ' + response.statusText);
39567                         }
39568
39569                         if (d.state === 'ignore') {   // ignore permanently (false positive)
39570                             that.removeError(d);
39571
39572                         } else if (d.state === 'ignore_t') {  // ignore temporarily (error fixed)
39573                             that.removeError(d);
39574                             _krCache.closed[d.schema + ':' + d.error_id] = true;
39575
39576                         } else {
39577                             d = that.replaceError(d.update({
39578                                 comment: d.newComment,
39579                                 newComment: undefined,
39580                                 state: undefined
39581                             }));
39582                         }
39583
39584                         if (callback) callback(null, d);
39585                     })
39586                     .catch(function(err) {
39587                         delete _krCache.inflightPost[d.id];
39588                         if (callback) callback(err.message);
39589                     });
39590             },
39591
39592
39593             // get all cached errors covering the viewport
39594             getErrors: function(projection) {
39595                 var viewport = projection.clipExtent();
39596                 var min = [viewport[0][0], viewport[1][1]];
39597                 var max = [viewport[1][0], viewport[0][1]];
39598                 var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
39599
39600                 return _krCache.rtree.search(bbox).map(function(d) {
39601                     return d.data;
39602                 });
39603             },
39604
39605
39606             // get a single error from the cache
39607             getError: function(id) {
39608                 return _krCache.data[id];
39609             },
39610
39611
39612             // replace a single error in the cache
39613             replaceError: function(error) {
39614                 if (!(error instanceof qaError) || !error.id) return;
39615
39616                 _krCache.data[error.id] = error;
39617                 updateRtree(encodeErrorRtree(error), true); // true = replace
39618                 return error;
39619             },
39620
39621
39622             // remove a single error from the cache
39623             removeError: function(error) {
39624                 if (!(error instanceof qaError) || !error.id) return;
39625
39626                 delete _krCache.data[error.id];
39627                 updateRtree(encodeErrorRtree(error), false); // false = remove
39628             },
39629
39630
39631             errorURL: function(error) {
39632                 return _krUrlRoot + 'report_map.php?schema=' + error.schema + '&error=' + error.id;
39633             },
39634
39635
39636             // Get an array of errors closed during this session.
39637             // Used to populate `closed:keepright` changeset tag
39638             getClosedIDs: function() {
39639                 return Object.keys(_krCache.closed).sort();
39640             }
39641
39642         };
39643
39644         var tiler$1 = utilTiler();
39645         var dispatch$2 = dispatch('loaded');
39646
39647         var _erCache;
39648         var _erZoom = 14;
39649
39650         var _impOsmUrls = {
39651             ow: 'https://directionofflow.skobbler.net/directionOfFlowService',
39652             mr: 'https://missingroads.skobbler.net/missingGeoService',
39653             tr: 'https://turnrestrictionservice.skobbler.net/turnRestrictionService'
39654         };
39655
39656         function abortRequest$1(i) {
39657             Object.values(i).forEach(function(controller) {
39658                 if (controller) {
39659                     controller.abort();
39660                 }
39661             });
39662         }
39663
39664         function abortUnwantedRequests$1(cache, tiles) {
39665             Object.keys(cache.inflightTile).forEach(function(k) {
39666                 var wanted = tiles.find(function(tile) { return k === tile.id; });
39667                 if (!wanted) {
39668                     abortRequest$1(cache.inflightTile[k]);
39669                     delete cache.inflightTile[k];
39670                 }
39671             });
39672         }
39673
39674
39675         function encodeErrorRtree$1(d) {
39676             return { minX: d.loc[0], minY: d.loc[1], maxX: d.loc[0], maxY: d.loc[1], data: d };
39677         }
39678
39679
39680         // replace or remove error from rtree
39681         function updateRtree$1(item, replace) {
39682             _erCache.rtree.remove(item, function isEql(a, b) {
39683                 return a.data.id === b.data.id;
39684             });
39685
39686             if (replace) {
39687                 _erCache.rtree.insert(item);
39688             }
39689         }
39690
39691         function linkErrorObject(d) {
39692             return '<a class="error_object_link">' + d + '</a>';
39693         }
39694
39695         function linkEntity(d) {
39696             return '<a class="error_entity_link">' + d + '</a>';
39697         }
39698
39699         function pointAverage(points) {
39700             if (points.length) {
39701                 var sum = points.reduce(function(acc, point) {
39702                     return geoVecAdd(acc, [point.lon, point.lat]);
39703                 }, [0,0]);
39704                 return geoVecScale(sum, 1 / points.length);
39705             } else {
39706                 return [0,0];
39707             }
39708         }
39709
39710         function relativeBearing(p1, p2) {
39711             var angle = Math.atan2(p2.lon - p1.lon, p2.lat - p1.lat);
39712             if (angle < 0) {
39713                 angle += 2 * Math.PI;
39714             }
39715
39716             // Return degrees
39717             return angle * 180 / Math.PI;
39718         }
39719
39720         // Assuming range [0,360)
39721         function cardinalDirection(bearing) {
39722             var dir = 45 * Math.round(bearing / 45);
39723             var compass = {
39724                 0: 'north',
39725                 45: 'northeast',
39726                 90: 'east',
39727                 135: 'southeast',
39728                 180: 'south',
39729                 225: 'southwest',
39730                 270: 'west',
39731                 315: 'northwest',
39732                 360: 'north'
39733             };
39734
39735             return t('QA.improveOSM.directions.' + compass[dir]);
39736         }
39737
39738         // Errors shouldn't obscure eachother
39739         function preventCoincident(loc, bumpUp) {
39740             var coincident = false;
39741             do {
39742                 // first time, move marker up. after that, move marker right.
39743                 var delta = coincident ? [0.00001, 0] : (bumpUp ? [0, 0.00001] : [0, 0]);
39744                 loc = geoVecAdd(loc, delta);
39745                 var bbox = geoExtent(loc).bbox();
39746                 coincident = _erCache.rtree.search(bbox).length;
39747             } while (coincident);
39748
39749             return loc;
39750         }
39751
39752         var serviceImproveOSM = {
39753             init: function() {
39754                 if (!_erCache) {
39755                     this.reset();
39756                 }
39757
39758                 this.event = utilRebind(this, dispatch$2, 'on');
39759             },
39760
39761             reset: function() {
39762                 if (_erCache) {
39763                     Object.values(_erCache.inflightTile).forEach(abortRequest$1);
39764                 }
39765                 _erCache = {
39766                     data: {},
39767                     loadedTile: {},
39768                     inflightTile: {},
39769                     inflightPost: {},
39770                     closed: {},
39771                     rtree: rbush_1()
39772                 };
39773             },
39774
39775             loadErrors: function(projection) {
39776                 var options = {
39777                     client: 'iD',
39778                     status: 'OPEN',
39779                     zoom: '19' // Use a high zoom so that clusters aren't returned
39780                 };
39781
39782                 // determine the needed tiles to cover the view
39783                 var tiles = tiler$1
39784                     .zoomExtent([_erZoom, _erZoom])
39785                     .getTiles(projection);
39786
39787                 // abort inflight requests that are no longer needed
39788                 abortUnwantedRequests$1(_erCache, tiles);
39789
39790                 // issue new requests..
39791                 tiles.forEach(function(tile) {
39792                     if (_erCache.loadedTile[tile.id] || _erCache.inflightTile[tile.id]) return;
39793
39794                     var rect = tile.extent.rectangle();
39795                     var params = Object.assign({}, options, { east: rect[0], south: rect[3], west: rect[2], north: rect[1] });
39796
39797                     // 3 separate requests to store for each tile
39798                     var requests = {};
39799
39800                     Object.keys(_impOsmUrls).forEach(function(k) {
39801                         var v = _impOsmUrls[k];
39802                         // We exclude WATER from missing geometry as it doesn't seem useful
39803                         // We use most confident one-way and turn restrictions only, still have false positives
39804                         var kParams = Object.assign({},
39805                             params,
39806                             (k === 'mr') ? { type: 'PARKING,ROAD,BOTH,PATH' } : { confidenceLevel: 'C1' }
39807                         );
39808                         var url = v + '/search?' + utilQsString(kParams);
39809
39810                         var controller = new AbortController();
39811                         requests[k] = controller;
39812
39813                         d3_json(url, { signal: controller.signal })
39814                             .then(function(data) {
39815                                 delete _erCache.inflightTile[tile.id][k];
39816                                 if (!Object.keys(_erCache.inflightTile[tile.id]).length) {
39817                                     delete _erCache.inflightTile[tile.id];
39818                                     _erCache.loadedTile[tile.id] = true;
39819                                 }
39820
39821                                 // Road segments at high zoom == oneways
39822                                 if (data.roadSegments) {
39823                                     data.roadSegments.forEach(function(feature) {
39824                                         // Position error at the approximate middle of the segment
39825                                         var points = feature.points;
39826                                         var mid = points.length / 2;
39827                                         var loc;
39828
39829                                         // Even number of points, find midpoint of the middle two
39830                                         // Odd number of points, use position of very middle point
39831                                         if (mid % 1 === 0) {
39832                                             loc = pointAverage([points[mid - 1], points[mid]]);
39833                                         } else {
39834                                             mid = points[Math.floor(mid)];
39835                                             loc = [mid.lon, mid.lat];
39836                                         }
39837
39838                                         // One-ways can land on same segment in opposite direction
39839                                         loc = preventCoincident(loc, false);
39840
39841                                         var d = new qaError({
39842                                             // Info required for every error
39843                                             loc: loc,
39844                                             service: 'improveOSM',
39845                                             error_type: k,
39846                                             // Extra details needed for this service
39847                                             error_key: k,
39848                                             identifier: { // this is used to post changes to the error
39849                                                 wayId: feature.wayId,
39850                                                 fromNodeId: feature.fromNodeId,
39851                                                 toNodeId: feature.toNodeId
39852                                             },
39853                                             object_id: feature.wayId,
39854                                             object_type: 'way',
39855                                             status: feature.status
39856                                         });
39857
39858                                         // Variables used in the description
39859                                         d.replacements = {
39860                                             percentage: feature.percentOfTrips,
39861                                             num_trips: feature.numberOfTrips,
39862                                             highway: linkErrorObject(t('QA.keepRight.error_parts.highway')),
39863                                             from_node: linkEntity('n' + feature.fromNodeId),
39864                                             to_node: linkEntity('n' + feature.toNodeId)
39865                                         };
39866
39867                                         _erCache.data[d.id] = d;
39868                                         _erCache.rtree.insert(encodeErrorRtree$1(d));
39869                                     });
39870                                 }
39871
39872                                 // Tiles at high zoom == missing roads
39873                                 if (data.tiles) {
39874                                     data.tiles.forEach(function(feature) {
39875                                         var geoType = feature.type.toLowerCase();
39876
39877                                         // Average of recorded points should land on the missing geometry
39878                                         // Missing geometry could happen to land on another error
39879                                         var loc = pointAverage(feature.points);
39880                                         loc = preventCoincident(loc, false);
39881
39882                                         var d = new qaError({
39883                                             // Info required for every error
39884                                             loc: loc,
39885                                             service: 'improveOSM',
39886                                             error_type: k + '-' + geoType,
39887                                             // Extra details needed for this service
39888                                             error_key: k,
39889                                             identifier: { x: feature.x, y: feature.y },
39890                                             status: feature.status
39891                                         });
39892
39893                                         d.replacements = {
39894                                             num_trips: feature.numberOfTrips,
39895                                             geometry_type: t('QA.improveOSM.geometry_types.' + geoType)
39896                                         };
39897
39898                                         // -1 trips indicates data came from a 3rd party
39899                                         if (feature.numberOfTrips === -1) {
39900                                             d.desc = t('QA.improveOSM.error_types.mr.description_alt', d.replacements);
39901                                         }
39902
39903                                         _erCache.data[d.id] = d;
39904                                         _erCache.rtree.insert(encodeErrorRtree$1(d));
39905                                     });
39906                                 }
39907
39908                                 // Entities at high zoom == turn restrictions
39909                                 if (data.entities) {
39910                                     data.entities.forEach(function(feature) {
39911                                         // Turn restrictions could be missing at same junction
39912                                         // We also want to bump the error up so node is accessible
39913                                         var loc = feature.point;
39914                                         loc = preventCoincident([loc.lon, loc.lat], true);
39915
39916                                         // Elements are presented in a strange way
39917                                         var ids = feature.id.split(',');
39918                                         var from_way = ids[0];
39919                                         var via_node = ids[3];
39920                                         var to_way = ids[2].split(':')[1];
39921
39922                                         var d = new qaError({
39923                                             // Info required for every error
39924                                             loc: loc,
39925                                             service: 'improveOSM',
39926                                             error_type: k,
39927                                             // Extra details needed for this service
39928                                             error_key: k,
39929                                             identifier: feature.id,
39930                                             object_id: via_node,
39931                                             object_type: 'node',
39932                                             status: feature.status
39933                                         });
39934
39935                                         // Travel direction along from_way clarifies the turn restriction
39936                                         var p1 = feature.segments[0].points[0];
39937                                         var p2 = feature.segments[0].points[1];
39938
39939                                         var dir_of_travel = cardinalDirection(relativeBearing(p1, p2));
39940
39941                                         // Variables used in the description
39942                                         d.replacements = {
39943                                             num_passed: feature.numberOfPasses,
39944                                             num_trips: feature.segments[0].numberOfTrips,
39945                                             turn_restriction: feature.turnType.toLowerCase(),
39946                                             from_way: linkEntity('w' + from_way),
39947                                             to_way: linkEntity('w' + to_way),
39948                                             travel_direction: dir_of_travel,
39949                                             junction: linkErrorObject(t('QA.keepRight.error_parts.this_node'))
39950                                         };
39951
39952                                         _erCache.data[d.id] = d;
39953                                         _erCache.rtree.insert(encodeErrorRtree$1(d));
39954                                         dispatch$2.call('loaded');
39955                                     });
39956                                 }
39957                             })
39958                             .catch(function() {
39959                                 delete _erCache.inflightTile[tile.id][k];
39960                                 if (!Object.keys(_erCache.inflightTile[tile.id]).length) {
39961                                     delete _erCache.inflightTile[tile.id];
39962                                     _erCache.loadedTile[tile.id] = true;
39963                                 }
39964                             });
39965                     });
39966
39967                     _erCache.inflightTile[tile.id] = requests;
39968                 });
39969             },
39970
39971             getComments: function(d, callback) {
39972                 // If comments already retrieved no need to do so again
39973                 if (d.comments !== undefined) {
39974                     if (callback) callback({}, d);
39975                     return;
39976                 }
39977
39978                 var key = d.error_key;
39979                 var qParams = {};
39980
39981                 if (key === 'ow') {
39982                     qParams = d.identifier;
39983                 } else if (key === 'mr') {
39984                     qParams.tileX = d.identifier.x;
39985                     qParams.tileY = d.identifier.y;
39986                 } else if (key === 'tr') {
39987                     qParams.targetId = d.identifier;
39988                 }
39989
39990                 var url = _impOsmUrls[key] + '/retrieveComments?' + utilQsString(qParams);
39991
39992                 var that = this;
39993                 d3_json(url)
39994                     .then(function(data) {
39995                         // comments are served newest to oldest
39996                         var comments = data.comments ? data.comments.reverse() : [];
39997                         that.replaceError(d.update({ comments: comments }));
39998                         if (callback) callback(null, d);
39999                     })
40000                     .catch(function(err) {
40001                         if (callback) callback(err.message);
40002                     });
40003             },
40004
40005             postUpdate: function(d, callback) {
40006                 if (!serviceOsm.authenticated()) { // Username required in payload
40007                     return callback({ message: 'Not Authenticated', status: -3}, d);
40008                 }
40009                 if (_erCache.inflightPost[d.id]) {
40010                     return callback({ message: 'Error update already inflight', status: -2 }, d);
40011                 }
40012
40013                 var that = this;
40014
40015                 // Payload can only be sent once username is established
40016                 serviceOsm.userDetails(sendPayload);
40017
40018                 function sendPayload(err, user) {
40019                     if (err) { return callback(err, d); }
40020
40021                     var key = d.error_key;
40022                     var url = _impOsmUrls[key] + '/comment';
40023                     var payload = {
40024                         username: user.display_name
40025                     };
40026
40027                     // Each error type has different data for identification
40028                     if (key === 'ow') {
40029                         payload.roadSegments = [ d.identifier ];
40030                     } else if (key === 'mr') {
40031                         payload.tiles = [ d.identifier ];
40032                     } else if (key === 'tr') {
40033                         payload.targetIds = [ d.identifier ];
40034                     }
40035
40036                     if (d.newStatus !== undefined) {
40037                         payload.status = d.newStatus;
40038                         payload.text = 'status changed';
40039                     }
40040
40041                     // Comment take place of default text
40042                     if (d.newComment !== undefined) {
40043                         payload.text = d.newComment;
40044                     }
40045
40046                     var controller = new AbortController();
40047                     _erCache.inflightPost[d.id] = controller;
40048
40049                     var options = {
40050                         method: 'POST',
40051                         signal: controller.signal,
40052                         body: JSON.stringify(payload)
40053                     };
40054
40055                      d3_json(url, options)
40056                         .then(function() {
40057                             delete _erCache.inflightPost[d.id];
40058
40059                             // Just a comment, update error in cache
40060                             if (d.newStatus === undefined) {
40061                                 var now = new Date();
40062                                 var comments = d.comments ? d.comments : [];
40063
40064                                 comments.push({
40065                                     username: payload.username,
40066                                     text: payload.text,
40067                                     timestamp: now.getTime() / 1000
40068                                 });
40069
40070                                 that.replaceError(d.update({
40071                                     comments: comments,
40072                                     newComment: undefined
40073                                 }));
40074                             } else {
40075                                 that.removeError(d);
40076                                 if (d.newStatus === 'SOLVED') {
40077                                     // No pretty identifier, so we just use coordinates
40078                                     var closedID = d.loc[1].toFixed(5) + '/' + d.loc[0].toFixed(5);
40079                                     _erCache.closed[key + ':' + closedID] = true;
40080                                 }
40081                             }
40082                             if (callback) callback(null, d);
40083                         })
40084                         .catch(function(err) {
40085                             delete _erCache.inflightPost[d.id];
40086                             if (callback) callback(err.message);
40087                         });
40088                 }
40089             },
40090
40091
40092             // get all cached errors covering the viewport
40093             getErrors: function(projection) {
40094                 var viewport = projection.clipExtent();
40095                 var min = [viewport[0][0], viewport[1][1]];
40096                 var max = [viewport[1][0], viewport[0][1]];
40097                 var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
40098
40099                 return _erCache.rtree.search(bbox).map(function(d) {
40100                     return d.data;
40101                 });
40102             },
40103
40104             // get a single error from the cache
40105             getError: function(id) {
40106                 return _erCache.data[id];
40107             },
40108
40109             // replace a single error in the cache
40110             replaceError: function(error) {
40111                 if (!(error instanceof qaError) || !error.id) return;
40112
40113                 _erCache.data[error.id] = error;
40114                 updateRtree$1(encodeErrorRtree$1(error), true); // true = replace
40115                 return error;
40116             },
40117
40118             // remove a single error from the cache
40119             removeError: function(error) {
40120                 if (!(error instanceof qaError) || !error.id) return;
40121
40122                 delete _erCache.data[error.id];
40123                 updateRtree$1(encodeErrorRtree$1(error), false); // false = remove
40124             },
40125
40126             // Used to populate `closed:improveosm` changeset tag
40127             getClosedIDs: function() {
40128                 return Object.keys(_erCache.closed).sort();
40129             }
40130         };
40131
40132         /*
40133             A standalone SVG element that contains only a `defs` sub-element. To be
40134             used once globally, since defs IDs must be unique within a document.
40135         */
40136         function svgDefs(context) {
40137
40138             function drawDefs(selection) {
40139                 var defs = selection.append('defs');
40140
40141                 // add markers
40142                 defs
40143                     .append('marker')
40144                     .attr('id', 'oneway-marker')
40145                     .attr('viewBox', '0 0 10 5')
40146                     .attr('refX', 2.5)
40147                     .attr('refY', 2.5)
40148                     .attr('markerWidth', 2)
40149                     .attr('markerHeight', 2)
40150                     .attr('markerUnits', 'strokeWidth')
40151                     .attr('orient', 'auto')
40152                     .append('path')
40153                     .attr('class', 'oneway-marker-path')
40154                     .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')
40155                     .attr('stroke', 'none')
40156                     .attr('fill', '#000')
40157                     .attr('opacity', '0.75');
40158
40159                 // SVG markers have to be given a colour where they're defined
40160                 // (they can't inherit it from the line they're attached to),
40161                 // so we need to manually define markers for each color of tag
40162                 // (also, it's slightly nicer if we can control the
40163                 // positioning for different tags)
40164                 function addSidedMarker(name, color, offset) {
40165                     defs
40166                         .append('marker')
40167                         .attr('id', 'sided-marker-' + name)
40168                         .attr('viewBox', '0 0 2 2')
40169                         .attr('refX', 1)
40170                         .attr('refY', -offset)
40171                         .attr('markerWidth', 1.5)
40172                         .attr('markerHeight', 1.5)
40173                         .attr('markerUnits', 'strokeWidth')
40174                         .attr('orient', 'auto')
40175                         .append('path')
40176                         .attr('class', 'sided-marker-path sided-marker-' + name + '-path')
40177                         .attr('d', 'M 0,0 L 1,1 L 2,0 z')
40178                         .attr('stroke', 'none')
40179                         .attr('fill', color);
40180                 }
40181                 addSidedMarker('natural', 'rgb(140, 208, 95)', 0);
40182                 // for a coastline, the arrows are (somewhat unintuitively) on
40183                 // the water side, so let's color them blue (with a gap) to
40184                 // give a stronger indication
40185                 addSidedMarker('coastline', '#77dede', 1);
40186                 // barriers have a dashed line, and separating the triangle
40187                 // from the line visually suits that
40188                 addSidedMarker('barrier', '#ddd', 1);
40189                 addSidedMarker('man_made', '#fff', 0);
40190
40191                 defs
40192                     .append('marker')
40193                     .attr('id', 'viewfield-marker')
40194                     .attr('viewBox', '0 0 16 16')
40195                     .attr('refX', 8)
40196                     .attr('refY', 16)
40197                     .attr('markerWidth', 4)
40198                     .attr('markerHeight', 4)
40199                     .attr('markerUnits', 'strokeWidth')
40200                     .attr('orient', 'auto')
40201                     .append('path')
40202                     .attr('class', 'viewfield-marker-path')
40203                     .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')
40204                     .attr('fill', '#333')
40205                     .attr('fill-opacity', '0.75')
40206                     .attr('stroke', '#fff')
40207                     .attr('stroke-width', '0.5px')
40208                     .attr('stroke-opacity', '0.75');
40209
40210                 defs
40211                     .append('marker')
40212                     .attr('id', 'viewfield-marker-wireframe')
40213                     .attr('viewBox', '0 0 16 16')
40214                     .attr('refX', 8)
40215                     .attr('refY', 16)
40216                     .attr('markerWidth', 4)
40217                     .attr('markerHeight', 4)
40218                     .attr('markerUnits', 'strokeWidth')
40219                     .attr('orient', 'auto')
40220                     .append('path')
40221                     .attr('class', 'viewfield-marker-path')
40222                     .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')
40223                     .attr('fill', 'none')
40224                     .attr('stroke', '#fff')
40225                     .attr('stroke-width', '0.5px')
40226                     .attr('stroke-opacity', '0.75');
40227
40228                 // add patterns
40229                 var patterns = defs.selectAll('pattern')
40230                     .data([
40231                         // pattern name, pattern image name
40232                         ['beach', 'dots'],
40233                         ['construction', 'construction'],
40234                         ['cemetery', 'cemetery'],
40235                         ['cemetery_christian', 'cemetery_christian'],
40236                         ['cemetery_buddhist', 'cemetery_buddhist'],
40237                         ['cemetery_muslim', 'cemetery_muslim'],
40238                         ['cemetery_jewish', 'cemetery_jewish'],
40239                         ['farmland', 'farmland'],
40240                         ['farmyard', 'farmyard'],
40241                         ['forest', 'forest'],
40242                         ['forest_broadleaved', 'forest_broadleaved'],
40243                         ['forest_needleleaved', 'forest_needleleaved'],
40244                         ['forest_leafless', 'forest_leafless'],
40245                         ['grass', 'grass'],
40246                         ['landfill', 'landfill'],
40247                         ['meadow', 'grass'],
40248                         ['orchard', 'orchard'],
40249                         ['pond', 'pond'],
40250                         ['quarry', 'quarry'],
40251                         ['scrub', 'bushes'],
40252                         ['vineyard', 'vineyard'],
40253                         ['water_standing', 'lines'],
40254                         ['waves', 'waves'],
40255                         ['wetland', 'wetland'],
40256                         ['wetland_marsh', 'wetland_marsh'],
40257                         ['wetland_swamp', 'wetland_swamp'],
40258                         ['wetland_bog', 'wetland_bog'],
40259                         ['wetland_reedbed', 'wetland_reedbed']
40260                     ])
40261                     .enter()
40262                     .append('pattern')
40263                     .attr('id', function (d) { return 'pattern-' + d[0]; })
40264                     .attr('width', 32)
40265                     .attr('height', 32)
40266                     .attr('patternUnits', 'userSpaceOnUse');
40267
40268                 patterns
40269                     .append('rect')
40270                     .attr('x', 0)
40271                     .attr('y', 0)
40272                     .attr('width', 32)
40273                     .attr('height', 32)
40274                     .attr('class', function (d) { return 'pattern-color-' + d[0]; });
40275
40276                 patterns
40277                     .append('image')
40278                     .attr('x', 0)
40279                     .attr('y', 0)
40280                     .attr('width', 32)
40281                     .attr('height', 32)
40282                     .attr('xlink:href', function (d) {
40283                         return context.imagePath('pattern/' + d[1] + '.png');
40284                     });
40285
40286                 // add clip paths
40287                 defs.selectAll('clipPath')
40288                     .data([12, 18, 20, 32, 45])
40289                     .enter()
40290                     .append('clipPath')
40291                     .attr('id', function (d) { return 'clip-square-' + d; })
40292                     .append('rect')
40293                     .attr('x', 0)
40294                     .attr('y', 0)
40295                     .attr('width', function (d) { return d; })
40296                     .attr('height', function (d) { return d; });
40297
40298                 // add symbol spritesheets
40299                 defs
40300                     .call(drawDefs.addSprites, [
40301                         'iD-sprite', 'maki-sprite', 'temaki-sprite', 'fa-sprite', 'tnp-sprite', 'community-sprite'
40302                     ], true);
40303             }
40304
40305
40306             drawDefs.addSprites = function(selection, ids, overrideColors) {
40307                 var spritesheets = selection.selectAll('.spritesheet');
40308                 var currData = spritesheets.data();
40309                 var data = utilArrayUniq(currData.concat(ids));
40310
40311                 spritesheets
40312                     .data(data)
40313                     .enter()
40314                     .append('g')
40315                     .attr('class', function(d) { return 'spritesheet spritesheet-' + d; })
40316                     .each(function(d) {
40317                         var url = context.imagePath(d + '.svg');
40318                         var node = d3_select(this).node();
40319
40320                         svg(url)
40321                             .then(function(svg) {
40322                                 node.appendChild(
40323                                     d3_select(svg.documentElement).attr('id', d).node()
40324                                 );
40325                                 if (overrideColors && d !== 'iD-sprite') {   // allow icon colors to be overridden..
40326                                     d3_select(node).selectAll('path')
40327                                         .attr('fill', 'currentColor');
40328                                 }
40329                             })
40330                             .catch(function() {
40331                                 /* ignore */
40332                             });
40333                     });
40334             };
40335
40336
40337             return drawDefs;
40338         }
40339
40340         /* global Mapillary:false */
40341
40342
40343         var apibase = 'https://a.mapillary.com/v3/';
40344         var viewercss = 'mapillary-js/mapillary.min.css';
40345         var viewerjs = 'mapillary-js/mapillary.min.js';
40346         var clientId = 'NzNRM2otQkR2SHJzaXJmNmdQWVQ0dzo1ZWYyMmYwNjdmNDdlNmVi';
40347         var maxResults = 1000;
40348         var tileZoom = 14;
40349         var tiler$2 = utilTiler().zoomExtent([tileZoom, tileZoom]).skipNullIsland(true);
40350         var dispatch$3 = dispatch('loadedImages', 'loadedSigns', 'bearingChanged');
40351         var _mlyFallback = false;
40352         var _mlyCache;
40353         var _mlyClicks;
40354         var _mlySelectedImage;
40355         var _mlyViewer;
40356
40357
40358         function abortRequest$2(controller) {
40359             controller.abort();
40360         }
40361
40362
40363         function maxPageAtZoom(z) {
40364             if (z < 15)   return 2;
40365             if (z === 15) return 5;
40366             if (z === 16) return 10;
40367             if (z === 17) return 20;
40368             if (z === 18) return 40;
40369             if (z > 18)   return 80;
40370         }
40371
40372
40373         function loadTiles(which, url, projection) {
40374             var currZoom = Math.floor(geoScaleToZoom(projection.scale()));
40375             var tiles = tiler$2.getTiles(projection);
40376
40377             // abort inflight requests that are no longer needed
40378             var cache = _mlyCache[which];
40379             Object.keys(cache.inflight).forEach(function(k) {
40380                 var wanted = tiles.find(function(tile) { return k.indexOf(tile.id + ',') === 0; });
40381                 if (!wanted) {
40382                     abortRequest$2(cache.inflight[k]);
40383                     delete cache.inflight[k];
40384                 }
40385             });
40386
40387             tiles.forEach(function(tile) {
40388                 loadNextTilePage(which, currZoom, url, tile);
40389             });
40390         }
40391
40392
40393         function loadNextTilePage(which, currZoom, url, tile) {
40394             var cache = _mlyCache[which];
40395             var rect = tile.extent.rectangle();
40396             var maxPages = maxPageAtZoom(currZoom);
40397             var nextPage = cache.nextPage[tile.id] || 0;
40398             var nextURL = cache.nextURL[tile.id] || url +
40399                 utilQsString({
40400                     per_page: maxResults,
40401                     page: nextPage,
40402                     client_id: clientId,
40403                     bbox: [rect[0], rect[1], rect[2], rect[3]].join(','),
40404                 });
40405
40406             if (nextPage > maxPages) return;
40407
40408             var id = tile.id + ',' + String(nextPage);
40409             if (cache.loaded[id] || cache.inflight[id]) return;
40410
40411             var controller = new AbortController();
40412             cache.inflight[id] = controller;
40413
40414             var options = {
40415                 method: 'GET',
40416                 signal: controller.signal,
40417                 headers: { 'Content-Type': 'application/json' }
40418             };
40419
40420             fetch(nextURL, options)
40421                 .then(function(response) {
40422                     if (!response.ok) {
40423                         throw new Error(response.status + ' ' + response.statusText);
40424                     }
40425                     var linkHeader = response.headers.get('Link');
40426                     if (linkHeader) {
40427                         var pagination = parsePagination(linkHeader);
40428                         if (pagination.next) {
40429                             cache.nextURL[tile.id] = pagination.next;
40430                         }
40431                     }
40432                     return response.json();
40433                 })
40434                 .then(function(data) {
40435                     cache.loaded[id] = true;
40436                     delete cache.inflight[id];
40437                     if (!data || !data.features || !data.features.length) {
40438                         throw new Error('No Data');
40439                     }
40440
40441                     var features = data.features.map(function(feature) {
40442                         var loc = feature.geometry.coordinates;
40443                         var d;
40444
40445                         // An image (shown as a green dot on the map) is a single street photo with extra
40446                         // information such as location, camera angle (CA), camera model, and so on.
40447                         // Each image feature is a GeoJSON Point
40448                         if (which === 'images') {
40449                             d = {
40450                                 loc: loc,
40451                                 key: feature.properties.key,
40452                                 ca: feature.properties.ca,
40453                                 captured_at: feature.properties.captured_at,
40454                                 captured_by: feature.properties.username,
40455                                 pano: feature.properties.pano
40456                             };
40457
40458                             cache.forImageKey[d.key] = d;     // cache imageKey -> image
40459
40460                         // Mapillary organizes images as sequences. A sequence of images are continuously captured
40461                         // by a user at a give time. Sequences are shown on the map as green lines.
40462                         // Each sequence feature is a GeoJSON LineString
40463                         } else if (which === 'sequences') {
40464                             var sequenceKey = feature.properties.key;
40465                             cache.lineString[sequenceKey] = feature;           // cache sequenceKey -> lineString
40466                             feature.properties.coordinateProperties.image_keys.forEach(function(imageKey) {
40467                                 cache.forImageKey[imageKey] = sequenceKey;     // cache imageKey -> sequenceKey
40468                             });
40469                             return false;    // because no `d` data worth loading into an rbush
40470
40471                         // An image detection is a semantic pixel area on an image. The area could indicate
40472                         // sky, trees, sidewalk in the image. A detection can be a polygon, a bounding box, or a point.
40473                         // Each image_detection feature is a GeoJSON Point (located where the image was taken)
40474                         } else if (which === 'image_detections') {
40475                             d = {
40476                                 key: feature.properties.key,
40477                                 image_key: feature.properties.image_key,
40478                                 value: feature.properties.value,
40479                                 package: feature.properties.package,
40480                                 shape: feature.properties.shape
40481                             };
40482
40483                             // cache imageKey -> image_detections
40484                             if (!cache.forImageKey[d.image_key]) {
40485                                 cache.forImageKey[d.image_key] = [];
40486                             }
40487                             cache.forImageKey[d.image_key].push(d);
40488                             return false;    // because no `d` data worth loading into an rbush
40489
40490
40491                         // A map feature is a real world object that can be shown on a map. It could be any object
40492                         // recognized from images, manually added in images, or added on the map.
40493                         // Each map feature is a GeoJSON Point (located where the feature is)
40494                         } else if (which === 'map_features') {
40495                             d = {
40496                                 loc: loc,
40497                                 key: feature.properties.key,
40498                                 value: feature.properties.value,
40499                                 package: feature.properties.package,
40500                                 detections: feature.properties.detections
40501                             };
40502                         }
40503
40504                         return {
40505                             minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
40506                         };
40507
40508                     }).filter(Boolean);
40509
40510                     if (cache.rtree && features) {
40511                         cache.rtree.load(features);
40512                     }
40513
40514                     if (data.features.length === maxResults) {  // more pages to load
40515                         cache.nextPage[tile.id] = nextPage + 1;
40516                         loadNextTilePage(which, currZoom, url, tile);
40517                     } else {
40518                         cache.nextPage[tile.id] = Infinity;     // no more pages to load
40519                     }
40520
40521                     if (which === 'images' || which === 'sequences') {
40522                         dispatch$3.call('loadedImages');
40523                     } else if (which === 'map_features') {
40524                         dispatch$3.call('loadedSigns');
40525                     }
40526                 })
40527                 .catch(function() {
40528                     cache.loaded[id] = true;
40529                     delete cache.inflight[id];
40530                 });
40531         }
40532
40533         // extract links to pages of API results
40534         function parsePagination(links) {
40535             return links.split(',').map(function(rel) {
40536                 var elements = rel.split(';');
40537                 if (elements.length === 2) {
40538                     return [
40539                         /<(.+)>/.exec(elements[0])[1],
40540                         /rel="(.+)"/.exec(elements[1])[1]
40541                     ];
40542                 } else {
40543                     return ['',''];
40544                 }
40545             }).reduce(function(pagination, val) {
40546                 pagination[val[1]] = val[0];
40547                 return pagination;
40548             }, {});
40549         }
40550
40551
40552         // partition viewport into higher zoom tiles
40553         function partitionViewport(projection) {
40554             var z = geoScaleToZoom(projection.scale());
40555             var z2 = (Math.ceil(z * 2) / 2) + 2.5;   // round to next 0.5 and add 2.5
40556             var tiler = utilTiler().zoomExtent([z2, z2]);
40557
40558             return tiler.getTiles(projection)
40559                 .map(function(tile) { return tile.extent; });
40560         }
40561
40562
40563         // no more than `limit` results per partition.
40564         function searchLimited(limit, projection, rtree) {
40565             limit = limit || 5;
40566
40567             return partitionViewport(projection)
40568                 .reduce(function(result, extent) {
40569                     var found = rtree.search(extent.bbox())
40570                         .slice(0, limit)
40571                         .map(function(d) { return d.data; });
40572
40573                     return (found.length ? result.concat(found) : result);
40574                 }, []);
40575         }
40576
40577
40578
40579         var serviceMapillary = {
40580
40581             init: function() {
40582                 if (!_mlyCache) {
40583                     this.reset();
40584                 }
40585
40586                 this.event = utilRebind(this, dispatch$3, 'on');
40587             },
40588
40589             reset: function() {
40590                 if (_mlyCache) {
40591                     Object.values(_mlyCache.images.inflight).forEach(abortRequest$2);
40592                     Object.values(_mlyCache.image_detections.inflight).forEach(abortRequest$2);
40593                     Object.values(_mlyCache.map_features.inflight).forEach(abortRequest$2);
40594                     Object.values(_mlyCache.sequences.inflight).forEach(abortRequest$2);
40595                 }
40596
40597                 _mlyCache = {
40598                     images: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1(), forImageKey: {} },
40599                     image_detections: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, forImageKey: {} },
40600                     map_features: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1() },
40601                     sequences: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1(), forImageKey: {}, lineString: {} }
40602                 };
40603
40604                 _mlySelectedImage = null;
40605                 _mlyClicks = [];
40606             },
40607
40608
40609             images: function(projection) {
40610                 var limit = 5;
40611                 return searchLimited(limit, projection, _mlyCache.images.rtree);
40612             },
40613
40614
40615             signs: function(projection) {
40616                 var limit = 5;
40617                 return searchLimited(limit, projection, _mlyCache.map_features.rtree);
40618             },
40619
40620
40621             cachedImage: function(imageKey) {
40622                 return _mlyCache.images.forImageKey[imageKey];
40623             },
40624
40625
40626             sequences: function(projection) {
40627                 var viewport = projection.clipExtent();
40628                 var min = [viewport[0][0], viewport[1][1]];
40629                 var max = [viewport[1][0], viewport[0][1]];
40630                 var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
40631                 var sequenceKeys = {};
40632
40633                 // all sequences for images in viewport
40634                 _mlyCache.images.rtree.search(bbox)
40635                     .forEach(function(d) {
40636                         var sequenceKey = _mlyCache.sequences.forImageKey[d.data.key];
40637                         if (sequenceKey) {
40638                             sequenceKeys[sequenceKey] = true;
40639                         }
40640                     });
40641
40642                 // Return lineStrings for the sequences
40643                 return Object.keys(sequenceKeys).map(function(sequenceKey) {
40644                     return _mlyCache.sequences.lineString[sequenceKey];
40645                 });
40646             },
40647
40648
40649             signsSupported: function() {
40650                 return true;
40651             },
40652
40653
40654             loadImages: function(projection) {
40655                 loadTiles('images', apibase + 'images?', projection);
40656                 loadTiles('sequences', apibase + 'sequences?', projection);
40657             },
40658
40659
40660             loadSigns: function(projection) {
40661                 // if we are looking at signs, we'll actually need to fetch images too
40662                 loadTiles('images', apibase + 'images?', projection);
40663                 loadTiles('map_features', apibase + 'map_features?layers=trafficsigns&min_nbr_image_detections=1&', projection);
40664                 loadTiles('image_detections', apibase + 'image_detections?layers=trafficsigns&', projection);
40665             },
40666
40667
40668             loadViewer: function(context) {
40669                 // add mly-wrapper
40670                 var wrap = d3_select('#photoviewer').selectAll('.mly-wrapper')
40671                     .data([0]);
40672
40673                 wrap.enter()
40674                     .append('div')
40675                     .attr('id', 'mly')
40676                     .attr('class', 'photo-wrapper mly-wrapper')
40677                     .classed('hide', true);
40678
40679                 // load mapillary-viewercss
40680                 d3_select('head').selectAll('#mapillary-viewercss')
40681                     .data([0])
40682                     .enter()
40683                     .append('link')
40684                     .attr('id', 'mapillary-viewercss')
40685                     .attr('rel', 'stylesheet')
40686                     .attr('href', context.asset(viewercss));
40687
40688                 // load mapillary-viewerjs
40689                 d3_select('head').selectAll('#mapillary-viewerjs')
40690                     .data([0])
40691                     .enter()
40692                     .append('script')
40693                     .attr('id', 'mapillary-viewerjs')
40694                     .attr('src', context.asset(viewerjs));
40695
40696                 // load mapillary signs sprite
40697                 var defs = context.container().select('defs');
40698                 defs.call(svgDefs(context).addSprites, ['mapillary-sprite'], false /* don't override colors */ );
40699
40700                 // Register viewer resize handler
40701                 context.ui().photoviewer.on('resize', function() {
40702                     if (_mlyViewer) {
40703                         _mlyViewer.resize();
40704                     }
40705                 });
40706             },
40707
40708
40709             showViewer: function() {
40710                 var wrap = d3_select('#photoviewer')
40711                     .classed('hide', false);
40712
40713                 var isHidden = wrap.selectAll('.photo-wrapper.mly-wrapper.hide').size();
40714
40715                 if (isHidden && _mlyViewer) {
40716                     wrap
40717                         .selectAll('.photo-wrapper:not(.mly-wrapper)')
40718                         .classed('hide', true);
40719
40720                     wrap
40721                         .selectAll('.photo-wrapper.mly-wrapper')
40722                         .classed('hide', false);
40723
40724                     _mlyViewer.resize();
40725                 }
40726
40727                 return this;
40728             },
40729
40730
40731             hideViewer: function() {
40732                 _mlySelectedImage = null;
40733
40734                 if (!_mlyFallback && _mlyViewer) {
40735                     _mlyViewer.getComponent('sequence').stop();
40736                 }
40737
40738                 var viewer = d3_select('#photoviewer');
40739                 if (!viewer.empty()) viewer.datum(null);
40740
40741                 viewer
40742                     .classed('hide', true)
40743                     .selectAll('.photo-wrapper')
40744                     .classed('hide', true);
40745
40746                 d3_selectAll('.viewfield-group, .sequence, .icon-sign')
40747                     .classed('currentView', false);
40748
40749                 return this.setStyles(null, true);
40750             },
40751
40752
40753             parsePagination: parsePagination,
40754
40755
40756             updateViewer: function(imageKey, context) {
40757                 if (!imageKey) return this;
40758
40759                 if (!_mlyViewer) {
40760                     this.initViewer(imageKey, context);
40761                 } else {
40762                     _mlyViewer.moveToKey(imageKey)
40763                         .catch(function(e) { console.error('mly3', e); });  // eslint-disable-line no-console
40764                 }
40765
40766                 return this;
40767             },
40768
40769
40770             initViewer: function(imageKey, context) {
40771                 var that = this;
40772                 if (window.Mapillary && imageKey) {
40773                     var opts = {
40774                         baseImageSize: 320,
40775                         component: {
40776                             cover: false,
40777                             keyboard: false,
40778                             tag: true
40779                         }
40780                     };
40781
40782                     // Disable components requiring WebGL support
40783                     if (!Mapillary.isSupported() && Mapillary.isFallbackSupported()) {
40784                         _mlyFallback = true;
40785                         opts.component = {
40786                             cover: false,
40787                             direction: false,
40788                             imagePlane: false,
40789                             keyboard: false,
40790                             mouse: false,
40791                             sequence: false,
40792                             tag: false,
40793                             image: true,        // fallback
40794                             navigation: true    // fallback
40795                         };
40796                     }
40797
40798                     _mlyViewer = new Mapillary.Viewer('mly', clientId, null, opts);
40799                     _mlyViewer.on('nodechanged', nodeChanged);
40800                     _mlyViewer.on('bearingchanged', bearingChanged);
40801                     _mlyViewer.moveToKey(imageKey)
40802                         .catch(function(e) { console.error('mly3', e); });  // eslint-disable-line no-console
40803                 }
40804
40805                 // nodeChanged: called after the viewer has changed images and is ready.
40806                 //
40807                 // There is some logic here to batch up clicks into a _mlyClicks array
40808                 // because the user might click on a lot of markers quickly and nodechanged
40809                 // may be called out of order asychronously.
40810                 //
40811                 // Clicks are added to the array in `selectedImage` and removed here.
40812                 //
40813                 function nodeChanged(node) {
40814                     if (!_mlyFallback) {
40815                         _mlyViewer.getComponent('tag').removeAll();  // remove previous detections
40816                     }
40817
40818                     var clicks = _mlyClicks;
40819                     var index = clicks.indexOf(node.key);
40820                     var selectedKey = _mlySelectedImage && _mlySelectedImage.key;
40821
40822                     if (index > -1) {              // `nodechanged` initiated from clicking on a marker..
40823                         clicks.splice(index, 1);   // remove the click
40824                         // If `node.key` matches the current _mlySelectedImage, call `selectImage()`
40825                         // one more time to update the detections and attribution..
40826                         if (node.key === selectedKey) {
40827                             that.selectImage(_mlySelectedImage, node.key, true);
40828                         }
40829                     } else {             // `nodechanged` initiated from the Mapillary viewer controls..
40830                         var loc = node.computedLatLon ? [node.computedLatLon.lon, node.computedLatLon.lat] : [node.latLon.lon, node.latLon.lat];
40831                         context.map().centerEase(loc);
40832                         that.selectImage(undefined, node.key, true);
40833                     }
40834                 }
40835
40836                 function bearingChanged(e) {
40837                     dispatch$3.call('bearingChanged', undefined, e);
40838                 }
40839             },
40840
40841
40842             // Pass the image datum itself in `d` or the `imageKey` string.
40843             // This allows images to be selected from places that dont have access
40844             // to the full image datum (like the street signs layer or the js viewer)
40845             selectImage: function(d, imageKey, fromViewer) {
40846                 if (!d && imageKey) {
40847                     // If the user clicked on something that's not an image marker, we
40848                     // might get in here.. Cache lookup can fail, e.g. if the user
40849                     // clicked a streetsign, but images are loading slowly asynchronously.
40850                     // We'll try to carry on anyway if there is no datum.  There just
40851                     // might be a delay before user sees detections, captured_at, etc.
40852                     d = _mlyCache.images.forImageKey[imageKey];
40853                 }
40854
40855                 _mlySelectedImage = d;
40856                 var viewer = d3_select('#photoviewer');
40857                 if (!viewer.empty()) viewer.datum(d);
40858
40859                 imageKey = (d && d.key) || imageKey;
40860                 if (!fromViewer && imageKey) {
40861                     _mlyClicks.push(imageKey);
40862                 }
40863
40864                 this.setStyles(null, true);
40865
40866                 // if signs signs are shown, highlight the ones that appear in this image
40867                 d3_selectAll('.layer-mapillary-signs .icon-sign')
40868                     .classed('currentView', function(d) {
40869                         return d.detections.some(function(detection) {
40870                             return detection.image_key === imageKey;
40871                         });
40872                     });
40873
40874                 if (d) {
40875                     this.updateDetections(d);
40876                 }
40877
40878                 return this;
40879             },
40880
40881
40882             getSelectedImage: function() {
40883                 return _mlySelectedImage;
40884             },
40885
40886
40887             getSequenceKeyForImage: function(d) {
40888                 var imageKey = d && d.key;
40889                 return imageKey && _mlyCache.sequences.forImageKey[imageKey];
40890             },
40891
40892
40893             // Updates the currently highlighted sequence and selected bubble.
40894             // Reset is only necessary when interacting with the viewport because
40895             // this implicitly changes the currently selected bubble/sequence
40896             setStyles: function(hovered, reset) {
40897                 if (reset) {  // reset all layers
40898                     d3_selectAll('.viewfield-group')
40899                         .classed('highlighted', false)
40900                         .classed('hovered', false)
40901                         .classed('currentView', false);
40902
40903                     d3_selectAll('.sequence')
40904                         .classed('highlighted', false)
40905                         .classed('currentView', false);
40906                 }
40907
40908                 var hoveredImageKey = hovered && hovered.key;
40909                 var hoveredSequenceKey = this.getSequenceKeyForImage(hovered);
40910                 var hoveredLineString = hoveredSequenceKey && _mlyCache.sequences.lineString[hoveredSequenceKey];
40911                 var hoveredImageKeys = (hoveredLineString && hoveredLineString.properties.coordinateProperties.image_keys) || [];
40912
40913                 var viewer = d3_select('#photoviewer');
40914                 var selected = viewer.empty() ? undefined : viewer.datum();
40915                 var selectedImageKey = selected && selected.key;
40916                 var selectedSequenceKey = this.getSequenceKeyForImage(selected);
40917                 var selectedLineString = selectedSequenceKey && _mlyCache.sequences.lineString[selectedSequenceKey];
40918                 var selectedImageKeys = (selectedLineString && selectedLineString.properties.coordinateProperties.image_keys) || [];
40919
40920                 // highlight sibling viewfields on either the selected or the hovered sequences
40921                 var highlightedImageKeys = utilArrayUnion(hoveredImageKeys, selectedImageKeys);
40922
40923                 d3_selectAll('.layer-mapillary .viewfield-group')
40924                     .classed('highlighted', function(d) { return highlightedImageKeys.indexOf(d.key) !== -1; })
40925                     .classed('hovered', function(d) { return d.key === hoveredImageKey; })
40926                     .classed('currentView', function(d) { return d.key === selectedImageKey; });
40927
40928                 d3_selectAll('.layer-mapillary .sequence')
40929                     .classed('highlighted', function(d) { return d.properties.key === hoveredSequenceKey; })
40930                     .classed('currentView', function(d) { return d.properties.key === selectedSequenceKey; });
40931
40932                 // update viewfields if needed
40933                 d3_selectAll('.viewfield-group .viewfield')
40934                     .attr('d', viewfieldPath);
40935
40936                 function viewfieldPath() {
40937                     var d = this.parentNode.__data__;
40938                     if (d.pano && d.key !== selectedImageKey) {
40939                         return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
40940                     } else {
40941                         return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
40942                     }
40943                 }
40944
40945                 return this;
40946             },
40947
40948
40949             updateDetections: function(d) {
40950                 if (!_mlyViewer || _mlyFallback) return;
40951
40952                 var imageKey = d && d.key;
40953                 if (!imageKey) return;
40954
40955                 var detections = _mlyCache.image_detections.forImageKey[imageKey] || [];
40956                 detections.forEach(function(data) {
40957                     var tag = makeTag(data);
40958                     if (tag) {
40959                         var tagComponent = _mlyViewer.getComponent('tag');
40960                         tagComponent.add([tag]);
40961                     }
40962                 });
40963
40964                 function makeTag(data) {
40965                     var valueParts = data.value.split('--');
40966                     if (valueParts.length !== 3) return;
40967
40968                     var text = valueParts[1].replace(/-/g, ' ');
40969                     var tag;
40970
40971                     // Currently only two shapes <Polygon|Point>
40972                     if (data.shape.type === 'Polygon') {
40973                         var polygonGeometry = new Mapillary
40974                             .TagComponent
40975                             .PolygonGeometry(data.shape.coordinates[0]);
40976
40977                         tag = new Mapillary.TagComponent.OutlineTag(
40978                             data.key,
40979                             polygonGeometry,
40980                             {
40981                                 text: text,
40982                                 textColor: 0xffff00,
40983                                 lineColor: 0xffff00,
40984                                 lineWidth: 2,
40985                                 fillColor: 0xffff00,
40986                                 fillOpacity: 0.3,
40987                             }
40988                         );
40989
40990                     } else if (data.shape.type === 'Point') {
40991                         var pointGeometry = new Mapillary
40992                             .TagComponent
40993                             .PointGeometry(data.shape.coordinates[0]);
40994
40995                         tag = new Mapillary.TagComponent.SpotTag(
40996                             data.key,
40997                             pointGeometry,
40998                             {
40999                                 text: text,
41000                                 color: 0xffff00,
41001                                 textColor: 0xffff00
41002                             }
41003                         );
41004                     }
41005
41006                     return tag;
41007                 }
41008             },
41009
41010
41011             cache: function() {
41012                 return _mlyCache;
41013             }
41014
41015         };
41016
41017         function validationIssue(attrs) {
41018             this.type = attrs.type;                // required - name of rule that created the issue (e.g. 'missing_tag')
41019             this.subtype = attrs.subtype;          // optional - category of the issue within the type (e.g. 'relation_type' under 'missing_tag')
41020             this.severity = attrs.severity;        // required - 'warning' or 'error'
41021             this.message = attrs.message;          // required - function returning localized string
41022             this.reference = attrs.reference;      // optional - function(selection) to render reference information
41023             this.entityIds = attrs.entityIds;      // optional - array of IDs of entities involved in the issue
41024             this.loc = attrs.loc;                  // optional - [lon, lat] to zoom in on to see the issue
41025             this.data = attrs.data;                // optional - object containing extra data for the fixes
41026             this.fixes = attrs.fixes || [];              // optional - array of validationIssueFix objects
41027             this.hash = attrs.hash;                // optional - string to further differentiate the issue
41028
41029             this.id = generateID.apply(this);      // generated - see below
41030             this.autoFix = null;                   // generated - if autofix exists, will be set below
41031
41032             // A unique, deterministic string hash.
41033             // Issues with identical id values are considered identical.
41034             function generateID() {
41035                 var parts = [this.type];
41036
41037                 if (this.hash) {   // subclasses can pass in their own differentiator
41038                     parts.push(this.hash);
41039                 }
41040
41041                 if (this.subtype) {
41042                     parts.push(this.subtype);
41043                 }
41044
41045                 // include the entities this issue is for
41046                 // (sort them so the id is deterministic)
41047                 if (this.entityIds) {
41048                     var entityKeys = this.entityIds.slice().sort();
41049                     parts.push.apply(parts, entityKeys);
41050                 }
41051
41052                 return parts.join(':');
41053             }
41054
41055             this.extent = function(resolver) {
41056                 if (this.loc) {
41057                     return geoExtent(this.loc);
41058                 }
41059                 if (this.entityIds && this.entityIds.length) {
41060                     return this.entityIds.reduce(function(extent, entityId) {
41061                         return extent.extend(resolver.entity(entityId).extent(resolver));
41062                     }, geoExtent());
41063                 }
41064                 return null;
41065             };
41066
41067
41068             if (this.fixes) {   // add a reference in the fixes to the issue for use in fix actions
41069                 for (var i = 0; i < this.fixes.length; i++) {
41070                     var fix = this.fixes[i];
41071                     fix.issue = this;
41072                     if (fix.autoArgs) {
41073                         this.autoFix = fix;
41074                     }
41075                 }
41076             }
41077         }
41078
41079
41080         function validationIssueFix(attrs) {
41081             this.title = attrs.title;                 // Required
41082             this.onClick = attrs.onClick;             // Required
41083             this.icon = attrs.icon;                   // Optional - shows 'iD-icon-wrench' if not set
41084             this.entityIds = attrs.entityIds || [];   // Optional - Used for hover-higlighting.
41085             this.autoArgs = attrs.autoArgs;           // Optional - pass [actions, annotation] arglist if this fix can automatically run
41086
41087             this.issue = null;    // Generated link - added by ValidationIssue constructor
41088         }
41089
41090         var buildRuleChecks = function() {
41091             return {
41092                 equals: function (equals) {
41093                     return function(tags) {
41094                         return Object.keys(equals).every(function(k) {
41095                             return equals[k] === tags[k];
41096                         });
41097                     };
41098                 },
41099                 notEquals: function (notEquals) {
41100                     return function(tags) {
41101                         return Object.keys(notEquals).some(function(k) {
41102                             return notEquals[k] !== tags[k];
41103                         });
41104                     };
41105                 },
41106                 absence: function(absence) {
41107                     return function(tags) {
41108                         return Object.keys(tags).indexOf(absence) === -1;
41109                     };
41110                 },
41111                 presence: function(presence) {
41112                     return function(tags) {
41113                         return Object.keys(tags).indexOf(presence) > -1;
41114                     };
41115                 },
41116                 greaterThan: function(greaterThan) {
41117                     var key = Object.keys(greaterThan)[0];
41118                     var value = greaterThan[key];
41119
41120                     return function(tags) {
41121                         return tags[key] > value;
41122                     };
41123                 },
41124                 greaterThanEqual: function(greaterThanEqual) {
41125                     var key = Object.keys(greaterThanEqual)[0];
41126                     var value = greaterThanEqual[key];
41127
41128                     return function(tags) {
41129                         return tags[key] >= value;
41130                     };
41131                 },
41132                 lessThan: function(lessThan) {
41133                     var key = Object.keys(lessThan)[0];
41134                     var value = lessThan[key];
41135
41136                     return function(tags) {
41137                         return tags[key] < value;
41138                     };
41139                 },
41140                 lessThanEqual: function(lessThanEqual) {
41141                     var key = Object.keys(lessThanEqual)[0];
41142                     var value = lessThanEqual[key];
41143
41144                     return function(tags) {
41145                         return tags[key] <= value;
41146                     };
41147                 },
41148                 positiveRegex: function(positiveRegex) {
41149                     var tagKey = Object.keys(positiveRegex)[0];
41150                     var expression = positiveRegex[tagKey].join('|');
41151                     var regex = new RegExp(expression);
41152
41153                     return function(tags) {
41154                         return regex.test(tags[tagKey]);
41155                     };
41156                 },
41157                 negativeRegex: function(negativeRegex) {
41158                     var tagKey = Object.keys(negativeRegex)[0];
41159                     var expression = negativeRegex[tagKey].join('|');
41160                     var regex = new RegExp(expression);
41161
41162                     return function(tags) {
41163                         return !regex.test(tags[tagKey]);
41164                     };
41165                 }
41166             };
41167         };
41168
41169         var buildLineKeys = function() {
41170             return {
41171                 highway: {
41172                     rest_area: true,
41173                     services: true
41174                 },
41175                 railway: {
41176                     roundhouse: true,
41177                     station: true,
41178                     traverser: true,
41179                     turntable: true,
41180                     wash: true
41181                 }
41182             };
41183         };
41184
41185         var serviceMapRules = {
41186             init: function() {
41187                 this._ruleChecks  = buildRuleChecks();
41188                 this._validationRules = [];
41189                 this._areaKeys = osmAreaKeys;
41190                 this._lineKeys = buildLineKeys();
41191             },
41192
41193             // list of rules only relevant to tag checks...
41194             filterRuleChecks: function(selector) {
41195                 var _ruleChecks = this._ruleChecks;
41196                 return Object.keys(selector).reduce(function(rules, key) {
41197                     if (['geometry', 'error', 'warning'].indexOf(key) === -1) {
41198                         rules.push(_ruleChecks[key](selector[key]));
41199                     }
41200                     return rules;
41201                 }, []);
41202             },
41203
41204             // builds tagMap from mapcss-parse selector object...
41205             buildTagMap: function(selector) {
41206                 var getRegexValues = function(regexes) {
41207                     return regexes.map(function(regex) {
41208                         return regex.replace(/\$|\^/g, '');
41209                     });
41210                 };
41211
41212                 var tagMap = Object.keys(selector).reduce(function (expectedTags, key) {
41213                     var values;
41214                     var isRegex = /regex/gi.test(key);
41215                     var isEqual = /equals/gi.test(key);
41216
41217                     if (isRegex || isEqual) {
41218                         Object.keys(selector[key]).forEach(function(selectorKey) {
41219                             values = isEqual ? [selector[key][selectorKey]] : getRegexValues(selector[key][selectorKey]);
41220
41221                             if (expectedTags.hasOwnProperty(selectorKey)) {
41222                                 values = values.concat(expectedTags[selectorKey]);
41223                             }
41224
41225                             expectedTags[selectorKey] = values;
41226                         });
41227
41228                     } else if (/(greater|less)Than(Equal)?|presence/g.test(key)) {
41229                         var tagKey = /presence/.test(key) ? selector[key] : Object.keys(selector[key])[0];
41230
41231                         values = [selector[key][tagKey]];
41232
41233                         if (expectedTags.hasOwnProperty(tagKey)) {
41234                             values = values.concat(expectedTags[tagKey]);
41235                         }
41236
41237                         expectedTags[tagKey] = values;
41238                     }
41239
41240                     return expectedTags;
41241                 }, {});
41242
41243                 return tagMap;
41244             },
41245
41246             // inspired by osmWay#isArea()
41247             inferGeometry: function(tagMap) {
41248                 var _lineKeys = this._lineKeys;
41249                 var _areaKeys = this._areaKeys;
41250
41251                 var isAreaKeyBlackList = function(key) {
41252                     return utilArrayIntersection(tagMap[key], Object.keys(_areaKeys[key])).length > 0;
41253                 };
41254                 var isLineKeysWhiteList = function(key) {
41255                     return utilArrayIntersection(tagMap[key], Object.keys(_lineKeys[key])).length > 0;
41256                 };
41257
41258                 if (tagMap.hasOwnProperty('area')) {
41259                     if (tagMap.area.indexOf('yes') > -1) {
41260                         return 'area';
41261                     }
41262                     if (tagMap.area.indexOf('no') > -1) {
41263                         return 'line';
41264                     }
41265                 }
41266
41267                 for (var key in tagMap) {
41268                     if (key in _areaKeys && !isAreaKeyBlackList(key)) {
41269                         return 'area';
41270                     }
41271                     if (key in _lineKeys && isLineKeysWhiteList(key)) {
41272                         return 'area';
41273                     }
41274                 }
41275
41276                 return 'line';
41277             },
41278
41279             // adds from mapcss-parse selector check...
41280             addRule: function(selector) {
41281                 var rule = {
41282                     // checks relevant to mapcss-selector
41283                     checks: this.filterRuleChecks(selector),
41284                     // true if all conditions for a tag error are true..
41285                     matches: function(entity) {
41286                         return this.checks.every(function(check) {
41287                             return check(entity.tags);
41288                         });
41289                     },
41290                     // borrowed from Way#isArea()
41291                     inferredGeometry: this.inferGeometry(this.buildTagMap(selector), this._areaKeys),
41292                     geometryMatches: function(entity, graph) {
41293                         if (entity.type === 'node' || entity.type === 'relation') {
41294                             return selector.geometry === entity.type;
41295                         } else if (entity.type === 'way') {
41296                             return this.inferredGeometry === entity.geometry(graph);
41297                         }
41298                     },
41299                     // when geometries match and tag matches are present, return a warning...
41300                     findIssues: function (entity, graph, issues) {
41301                         if (this.geometryMatches(entity, graph) && this.matches(entity)) {
41302                             var severity = Object.keys(selector).indexOf('error') > -1
41303                                     ? 'error'
41304                                     : 'warning';
41305                             var message = selector[severity];
41306                             issues.push(new validationIssue({
41307                                 type: 'maprules',
41308                                 severity: severity,
41309                                 message: function() {
41310                                     return message;
41311                                 },
41312                                 entityIds: [entity.id]
41313                             }));
41314                         }
41315                     }
41316                 };
41317                 this._validationRules.push(rule);
41318             },
41319
41320             clearRules: function() { this._validationRules = []; },
41321
41322             // returns validationRules...
41323             validationRules: function() { return this._validationRules; },
41324
41325             // returns ruleChecks
41326             ruleChecks: function() { return this._ruleChecks; }
41327         };
41328
41329         var apibase$1 = 'https://nominatim.openstreetmap.org/';
41330         var _inflight = {};
41331         var _nominatimCache;
41332
41333
41334         var serviceNominatim = {
41335
41336             init: function() {
41337                 _inflight = {};
41338                 _nominatimCache = rbush_1();
41339             },
41340
41341             reset: function() {
41342                 Object.values(_inflight).forEach(function(controller) { controller.abort(); });
41343                 _inflight = {};
41344                 _nominatimCache = rbush_1();
41345             },
41346
41347
41348             countryCode: function (location, callback) {
41349                 this.reverse(location, function(err, result) {
41350                     if (err) {
41351                         return callback(err);
41352                     } else if (result.address) {
41353                         return callback(null, result.address.country_code);
41354                     } else {
41355                         return callback('Unable to geocode', null);
41356                     }
41357                 });
41358             },
41359
41360
41361             reverse: function (loc, callback) {
41362                 var cached = _nominatimCache.search(
41363                     { minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1] }
41364                 );
41365
41366                 if (cached.length > 0) {
41367                     if (callback) callback(null, cached[0].data);
41368                     return;
41369                 }
41370
41371                 var params = { zoom: 13, format: 'json', addressdetails: 1, lat: loc[1], lon: loc[0] };
41372                 var url = apibase$1 + 'reverse?' + utilQsString(params);
41373
41374                 if (_inflight[url]) return;
41375                 var controller = new AbortController();
41376                 _inflight[url] = controller;
41377
41378                 d3_json(url, { signal: controller.signal })
41379                     .then(function(result) {
41380                         delete _inflight[url];
41381                         if (result && result.error) {
41382                             throw new Error(result.error);
41383                         }
41384                         var extent = geoExtent(loc).padByMeters(200);
41385                         _nominatimCache.insert(Object.assign(extent.bbox(), {data: result}));
41386                         if (callback) callback(null, result);
41387                     })
41388                     .catch(function(err) {
41389                         delete _inflight[url];
41390                         if (err.name === 'AbortError') return;
41391                         if (callback) callback(err.message);
41392                     });
41393             },
41394
41395
41396             search: function (val, callback) {
41397                 var searchVal = encodeURIComponent(val);
41398                 var url = apibase$1 + 'search/' + searchVal + '?limit=10&format=json';
41399
41400                 if (_inflight[url]) return;
41401                 var controller = new AbortController();
41402                 _inflight[url] = controller;
41403
41404                 d3_json(url, { signal: controller.signal })
41405                     .then(function(result) {
41406                         delete _inflight[url];
41407                         if (result && result.error) {
41408                             throw new Error(result.error);
41409                         }
41410                         if (callback) callback(null, result);
41411                     })
41412                     .catch(function(err) {
41413                         delete _inflight[url];
41414                         if (err.name === 'AbortError') return;
41415                         if (callback) callback(err.message);
41416                     });
41417             }
41418
41419         };
41420
41421         var apibase$2 = 'https://openstreetcam.org';
41422         var maxResults$1 = 1000;
41423         var tileZoom$1 = 14;
41424         var tiler$3 = utilTiler().zoomExtent([tileZoom$1, tileZoom$1]).skipNullIsland(true);
41425         var dispatch$4 = dispatch('loadedImages');
41426         var imgZoom = d3_zoom()
41427             .extent([[0, 0], [320, 240]])
41428             .translateExtent([[0, 0], [320, 240]])
41429             .scaleExtent([1, 15])
41430             .on('zoom', zoomPan);
41431         var _oscCache;
41432         var _oscSelectedImage;
41433
41434
41435         function abortRequest$3(controller) {
41436             controller.abort();
41437         }
41438
41439
41440         function maxPageAtZoom$1(z) {
41441             if (z < 15)   return 2;
41442             if (z === 15) return 5;
41443             if (z === 16) return 10;
41444             if (z === 17) return 20;
41445             if (z === 18) return 40;
41446             if (z > 18)   return 80;
41447         }
41448
41449
41450         function loadTiles$1(which, url, projection) {
41451             var currZoom = Math.floor(geoScaleToZoom(projection.scale()));
41452             var tiles = tiler$3.getTiles(projection);
41453
41454             // abort inflight requests that are no longer needed
41455             var cache = _oscCache[which];
41456             Object.keys(cache.inflight).forEach(function(k) {
41457                 var wanted = tiles.find(function(tile) { return k.indexOf(tile.id + ',') === 0; });
41458                 if (!wanted) {
41459                     abortRequest$3(cache.inflight[k]);
41460                     delete cache.inflight[k];
41461                 }
41462             });
41463
41464             tiles.forEach(function(tile) {
41465                 loadNextTilePage$1(which, currZoom, url, tile);
41466             });
41467         }
41468
41469
41470         function loadNextTilePage$1(which, currZoom, url, tile) {
41471             var cache = _oscCache[which];
41472             var bbox = tile.extent.bbox();
41473             var maxPages = maxPageAtZoom$1(currZoom);
41474             var nextPage = cache.nextPage[tile.id] || 1;
41475             var params = utilQsString({
41476                 ipp: maxResults$1,
41477                 page: nextPage,
41478                 // client_id: clientId,
41479                 bbTopLeft: [bbox.maxY, bbox.minX].join(','),
41480                 bbBottomRight: [bbox.minY, bbox.maxX].join(',')
41481             }, true);
41482
41483             if (nextPage > maxPages) return;
41484
41485             var id = tile.id + ',' + String(nextPage);
41486             if (cache.loaded[id] || cache.inflight[id]) return;
41487
41488             var controller = new AbortController();
41489             cache.inflight[id] = controller;
41490
41491             var options = {
41492                 method: 'POST',
41493                 signal: controller.signal,
41494                 body: params,
41495                 headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
41496             };
41497
41498             d3_json(url, options)
41499                 .then(function(data) {
41500                     cache.loaded[id] = true;
41501                     delete cache.inflight[id];
41502                     if (!data || !data.currentPageItems || !data.currentPageItems.length) {
41503                         throw new Error('No Data');
41504                     }
41505
41506                     var features = data.currentPageItems.map(function(item) {
41507                         var loc = [+item.lng, +item.lat];
41508                         var d;
41509
41510                         if (which === 'images') {
41511                             d = {
41512                                 loc: loc,
41513                                 key: item.id,
41514                                 ca: +item.heading,
41515                                 captured_at: (item.shot_date || item.date_added),
41516                                 captured_by: item.username,
41517                                 imagePath: item.lth_name,
41518                                 sequence_id: item.sequence_id,
41519                                 sequence_index: +item.sequence_index
41520                             };
41521
41522                             // cache sequence info
41523                             var seq = _oscCache.sequences[d.sequence_id];
41524                             if (!seq) {
41525                                 seq = { rotation: 0, images: [] };
41526                                 _oscCache.sequences[d.sequence_id] = seq;
41527                             }
41528                             seq.images[d.sequence_index] = d;
41529                         }
41530
41531                         return {
41532                             minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
41533                         };
41534                     });
41535
41536                     cache.rtree.load(features);
41537
41538                     if (data.currentPageItems.length === maxResults$1) {  // more pages to load
41539                         cache.nextPage[tile.id] = nextPage + 1;
41540                         loadNextTilePage$1(which, currZoom, url, tile);
41541                     } else {
41542                         cache.nextPage[tile.id] = Infinity;     // no more pages to load
41543                     }
41544
41545                     if (which === 'images') {
41546                         dispatch$4.call('loadedImages');
41547                     }
41548                 })
41549                 .catch(function() {
41550                     cache.loaded[id] = true;
41551                     delete cache.inflight[id];
41552                 });
41553         }
41554
41555
41556         // partition viewport into higher zoom tiles
41557         function partitionViewport$1(projection) {
41558             var z = geoScaleToZoom(projection.scale());
41559             var z2 = (Math.ceil(z * 2) / 2) + 2.5;   // round to next 0.5 and add 2.5
41560             var tiler = utilTiler().zoomExtent([z2, z2]);
41561
41562             return tiler.getTiles(projection)
41563                 .map(function(tile) { return tile.extent; });
41564         }
41565
41566
41567         // no more than `limit` results per partition.
41568         function searchLimited$1(limit, projection, rtree) {
41569             limit = limit || 5;
41570
41571             return partitionViewport$1(projection)
41572                 .reduce(function(result, extent) {
41573                     var found = rtree.search(extent.bbox())
41574                         .slice(0, limit)
41575                         .map(function(d) { return d.data; });
41576
41577                     return (found.length ? result.concat(found) : result);
41578                 }, []);
41579         }
41580
41581
41582         function zoomPan() {
41583             var t = event.transform;
41584             d3_select('#photoviewer .osc-image-wrap')
41585                 .call(utilSetTransform, t.x, t.y, t.k);
41586         }
41587
41588
41589         var serviceOpenstreetcam = {
41590
41591             init: function() {
41592                 if (!_oscCache) {
41593                     this.reset();
41594                 }
41595
41596                 this.event = utilRebind(this, dispatch$4, 'on');
41597             },
41598
41599             reset: function() {
41600                 if (_oscCache) {
41601                     Object.values(_oscCache.images.inflight).forEach(abortRequest$3);
41602                 }
41603
41604                 _oscCache = {
41605                     images: { inflight: {}, loaded: {}, nextPage: {}, rtree: rbush_1() },
41606                     sequences: {}
41607                 };
41608
41609                 _oscSelectedImage = null;
41610             },
41611
41612
41613             images: function(projection) {
41614                 var limit = 5;
41615                 return searchLimited$1(limit, projection, _oscCache.images.rtree);
41616             },
41617
41618
41619             sequences: function(projection) {
41620                 var viewport = projection.clipExtent();
41621                 var min = [viewport[0][0], viewport[1][1]];
41622                 var max = [viewport[1][0], viewport[0][1]];
41623                 var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
41624                 var sequenceKeys = {};
41625
41626                 // all sequences for images in viewport
41627                 _oscCache.images.rtree.search(bbox)
41628                     .forEach(function(d) { sequenceKeys[d.data.sequence_id] = true; });
41629
41630                 // make linestrings from those sequences
41631                 var lineStrings = [];
41632                 Object.keys(sequenceKeys)
41633                     .forEach(function(sequenceKey) {
41634                         var seq = _oscCache.sequences[sequenceKey];
41635                         var images = seq && seq.images;
41636                         if (images) {
41637                             lineStrings.push({
41638                                 type: 'LineString',
41639                                 coordinates: images.map(function (d) { return d.loc; }).filter(Boolean),
41640                                 properties: { key: sequenceKey }
41641                             });
41642                         }
41643                     });
41644                 return lineStrings;
41645             },
41646
41647
41648             loadImages: function(projection) {
41649                 var url = apibase$2 + '/1.0/list/nearby-photos/';
41650                 loadTiles$1('images', url, projection);
41651             },
41652
41653
41654             loadViewer: function(context) {
41655                 var that = this;
41656
41657                 // add osc-wrapper
41658                 var wrap = d3_select('#photoviewer').selectAll('.osc-wrapper')
41659                     .data([0]);
41660
41661                 var wrapEnter = wrap.enter()
41662                     .append('div')
41663                     .attr('class', 'photo-wrapper osc-wrapper')
41664                     .classed('hide', true)
41665                     .call(imgZoom)
41666                     .on('dblclick.zoom', null);
41667
41668                 wrapEnter
41669                     .append('div')
41670                     .attr('class', 'photo-attribution fillD');
41671
41672                 var controlsEnter = wrapEnter
41673                     .append('div')
41674                     .attr('class', 'photo-controls-wrap')
41675                     .append('div')
41676                     .attr('class', 'photo-controls');
41677
41678                 controlsEnter
41679                     .append('button')
41680                     .on('click.back', step(-1))
41681                     .text('◄');
41682
41683                 controlsEnter
41684                     .append('button')
41685                     .on('click.rotate-ccw', rotate(-90))
41686                     .text('⤿');
41687
41688                 controlsEnter
41689                     .append('button')
41690                     .on('click.rotate-cw', rotate(90))
41691                     .text('⤾');
41692
41693                 controlsEnter
41694                     .append('button')
41695                     .on('click.forward', step(1))
41696                     .text('►');
41697
41698                 wrapEnter
41699                     .append('div')
41700                     .attr('class', 'osc-image-wrap');
41701
41702
41703                 // Register viewer resize handler
41704                 context.ui().photoviewer.on('resize', function(dimensions) {
41705                     imgZoom = d3_zoom()
41706                         .extent([[0, 0], dimensions])
41707                         .translateExtent([[0, 0], dimensions])
41708                         .scaleExtent([1, 15])
41709                         .on('zoom', zoomPan);
41710                 });
41711
41712
41713                 function rotate(deg) {
41714                     return function() {
41715                         if (!_oscSelectedImage) return;
41716                         var sequenceKey = _oscSelectedImage.sequence_id;
41717                         var sequence = _oscCache.sequences[sequenceKey];
41718                         if (!sequence) return;
41719
41720                         var r = sequence.rotation || 0;
41721                         r += deg;
41722
41723                         if (r > 180) r -= 360;
41724                         if (r < -180) r += 360;
41725                         sequence.rotation = r;
41726
41727                         var wrap = d3_select('#photoviewer .osc-wrapper');
41728
41729                         wrap
41730                             .transition()
41731                             .duration(100)
41732                             .call(imgZoom.transform, identity$8);
41733
41734                         wrap.selectAll('.osc-image')
41735                             .transition()
41736                             .duration(100)
41737                             .style('transform', 'rotate(' + r + 'deg)');
41738                     };
41739                 }
41740
41741                 function step(stepBy) {
41742                     return function() {
41743                         if (!_oscSelectedImage) return;
41744                         var sequenceKey = _oscSelectedImage.sequence_id;
41745                         var sequence = _oscCache.sequences[sequenceKey];
41746                         if (!sequence) return;
41747
41748                         var nextIndex = _oscSelectedImage.sequence_index + stepBy;
41749                         var nextImage = sequence.images[nextIndex];
41750                         if (!nextImage) return;
41751
41752                         context.map().centerEase(nextImage.loc);
41753
41754                         that
41755                             .selectImage(nextImage)
41756                             .updateViewer(nextImage);
41757                     };
41758                 }
41759             },
41760
41761
41762             showViewer: function() {
41763                 var viewer = d3_select('#photoviewer')
41764                     .classed('hide', false);
41765
41766                 var isHidden = viewer.selectAll('.photo-wrapper.osc-wrapper.hide').size();
41767
41768                 if (isHidden) {
41769                     viewer
41770                         .selectAll('.photo-wrapper:not(.osc-wrapper)')
41771                         .classed('hide', true);
41772
41773                     viewer
41774                         .selectAll('.photo-wrapper.osc-wrapper')
41775                         .classed('hide', false);
41776                 }
41777
41778                 return this;
41779             },
41780
41781
41782             hideViewer: function() {
41783                 _oscSelectedImage = null;
41784
41785                 var viewer = d3_select('#photoviewer');
41786                 if (!viewer.empty()) viewer.datum(null);
41787
41788                 viewer
41789                     .classed('hide', true)
41790                     .selectAll('.photo-wrapper')
41791                     .classed('hide', true);
41792
41793                 d3_selectAll('.viewfield-group, .sequence, .icon-sign')
41794                     .classed('currentView', false);
41795
41796                 return this.setStyles(null, true);
41797             },
41798
41799
41800             updateViewer: function(d) {
41801                 var wrap = d3_select('#photoviewer .osc-wrapper');
41802                 var imageWrap = wrap.selectAll('.osc-image-wrap');
41803                 var attribution = wrap.selectAll('.photo-attribution').html('');
41804
41805                 wrap
41806                     .transition()
41807                     .duration(100)
41808                     .call(imgZoom.transform, identity$8);
41809
41810                 imageWrap
41811                     .selectAll('.osc-image')
41812                     .remove();
41813
41814                 if (d) {
41815                     var sequence = _oscCache.sequences[d.sequence_id];
41816                     var r = (sequence && sequence.rotation) || 0;
41817
41818                     imageWrap
41819                         .append('img')
41820                         .attr('class', 'osc-image')
41821                         .attr('src', apibase$2 + '/' + d.imagePath)
41822                         .style('transform', 'rotate(' + r + 'deg)');
41823
41824                     if (d.captured_by) {
41825                         attribution
41826                             .append('a')
41827                             .attr('class', 'captured_by')
41828                             .attr('target', '_blank')
41829                             .attr('href', 'https://openstreetcam.org/user/' + encodeURIComponent(d.captured_by))
41830                             .text('@' + d.captured_by);
41831
41832                         attribution
41833                             .append('span')
41834                             .text('|');
41835                     }
41836
41837                     if (d.captured_at) {
41838                         attribution
41839                             .append('span')
41840                             .attr('class', 'captured_at')
41841                             .text(localeDateString(d.captured_at));
41842
41843                         attribution
41844                             .append('span')
41845                             .text('|');
41846                     }
41847
41848                     attribution
41849                         .append('a')
41850                         .attr('class', 'image-link')
41851                         .attr('target', '_blank')
41852                         .attr('href', 'https://openstreetcam.org/details/' + d.sequence_id + '/' + d.sequence_index)
41853                         .text('openstreetcam.org');
41854                 }
41855
41856                 return this;
41857
41858
41859                 function localeDateString(s) {
41860                     if (!s) return null;
41861                     var detected = utilDetect();
41862                     var options = { day: 'numeric', month: 'short', year: 'numeric' };
41863                     var d = new Date(s);
41864                     if (isNaN(d.getTime())) return null;
41865                     return d.toLocaleDateString(detected.locale, options);
41866                 }
41867             },
41868
41869
41870             selectImage: function(d) {
41871                 _oscSelectedImage = d;
41872                 var viewer = d3_select('#photoviewer');
41873                 if (!viewer.empty()) viewer.datum(d);
41874
41875                 this.setStyles(null, true);
41876
41877                 d3_selectAll('.icon-sign')
41878                     .classed('currentView', false);
41879
41880                 return this;
41881             },
41882
41883
41884             getSelectedImage: function() {
41885                 return _oscSelectedImage;
41886             },
41887
41888
41889             getSequenceKeyForImage: function(d) {
41890                 return d && d.sequence_id;
41891             },
41892
41893
41894             // Updates the currently highlighted sequence and selected bubble.
41895             // Reset is only necessary when interacting with the viewport because
41896             // this implicitly changes the currently selected bubble/sequence
41897             setStyles: function(hovered, reset) {
41898                 if (reset) {  // reset all layers
41899                     d3_selectAll('.viewfield-group')
41900                         .classed('highlighted', false)
41901                         .classed('hovered', false)
41902                         .classed('currentView', false);
41903
41904                     d3_selectAll('.sequence')
41905                         .classed('highlighted', false)
41906                         .classed('currentView', false);
41907                 }
41908
41909                 var hoveredImageKey = hovered && hovered.key;
41910                 var hoveredSequenceKey = this.getSequenceKeyForImage(hovered);
41911                 var hoveredSequence = hoveredSequenceKey && _oscCache.sequences[hoveredSequenceKey];
41912                 var hoveredImageKeys = (hoveredSequence && hoveredSequence.images.map(function (d) { return d.key; })) || [];
41913
41914                 var viewer = d3_select('#photoviewer');
41915                 var selected = viewer.empty() ? undefined : viewer.datum();
41916                 var selectedImageKey = selected && selected.key;
41917                 var selectedSequenceKey = this.getSequenceKeyForImage(selected);
41918                 var selectedSequence = selectedSequenceKey && _oscCache.sequences[selectedSequenceKey];
41919                 var selectedImageKeys = (selectedSequence && selectedSequence.images.map(function (d) { return d.key; })) || [];
41920
41921                 // highlight sibling viewfields on either the selected or the hovered sequences
41922                 var highlightedImageKeys = utilArrayUnion(hoveredImageKeys, selectedImageKeys);
41923
41924                 d3_selectAll('.layer-openstreetcam .viewfield-group')
41925                     .classed('highlighted', function(d) { return highlightedImageKeys.indexOf(d.key) !== -1; })
41926                     .classed('hovered', function(d) { return d.key === hoveredImageKey; })
41927                     .classed('currentView', function(d) { return d.key === selectedImageKey; });
41928
41929                 d3_selectAll('.layer-openstreetcam .sequence')
41930                     .classed('highlighted', function(d) { return d.properties.key === hoveredSequenceKey; })
41931                     .classed('currentView', function(d) { return d.properties.key === selectedSequenceKey; });
41932
41933                 // update viewfields if needed
41934                 d3_selectAll('.viewfield-group .viewfield')
41935                     .attr('d', viewfieldPath);
41936
41937                 function viewfieldPath() {
41938                     var d = this.parentNode.__data__;
41939                     if (d.pano && d.key !== selectedImageKey) {
41940                         return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
41941                     } else {
41942                         return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
41943                     }
41944                 }
41945
41946                 return this;
41947             },
41948
41949
41950             cache: function() {
41951                 return _oscCache;
41952             }
41953
41954         };
41955
41956         /**
41957          * Checks if `value` is the
41958          * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
41959          * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
41960          *
41961          * @static
41962          * @memberOf _
41963          * @since 0.1.0
41964          * @category Lang
41965          * @param {*} value The value to check.
41966          * @returns {boolean} Returns `true` if `value` is an object, else `false`.
41967          * @example
41968          *
41969          * _.isObject({});
41970          * // => true
41971          *
41972          * _.isObject([1, 2, 3]);
41973          * // => true
41974          *
41975          * _.isObject(_.noop);
41976          * // => true
41977          *
41978          * _.isObject(null);
41979          * // => false
41980          */
41981         function isObject$1(value) {
41982           var type = typeof value;
41983           return value != null && (type == 'object' || type == 'function');
41984         }
41985
41986         /** Detect free variable `global` from Node.js. */
41987         var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
41988
41989         /** Detect free variable `self`. */
41990         var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
41991
41992         /** Used as a reference to the global object. */
41993         var root$3 = freeGlobal || freeSelf || Function('return this')();
41994
41995         /**
41996          * Gets the timestamp of the number of milliseconds that have elapsed since
41997          * the Unix epoch (1 January 1970 00:00:00 UTC).
41998          *
41999          * @static
42000          * @memberOf _
42001          * @since 2.4.0
42002          * @category Date
42003          * @returns {number} Returns the timestamp.
42004          * @example
42005          *
42006          * _.defer(function(stamp) {
42007          *   console.log(_.now() - stamp);
42008          * }, _.now());
42009          * // => Logs the number of milliseconds it took for the deferred invocation.
42010          */
42011         var now$1 = function() {
42012           return root$3.Date.now();
42013         };
42014
42015         /** Built-in value references. */
42016         var Symbol$1 = root$3.Symbol;
42017
42018         /** Used for built-in method references. */
42019         var objectProto = Object.prototype;
42020
42021         /** Used to check objects for own properties. */
42022         var hasOwnProperty$1 = objectProto.hasOwnProperty;
42023
42024         /**
42025          * Used to resolve the
42026          * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
42027          * of values.
42028          */
42029         var nativeObjectToString = objectProto.toString;
42030
42031         /** Built-in value references. */
42032         var symToStringTag = Symbol$1 ? Symbol$1.toStringTag : undefined;
42033
42034         /**
42035          * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
42036          *
42037          * @private
42038          * @param {*} value The value to query.
42039          * @returns {string} Returns the raw `toStringTag`.
42040          */
42041         function getRawTag(value) {
42042           var isOwn = hasOwnProperty$1.call(value, symToStringTag),
42043               tag = value[symToStringTag];
42044
42045           try {
42046             value[symToStringTag] = undefined;
42047             var unmasked = true;
42048           } catch (e) {}
42049
42050           var result = nativeObjectToString.call(value);
42051           if (unmasked) {
42052             if (isOwn) {
42053               value[symToStringTag] = tag;
42054             } else {
42055               delete value[symToStringTag];
42056             }
42057           }
42058           return result;
42059         }
42060
42061         /** Used for built-in method references. */
42062         var objectProto$1 = Object.prototype;
42063
42064         /**
42065          * Used to resolve the
42066          * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
42067          * of values.
42068          */
42069         var nativeObjectToString$1 = objectProto$1.toString;
42070
42071         /**
42072          * Converts `value` to a string using `Object.prototype.toString`.
42073          *
42074          * @private
42075          * @param {*} value The value to convert.
42076          * @returns {string} Returns the converted string.
42077          */
42078         function objectToString(value) {
42079           return nativeObjectToString$1.call(value);
42080         }
42081
42082         /** `Object#toString` result references. */
42083         var nullTag = '[object Null]',
42084             undefinedTag = '[object Undefined]';
42085
42086         /** Built-in value references. */
42087         var symToStringTag$1 = Symbol$1 ? Symbol$1.toStringTag : undefined;
42088
42089         /**
42090          * The base implementation of `getTag` without fallbacks for buggy environments.
42091          *
42092          * @private
42093          * @param {*} value The value to query.
42094          * @returns {string} Returns the `toStringTag`.
42095          */
42096         function baseGetTag(value) {
42097           if (value == null) {
42098             return value === undefined ? undefinedTag : nullTag;
42099           }
42100           return (symToStringTag$1 && symToStringTag$1 in Object(value))
42101             ? getRawTag(value)
42102             : objectToString(value);
42103         }
42104
42105         /**
42106          * Checks if `value` is object-like. A value is object-like if it's not `null`
42107          * and has a `typeof` result of "object".
42108          *
42109          * @static
42110          * @memberOf _
42111          * @since 4.0.0
42112          * @category Lang
42113          * @param {*} value The value to check.
42114          * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
42115          * @example
42116          *
42117          * _.isObjectLike({});
42118          * // => true
42119          *
42120          * _.isObjectLike([1, 2, 3]);
42121          * // => true
42122          *
42123          * _.isObjectLike(_.noop);
42124          * // => false
42125          *
42126          * _.isObjectLike(null);
42127          * // => false
42128          */
42129         function isObjectLike(value) {
42130           return value != null && typeof value == 'object';
42131         }
42132
42133         /** `Object#toString` result references. */
42134         var symbolTag = '[object Symbol]';
42135
42136         /**
42137          * Checks if `value` is classified as a `Symbol` primitive or object.
42138          *
42139          * @static
42140          * @memberOf _
42141          * @since 4.0.0
42142          * @category Lang
42143          * @param {*} value The value to check.
42144          * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
42145          * @example
42146          *
42147          * _.isSymbol(Symbol.iterator);
42148          * // => true
42149          *
42150          * _.isSymbol('abc');
42151          * // => false
42152          */
42153         function isSymbol$2(value) {
42154           return typeof value == 'symbol' ||
42155             (isObjectLike(value) && baseGetTag(value) == symbolTag);
42156         }
42157
42158         /** Used as references for various `Number` constants. */
42159         var NAN = 0 / 0;
42160
42161         /** Used to match leading and trailing whitespace. */
42162         var reTrim = /^\s+|\s+$/g;
42163
42164         /** Used to detect bad signed hexadecimal string values. */
42165         var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
42166
42167         /** Used to detect binary string values. */
42168         var reIsBinary = /^0b[01]+$/i;
42169
42170         /** Used to detect octal string values. */
42171         var reIsOctal = /^0o[0-7]+$/i;
42172
42173         /** Built-in method references without a dependency on `root`. */
42174         var freeParseInt = parseInt;
42175
42176         /**
42177          * Converts `value` to a number.
42178          *
42179          * @static
42180          * @memberOf _
42181          * @since 4.0.0
42182          * @category Lang
42183          * @param {*} value The value to process.
42184          * @returns {number} Returns the number.
42185          * @example
42186          *
42187          * _.toNumber(3.2);
42188          * // => 3.2
42189          *
42190          * _.toNumber(Number.MIN_VALUE);
42191          * // => 5e-324
42192          *
42193          * _.toNumber(Infinity);
42194          * // => Infinity
42195          *
42196          * _.toNumber('3.2');
42197          * // => 3.2
42198          */
42199         function toNumber(value) {
42200           if (typeof value == 'number') {
42201             return value;
42202           }
42203           if (isSymbol$2(value)) {
42204             return NAN;
42205           }
42206           if (isObject$1(value)) {
42207             var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
42208             value = isObject$1(other) ? (other + '') : other;
42209           }
42210           if (typeof value != 'string') {
42211             return value === 0 ? value : +value;
42212           }
42213           value = value.replace(reTrim, '');
42214           var isBinary = reIsBinary.test(value);
42215           return (isBinary || reIsOctal.test(value))
42216             ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
42217             : (reIsBadHex.test(value) ? NAN : +value);
42218         }
42219
42220         /** Error message constants. */
42221         var FUNC_ERROR_TEXT = 'Expected a function';
42222
42223         /* Built-in method references for those with the same name as other `lodash` methods. */
42224         var nativeMax = Math.max,
42225             nativeMin = Math.min;
42226
42227         /**
42228          * Creates a debounced function that delays invoking `func` until after `wait`
42229          * milliseconds have elapsed since the last time the debounced function was
42230          * invoked. The debounced function comes with a `cancel` method to cancel
42231          * delayed `func` invocations and a `flush` method to immediately invoke them.
42232          * Provide `options` to indicate whether `func` should be invoked on the
42233          * leading and/or trailing edge of the `wait` timeout. The `func` is invoked
42234          * with the last arguments provided to the debounced function. Subsequent
42235          * calls to the debounced function return the result of the last `func`
42236          * invocation.
42237          *
42238          * **Note:** If `leading` and `trailing` options are `true`, `func` is
42239          * invoked on the trailing edge of the timeout only if the debounced function
42240          * is invoked more than once during the `wait` timeout.
42241          *
42242          * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
42243          * until to the next tick, similar to `setTimeout` with a timeout of `0`.
42244          *
42245          * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
42246          * for details over the differences between `_.debounce` and `_.throttle`.
42247          *
42248          * @static
42249          * @memberOf _
42250          * @since 0.1.0
42251          * @category Function
42252          * @param {Function} func The function to debounce.
42253          * @param {number} [wait=0] The number of milliseconds to delay.
42254          * @param {Object} [options={}] The options object.
42255          * @param {boolean} [options.leading=false]
42256          *  Specify invoking on the leading edge of the timeout.
42257          * @param {number} [options.maxWait]
42258          *  The maximum time `func` is allowed to be delayed before it's invoked.
42259          * @param {boolean} [options.trailing=true]
42260          *  Specify invoking on the trailing edge of the timeout.
42261          * @returns {Function} Returns the new debounced function.
42262          * @example
42263          *
42264          * // Avoid costly calculations while the window size is in flux.
42265          * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
42266          *
42267          * // Invoke `sendMail` when clicked, debouncing subsequent calls.
42268          * jQuery(element).on('click', _.debounce(sendMail, 300, {
42269          *   'leading': true,
42270          *   'trailing': false
42271          * }));
42272          *
42273          * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
42274          * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
42275          * var source = new EventSource('/stream');
42276          * jQuery(source).on('message', debounced);
42277          *
42278          * // Cancel the trailing debounced invocation.
42279          * jQuery(window).on('popstate', debounced.cancel);
42280          */
42281         function debounce(func, wait, options) {
42282           var lastArgs,
42283               lastThis,
42284               maxWait,
42285               result,
42286               timerId,
42287               lastCallTime,
42288               lastInvokeTime = 0,
42289               leading = false,
42290               maxing = false,
42291               trailing = true;
42292
42293           if (typeof func != 'function') {
42294             throw new TypeError(FUNC_ERROR_TEXT);
42295           }
42296           wait = toNumber(wait) || 0;
42297           if (isObject$1(options)) {
42298             leading = !!options.leading;
42299             maxing = 'maxWait' in options;
42300             maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;
42301             trailing = 'trailing' in options ? !!options.trailing : trailing;
42302           }
42303
42304           function invokeFunc(time) {
42305             var args = lastArgs,
42306                 thisArg = lastThis;
42307
42308             lastArgs = lastThis = undefined;
42309             lastInvokeTime = time;
42310             result = func.apply(thisArg, args);
42311             return result;
42312           }
42313
42314           function leadingEdge(time) {
42315             // Reset any `maxWait` timer.
42316             lastInvokeTime = time;
42317             // Start the timer for the trailing edge.
42318             timerId = setTimeout(timerExpired, wait);
42319             // Invoke the leading edge.
42320             return leading ? invokeFunc(time) : result;
42321           }
42322
42323           function remainingWait(time) {
42324             var timeSinceLastCall = time - lastCallTime,
42325                 timeSinceLastInvoke = time - lastInvokeTime,
42326                 timeWaiting = wait - timeSinceLastCall;
42327
42328             return maxing
42329               ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)
42330               : timeWaiting;
42331           }
42332
42333           function shouldInvoke(time) {
42334             var timeSinceLastCall = time - lastCallTime,
42335                 timeSinceLastInvoke = time - lastInvokeTime;
42336
42337             // Either this is the first call, activity has stopped and we're at the
42338             // trailing edge, the system time has gone backwards and we're treating
42339             // it as the trailing edge, or we've hit the `maxWait` limit.
42340             return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
42341               (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
42342           }
42343
42344           function timerExpired() {
42345             var time = now$1();
42346             if (shouldInvoke(time)) {
42347               return trailingEdge(time);
42348             }
42349             // Restart the timer.
42350             timerId = setTimeout(timerExpired, remainingWait(time));
42351           }
42352
42353           function trailingEdge(time) {
42354             timerId = undefined;
42355
42356             // Only invoke if we have `lastArgs` which means `func` has been
42357             // debounced at least once.
42358             if (trailing && lastArgs) {
42359               return invokeFunc(time);
42360             }
42361             lastArgs = lastThis = undefined;
42362             return result;
42363           }
42364
42365           function cancel() {
42366             if (timerId !== undefined) {
42367               clearTimeout(timerId);
42368             }
42369             lastInvokeTime = 0;
42370             lastArgs = lastCallTime = lastThis = timerId = undefined;
42371           }
42372
42373           function flush() {
42374             return timerId === undefined ? result : trailingEdge(now$1());
42375           }
42376
42377           function debounced() {
42378             var time = now$1(),
42379                 isInvoking = shouldInvoke(time);
42380
42381             lastArgs = arguments;
42382             lastThis = this;
42383             lastCallTime = time;
42384
42385             if (isInvoking) {
42386               if (timerId === undefined) {
42387                 return leadingEdge(lastCallTime);
42388               }
42389               if (maxing) {
42390                 // Handle invocations in a tight loop.
42391                 timerId = setTimeout(timerExpired, wait);
42392                 return invokeFunc(lastCallTime);
42393               }
42394             }
42395             if (timerId === undefined) {
42396               timerId = setTimeout(timerExpired, wait);
42397             }
42398             return result;
42399           }
42400           debounced.cancel = cancel;
42401           debounced.flush = flush;
42402           return debounced;
42403         }
42404
42405         /** Error message constants. */
42406         var FUNC_ERROR_TEXT$1 = 'Expected a function';
42407
42408         /**
42409          * Creates a throttled function that only invokes `func` at most once per
42410          * every `wait` milliseconds. The throttled function comes with a `cancel`
42411          * method to cancel delayed `func` invocations and a `flush` method to
42412          * immediately invoke them. Provide `options` to indicate whether `func`
42413          * should be invoked on the leading and/or trailing edge of the `wait`
42414          * timeout. The `func` is invoked with the last arguments provided to the
42415          * throttled function. Subsequent calls to the throttled function return the
42416          * result of the last `func` invocation.
42417          *
42418          * **Note:** If `leading` and `trailing` options are `true`, `func` is
42419          * invoked on the trailing edge of the timeout only if the throttled function
42420          * is invoked more than once during the `wait` timeout.
42421          *
42422          * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
42423          * until to the next tick, similar to `setTimeout` with a timeout of `0`.
42424          *
42425          * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
42426          * for details over the differences between `_.throttle` and `_.debounce`.
42427          *
42428          * @static
42429          * @memberOf _
42430          * @since 0.1.0
42431          * @category Function
42432          * @param {Function} func The function to throttle.
42433          * @param {number} [wait=0] The number of milliseconds to throttle invocations to.
42434          * @param {Object} [options={}] The options object.
42435          * @param {boolean} [options.leading=true]
42436          *  Specify invoking on the leading edge of the timeout.
42437          * @param {boolean} [options.trailing=true]
42438          *  Specify invoking on the trailing edge of the timeout.
42439          * @returns {Function} Returns the new throttled function.
42440          * @example
42441          *
42442          * // Avoid excessively updating the position while scrolling.
42443          * jQuery(window).on('scroll', _.throttle(updatePosition, 100));
42444          *
42445          * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
42446          * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });
42447          * jQuery(element).on('click', throttled);
42448          *
42449          * // Cancel the trailing throttled invocation.
42450          * jQuery(window).on('popstate', throttled.cancel);
42451          */
42452         function throttle(func, wait, options) {
42453           var leading = true,
42454               trailing = true;
42455
42456           if (typeof func != 'function') {
42457             throw new TypeError(FUNC_ERROR_TEXT$1);
42458           }
42459           if (isObject$1(options)) {
42460             leading = 'leading' in options ? !!options.leading : leading;
42461             trailing = 'trailing' in options ? !!options.trailing : trailing;
42462           }
42463           return debounce(func, wait, {
42464             'leading': leading,
42465             'maxWait': wait,
42466             'trailing': trailing
42467           });
42468         }
42469
42470         var hashes = createCommonjsModule(function (module, exports) {
42471         /**
42472          * jshashes - https://github.com/h2non/jshashes
42473          * Released under the "New BSD" license
42474          *
42475          * Algorithms specification:
42476          *
42477          * MD5 - http://www.ietf.org/rfc/rfc1321.txt
42478          * RIPEMD-160 - http://homes.esat.kuleuven.be/~bosselae/ripemd160.html
42479          * SHA1   - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
42480          * SHA256 - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
42481          * SHA512 - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
42482          * HMAC - http://www.ietf.org/rfc/rfc2104.txt
42483          */
42484         (function() {
42485           var Hashes;
42486
42487           function utf8Encode(str) {
42488             var x, y, output = '',
42489               i = -1,
42490               l;
42491
42492             if (str && str.length) {
42493               l = str.length;
42494               while ((i += 1) < l) {
42495                 /* Decode utf-16 surrogate pairs */
42496                 x = str.charCodeAt(i);
42497                 y = i + 1 < l ? str.charCodeAt(i + 1) : 0;
42498                 if (0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF) {
42499                   x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF);
42500                   i += 1;
42501                 }
42502                 /* Encode output as utf-8 */
42503                 if (x <= 0x7F) {
42504                   output += String.fromCharCode(x);
42505                 } else if (x <= 0x7FF) {
42506                   output += String.fromCharCode(0xC0 | ((x >>> 6) & 0x1F),
42507                     0x80 | (x & 0x3F));
42508                 } else if (x <= 0xFFFF) {
42509                   output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F),
42510                     0x80 | ((x >>> 6) & 0x3F),
42511                     0x80 | (x & 0x3F));
42512                 } else if (x <= 0x1FFFFF) {
42513                   output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07),
42514                     0x80 | ((x >>> 12) & 0x3F),
42515                     0x80 | ((x >>> 6) & 0x3F),
42516                     0x80 | (x & 0x3F));
42517                 }
42518               }
42519             }
42520             return output;
42521           }
42522
42523           function utf8Decode(str) {
42524             var i, ac, c1, c2, c3, arr = [],
42525               l;
42526             i = ac = c1 = c2 = c3 = 0;
42527
42528             if (str && str.length) {
42529               l = str.length;
42530               str += '';
42531
42532               while (i < l) {
42533                 c1 = str.charCodeAt(i);
42534                 ac += 1;
42535                 if (c1 < 128) {
42536                   arr[ac] = String.fromCharCode(c1);
42537                   i += 1;
42538                 } else if (c1 > 191 && c1 < 224) {
42539                   c2 = str.charCodeAt(i + 1);
42540                   arr[ac] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));
42541                   i += 2;
42542                 } else {
42543                   c2 = str.charCodeAt(i + 1);
42544                   c3 = str.charCodeAt(i + 2);
42545                   arr[ac] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
42546                   i += 3;
42547                 }
42548               }
42549             }
42550             return arr.join('');
42551           }
42552
42553           /**
42554            * Add integers, wrapping at 2^32. This uses 16-bit operations internally
42555            * to work around bugs in some JS interpreters.
42556            */
42557
42558           function safe_add(x, y) {
42559             var lsw = (x & 0xFFFF) + (y & 0xFFFF),
42560               msw = (x >> 16) + (y >> 16) + (lsw >> 16);
42561             return (msw << 16) | (lsw & 0xFFFF);
42562           }
42563
42564           /**
42565            * Bitwise rotate a 32-bit number to the left.
42566            */
42567
42568           function bit_rol(num, cnt) {
42569             return (num << cnt) | (num >>> (32 - cnt));
42570           }
42571
42572           /**
42573            * Convert a raw string to a hex string
42574            */
42575
42576           function rstr2hex(input, hexcase) {
42577             var hex_tab = hexcase ? '0123456789ABCDEF' : '0123456789abcdef',
42578               output = '',
42579               x, i = 0,
42580               l = input.length;
42581             for (; i < l; i += 1) {
42582               x = input.charCodeAt(i);
42583               output += hex_tab.charAt((x >>> 4) & 0x0F) + hex_tab.charAt(x & 0x0F);
42584             }
42585             return output;
42586           }
42587
42588           /**
42589            * Convert an array of big-endian words to a string
42590            */
42591
42592           function binb2rstr(input) {
42593             var i, l = input.length * 32,
42594               output = '';
42595             for (i = 0; i < l; i += 8) {
42596               output += String.fromCharCode((input[i >> 5] >>> (24 - i % 32)) & 0xFF);
42597             }
42598             return output;
42599           }
42600
42601           /**
42602            * Convert an array of little-endian words to a string
42603            */
42604
42605           function binl2rstr(input) {
42606             var i, l = input.length * 32,
42607               output = '';
42608             for (i = 0; i < l; i += 8) {
42609               output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF);
42610             }
42611             return output;
42612           }
42613
42614           /**
42615            * Convert a raw string to an array of little-endian words
42616            * Characters >255 have their high-byte silently ignored.
42617            */
42618
42619           function rstr2binl(input) {
42620             var i, l = input.length * 8,
42621               output = Array(input.length >> 2),
42622               lo = output.length;
42623             for (i = 0; i < lo; i += 1) {
42624               output[i] = 0;
42625             }
42626             for (i = 0; i < l; i += 8) {
42627               output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (i % 32);
42628             }
42629             return output;
42630           }
42631
42632           /**
42633            * Convert a raw string to an array of big-endian words
42634            * Characters >255 have their high-byte silently ignored.
42635            */
42636
42637           function rstr2binb(input) {
42638             var i, l = input.length * 8,
42639               output = Array(input.length >> 2),
42640               lo = output.length;
42641             for (i = 0; i < lo; i += 1) {
42642               output[i] = 0;
42643             }
42644             for (i = 0; i < l; i += 8) {
42645               output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (24 - i % 32);
42646             }
42647             return output;
42648           }
42649
42650           /**
42651            * Convert a raw string to an arbitrary string encoding
42652            */
42653
42654           function rstr2any(input, encoding) {
42655             var divisor = encoding.length,
42656               remainders = Array(),
42657               i, q, x, ld, quotient, dividend, output, full_length;
42658
42659             /* Convert to an array of 16-bit big-endian values, forming the dividend */
42660             dividend = Array(Math.ceil(input.length / 2));
42661             ld = dividend.length;
42662             for (i = 0; i < ld; i += 1) {
42663               dividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1);
42664             }
42665
42666             /**
42667              * Repeatedly perform a long division. The binary array forms the dividend,
42668              * the length of the encoding is the divisor. Once computed, the quotient
42669              * forms the dividend for the next step. We stop when the dividend is zerHashes.
42670              * All remainders are stored for later use.
42671              */
42672             while (dividend.length > 0) {
42673               quotient = Array();
42674               x = 0;
42675               for (i = 0; i < dividend.length; i += 1) {
42676                 x = (x << 16) + dividend[i];
42677                 q = Math.floor(x / divisor);
42678                 x -= q * divisor;
42679                 if (quotient.length > 0 || q > 0) {
42680                   quotient[quotient.length] = q;
42681                 }
42682               }
42683               remainders[remainders.length] = x;
42684               dividend = quotient;
42685             }
42686
42687             /* Convert the remainders to the output string */
42688             output = '';
42689             for (i = remainders.length - 1; i >= 0; i--) {
42690               output += encoding.charAt(remainders[i]);
42691             }
42692
42693             /* Append leading zero equivalents */
42694             full_length = Math.ceil(input.length * 8 / (Math.log(encoding.length) / Math.log(2)));
42695             for (i = output.length; i < full_length; i += 1) {
42696               output = encoding[0] + output;
42697             }
42698             return output;
42699           }
42700
42701           /**
42702            * Convert a raw string to a base-64 string
42703            */
42704
42705           function rstr2b64(input, b64pad) {
42706             var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
42707               output = '',
42708               len = input.length,
42709               i, j, triplet;
42710             b64pad = b64pad || '=';
42711             for (i = 0; i < len; i += 3) {
42712               triplet = (input.charCodeAt(i) << 16) | (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) | (i + 2 < len ? input.charCodeAt(i + 2) : 0);
42713               for (j = 0; j < 4; j += 1) {
42714                 if (i * 8 + j * 6 > input.length * 8) {
42715                   output += b64pad;
42716                 } else {
42717                   output += tab.charAt((triplet >>> 6 * (3 - j)) & 0x3F);
42718                 }
42719               }
42720             }
42721             return output;
42722           }
42723
42724           Hashes = {
42725             /**
42726              * @property {String} version
42727              * @readonly
42728              */
42729             VERSION: '1.0.6',
42730             /**
42731              * @member Hashes
42732              * @class Base64
42733              * @constructor
42734              */
42735             Base64: function() {
42736               // private properties
42737               var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
42738                 pad = '=', // default pad according with the RFC standard
42739                 utf8 = true; // by default enable UTF-8 support encoding
42740
42741               // public method for encoding
42742               this.encode = function(input) {
42743                 var i, j, triplet,
42744                   output = '',
42745                   len = input.length;
42746
42747                 pad = pad || '=';
42748                 input = (utf8) ? utf8Encode(input) : input;
42749
42750                 for (i = 0; i < len; i += 3) {
42751                   triplet = (input.charCodeAt(i) << 16) | (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) | (i + 2 < len ? input.charCodeAt(i + 2) : 0);
42752                   for (j = 0; j < 4; j += 1) {
42753                     if (i * 8 + j * 6 > len * 8) {
42754                       output += pad;
42755                     } else {
42756                       output += tab.charAt((triplet >>> 6 * (3 - j)) & 0x3F);
42757                     }
42758                   }
42759                 }
42760                 return output;
42761               };
42762
42763               // public method for decoding
42764               this.decode = function(input) {
42765                 // var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
42766                 var i, o1, o2, o3, h1, h2, h3, h4, bits, ac,
42767                   dec = '',
42768                   arr = [];
42769                 if (!input) {
42770                   return input;
42771                 }
42772
42773                 i = ac = 0;
42774                 input = input.replace(new RegExp('\\' + pad, 'gi'), ''); // use '='
42775                 //input += '';
42776
42777                 do { // unpack four hexets into three octets using index points in b64
42778                   h1 = tab.indexOf(input.charAt(i += 1));
42779                   h2 = tab.indexOf(input.charAt(i += 1));
42780                   h3 = tab.indexOf(input.charAt(i += 1));
42781                   h4 = tab.indexOf(input.charAt(i += 1));
42782
42783                   bits = h1 << 18 | h2 << 12 | h3 << 6 | h4;
42784
42785                   o1 = bits >> 16 & 0xff;
42786                   o2 = bits >> 8 & 0xff;
42787                   o3 = bits & 0xff;
42788                   ac += 1;
42789
42790                   if (h3 === 64) {
42791                     arr[ac] = String.fromCharCode(o1);
42792                   } else if (h4 === 64) {
42793                     arr[ac] = String.fromCharCode(o1, o2);
42794                   } else {
42795                     arr[ac] = String.fromCharCode(o1, o2, o3);
42796                   }
42797                 } while (i < input.length);
42798
42799                 dec = arr.join('');
42800                 dec = (utf8) ? utf8Decode(dec) : dec;
42801
42802                 return dec;
42803               };
42804
42805               // set custom pad string
42806               this.setPad = function(str) {
42807                 pad = str || pad;
42808                 return this;
42809               };
42810               // set custom tab string characters
42811               this.setTab = function(str) {
42812                 tab = str || tab;
42813                 return this;
42814               };
42815               this.setUTF8 = function(bool) {
42816                 if (typeof bool === 'boolean') {
42817                   utf8 = bool;
42818                 }
42819                 return this;
42820               };
42821             },
42822
42823             /**
42824              * CRC-32 calculation
42825              * @member Hashes
42826              * @method CRC32
42827              * @static
42828              * @param {String} str Input String
42829              * @return {String}
42830              */
42831             CRC32: function(str) {
42832               var crc = 0,
42833                 x = 0,
42834                 y = 0,
42835                 table, i, iTop;
42836               str = utf8Encode(str);
42837
42838               table = [
42839                 '00000000 77073096 EE0E612C 990951BA 076DC419 706AF48F E963A535 9E6495A3 0EDB8832 ',
42840                 '79DCB8A4 E0D5E91E 97D2D988 09B64C2B 7EB17CBD E7B82D07 90BF1D91 1DB71064 6AB020F2 F3B97148 ',
42841                 '84BE41DE 1ADAD47D 6DDDE4EB F4D4B551 83D385C7 136C9856 646BA8C0 FD62F97A 8A65C9EC 14015C4F ',
42842                 '63066CD9 FA0F3D63 8D080DF5 3B6E20C8 4C69105E D56041E4 A2677172 3C03E4D1 4B04D447 D20D85FD ',
42843                 'A50AB56B 35B5A8FA 42B2986C DBBBC9D6 ACBCF940 32D86CE3 45DF5C75 DCD60DCF ABD13D59 26D930AC ',
42844                 '51DE003A C8D75180 BFD06116 21B4F4B5 56B3C423 CFBA9599 B8BDA50F 2802B89E 5F058808 C60CD9B2 ',
42845                 'B10BE924 2F6F7C87 58684C11 C1611DAB B6662D3D 76DC4190 01DB7106 98D220BC EFD5102A 71B18589 ',
42846                 '06B6B51F 9FBFE4A5 E8B8D433 7807C9A2 0F00F934 9609A88E E10E9818 7F6A0DBB 086D3D2D 91646C97 ',
42847                 'E6635C01 6B6B51F4 1C6C6162 856530D8 F262004E 6C0695ED 1B01A57B 8208F4C1 F50FC457 65B0D9C6 ',
42848                 '12B7E950 8BBEB8EA FCB9887C 62DD1DDF 15DA2D49 8CD37CF3 FBD44C65 4DB26158 3AB551CE A3BC0074 ',
42849                 'D4BB30E2 4ADFA541 3DD895D7 A4D1C46D D3D6F4FB 4369E96A 346ED9FC AD678846 DA60B8D0 44042D73 ',
42850                 '33031DE5 AA0A4C5F DD0D7CC9 5005713C 270241AA BE0B1010 C90C2086 5768B525 206F85B3 B966D409 ',
42851                 'CE61E49F 5EDEF90E 29D9C998 B0D09822 C7D7A8B4 59B33D17 2EB40D81 B7BD5C3B C0BA6CAD EDB88320 ',
42852                 '9ABFB3B6 03B6E20C 74B1D29A EAD54739 9DD277AF 04DB2615 73DC1683 E3630B12 94643B84 0D6D6A3E ',
42853                 '7A6A5AA8 E40ECF0B 9309FF9D 0A00AE27 7D079EB1 F00F9344 8708A3D2 1E01F268 6906C2FE F762575D ',
42854                 '806567CB 196C3671 6E6B06E7 FED41B76 89D32BE0 10DA7A5A 67DD4ACC F9B9DF6F 8EBEEFF9 17B7BE43 ',
42855                 '60B08ED5 D6D6A3E8 A1D1937E 38D8C2C4 4FDFF252 D1BB67F1 A6BC5767 3FB506DD 48B2364B D80D2BDA ',
42856                 'AF0A1B4C 36034AF6 41047A60 DF60EFC3 A867DF55 316E8EEF 4669BE79 CB61B38C BC66831A 256FD2A0 ',
42857                 '5268E236 CC0C7795 BB0B4703 220216B9 5505262F C5BA3BBE B2BD0B28 2BB45A92 5CB36A04 C2D7FFA7 ',
42858                 'B5D0CF31 2CD99E8B 5BDEAE1D 9B64C2B0 EC63F226 756AA39C 026D930A 9C0906A9 EB0E363F 72076785 ',
42859                 '05005713 95BF4A82 E2B87A14 7BB12BAE 0CB61B38 92D28E9B E5D5BE0D 7CDCEFB7 0BDBDF21 86D3D2D4 ',
42860                 'F1D4E242 68DDB3F8 1FDA836E 81BE16CD F6B9265B 6FB077E1 18B74777 88085AE6 FF0F6A70 66063BCA ',
42861                 '11010B5C 8F659EFF F862AE69 616BFFD3 166CCF45 A00AE278 D70DD2EE 4E048354 3903B3C2 A7672661 ',
42862                 'D06016F7 4969474D 3E6E77DB AED16A4A D9D65ADC 40DF0B66 37D83BF0 A9BCAE53 DEBB9EC5 47B2CF7F ',
42863                 '30B5FFE9 BDBDF21C CABAC28A 53B39330 24B4A3A6 BAD03605 CDD70693 54DE5729 23D967BF B3667A2E ',
42864                 'C4614AB8 5D681B02 2A6F2B94 B40BBE37 C30C8EA1 5A05DF1B 2D02EF8D'
42865               ].join('');
42866
42867               crc = crc ^ (-1);
42868               for (i = 0, iTop = str.length; i < iTop; i += 1) {
42869                 y = (crc ^ str.charCodeAt(i)) & 0xFF;
42870                 x = '0x' + table.substr(y * 9, 8);
42871                 crc = (crc >>> 8) ^ x;
42872               }
42873               // always return a positive number (that's what >>> 0 does)
42874               return (crc ^ (-1)) >>> 0;
42875             },
42876             /**
42877              * @member Hashes
42878              * @class MD5
42879              * @constructor
42880              * @param {Object} [config]
42881              *
42882              * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
42883              * Digest Algorithm, as defined in RFC 1321.
42884              * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
42885              * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
42886              * See <http://pajhome.org.uk/crypt/md5> for more infHashes.
42887              */
42888             MD5: function(options) {
42889               /**
42890                * Private config properties. You may need to tweak these to be compatible with
42891                * the server-side, but the defaults work in most cases.
42892                * See {@link Hashes.MD5#method-setUpperCase} and {@link Hashes.SHA1#method-setUpperCase}
42893                */
42894               var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase
42895                 b64pad = (options && typeof options.pad === 'string') ? options.pad : '=', // base-64 pad character. Defaults to '=' for strict RFC compliance
42896                 utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true; // enable/disable utf8 encoding
42897
42898               // privileged (public) methods
42899               this.hex = function(s) {
42900                 return rstr2hex(rstr(s), hexcase);
42901               };
42902               this.b64 = function(s) {
42903                 return rstr2b64(rstr(s), b64pad);
42904               };
42905               this.any = function(s, e) {
42906                 return rstr2any(rstr(s), e);
42907               };
42908               this.raw = function(s) {
42909                 return rstr(s);
42910               };
42911               this.hex_hmac = function(k, d) {
42912                 return rstr2hex(rstr_hmac(k, d), hexcase);
42913               };
42914               this.b64_hmac = function(k, d) {
42915                 return rstr2b64(rstr_hmac(k, d), b64pad);
42916               };
42917               this.any_hmac = function(k, d, e) {
42918                 return rstr2any(rstr_hmac(k, d), e);
42919               };
42920               /**
42921                * Perform a simple self-test to see if the VM is working
42922                * @return {String} Hexadecimal hash sample
42923                */
42924               this.vm_test = function() {
42925                 return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
42926               };
42927               /**
42928                * Enable/disable uppercase hexadecimal returned string
42929                * @param {Boolean}
42930                * @return {Object} this
42931                */
42932               this.setUpperCase = function(a) {
42933                 if (typeof a === 'boolean') {
42934                   hexcase = a;
42935                 }
42936                 return this;
42937               };
42938               /**
42939                * Defines a base64 pad string
42940                * @param {String} Pad
42941                * @return {Object} this
42942                */
42943               this.setPad = function(a) {
42944                 b64pad = a || b64pad;
42945                 return this;
42946               };
42947               /**
42948                * Defines a base64 pad string
42949                * @param {Boolean}
42950                * @return {Object} [this]
42951                */
42952               this.setUTF8 = function(a) {
42953                 if (typeof a === 'boolean') {
42954                   utf8 = a;
42955                 }
42956                 return this;
42957               };
42958
42959               // private methods
42960
42961               /**
42962                * Calculate the MD5 of a raw string
42963                */
42964
42965               function rstr(s) {
42966                 s = (utf8) ? utf8Encode(s) : s;
42967                 return binl2rstr(binl(rstr2binl(s), s.length * 8));
42968               }
42969
42970               /**
42971                * Calculate the HMAC-MD5, of a key and some data (raw strings)
42972                */
42973
42974               function rstr_hmac(key, data) {
42975                 var bkey, ipad, opad, hash, i;
42976
42977                 key = (utf8) ? utf8Encode(key) : key;
42978                 data = (utf8) ? utf8Encode(data) : data;
42979                 bkey = rstr2binl(key);
42980                 if (bkey.length > 16) {
42981                   bkey = binl(bkey, key.length * 8);
42982                 }
42983
42984                 ipad = Array(16), opad = Array(16);
42985                 for (i = 0; i < 16; i += 1) {
42986                   ipad[i] = bkey[i] ^ 0x36363636;
42987                   opad[i] = bkey[i] ^ 0x5C5C5C5C;
42988                 }
42989                 hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
42990                 return binl2rstr(binl(opad.concat(hash), 512 + 128));
42991               }
42992
42993               /**
42994                * Calculate the MD5 of an array of little-endian words, and a bit length.
42995                */
42996
42997               function binl(x, len) {
42998                 var i, olda, oldb, oldc, oldd,
42999                   a = 1732584193,
43000                   b = -271733879,
43001                   c = -1732584194,
43002                   d = 271733878;
43003
43004                 /* append padding */
43005                 x[len >> 5] |= 0x80 << ((len) % 32);
43006                 x[(((len + 64) >>> 9) << 4) + 14] = len;
43007
43008                 for (i = 0; i < x.length; i += 16) {
43009                   olda = a;
43010                   oldb = b;
43011                   oldc = c;
43012                   oldd = d;
43013
43014                   a = md5_ff(a, b, c, d, x[i + 0], 7, -680876936);
43015                   d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586);
43016                   c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819);
43017                   b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330);
43018                   a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897);
43019                   d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426);
43020                   c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341);
43021                   b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983);
43022                   a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416);
43023                   d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417);
43024                   c = md5_ff(c, d, a, b, x[i + 10], 17, -42063);
43025                   b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162);
43026                   a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682);
43027                   d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101);
43028                   c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290);
43029                   b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329);
43030
43031                   a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510);
43032                   d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632);
43033                   c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713);
43034                   b = md5_gg(b, c, d, a, x[i + 0], 20, -373897302);
43035                   a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691);
43036                   d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083);
43037                   c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335);
43038                   b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848);
43039                   a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438);
43040                   d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690);
43041                   c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961);
43042                   b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501);
43043                   a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467);
43044                   d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784);
43045                   c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473);
43046                   b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734);
43047
43048                   a = md5_hh(a, b, c, d, x[i + 5], 4, -378558);
43049                   d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463);
43050                   c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562);
43051                   b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556);
43052                   a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060);
43053                   d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353);
43054                   c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632);
43055                   b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640);
43056                   a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174);
43057                   d = md5_hh(d, a, b, c, x[i + 0], 11, -358537222);
43058                   c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979);
43059                   b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189);
43060                   a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487);
43061                   d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835);
43062                   c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520);
43063                   b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651);
43064
43065                   a = md5_ii(a, b, c, d, x[i + 0], 6, -198630844);
43066                   d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415);
43067                   c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905);
43068                   b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055);
43069                   a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571);
43070                   d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606);
43071                   c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523);
43072                   b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799);
43073                   a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359);
43074                   d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744);
43075                   c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380);
43076                   b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649);
43077                   a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070);
43078                   d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379);
43079                   c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259);
43080                   b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551);
43081
43082                   a = safe_add(a, olda);
43083                   b = safe_add(b, oldb);
43084                   c = safe_add(c, oldc);
43085                   d = safe_add(d, oldd);
43086                 }
43087                 return Array(a, b, c, d);
43088               }
43089
43090               /**
43091                * These functions implement the four basic operations the algorithm uses.
43092                */
43093
43094               function md5_cmn(q, a, b, x, s, t) {
43095                 return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b);
43096               }
43097
43098               function md5_ff(a, b, c, d, x, s, t) {
43099                 return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
43100               }
43101
43102               function md5_gg(a, b, c, d, x, s, t) {
43103                 return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
43104               }
43105
43106               function md5_hh(a, b, c, d, x, s, t) {
43107                 return md5_cmn(b ^ c ^ d, a, b, x, s, t);
43108               }
43109
43110               function md5_ii(a, b, c, d, x, s, t) {
43111                 return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
43112               }
43113             },
43114             /**
43115              * @member Hashes
43116              * @class Hashes.SHA1
43117              * @param {Object} [config]
43118              * @constructor
43119              *
43120              * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined in FIPS 180-1
43121              * Version 2.2 Copyright Paul Johnston 2000 - 2009.
43122              * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
43123              * See http://pajhome.org.uk/crypt/md5 for details.
43124              */
43125             SHA1: function(options) {
43126               /**
43127                * Private config properties. You may need to tweak these to be compatible with
43128                * the server-side, but the defaults work in most cases.
43129                * See {@link Hashes.MD5#method-setUpperCase} and {@link Hashes.SHA1#method-setUpperCase}
43130                */
43131               var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase
43132                 b64pad = (options && typeof options.pad === 'string') ? options.pad : '=', // base-64 pad character. Defaults to '=' for strict RFC compliance
43133                 utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true; // enable/disable utf8 encoding
43134
43135               // public methods
43136               this.hex = function(s) {
43137                 return rstr2hex(rstr(s), hexcase);
43138               };
43139               this.b64 = function(s) {
43140                 return rstr2b64(rstr(s), b64pad);
43141               };
43142               this.any = function(s, e) {
43143                 return rstr2any(rstr(s), e);
43144               };
43145               this.raw = function(s) {
43146                 return rstr(s);
43147               };
43148               this.hex_hmac = function(k, d) {
43149                 return rstr2hex(rstr_hmac(k, d));
43150               };
43151               this.b64_hmac = function(k, d) {
43152                 return rstr2b64(rstr_hmac(k, d), b64pad);
43153               };
43154               this.any_hmac = function(k, d, e) {
43155                 return rstr2any(rstr_hmac(k, d), e);
43156               };
43157               /**
43158                * Perform a simple self-test to see if the VM is working
43159                * @return {String} Hexadecimal hash sample
43160                * @public
43161                */
43162               this.vm_test = function() {
43163                 return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
43164               };
43165               /**
43166                * @description Enable/disable uppercase hexadecimal returned string
43167                * @param {boolean}
43168                * @return {Object} this
43169                * @public
43170                */
43171               this.setUpperCase = function(a) {
43172                 if (typeof a === 'boolean') {
43173                   hexcase = a;
43174                 }
43175                 return this;
43176               };
43177               /**
43178                * @description Defines a base64 pad string
43179                * @param {string} Pad
43180                * @return {Object} this
43181                * @public
43182                */
43183               this.setPad = function(a) {
43184                 b64pad = a || b64pad;
43185                 return this;
43186               };
43187               /**
43188                * @description Defines a base64 pad string
43189                * @param {boolean}
43190                * @return {Object} this
43191                * @public
43192                */
43193               this.setUTF8 = function(a) {
43194                 if (typeof a === 'boolean') {
43195                   utf8 = a;
43196                 }
43197                 return this;
43198               };
43199
43200               // private methods
43201
43202               /**
43203                * Calculate the SHA-512 of a raw string
43204                */
43205
43206               function rstr(s) {
43207                 s = (utf8) ? utf8Encode(s) : s;
43208                 return binb2rstr(binb(rstr2binb(s), s.length * 8));
43209               }
43210
43211               /**
43212                * Calculate the HMAC-SHA1 of a key and some data (raw strings)
43213                */
43214
43215               function rstr_hmac(key, data) {
43216                 var bkey, ipad, opad, i, hash;
43217                 key = (utf8) ? utf8Encode(key) : key;
43218                 data = (utf8) ? utf8Encode(data) : data;
43219                 bkey = rstr2binb(key);
43220
43221                 if (bkey.length > 16) {
43222                   bkey = binb(bkey, key.length * 8);
43223                 }
43224                 ipad = Array(16), opad = Array(16);
43225                 for (i = 0; i < 16; i += 1) {
43226                   ipad[i] = bkey[i] ^ 0x36363636;
43227                   opad[i] = bkey[i] ^ 0x5C5C5C5C;
43228                 }
43229                 hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
43230                 return binb2rstr(binb(opad.concat(hash), 512 + 160));
43231               }
43232
43233               /**
43234                * Calculate the SHA-1 of an array of big-endian words, and a bit length
43235                */
43236
43237               function binb(x, len) {
43238                 var i, j, t, olda, oldb, oldc, oldd, olde,
43239                   w = Array(80),
43240                   a = 1732584193,
43241                   b = -271733879,
43242                   c = -1732584194,
43243                   d = 271733878,
43244                   e = -1009589776;
43245
43246                 /* append padding */
43247                 x[len >> 5] |= 0x80 << (24 - len % 32);
43248                 x[((len + 64 >> 9) << 4) + 15] = len;
43249
43250                 for (i = 0; i < x.length; i += 16) {
43251                   olda = a;
43252                   oldb = b;
43253                   oldc = c;
43254                   oldd = d;
43255                   olde = e;
43256
43257                   for (j = 0; j < 80; j += 1) {
43258                     if (j < 16) {
43259                       w[j] = x[i + j];
43260                     } else {
43261                       w[j] = bit_rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1);
43262                     }
43263                     t = safe_add(safe_add(bit_rol(a, 5), sha1_ft(j, b, c, d)),
43264                       safe_add(safe_add(e, w[j]), sha1_kt(j)));
43265                     e = d;
43266                     d = c;
43267                     c = bit_rol(b, 30);
43268                     b = a;
43269                     a = t;
43270                   }
43271
43272                   a = safe_add(a, olda);
43273                   b = safe_add(b, oldb);
43274                   c = safe_add(c, oldc);
43275                   d = safe_add(d, oldd);
43276                   e = safe_add(e, olde);
43277                 }
43278                 return Array(a, b, c, d, e);
43279               }
43280
43281               /**
43282                * Perform the appropriate triplet combination function for the current
43283                * iteration
43284                */
43285
43286               function sha1_ft(t, b, c, d) {
43287                 if (t < 20) {
43288                   return (b & c) | ((~b) & d);
43289                 }
43290                 if (t < 40) {
43291                   return b ^ c ^ d;
43292                 }
43293                 if (t < 60) {
43294                   return (b & c) | (b & d) | (c & d);
43295                 }
43296                 return b ^ c ^ d;
43297               }
43298
43299               /**
43300                * Determine the appropriate additive constant for the current iteration
43301                */
43302
43303               function sha1_kt(t) {
43304                 return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 :
43305                   (t < 60) ? -1894007588 : -899497514;
43306               }
43307             },
43308             /**
43309              * @class Hashes.SHA256
43310              * @param {config}
43311              *
43312              * A JavaScript implementation of the Secure Hash Algorithm, SHA-256, as defined in FIPS 180-2
43313              * Version 2.2 Copyright Angel Marin, Paul Johnston 2000 - 2009.
43314              * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
43315              * See http://pajhome.org.uk/crypt/md5 for details.
43316              * Also http://anmar.eu.org/projects/jssha2/
43317              */
43318             SHA256: function(options) {
43319               /**
43320                * Private properties configuration variables. You may need to tweak these to be compatible with
43321                * the server-side, but the defaults work in most cases.
43322                * @see this.setUpperCase() method
43323                * @see this.setPad() method
43324                */
43325               var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase  */
43326                 b64pad = (options && typeof options.pad === 'string') ? options.pad : '=',
43327                 /* base-64 pad character. Default '=' for strict RFC compliance   */
43328                 utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
43329                 /* enable/disable utf8 encoding */
43330                 sha256_K;
43331
43332               /* privileged (public) methods */
43333               this.hex = function(s) {
43334                 return rstr2hex(rstr(s, utf8));
43335               };
43336               this.b64 = function(s) {
43337                 return rstr2b64(rstr(s, utf8), b64pad);
43338               };
43339               this.any = function(s, e) {
43340                 return rstr2any(rstr(s, utf8), e);
43341               };
43342               this.raw = function(s) {
43343                 return rstr(s, utf8);
43344               };
43345               this.hex_hmac = function(k, d) {
43346                 return rstr2hex(rstr_hmac(k, d));
43347               };
43348               this.b64_hmac = function(k, d) {
43349                 return rstr2b64(rstr_hmac(k, d), b64pad);
43350               };
43351               this.any_hmac = function(k, d, e) {
43352                 return rstr2any(rstr_hmac(k, d), e);
43353               };
43354               /**
43355                * Perform a simple self-test to see if the VM is working
43356                * @return {String} Hexadecimal hash sample
43357                * @public
43358                */
43359               this.vm_test = function() {
43360                 return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
43361               };
43362               /**
43363                * Enable/disable uppercase hexadecimal returned string
43364                * @param {boolean}
43365                * @return {Object} this
43366                * @public
43367                */
43368               this.setUpperCase = function(a) {
43369                 if (typeof a === 'boolean') {
43370                   hexcase = a;
43371                 }
43372                 return this;
43373               };
43374               /**
43375                * @description Defines a base64 pad string
43376                * @param {string} Pad
43377                * @return {Object} this
43378                * @public
43379                */
43380               this.setPad = function(a) {
43381                 b64pad = a || b64pad;
43382                 return this;
43383               };
43384               /**
43385                * Defines a base64 pad string
43386                * @param {boolean}
43387                * @return {Object} this
43388                * @public
43389                */
43390               this.setUTF8 = function(a) {
43391                 if (typeof a === 'boolean') {
43392                   utf8 = a;
43393                 }
43394                 return this;
43395               };
43396
43397               // private methods
43398
43399               /**
43400                * Calculate the SHA-512 of a raw string
43401                */
43402
43403               function rstr(s, utf8) {
43404                 s = (utf8) ? utf8Encode(s) : s;
43405                 return binb2rstr(binb(rstr2binb(s), s.length * 8));
43406               }
43407
43408               /**
43409                * Calculate the HMAC-sha256 of a key and some data (raw strings)
43410                */
43411
43412               function rstr_hmac(key, data) {
43413                 key = (utf8) ? utf8Encode(key) : key;
43414                 data = (utf8) ? utf8Encode(data) : data;
43415                 var hash, i = 0,
43416                   bkey = rstr2binb(key),
43417                   ipad = Array(16),
43418                   opad = Array(16);
43419
43420                 if (bkey.length > 16) {
43421                   bkey = binb(bkey, key.length * 8);
43422                 }
43423
43424                 for (; i < 16; i += 1) {
43425                   ipad[i] = bkey[i] ^ 0x36363636;
43426                   opad[i] = bkey[i] ^ 0x5C5C5C5C;
43427                 }
43428
43429                 hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
43430                 return binb2rstr(binb(opad.concat(hash), 512 + 256));
43431               }
43432
43433               /*
43434                * Main sha256 function, with its support functions
43435                */
43436
43437               function sha256_S(X, n) {
43438                 return (X >>> n) | (X << (32 - n));
43439               }
43440
43441               function sha256_R(X, n) {
43442                 return (X >>> n);
43443               }
43444
43445               function sha256_Ch(x, y, z) {
43446                 return ((x & y) ^ ((~x) & z));
43447               }
43448
43449               function sha256_Maj(x, y, z) {
43450                 return ((x & y) ^ (x & z) ^ (y & z));
43451               }
43452
43453               function sha256_Sigma0256(x) {
43454                 return (sha256_S(x, 2) ^ sha256_S(x, 13) ^ sha256_S(x, 22));
43455               }
43456
43457               function sha256_Sigma1256(x) {
43458                 return (sha256_S(x, 6) ^ sha256_S(x, 11) ^ sha256_S(x, 25));
43459               }
43460
43461               function sha256_Gamma0256(x) {
43462                 return (sha256_S(x, 7) ^ sha256_S(x, 18) ^ sha256_R(x, 3));
43463               }
43464
43465               function sha256_Gamma1256(x) {
43466                 return (sha256_S(x, 17) ^ sha256_S(x, 19) ^ sha256_R(x, 10));
43467               }
43468
43469               sha256_K = [
43470                 1116352408, 1899447441, -1245643825, -373957723, 961987163, 1508970993, -1841331548, -1424204075, -670586216, 310598401, 607225278, 1426881987,
43471                 1925078388, -2132889090, -1680079193, -1046744716, -459576895, -272742522,
43472                 264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, -1740746414, -1473132947, -1341970488, -1084653625, -958395405, -710438585,
43473                 113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291,
43474                 1695183700, 1986661051, -2117940946, -1838011259, -1564481375, -1474664885, -1035236496, -949202525, -778901479, -694614492, -200395387, 275423344,
43475                 430227734, 506948616, 659060556, 883997877, 958139571, 1322822218,
43476                 1537002063, 1747873779, 1955562222, 2024104815, -2067236844, -1933114872, -1866530822, -1538233109, -1090935817, -965641998
43477               ];
43478
43479               function binb(m, l) {
43480                 var HASH = [1779033703, -1150833019, 1013904242, -1521486534,
43481                   1359893119, -1694144372, 528734635, 1541459225
43482                 ];
43483                 var W = new Array(64);
43484                 var a, b, c, d, e, f, g, h;
43485                 var i, j, T1, T2;
43486
43487                 /* append padding */
43488                 m[l >> 5] |= 0x80 << (24 - l % 32);
43489                 m[((l + 64 >> 9) << 4) + 15] = l;
43490
43491                 for (i = 0; i < m.length; i += 16) {
43492                   a = HASH[0];
43493                   b = HASH[1];
43494                   c = HASH[2];
43495                   d = HASH[3];
43496                   e = HASH[4];
43497                   f = HASH[5];
43498                   g = HASH[6];
43499                   h = HASH[7];
43500
43501                   for (j = 0; j < 64; j += 1) {
43502                     if (j < 16) {
43503                       W[j] = m[j + i];
43504                     } else {
43505                       W[j] = safe_add(safe_add(safe_add(sha256_Gamma1256(W[j - 2]), W[j - 7]),
43506                         sha256_Gamma0256(W[j - 15])), W[j - 16]);
43507                     }
43508
43509                     T1 = safe_add(safe_add(safe_add(safe_add(h, sha256_Sigma1256(e)), sha256_Ch(e, f, g)),
43510                       sha256_K[j]), W[j]);
43511                     T2 = safe_add(sha256_Sigma0256(a), sha256_Maj(a, b, c));
43512                     h = g;
43513                     g = f;
43514                     f = e;
43515                     e = safe_add(d, T1);
43516                     d = c;
43517                     c = b;
43518                     b = a;
43519                     a = safe_add(T1, T2);
43520                   }
43521
43522                   HASH[0] = safe_add(a, HASH[0]);
43523                   HASH[1] = safe_add(b, HASH[1]);
43524                   HASH[2] = safe_add(c, HASH[2]);
43525                   HASH[3] = safe_add(d, HASH[3]);
43526                   HASH[4] = safe_add(e, HASH[4]);
43527                   HASH[5] = safe_add(f, HASH[5]);
43528                   HASH[6] = safe_add(g, HASH[6]);
43529                   HASH[7] = safe_add(h, HASH[7]);
43530                 }
43531                 return HASH;
43532               }
43533
43534             },
43535
43536             /**
43537              * @class Hashes.SHA512
43538              * @param {config}
43539              *
43540              * A JavaScript implementation of the Secure Hash Algorithm, SHA-512, as defined in FIPS 180-2
43541              * Version 2.2 Copyright Anonymous Contributor, Paul Johnston 2000 - 2009.
43542              * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
43543              * See http://pajhome.org.uk/crypt/md5 for details.
43544              */
43545             SHA512: function(options) {
43546               /**
43547                * Private properties configuration variables. You may need to tweak these to be compatible with
43548                * the server-side, but the defaults work in most cases.
43549                * @see this.setUpperCase() method
43550                * @see this.setPad() method
43551                */
43552               var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false,
43553                 /* hexadecimal output case format. false - lowercase; true - uppercase  */
43554                 b64pad = (options && typeof options.pad === 'string') ? options.pad : '=',
43555                 /* base-64 pad character. Default '=' for strict RFC compliance   */
43556                 utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
43557                 /* enable/disable utf8 encoding */
43558                 sha512_k;
43559
43560               /* privileged (public) methods */
43561               this.hex = function(s) {
43562                 return rstr2hex(rstr(s));
43563               };
43564               this.b64 = function(s) {
43565                 return rstr2b64(rstr(s), b64pad);
43566               };
43567               this.any = function(s, e) {
43568                 return rstr2any(rstr(s), e);
43569               };
43570               this.raw = function(s) {
43571                 return rstr(s);
43572               };
43573               this.hex_hmac = function(k, d) {
43574                 return rstr2hex(rstr_hmac(k, d));
43575               };
43576               this.b64_hmac = function(k, d) {
43577                 return rstr2b64(rstr_hmac(k, d), b64pad);
43578               };
43579               this.any_hmac = function(k, d, e) {
43580                 return rstr2any(rstr_hmac(k, d), e);
43581               };
43582               /**
43583                * Perform a simple self-test to see if the VM is working
43584                * @return {String} Hexadecimal hash sample
43585                * @public
43586                */
43587               this.vm_test = function() {
43588                 return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
43589               };
43590               /**
43591                * @description Enable/disable uppercase hexadecimal returned string
43592                * @param {boolean}
43593                * @return {Object} this
43594                * @public
43595                */
43596               this.setUpperCase = function(a) {
43597                 if (typeof a === 'boolean') {
43598                   hexcase = a;
43599                 }
43600                 return this;
43601               };
43602               /**
43603                * @description Defines a base64 pad string
43604                * @param {string} Pad
43605                * @return {Object} this
43606                * @public
43607                */
43608               this.setPad = function(a) {
43609                 b64pad = a || b64pad;
43610                 return this;
43611               };
43612               /**
43613                * @description Defines a base64 pad string
43614                * @param {boolean}
43615                * @return {Object} this
43616                * @public
43617                */
43618               this.setUTF8 = function(a) {
43619                 if (typeof a === 'boolean') {
43620                   utf8 = a;
43621                 }
43622                 return this;
43623               };
43624
43625               /* private methods */
43626
43627               /**
43628                * Calculate the SHA-512 of a raw string
43629                */
43630
43631               function rstr(s) {
43632                 s = (utf8) ? utf8Encode(s) : s;
43633                 return binb2rstr(binb(rstr2binb(s), s.length * 8));
43634               }
43635               /*
43636                * Calculate the HMAC-SHA-512 of a key and some data (raw strings)
43637                */
43638
43639               function rstr_hmac(key, data) {
43640                 key = (utf8) ? utf8Encode(key) : key;
43641                 data = (utf8) ? utf8Encode(data) : data;
43642
43643                 var hash, i = 0,
43644                   bkey = rstr2binb(key),
43645                   ipad = Array(32),
43646                   opad = Array(32);
43647
43648                 if (bkey.length > 32) {
43649                   bkey = binb(bkey, key.length * 8);
43650                 }
43651
43652                 for (; i < 32; i += 1) {
43653                   ipad[i] = bkey[i] ^ 0x36363636;
43654                   opad[i] = bkey[i] ^ 0x5C5C5C5C;
43655                 }
43656
43657                 hash = binb(ipad.concat(rstr2binb(data)), 1024 + data.length * 8);
43658                 return binb2rstr(binb(opad.concat(hash), 1024 + 512));
43659               }
43660
43661               /**
43662                * Calculate the SHA-512 of an array of big-endian dwords, and a bit length
43663                */
43664
43665               function binb(x, len) {
43666                 var j, i, l,
43667                   W = new Array(80),
43668                   hash = new Array(16),
43669                   //Initial hash values
43670                   H = [
43671                     new int64(0x6a09e667, -205731576),
43672                     new int64(-1150833019, -2067093701),
43673                     new int64(0x3c6ef372, -23791573),
43674                     new int64(-1521486534, 0x5f1d36f1),
43675                     new int64(0x510e527f, -1377402159),
43676                     new int64(-1694144372, 0x2b3e6c1f),
43677                     new int64(0x1f83d9ab, -79577749),
43678                     new int64(0x5be0cd19, 0x137e2179)
43679                   ],
43680                   T1 = new int64(0, 0),
43681                   T2 = new int64(0, 0),
43682                   a = new int64(0, 0),
43683                   b = new int64(0, 0),
43684                   c = new int64(0, 0),
43685                   d = new int64(0, 0),
43686                   e = new int64(0, 0),
43687                   f = new int64(0, 0),
43688                   g = new int64(0, 0),
43689                   h = new int64(0, 0),
43690                   //Temporary variables not specified by the document
43691                   s0 = new int64(0, 0),
43692                   s1 = new int64(0, 0),
43693                   Ch = new int64(0, 0),
43694                   Maj = new int64(0, 0),
43695                   r1 = new int64(0, 0),
43696                   r2 = new int64(0, 0),
43697                   r3 = new int64(0, 0);
43698
43699                 if (sha512_k === undefined) {
43700                   //SHA512 constants
43701                   sha512_k = [
43702                     new int64(0x428a2f98, -685199838), new int64(0x71374491, 0x23ef65cd),
43703                     new int64(-1245643825, -330482897), new int64(-373957723, -2121671748),
43704                     new int64(0x3956c25b, -213338824), new int64(0x59f111f1, -1241133031),
43705                     new int64(-1841331548, -1357295717), new int64(-1424204075, -630357736),
43706                     new int64(-670586216, -1560083902), new int64(0x12835b01, 0x45706fbe),
43707                     new int64(0x243185be, 0x4ee4b28c), new int64(0x550c7dc3, -704662302),
43708                     new int64(0x72be5d74, -226784913), new int64(-2132889090, 0x3b1696b1),
43709                     new int64(-1680079193, 0x25c71235), new int64(-1046744716, -815192428),
43710                     new int64(-459576895, -1628353838), new int64(-272742522, 0x384f25e3),
43711                     new int64(0xfc19dc6, -1953704523), new int64(0x240ca1cc, 0x77ac9c65),
43712                     new int64(0x2de92c6f, 0x592b0275), new int64(0x4a7484aa, 0x6ea6e483),
43713                     new int64(0x5cb0a9dc, -1119749164), new int64(0x76f988da, -2096016459),
43714                     new int64(-1740746414, -295247957), new int64(-1473132947, 0x2db43210),
43715                     new int64(-1341970488, -1728372417), new int64(-1084653625, -1091629340),
43716                     new int64(-958395405, 0x3da88fc2), new int64(-710438585, -1828018395),
43717                     new int64(0x6ca6351, -536640913), new int64(0x14292967, 0xa0e6e70),
43718                     new int64(0x27b70a85, 0x46d22ffc), new int64(0x2e1b2138, 0x5c26c926),
43719                     new int64(0x4d2c6dfc, 0x5ac42aed), new int64(0x53380d13, -1651133473),
43720                     new int64(0x650a7354, -1951439906), new int64(0x766a0abb, 0x3c77b2a8),
43721                     new int64(-2117940946, 0x47edaee6), new int64(-1838011259, 0x1482353b),
43722                     new int64(-1564481375, 0x4cf10364), new int64(-1474664885, -1136513023),
43723                     new int64(-1035236496, -789014639), new int64(-949202525, 0x654be30),
43724                     new int64(-778901479, -688958952), new int64(-694614492, 0x5565a910),
43725                     new int64(-200395387, 0x5771202a), new int64(0x106aa070, 0x32bbd1b8),
43726                     new int64(0x19a4c116, -1194143544), new int64(0x1e376c08, 0x5141ab53),
43727                     new int64(0x2748774c, -544281703), new int64(0x34b0bcb5, -509917016),
43728                     new int64(0x391c0cb3, -976659869), new int64(0x4ed8aa4a, -482243893),
43729                     new int64(0x5b9cca4f, 0x7763e373), new int64(0x682e6ff3, -692930397),
43730                     new int64(0x748f82ee, 0x5defb2fc), new int64(0x78a5636f, 0x43172f60),
43731                     new int64(-2067236844, -1578062990), new int64(-1933114872, 0x1a6439ec),
43732                     new int64(-1866530822, 0x23631e28), new int64(-1538233109, -561857047),
43733                     new int64(-1090935817, -1295615723), new int64(-965641998, -479046869),
43734                     new int64(-903397682, -366583396), new int64(-779700025, 0x21c0c207),
43735                     new int64(-354779690, -840897762), new int64(-176337025, -294727304),
43736                     new int64(0x6f067aa, 0x72176fba), new int64(0xa637dc5, -1563912026),
43737                     new int64(0x113f9804, -1090974290), new int64(0x1b710b35, 0x131c471b),
43738                     new int64(0x28db77f5, 0x23047d84), new int64(0x32caab7b, 0x40c72493),
43739                     new int64(0x3c9ebe0a, 0x15c9bebc), new int64(0x431d67c4, -1676669620),
43740                     new int64(0x4cc5d4be, -885112138), new int64(0x597f299c, -60457430),
43741                     new int64(0x5fcb6fab, 0x3ad6faec), new int64(0x6c44198c, 0x4a475817)
43742                   ];
43743                 }
43744
43745                 for (i = 0; i < 80; i += 1) {
43746                   W[i] = new int64(0, 0);
43747                 }
43748
43749                 // append padding to the source string. The format is described in the FIPS.
43750                 x[len >> 5] |= 0x80 << (24 - (len & 0x1f));
43751                 x[((len + 128 >> 10) << 5) + 31] = len;
43752                 l = x.length;
43753                 for (i = 0; i < l; i += 32) { //32 dwords is the block size
43754                   int64copy(a, H[0]);
43755                   int64copy(b, H[1]);
43756                   int64copy(c, H[2]);
43757                   int64copy(d, H[3]);
43758                   int64copy(e, H[4]);
43759                   int64copy(f, H[5]);
43760                   int64copy(g, H[6]);
43761                   int64copy(h, H[7]);
43762
43763                   for (j = 0; j < 16; j += 1) {
43764                     W[j].h = x[i + 2 * j];
43765                     W[j].l = x[i + 2 * j + 1];
43766                   }
43767
43768                   for (j = 16; j < 80; j += 1) {
43769                     //sigma1
43770                     int64rrot(r1, W[j - 2], 19);
43771                     int64revrrot(r2, W[j - 2], 29);
43772                     int64shr(r3, W[j - 2], 6);
43773                     s1.l = r1.l ^ r2.l ^ r3.l;
43774                     s1.h = r1.h ^ r2.h ^ r3.h;
43775                     //sigma0
43776                     int64rrot(r1, W[j - 15], 1);
43777                     int64rrot(r2, W[j - 15], 8);
43778                     int64shr(r3, W[j - 15], 7);
43779                     s0.l = r1.l ^ r2.l ^ r3.l;
43780                     s0.h = r1.h ^ r2.h ^ r3.h;
43781
43782                     int64add4(W[j], s1, W[j - 7], s0, W[j - 16]);
43783                   }
43784
43785                   for (j = 0; j < 80; j += 1) {
43786                     //Ch
43787                     Ch.l = (e.l & f.l) ^ (~e.l & g.l);
43788                     Ch.h = (e.h & f.h) ^ (~e.h & g.h);
43789
43790                     //Sigma1
43791                     int64rrot(r1, e, 14);
43792                     int64rrot(r2, e, 18);
43793                     int64revrrot(r3, e, 9);
43794                     s1.l = r1.l ^ r2.l ^ r3.l;
43795                     s1.h = r1.h ^ r2.h ^ r3.h;
43796
43797                     //Sigma0
43798                     int64rrot(r1, a, 28);
43799                     int64revrrot(r2, a, 2);
43800                     int64revrrot(r3, a, 7);
43801                     s0.l = r1.l ^ r2.l ^ r3.l;
43802                     s0.h = r1.h ^ r2.h ^ r3.h;
43803
43804                     //Maj
43805                     Maj.l = (a.l & b.l) ^ (a.l & c.l) ^ (b.l & c.l);
43806                     Maj.h = (a.h & b.h) ^ (a.h & c.h) ^ (b.h & c.h);
43807
43808                     int64add5(T1, h, s1, Ch, sha512_k[j], W[j]);
43809                     int64add(T2, s0, Maj);
43810
43811                     int64copy(h, g);
43812                     int64copy(g, f);
43813                     int64copy(f, e);
43814                     int64add(e, d, T1);
43815                     int64copy(d, c);
43816                     int64copy(c, b);
43817                     int64copy(b, a);
43818                     int64add(a, T1, T2);
43819                   }
43820                   int64add(H[0], H[0], a);
43821                   int64add(H[1], H[1], b);
43822                   int64add(H[2], H[2], c);
43823                   int64add(H[3], H[3], d);
43824                   int64add(H[4], H[4], e);
43825                   int64add(H[5], H[5], f);
43826                   int64add(H[6], H[6], g);
43827                   int64add(H[7], H[7], h);
43828                 }
43829
43830                 //represent the hash as an array of 32-bit dwords
43831                 for (i = 0; i < 8; i += 1) {
43832                   hash[2 * i] = H[i].h;
43833                   hash[2 * i + 1] = H[i].l;
43834                 }
43835                 return hash;
43836               }
43837
43838               //A constructor for 64-bit numbers
43839
43840               function int64(h, l) {
43841                 this.h = h;
43842                 this.l = l;
43843                 //this.toString = int64toString;
43844               }
43845
43846               //Copies src into dst, assuming both are 64-bit numbers
43847
43848               function int64copy(dst, src) {
43849                 dst.h = src.h;
43850                 dst.l = src.l;
43851               }
43852
43853               //Right-rotates a 64-bit number by shift
43854               //Won't handle cases of shift>=32
43855               //The function revrrot() is for that
43856
43857               function int64rrot(dst, x, shift) {
43858                 dst.l = (x.l >>> shift) | (x.h << (32 - shift));
43859                 dst.h = (x.h >>> shift) | (x.l << (32 - shift));
43860               }
43861
43862               //Reverses the dwords of the source and then rotates right by shift.
43863               //This is equivalent to rotation by 32+shift
43864
43865               function int64revrrot(dst, x, shift) {
43866                 dst.l = (x.h >>> shift) | (x.l << (32 - shift));
43867                 dst.h = (x.l >>> shift) | (x.h << (32 - shift));
43868               }
43869
43870               //Bitwise-shifts right a 64-bit number by shift
43871               //Won't handle shift>=32, but it's never needed in SHA512
43872
43873               function int64shr(dst, x, shift) {
43874                 dst.l = (x.l >>> shift) | (x.h << (32 - shift));
43875                 dst.h = (x.h >>> shift);
43876               }
43877
43878               //Adds two 64-bit numbers
43879               //Like the original implementation, does not rely on 32-bit operations
43880
43881               function int64add(dst, x, y) {
43882                 var w0 = (x.l & 0xffff) + (y.l & 0xffff);
43883                 var w1 = (x.l >>> 16) + (y.l >>> 16) + (w0 >>> 16);
43884                 var w2 = (x.h & 0xffff) + (y.h & 0xffff) + (w1 >>> 16);
43885                 var w3 = (x.h >>> 16) + (y.h >>> 16) + (w2 >>> 16);
43886                 dst.l = (w0 & 0xffff) | (w1 << 16);
43887                 dst.h = (w2 & 0xffff) | (w3 << 16);
43888               }
43889
43890               //Same, except with 4 addends. Works faster than adding them one by one.
43891
43892               function int64add4(dst, a, b, c, d) {
43893                 var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff);
43894                 var w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (w0 >>> 16);
43895                 var w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (w1 >>> 16);
43896                 var w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (w2 >>> 16);
43897                 dst.l = (w0 & 0xffff) | (w1 << 16);
43898                 dst.h = (w2 & 0xffff) | (w3 << 16);
43899               }
43900
43901               //Same, except with 5 addends
43902
43903               function int64add5(dst, a, b, c, d, e) {
43904                 var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff) + (e.l & 0xffff),
43905                   w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (e.l >>> 16) + (w0 >>> 16),
43906                   w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (e.h & 0xffff) + (w1 >>> 16),
43907                   w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (e.h >>> 16) + (w2 >>> 16);
43908                 dst.l = (w0 & 0xffff) | (w1 << 16);
43909                 dst.h = (w2 & 0xffff) | (w3 << 16);
43910               }
43911             },
43912             /**
43913              * @class Hashes.RMD160
43914              * @constructor
43915              * @param {Object} [config]
43916              *
43917              * A JavaScript implementation of the RIPEMD-160 Algorithm
43918              * Version 2.2 Copyright Jeremy Lin, Paul Johnston 2000 - 2009.
43919              * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
43920              * See http://pajhome.org.uk/crypt/md5 for details.
43921              * Also http://www.ocf.berkeley.edu/~jjlin/jsotp/
43922              */
43923             RMD160: function(options) {
43924               /**
43925                * Private properties configuration variables. You may need to tweak these to be compatible with
43926                * the server-side, but the defaults work in most cases.
43927                * @see this.setUpperCase() method
43928                * @see this.setPad() method
43929                */
43930               var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false,
43931                 /* hexadecimal output case format. false - lowercase; true - uppercase  */
43932                 b64pad = (options && typeof options.pad === 'string') ? options.pa : '=',
43933                 /* base-64 pad character. Default '=' for strict RFC compliance   */
43934                 utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
43935                 /* enable/disable utf8 encoding */
43936                 rmd160_r1 = [
43937                   0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
43938                   7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,
43939                   3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12,
43940                   1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2,
43941                   4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13
43942                 ],
43943                 rmd160_r2 = [
43944                   5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12,
43945                   6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2,
43946                   15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13,
43947                   8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14,
43948                   12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11
43949                 ],
43950                 rmd160_s1 = [
43951                   11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8,
43952                   7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12,
43953                   11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5,
43954                   11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12,
43955                   9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6
43956                 ],
43957                 rmd160_s2 = [
43958                   8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6,
43959                   9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11,
43960                   9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5,
43961                   15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8,
43962                   8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11
43963                 ];
43964
43965               /* privileged (public) methods */
43966               this.hex = function(s) {
43967                 return rstr2hex(rstr(s));
43968               };
43969               this.b64 = function(s) {
43970                 return rstr2b64(rstr(s), b64pad);
43971               };
43972               this.any = function(s, e) {
43973                 return rstr2any(rstr(s), e);
43974               };
43975               this.raw = function(s) {
43976                 return rstr(s);
43977               };
43978               this.hex_hmac = function(k, d) {
43979                 return rstr2hex(rstr_hmac(k, d));
43980               };
43981               this.b64_hmac = function(k, d) {
43982                 return rstr2b64(rstr_hmac(k, d), b64pad);
43983               };
43984               this.any_hmac = function(k, d, e) {
43985                 return rstr2any(rstr_hmac(k, d), e);
43986               };
43987               /**
43988                * Perform a simple self-test to see if the VM is working
43989                * @return {String} Hexadecimal hash sample
43990                * @public
43991                */
43992               this.vm_test = function() {
43993                 return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
43994               };
43995               /**
43996                * @description Enable/disable uppercase hexadecimal returned string
43997                * @param {boolean}
43998                * @return {Object} this
43999                * @public
44000                */
44001               this.setUpperCase = function(a) {
44002                 if (typeof a === 'boolean') {
44003                   hexcase = a;
44004                 }
44005                 return this;
44006               };
44007               /**
44008                * @description Defines a base64 pad string
44009                * @param {string} Pad
44010                * @return {Object} this
44011                * @public
44012                */
44013               this.setPad = function(a) {
44014                 if (typeof a !== 'undefined') {
44015                   b64pad = a;
44016                 }
44017                 return this;
44018               };
44019               /**
44020                * @description Defines a base64 pad string
44021                * @param {boolean}
44022                * @return {Object} this
44023                * @public
44024                */
44025               this.setUTF8 = function(a) {
44026                 if (typeof a === 'boolean') {
44027                   utf8 = a;
44028                 }
44029                 return this;
44030               };
44031
44032               /* private methods */
44033
44034               /**
44035                * Calculate the rmd160 of a raw string
44036                */
44037
44038               function rstr(s) {
44039                 s = (utf8) ? utf8Encode(s) : s;
44040                 return binl2rstr(binl(rstr2binl(s), s.length * 8));
44041               }
44042
44043               /**
44044                * Calculate the HMAC-rmd160 of a key and some data (raw strings)
44045                */
44046
44047               function rstr_hmac(key, data) {
44048                 key = (utf8) ? utf8Encode(key) : key;
44049                 data = (utf8) ? utf8Encode(data) : data;
44050                 var i, hash,
44051                   bkey = rstr2binl(key),
44052                   ipad = Array(16),
44053                   opad = Array(16);
44054
44055                 if (bkey.length > 16) {
44056                   bkey = binl(bkey, key.length * 8);
44057                 }
44058
44059                 for (i = 0; i < 16; i += 1) {
44060                   ipad[i] = bkey[i] ^ 0x36363636;
44061                   opad[i] = bkey[i] ^ 0x5C5C5C5C;
44062                 }
44063                 hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
44064                 return binl2rstr(binl(opad.concat(hash), 512 + 160));
44065               }
44066
44067               /**
44068                * Convert an array of little-endian words to a string
44069                */
44070
44071               function binl2rstr(input) {
44072                 var i, output = '',
44073                   l = input.length * 32;
44074                 for (i = 0; i < l; i += 8) {
44075                   output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF);
44076                 }
44077                 return output;
44078               }
44079
44080               /**
44081                * Calculate the RIPE-MD160 of an array of little-endian words, and a bit length.
44082                */
44083
44084               function binl(x, len) {
44085                 var T, j, i, l,
44086                   h0 = 0x67452301,
44087                   h1 = 0xefcdab89,
44088                   h2 = 0x98badcfe,
44089                   h3 = 0x10325476,
44090                   h4 = 0xc3d2e1f0,
44091                   A1, B1, C1, D1, E1,
44092                   A2, B2, C2, D2, E2;
44093
44094                 /* append padding */
44095                 x[len >> 5] |= 0x80 << (len % 32);
44096                 x[(((len + 64) >>> 9) << 4) + 14] = len;
44097                 l = x.length;
44098
44099                 for (i = 0; i < l; i += 16) {
44100                   A1 = A2 = h0;
44101                   B1 = B2 = h1;
44102                   C1 = C2 = h2;
44103                   D1 = D2 = h3;
44104                   E1 = E2 = h4;
44105                   for (j = 0; j <= 79; j += 1) {
44106                     T = safe_add(A1, rmd160_f(j, B1, C1, D1));
44107                     T = safe_add(T, x[i + rmd160_r1[j]]);
44108                     T = safe_add(T, rmd160_K1(j));
44109                     T = safe_add(bit_rol(T, rmd160_s1[j]), E1);
44110                     A1 = E1;
44111                     E1 = D1;
44112                     D1 = bit_rol(C1, 10);
44113                     C1 = B1;
44114                     B1 = T;
44115                     T = safe_add(A2, rmd160_f(79 - j, B2, C2, D2));
44116                     T = safe_add(T, x[i + rmd160_r2[j]]);
44117                     T = safe_add(T, rmd160_K2(j));
44118                     T = safe_add(bit_rol(T, rmd160_s2[j]), E2);
44119                     A2 = E2;
44120                     E2 = D2;
44121                     D2 = bit_rol(C2, 10);
44122                     C2 = B2;
44123                     B2 = T;
44124                   }
44125
44126                   T = safe_add(h1, safe_add(C1, D2));
44127                   h1 = safe_add(h2, safe_add(D1, E2));
44128                   h2 = safe_add(h3, safe_add(E1, A2));
44129                   h3 = safe_add(h4, safe_add(A1, B2));
44130                   h4 = safe_add(h0, safe_add(B1, C2));
44131                   h0 = T;
44132                 }
44133                 return [h0, h1, h2, h3, h4];
44134               }
44135
44136               // specific algorithm methods
44137
44138               function rmd160_f(j, x, y, z) {
44139                 return (0 <= j && j <= 15) ? (x ^ y ^ z) :
44140                   (16 <= j && j <= 31) ? (x & y) | (~x & z) :
44141                   (32 <= j && j <= 47) ? (x | ~y) ^ z :
44142                   (48 <= j && j <= 63) ? (x & z) | (y & ~z) :
44143                   (64 <= j && j <= 79) ? x ^ (y | ~z) :
44144                   'rmd160_f: j out of range';
44145               }
44146
44147               function rmd160_K1(j) {
44148                 return (0 <= j && j <= 15) ? 0x00000000 :
44149                   (16 <= j && j <= 31) ? 0x5a827999 :
44150                   (32 <= j && j <= 47) ? 0x6ed9eba1 :
44151                   (48 <= j && j <= 63) ? 0x8f1bbcdc :
44152                   (64 <= j && j <= 79) ? 0xa953fd4e :
44153                   'rmd160_K1: j out of range';
44154               }
44155
44156               function rmd160_K2(j) {
44157                 return (0 <= j && j <= 15) ? 0x50a28be6 :
44158                   (16 <= j && j <= 31) ? 0x5c4dd124 :
44159                   (32 <= j && j <= 47) ? 0x6d703ef3 :
44160                   (48 <= j && j <= 63) ? 0x7a6d76e9 :
44161                   (64 <= j && j <= 79) ? 0x00000000 :
44162                   'rmd160_K2: j out of range';
44163               }
44164             }
44165           };
44166
44167           // exposes Hashes
44168           (function(window, undefined$1) {
44169             var freeExports = false;
44170             {
44171               freeExports = exports;
44172               if (exports && typeof commonjsGlobal === 'object' && commonjsGlobal && commonjsGlobal === commonjsGlobal.global) {
44173                 window = commonjsGlobal;
44174               }
44175             }
44176
44177             if (typeof undefined$1 === 'function' && typeof undefined$1.amd === 'object' && undefined$1.amd) {
44178               // define as an anonymous module, so, through path mapping, it can be aliased
44179               undefined$1(function() {
44180                 return Hashes;
44181               });
44182             } else if (freeExports) {
44183               // in Node.js or RingoJS v0.8.0+
44184               if ( module && module.exports === freeExports) {
44185                 module.exports = Hashes;
44186               }
44187               // in Narwhal or RingoJS v0.7.0-
44188               else {
44189                 freeExports.Hashes = Hashes;
44190               }
44191             } else {
44192               // in a browser or Rhino
44193               window.Hashes = Hashes;
44194             }
44195           }(this));
44196         }()); // IIFE
44197         });
44198
44199         var immutable = extend$2;
44200
44201         var hasOwnProperty$2 = Object.prototype.hasOwnProperty;
44202
44203         function extend$2() {
44204             var target = {};
44205
44206             for (var i = 0; i < arguments.length; i++) {
44207                 var source = arguments[i];
44208
44209                 for (var key in source) {
44210                     if (hasOwnProperty$2.call(source, key)) {
44211                         target[key] = source[key];
44212                     }
44213                 }
44214             }
44215
44216             return target
44217         }
44218
44219         var sha1 = new hashes.SHA1();
44220
44221         var ohauth = {};
44222
44223         ohauth.qsString = function(obj) {
44224             return Object.keys(obj).sort().map(function(key) {
44225                 return ohauth.percentEncode(key) + '=' +
44226                     ohauth.percentEncode(obj[key]);
44227             }).join('&');
44228         };
44229
44230         ohauth.stringQs = function(str) {
44231             return str.split('&').filter(function (pair) {
44232                 return pair !== '';
44233             }).reduce(function(obj, pair){
44234                 var parts = pair.split('=');
44235                 obj[decodeURIComponent(parts[0])] = (null === parts[1]) ?
44236                     '' : decodeURIComponent(parts[1]);
44237                 return obj;
44238             }, {});
44239         };
44240
44241         ohauth.rawxhr = function(method, url, data, headers, callback) {
44242             var xhr = new XMLHttpRequest(),
44243                 twoHundred = /^20\d$/;
44244             xhr.onreadystatechange = function() {
44245                 if (4 === xhr.readyState && 0 !== xhr.status) {
44246                     if (twoHundred.test(xhr.status)) callback(null, xhr);
44247                     else return callback(xhr, null);
44248                 }
44249             };
44250             xhr.onerror = function(e) { return callback(e, null); };
44251             xhr.open(method, url, true);
44252             for (var h in headers) xhr.setRequestHeader(h, headers[h]);
44253             xhr.send(data);
44254             return xhr;
44255         };
44256
44257         ohauth.xhr = function(method, url, auth, data, options, callback) {
44258             var headers = (options && options.header) || {
44259                 'Content-Type': 'application/x-www-form-urlencoded'
44260             };
44261             headers.Authorization = 'OAuth ' + ohauth.authHeader(auth);
44262             return ohauth.rawxhr(method, url, data, headers, callback);
44263         };
44264
44265         ohauth.nonce = function() {
44266             for (var o = ''; o.length < 6;) {
44267                 o += '0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz'[Math.floor(Math.random() * 61)];
44268             }
44269             return o;
44270         };
44271
44272         ohauth.authHeader = function(obj) {
44273             return Object.keys(obj).sort().map(function(key) {
44274                 return encodeURIComponent(key) + '="' + encodeURIComponent(obj[key]) + '"';
44275             }).join(', ');
44276         };
44277
44278         ohauth.timestamp = function() { return ~~((+new Date()) / 1000); };
44279
44280         ohauth.percentEncode = function(s) {
44281             return encodeURIComponent(s)
44282                 .replace(/\!/g, '%21').replace(/\'/g, '%27')
44283                 .replace(/\*/g, '%2A').replace(/\(/g, '%28').replace(/\)/g, '%29');
44284         };
44285
44286         ohauth.baseString = function(method, url, params) {
44287             if (params.oauth_signature) delete params.oauth_signature;
44288             return [
44289                 method,
44290                 ohauth.percentEncode(url),
44291                 ohauth.percentEncode(ohauth.qsString(params))].join('&');
44292         };
44293
44294         ohauth.signature = function(oauth_secret, token_secret, baseString) {
44295             return sha1.b64_hmac(
44296                 ohauth.percentEncode(oauth_secret) + '&' +
44297                 ohauth.percentEncode(token_secret),
44298                 baseString);
44299         };
44300
44301         /**
44302          * Takes an options object for configuration (consumer_key,
44303          * consumer_secret, version, signature_method, token, token_secret)
44304          * and returns a function that generates the Authorization header
44305          * for given data.
44306          *
44307          * The returned function takes these parameters:
44308          * - method: GET/POST/...
44309          * - uri: full URI with protocol, port, path and query string
44310          * - extra_params: any extra parameters (that are passed in the POST data),
44311          *   can be an object or a from-urlencoded string.
44312          *
44313          * Returned function returns full OAuth header with "OAuth" string in it.
44314          */
44315
44316         ohauth.headerGenerator = function(options) {
44317             options = options || {};
44318             var consumer_key = options.consumer_key || '',
44319                 consumer_secret = options.consumer_secret || '',
44320                 signature_method = options.signature_method || 'HMAC-SHA1',
44321                 version = options.version || '1.0',
44322                 token = options.token || '',
44323                 token_secret = options.token_secret || '';
44324
44325             return function(method, uri, extra_params) {
44326                 method = method.toUpperCase();
44327                 if (typeof extra_params === 'string' && extra_params.length > 0) {
44328                     extra_params = ohauth.stringQs(extra_params);
44329                 }
44330
44331                 var uri_parts = uri.split('?', 2),
44332                 base_uri = uri_parts[0];
44333
44334                 var query_params = uri_parts.length === 2 ?
44335                     ohauth.stringQs(uri_parts[1]) : {};
44336
44337                 var oauth_params = {
44338                     oauth_consumer_key: consumer_key,
44339                     oauth_signature_method: signature_method,
44340                     oauth_version: version,
44341                     oauth_timestamp: ohauth.timestamp(),
44342                     oauth_nonce: ohauth.nonce()
44343                 };
44344
44345                 if (token) oauth_params.oauth_token = token;
44346
44347                 var all_params = immutable({}, oauth_params, query_params, extra_params),
44348                     base_str = ohauth.baseString(method, base_uri, all_params);
44349
44350                 oauth_params.oauth_signature = ohauth.signature(consumer_secret, token_secret, base_str);
44351
44352                 return 'OAuth ' + ohauth.authHeader(oauth_params);
44353             };
44354         };
44355
44356         var ohauth_1 = ohauth;
44357
44358         var resolveUrl = createCommonjsModule(function (module, exports) {
44359         // Copyright 2014 Simon Lydell
44360         // X11 (“MIT”) Licensed. (See LICENSE.)
44361
44362         void (function(root, factory) {
44363           {
44364             module.exports = factory();
44365           }
44366         }(commonjsGlobal, function() {
44367
44368           function resolveUrl(/* ...urls */) {
44369             var numUrls = arguments.length;
44370
44371             if (numUrls === 0) {
44372               throw new Error("resolveUrl requires at least one argument; got none.")
44373             }
44374
44375             var base = document.createElement("base");
44376             base.href = arguments[0];
44377
44378             if (numUrls === 1) {
44379               return base.href
44380             }
44381
44382             var head = document.getElementsByTagName("head")[0];
44383             head.insertBefore(base, head.firstChild);
44384
44385             var a = document.createElement("a");
44386             var resolved;
44387
44388             for (var index = 1; index < numUrls; index++) {
44389               a.href = arguments[index];
44390               resolved = a.href;
44391               base.href = resolved;
44392             }
44393
44394             head.removeChild(base);
44395
44396             return resolved
44397           }
44398
44399           return resolveUrl
44400
44401         }));
44402         });
44403
44404         var assign$2 = make_assign();
44405         var create$7 = make_create();
44406         var trim$1 = make_trim();
44407         var Global = (typeof window !== 'undefined' ? window : commonjsGlobal);
44408
44409         var util = {
44410                 assign: assign$2,
44411                 create: create$7,
44412                 trim: trim$1,
44413                 bind: bind$3,
44414                 slice: slice$b,
44415                 each: each,
44416                 map: map$5,
44417                 pluck: pluck,
44418                 isList: isList,
44419                 isFunction: isFunction$2,
44420                 isObject: isObject$2,
44421                 Global: Global
44422         };
44423
44424         function make_assign() {
44425                 if (Object.assign) {
44426                         return Object.assign
44427                 } else {
44428                         return function shimAssign(obj, props1, props2, etc) {
44429                                 for (var i = 1; i < arguments.length; i++) {
44430                                         each(Object(arguments[i]), function(val, key) {
44431                                                 obj[key] = val;
44432                                         });
44433                                 }                       
44434                                 return obj
44435                         }
44436                 }
44437         }
44438
44439         function make_create() {
44440                 if (Object.create) {
44441                         return function create(obj, assignProps1, assignProps2, etc) {
44442                                 var assignArgsList = slice$b(arguments, 1);
44443                                 return assign$2.apply(this, [Object.create(obj)].concat(assignArgsList))
44444                         }
44445                 } else {
44446                         function F() {} // eslint-disable-line no-inner-declarations
44447                         return function create(obj, assignProps1, assignProps2, etc) {
44448                                 var assignArgsList = slice$b(arguments, 1);
44449                                 F.prototype = obj;
44450                                 return assign$2.apply(this, [new F()].concat(assignArgsList))
44451                         }
44452                 }
44453         }
44454
44455         function make_trim() {
44456                 if (String.prototype.trim) {
44457                         return function trim(str) {
44458                                 return String.prototype.trim.call(str)
44459                         }
44460                 } else {
44461                         return function trim(str) {
44462                                 return str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '')
44463                         }
44464                 }
44465         }
44466
44467         function bind$3(obj, fn) {
44468                 return function() {
44469                         return fn.apply(obj, Array.prototype.slice.call(arguments, 0))
44470                 }
44471         }
44472
44473         function slice$b(arr, index) {
44474                 return Array.prototype.slice.call(arr, index || 0)
44475         }
44476
44477         function each(obj, fn) {
44478                 pluck(obj, function(val, key) {
44479                         fn(val, key);
44480                         return false
44481                 });
44482         }
44483
44484         function map$5(obj, fn) {
44485                 var res = (isList(obj) ? [] : {});
44486                 pluck(obj, function(v, k) {
44487                         res[k] = fn(v, k);
44488                         return false
44489                 });
44490                 return res
44491         }
44492
44493         function pluck(obj, fn) {
44494                 if (isList(obj)) {
44495                         for (var i=0; i<obj.length; i++) {
44496                                 if (fn(obj[i], i)) {
44497                                         return obj[i]
44498                                 }
44499                         }
44500                 } else {
44501                         for (var key in obj) {
44502                                 if (obj.hasOwnProperty(key)) {
44503                                         if (fn(obj[key], key)) {
44504                                                 return obj[key]
44505                                         }
44506                                 }
44507                         }
44508                 }
44509         }
44510
44511         function isList(val) {
44512                 return (val != null && typeof val != 'function' && typeof val.length == 'number')
44513         }
44514
44515         function isFunction$2(val) {
44516                 return val && {}.toString.call(val) === '[object Function]'
44517         }
44518
44519         function isObject$2(val) {
44520                 return val && {}.toString.call(val) === '[object Object]'
44521         }
44522
44523         var slice$c = util.slice;
44524         var pluck$1 = util.pluck;
44525         var each$1 = util.each;
44526         var bind$4 = util.bind;
44527         var create$8 = util.create;
44528         var isList$1 = util.isList;
44529         var isFunction$3 = util.isFunction;
44530         var isObject$3 = util.isObject;
44531
44532         var storeEngine = {
44533                 createStore: createStore
44534         };
44535
44536         var storeAPI = {
44537                 version: '2.0.12',
44538                 enabled: false,
44539                 
44540                 // get returns the value of the given key. If that value
44541                 // is undefined, it returns optionalDefaultValue instead.
44542                 get: function(key, optionalDefaultValue) {
44543                         var data = this.storage.read(this._namespacePrefix + key);
44544                         return this._deserialize(data, optionalDefaultValue)
44545                 },
44546
44547                 // set will store the given value at key and returns value.
44548                 // Calling set with value === undefined is equivalent to calling remove.
44549                 set: function(key, value) {
44550                         if (value === undefined) {
44551                                 return this.remove(key)
44552                         }
44553                         this.storage.write(this._namespacePrefix + key, this._serialize(value));
44554                         return value
44555                 },
44556
44557                 // remove deletes the key and value stored at the given key.
44558                 remove: function(key) {
44559                         this.storage.remove(this._namespacePrefix + key);
44560                 },
44561
44562                 // each will call the given callback once for each key-value pair
44563                 // in this store.
44564                 each: function(callback) {
44565                         var self = this;
44566                         this.storage.each(function(val, namespacedKey) {
44567                                 callback.call(self, self._deserialize(val), (namespacedKey || '').replace(self._namespaceRegexp, ''));
44568                         });
44569                 },
44570
44571                 // clearAll will remove all the stored key-value pairs in this store.
44572                 clearAll: function() {
44573                         this.storage.clearAll();
44574                 },
44575
44576                 // additional functionality that can't live in plugins
44577                 // ---------------------------------------------------
44578
44579                 // hasNamespace returns true if this store instance has the given namespace.
44580                 hasNamespace: function(namespace) {
44581                         return (this._namespacePrefix == '__storejs_'+namespace+'_')
44582                 },
44583
44584                 // createStore creates a store.js instance with the first
44585                 // functioning storage in the list of storage candidates,
44586                 // and applies the the given mixins to the instance.
44587                 createStore: function() {
44588                         return createStore.apply(this, arguments)
44589                 },
44590                 
44591                 addPlugin: function(plugin) {
44592                         this._addPlugin(plugin);
44593                 },
44594                 
44595                 namespace: function(namespace) {
44596                         return createStore(this.storage, this.plugins, namespace)
44597                 }
44598         };
44599
44600         function _warn() {
44601                 var _console = (typeof console == 'undefined' ? null : console);
44602                 if (!_console) { return }
44603                 var fn = (_console.warn ? _console.warn : _console.log);
44604                 fn.apply(_console, arguments);
44605         }
44606
44607         function createStore(storages, plugins, namespace) {
44608                 if (!namespace) {
44609                         namespace = '';
44610                 }
44611                 if (storages && !isList$1(storages)) {
44612                         storages = [storages];
44613                 }
44614                 if (plugins && !isList$1(plugins)) {
44615                         plugins = [plugins];
44616                 }
44617
44618                 var namespacePrefix = (namespace ? '__storejs_'+namespace+'_' : '');
44619                 var namespaceRegexp = (namespace ? new RegExp('^'+namespacePrefix) : null);
44620                 var legalNamespaces = /^[a-zA-Z0-9_\-]*$/; // alpha-numeric + underscore and dash
44621                 if (!legalNamespaces.test(namespace)) {
44622                         throw new Error('store.js namespaces can only have alphanumerics + underscores and dashes')
44623                 }
44624                 
44625                 var _privateStoreProps = {
44626                         _namespacePrefix: namespacePrefix,
44627                         _namespaceRegexp: namespaceRegexp,
44628
44629                         _testStorage: function(storage) {
44630                                 try {
44631                                         var testStr = '__storejs__test__';
44632                                         storage.write(testStr, testStr);
44633                                         var ok = (storage.read(testStr) === testStr);
44634                                         storage.remove(testStr);
44635                                         return ok
44636                                 } catch(e) {
44637                                         return false
44638                                 }
44639                         },
44640
44641                         _assignPluginFnProp: function(pluginFnProp, propName) {
44642                                 var oldFn = this[propName];
44643                                 this[propName] = function pluginFn() {
44644                                         var args = slice$c(arguments, 0);
44645                                         var self = this;
44646
44647                                         // super_fn calls the old function which was overwritten by
44648                                         // this mixin.
44649                                         function super_fn() {
44650                                                 if (!oldFn) { return }
44651                                                 each$1(arguments, function(arg, i) {
44652                                                         args[i] = arg;
44653                                                 });
44654                                                 return oldFn.apply(self, args)
44655                                         }
44656
44657                                         // Give mixing function access to super_fn by prefixing all mixin function
44658                                         // arguments with super_fn.
44659                                         var newFnArgs = [super_fn].concat(args);
44660
44661                                         return pluginFnProp.apply(self, newFnArgs)
44662                                 };
44663                         },
44664
44665                         _serialize: function(obj) {
44666                                 return JSON.stringify(obj)
44667                         },
44668
44669                         _deserialize: function(strVal, defaultVal) {
44670                                 if (!strVal) { return defaultVal }
44671                                 // It is possible that a raw string value has been previously stored
44672                                 // in a storage without using store.js, meaning it will be a raw
44673                                 // string value instead of a JSON serialized string. By defaulting
44674                                 // to the raw string value in case of a JSON parse error, we allow
44675                                 // for past stored values to be forwards-compatible with store.js
44676                                 var val = '';
44677                                 try { val = JSON.parse(strVal); }
44678                                 catch(e) { val = strVal; }
44679
44680                                 return (val !== undefined ? val : defaultVal)
44681                         },
44682                         
44683                         _addStorage: function(storage) {
44684                                 if (this.enabled) { return }
44685                                 if (this._testStorage(storage)) {
44686                                         this.storage = storage;
44687                                         this.enabled = true;
44688                                 }
44689                         },
44690
44691                         _addPlugin: function(plugin) {
44692                                 var self = this;
44693
44694                                 // If the plugin is an array, then add all plugins in the array.
44695                                 // This allows for a plugin to depend on other plugins.
44696                                 if (isList$1(plugin)) {
44697                                         each$1(plugin, function(plugin) {
44698                                                 self._addPlugin(plugin);
44699                                         });
44700                                         return
44701                                 }
44702
44703                                 // Keep track of all plugins we've seen so far, so that we
44704                                 // don't add any of them twice.
44705                                 var seenPlugin = pluck$1(this.plugins, function(seenPlugin) {
44706                                         return (plugin === seenPlugin)
44707                                 });
44708                                 if (seenPlugin) {
44709                                         return
44710                                 }
44711                                 this.plugins.push(plugin);
44712
44713                                 // Check that the plugin is properly formed
44714                                 if (!isFunction$3(plugin)) {
44715                                         throw new Error('Plugins must be function values that return objects')
44716                                 }
44717
44718                                 var pluginProperties = plugin.call(this);
44719                                 if (!isObject$3(pluginProperties)) {
44720                                         throw new Error('Plugins must return an object of function properties')
44721                                 }
44722
44723                                 // Add the plugin function properties to this store instance.
44724                                 each$1(pluginProperties, function(pluginFnProp, propName) {
44725                                         if (!isFunction$3(pluginFnProp)) {
44726                                                 throw new Error('Bad plugin property: '+propName+' from plugin '+plugin.name+'. Plugins should only return functions.')
44727                                         }
44728                                         self._assignPluginFnProp(pluginFnProp, propName);
44729                                 });
44730                         },
44731                         
44732                         // Put deprecated properties in the private API, so as to not expose it to accidential
44733                         // discovery through inspection of the store object.
44734                         
44735                         // Deprecated: addStorage
44736                         addStorage: function(storage) {
44737                                 _warn('store.addStorage(storage) is deprecated. Use createStore([storages])');
44738                                 this._addStorage(storage);
44739                         }
44740                 };
44741
44742                 var store = create$8(_privateStoreProps, storeAPI, {
44743                         plugins: []
44744                 });
44745                 store.raw = {};
44746                 each$1(store, function(prop, propName) {
44747                         if (isFunction$3(prop)) {
44748                                 store.raw[propName] = bind$4(store, prop);                      
44749                         }
44750                 });
44751                 each$1(storages, function(storage) {
44752                         store._addStorage(storage);
44753                 });
44754                 each$1(plugins, function(plugin) {
44755                         store._addPlugin(plugin);
44756                 });
44757                 return store
44758         }
44759
44760         var Global$1 = util.Global;
44761
44762         var localStorage_1 = {
44763                 name: 'localStorage',
44764                 read: read,
44765                 write: write,
44766                 each: each$2,
44767                 remove: remove$2,
44768                 clearAll: clearAll,
44769         };
44770
44771         function localStorage$1() {
44772                 return Global$1.localStorage
44773         }
44774
44775         function read(key) {
44776                 return localStorage$1().getItem(key)
44777         }
44778
44779         function write(key, data) {
44780                 return localStorage$1().setItem(key, data)
44781         }
44782
44783         function each$2(fn) {
44784                 for (var i = localStorage$1().length - 1; i >= 0; i--) {
44785                         var key = localStorage$1().key(i);
44786                         fn(read(key), key);
44787                 }
44788         }
44789
44790         function remove$2(key) {
44791                 return localStorage$1().removeItem(key)
44792         }
44793
44794         function clearAll() {
44795                 return localStorage$1().clear()
44796         }
44797
44798         // oldFF-globalStorage provides storage for Firefox
44799         // versions 6 and 7, where no localStorage, etc
44800         // is available.
44801
44802
44803         var Global$2 = util.Global;
44804
44805         var oldFFGlobalStorage = {
44806                 name: 'oldFF-globalStorage',
44807                 read: read$1,
44808                 write: write$1,
44809                 each: each$3,
44810                 remove: remove$3,
44811                 clearAll: clearAll$1,
44812         };
44813
44814         var globalStorage = Global$2.globalStorage;
44815
44816         function read$1(key) {
44817                 return globalStorage[key]
44818         }
44819
44820         function write$1(key, data) {
44821                 globalStorage[key] = data;
44822         }
44823
44824         function each$3(fn) {
44825                 for (var i = globalStorage.length - 1; i >= 0; i--) {
44826                         var key = globalStorage.key(i);
44827                         fn(globalStorage[key], key);
44828                 }
44829         }
44830
44831         function remove$3(key) {
44832                 return globalStorage.removeItem(key)
44833         }
44834
44835         function clearAll$1() {
44836                 each$3(function(key, _) {
44837                         delete globalStorage[key];
44838                 });
44839         }
44840
44841         // oldIE-userDataStorage provides storage for Internet Explorer
44842         // versions 6 and 7, where no localStorage, sessionStorage, etc
44843         // is available.
44844
44845
44846         var Global$3 = util.Global;
44847
44848         var oldIEUserDataStorage = {
44849                 name: 'oldIE-userDataStorage',
44850                 write: write$2,
44851                 read: read$2,
44852                 each: each$4,
44853                 remove: remove$4,
44854                 clearAll: clearAll$2,
44855         };
44856
44857         var storageName = 'storejs';
44858         var doc = Global$3.document;
44859         var _withStorageEl = _makeIEStorageElFunction();
44860         var disable = (Global$3.navigator ? Global$3.navigator.userAgent : '').match(/ (MSIE 8|MSIE 9|MSIE 10)\./); // MSIE 9.x, MSIE 10.x
44861
44862         function write$2(unfixedKey, data) {
44863                 if (disable) { return }
44864                 var fixedKey = fixKey(unfixedKey);
44865                 _withStorageEl(function(storageEl) {
44866                         storageEl.setAttribute(fixedKey, data);
44867                         storageEl.save(storageName);
44868                 });
44869         }
44870
44871         function read$2(unfixedKey) {
44872                 if (disable) { return }
44873                 var fixedKey = fixKey(unfixedKey);
44874                 var res = null;
44875                 _withStorageEl(function(storageEl) {
44876                         res = storageEl.getAttribute(fixedKey);
44877                 });
44878                 return res
44879         }
44880
44881         function each$4(callback) {
44882                 _withStorageEl(function(storageEl) {
44883                         var attributes = storageEl.XMLDocument.documentElement.attributes;
44884                         for (var i=attributes.length-1; i>=0; i--) {
44885                                 var attr = attributes[i];
44886                                 callback(storageEl.getAttribute(attr.name), attr.name);
44887                         }
44888                 });
44889         }
44890
44891         function remove$4(unfixedKey) {
44892                 var fixedKey = fixKey(unfixedKey);
44893                 _withStorageEl(function(storageEl) {
44894                         storageEl.removeAttribute(fixedKey);
44895                         storageEl.save(storageName);
44896                 });
44897         }
44898
44899         function clearAll$2() {
44900                 _withStorageEl(function(storageEl) {
44901                         var attributes = storageEl.XMLDocument.documentElement.attributes;
44902                         storageEl.load(storageName);
44903                         for (var i=attributes.length-1; i>=0; i--) {
44904                                 storageEl.removeAttribute(attributes[i].name);
44905                         }
44906                         storageEl.save(storageName);
44907                 });
44908         }
44909
44910         // Helpers
44911         //////////
44912
44913         // In IE7, keys cannot start with a digit or contain certain chars.
44914         // See https://github.com/marcuswestin/store.js/issues/40
44915         // See https://github.com/marcuswestin/store.js/issues/83
44916         var forbiddenCharsRegex = new RegExp("[!\"#$%&'()*+,/\\\\:;<=>?@[\\]^`{|}~]", "g");
44917         function fixKey(key) {
44918                 return key.replace(/^\d/, '___$&').replace(forbiddenCharsRegex, '___')
44919         }
44920
44921         function _makeIEStorageElFunction() {
44922                 if (!doc || !doc.documentElement || !doc.documentElement.addBehavior) {
44923                         return null
44924                 }
44925                 var scriptTag = 'script',
44926                         storageOwner,
44927                         storageContainer,
44928                         storageEl;
44929
44930                 // Since #userData storage applies only to specific paths, we need to
44931                 // somehow link our data to a specific path.  We choose /favicon.ico
44932                 // as a pretty safe option, since all browsers already make a request to
44933                 // this URL anyway and being a 404 will not hurt us here.  We wrap an
44934                 // iframe pointing to the favicon in an ActiveXObject(htmlfile) object
44935                 // (see: http://msdn.microsoft.com/en-us/library/aa752574(v=VS.85).aspx)
44936                 // since the iframe access rules appear to allow direct access and
44937                 // manipulation of the document element, even for a 404 page.  This
44938                 // document can be used instead of the current document (which would
44939                 // have been limited to the current path) to perform #userData storage.
44940                 try {
44941                         /* global ActiveXObject */
44942                         storageContainer = new ActiveXObject('htmlfile');
44943                         storageContainer.open();
44944                         storageContainer.write('<'+scriptTag+'>document.w=window</'+scriptTag+'><iframe src="/favicon.ico"></iframe>');
44945                         storageContainer.close();
44946                         storageOwner = storageContainer.w.frames[0].document;
44947                         storageEl = storageOwner.createElement('div');
44948                 } catch(e) {
44949                         // somehow ActiveXObject instantiation failed (perhaps some special
44950                         // security settings or otherwse), fall back to per-path storage
44951                         storageEl = doc.createElement('div');
44952                         storageOwner = doc.body;
44953                 }
44954
44955                 return function(storeFunction) {
44956                         var args = [].slice.call(arguments, 0);
44957                         args.unshift(storageEl);
44958                         // See http://msdn.microsoft.com/en-us/library/ms531081(v=VS.85).aspx
44959                         // and http://msdn.microsoft.com/en-us/library/ms531424(v=VS.85).aspx
44960                         storageOwner.appendChild(storageEl);
44961                         storageEl.addBehavior('#default#userData');
44962                         storageEl.load(storageName);
44963                         storeFunction.apply(this, args);
44964                         storageOwner.removeChild(storageEl);
44965                         return
44966                 }
44967         }
44968
44969         // cookieStorage is useful Safari private browser mode, where localStorage
44970         // doesn't work but cookies do. This implementation is adopted from
44971         // https://developer.mozilla.org/en-US/docs/Web/API/Storage/LocalStorage
44972
44973
44974         var Global$4 = util.Global;
44975         var trim$2 = util.trim;
44976
44977         var cookieStorage = {
44978                 name: 'cookieStorage',
44979                 read: read$3,
44980                 write: write$3,
44981                 each: each$5,
44982                 remove: remove$5,
44983                 clearAll: clearAll$3,
44984         };
44985
44986         var doc$1 = Global$4.document;
44987
44988         function read$3(key) {
44989                 if (!key || !_has(key)) { return null }
44990                 var regexpStr = "(?:^|.*;\\s*)" +
44991                         escape(key).replace(/[\-\.\+\*]/g, "\\$&") +
44992                         "\\s*\\=\\s*((?:[^;](?!;))*[^;]?).*";
44993                 return unescape(doc$1.cookie.replace(new RegExp(regexpStr), "$1"))
44994         }
44995
44996         function each$5(callback) {
44997                 var cookies = doc$1.cookie.split(/; ?/g);
44998                 for (var i = cookies.length - 1; i >= 0; i--) {
44999                         if (!trim$2(cookies[i])) {
45000                                 continue
45001                         }
45002                         var kvp = cookies[i].split('=');
45003                         var key = unescape(kvp[0]);
45004                         var val = unescape(kvp[1]);
45005                         callback(val, key);
45006                 }
45007         }
45008
45009         function write$3(key, data) {
45010                 if(!key) { return }
45011                 doc$1.cookie = escape(key) + "=" + escape(data) + "; expires=Tue, 19 Jan 2038 03:14:07 GMT; path=/";
45012         }
45013
45014         function remove$5(key) {
45015                 if (!key || !_has(key)) {
45016                         return
45017                 }
45018                 doc$1.cookie = escape(key) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/";
45019         }
45020
45021         function clearAll$3() {
45022                 each$5(function(_, key) {
45023                         remove$5(key);
45024                 });
45025         }
45026
45027         function _has(key) {
45028                 return (new RegExp("(?:^|;\\s*)" + escape(key).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=")).test(doc$1.cookie)
45029         }
45030
45031         var Global$5 = util.Global;
45032
45033         var sessionStorage_1 = {
45034                 name: 'sessionStorage',
45035                 read: read$4,
45036                 write: write$4,
45037                 each: each$6,
45038                 remove: remove$6,
45039                 clearAll: clearAll$4
45040         };
45041
45042         function sessionStorage() {
45043                 return Global$5.sessionStorage
45044         }
45045
45046         function read$4(key) {
45047                 return sessionStorage().getItem(key)
45048         }
45049
45050         function write$4(key, data) {
45051                 return sessionStorage().setItem(key, data)
45052         }
45053
45054         function each$6(fn) {
45055                 for (var i = sessionStorage().length - 1; i >= 0; i--) {
45056                         var key = sessionStorage().key(i);
45057                         fn(read$4(key), key);
45058                 }
45059         }
45060
45061         function remove$6(key) {
45062                 return sessionStorage().removeItem(key)
45063         }
45064
45065         function clearAll$4() {
45066                 return sessionStorage().clear()
45067         }
45068
45069         // memoryStorage is a useful last fallback to ensure that the store
45070         // is functions (meaning store.get(), store.set(), etc will all function).
45071         // However, stored values will not persist when the browser navigates to
45072         // a new page or reloads the current page.
45073
45074         var memoryStorage_1 = {
45075                 name: 'memoryStorage',
45076                 read: read$5,
45077                 write: write$5,
45078                 each: each$7,
45079                 remove: remove$7,
45080                 clearAll: clearAll$5,
45081         };
45082
45083         var memoryStorage = {};
45084
45085         function read$5(key) {
45086                 return memoryStorage[key]
45087         }
45088
45089         function write$5(key, data) {
45090                 memoryStorage[key] = data;
45091         }
45092
45093         function each$7(callback) {
45094                 for (var key in memoryStorage) {
45095                         if (memoryStorage.hasOwnProperty(key)) {
45096                                 callback(memoryStorage[key], key);
45097                         }
45098                 }
45099         }
45100
45101         function remove$7(key) {
45102                 delete memoryStorage[key];
45103         }
45104
45105         function clearAll$5(key) {
45106                 memoryStorage = {};
45107         }
45108
45109         var all = [
45110                 // Listed in order of usage preference
45111                 localStorage_1,
45112                 oldFFGlobalStorage,
45113                 oldIEUserDataStorage,
45114                 cookieStorage,
45115                 sessionStorage_1,
45116                 memoryStorage_1
45117         ];
45118
45119         /* eslint-disable */
45120
45121         //  json2.js
45122         //  2016-10-28
45123         //  Public Domain.
45124         //  NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
45125         //  See http://www.JSON.org/js.html
45126         //  This code should be minified before deployment.
45127         //  See http://javascript.crockford.com/jsmin.html
45128
45129         //  USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
45130         //  NOT CONTROL.
45131
45132         //  This file creates a global JSON object containing two methods: stringify
45133         //  and parse. This file provides the ES5 JSON capability to ES3 systems.
45134         //  If a project might run on IE8 or earlier, then this file should be included.
45135         //  This file does nothing on ES5 systems.
45136
45137         //      JSON.stringify(value, replacer, space)
45138         //          value       any JavaScript value, usually an object or array.
45139         //          replacer    an optional parameter that determines how object
45140         //                      values are stringified for objects. It can be a
45141         //                      function or an array of strings.
45142         //          space       an optional parameter that specifies the indentation
45143         //                      of nested structures. If it is omitted, the text will
45144         //                      be packed without extra whitespace. If it is a number,
45145         //                      it will specify the number of spaces to indent at each
45146         //                      level. If it is a string (such as "\t" or "&nbsp;"),
45147         //                      it contains the characters used to indent at each level.
45148         //          This method produces a JSON text from a JavaScript value.
45149         //          When an object value is found, if the object contains a toJSON
45150         //          method, its toJSON method will be called and the result will be
45151         //          stringified. A toJSON method does not serialize: it returns the
45152         //          value represented by the name/value pair that should be serialized,
45153         //          or undefined if nothing should be serialized. The toJSON method
45154         //          will be passed the key associated with the value, and this will be
45155         //          bound to the value.
45156
45157         //          For example, this would serialize Dates as ISO strings.
45158
45159         //              Date.prototype.toJSON = function (key) {
45160         //                  function f(n) {
45161         //                      // Format integers to have at least two digits.
45162         //                      return (n < 10)
45163         //                          ? "0" + n
45164         //                          : n;
45165         //                  }
45166         //                  return this.getUTCFullYear()   + "-" +
45167         //                       f(this.getUTCMonth() + 1) + "-" +
45168         //                       f(this.getUTCDate())      + "T" +
45169         //                       f(this.getUTCHours())     + ":" +
45170         //                       f(this.getUTCMinutes())   + ":" +
45171         //                       f(this.getUTCSeconds())   + "Z";
45172         //              };
45173
45174         //          You can provide an optional replacer method. It will be passed the
45175         //          key and value of each member, with this bound to the containing
45176         //          object. The value that is returned from your method will be
45177         //          serialized. If your method returns undefined, then the member will
45178         //          be excluded from the serialization.
45179
45180         //          If the replacer parameter is an array of strings, then it will be
45181         //          used to select the members to be serialized. It filters the results
45182         //          such that only members with keys listed in the replacer array are
45183         //          stringified.
45184
45185         //          Values that do not have JSON representations, such as undefined or
45186         //          functions, will not be serialized. Such values in objects will be
45187         //          dropped; in arrays they will be replaced with null. You can use
45188         //          a replacer function to replace those with JSON values.
45189
45190         //          JSON.stringify(undefined) returns undefined.
45191
45192         //          The optional space parameter produces a stringification of the
45193         //          value that is filled with line breaks and indentation to make it
45194         //          easier to read.
45195
45196         //          If the space parameter is a non-empty string, then that string will
45197         //          be used for indentation. If the space parameter is a number, then
45198         //          the indentation will be that many spaces.
45199
45200         //          Example:
45201
45202         //          text = JSON.stringify(["e", {pluribus: "unum"}]);
45203         //          // text is '["e",{"pluribus":"unum"}]'
45204
45205         //          text = JSON.stringify(["e", {pluribus: "unum"}], null, "\t");
45206         //          // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
45207
45208         //          text = JSON.stringify([new Date()], function (key, value) {
45209         //              return this[key] instanceof Date
45210         //                  ? "Date(" + this[key] + ")"
45211         //                  : value;
45212         //          });
45213         //          // text is '["Date(---current time---)"]'
45214
45215         //      JSON.parse(text, reviver)
45216         //          This method parses a JSON text to produce an object or array.
45217         //          It can throw a SyntaxError exception.
45218
45219         //          The optional reviver parameter is a function that can filter and
45220         //          transform the results. It receives each of the keys and values,
45221         //          and its return value is used instead of the original value.
45222         //          If it returns what it received, then the structure is not modified.
45223         //          If it returns undefined then the member is deleted.
45224
45225         //          Example:
45226
45227         //          // Parse the text. Values that look like ISO date strings will
45228         //          // be converted to Date objects.
45229
45230         //          myData = JSON.parse(text, function (key, value) {
45231         //              var a;
45232         //              if (typeof value === "string") {
45233         //                  a =
45234         //   /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
45235         //                  if (a) {
45236         //                      return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
45237         //                          +a[5], +a[6]));
45238         //                  }
45239         //              }
45240         //              return value;
45241         //          });
45242
45243         //          myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
45244         //              var d;
45245         //              if (typeof value === "string" &&
45246         //                      value.slice(0, 5) === "Date(" &&
45247         //                      value.slice(-1) === ")") {
45248         //                  d = new Date(value.slice(5, -1));
45249         //                  if (d) {
45250         //                      return d;
45251         //                  }
45252         //              }
45253         //              return value;
45254         //          });
45255
45256         //  This is a reference implementation. You are free to copy, modify, or
45257         //  redistribute.
45258
45259         /*jslint
45260             eval, for, this
45261         */
45262
45263         /*property
45264             JSON, apply, call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
45265             getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
45266             lastIndex, length, parse, prototype, push, replace, slice, stringify,
45267             test, toJSON, toString, valueOf
45268         */
45269
45270
45271         // Create a JSON object only if one does not already exist. We create the
45272         // methods in a closure to avoid creating global variables.
45273
45274         if (typeof JSON !== "object") {
45275             JSON = {};
45276         }
45277
45278         (function () {
45279
45280             var rx_one = /^[\],:{}\s]*$/;
45281             var rx_two = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g;
45282             var rx_three = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g;
45283             var rx_four = /(?:^|:|,)(?:\s*\[)+/g;
45284             var rx_escapable = /[\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
45285             var rx_dangerous = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
45286
45287             function f(n) {
45288                 // Format integers to have at least two digits.
45289                 return n < 10
45290                     ? "0" + n
45291                     : n;
45292             }
45293
45294             function this_value() {
45295                 return this.valueOf();
45296             }
45297
45298             if (typeof Date.prototype.toJSON !== "function") {
45299
45300                 Date.prototype.toJSON = function () {
45301
45302                     return isFinite(this.valueOf())
45303                         ? this.getUTCFullYear() + "-" +
45304                                 f(this.getUTCMonth() + 1) + "-" +
45305                                 f(this.getUTCDate()) + "T" +
45306                                 f(this.getUTCHours()) + ":" +
45307                                 f(this.getUTCMinutes()) + ":" +
45308                                 f(this.getUTCSeconds()) + "Z"
45309                         : null;
45310                 };
45311
45312                 Boolean.prototype.toJSON = this_value;
45313                 Number.prototype.toJSON = this_value;
45314                 String.prototype.toJSON = this_value;
45315             }
45316
45317             var gap;
45318             var indent;
45319             var meta;
45320             var rep;
45321
45322
45323             function quote(string) {
45324
45325         // If the string contains no control characters, no quote characters, and no
45326         // backslash characters, then we can safely slap some quotes around it.
45327         // Otherwise we must also replace the offending characters with safe escape
45328         // sequences.
45329
45330                 rx_escapable.lastIndex = 0;
45331                 return rx_escapable.test(string)
45332                     ? "\"" + string.replace(rx_escapable, function (a) {
45333                         var c = meta[a];
45334                         return typeof c === "string"
45335                             ? c
45336                             : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
45337                     }) + "\""
45338                     : "\"" + string + "\"";
45339             }
45340
45341
45342             function str(key, holder) {
45343
45344         // Produce a string from holder[key].
45345
45346                 var i;          // The loop counter.
45347                 var k;          // The member key.
45348                 var v;          // The member value.
45349                 var length;
45350                 var mind = gap;
45351                 var partial;
45352                 var value = holder[key];
45353
45354         // If the value has a toJSON method, call it to obtain a replacement value.
45355
45356                 if (value && typeof value === "object" &&
45357                         typeof value.toJSON === "function") {
45358                     value = value.toJSON(key);
45359                 }
45360
45361         // If we were called with a replacer function, then call the replacer to
45362         // obtain a replacement value.
45363
45364                 if (typeof rep === "function") {
45365                     value = rep.call(holder, key, value);
45366                 }
45367
45368         // What happens next depends on the value's type.
45369
45370                 switch (typeof value) {
45371                 case "string":
45372                     return quote(value);
45373
45374                 case "number":
45375
45376         // JSON numbers must be finite. Encode non-finite numbers as null.
45377
45378                     return isFinite(value)
45379                         ? String(value)
45380                         : "null";
45381
45382                 case "boolean":
45383                 case "null":
45384
45385         // If the value is a boolean or null, convert it to a string. Note:
45386         // typeof null does not produce "null". The case is included here in
45387         // the remote chance that this gets fixed someday.
45388
45389                     return String(value);
45390
45391         // If the type is "object", we might be dealing with an object or an array or
45392         // null.
45393
45394                 case "object":
45395
45396         // Due to a specification blunder in ECMAScript, typeof null is "object",
45397         // so watch out for that case.
45398
45399                     if (!value) {
45400                         return "null";
45401                     }
45402
45403         // Make an array to hold the partial results of stringifying this object value.
45404
45405                     gap += indent;
45406                     partial = [];
45407
45408         // Is the value an array?
45409
45410                     if (Object.prototype.toString.apply(value) === "[object Array]") {
45411
45412         // The value is an array. Stringify every element. Use null as a placeholder
45413         // for non-JSON values.
45414
45415                         length = value.length;
45416                         for (i = 0; i < length; i += 1) {
45417                             partial[i] = str(i, value) || "null";
45418                         }
45419
45420         // Join all of the elements together, separated with commas, and wrap them in
45421         // brackets.
45422
45423                         v = partial.length === 0
45424                             ? "[]"
45425                             : gap
45426                                 ? "[\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "]"
45427                                 : "[" + partial.join(",") + "]";
45428                         gap = mind;
45429                         return v;
45430                     }
45431
45432         // If the replacer is an array, use it to select the members to be stringified.
45433
45434                     if (rep && typeof rep === "object") {
45435                         length = rep.length;
45436                         for (i = 0; i < length; i += 1) {
45437                             if (typeof rep[i] === "string") {
45438                                 k = rep[i];
45439                                 v = str(k, value);
45440                                 if (v) {
45441                                     partial.push(quote(k) + (
45442                                         gap
45443                                             ? ": "
45444                                             : ":"
45445                                     ) + v);
45446                                 }
45447                             }
45448                         }
45449                     } else {
45450
45451         // Otherwise, iterate through all of the keys in the object.
45452
45453                         for (k in value) {
45454                             if (Object.prototype.hasOwnProperty.call(value, k)) {
45455                                 v = str(k, value);
45456                                 if (v) {
45457                                     partial.push(quote(k) + (
45458                                         gap
45459                                             ? ": "
45460                                             : ":"
45461                                     ) + v);
45462                                 }
45463                             }
45464                         }
45465                     }
45466
45467         // Join all of the member texts together, separated with commas,
45468         // and wrap them in braces.
45469
45470                     v = partial.length === 0
45471                         ? "{}"
45472                         : gap
45473                             ? "{\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "}"
45474                             : "{" + partial.join(",") + "}";
45475                     gap = mind;
45476                     return v;
45477                 }
45478             }
45479
45480         // If the JSON object does not yet have a stringify method, give it one.
45481
45482             if (typeof JSON.stringify !== "function") {
45483                 meta = {    // table of character substitutions
45484                     "\b": "\\b",
45485                     "\t": "\\t",
45486                     "\n": "\\n",
45487                     "\f": "\\f",
45488                     "\r": "\\r",
45489                     "\"": "\\\"",
45490                     "\\": "\\\\"
45491                 };
45492                 JSON.stringify = function (value, replacer, space) {
45493
45494         // The stringify method takes a value and an optional replacer, and an optional
45495         // space parameter, and returns a JSON text. The replacer can be a function
45496         // that can replace values, or an array of strings that will select the keys.
45497         // A default replacer method can be provided. Use of the space parameter can
45498         // produce text that is more easily readable.
45499
45500                     var i;
45501                     gap = "";
45502                     indent = "";
45503
45504         // If the space parameter is a number, make an indent string containing that
45505         // many spaces.
45506
45507                     if (typeof space === "number") {
45508                         for (i = 0; i < space; i += 1) {
45509                             indent += " ";
45510                         }
45511
45512         // If the space parameter is a string, it will be used as the indent string.
45513
45514                     } else if (typeof space === "string") {
45515                         indent = space;
45516                     }
45517
45518         // If there is a replacer, it must be a function or an array.
45519         // Otherwise, throw an error.
45520
45521                     rep = replacer;
45522                     if (replacer && typeof replacer !== "function" &&
45523                             (typeof replacer !== "object" ||
45524                             typeof replacer.length !== "number")) {
45525                         throw new Error("JSON.stringify");
45526                     }
45527
45528         // Make a fake root object containing our value under the key of "".
45529         // Return the result of stringifying the value.
45530
45531                     return str("", {"": value});
45532                 };
45533             }
45534
45535
45536         // If the JSON object does not yet have a parse method, give it one.
45537
45538             if (typeof JSON.parse !== "function") {
45539                 JSON.parse = function (text, reviver) {
45540
45541         // The parse method takes a text and an optional reviver function, and returns
45542         // a JavaScript value if the text is a valid JSON text.
45543
45544                     var j;
45545
45546                     function walk(holder, key) {
45547
45548         // The walk method is used to recursively walk the resulting structure so
45549         // that modifications can be made.
45550
45551                         var k;
45552                         var v;
45553                         var value = holder[key];
45554                         if (value && typeof value === "object") {
45555                             for (k in value) {
45556                                 if (Object.prototype.hasOwnProperty.call(value, k)) {
45557                                     v = walk(value, k);
45558                                     if (v !== undefined) {
45559                                         value[k] = v;
45560                                     } else {
45561                                         delete value[k];
45562                                     }
45563                                 }
45564                             }
45565                         }
45566                         return reviver.call(holder, key, value);
45567                     }
45568
45569
45570         // Parsing happens in four stages. In the first stage, we replace certain
45571         // Unicode characters with escape sequences. JavaScript handles many characters
45572         // incorrectly, either silently deleting them, or treating them as line endings.
45573
45574                     text = String(text);
45575                     rx_dangerous.lastIndex = 0;
45576                     if (rx_dangerous.test(text)) {
45577                         text = text.replace(rx_dangerous, function (a) {
45578                             return "\\u" +
45579                                     ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
45580                         });
45581                     }
45582
45583         // In the second stage, we run the text against regular expressions that look
45584         // for non-JSON patterns. We are especially concerned with "()" and "new"
45585         // because they can cause invocation, and "=" because it can cause mutation.
45586         // But just to be safe, we want to reject all unexpected forms.
45587
45588         // We split the second stage into 4 regexp operations in order to work around
45589         // crippling inefficiencies in IE's and Safari's regexp engines. First we
45590         // replace the JSON backslash pairs with "@" (a non-JSON character). Second, we
45591         // replace all simple value tokens with "]" characters. Third, we delete all
45592         // open brackets that follow a colon or comma or that begin the text. Finally,
45593         // we look to see that the remaining characters are only whitespace or "]" or
45594         // "," or ":" or "{" or "}". If that is so, then the text is safe for eval.
45595
45596                     if (
45597                         rx_one.test(
45598                             text
45599                                 .replace(rx_two, "@")
45600                                 .replace(rx_three, "]")
45601                                 .replace(rx_four, "")
45602                         )
45603                     ) {
45604
45605         // In the third stage we use the eval function to compile the text into a
45606         // JavaScript structure. The "{" operator is subject to a syntactic ambiguity
45607         // in JavaScript: it can begin a block or an object literal. We wrap the text
45608         // in parens to eliminate the ambiguity.
45609
45610                         j = eval("(" + text + ")");
45611
45612         // In the optional fourth stage, we recursively walk the new structure, passing
45613         // each name/value pair to a reviver function for possible transformation.
45614
45615                         return (typeof reviver === "function")
45616                             ? walk({"": j}, "")
45617                             : j;
45618                     }
45619
45620         // If the text is not JSON parseable, then a SyntaxError is thrown.
45621
45622                     throw new SyntaxError("JSON.parse");
45623                 };
45624             }
45625         }());
45626
45627         var json2 = json2Plugin;
45628
45629         function json2Plugin() {
45630                 
45631                 return {}
45632         }
45633
45634         var plugins = [json2];
45635
45636         var store_legacy = storeEngine.createStore(all, plugins);
45637
45638         // # osm-auth
45639         //
45640         // This code is only compatible with IE10+ because the [XDomainRequest](http://bit.ly/LfO7xo)
45641         // object, IE<10's idea of [CORS](http://en.wikipedia.org/wiki/Cross-origin_resource_sharing),
45642         // does not support custom headers, which this uses everywhere.
45643         var osmAuth = function(o) {
45644
45645             var oauth = {};
45646
45647             // authenticated users will also have a request token secret, but it's
45648             // not used in transactions with the server
45649             oauth.authenticated = function() {
45650                 return !!(token('oauth_token') && token('oauth_token_secret'));
45651             };
45652
45653             oauth.logout = function() {
45654                 token('oauth_token', '');
45655                 token('oauth_token_secret', '');
45656                 token('oauth_request_token_secret', '');
45657                 return oauth;
45658             };
45659
45660             // TODO: detect lack of click event
45661             oauth.authenticate = function(callback) {
45662                 if (oauth.authenticated()) return callback();
45663
45664                 oauth.logout();
45665
45666                 // ## Getting a request token
45667                 var params = timenonce(getAuth(o)),
45668                     url = o.url + '/oauth/request_token';
45669
45670                 params.oauth_signature = ohauth_1.signature(
45671                     o.oauth_secret, '',
45672                     ohauth_1.baseString('POST', url, params));
45673
45674                 if (!o.singlepage) {
45675                     // Create a 600x550 popup window in the center of the screen
45676                     var w = 600, h = 550,
45677                         settings = [
45678                             ['width', w], ['height', h],
45679                             ['left', screen.width / 2 - w / 2],
45680                             ['top', screen.height / 2 - h / 2]].map(function(x) {
45681                                 return x.join('=');
45682                             }).join(','),
45683                         popup = window.open('about:blank', 'oauth_window', settings);
45684                 }
45685
45686                 // Request a request token. When this is complete, the popup
45687                 // window is redirected to OSM's authorization page.
45688                 ohauth_1.xhr('POST', url, params, null, {}, reqTokenDone);
45689                 o.loading();
45690
45691                 function reqTokenDone(err, xhr) {
45692                     o.done();
45693                     if (err) return callback(err);
45694                     var resp = ohauth_1.stringQs(xhr.response);
45695                     token('oauth_request_token_secret', resp.oauth_token_secret);
45696                     var authorize_url = o.url + '/oauth/authorize?' + ohauth_1.qsString({
45697                         oauth_token: resp.oauth_token,
45698                         oauth_callback: resolveUrl(o.landing)
45699                     });
45700
45701                     if (o.singlepage) {
45702                         location.href = authorize_url;
45703                     } else {
45704                         popup.location = authorize_url;
45705                     }
45706                 }
45707
45708                 // Called by a function in a landing page, in the popup window. The
45709                 // window closes itself.
45710                 window.authComplete = function(token) {
45711                     var oauth_token = ohauth_1.stringQs(token.split('?')[1]);
45712                     get_access_token(oauth_token.oauth_token);
45713                     delete window.authComplete;
45714                 };
45715
45716                 // ## Getting an request token
45717                 //
45718                 // At this point we have an `oauth_token`, brought in from a function
45719                 // call on a landing page popup.
45720                 function get_access_token(oauth_token) {
45721                     var url = o.url + '/oauth/access_token',
45722                         params = timenonce(getAuth(o)),
45723                         request_token_secret = token('oauth_request_token_secret');
45724                     params.oauth_token = oauth_token;
45725                     params.oauth_signature = ohauth_1.signature(
45726                         o.oauth_secret,
45727                         request_token_secret,
45728                         ohauth_1.baseString('POST', url, params));
45729
45730                     // ## Getting an access token
45731                     //
45732                     // The final token required for authentication. At this point
45733                     // we have a `request token secret`
45734                     ohauth_1.xhr('POST', url, params, null, {}, accessTokenDone);
45735                     o.loading();
45736                 }
45737
45738                 function accessTokenDone(err, xhr) {
45739                     o.done();
45740                     if (err) return callback(err);
45741                     var access_token = ohauth_1.stringQs(xhr.response);
45742                     token('oauth_token', access_token.oauth_token);
45743                     token('oauth_token_secret', access_token.oauth_token_secret);
45744                     callback(null, oauth);
45745                 }
45746             };
45747
45748             oauth.bootstrapToken = function(oauth_token, callback) {
45749                 // ## Getting an request token
45750                 // At this point we have an `oauth_token`, brought in from a function
45751                 // call on a landing page popup.
45752                 function get_access_token(oauth_token) {
45753                     var url = o.url + '/oauth/access_token',
45754                         params = timenonce(getAuth(o)),
45755                         request_token_secret = token('oauth_request_token_secret');
45756                     params.oauth_token = oauth_token;
45757                     params.oauth_signature = ohauth_1.signature(
45758                         o.oauth_secret,
45759                         request_token_secret,
45760                         ohauth_1.baseString('POST', url, params));
45761
45762                     // ## Getting an access token
45763                     // The final token required for authentication. At this point
45764                     // we have a `request token secret`
45765                     ohauth_1.xhr('POST', url, params, null, {}, accessTokenDone);
45766                     o.loading();
45767                 }
45768
45769                 function accessTokenDone(err, xhr) {
45770                     o.done();
45771                     if (err) return callback(err);
45772                     var access_token = ohauth_1.stringQs(xhr.response);
45773                     token('oauth_token', access_token.oauth_token);
45774                     token('oauth_token_secret', access_token.oauth_token_secret);
45775                     callback(null, oauth);
45776                 }
45777
45778                 get_access_token(oauth_token);
45779             };
45780
45781             // # xhr
45782             //
45783             // A single XMLHttpRequest wrapper that does authenticated calls if the
45784             // user has logged in.
45785             oauth.xhr = function(options, callback) {
45786                 if (!oauth.authenticated()) {
45787                     if (o.auto) {
45788                         return oauth.authenticate(run);
45789                     } else {
45790                         callback('not authenticated', null);
45791                         return;
45792                     }
45793                 } else {
45794                     return run();
45795                 }
45796
45797                 function run() {
45798                     var params = timenonce(getAuth(o)),
45799                         oauth_token_secret = token('oauth_token_secret'),
45800                         url = (options.prefix !== false) ? o.url + options.path : options.path,
45801                         url_parts = url.replace(/#.*$/, '').split('?', 2),
45802                         base_url = url_parts[0],
45803                         query = (url_parts.length === 2) ? url_parts[1] : '';
45804
45805                     // https://tools.ietf.org/html/rfc5849#section-3.4.1.3.1
45806                     if ((!options.options || !options.options.header ||
45807                         options.options.header['Content-Type'] === 'application/x-www-form-urlencoded') &&
45808                         options.content) {
45809                         params = immutable(params, ohauth_1.stringQs(options.content));
45810                     }
45811
45812                     params.oauth_token = token('oauth_token');
45813                     params.oauth_signature = ohauth_1.signature(
45814                         o.oauth_secret,
45815                         oauth_token_secret,
45816                         ohauth_1.baseString(options.method, base_url, immutable(params, ohauth_1.stringQs(query)))
45817                     );
45818
45819                     return ohauth_1.xhr(options.method, url, params, options.content, options.options, done);
45820                 }
45821
45822                 function done(err, xhr) {
45823                     if (err) return callback(err);
45824                     else if (xhr.responseXML) return callback(err, xhr.responseXML);
45825                     else return callback(err, xhr.response);
45826                 }
45827             };
45828
45829             // pre-authorize this object, if we can just get a token and token_secret
45830             // from the start
45831             oauth.preauth = function(c) {
45832                 if (!c) return;
45833                 if (c.oauth_token) token('oauth_token', c.oauth_token);
45834                 if (c.oauth_token_secret) token('oauth_token_secret', c.oauth_token_secret);
45835                 return oauth;
45836             };
45837
45838             oauth.options = function(_) {
45839                 if (!arguments.length) return o;
45840
45841                 o = _;
45842                 o.url = o.url || 'https://www.openstreetmap.org';
45843                 o.landing = o.landing || 'land.html';
45844                 o.singlepage = o.singlepage || false;
45845
45846                 // Optional loading and loading-done functions for nice UI feedback.
45847                 // by default, no-ops
45848                 o.loading = o.loading || function() {};
45849                 o.done = o.done || function() {};
45850
45851                 return oauth.preauth(o);
45852             };
45853
45854             // 'stamp' an authentication object from `getAuth()`
45855             // with a [nonce](http://en.wikipedia.org/wiki/Cryptographic_nonce)
45856             // and timestamp
45857             function timenonce(o) {
45858                 o.oauth_timestamp = ohauth_1.timestamp();
45859                 o.oauth_nonce = ohauth_1.nonce();
45860                 return o;
45861             }
45862
45863             // get/set tokens. These are prefixed with the base URL so that `osm-auth`
45864             // can be used with multiple APIs and the keys in `localStorage`
45865             // will not clash
45866             var token;
45867
45868             if (store_legacy.enabled) {
45869                 token = function (x, y) {
45870                     if (arguments.length === 1) return store_legacy.get(o.url + x);
45871                     else if (arguments.length === 2) return store_legacy.set(o.url + x, y);
45872                 };
45873             } else {
45874                 var storage = {};
45875                 token = function (x, y) {
45876                     if (arguments.length === 1) return storage[o.url + x];
45877                     else if (arguments.length === 2) return storage[o.url + x] = y;
45878                 };
45879             }
45880
45881             // Get an authentication object. If you just add and remove properties
45882             // from a single object, you'll need to use `delete` to make sure that
45883             // it doesn't contain undesired properties for authentication
45884             function getAuth(o) {
45885                 return {
45886                     oauth_consumer_key: o.oauth_consumer_key,
45887                     oauth_signature_method: 'HMAC-SHA1'
45888                 };
45889             }
45890
45891             // potentially pre-authorize
45892             oauth.options(o);
45893
45894             return oauth;
45895         };
45896
45897         var JXON = new (function () {
45898           var
45899             sValueProp = 'keyValue', sAttributesProp = 'keyAttributes', sAttrPref = '@', /* you can customize these values */
45900             aCache = [], rIsNull = /^\s*$/, rIsBool = /^(?:true|false)$/i;
45901
45902           function parseText (sValue) {
45903             if (rIsNull.test(sValue)) { return null; }
45904             if (rIsBool.test(sValue)) { return sValue.toLowerCase() === 'true'; }
45905             if (isFinite(sValue)) { return parseFloat(sValue); }
45906             if (isFinite(Date.parse(sValue))) { return new Date(sValue); }
45907             return sValue;
45908           }
45909
45910           function EmptyTree () { }
45911           EmptyTree.prototype.toString = function () { return 'null'; };
45912           EmptyTree.prototype.valueOf = function () { return null; };
45913
45914           function objectify (vValue) {
45915             return vValue === null ? new EmptyTree() : vValue instanceof Object ? vValue : new vValue.constructor(vValue);
45916           }
45917
45918           function createObjTree (oParentNode, nVerb, bFreeze, bNesteAttr) {
45919             var
45920               nLevelStart = aCache.length, bChildren = oParentNode.hasChildNodes(),
45921               bAttributes = oParentNode.hasAttributes(), bHighVerb = Boolean(nVerb & 2);
45922
45923             var
45924               sProp, vContent, nLength = 0, sCollectedTxt = '',
45925               vResult = bHighVerb ? {} : /* put here the default value for empty nodes: */ true;
45926
45927             if (bChildren) {
45928               for (var oNode, nItem = 0; nItem < oParentNode.childNodes.length; nItem++) {
45929                 oNode = oParentNode.childNodes.item(nItem);
45930                 if (oNode.nodeType === 4) { sCollectedTxt += oNode.nodeValue; } /* nodeType is 'CDATASection' (4) */
45931                 else if (oNode.nodeType === 3) { sCollectedTxt += oNode.nodeValue.trim(); } /* nodeType is 'Text' (3) */
45932                 else if (oNode.nodeType === 1 && !oNode.prefix) { aCache.push(oNode); } /* nodeType is 'Element' (1) */
45933               }
45934             }
45935
45936             var nLevelEnd = aCache.length, vBuiltVal = parseText(sCollectedTxt);
45937
45938             if (!bHighVerb && (bChildren || bAttributes)) { vResult = nVerb === 0 ? objectify(vBuiltVal) : {}; }
45939
45940             for (var nElId = nLevelStart; nElId < nLevelEnd; nElId++) {
45941               sProp = aCache[nElId].nodeName.toLowerCase();
45942               vContent = createObjTree(aCache[nElId], nVerb, bFreeze, bNesteAttr);
45943               if (vResult.hasOwnProperty(sProp)) {
45944                 if (vResult[sProp].constructor !== Array) { vResult[sProp] = [vResult[sProp]]; }
45945                 vResult[sProp].push(vContent);
45946               } else {
45947                 vResult[sProp] = vContent;
45948                 nLength++;
45949               }
45950             }
45951
45952             if (bAttributes) {
45953               var
45954                 nAttrLen = oParentNode.attributes.length,
45955                 sAPrefix = bNesteAttr ? '' : sAttrPref, oAttrParent = bNesteAttr ? {} : vResult;
45956
45957               for (var oAttrib, nAttrib = 0; nAttrib < nAttrLen; nLength++, nAttrib++) {
45958                 oAttrib = oParentNode.attributes.item(nAttrib);
45959                 oAttrParent[sAPrefix + oAttrib.name.toLowerCase()] = parseText(oAttrib.value.trim());
45960               }
45961
45962               if (bNesteAttr) {
45963                 if (bFreeze) { Object.freeze(oAttrParent); }
45964                 vResult[sAttributesProp] = oAttrParent;
45965                 nLength -= nAttrLen - 1;
45966               }
45967             }
45968
45969             if (nVerb === 3 || (nVerb === 2 || nVerb === 1 && nLength > 0) && sCollectedTxt) {
45970               vResult[sValueProp] = vBuiltVal;
45971             } else if (!bHighVerb && nLength === 0 && sCollectedTxt) {
45972               vResult = vBuiltVal;
45973             }
45974
45975             if (bFreeze && (bHighVerb || nLength > 0)) { Object.freeze(vResult); }
45976
45977             aCache.length = nLevelStart;
45978
45979             return vResult;
45980           }
45981
45982           function loadObjTree (oXMLDoc, oParentEl, oParentObj) {
45983             var vValue, oChild;
45984
45985             if (oParentObj instanceof String || oParentObj instanceof Number || oParentObj instanceof Boolean) {
45986               oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toString())); /* verbosity level is 0 */
45987             } else if (oParentObj.constructor === Date) {
45988               oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toGMTString()));    
45989             }
45990
45991             for (var sName in oParentObj) {
45992               vValue = oParentObj[sName];
45993               if (isFinite(sName) || vValue instanceof Function) { continue; } /* verbosity level is 0 */
45994               if (sName === sValueProp) {
45995                 if (vValue !== null && vValue !== true) { oParentEl.appendChild(oXMLDoc.createTextNode(vValue.constructor === Date ? vValue.toGMTString() : String(vValue))); }
45996               } else if (sName === sAttributesProp) { /* verbosity level is 3 */
45997                 for (var sAttrib in vValue) { oParentEl.setAttribute(sAttrib, vValue[sAttrib]); }
45998               } else if (sName.charAt(0) === sAttrPref) {
45999                 oParentEl.setAttribute(sName.slice(1), vValue);
46000               } else if (vValue.constructor === Array) {
46001                 for (var nItem = 0; nItem < vValue.length; nItem++) {
46002                   oChild = oXMLDoc.createElement(sName);
46003                   loadObjTree(oXMLDoc, oChild, vValue[nItem]);
46004                   oParentEl.appendChild(oChild);
46005                 }
46006               } else {
46007                 oChild = oXMLDoc.createElement(sName);
46008                 if (vValue instanceof Object) {
46009                   loadObjTree(oXMLDoc, oChild, vValue);
46010                 } else if (vValue !== null && vValue !== true) {
46011                   oChild.appendChild(oXMLDoc.createTextNode(vValue.toString()));
46012                 }
46013                 oParentEl.appendChild(oChild);
46014              }
46015            }
46016           }
46017
46018           this.build = function (oXMLParent, nVerbosity /* optional */, bFreeze /* optional */, bNesteAttributes /* optional */) {
46019             var _nVerb = arguments.length > 1 && typeof nVerbosity === 'number' ? nVerbosity & 3 : /* put here the default verbosity level: */ 1;
46020             return createObjTree(oXMLParent, _nVerb, bFreeze || false, arguments.length > 3 ? bNesteAttributes : _nVerb === 3);    
46021           };
46022
46023           this.unbuild = function (oObjTree) {    
46024             var oNewDoc = document.implementation.createDocument('', '', null);
46025             loadObjTree(oNewDoc, oNewDoc, oObjTree);
46026             return oNewDoc;
46027           };
46028
46029           this.stringify = function (oObjTree) {
46030             return (new XMLSerializer()).serializeToString(JXON.unbuild(oObjTree));
46031           };
46032         })();
46033
46034         // var myObject = JXON.build(doc);
46035         // we got our javascript object! try: alert(JSON.stringify(myObject));
46036
46037         // var newDoc = JXON.unbuild(myObject);
46038         // we got our Document instance! try: alert((new XMLSerializer()).serializeToString(newDoc));
46039
46040         var tiler$4 = utilTiler();
46041         var dispatch$5 = dispatch('authLoading', 'authDone', 'change', 'loading', 'loaded', 'loadedNotes');
46042         var urlroot = 'https://www.openstreetmap.org';
46043         var oauth = osmAuth({
46044             url: urlroot,
46045             oauth_consumer_key: '5A043yRSEugj4DJ5TljuapfnrflWDte8jTOcWLlT',
46046             oauth_secret: 'aB3jKq1TRsCOUrfOIZ6oQMEDmv2ptV76PA54NGLL',
46047             loading: authLoading,
46048             done: authDone
46049         });
46050
46051         var _blacklists = ['.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*'];
46052         var _tileCache = { toLoad: {}, loaded: {}, inflight: {}, seen: {}, rtree: rbush_1() };
46053         var _noteCache = { toLoad: {}, loaded: {}, inflight: {}, inflightPost: {}, note: {}, closed: {}, rtree: rbush_1() };
46054         var _userCache = { toLoad: {}, user: {} };
46055         var _changeset = {};
46056
46057         var _deferred = new Set();
46058         var _connectionID = 1;
46059         var _tileZoom = 16;
46060         var _noteZoom = 12;
46061         var _rateLimitError;
46062         var _userChangesets;
46063         var _userDetails;
46064         var _off;
46065
46066
46067         function authLoading() {
46068             dispatch$5.call('authLoading');
46069         }
46070
46071
46072         function authDone() {
46073             dispatch$5.call('authDone');
46074         }
46075
46076
46077         function abortRequest$4(controllerOrXHR) {
46078             if (controllerOrXHR) {
46079                 controllerOrXHR.abort();
46080             }
46081         }
46082
46083
46084         function hasInflightRequests(cache) {
46085             return Object.keys(cache.inflight).length;
46086         }
46087
46088
46089         function abortUnwantedRequests$2(cache, visibleTiles) {
46090             Object.keys(cache.inflight).forEach(function(k) {
46091                 if (cache.toLoad[k]) return;
46092                 if (visibleTiles.find(function(tile) { return k === tile.id; })) return;
46093
46094                 abortRequest$4(cache.inflight[k]);
46095                 delete cache.inflight[k];
46096             });
46097         }
46098
46099
46100         function getLoc(attrs) {
46101             var lon = attrs.lon && attrs.lon.value;
46102             var lat = attrs.lat && attrs.lat.value;
46103             return [parseFloat(lon), parseFloat(lat)];
46104         }
46105
46106
46107         function getNodes(obj) {
46108             var elems = obj.getElementsByTagName('nd');
46109             var nodes = new Array(elems.length);
46110             for (var i = 0, l = elems.length; i < l; i++) {
46111                 nodes[i] = 'n' + elems[i].attributes.ref.value;
46112             }
46113             return nodes;
46114         }
46115
46116
46117         function getTags(obj) {
46118             var elems = obj.getElementsByTagName('tag');
46119             var tags = {};
46120             for (var i = 0, l = elems.length; i < l; i++) {
46121                 var attrs = elems[i].attributes;
46122                 tags[attrs.k.value] = attrs.v.value;
46123             }
46124
46125             return tags;
46126         }
46127
46128
46129         function getMembers(obj) {
46130             var elems = obj.getElementsByTagName('member');
46131             var members = new Array(elems.length);
46132             for (var i = 0, l = elems.length; i < l; i++) {
46133                 var attrs = elems[i].attributes;
46134                 members[i] = {
46135                     id: attrs.type.value[0] + attrs.ref.value,
46136                     type: attrs.type.value,
46137                     role: attrs.role.value
46138                 };
46139             }
46140             return members;
46141         }
46142
46143
46144         function getVisible(attrs) {
46145             return (!attrs.visible || attrs.visible.value !== 'false');
46146         }
46147
46148
46149         function parseComments(comments) {
46150             var parsedComments = [];
46151
46152             // for each comment
46153             for (var i = 0; i < comments.length; i++) {
46154                 var comment = comments[i];
46155                 if (comment.nodeName === 'comment') {
46156                     var childNodes = comment.childNodes;
46157                     var parsedComment = {};
46158
46159                     for (var j = 0; j < childNodes.length; j++) {
46160                         var node = childNodes[j];
46161                         var nodeName = node.nodeName;
46162                         if (nodeName === '#text') continue;
46163                         parsedComment[nodeName] = node.textContent;
46164
46165                         if (nodeName === 'uid') {
46166                             var uid = node.textContent;
46167                             if (uid && !_userCache.user[uid]) {
46168                                 _userCache.toLoad[uid] = true;
46169                             }
46170                         }
46171                     }
46172
46173                     if (parsedComment) {
46174                         parsedComments.push(parsedComment);
46175                     }
46176                 }
46177             }
46178             return parsedComments;
46179         }
46180
46181
46182         function encodeNoteRtree(note) {
46183             return {
46184                 minX: note.loc[0],
46185                 minY: note.loc[1],
46186                 maxX: note.loc[0],
46187                 maxY: note.loc[1],
46188                 data: note
46189             };
46190         }
46191
46192
46193         var parsers = {
46194             node: function nodeData(obj, uid) {
46195                 var attrs = obj.attributes;
46196                 return new osmNode({
46197                     id: uid,
46198                     visible: getVisible(attrs),
46199                     version: attrs.version.value,
46200                     changeset: attrs.changeset && attrs.changeset.value,
46201                     timestamp: attrs.timestamp && attrs.timestamp.value,
46202                     user: attrs.user && attrs.user.value,
46203                     uid: attrs.uid && attrs.uid.value,
46204                     loc: getLoc(attrs),
46205                     tags: getTags(obj)
46206                 });
46207             },
46208
46209             way: function wayData(obj, uid) {
46210                 var attrs = obj.attributes;
46211                 return new osmWay({
46212                     id: uid,
46213                     visible: getVisible(attrs),
46214                     version: attrs.version.value,
46215                     changeset: attrs.changeset && attrs.changeset.value,
46216                     timestamp: attrs.timestamp && attrs.timestamp.value,
46217                     user: attrs.user && attrs.user.value,
46218                     uid: attrs.uid && attrs.uid.value,
46219                     tags: getTags(obj),
46220                     nodes: getNodes(obj),
46221                 });
46222             },
46223
46224             relation: function relationData(obj, uid) {
46225                 var attrs = obj.attributes;
46226                 return new osmRelation({
46227                     id: uid,
46228                     visible: getVisible(attrs),
46229                     version: attrs.version.value,
46230                     changeset: attrs.changeset && attrs.changeset.value,
46231                     timestamp: attrs.timestamp && attrs.timestamp.value,
46232                     user: attrs.user && attrs.user.value,
46233                     uid: attrs.uid && attrs.uid.value,
46234                     tags: getTags(obj),
46235                     members: getMembers(obj)
46236                 });
46237             },
46238
46239             note: function parseNote(obj, uid) {
46240                 var attrs = obj.attributes;
46241                 var childNodes = obj.childNodes;
46242                 var props = {};
46243
46244                 props.id = uid;
46245                 props.loc = getLoc(attrs);
46246
46247                 // if notes are coincident, move them apart slightly
46248                 var coincident = false;
46249                 var epsilon = 0.00001;
46250                 do {
46251                     if (coincident) {
46252                         props.loc = geoVecAdd(props.loc, [epsilon, epsilon]);
46253                     }
46254                     var bbox = geoExtent(props.loc).bbox();
46255                     coincident = _noteCache.rtree.search(bbox).length;
46256                 } while (coincident);
46257
46258                 // parse note contents
46259                 for (var i = 0; i < childNodes.length; i++) {
46260                     var node = childNodes[i];
46261                     var nodeName = node.nodeName;
46262                     if (nodeName === '#text') continue;
46263
46264                     // if the element is comments, parse the comments
46265                     if (nodeName === 'comments') {
46266                         props[nodeName] = parseComments(node.childNodes);
46267                     } else {
46268                         props[nodeName] = node.textContent;
46269                     }
46270                 }
46271
46272                 var note = new osmNote(props);
46273                 var item = encodeNoteRtree(note);
46274                 _noteCache.note[note.id] = note;
46275                 _noteCache.rtree.insert(item);
46276
46277                 return note;
46278             },
46279
46280             user: function parseUser(obj, uid) {
46281                 var attrs = obj.attributes;
46282                 var user = {
46283                     id: uid,
46284                     display_name: attrs.display_name && attrs.display_name.value,
46285                     account_created: attrs.account_created && attrs.account_created.value,
46286                     changesets_count: 0
46287                 };
46288
46289                 var img = obj.getElementsByTagName('img');
46290                 if (img && img[0] && img[0].getAttribute('href')) {
46291                     user.image_url = img[0].getAttribute('href');
46292                 }
46293
46294                 var changesets = obj.getElementsByTagName('changesets');
46295                 if (changesets && changesets[0] && changesets[0].getAttribute('count')) {
46296                     user.changesets_count = changesets[0].getAttribute('count');
46297                 }
46298
46299                 _userCache.user[uid] = user;
46300                 delete _userCache.toLoad[uid];
46301                 return user;
46302             }
46303         };
46304
46305
46306         function parseXML(xml, callback, options) {
46307             options = Object.assign({ skipSeen: true }, options);
46308             if (!xml || !xml.childNodes) {
46309                 return callback({ message: 'No XML', status: -1 });
46310             }
46311
46312             var root = xml.childNodes[0];
46313             var children = root.childNodes;
46314
46315             var handle = window.requestIdleCallback(function() {
46316                 var results = [];
46317                 var result;
46318                 for (var i = 0; i < children.length; i++) {
46319                     result = parseChild(children[i]);
46320                     if (result) results.push(result);
46321                 }
46322                 callback(null, results);
46323             });
46324
46325             _deferred.add(handle);
46326
46327
46328             function parseChild(child) {
46329                 var parser = parsers[child.nodeName];
46330                 if (!parser) return null;
46331
46332                 var uid;
46333                 if (child.nodeName === 'user') {
46334                     uid = child.attributes.id.value;
46335                     if (options.skipSeen && _userCache.user[uid]) {
46336                         delete _userCache.toLoad[uid];
46337                         return null;
46338                     }
46339
46340                 } else if (child.nodeName === 'note') {
46341                     uid = child.getElementsByTagName('id')[0].textContent;
46342
46343                 } else {
46344                     uid = osmEntity.id.fromOSM(child.nodeName, child.attributes.id.value);
46345                     if (options.skipSeen) {
46346                         if (_tileCache.seen[uid]) return null;  // avoid reparsing a "seen" entity
46347                         _tileCache.seen[uid] = true;
46348                     }
46349                 }
46350
46351                 return parser(child, uid);
46352             }
46353         }
46354
46355
46356         // replace or remove note from rtree
46357         function updateRtree$2(item, replace) {
46358             _noteCache.rtree.remove(item, function isEql(a, b) { return a.data.id === b.data.id; });
46359
46360             if (replace) {
46361                 _noteCache.rtree.insert(item);
46362             }
46363         }
46364
46365
46366         function wrapcb(thisArg, callback, cid) {
46367             return function(err, result) {
46368                 if (err) {
46369                     // 400 Bad Request, 401 Unauthorized, 403 Forbidden..
46370                     if (err.status === 400 || err.status === 401 || err.status === 403) {
46371                         thisArg.logout();
46372                     }
46373                     return callback.call(thisArg, err);
46374
46375                 } else if (thisArg.getConnectionId() !== cid) {
46376                     return callback.call(thisArg, { message: 'Connection Switched', status: -1 });
46377
46378                 } else {
46379                     return callback.call(thisArg, err, result);
46380                 }
46381             };
46382         }
46383
46384
46385         var serviceOsm = {
46386
46387             init: function() {
46388                 utilRebind(this, dispatch$5, 'on');
46389             },
46390
46391
46392             reset: function() {
46393                 Array.from(_deferred).forEach(function(handle) {
46394                     window.cancelIdleCallback(handle);
46395                     _deferred.delete(handle);
46396                 });
46397
46398                 _connectionID++;
46399                 _userChangesets = undefined;
46400                 _userDetails = undefined;
46401                 _rateLimitError = undefined;
46402
46403                 Object.values(_tileCache.inflight).forEach(abortRequest$4);
46404                 Object.values(_noteCache.inflight).forEach(abortRequest$4);
46405                 Object.values(_noteCache.inflightPost).forEach(abortRequest$4);
46406                 if (_changeset.inflight) abortRequest$4(_changeset.inflight);
46407
46408                 _tileCache = { toLoad: {}, loaded: {}, inflight: {}, seen: {}, rtree: rbush_1() };
46409                 _noteCache = { toLoad: {}, loaded: {}, inflight: {}, inflightPost: {}, note: {}, closed: {}, rtree: rbush_1() };
46410                 _userCache = { toLoad: {}, user: {} };
46411                 _changeset = {};
46412
46413                 return this;
46414             },
46415
46416
46417             getConnectionId: function() {
46418                 return _connectionID;
46419             },
46420
46421
46422             changesetURL: function(changesetID) {
46423                 return urlroot + '/changeset/' + changesetID;
46424             },
46425
46426
46427             changesetsURL: function(center, zoom) {
46428                 var precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2));
46429                 return urlroot + '/history#map=' +
46430                     Math.floor(zoom) + '/' +
46431                     center[1].toFixed(precision) + '/' +
46432                     center[0].toFixed(precision);
46433             },
46434
46435
46436             entityURL: function(entity) {
46437                 return urlroot + '/' + entity.type + '/' + entity.osmId();
46438             },
46439
46440
46441             historyURL: function(entity) {
46442                 return urlroot + '/' + entity.type + '/' + entity.osmId() + '/history';
46443             },
46444
46445
46446             userURL: function(username) {
46447                 return urlroot + '/user/' + username;
46448             },
46449
46450
46451             noteURL: function(note) {
46452                 return urlroot + '/note/' + note.id;
46453             },
46454
46455
46456             noteReportURL: function(note) {
46457                 return urlroot + '/reports/new?reportable_type=Note&reportable_id=' + note.id;
46458             },
46459
46460
46461             // Generic method to load data from the OSM API
46462             // Can handle either auth or unauth calls.
46463             loadFromAPI: function(path, callback, options) {
46464                 options = Object.assign({ skipSeen: true }, options);
46465                 var that = this;
46466                 var cid = _connectionID;
46467
46468                 function done(err, xml) {
46469                     if (that.getConnectionId() !== cid) {
46470                         if (callback) callback({ message: 'Connection Switched', status: -1 });
46471                         return;
46472                     }
46473
46474                     var isAuthenticated = that.authenticated();
46475
46476                     // 400 Bad Request, 401 Unauthorized, 403 Forbidden
46477                     // Logout and retry the request..
46478                     if (isAuthenticated && err && err.status &&
46479                             (err.status === 400 || err.status === 401 || err.status === 403)) {
46480                         that.logout();
46481                         that.loadFromAPI(path, callback, options);
46482
46483                     // else, no retry..
46484                     } else {
46485                         // 509 Bandwidth Limit Exceeded, 429 Too Many Requests
46486                         // Set the rateLimitError flag and trigger a warning..
46487                         if (!isAuthenticated && !_rateLimitError && err && err.status &&
46488                                 (err.status === 509 || err.status === 429)) {
46489                             _rateLimitError = err;
46490                             dispatch$5.call('change');
46491                         }
46492
46493                         if (callback) {
46494                             if (err) {
46495                                 return callback(err);
46496                             } else {
46497                                 return parseXML(xml, callback, options);
46498                             }
46499                         }
46500                     }
46501                 }
46502
46503                 if (this.authenticated()) {
46504                     return oauth.xhr({ method: 'GET', path: path }, done);
46505                 } else {
46506                     var url = urlroot + path;
46507                     var controller = new AbortController();
46508                     d3_xml(url, { signal: controller.signal })
46509                         .then(function(data) {
46510                             done(null, data);
46511                         })
46512                         .catch(function(err) {
46513                             if (err.name === 'AbortError') return;
46514                             // d3-fetch includes status in the error message,
46515                             // but we can't access the response itself
46516                             // https://github.com/d3/d3-fetch/issues/27
46517                             var match = err.message.match(/^\d{3}/);
46518                             if (match) {
46519                                 done({ status: +match[0], statusText: err.message });
46520                             } else {
46521                                 done(err.message);
46522                             }
46523                         });
46524                     return controller;
46525                 }
46526             },
46527
46528
46529             // Load a single entity by id (ways and relations use the `/full` call)
46530             // GET /api/0.6/node/#id
46531             // GET /api/0.6/[way|relation]/#id/full
46532             loadEntity: function(id, callback) {
46533                 var type = osmEntity.id.type(id);
46534                 var osmID = osmEntity.id.toOSM(id);
46535                 var options = { skipSeen: false };
46536
46537                 this.loadFromAPI(
46538                     '/api/0.6/' + type + '/' + osmID + (type !== 'node' ? '/full' : ''),
46539                     function(err, entities) {
46540                         if (callback) callback(err, { data: entities });
46541                     },
46542                     options
46543                 );
46544             },
46545
46546
46547             // Load a single entity with a specific version
46548             // GET /api/0.6/[node|way|relation]/#id/#version
46549             loadEntityVersion: function(id, version, callback) {
46550                 var type = osmEntity.id.type(id);
46551                 var osmID = osmEntity.id.toOSM(id);
46552                 var options = { skipSeen: false };
46553
46554                 this.loadFromAPI(
46555                     '/api/0.6/' + type + '/' + osmID + '/' + version,
46556                     function(err, entities) {
46557                         if (callback) callback(err, { data: entities });
46558                     },
46559                     options
46560                 );
46561             },
46562
46563
46564             // Load multiple entities in chunks
46565             // (note: callback may be called multiple times)
46566             // GET /api/0.6/[nodes|ways|relations]?#parameters
46567             loadMultiple: function(ids, callback) {
46568                 var that = this;
46569                 var groups = utilArrayGroupBy(utilArrayUniq(ids), osmEntity.id.type);
46570
46571                 Object.keys(groups).forEach(function(k) {
46572                     var type = k + 's';   // nodes, ways, relations
46573                     var osmIDs = groups[k].map(function(id) { return osmEntity.id.toOSM(id); });
46574                     var options = { skipSeen: false };
46575
46576                     utilArrayChunk(osmIDs, 150).forEach(function(arr) {
46577                         that.loadFromAPI(
46578                             '/api/0.6/' + type + '?' + type + '=' + arr.join(),
46579                             function(err, entities) {
46580                                 if (callback) callback(err, { data: entities });
46581                             },
46582                             options
46583                         );
46584                     });
46585                 });
46586             },
46587
46588
46589             // Create, upload, and close a changeset
46590             // PUT /api/0.6/changeset/create
46591             // POST /api/0.6/changeset/#id/upload
46592             // PUT /api/0.6/changeset/#id/close
46593             putChangeset: function(changeset, changes, callback) {
46594                 var cid = _connectionID;
46595
46596                 if (_changeset.inflight) {
46597                     return callback({ message: 'Changeset already inflight', status: -2 }, changeset);
46598
46599                 } else if (_changeset.open) {   // reuse existing open changeset..
46600                     return createdChangeset.call(this, null, _changeset.open);
46601
46602                 } else {   // Open a new changeset..
46603                     var options = {
46604                         method: 'PUT',
46605                         path: '/api/0.6/changeset/create',
46606                         options: { header: { 'Content-Type': 'text/xml' } },
46607                         content: JXON.stringify(changeset.asJXON())
46608                     };
46609                     _changeset.inflight = oauth.xhr(
46610                         options,
46611                         wrapcb(this, createdChangeset, cid)
46612                     );
46613                 }
46614
46615
46616                 function createdChangeset(err, changesetID) {
46617                     _changeset.inflight = null;
46618                     if (err) { return callback(err, changeset); }
46619
46620                     _changeset.open = changesetID;
46621                     changeset = changeset.update({ id: changesetID });
46622
46623                     // Upload the changeset..
46624                     var options = {
46625                         method: 'POST',
46626                         path: '/api/0.6/changeset/' + changesetID + '/upload',
46627                         options: { header: { 'Content-Type': 'text/xml' } },
46628                         content: JXON.stringify(changeset.osmChangeJXON(changes))
46629                     };
46630                     _changeset.inflight = oauth.xhr(
46631                         options,
46632                         wrapcb(this, uploadedChangeset, cid)
46633                     );
46634                 }
46635
46636
46637                 function uploadedChangeset(err) {
46638                     _changeset.inflight = null;
46639                     if (err) return callback(err, changeset);
46640
46641                     // Upload was successful, safe to call the callback.
46642                     // Add delay to allow for postgres replication #1646 #2678
46643                     window.setTimeout(function() { callback(null, changeset); }, 2500);
46644                     _changeset.open = null;
46645
46646                     // At this point, we don't really care if the connection was switched..
46647                     // Only try to close the changeset if we're still talking to the same server.
46648                     if (this.getConnectionId() === cid) {
46649                         // Still attempt to close changeset, but ignore response because #2667
46650                         oauth.xhr({
46651                             method: 'PUT',
46652                             path: '/api/0.6/changeset/' + changeset.id + '/close',
46653                             options: { header: { 'Content-Type': 'text/xml' } }
46654                         }, function() { return true; });
46655                     }
46656                 }
46657             },
46658
46659
46660             // Load multiple users in chunks
46661             // (note: callback may be called multiple times)
46662             // GET /api/0.6/users?users=#id1,#id2,...,#idn
46663             loadUsers: function(uids, callback) {
46664                 var toLoad = [];
46665                 var cached = [];
46666
46667                 utilArrayUniq(uids).forEach(function(uid) {
46668                     if (_userCache.user[uid]) {
46669                         delete _userCache.toLoad[uid];
46670                         cached.push(_userCache.user[uid]);
46671                     } else {
46672                         toLoad.push(uid);
46673                     }
46674                 });
46675
46676                 if (cached.length || !this.authenticated()) {
46677                     callback(undefined, cached);
46678                     if (!this.authenticated()) return;  // require auth
46679                 }
46680
46681                 utilArrayChunk(toLoad, 150).forEach(function(arr) {
46682                     oauth.xhr(
46683                         { method: 'GET', path: '/api/0.6/users?users=' + arr.join() },
46684                         wrapcb(this, done, _connectionID)
46685                     );
46686                 }.bind(this));
46687
46688                 function done(err, xml) {
46689                     if (err) { return callback(err); }
46690
46691                     var options = { skipSeen: true };
46692                     return parseXML(xml, function(err, results) {
46693                         if (err) {
46694                             return callback(err);
46695                         } else {
46696                             return callback(undefined, results);
46697                         }
46698                     }, options);
46699                 }
46700             },
46701
46702
46703             // Load a given user by id
46704             // GET /api/0.6/user/#id
46705             loadUser: function(uid, callback) {
46706                 if (_userCache.user[uid] || !this.authenticated()) {   // require auth
46707                     delete _userCache.toLoad[uid];
46708                     return callback(undefined, _userCache.user[uid]);
46709                 }
46710
46711                 oauth.xhr(
46712                     { method: 'GET', path: '/api/0.6/user/' + uid },
46713                     wrapcb(this, done, _connectionID)
46714                 );
46715
46716                 function done(err, xml) {
46717                     if (err) { return callback(err); }
46718
46719                     var options = { skipSeen: true };
46720                     return parseXML(xml, function(err, results) {
46721                         if (err) {
46722                             return callback(err);
46723                         } else {
46724                             return callback(undefined, results[0]);
46725                         }
46726                     }, options);
46727                 }
46728             },
46729
46730
46731             // Load the details of the logged-in user
46732             // GET /api/0.6/user/details
46733             userDetails: function(callback) {
46734                 if (_userDetails) {    // retrieve cached
46735                     return callback(undefined, _userDetails);
46736                 }
46737
46738                 oauth.xhr(
46739                     { method: 'GET', path: '/api/0.6/user/details' },
46740                     wrapcb(this, done, _connectionID)
46741                 );
46742
46743                 function done(err, xml) {
46744                     if (err) { return callback(err); }
46745
46746                     var options = { skipSeen: false };
46747                     return parseXML(xml, function(err, results) {
46748                         if (err) {
46749                             return callback(err);
46750                         } else {
46751                             _userDetails = results[0];
46752                             return callback(undefined, _userDetails);
46753                         }
46754                     }, options);
46755                 }
46756             },
46757
46758
46759             // Load previous changesets for the logged in user
46760             // GET /api/0.6/changesets?user=#id
46761             userChangesets: function(callback) {
46762                 if (_userChangesets) {    // retrieve cached
46763                     return callback(undefined, _userChangesets);
46764                 }
46765
46766                 this.userDetails(
46767                     wrapcb(this, gotDetails, _connectionID)
46768                 );
46769
46770
46771                 function gotDetails(err, user) {
46772                     if (err) { return callback(err); }
46773
46774                     oauth.xhr(
46775                         { method: 'GET', path: '/api/0.6/changesets?user=' + user.id },
46776                         wrapcb(this, done, _connectionID)
46777                     );
46778                 }
46779
46780                 function done(err, xml) {
46781                     if (err) { return callback(err); }
46782
46783                     _userChangesets = Array.prototype.map.call(
46784                         xml.getElementsByTagName('changeset'),
46785                         function (changeset) { return { tags: getTags(changeset) }; }
46786                     ).filter(function (changeset) {
46787                         var comment = changeset.tags.comment;
46788                         return comment && comment !== '';
46789                     });
46790
46791                     return callback(undefined, _userChangesets);
46792                 }
46793             },
46794
46795
46796             // Fetch the status of the OSM API
46797             // GET /api/capabilities
46798             status: function(callback) {
46799                 var url = urlroot + '/api/capabilities';
46800                 var errback = wrapcb(this, done, _connectionID);
46801                 d3_xml(url)
46802                     .then(function(data) { errback(null, data); })
46803                     .catch(function(err) { errback(err.message); });
46804
46805                 function done(err, xml) {
46806                     if (err) { return callback(err); }
46807
46808                     // update blacklists
46809                     var elements = xml.getElementsByTagName('blacklist');
46810                     var regexes = [];
46811                     for (var i = 0; i < elements.length; i++) {
46812                         var regex = elements[i].getAttribute('regex');  // needs unencode?
46813                         if (regex) {
46814                             regexes.push(regex);
46815                         }
46816                     }
46817                     if (regexes.length) {
46818                         _blacklists = regexes;
46819                     }
46820
46821                     if (_rateLimitError) {
46822                         return callback(_rateLimitError, 'rateLimited');
46823                     } else {
46824                         var apiStatus = xml.getElementsByTagName('status');
46825                         var val = apiStatus[0].getAttribute('api');
46826                         return callback(undefined, val);
46827                     }
46828                 }
46829             },
46830
46831
46832             // Load data (entities) from the API in tiles
46833             // GET /api/0.6/map?bbox=
46834             loadTiles: function(projection, callback) {
46835                 if (_off) return;
46836
46837                 // determine the needed tiles to cover the view
46838                 var tiles = tiler$4.zoomExtent([_tileZoom, _tileZoom]).getTiles(projection);
46839
46840                 // abort inflight requests that are no longer needed
46841                 var hadRequests = hasInflightRequests(_tileCache);
46842                 abortUnwantedRequests$2(_tileCache, tiles);
46843                 if (hadRequests && !hasInflightRequests(_tileCache)) {
46844                     dispatch$5.call('loaded');    // stop the spinner
46845                 }
46846
46847                 // issue new requests..
46848                 tiles.forEach(function(tile) {
46849                     this.loadTile(tile, callback);
46850                 }, this);
46851             },
46852
46853
46854             // Load a single data tile
46855             // GET /api/0.6/map?bbox=
46856             loadTile: function(tile, callback) {
46857                 if (_off) return;
46858                 if (_tileCache.loaded[tile.id] || _tileCache.inflight[tile.id]) return;
46859
46860                 if (!hasInflightRequests(_tileCache)) {
46861                     dispatch$5.call('loading');   // start the spinner
46862                 }
46863
46864                 var path = '/api/0.6/map?bbox=';
46865                 var options = { skipSeen: true };
46866
46867                 _tileCache.inflight[tile.id] = this.loadFromAPI(
46868                     path + tile.extent.toParam(),
46869                     function(err, parsed) {
46870                         delete _tileCache.inflight[tile.id];
46871                         if (!err) {
46872                             delete _tileCache.toLoad[tile.id];
46873                             _tileCache.loaded[tile.id] = true;
46874                             var bbox = tile.extent.bbox();
46875                             bbox.id = tile.id;
46876                             _tileCache.rtree.insert(bbox);
46877                         }
46878                         if (callback) {
46879                             callback(err, Object.assign({ data: parsed }, tile));
46880                         }
46881                         if (!hasInflightRequests(_tileCache)) {
46882                             dispatch$5.call('loaded');     // stop the spinner
46883                         }
46884                     },
46885                     options
46886                 );
46887             },
46888
46889
46890             isDataLoaded: function(loc) {
46891                 var bbox = { minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1] };
46892                 return _tileCache.rtree.collides(bbox);
46893             },
46894
46895
46896             // load the tile that covers the given `loc`
46897             loadTileAtLoc: function(loc, callback) {
46898                 // Back off if the toLoad queue is filling up.. re #6417
46899                 // (Currently `loadTileAtLoc` requests are considered low priority - used by operations to
46900                 // let users safely edit geometries which extend to unloaded tiles.  We can drop some.)
46901                 if (Object.keys(_tileCache.toLoad).length > 50) return;
46902
46903                 var k = geoZoomToScale(_tileZoom + 1);
46904                 var offset = geoRawMercator().scale(k)(loc);
46905                 var projection = geoRawMercator().transform({ k: k, x: -offset[0], y: -offset[1] });
46906                 var tiles = tiler$4.zoomExtent([_tileZoom, _tileZoom]).getTiles(projection);
46907
46908                 tiles.forEach(function(tile) {
46909                     if (_tileCache.toLoad[tile.id] || _tileCache.loaded[tile.id] || _tileCache.inflight[tile.id]) return;
46910
46911                     _tileCache.toLoad[tile.id] = true;
46912                     this.loadTile(tile, callback);
46913                 }, this);
46914             },
46915
46916
46917             // Load notes from the API in tiles
46918             // GET /api/0.6/notes?bbox=
46919             loadNotes: function(projection, noteOptions) {
46920                 noteOptions = Object.assign({ limit: 10000, closed: 7 }, noteOptions);
46921                 if (_off) return;
46922
46923                 var that = this;
46924                 var path = '/api/0.6/notes?limit=' + noteOptions.limit + '&closed=' + noteOptions.closed + '&bbox=';
46925                 var throttleLoadUsers = throttle(function() {
46926                     var uids = Object.keys(_userCache.toLoad);
46927                     if (!uids.length) return;
46928                     that.loadUsers(uids, function() {});  // eagerly load user details
46929                 }, 750);
46930
46931                 // determine the needed tiles to cover the view
46932                 var tiles = tiler$4.zoomExtent([_noteZoom, _noteZoom]).getTiles(projection);
46933
46934                 // abort inflight requests that are no longer needed
46935                 abortUnwantedRequests$2(_noteCache, tiles);
46936
46937                 // issue new requests..
46938                 tiles.forEach(function(tile) {
46939                     if (_noteCache.loaded[tile.id] || _noteCache.inflight[tile.id]) return;
46940
46941                     var options = { skipSeen: false };
46942                     _noteCache.inflight[tile.id] = that.loadFromAPI(
46943                         path + tile.extent.toParam(),
46944                         function(err) {
46945                             delete _noteCache.inflight[tile.id];
46946                             if (!err) {
46947                                 _noteCache.loaded[tile.id] = true;
46948                             }
46949                             throttleLoadUsers();
46950                             dispatch$5.call('loadedNotes');
46951                         },
46952                         options
46953                     );
46954                 });
46955             },
46956
46957
46958             // Create a note
46959             // POST /api/0.6/notes?params
46960             postNoteCreate: function(note, callback) {
46961                 if (!this.authenticated()) {
46962                     return callback({ message: 'Not Authenticated', status: -3 }, note);
46963                 }
46964                 if (_noteCache.inflightPost[note.id]) {
46965                     return callback({ message: 'Note update already inflight', status: -2 }, note);
46966                 }
46967
46968                 if (!note.loc[0] || !note.loc[1] || !note.newComment) return; // location & description required
46969
46970                 var comment = note.newComment;
46971                 if (note.newCategory && note.newCategory !== 'None') { comment += ' #' + note.newCategory; }
46972
46973                 var path = '/api/0.6/notes?' + utilQsString({ lon: note.loc[0], lat: note.loc[1], text: comment });
46974
46975                 _noteCache.inflightPost[note.id] = oauth.xhr(
46976                     { method: 'POST', path: path },
46977                     wrapcb(this, done, _connectionID)
46978                 );
46979
46980
46981                 function done(err, xml) {
46982                     delete _noteCache.inflightPost[note.id];
46983                     if (err) { return callback(err); }
46984
46985                     // we get the updated note back, remove from caches and reparse..
46986                     this.removeNote(note);
46987
46988                     var options = { skipSeen: false };
46989                     return parseXML(xml, function(err, results) {
46990                         if (err) {
46991                             return callback(err);
46992                         } else {
46993                             return callback(undefined, results[0]);
46994                         }
46995                     }, options);
46996                 }
46997             },
46998
46999
47000             // Update a note
47001             // POST /api/0.6/notes/#id/comment?text=comment
47002             // POST /api/0.6/notes/#id/close?text=comment
47003             // POST /api/0.6/notes/#id/reopen?text=comment
47004             postNoteUpdate: function(note, newStatus, callback) {
47005                 if (!this.authenticated()) {
47006                     return callback({ message: 'Not Authenticated', status: -3 }, note);
47007                 }
47008                 if (_noteCache.inflightPost[note.id]) {
47009                     return callback({ message: 'Note update already inflight', status: -2 }, note);
47010                 }
47011
47012                 var action;
47013                 if (note.status !== 'closed' && newStatus === 'closed') {
47014                     action = 'close';
47015                 } else if (note.status !== 'open' && newStatus === 'open') {
47016                     action = 'reopen';
47017                 } else {
47018                     action = 'comment';
47019                     if (!note.newComment) return; // when commenting, comment required
47020                 }
47021
47022                 var path = '/api/0.6/notes/' + note.id + '/' + action;
47023                 if (note.newComment) {
47024                     path += '?' + utilQsString({ text: note.newComment });
47025                 }
47026
47027                 _noteCache.inflightPost[note.id] = oauth.xhr(
47028                     { method: 'POST', path: path },
47029                     wrapcb(this, done, _connectionID)
47030                 );
47031
47032
47033                 function done(err, xml) {
47034                     delete _noteCache.inflightPost[note.id];
47035                     if (err) { return callback(err); }
47036
47037                     // we get the updated note back, remove from caches and reparse..
47038                     this.removeNote(note);
47039
47040                     // update closed note cache - used to populate `closed:note` changeset tag
47041                     if (action === 'close') {
47042                         _noteCache.closed[note.id] = true;
47043                     } else if (action === 'reopen') {
47044                         delete _noteCache.closed[note.id];
47045                     }
47046
47047                     var options = { skipSeen: false };
47048                     return parseXML(xml, function(err, results) {
47049                         if (err) {
47050                             return callback(err);
47051                         } else {
47052                             return callback(undefined, results[0]);
47053                         }
47054                     }, options);
47055                 }
47056             },
47057
47058
47059             switch: function(options) {
47060                 urlroot = options.urlroot;
47061
47062                 oauth.options(Object.assign({
47063                     url: urlroot,
47064                     loading: authLoading,
47065                     done: authDone
47066                 }, options));
47067
47068                 this.reset();
47069                 this.userChangesets(function() {});  // eagerly load user details/changesets
47070                 dispatch$5.call('change');
47071                 return this;
47072             },
47073
47074
47075             toggle: function(val) {
47076                 _off = !val;
47077                 return this;
47078             },
47079
47080
47081             isChangesetInflight: function() {
47082                 return !!_changeset.inflight;
47083             },
47084
47085
47086             // get/set cached data
47087             // This is used to save/restore the state when entering/exiting the walkthrough
47088             // Also used for testing purposes.
47089             caches: function(obj) {
47090                 function cloneCache(source) {
47091                     var target = {};
47092                     Object.keys(source).forEach(function(k) {
47093                         if (k === 'rtree') {
47094                             target.rtree = rbush_1().fromJSON(source.rtree.toJSON());  // clone rbush
47095                         } else if (k === 'note') {
47096                             target.note = {};
47097                             Object.keys(source.note).forEach(function(id) {
47098                                 target.note[id] = osmNote(source.note[id]);   // copy notes
47099                             });
47100                         } else {
47101                             target[k] = JSON.parse(JSON.stringify(source[k]));   // clone deep
47102                         }
47103                     });
47104                     return target;
47105                 }
47106
47107                 if (!arguments.length) {
47108                     return {
47109                         tile: cloneCache(_tileCache),
47110                         note: cloneCache(_noteCache),
47111                         user: cloneCache(_userCache)
47112                     };
47113                 }
47114
47115                 // access caches directly for testing (e.g., loading notes rtree)
47116                 if (obj === 'get') {
47117                     return {
47118                         tile: _tileCache,
47119                         note: _noteCache,
47120                         user: _userCache
47121                     };
47122                 }
47123
47124                 if (obj.tile) {
47125                     _tileCache = obj.tile;
47126                     _tileCache.inflight = {};
47127                 }
47128                 if (obj.note) {
47129                     _noteCache = obj.note;
47130                     _noteCache.inflight = {};
47131                     _noteCache.inflightPost = {};
47132                 }
47133                 if (obj.user) {
47134                     _userCache = obj.user;
47135                 }
47136
47137                 return this;
47138             },
47139
47140
47141             logout: function() {
47142                 _userChangesets = undefined;
47143                 _userDetails = undefined;
47144                 oauth.logout();
47145                 dispatch$5.call('change');
47146                 return this;
47147             },
47148
47149
47150             authenticated: function() {
47151                 return oauth.authenticated();
47152             },
47153
47154
47155             authenticate: function(callback) {
47156                 var that = this;
47157                 var cid = _connectionID;
47158                 _userChangesets = undefined;
47159                 _userDetails = undefined;
47160
47161                 function done(err, res) {
47162                     if (err) {
47163                         if (callback) callback(err);
47164                         return;
47165                     }
47166                     if (that.getConnectionId() !== cid) {
47167                         if (callback) callback({ message: 'Connection Switched', status: -1 });
47168                         return;
47169                     }
47170                     _rateLimitError = undefined;
47171                     dispatch$5.call('change');
47172                     if (callback) callback(err, res);
47173                     that.userChangesets(function() {});  // eagerly load user details/changesets
47174                 }
47175
47176                 return oauth.authenticate(done);
47177             },
47178
47179
47180             imageryBlacklists: function() {
47181                 return _blacklists;
47182             },
47183
47184
47185             tileZoom: function(val) {
47186                 if (!arguments.length) return _tileZoom;
47187                 _tileZoom = val;
47188                 return this;
47189             },
47190
47191
47192             // get all cached notes covering the viewport
47193             notes: function(projection) {
47194                 var viewport = projection.clipExtent();
47195                 var min = [viewport[0][0], viewport[1][1]];
47196                 var max = [viewport[1][0], viewport[0][1]];
47197                 var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
47198
47199                 return _noteCache.rtree.search(bbox)
47200                     .map(function(d) { return d.data; });
47201             },
47202
47203
47204             // get a single note from the cache
47205             getNote: function(id) {
47206                 return _noteCache.note[id];
47207             },
47208
47209
47210             // remove a single note from the cache
47211             removeNote: function(note) {
47212                 if (!(note instanceof osmNote) || !note.id) return;
47213
47214                 delete _noteCache.note[note.id];
47215                 updateRtree$2(encodeNoteRtree(note), false);  // false = remove
47216             },
47217
47218
47219             // replace a single note in the cache
47220             replaceNote: function(note) {
47221                 if (!(note instanceof osmNote) || !note.id) return;
47222
47223                 _noteCache.note[note.id] = note;
47224                 updateRtree$2(encodeNoteRtree(note), true);  // true = replace
47225                 return note;
47226             },
47227
47228
47229             // Get an array of note IDs closed during this session.
47230             // Used to populate `closed:note` changeset tag
47231             getClosedIDs: function() {
47232                 return Object.keys(_noteCache.closed).sort();
47233             }
47234
47235         };
47236
47237         var apibase$3 = 'https://wiki.openstreetmap.org/w/api.php';
47238         var _inflight$1 = {};
47239         var _wikibaseCache = {};
47240         var _localeIDs = { en: false };
47241
47242
47243         var debouncedRequest = debounce(request, 500, { leading: false });
47244
47245         function request(url, callback) {
47246             if (_inflight$1[url]) return;
47247             var controller = new AbortController();
47248             _inflight$1[url] = controller;
47249
47250             d3_json(url, { signal: controller.signal })
47251                 .then(function(result) {
47252                     delete _inflight$1[url];
47253                     if (callback) callback(null, result);
47254                 })
47255                 .catch(function(err) {
47256                     delete _inflight$1[url];
47257                     if (err.name === 'AbortError') return;
47258                     if (callback) callback(err.message);
47259                 });
47260         }
47261
47262
47263         /**
47264          * Get the best string value from the descriptions/labels result
47265          * Note that if mediawiki doesn't recognize language code, it will return all values.
47266          * In that case, fallback to use English.
47267          * @param values object - either descriptions or labels
47268          * @param langCode String
47269          * @returns localized string
47270          */
47271         function localizedToString(values, langCode) {
47272             if (values) {
47273                 values = values[langCode] || values.en;
47274             }
47275             return values ? values.value : '';
47276         }
47277
47278
47279         var serviceOsmWikibase = {
47280
47281             init: function() {
47282                 _inflight$1 = {};
47283                 _wikibaseCache = {};
47284                 _localeIDs = {};
47285             },
47286
47287
47288             reset: function() {
47289                 Object.values(_inflight$1).forEach(function(controller) { controller.abort(); });
47290                 _inflight$1 = {};
47291             },
47292
47293
47294             /**
47295              * Get the best value for the property, or undefined if not found
47296              * @param entity object from wikibase
47297              * @param property string e.g. 'P4' for image
47298              * @param langCode string e.g. 'fr' for French
47299              */
47300             claimToValue: function(entity, property, langCode) {
47301                 if (!entity.claims[property]) return undefined;
47302                 var locale = _localeIDs[langCode];
47303                 var preferredPick, localePick;
47304
47305                 entity.claims[property].forEach(function(stmt) {
47306                     // If exists, use value limited to the needed language (has a qualifier P26 = locale)
47307                     // Or if not found, use the first value with the "preferred" rank
47308                     if (!preferredPick && stmt.rank === 'preferred') {
47309                         preferredPick = stmt;
47310                     }
47311                     if (locale && stmt.qualifiers && stmt.qualifiers.P26 &&
47312                         stmt.qualifiers.P26[0].datavalue.value.id === locale
47313                     ) {
47314                         localePick = stmt;
47315                     }
47316                 });
47317
47318                 var result = localePick || preferredPick;
47319                 if (result) {
47320                     var datavalue = result.mainsnak.datavalue;
47321                     return datavalue.type === 'wikibase-entityid' ? datavalue.value.id : datavalue.value;
47322                 } else {
47323                     return undefined;
47324                 }
47325             },
47326
47327
47328             /**
47329              * Convert monolingual property into a key-value object (language -> value)
47330              * @param entity object from wikibase
47331              * @param property string e.g. 'P31' for monolingual wiki page title
47332              */
47333             monolingualClaimToValueObj: function(entity, property) {
47334                 if (!entity || !entity.claims[property]) return undefined;
47335
47336                 return entity.claims[property].reduce(function(acc, obj) {
47337                     var value = obj.mainsnak.datavalue.value;
47338                     acc[value.language] = value.text;
47339                     return acc;
47340                 }, {});
47341             },
47342
47343
47344             toSitelink: function(key, value) {
47345                 var result = value ? ('Tag:' + key + '=' + value) : 'Key:' + key;
47346                 return result.replace(/_/g, ' ').trim();
47347             },
47348
47349
47350             //
47351             // Pass params object of the form:
47352             // {
47353             //   key: 'string',
47354             //   value: 'string',
47355             //   rtype: 'string',
47356             //   langCode: 'string'
47357             // }
47358             //
47359             getEntity: function(params, callback) {
47360                 var doRequest = params.debounce ? debouncedRequest : request;
47361                 var that = this;
47362                 var titles = [];
47363                 var result = {};
47364                 var rtypeSitelink = params.rtype ? ('Relation:' + params.rtype).replace(/_/g, ' ').trim() : false;
47365                 var keySitelink = params.key ? this.toSitelink(params.key) : false;
47366                 var tagSitelink = (params.key && params.value) ? this.toSitelink(params.key, params.value) : false;
47367                 var localeSitelink;
47368
47369                 if (params.langCode && _localeIDs[params.langCode] === undefined) {
47370                     // If this is the first time we are asking about this locale,
47371                     // fetch corresponding entity (if it exists), and cache it.
47372                     // If there is no such entry, cache `false` value to avoid re-requesting it.
47373                     localeSitelink = ('Locale:' + params.langCode).replace(/_/g, ' ').trim();
47374                     titles.push(localeSitelink);
47375                 }
47376
47377                 if (rtypeSitelink) {
47378                     if (_wikibaseCache[rtypeSitelink]) {
47379                         result.rtype = _wikibaseCache[rtypeSitelink];
47380                     } else {
47381                         titles.push(rtypeSitelink);
47382                     }
47383                 }
47384
47385                 if (keySitelink) {
47386                     if (_wikibaseCache[keySitelink]) {
47387                         result.key = _wikibaseCache[keySitelink];
47388                     } else {
47389                         titles.push(keySitelink);
47390                     }
47391                 }
47392
47393                 if (tagSitelink) {
47394                     if (_wikibaseCache[tagSitelink]) {
47395                         result.tag = _wikibaseCache[tagSitelink];
47396                     } else {
47397                         titles.push(tagSitelink);
47398                     }
47399                 }
47400
47401                 if (!titles.length) {
47402                     // Nothing to do, we already had everything in the cache
47403                     return callback(null, result);
47404                 }
47405
47406                 // Requesting just the user language code
47407                 // If backend recognizes the code, it will perform proper fallbacks,
47408                 // and the result will contain the requested code. If not, all values are returned:
47409                 // {"zh-tw":{"value":"...","language":"zh-tw","source-language":"zh-hant"}
47410                 // {"pt-br":{"value":"...","language":"pt","for-language":"pt-br"}}
47411                 var obj = {
47412                     action: 'wbgetentities',
47413                     sites: 'wiki',
47414                     titles: titles.join('|'),
47415                     languages: params.langCode,
47416                     languagefallback: 1,
47417                     origin: '*',
47418                     format: 'json',
47419                     // There is an MW Wikibase API bug https://phabricator.wikimedia.org/T212069
47420                     // We shouldn't use v1 until it gets fixed, but should switch to it afterwards
47421                     // formatversion: 2,
47422                 };
47423
47424                 var url = apibase$3 + '?' + utilQsString(obj);
47425                 doRequest(url, function(err, d) {
47426                     if (err) {
47427                         callback(err);
47428                     } else if (!d.success || d.error) {
47429                         callback(d.error.messages.map(function(v) { return v.html['*']; }).join('<br>'));
47430                     } else {
47431                         var localeID = false;
47432                         Object.values(d.entities).forEach(function(res) {
47433                             if (res.missing !== '') {
47434                                 // Simplify access to the localized values
47435                                 res.description = localizedToString(res.descriptions, params.langCode);
47436                                 res.label = localizedToString(res.labels, params.langCode);
47437
47438                                 var title = res.sitelinks.wiki.title;
47439                                 if (title === rtypeSitelink) {
47440                                     _wikibaseCache[rtypeSitelink] = res;
47441                                     result.rtype = res;
47442                                 } else if (title === keySitelink) {
47443                                     _wikibaseCache[keySitelink] = res;
47444                                     result.key = res;
47445                                 } else if (title === tagSitelink) {
47446                                     _wikibaseCache[tagSitelink] = res;
47447                                     result.tag = res;
47448                                 } else if (title === localeSitelink) {
47449                                     localeID = res.id;
47450                                 } else {
47451                                     console.log('Unexpected title ' + title);  // eslint-disable-line no-console
47452                                 }
47453                             }
47454                         });
47455
47456                         if (localeSitelink) {
47457                             // If locale ID is not found, store false to prevent repeated queries
47458                             that.addLocale(params.langCode, localeID);
47459                         }
47460
47461                         callback(null, result);
47462                     }
47463                 });
47464             },
47465
47466
47467             //
47468             // Pass params object of the form:
47469             // {
47470             //   key: 'string',     // required
47471             //   value: 'string'    // optional
47472             // }
47473             //   -or-
47474             // {
47475             //   rtype: 'rtype'     // relation type  (e.g. 'multipolygon')
47476             // }
47477             //
47478             // Get an result object used to display tag documentation
47479             // {
47480             //   title:        'string',
47481             //   description:  'string',
47482             //   editURL:      'string',
47483             //   imageURL:     'string',
47484             //   wiki:         { title: 'string', text: 'string', url: 'string' }
47485             // }
47486             //
47487             getDocs: function(params, callback) {
47488                 var that = this;
47489                 var langCode = utilDetect().locale.toLowerCase();
47490                 params.langCode = langCode;
47491
47492                 this.getEntity(params, function(err, data) {
47493                     if (err) {
47494                         callback(err);
47495                         return;
47496                     }
47497
47498                     var entity = data.rtype || data.tag || data.key;
47499                     if (!entity) {
47500                         callback('No entity');
47501                         return;
47502                     }
47503
47504                     // prepare result
47505                     var result = {
47506                         title: entity.title,
47507                         description: entity.description,
47508                         editURL: 'https://wiki.openstreetmap.org/wiki/' + entity.title
47509                     };
47510
47511                     // add image
47512                     if (entity.claims) {
47513                         var imageroot;
47514                         var image = that.claimToValue(entity, 'P4', langCode);
47515                         if (image) {
47516                             imageroot = 'https://commons.wikimedia.org/w/index.php';
47517                         } else {
47518                             image = that.claimToValue(entity, 'P28', langCode);
47519                             if (image) {
47520                                 imageroot = 'https://wiki.openstreetmap.org/w/index.php';
47521                             }
47522                         }
47523                         if (imageroot && image) {
47524                             result.imageURL = imageroot + '?' + utilQsString({
47525                                 title: 'Special:Redirect/file/' + image,
47526                                 width: 400
47527                             });
47528                         }
47529                     }
47530
47531                     // Try to get a wiki page from tag data item first, followed by the corresponding key data item.
47532                     // If neither tag nor key data item contain a wiki page in the needed language nor English,
47533                     // get the first found wiki page from either the tag or the key item.
47534                     var rtypeWiki = that.monolingualClaimToValueObj(data.rtype, 'P31');
47535                     var tagWiki = that.monolingualClaimToValueObj(data.tag, 'P31');
47536                     var keyWiki = that.monolingualClaimToValueObj(data.key, 'P31');
47537
47538                     // If exact language code does not exist, try to find the first part before the '-'
47539                     // BUG: in some cases, a more elaborate fallback logic might be needed
47540                     var langPrefix = langCode.split('-', 2)[0];
47541
47542                     // use the first acceptable wiki page
47543                     result.wiki =
47544                         getWikiInfo(rtypeWiki, langCode, 'inspector.wiki_reference') ||
47545                         getWikiInfo(rtypeWiki, langPrefix, 'inspector.wiki_reference') ||
47546                         getWikiInfo(rtypeWiki, 'en', 'inspector.wiki_en_reference') ||
47547                         getWikiInfo(tagWiki, langCode, 'inspector.wiki_reference') ||
47548                         getWikiInfo(tagWiki, langPrefix, 'inspector.wiki_reference') ||
47549                         getWikiInfo(tagWiki, 'en', 'inspector.wiki_en_reference') ||
47550                         getWikiInfo(keyWiki, langCode, 'inspector.wiki_reference') ||
47551                         getWikiInfo(keyWiki, langPrefix, 'inspector.wiki_reference') ||
47552                         getWikiInfo(keyWiki, 'en', 'inspector.wiki_en_reference');
47553
47554                     callback(null, result);
47555
47556
47557                     // Helper method to get wiki info if a given language exists
47558                     function getWikiInfo(wiki, langCode, tKey) {
47559                         if (wiki && wiki[langCode]) {
47560                             return {
47561                                 title: wiki[langCode],
47562                                 text: tKey,
47563                                 url: 'https://wiki.openstreetmap.org/wiki/' + wiki[langCode]
47564                             };
47565                         }
47566                     }
47567                 });
47568             },
47569
47570
47571             addLocale: function(langCode, qid) {
47572                 // Makes it easier to unit test
47573                 _localeIDs[langCode] = qid;
47574             },
47575
47576
47577             apibase: function(val) {
47578                 if (!arguments.length) return apibase$3;
47579                 apibase$3 = val;
47580                 return this;
47581             }
47582
47583         };
47584
47585         var jsonpCache = {};
47586         window.jsonpCache = jsonpCache;
47587
47588         function jsonpRequest(url, callback) {
47589             var request = {
47590                 abort: function() {}
47591             };
47592
47593             if (window.JSONP_FIX) {
47594                 if (window.JSONP_DELAY === 0) {
47595                     callback(window.JSONP_FIX);
47596                 } else {
47597                     var t = window.setTimeout(function() {
47598                         callback(window.JSONP_FIX);
47599                     }, window.JSONP_DELAY || 0);
47600
47601                     request.abort = function() { window.clearTimeout(t); };
47602                 }
47603
47604                 return request;
47605             }
47606
47607             function rand() {
47608                 var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
47609                 var c = '';
47610                 var i = -1;
47611                 while (++i < 15) c += chars.charAt(Math.floor(Math.random() * 52));
47612                 return c;
47613             }
47614
47615             function create(url) {
47616                 var e = url.match(/callback=(\w+)/);
47617                 var c = e ? e[1] : rand();
47618
47619                 jsonpCache[c] = function(data) {
47620                     if (jsonpCache[c]) {
47621                         callback(data);
47622                     }
47623                     finalize();
47624                 };
47625
47626                 function finalize() {
47627                     delete jsonpCache[c];
47628                     script.remove();
47629                 }
47630
47631                 request.abort = finalize;
47632                 return 'jsonpCache.' + c;
47633             }
47634
47635             var cb = create(url);
47636
47637             var script = d3_select('head')
47638                 .append('script')
47639                 .attr('type', 'text/javascript')
47640                 .attr('src', url.replace(/(\{|%7B)callback(\}|%7D)/, cb));
47641
47642             return request;
47643         }
47644
47645         var q = createCommonjsModule(function (module, exports) {
47646         // vim:ts=4:sts=4:sw=4:
47647         /*!
47648          *
47649          * Copyright 2009-2017 Kris Kowal under the terms of the MIT
47650          * license found at https://github.com/kriskowal/q/blob/v1/LICENSE
47651          *
47652          * With parts by Tyler Close
47653          * Copyright 2007-2009 Tyler Close under the terms of the MIT X license found
47654          * at http://www.opensource.org/licenses/mit-license.html
47655          * Forked at ref_send.js version: 2009-05-11
47656          *
47657          * With parts by Mark Miller
47658          * Copyright (C) 2011 Google Inc.
47659          *
47660          * Licensed under the Apache License, Version 2.0 (the "License");
47661          * you may not use this file except in compliance with the License.
47662          * You may obtain a copy of the License at
47663          *
47664          * http://www.apache.org/licenses/LICENSE-2.0
47665          *
47666          * Unless required by applicable law or agreed to in writing, software
47667          * distributed under the License is distributed on an "AS IS" BASIS,
47668          * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
47669          * See the License for the specific language governing permissions and
47670          * limitations under the License.
47671          *
47672          */
47673
47674         (function (definition) {
47675
47676             // This file will function properly as a <script> tag, or a module
47677             // using CommonJS and NodeJS or RequireJS module formats.  In
47678             // Common/Node/RequireJS, the module exports the Q API and when
47679             // executed as a simple <script>, it creates a Q global instead.
47680
47681             // Montage Require
47682             if (typeof bootstrap === "function") {
47683                 bootstrap("promise", definition);
47684
47685             // CommonJS
47686             } else {
47687                 module.exports = definition();
47688
47689             // RequireJS
47690             }
47691
47692         })(function () {
47693
47694         var hasStacks = false;
47695         try {
47696             throw new Error();
47697         } catch (e) {
47698             hasStacks = !!e.stack;
47699         }
47700
47701         // All code after this point will be filtered from stack traces reported
47702         // by Q.
47703         var qStartingLine = captureLine();
47704         var qFileName;
47705
47706         // shims
47707
47708         // used for fallback in "allResolved"
47709         var noop = function () {};
47710
47711         // Use the fastest possible means to execute a task in a future turn
47712         // of the event loop.
47713         var nextTick =(function () {
47714             // linked list of tasks (single, with head node)
47715             var head = {task: void 0, next: null};
47716             var tail = head;
47717             var flushing = false;
47718             var requestTick = void 0;
47719             var isNodeJS = false;
47720             // queue for late tasks, used by unhandled rejection tracking
47721             var laterQueue = [];
47722
47723             function flush() {
47724                 /* jshint loopfunc: true */
47725                 var task, domain;
47726
47727                 while (head.next) {
47728                     head = head.next;
47729                     task = head.task;
47730                     head.task = void 0;
47731                     domain = head.domain;
47732
47733                     if (domain) {
47734                         head.domain = void 0;
47735                         domain.enter();
47736                     }
47737                     runSingle(task, domain);
47738
47739                 }
47740                 while (laterQueue.length) {
47741                     task = laterQueue.pop();
47742                     runSingle(task);
47743                 }
47744                 flushing = false;
47745             }
47746             // runs a single function in the async queue
47747             function runSingle(task, domain) {
47748                 try {
47749                     task();
47750
47751                 } catch (e) {
47752                     if (isNodeJS) {
47753                         // In node, uncaught exceptions are considered fatal errors.
47754                         // Re-throw them synchronously to interrupt flushing!
47755
47756                         // Ensure continuation if the uncaught exception is suppressed
47757                         // listening "uncaughtException" events (as domains does).
47758                         // Continue in next event to avoid tick recursion.
47759                         if (domain) {
47760                             domain.exit();
47761                         }
47762                         setTimeout(flush, 0);
47763                         if (domain) {
47764                             domain.enter();
47765                         }
47766
47767                         throw e;
47768
47769                     } else {
47770                         // In browsers, uncaught exceptions are not fatal.
47771                         // Re-throw them asynchronously to avoid slow-downs.
47772                         setTimeout(function () {
47773                             throw e;
47774                         }, 0);
47775                     }
47776                 }
47777
47778                 if (domain) {
47779                     domain.exit();
47780                 }
47781             }
47782
47783             nextTick = function (task) {
47784                 tail = tail.next = {
47785                     task: task,
47786                     domain: isNodeJS && process.domain,
47787                     next: null
47788                 };
47789
47790                 if (!flushing) {
47791                     flushing = true;
47792                     requestTick();
47793                 }
47794             };
47795
47796             if (typeof process === "object" &&
47797                 process.toString() === "[object process]" && process.nextTick) {
47798                 // Ensure Q is in a real Node environment, with a `process.nextTick`.
47799                 // To see through fake Node environments:
47800                 // * Mocha test runner - exposes a `process` global without a `nextTick`
47801                 // * Browserify - exposes a `process.nexTick` function that uses
47802                 //   `setTimeout`. In this case `setImmediate` is preferred because
47803                 //    it is faster. Browserify's `process.toString()` yields
47804                 //   "[object Object]", while in a real Node environment
47805                 //   `process.toString()` yields "[object process]".
47806                 isNodeJS = true;
47807
47808                 requestTick = function () {
47809                     process.nextTick(flush);
47810                 };
47811
47812             } else if (typeof setImmediate === "function") {
47813                 // In IE10, Node.js 0.9+, or https://github.com/NobleJS/setImmediate
47814                 if (typeof window !== "undefined") {
47815                     requestTick = setImmediate.bind(window, flush);
47816                 } else {
47817                     requestTick = function () {
47818                         setImmediate(flush);
47819                     };
47820                 }
47821
47822             } else if (typeof MessageChannel !== "undefined") {
47823                 // modern browsers
47824                 // http://www.nonblocking.io/2011/06/windownexttick.html
47825                 var channel = new MessageChannel();
47826                 // At least Safari Version 6.0.5 (8536.30.1) intermittently cannot create
47827                 // working message ports the first time a page loads.
47828                 channel.port1.onmessage = function () {
47829                     requestTick = requestPortTick;
47830                     channel.port1.onmessage = flush;
47831                     flush();
47832                 };
47833                 var requestPortTick = function () {
47834                     // Opera requires us to provide a message payload, regardless of
47835                     // whether we use it.
47836                     channel.port2.postMessage(0);
47837                 };
47838                 requestTick = function () {
47839                     setTimeout(flush, 0);
47840                     requestPortTick();
47841                 };
47842
47843             } else {
47844                 // old browsers
47845                 requestTick = function () {
47846                     setTimeout(flush, 0);
47847                 };
47848             }
47849             // runs a task after all other tasks have been run
47850             // this is useful for unhandled rejection tracking that needs to happen
47851             // after all `then`d tasks have been run.
47852             nextTick.runAfter = function (task) {
47853                 laterQueue.push(task);
47854                 if (!flushing) {
47855                     flushing = true;
47856                     requestTick();
47857                 }
47858             };
47859             return nextTick;
47860         })();
47861
47862         // Attempt to make generics safe in the face of downstream
47863         // modifications.
47864         // There is no situation where this is necessary.
47865         // If you need a security guarantee, these primordials need to be
47866         // deeply frozen anyway, and if you don’t need a security guarantee,
47867         // this is just plain paranoid.
47868         // However, this **might** have the nice side-effect of reducing the size of
47869         // the minified code by reducing x.call() to merely x()
47870         // See Mark Miller’s explanation of what this does.
47871         // http://wiki.ecmascript.org/doku.php?id=conventions:safe_meta_programming
47872         var call = Function.call;
47873         function uncurryThis(f) {
47874             return function () {
47875                 return call.apply(f, arguments);
47876             };
47877         }
47878         // This is equivalent, but slower:
47879         // uncurryThis = Function_bind.bind(Function_bind.call);
47880         // http://jsperf.com/uncurrythis
47881
47882         var array_slice = uncurryThis(Array.prototype.slice);
47883
47884         var array_reduce = uncurryThis(
47885             Array.prototype.reduce || function (callback, basis) {
47886                 var index = 0,
47887                     length = this.length;
47888                 // concerning the initial value, if one is not provided
47889                 if (arguments.length === 1) {
47890                     // seek to the first value in the array, accounting
47891                     // for the possibility that is is a sparse array
47892                     do {
47893                         if (index in this) {
47894                             basis = this[index++];
47895                             break;
47896                         }
47897                         if (++index >= length) {
47898                             throw new TypeError();
47899                         }
47900                     } while (1);
47901                 }
47902                 // reduce
47903                 for (; index < length; index++) {
47904                     // account for the possibility that the array is sparse
47905                     if (index in this) {
47906                         basis = callback(basis, this[index], index);
47907                     }
47908                 }
47909                 return basis;
47910             }
47911         );
47912
47913         var array_indexOf = uncurryThis(
47914             Array.prototype.indexOf || function (value) {
47915                 // not a very good shim, but good enough for our one use of it
47916                 for (var i = 0; i < this.length; i++) {
47917                     if (this[i] === value) {
47918                         return i;
47919                     }
47920                 }
47921                 return -1;
47922             }
47923         );
47924
47925         var array_map = uncurryThis(
47926             Array.prototype.map || function (callback, thisp) {
47927                 var self = this;
47928                 var collect = [];
47929                 array_reduce(self, function (undefined$1, value, index) {
47930                     collect.push(callback.call(thisp, value, index, self));
47931                 }, void 0);
47932                 return collect;
47933             }
47934         );
47935
47936         var object_create = Object.create || function (prototype) {
47937             function Type() { }
47938             Type.prototype = prototype;
47939             return new Type();
47940         };
47941
47942         var object_defineProperty = Object.defineProperty || function (obj, prop, descriptor) {
47943             obj[prop] = descriptor.value;
47944             return obj;
47945         };
47946
47947         var object_hasOwnProperty = uncurryThis(Object.prototype.hasOwnProperty);
47948
47949         var object_keys = Object.keys || function (object) {
47950             var keys = [];
47951             for (var key in object) {
47952                 if (object_hasOwnProperty(object, key)) {
47953                     keys.push(key);
47954                 }
47955             }
47956             return keys;
47957         };
47958
47959         var object_toString = uncurryThis(Object.prototype.toString);
47960
47961         function isObject(value) {
47962             return value === Object(value);
47963         }
47964
47965         // generator related shims
47966
47967         // FIXME: Remove this function once ES6 generators are in SpiderMonkey.
47968         function isStopIteration(exception) {
47969             return (
47970                 object_toString(exception) === "[object StopIteration]" ||
47971                 exception instanceof QReturnValue
47972             );
47973         }
47974
47975         // FIXME: Remove this helper and Q.return once ES6 generators are in
47976         // SpiderMonkey.
47977         var QReturnValue;
47978         if (typeof ReturnValue !== "undefined") {
47979             QReturnValue = ReturnValue;
47980         } else {
47981             QReturnValue = function (value) {
47982                 this.value = value;
47983             };
47984         }
47985
47986         // long stack traces
47987
47988         var STACK_JUMP_SEPARATOR = "From previous event:";
47989
47990         function makeStackTraceLong(error, promise) {
47991             // If possible, transform the error stack trace by removing Node and Q
47992             // cruft, then concatenating with the stack trace of `promise`. See #57.
47993             if (hasStacks &&
47994                 promise.stack &&
47995                 typeof error === "object" &&
47996                 error !== null &&
47997                 error.stack
47998             ) {
47999                 var stacks = [];
48000                 for (var p = promise; !!p; p = p.source) {
48001                     if (p.stack && (!error.__minimumStackCounter__ || error.__minimumStackCounter__ > p.stackCounter)) {
48002                         object_defineProperty(error, "__minimumStackCounter__", {value: p.stackCounter, configurable: true});
48003                         stacks.unshift(p.stack);
48004                     }
48005                 }
48006                 stacks.unshift(error.stack);
48007
48008                 var concatedStacks = stacks.join("\n" + STACK_JUMP_SEPARATOR + "\n");
48009                 var stack = filterStackString(concatedStacks);
48010                 object_defineProperty(error, "stack", {value: stack, configurable: true});
48011             }
48012         }
48013
48014         function filterStackString(stackString) {
48015             var lines = stackString.split("\n");
48016             var desiredLines = [];
48017             for (var i = 0; i < lines.length; ++i) {
48018                 var line = lines[i];
48019
48020                 if (!isInternalFrame(line) && !isNodeFrame(line) && line) {
48021                     desiredLines.push(line);
48022                 }
48023             }
48024             return desiredLines.join("\n");
48025         }
48026
48027         function isNodeFrame(stackLine) {
48028             return stackLine.indexOf("(module.js:") !== -1 ||
48029                    stackLine.indexOf("(node.js:") !== -1;
48030         }
48031
48032         function getFileNameAndLineNumber(stackLine) {
48033             // Named functions: "at functionName (filename:lineNumber:columnNumber)"
48034             // In IE10 function name can have spaces ("Anonymous function") O_o
48035             var attempt1 = /at .+ \((.+):(\d+):(?:\d+)\)$/.exec(stackLine);
48036             if (attempt1) {
48037                 return [attempt1[1], Number(attempt1[2])];
48038             }
48039
48040             // Anonymous functions: "at filename:lineNumber:columnNumber"
48041             var attempt2 = /at ([^ ]+):(\d+):(?:\d+)$/.exec(stackLine);
48042             if (attempt2) {
48043                 return [attempt2[1], Number(attempt2[2])];
48044             }
48045
48046             // Firefox style: "function@filename:lineNumber or @filename:lineNumber"
48047             var attempt3 = /.*@(.+):(\d+)$/.exec(stackLine);
48048             if (attempt3) {
48049                 return [attempt3[1], Number(attempt3[2])];
48050             }
48051         }
48052
48053         function isInternalFrame(stackLine) {
48054             var fileNameAndLineNumber = getFileNameAndLineNumber(stackLine);
48055
48056             if (!fileNameAndLineNumber) {
48057                 return false;
48058             }
48059
48060             var fileName = fileNameAndLineNumber[0];
48061             var lineNumber = fileNameAndLineNumber[1];
48062
48063             return fileName === qFileName &&
48064                 lineNumber >= qStartingLine &&
48065                 lineNumber <= qEndingLine;
48066         }
48067
48068         // discover own file name and line number range for filtering stack
48069         // traces
48070         function captureLine() {
48071             if (!hasStacks) {
48072                 return;
48073             }
48074
48075             try {
48076                 throw new Error();
48077             } catch (e) {
48078                 var lines = e.stack.split("\n");
48079                 var firstLine = lines[0].indexOf("@") > 0 ? lines[1] : lines[2];
48080                 var fileNameAndLineNumber = getFileNameAndLineNumber(firstLine);
48081                 if (!fileNameAndLineNumber) {
48082                     return;
48083                 }
48084
48085                 qFileName = fileNameAndLineNumber[0];
48086                 return fileNameAndLineNumber[1];
48087             }
48088         }
48089
48090         function deprecate(callback, name, alternative) {
48091             return function () {
48092                 if (typeof console !== "undefined" &&
48093                     typeof console.warn === "function") {
48094                     console.warn(name + " is deprecated, use " + alternative +
48095                                  " instead.", new Error("").stack);
48096                 }
48097                 return callback.apply(callback, arguments);
48098             };
48099         }
48100
48101         // end of shims
48102         // beginning of real work
48103
48104         /**
48105          * Constructs a promise for an immediate reference, passes promises through, or
48106          * coerces promises from different systems.
48107          * @param value immediate reference or promise
48108          */
48109         function Q(value) {
48110             // If the object is already a Promise, return it directly.  This enables
48111             // the resolve function to both be used to created references from objects,
48112             // but to tolerably coerce non-promises to promises.
48113             if (value instanceof Promise) {
48114                 return value;
48115             }
48116
48117             // assimilate thenables
48118             if (isPromiseAlike(value)) {
48119                 return coerce(value);
48120             } else {
48121                 return fulfill(value);
48122             }
48123         }
48124         Q.resolve = Q;
48125
48126         /**
48127          * Performs a task in a future turn of the event loop.
48128          * @param {Function} task
48129          */
48130         Q.nextTick = nextTick;
48131
48132         /**
48133          * Controls whether or not long stack traces will be on
48134          */
48135         Q.longStackSupport = false;
48136
48137         /**
48138          * The counter is used to determine the stopping point for building
48139          * long stack traces. In makeStackTraceLong we walk backwards through
48140          * the linked list of promises, only stacks which were created before
48141          * the rejection are concatenated.
48142          */
48143         var longStackCounter = 1;
48144
48145         // enable long stacks if Q_DEBUG is set
48146         if (typeof process === "object" && process && process.env && process.env.Q_DEBUG) {
48147             Q.longStackSupport = true;
48148         }
48149
48150         /**
48151          * Constructs a {promise, resolve, reject} object.
48152          *
48153          * `resolve` is a callback to invoke with a more resolved value for the
48154          * promise. To fulfill the promise, invoke `resolve` with any value that is
48155          * not a thenable. To reject the promise, invoke `resolve` with a rejected
48156          * thenable, or invoke `reject` with the reason directly. To resolve the
48157          * promise to another thenable, thus putting it in the same state, invoke
48158          * `resolve` with that other thenable.
48159          */
48160         Q.defer = defer;
48161         function defer() {
48162             // if "messages" is an "Array", that indicates that the promise has not yet
48163             // been resolved.  If it is "undefined", it has been resolved.  Each
48164             // element of the messages array is itself an array of complete arguments to
48165             // forward to the resolved promise.  We coerce the resolution value to a
48166             // promise using the `resolve` function because it handles both fully
48167             // non-thenable values and other thenables gracefully.
48168             var messages = [], progressListeners = [], resolvedPromise;
48169
48170             var deferred = object_create(defer.prototype);
48171             var promise = object_create(Promise.prototype);
48172
48173             promise.promiseDispatch = function (resolve, op, operands) {
48174                 var args = array_slice(arguments);
48175                 if (messages) {
48176                     messages.push(args);
48177                     if (op === "when" && operands[1]) { // progress operand
48178                         progressListeners.push(operands[1]);
48179                     }
48180                 } else {
48181                     Q.nextTick(function () {
48182                         resolvedPromise.promiseDispatch.apply(resolvedPromise, args);
48183                     });
48184                 }
48185             };
48186
48187             // XXX deprecated
48188             promise.valueOf = function () {
48189                 if (messages) {
48190                     return promise;
48191                 }
48192                 var nearerValue = nearer(resolvedPromise);
48193                 if (isPromise(nearerValue)) {
48194                     resolvedPromise = nearerValue; // shorten chain
48195                 }
48196                 return nearerValue;
48197             };
48198
48199             promise.inspect = function () {
48200                 if (!resolvedPromise) {
48201                     return { state: "pending" };
48202                 }
48203                 return resolvedPromise.inspect();
48204             };
48205
48206             if (Q.longStackSupport && hasStacks) {
48207                 try {
48208                     throw new Error();
48209                 } catch (e) {
48210                     // NOTE: don't try to use `Error.captureStackTrace` or transfer the
48211                     // accessor around; that causes memory leaks as per GH-111. Just
48212                     // reify the stack trace as a string ASAP.
48213                     //
48214                     // At the same time, cut off the first line; it's always just
48215                     // "[object Promise]\n", as per the `toString`.
48216                     promise.stack = e.stack.substring(e.stack.indexOf("\n") + 1);
48217                     promise.stackCounter = longStackCounter++;
48218                 }
48219             }
48220
48221             // NOTE: we do the checks for `resolvedPromise` in each method, instead of
48222             // consolidating them into `become`, since otherwise we'd create new
48223             // promises with the lines `become(whatever(value))`. See e.g. GH-252.
48224
48225             function become(newPromise) {
48226                 resolvedPromise = newPromise;
48227
48228                 if (Q.longStackSupport && hasStacks) {
48229                     // Only hold a reference to the new promise if long stacks
48230                     // are enabled to reduce memory usage
48231                     promise.source = newPromise;
48232                 }
48233
48234                 array_reduce(messages, function (undefined$1, message) {
48235                     Q.nextTick(function () {
48236                         newPromise.promiseDispatch.apply(newPromise, message);
48237                     });
48238                 }, void 0);
48239
48240                 messages = void 0;
48241                 progressListeners = void 0;
48242             }
48243
48244             deferred.promise = promise;
48245             deferred.resolve = function (value) {
48246                 if (resolvedPromise) {
48247                     return;
48248                 }
48249
48250                 become(Q(value));
48251             };
48252
48253             deferred.fulfill = function (value) {
48254                 if (resolvedPromise) {
48255                     return;
48256                 }
48257
48258                 become(fulfill(value));
48259             };
48260             deferred.reject = function (reason) {
48261                 if (resolvedPromise) {
48262                     return;
48263                 }
48264
48265                 become(reject(reason));
48266             };
48267             deferred.notify = function (progress) {
48268                 if (resolvedPromise) {
48269                     return;
48270                 }
48271
48272                 array_reduce(progressListeners, function (undefined$1, progressListener) {
48273                     Q.nextTick(function () {
48274                         progressListener(progress);
48275                     });
48276                 }, void 0);
48277             };
48278
48279             return deferred;
48280         }
48281
48282         /**
48283          * Creates a Node-style callback that will resolve or reject the deferred
48284          * promise.
48285          * @returns a nodeback
48286          */
48287         defer.prototype.makeNodeResolver = function () {
48288             var self = this;
48289             return function (error, value) {
48290                 if (error) {
48291                     self.reject(error);
48292                 } else if (arguments.length > 2) {
48293                     self.resolve(array_slice(arguments, 1));
48294                 } else {
48295                     self.resolve(value);
48296                 }
48297             };
48298         };
48299
48300         /**
48301          * @param resolver {Function} a function that returns nothing and accepts
48302          * the resolve, reject, and notify functions for a deferred.
48303          * @returns a promise that may be resolved with the given resolve and reject
48304          * functions, or rejected by a thrown exception in resolver
48305          */
48306         Q.Promise = promise; // ES6
48307         Q.promise = promise;
48308         function promise(resolver) {
48309             if (typeof resolver !== "function") {
48310                 throw new TypeError("resolver must be a function.");
48311             }
48312             var deferred = defer();
48313             try {
48314                 resolver(deferred.resolve, deferred.reject, deferred.notify);
48315             } catch (reason) {
48316                 deferred.reject(reason);
48317             }
48318             return deferred.promise;
48319         }
48320
48321         promise.race = race; // ES6
48322         promise.all = all; // ES6
48323         promise.reject = reject; // ES6
48324         promise.resolve = Q; // ES6
48325
48326         // XXX experimental.  This method is a way to denote that a local value is
48327         // serializable and should be immediately dispatched to a remote upon request,
48328         // instead of passing a reference.
48329         Q.passByCopy = function (object) {
48330             //freeze(object);
48331             //passByCopies.set(object, true);
48332             return object;
48333         };
48334
48335         Promise.prototype.passByCopy = function () {
48336             //freeze(object);
48337             //passByCopies.set(object, true);
48338             return this;
48339         };
48340
48341         /**
48342          * If two promises eventually fulfill to the same value, promises that value,
48343          * but otherwise rejects.
48344          * @param x {Any*}
48345          * @param y {Any*}
48346          * @returns {Any*} a promise for x and y if they are the same, but a rejection
48347          * otherwise.
48348          *
48349          */
48350         Q.join = function (x, y) {
48351             return Q(x).join(y);
48352         };
48353
48354         Promise.prototype.join = function (that) {
48355             return Q([this, that]).spread(function (x, y) {
48356                 if (x === y) {
48357                     // TODO: "===" should be Object.is or equiv
48358                     return x;
48359                 } else {
48360                     throw new Error("Q can't join: not the same: " + x + " " + y);
48361                 }
48362             });
48363         };
48364
48365         /**
48366          * Returns a promise for the first of an array of promises to become settled.
48367          * @param answers {Array[Any*]} promises to race
48368          * @returns {Any*} the first promise to be settled
48369          */
48370         Q.race = race;
48371         function race(answerPs) {
48372             return promise(function (resolve, reject) {
48373                 // Switch to this once we can assume at least ES5
48374                 // answerPs.forEach(function (answerP) {
48375                 //     Q(answerP).then(resolve, reject);
48376                 // });
48377                 // Use this in the meantime
48378                 for (var i = 0, len = answerPs.length; i < len; i++) {
48379                     Q(answerPs[i]).then(resolve, reject);
48380                 }
48381             });
48382         }
48383
48384         Promise.prototype.race = function () {
48385             return this.then(Q.race);
48386         };
48387
48388         /**
48389          * Constructs a Promise with a promise descriptor object and optional fallback
48390          * function.  The descriptor contains methods like when(rejected), get(name),
48391          * set(name, value), post(name, args), and delete(name), which all
48392          * return either a value, a promise for a value, or a rejection.  The fallback
48393          * accepts the operation name, a resolver, and any further arguments that would
48394          * have been forwarded to the appropriate method above had a method been
48395          * provided with the proper name.  The API makes no guarantees about the nature
48396          * of the returned object, apart from that it is usable whereever promises are
48397          * bought and sold.
48398          */
48399         Q.makePromise = Promise;
48400         function Promise(descriptor, fallback, inspect) {
48401             if (fallback === void 0) {
48402                 fallback = function (op) {
48403                     return reject(new Error(
48404                         "Promise does not support operation: " + op
48405                     ));
48406                 };
48407             }
48408             if (inspect === void 0) {
48409                 inspect = function () {
48410                     return {state: "unknown"};
48411                 };
48412             }
48413
48414             var promise = object_create(Promise.prototype);
48415
48416             promise.promiseDispatch = function (resolve, op, args) {
48417                 var result;
48418                 try {
48419                     if (descriptor[op]) {
48420                         result = descriptor[op].apply(promise, args);
48421                     } else {
48422                         result = fallback.call(promise, op, args);
48423                     }
48424                 } catch (exception) {
48425                     result = reject(exception);
48426                 }
48427                 if (resolve) {
48428                     resolve(result);
48429                 }
48430             };
48431
48432             promise.inspect = inspect;
48433
48434             // XXX deprecated `valueOf` and `exception` support
48435             if (inspect) {
48436                 var inspected = inspect();
48437                 if (inspected.state === "rejected") {
48438                     promise.exception = inspected.reason;
48439                 }
48440
48441                 promise.valueOf = function () {
48442                     var inspected = inspect();
48443                     if (inspected.state === "pending" ||
48444                         inspected.state === "rejected") {
48445                         return promise;
48446                     }
48447                     return inspected.value;
48448                 };
48449             }
48450
48451             return promise;
48452         }
48453
48454         Promise.prototype.toString = function () {
48455             return "[object Promise]";
48456         };
48457
48458         Promise.prototype.then = function (fulfilled, rejected, progressed) {
48459             var self = this;
48460             var deferred = defer();
48461             var done = false;   // ensure the untrusted promise makes at most a
48462                                 // single call to one of the callbacks
48463
48464             function _fulfilled(value) {
48465                 try {
48466                     return typeof fulfilled === "function" ? fulfilled(value) : value;
48467                 } catch (exception) {
48468                     return reject(exception);
48469                 }
48470             }
48471
48472             function _rejected(exception) {
48473                 if (typeof rejected === "function") {
48474                     makeStackTraceLong(exception, self);
48475                     try {
48476                         return rejected(exception);
48477                     } catch (newException) {
48478                         return reject(newException);
48479                     }
48480                 }
48481                 return reject(exception);
48482             }
48483
48484             function _progressed(value) {
48485                 return typeof progressed === "function" ? progressed(value) : value;
48486             }
48487
48488             Q.nextTick(function () {
48489                 self.promiseDispatch(function (value) {
48490                     if (done) {
48491                         return;
48492                     }
48493                     done = true;
48494
48495                     deferred.resolve(_fulfilled(value));
48496                 }, "when", [function (exception) {
48497                     if (done) {
48498                         return;
48499                     }
48500                     done = true;
48501
48502                     deferred.resolve(_rejected(exception));
48503                 }]);
48504             });
48505
48506             // Progress propagator need to be attached in the current tick.
48507             self.promiseDispatch(void 0, "when", [void 0, function (value) {
48508                 var newValue;
48509                 var threw = false;
48510                 try {
48511                     newValue = _progressed(value);
48512                 } catch (e) {
48513                     threw = true;
48514                     if (Q.onerror) {
48515                         Q.onerror(e);
48516                     } else {
48517                         throw e;
48518                     }
48519                 }
48520
48521                 if (!threw) {
48522                     deferred.notify(newValue);
48523                 }
48524             }]);
48525
48526             return deferred.promise;
48527         };
48528
48529         Q.tap = function (promise, callback) {
48530             return Q(promise).tap(callback);
48531         };
48532
48533         /**
48534          * Works almost like "finally", but not called for rejections.
48535          * Original resolution value is passed through callback unaffected.
48536          * Callback may return a promise that will be awaited for.
48537          * @param {Function} callback
48538          * @returns {Q.Promise}
48539          * @example
48540          * doSomething()
48541          *   .then(...)
48542          *   .tap(console.log)
48543          *   .then(...);
48544          */
48545         Promise.prototype.tap = function (callback) {
48546             callback = Q(callback);
48547
48548             return this.then(function (value) {
48549                 return callback.fcall(value).thenResolve(value);
48550             });
48551         };
48552
48553         /**
48554          * Registers an observer on a promise.
48555          *
48556          * Guarantees:
48557          *
48558          * 1. that fulfilled and rejected will be called only once.
48559          * 2. that either the fulfilled callback or the rejected callback will be
48560          *    called, but not both.
48561          * 3. that fulfilled and rejected will not be called in this turn.
48562          *
48563          * @param value      promise or immediate reference to observe
48564          * @param fulfilled  function to be called with the fulfilled value
48565          * @param rejected   function to be called with the rejection exception
48566          * @param progressed function to be called on any progress notifications
48567          * @return promise for the return value from the invoked callback
48568          */
48569         Q.when = when;
48570         function when(value, fulfilled, rejected, progressed) {
48571             return Q(value).then(fulfilled, rejected, progressed);
48572         }
48573
48574         Promise.prototype.thenResolve = function (value) {
48575             return this.then(function () { return value; });
48576         };
48577
48578         Q.thenResolve = function (promise, value) {
48579             return Q(promise).thenResolve(value);
48580         };
48581
48582         Promise.prototype.thenReject = function (reason) {
48583             return this.then(function () { throw reason; });
48584         };
48585
48586         Q.thenReject = function (promise, reason) {
48587             return Q(promise).thenReject(reason);
48588         };
48589
48590         /**
48591          * If an object is not a promise, it is as "near" as possible.
48592          * If a promise is rejected, it is as "near" as possible too.
48593          * If it’s a fulfilled promise, the fulfillment value is nearer.
48594          * If it’s a deferred promise and the deferred has been resolved, the
48595          * resolution is "nearer".
48596          * @param object
48597          * @returns most resolved (nearest) form of the object
48598          */
48599
48600         // XXX should we re-do this?
48601         Q.nearer = nearer;
48602         function nearer(value) {
48603             if (isPromise(value)) {
48604                 var inspected = value.inspect();
48605                 if (inspected.state === "fulfilled") {
48606                     return inspected.value;
48607                 }
48608             }
48609             return value;
48610         }
48611
48612         /**
48613          * @returns whether the given object is a promise.
48614          * Otherwise it is a fulfilled value.
48615          */
48616         Q.isPromise = isPromise;
48617         function isPromise(object) {
48618             return object instanceof Promise;
48619         }
48620
48621         Q.isPromiseAlike = isPromiseAlike;
48622         function isPromiseAlike(object) {
48623             return isObject(object) && typeof object.then === "function";
48624         }
48625
48626         /**
48627          * @returns whether the given object is a pending promise, meaning not
48628          * fulfilled or rejected.
48629          */
48630         Q.isPending = isPending;
48631         function isPending(object) {
48632             return isPromise(object) && object.inspect().state === "pending";
48633         }
48634
48635         Promise.prototype.isPending = function () {
48636             return this.inspect().state === "pending";
48637         };
48638
48639         /**
48640          * @returns whether the given object is a value or fulfilled
48641          * promise.
48642          */
48643         Q.isFulfilled = isFulfilled;
48644         function isFulfilled(object) {
48645             return !isPromise(object) || object.inspect().state === "fulfilled";
48646         }
48647
48648         Promise.prototype.isFulfilled = function () {
48649             return this.inspect().state === "fulfilled";
48650         };
48651
48652         /**
48653          * @returns whether the given object is a rejected promise.
48654          */
48655         Q.isRejected = isRejected;
48656         function isRejected(object) {
48657             return isPromise(object) && object.inspect().state === "rejected";
48658         }
48659
48660         Promise.prototype.isRejected = function () {
48661             return this.inspect().state === "rejected";
48662         };
48663
48664         //// BEGIN UNHANDLED REJECTION TRACKING
48665
48666         // This promise library consumes exceptions thrown in handlers so they can be
48667         // handled by a subsequent promise.  The exceptions get added to this array when
48668         // they are created, and removed when they are handled.  Note that in ES6 or
48669         // shimmed environments, this would naturally be a `Set`.
48670         var unhandledReasons = [];
48671         var unhandledRejections = [];
48672         var reportedUnhandledRejections = [];
48673         var trackUnhandledRejections = true;
48674
48675         function resetUnhandledRejections() {
48676             unhandledReasons.length = 0;
48677             unhandledRejections.length = 0;
48678
48679             if (!trackUnhandledRejections) {
48680                 trackUnhandledRejections = true;
48681             }
48682         }
48683
48684         function trackRejection(promise, reason) {
48685             if (!trackUnhandledRejections) {
48686                 return;
48687             }
48688             if (typeof process === "object" && typeof process.emit === "function") {
48689                 Q.nextTick.runAfter(function () {
48690                     if (array_indexOf(unhandledRejections, promise) !== -1) {
48691                         process.emit("unhandledRejection", reason, promise);
48692                         reportedUnhandledRejections.push(promise);
48693                     }
48694                 });
48695             }
48696
48697             unhandledRejections.push(promise);
48698             if (reason && typeof reason.stack !== "undefined") {
48699                 unhandledReasons.push(reason.stack);
48700             } else {
48701                 unhandledReasons.push("(no stack) " + reason);
48702             }
48703         }
48704
48705         function untrackRejection(promise) {
48706             if (!trackUnhandledRejections) {
48707                 return;
48708             }
48709
48710             var at = array_indexOf(unhandledRejections, promise);
48711             if (at !== -1) {
48712                 if (typeof process === "object" && typeof process.emit === "function") {
48713                     Q.nextTick.runAfter(function () {
48714                         var atReport = array_indexOf(reportedUnhandledRejections, promise);
48715                         if (atReport !== -1) {
48716                             process.emit("rejectionHandled", unhandledReasons[at], promise);
48717                             reportedUnhandledRejections.splice(atReport, 1);
48718                         }
48719                     });
48720                 }
48721                 unhandledRejections.splice(at, 1);
48722                 unhandledReasons.splice(at, 1);
48723             }
48724         }
48725
48726         Q.resetUnhandledRejections = resetUnhandledRejections;
48727
48728         Q.getUnhandledReasons = function () {
48729             // Make a copy so that consumers can't interfere with our internal state.
48730             return unhandledReasons.slice();
48731         };
48732
48733         Q.stopUnhandledRejectionTracking = function () {
48734             resetUnhandledRejections();
48735             trackUnhandledRejections = false;
48736         };
48737
48738         resetUnhandledRejections();
48739
48740         //// END UNHANDLED REJECTION TRACKING
48741
48742         /**
48743          * Constructs a rejected promise.
48744          * @param reason value describing the failure
48745          */
48746         Q.reject = reject;
48747         function reject(reason) {
48748             var rejection = Promise({
48749                 "when": function (rejected) {
48750                     // note that the error has been handled
48751                     if (rejected) {
48752                         untrackRejection(this);
48753                     }
48754                     return rejected ? rejected(reason) : this;
48755                 }
48756             }, function fallback() {
48757                 return this;
48758             }, function inspect() {
48759                 return { state: "rejected", reason: reason };
48760             });
48761
48762             // Note that the reason has not been handled.
48763             trackRejection(rejection, reason);
48764
48765             return rejection;
48766         }
48767
48768         /**
48769          * Constructs a fulfilled promise for an immediate reference.
48770          * @param value immediate reference
48771          */
48772         Q.fulfill = fulfill;
48773         function fulfill(value) {
48774             return Promise({
48775                 "when": function () {
48776                     return value;
48777                 },
48778                 "get": function (name) {
48779                     return value[name];
48780                 },
48781                 "set": function (name, rhs) {
48782                     value[name] = rhs;
48783                 },
48784                 "delete": function (name) {
48785                     delete value[name];
48786                 },
48787                 "post": function (name, args) {
48788                     // Mark Miller proposes that post with no name should apply a
48789                     // promised function.
48790                     if (name === null || name === void 0) {
48791                         return value.apply(void 0, args);
48792                     } else {
48793                         return value[name].apply(value, args);
48794                     }
48795                 },
48796                 "apply": function (thisp, args) {
48797                     return value.apply(thisp, args);
48798                 },
48799                 "keys": function () {
48800                     return object_keys(value);
48801                 }
48802             }, void 0, function inspect() {
48803                 return { state: "fulfilled", value: value };
48804             });
48805         }
48806
48807         /**
48808          * Converts thenables to Q promises.
48809          * @param promise thenable promise
48810          * @returns a Q promise
48811          */
48812         function coerce(promise) {
48813             var deferred = defer();
48814             Q.nextTick(function () {
48815                 try {
48816                     promise.then(deferred.resolve, deferred.reject, deferred.notify);
48817                 } catch (exception) {
48818                     deferred.reject(exception);
48819                 }
48820             });
48821             return deferred.promise;
48822         }
48823
48824         /**
48825          * Annotates an object such that it will never be
48826          * transferred away from this process over any promise
48827          * communication channel.
48828          * @param object
48829          * @returns promise a wrapping of that object that
48830          * additionally responds to the "isDef" message
48831          * without a rejection.
48832          */
48833         Q.master = master;
48834         function master(object) {
48835             return Promise({
48836                 "isDef": function () {}
48837             }, function fallback(op, args) {
48838                 return dispatch(object, op, args);
48839             }, function () {
48840                 return Q(object).inspect();
48841             });
48842         }
48843
48844         /**
48845          * Spreads the values of a promised array of arguments into the
48846          * fulfillment callback.
48847          * @param fulfilled callback that receives variadic arguments from the
48848          * promised array
48849          * @param rejected callback that receives the exception if the promise
48850          * is rejected.
48851          * @returns a promise for the return value or thrown exception of
48852          * either callback.
48853          */
48854         Q.spread = spread;
48855         function spread(value, fulfilled, rejected) {
48856             return Q(value).spread(fulfilled, rejected);
48857         }
48858
48859         Promise.prototype.spread = function (fulfilled, rejected) {
48860             return this.all().then(function (array) {
48861                 return fulfilled.apply(void 0, array);
48862             }, rejected);
48863         };
48864
48865         /**
48866          * The async function is a decorator for generator functions, turning
48867          * them into asynchronous generators.  Although generators are only part
48868          * of the newest ECMAScript 6 drafts, this code does not cause syntax
48869          * errors in older engines.  This code should continue to work and will
48870          * in fact improve over time as the language improves.
48871          *
48872          * ES6 generators are currently part of V8 version 3.19 with the
48873          * --harmony-generators runtime flag enabled.  SpiderMonkey has had them
48874          * for longer, but under an older Python-inspired form.  This function
48875          * works on both kinds of generators.
48876          *
48877          * Decorates a generator function such that:
48878          *  - it may yield promises
48879          *  - execution will continue when that promise is fulfilled
48880          *  - the value of the yield expression will be the fulfilled value
48881          *  - it returns a promise for the return value (when the generator
48882          *    stops iterating)
48883          *  - the decorated function returns a promise for the return value
48884          *    of the generator or the first rejected promise among those
48885          *    yielded.
48886          *  - if an error is thrown in the generator, it propagates through
48887          *    every following yield until it is caught, or until it escapes
48888          *    the generator function altogether, and is translated into a
48889          *    rejection for the promise returned by the decorated generator.
48890          */
48891         Q.async = async;
48892         function async(makeGenerator) {
48893             return function () {
48894                 // when verb is "send", arg is a value
48895                 // when verb is "throw", arg is an exception
48896                 function continuer(verb, arg) {
48897                     var result;
48898
48899                     // Until V8 3.19 / Chromium 29 is released, SpiderMonkey is the only
48900                     // engine that has a deployed base of browsers that support generators.
48901                     // However, SM's generators use the Python-inspired semantics of
48902                     // outdated ES6 drafts.  We would like to support ES6, but we'd also
48903                     // like to make it possible to use generators in deployed browsers, so
48904                     // we also support Python-style generators.  At some point we can remove
48905                     // this block.
48906
48907                     if (typeof StopIteration === "undefined") {
48908                         // ES6 Generators
48909                         try {
48910                             result = generator[verb](arg);
48911                         } catch (exception) {
48912                             return reject(exception);
48913                         }
48914                         if (result.done) {
48915                             return Q(result.value);
48916                         } else {
48917                             return when(result.value, callback, errback);
48918                         }
48919                     } else {
48920                         // SpiderMonkey Generators
48921                         // FIXME: Remove this case when SM does ES6 generators.
48922                         try {
48923                             result = generator[verb](arg);
48924                         } catch (exception) {
48925                             if (isStopIteration(exception)) {
48926                                 return Q(exception.value);
48927                             } else {
48928                                 return reject(exception);
48929                             }
48930                         }
48931                         return when(result, callback, errback);
48932                     }
48933                 }
48934                 var generator = makeGenerator.apply(this, arguments);
48935                 var callback = continuer.bind(continuer, "next");
48936                 var errback = continuer.bind(continuer, "throw");
48937                 return callback();
48938             };
48939         }
48940
48941         /**
48942          * The spawn function is a small wrapper around async that immediately
48943          * calls the generator and also ends the promise chain, so that any
48944          * unhandled errors are thrown instead of forwarded to the error
48945          * handler. This is useful because it's extremely common to run
48946          * generators at the top-level to work with libraries.
48947          */
48948         Q.spawn = spawn;
48949         function spawn(makeGenerator) {
48950             Q.done(Q.async(makeGenerator)());
48951         }
48952
48953         // FIXME: Remove this interface once ES6 generators are in SpiderMonkey.
48954         /**
48955          * Throws a ReturnValue exception to stop an asynchronous generator.
48956          *
48957          * This interface is a stop-gap measure to support generator return
48958          * values in older Firefox/SpiderMonkey.  In browsers that support ES6
48959          * generators like Chromium 29, just use "return" in your generator
48960          * functions.
48961          *
48962          * @param value the return value for the surrounding generator
48963          * @throws ReturnValue exception with the value.
48964          * @example
48965          * // ES6 style
48966          * Q.async(function* () {
48967          *      var foo = yield getFooPromise();
48968          *      var bar = yield getBarPromise();
48969          *      return foo + bar;
48970          * })
48971          * // Older SpiderMonkey style
48972          * Q.async(function () {
48973          *      var foo = yield getFooPromise();
48974          *      var bar = yield getBarPromise();
48975          *      Q.return(foo + bar);
48976          * })
48977          */
48978         Q["return"] = _return;
48979         function _return(value) {
48980             throw new QReturnValue(value);
48981         }
48982
48983         /**
48984          * The promised function decorator ensures that any promise arguments
48985          * are settled and passed as values (`this` is also settled and passed
48986          * as a value).  It will also ensure that the result of a function is
48987          * always a promise.
48988          *
48989          * @example
48990          * var add = Q.promised(function (a, b) {
48991          *     return a + b;
48992          * });
48993          * add(Q(a), Q(B));
48994          *
48995          * @param {function} callback The function to decorate
48996          * @returns {function} a function that has been decorated.
48997          */
48998         Q.promised = promised;
48999         function promised(callback) {
49000             return function () {
49001                 return spread([this, all(arguments)], function (self, args) {
49002                     return callback.apply(self, args);
49003                 });
49004             };
49005         }
49006
49007         /**
49008          * sends a message to a value in a future turn
49009          * @param object* the recipient
49010          * @param op the name of the message operation, e.g., "when",
49011          * @param args further arguments to be forwarded to the operation
49012          * @returns result {Promise} a promise for the result of the operation
49013          */
49014         Q.dispatch = dispatch;
49015         function dispatch(object, op, args) {
49016             return Q(object).dispatch(op, args);
49017         }
49018
49019         Promise.prototype.dispatch = function (op, args) {
49020             var self = this;
49021             var deferred = defer();
49022             Q.nextTick(function () {
49023                 self.promiseDispatch(deferred.resolve, op, args);
49024             });
49025             return deferred.promise;
49026         };
49027
49028         /**
49029          * Gets the value of a property in a future turn.
49030          * @param object    promise or immediate reference for target object
49031          * @param name      name of property to get
49032          * @return promise for the property value
49033          */
49034         Q.get = function (object, key) {
49035             return Q(object).dispatch("get", [key]);
49036         };
49037
49038         Promise.prototype.get = function (key) {
49039             return this.dispatch("get", [key]);
49040         };
49041
49042         /**
49043          * Sets the value of a property in a future turn.
49044          * @param object    promise or immediate reference for object object
49045          * @param name      name of property to set
49046          * @param value     new value of property
49047          * @return promise for the return value
49048          */
49049         Q.set = function (object, key, value) {
49050             return Q(object).dispatch("set", [key, value]);
49051         };
49052
49053         Promise.prototype.set = function (key, value) {
49054             return this.dispatch("set", [key, value]);
49055         };
49056
49057         /**
49058          * Deletes a property in a future turn.
49059          * @param object    promise or immediate reference for target object
49060          * @param name      name of property to delete
49061          * @return promise for the return value
49062          */
49063         Q.del = // XXX legacy
49064         Q["delete"] = function (object, key) {
49065             return Q(object).dispatch("delete", [key]);
49066         };
49067
49068         Promise.prototype.del = // XXX legacy
49069         Promise.prototype["delete"] = function (key) {
49070             return this.dispatch("delete", [key]);
49071         };
49072
49073         /**
49074          * Invokes a method in a future turn.
49075          * @param object    promise or immediate reference for target object
49076          * @param name      name of method to invoke
49077          * @param value     a value to post, typically an array of
49078          *                  invocation arguments for promises that
49079          *                  are ultimately backed with `resolve` values,
49080          *                  as opposed to those backed with URLs
49081          *                  wherein the posted value can be any
49082          *                  JSON serializable object.
49083          * @return promise for the return value
49084          */
49085         // bound locally because it is used by other methods
49086         Q.mapply = // XXX As proposed by "Redsandro"
49087         Q.post = function (object, name, args) {
49088             return Q(object).dispatch("post", [name, args]);
49089         };
49090
49091         Promise.prototype.mapply = // XXX As proposed by "Redsandro"
49092         Promise.prototype.post = function (name, args) {
49093             return this.dispatch("post", [name, args]);
49094         };
49095
49096         /**
49097          * Invokes a method in a future turn.
49098          * @param object    promise or immediate reference for target object
49099          * @param name      name of method to invoke
49100          * @param ...args   array of invocation arguments
49101          * @return promise for the return value
49102          */
49103         Q.send = // XXX Mark Miller's proposed parlance
49104         Q.mcall = // XXX As proposed by "Redsandro"
49105         Q.invoke = function (object, name /*...args*/) {
49106             return Q(object).dispatch("post", [name, array_slice(arguments, 2)]);
49107         };
49108
49109         Promise.prototype.send = // XXX Mark Miller's proposed parlance
49110         Promise.prototype.mcall = // XXX As proposed by "Redsandro"
49111         Promise.prototype.invoke = function (name /*...args*/) {
49112             return this.dispatch("post", [name, array_slice(arguments, 1)]);
49113         };
49114
49115         /**
49116          * Applies the promised function in a future turn.
49117          * @param object    promise or immediate reference for target function
49118          * @param args      array of application arguments
49119          */
49120         Q.fapply = function (object, args) {
49121             return Q(object).dispatch("apply", [void 0, args]);
49122         };
49123
49124         Promise.prototype.fapply = function (args) {
49125             return this.dispatch("apply", [void 0, args]);
49126         };
49127
49128         /**
49129          * Calls the promised function in a future turn.
49130          * @param object    promise or immediate reference for target function
49131          * @param ...args   array of application arguments
49132          */
49133         Q["try"] =
49134         Q.fcall = function (object /* ...args*/) {
49135             return Q(object).dispatch("apply", [void 0, array_slice(arguments, 1)]);
49136         };
49137
49138         Promise.prototype.fcall = function (/*...args*/) {
49139             return this.dispatch("apply", [void 0, array_slice(arguments)]);
49140         };
49141
49142         /**
49143          * Binds the promised function, transforming return values into a fulfilled
49144          * promise and thrown errors into a rejected one.
49145          * @param object    promise or immediate reference for target function
49146          * @param ...args   array of application arguments
49147          */
49148         Q.fbind = function (object /*...args*/) {
49149             var promise = Q(object);
49150             var args = array_slice(arguments, 1);
49151             return function fbound() {
49152                 return promise.dispatch("apply", [
49153                     this,
49154                     args.concat(array_slice(arguments))
49155                 ]);
49156             };
49157         };
49158         Promise.prototype.fbind = function (/*...args*/) {
49159             var promise = this;
49160             var args = array_slice(arguments);
49161             return function fbound() {
49162                 return promise.dispatch("apply", [
49163                     this,
49164                     args.concat(array_slice(arguments))
49165                 ]);
49166             };
49167         };
49168
49169         /**
49170          * Requests the names of the owned properties of a promised
49171          * object in a future turn.
49172          * @param object    promise or immediate reference for target object
49173          * @return promise for the keys of the eventually settled object
49174          */
49175         Q.keys = function (object) {
49176             return Q(object).dispatch("keys", []);
49177         };
49178
49179         Promise.prototype.keys = function () {
49180             return this.dispatch("keys", []);
49181         };
49182
49183         /**
49184          * Turns an array of promises into a promise for an array.  If any of
49185          * the promises gets rejected, the whole array is rejected immediately.
49186          * @param {Array*} an array (or promise for an array) of values (or
49187          * promises for values)
49188          * @returns a promise for an array of the corresponding values
49189          */
49190         // By Mark Miller
49191         // http://wiki.ecmascript.org/doku.php?id=strawman:concurrency&rev=1308776521#allfulfilled
49192         Q.all = all;
49193         function all(promises) {
49194             return when(promises, function (promises) {
49195                 var pendingCount = 0;
49196                 var deferred = defer();
49197                 array_reduce(promises, function (undefined$1, promise, index) {
49198                     var snapshot;
49199                     if (
49200                         isPromise(promise) &&
49201                         (snapshot = promise.inspect()).state === "fulfilled"
49202                     ) {
49203                         promises[index] = snapshot.value;
49204                     } else {
49205                         ++pendingCount;
49206                         when(
49207                             promise,
49208                             function (value) {
49209                                 promises[index] = value;
49210                                 if (--pendingCount === 0) {
49211                                     deferred.resolve(promises);
49212                                 }
49213                             },
49214                             deferred.reject,
49215                             function (progress) {
49216                                 deferred.notify({ index: index, value: progress });
49217                             }
49218                         );
49219                     }
49220                 }, void 0);
49221                 if (pendingCount === 0) {
49222                     deferred.resolve(promises);
49223                 }
49224                 return deferred.promise;
49225             });
49226         }
49227
49228         Promise.prototype.all = function () {
49229             return all(this);
49230         };
49231
49232         /**
49233          * Returns the first resolved promise of an array. Prior rejected promises are
49234          * ignored.  Rejects only if all promises are rejected.
49235          * @param {Array*} an array containing values or promises for values
49236          * @returns a promise fulfilled with the value of the first resolved promise,
49237          * or a rejected promise if all promises are rejected.
49238          */
49239         Q.any = any;
49240
49241         function any(promises) {
49242             if (promises.length === 0) {
49243                 return Q.resolve();
49244             }
49245
49246             var deferred = Q.defer();
49247             var pendingCount = 0;
49248             array_reduce(promises, function (prev, current, index) {
49249                 var promise = promises[index];
49250
49251                 pendingCount++;
49252
49253                 when(promise, onFulfilled, onRejected, onProgress);
49254                 function onFulfilled(result) {
49255                     deferred.resolve(result);
49256                 }
49257                 function onRejected(err) {
49258                     pendingCount--;
49259                     if (pendingCount === 0) {
49260                         var rejection = err || new Error("" + err);
49261
49262                         rejection.message = ("Q can't get fulfillment value from any promise, all " +
49263                             "promises were rejected. Last error message: " + rejection.message);
49264
49265                         deferred.reject(rejection);
49266                     }
49267                 }
49268                 function onProgress(progress) {
49269                     deferred.notify({
49270                         index: index,
49271                         value: progress
49272                     });
49273                 }
49274             }, undefined);
49275
49276             return deferred.promise;
49277         }
49278
49279         Promise.prototype.any = function () {
49280             return any(this);
49281         };
49282
49283         /**
49284          * Waits for all promises to be settled, either fulfilled or
49285          * rejected.  This is distinct from `all` since that would stop
49286          * waiting at the first rejection.  The promise returned by
49287          * `allResolved` will never be rejected.
49288          * @param promises a promise for an array (or an array) of promises
49289          * (or values)
49290          * @return a promise for an array of promises
49291          */
49292         Q.allResolved = deprecate(allResolved, "allResolved", "allSettled");
49293         function allResolved(promises) {
49294             return when(promises, function (promises) {
49295                 promises = array_map(promises, Q);
49296                 return when(all(array_map(promises, function (promise) {
49297                     return when(promise, noop, noop);
49298                 })), function () {
49299                     return promises;
49300                 });
49301             });
49302         }
49303
49304         Promise.prototype.allResolved = function () {
49305             return allResolved(this);
49306         };
49307
49308         /**
49309          * @see Promise#allSettled
49310          */
49311         Q.allSettled = allSettled;
49312         function allSettled(promises) {
49313             return Q(promises).allSettled();
49314         }
49315
49316         /**
49317          * Turns an array of promises into a promise for an array of their states (as
49318          * returned by `inspect`) when they have all settled.
49319          * @param {Array[Any*]} values an array (or promise for an array) of values (or
49320          * promises for values)
49321          * @returns {Array[State]} an array of states for the respective values.
49322          */
49323         Promise.prototype.allSettled = function () {
49324             return this.then(function (promises) {
49325                 return all(array_map(promises, function (promise) {
49326                     promise = Q(promise);
49327                     function regardless() {
49328                         return promise.inspect();
49329                     }
49330                     return promise.then(regardless, regardless);
49331                 }));
49332             });
49333         };
49334
49335         /**
49336          * Captures the failure of a promise, giving an oportunity to recover
49337          * with a callback.  If the given promise is fulfilled, the returned
49338          * promise is fulfilled.
49339          * @param {Any*} promise for something
49340          * @param {Function} callback to fulfill the returned promise if the
49341          * given promise is rejected
49342          * @returns a promise for the return value of the callback
49343          */
49344         Q.fail = // XXX legacy
49345         Q["catch"] = function (object, rejected) {
49346             return Q(object).then(void 0, rejected);
49347         };
49348
49349         Promise.prototype.fail = // XXX legacy
49350         Promise.prototype["catch"] = function (rejected) {
49351             return this.then(void 0, rejected);
49352         };
49353
49354         /**
49355          * Attaches a listener that can respond to progress notifications from a
49356          * promise's originating deferred. This listener receives the exact arguments
49357          * passed to ``deferred.notify``.
49358          * @param {Any*} promise for something
49359          * @param {Function} callback to receive any progress notifications
49360          * @returns the given promise, unchanged
49361          */
49362         Q.progress = progress;
49363         function progress(object, progressed) {
49364             return Q(object).then(void 0, void 0, progressed);
49365         }
49366
49367         Promise.prototype.progress = function (progressed) {
49368             return this.then(void 0, void 0, progressed);
49369         };
49370
49371         /**
49372          * Provides an opportunity to observe the settling of a promise,
49373          * regardless of whether the promise is fulfilled or rejected.  Forwards
49374          * the resolution to the returned promise when the callback is done.
49375          * The callback can return a promise to defer completion.
49376          * @param {Any*} promise
49377          * @param {Function} callback to observe the resolution of the given
49378          * promise, takes no arguments.
49379          * @returns a promise for the resolution of the given promise when
49380          * ``fin`` is done.
49381          */
49382         Q.fin = // XXX legacy
49383         Q["finally"] = function (object, callback) {
49384             return Q(object)["finally"](callback);
49385         };
49386
49387         Promise.prototype.fin = // XXX legacy
49388         Promise.prototype["finally"] = function (callback) {
49389             if (!callback || typeof callback.apply !== "function") {
49390                 throw new Error("Q can't apply finally callback");
49391             }
49392             callback = Q(callback);
49393             return this.then(function (value) {
49394                 return callback.fcall().then(function () {
49395                     return value;
49396                 });
49397             }, function (reason) {
49398                 // TODO attempt to recycle the rejection with "this".
49399                 return callback.fcall().then(function () {
49400                     throw reason;
49401                 });
49402             });
49403         };
49404
49405         /**
49406          * Terminates a chain of promises, forcing rejections to be
49407          * thrown as exceptions.
49408          * @param {Any*} promise at the end of a chain of promises
49409          * @returns nothing
49410          */
49411         Q.done = function (object, fulfilled, rejected, progress) {
49412             return Q(object).done(fulfilled, rejected, progress);
49413         };
49414
49415         Promise.prototype.done = function (fulfilled, rejected, progress) {
49416             var onUnhandledError = function (error) {
49417                 // forward to a future turn so that ``when``
49418                 // does not catch it and turn it into a rejection.
49419                 Q.nextTick(function () {
49420                     makeStackTraceLong(error, promise);
49421                     if (Q.onerror) {
49422                         Q.onerror(error);
49423                     } else {
49424                         throw error;
49425                     }
49426                 });
49427             };
49428
49429             // Avoid unnecessary `nextTick`ing via an unnecessary `when`.
49430             var promise = fulfilled || rejected || progress ?
49431                 this.then(fulfilled, rejected, progress) :
49432                 this;
49433
49434             if (typeof process === "object" && process && process.domain) {
49435                 onUnhandledError = process.domain.bind(onUnhandledError);
49436             }
49437
49438             promise.then(void 0, onUnhandledError);
49439         };
49440
49441         /**
49442          * Causes a promise to be rejected if it does not get fulfilled before
49443          * some milliseconds time out.
49444          * @param {Any*} promise
49445          * @param {Number} milliseconds timeout
49446          * @param {Any*} custom error message or Error object (optional)
49447          * @returns a promise for the resolution of the given promise if it is
49448          * fulfilled before the timeout, otherwise rejected.
49449          */
49450         Q.timeout = function (object, ms, error) {
49451             return Q(object).timeout(ms, error);
49452         };
49453
49454         Promise.prototype.timeout = function (ms, error) {
49455             var deferred = defer();
49456             var timeoutId = setTimeout(function () {
49457                 if (!error || "string" === typeof error) {
49458                     error = new Error(error || "Timed out after " + ms + " ms");
49459                     error.code = "ETIMEDOUT";
49460                 }
49461                 deferred.reject(error);
49462             }, ms);
49463
49464             this.then(function (value) {
49465                 clearTimeout(timeoutId);
49466                 deferred.resolve(value);
49467             }, function (exception) {
49468                 clearTimeout(timeoutId);
49469                 deferred.reject(exception);
49470             }, deferred.notify);
49471
49472             return deferred.promise;
49473         };
49474
49475         /**
49476          * Returns a promise for the given value (or promised value), some
49477          * milliseconds after it resolved. Passes rejections immediately.
49478          * @param {Any*} promise
49479          * @param {Number} milliseconds
49480          * @returns a promise for the resolution of the given promise after milliseconds
49481          * time has elapsed since the resolution of the given promise.
49482          * If the given promise rejects, that is passed immediately.
49483          */
49484         Q.delay = function (object, timeout) {
49485             if (timeout === void 0) {
49486                 timeout = object;
49487                 object = void 0;
49488             }
49489             return Q(object).delay(timeout);
49490         };
49491
49492         Promise.prototype.delay = function (timeout) {
49493             return this.then(function (value) {
49494                 var deferred = defer();
49495                 setTimeout(function () {
49496                     deferred.resolve(value);
49497                 }, timeout);
49498                 return deferred.promise;
49499             });
49500         };
49501
49502         /**
49503          * Passes a continuation to a Node function, which is called with the given
49504          * arguments provided as an array, and returns a promise.
49505          *
49506          *      Q.nfapply(FS.readFile, [__filename])
49507          *      .then(function (content) {
49508          *      })
49509          *
49510          */
49511         Q.nfapply = function (callback, args) {
49512             return Q(callback).nfapply(args);
49513         };
49514
49515         Promise.prototype.nfapply = function (args) {
49516             var deferred = defer();
49517             var nodeArgs = array_slice(args);
49518             nodeArgs.push(deferred.makeNodeResolver());
49519             this.fapply(nodeArgs).fail(deferred.reject);
49520             return deferred.promise;
49521         };
49522
49523         /**
49524          * Passes a continuation to a Node function, which is called with the given
49525          * arguments provided individually, and returns a promise.
49526          * @example
49527          * Q.nfcall(FS.readFile, __filename)
49528          * .then(function (content) {
49529          * })
49530          *
49531          */
49532         Q.nfcall = function (callback /*...args*/) {
49533             var args = array_slice(arguments, 1);
49534             return Q(callback).nfapply(args);
49535         };
49536
49537         Promise.prototype.nfcall = function (/*...args*/) {
49538             var nodeArgs = array_slice(arguments);
49539             var deferred = defer();
49540             nodeArgs.push(deferred.makeNodeResolver());
49541             this.fapply(nodeArgs).fail(deferred.reject);
49542             return deferred.promise;
49543         };
49544
49545         /**
49546          * Wraps a NodeJS continuation passing function and returns an equivalent
49547          * version that returns a promise.
49548          * @example
49549          * Q.nfbind(FS.readFile, __filename)("utf-8")
49550          * .then(console.log)
49551          * .done()
49552          */
49553         Q.nfbind =
49554         Q.denodeify = function (callback /*...args*/) {
49555             if (callback === undefined) {
49556                 throw new Error("Q can't wrap an undefined function");
49557             }
49558             var baseArgs = array_slice(arguments, 1);
49559             return function () {
49560                 var nodeArgs = baseArgs.concat(array_slice(arguments));
49561                 var deferred = defer();
49562                 nodeArgs.push(deferred.makeNodeResolver());
49563                 Q(callback).fapply(nodeArgs).fail(deferred.reject);
49564                 return deferred.promise;
49565             };
49566         };
49567
49568         Promise.prototype.nfbind =
49569         Promise.prototype.denodeify = function (/*...args*/) {
49570             var args = array_slice(arguments);
49571             args.unshift(this);
49572             return Q.denodeify.apply(void 0, args);
49573         };
49574
49575         Q.nbind = function (callback, thisp /*...args*/) {
49576             var baseArgs = array_slice(arguments, 2);
49577             return function () {
49578                 var nodeArgs = baseArgs.concat(array_slice(arguments));
49579                 var deferred = defer();
49580                 nodeArgs.push(deferred.makeNodeResolver());
49581                 function bound() {
49582                     return callback.apply(thisp, arguments);
49583                 }
49584                 Q(bound).fapply(nodeArgs).fail(deferred.reject);
49585                 return deferred.promise;
49586             };
49587         };
49588
49589         Promise.prototype.nbind = function (/*thisp, ...args*/) {
49590             var args = array_slice(arguments, 0);
49591             args.unshift(this);
49592             return Q.nbind.apply(void 0, args);
49593         };
49594
49595         /**
49596          * Calls a method of a Node-style object that accepts a Node-style
49597          * callback with a given array of arguments, plus a provided callback.
49598          * @param object an object that has the named method
49599          * @param {String} name name of the method of object
49600          * @param {Array} args arguments to pass to the method; the callback
49601          * will be provided by Q and appended to these arguments.
49602          * @returns a promise for the value or error
49603          */
49604         Q.nmapply = // XXX As proposed by "Redsandro"
49605         Q.npost = function (object, name, args) {
49606             return Q(object).npost(name, args);
49607         };
49608
49609         Promise.prototype.nmapply = // XXX As proposed by "Redsandro"
49610         Promise.prototype.npost = function (name, args) {
49611             var nodeArgs = array_slice(args || []);
49612             var deferred = defer();
49613             nodeArgs.push(deferred.makeNodeResolver());
49614             this.dispatch("post", [name, nodeArgs]).fail(deferred.reject);
49615             return deferred.promise;
49616         };
49617
49618         /**
49619          * Calls a method of a Node-style object that accepts a Node-style
49620          * callback, forwarding the given variadic arguments, plus a provided
49621          * callback argument.
49622          * @param object an object that has the named method
49623          * @param {String} name name of the method of object
49624          * @param ...args arguments to pass to the method; the callback will
49625          * be provided by Q and appended to these arguments.
49626          * @returns a promise for the value or error
49627          */
49628         Q.nsend = // XXX Based on Mark Miller's proposed "send"
49629         Q.nmcall = // XXX Based on "Redsandro's" proposal
49630         Q.ninvoke = function (object, name /*...args*/) {
49631             var nodeArgs = array_slice(arguments, 2);
49632             var deferred = defer();
49633             nodeArgs.push(deferred.makeNodeResolver());
49634             Q(object).dispatch("post", [name, nodeArgs]).fail(deferred.reject);
49635             return deferred.promise;
49636         };
49637
49638         Promise.prototype.nsend = // XXX Based on Mark Miller's proposed "send"
49639         Promise.prototype.nmcall = // XXX Based on "Redsandro's" proposal
49640         Promise.prototype.ninvoke = function (name /*...args*/) {
49641             var nodeArgs = array_slice(arguments, 1);
49642             var deferred = defer();
49643             nodeArgs.push(deferred.makeNodeResolver());
49644             this.dispatch("post", [name, nodeArgs]).fail(deferred.reject);
49645             return deferred.promise;
49646         };
49647
49648         /**
49649          * If a function would like to support both Node continuation-passing-style and
49650          * promise-returning-style, it can end its internal promise chain with
49651          * `nodeify(nodeback)`, forwarding the optional nodeback argument.  If the user
49652          * elects to use a nodeback, the result will be sent there.  If they do not
49653          * pass a nodeback, they will receive the result promise.
49654          * @param object a result (or a promise for a result)
49655          * @param {Function} nodeback a Node.js-style callback
49656          * @returns either the promise or nothing
49657          */
49658         Q.nodeify = nodeify;
49659         function nodeify(object, nodeback) {
49660             return Q(object).nodeify(nodeback);
49661         }
49662
49663         Promise.prototype.nodeify = function (nodeback) {
49664             if (nodeback) {
49665                 this.then(function (value) {
49666                     Q.nextTick(function () {
49667                         nodeback(null, value);
49668                     });
49669                 }, function (error) {
49670                     Q.nextTick(function () {
49671                         nodeback(error);
49672                     });
49673                 });
49674             } else {
49675                 return this;
49676             }
49677         };
49678
49679         Q.noConflict = function() {
49680             throw new Error("Q.noConflict only works when Q is used as a global");
49681         };
49682
49683         // All code before this point will be filtered from stack traces.
49684         var qEndingLine = captureLine();
49685
49686         return Q;
49687
49688         });
49689         });
49690
49691         var bubbleApi = 'https://dev.virtualearth.net/mapcontrol/HumanScaleServices/GetBubbles.ashx?';
49692         var streetsideImagesApi = 'https://t.ssl.ak.tiles.virtualearth.net/tiles/';
49693         var bubbleAppKey = 'AuftgJsO0Xs8Ts4M1xZUQJQXJNsvmh3IV8DkNieCiy3tCwCUMq76-WpkrBtNAuEm';
49694         var pannellumViewerCSS = 'pannellum-streetside/pannellum.css';
49695         var pannellumViewerJS = 'pannellum-streetside/pannellum.js';
49696         var maxResults$2 = 2000;
49697         var tileZoom$2 = 16.5;
49698         var tiler$5 = utilTiler().zoomExtent([tileZoom$2, tileZoom$2]).skipNullIsland(true);
49699         var dispatch$6 = dispatch('loadedBubbles', 'viewerChanged');
49700         var minHfov = 10;         // zoom in degrees:  20, 10, 5
49701         var maxHfov = 90;         // zoom out degrees
49702         var defaultHfov = 45;
49703
49704         var _hires = false;
49705         var _resolution = 512;    // higher numbers are slower - 512, 1024, 2048, 4096
49706         var _currScene = 0;
49707         var _ssCache;
49708         var _pannellumViewer;
49709         var _sceneOptions;
49710         var _dataUrlArray = [];
49711
49712
49713         /**
49714          * abortRequest().
49715          */
49716         function abortRequest$5(i) {
49717             i.abort();
49718         }
49719
49720
49721         /**
49722          * localeTimeStamp().
49723          */
49724         function localeTimestamp(s) {
49725             if (!s) return null;
49726             var detected = utilDetect();
49727             var options = { day: 'numeric', month: 'short', year: 'numeric' };
49728             var d = new Date(s);
49729             if (isNaN(d.getTime())) return null;
49730             return d.toLocaleString(detected.locale, options);
49731         }
49732
49733
49734         /**
49735          * loadTiles() wraps the process of generating tiles and then fetching image points for each tile.
49736          */
49737         function loadTiles$2(which, url, projection, margin) {
49738             var tiles = tiler$5.margin(margin).getTiles(projection);
49739
49740             // abort inflight requests that are no longer needed
49741             var cache = _ssCache[which];
49742             Object.keys(cache.inflight).forEach(function(k) {
49743                 var wanted = tiles.find(function(tile) { return k.indexOf(tile.id + ',') === 0; });
49744                 if (!wanted) {
49745                     abortRequest$5(cache.inflight[k]);
49746                     delete cache.inflight[k];
49747                 }
49748             });
49749
49750             tiles.forEach(function (tile) {
49751                loadNextTilePage$2(which, url, tile);
49752             });
49753         }
49754
49755         /**
49756          * loadNextTilePage() load data for the next tile page in line.
49757          */
49758         function loadNextTilePage$2(which, url, tile) {
49759             var cache = _ssCache[which];
49760             var nextPage = cache.nextPage[tile.id] || 0;
49761             var id = tile.id + ',' + String(nextPage);
49762             if (cache.loaded[id] || cache.inflight[id]) return;
49763
49764             cache.inflight[id] = getBubbles(url, tile, function(bubbles) {
49765                 cache.loaded[id] = true;
49766                 delete cache.inflight[id];
49767                 if (!bubbles) return;
49768
49769                 // [].shift() removes the first element, some statistics info, not a bubble point
49770                 bubbles.shift();
49771
49772                 var features = bubbles.map(function(bubble) {
49773                     if (cache.points[bubble.id]) return null;  // skip duplicates
49774
49775                     var loc = [bubble.lo, bubble.la];
49776                     var d = {
49777                         loc: loc,
49778                         key: bubble.id,
49779                         ca: bubble.he,
49780                         captured_at: bubble.cd,
49781                         captured_by: 'microsoft',
49782                         // nbn: bubble.nbn,
49783                         // pbn: bubble.pbn,
49784                         // ad: bubble.ad,
49785                         // rn: bubble.rn,
49786                         pr: bubble.pr,  // previous
49787                         ne: bubble.ne,  // next
49788                         pano: true,
49789                         sequenceKey: null
49790                     };
49791
49792                     cache.points[bubble.id] = d;
49793
49794                     // a sequence starts here
49795                     if (bubble.pr === undefined) {
49796                         cache.leaders.push(bubble.id);
49797                     }
49798
49799                     return {
49800                         minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
49801                     };
49802
49803                 }).filter(Boolean);
49804
49805                 cache.rtree.load(features);
49806
49807                 connectSequences();
49808
49809                 if (which === 'bubbles') {
49810                     dispatch$6.call('loadedBubbles');
49811                 }
49812             });
49813         }
49814
49815
49816         // call this sometimes to connect the bubbles into sequences
49817         function connectSequences() {
49818             var cache = _ssCache.bubbles;
49819             var keepLeaders = [];
49820
49821             for (var i = 0; i < cache.leaders.length; i++) {
49822                 var bubble = cache.points[cache.leaders[i]];
49823                 var seen = {};
49824
49825                 // try to make a sequence.. use the key of the leader bubble.
49826                 var sequence = { key: bubble.key, bubbles: [] };
49827                 var complete = false;
49828
49829                 do {
49830                     sequence.bubbles.push(bubble);
49831                     seen[bubble.key] = true;
49832
49833                     if (bubble.ne === undefined) {
49834                         complete = true;
49835                     } else {
49836                         bubble = cache.points[bubble.ne];  // advance to next
49837                     }
49838                 } while (bubble && !seen[bubble.key] && !complete);
49839
49840
49841                 if (complete) {
49842                     _ssCache.sequences[sequence.key] = sequence;
49843
49844                     // assign bubbles to the sequence
49845                     for (var j = 0; j < sequence.bubbles.length; j++) {
49846                         sequence.bubbles[j].sequenceKey = sequence.key;
49847                     }
49848
49849                     // create a GeoJSON LineString
49850                     sequence.geojson = {
49851                         type: 'LineString',
49852                         properties: { key: sequence.key },
49853                         coordinates: sequence.bubbles.map(function (d) { return d.loc; })
49854                     };
49855
49856                 } else {
49857                     keepLeaders.push(cache.leaders[i]);
49858                 }
49859             }
49860
49861             // couldn't complete these, save for later
49862             cache.leaders = keepLeaders;
49863         }
49864
49865         /**
49866          * getBubbles() handles the request to the server for a tile extent of 'bubbles' (streetside image locations).
49867          */
49868         function getBubbles(url, tile, callback) {
49869             var rect = tile.extent.rectangle();
49870             var urlForRequest = url + utilQsString({
49871                 n: rect[3],
49872                 s: rect[1],
49873                 e: rect[2],
49874                 w: rect[0],
49875                 c: maxResults$2,
49876                 appkey: bubbleAppKey,
49877                 jsCallback: '{callback}'
49878             });
49879
49880             return jsonpRequest(urlForRequest, function (data) {
49881                 if (!data || data.error) {
49882                     callback(null);
49883                 } else {
49884                     callback(data);
49885                 }
49886             });
49887         }
49888
49889
49890         // partition viewport into higher zoom tiles
49891         function partitionViewport$2(projection) {
49892             var z = geoScaleToZoom(projection.scale());
49893             var z2 = (Math.ceil(z * 2) / 2) + 2.5;   // round to next 0.5 and add 2.5
49894             var tiler = utilTiler().zoomExtent([z2, z2]);
49895
49896             return tiler.getTiles(projection)
49897                 .map(function(tile) { return tile.extent; });
49898         }
49899
49900
49901         // no more than `limit` results per partition.
49902         function searchLimited$2(limit, projection, rtree) {
49903             limit = limit || 5;
49904
49905             return partitionViewport$2(projection)
49906                 .reduce(function(result, extent) {
49907                     var found = rtree.search(extent.bbox())
49908                         .slice(0, limit)
49909                         .map(function(d) { return d.data; });
49910
49911                     return (found.length ? result.concat(found) : result);
49912                 }, []);
49913         }
49914
49915
49916         /**
49917          * getImage()
49918          */
49919         function getImage(imgInfo) {
49920             var response = q.defer();
49921             var img = new Image();
49922
49923             img.onload = function() {
49924                 var canvas = document.getElementById('canvas' + imgInfo.face);
49925                 var ctx = canvas.getContext('2d');
49926                 ctx.drawImage(img, imgInfo.x, imgInfo.y);
49927                 response.resolve({imgInfo:imgInfo, status: 'ok'});
49928             };
49929             img.onerror = function() {
49930                 response.resolve({data: imgInfo, status: 'error'});
49931             };
49932             img.setAttribute('crossorigin', '');
49933             img.src = imgInfo.url;
49934
49935             return response.promise;
49936         }
49937
49938
49939         /**
49940          * loadCanvas()
49941          */
49942         function loadCanvas(imgInfoGroup) {
49943             var response = q.defer();
49944             var getImagePromises = imgInfoGroup.map(function(imgInfo) {
49945                 return getImage(imgInfo);
49946             });
49947
49948             q.all(getImagePromises).then(function(data) {
49949                 var canvas = document.getElementById('canvas' + data[0].imgInfo.face);
49950                 switch (data[0].imgInfo.face) {
49951                     case '01':
49952                         _dataUrlArray[0] = canvas.toDataURL('image/jpeg', 1.0);
49953                         break;
49954                     case '02':
49955                         _dataUrlArray[1] = canvas.toDataURL('image/jpeg', 1.0);
49956                         break;
49957                     case '03':
49958                         _dataUrlArray[2] = canvas.toDataURL('image/jpeg', 1.0);
49959                         break;
49960                     case '10':
49961                         _dataUrlArray[3] = canvas.toDataURL('image/jpeg', 1.0);
49962                         break;
49963                     case '11':
49964                         _dataUrlArray[4] = canvas.toDataURL('image/jpeg', 1.0);
49965                         break;
49966                     case '12':
49967                         _dataUrlArray[5] = canvas.toDataURL('image/jpeg', 1.0);
49968                         break;
49969                 }
49970                 response.resolve({status:'loadCanvas for face ' + data[0].imgInfo.face + 'ok'});
49971             });
49972
49973             return response.promise;
49974         }
49975
49976
49977         function setupCanvas(selection, reset) {
49978             if (reset) {
49979                 selection.selectAll('#divForCanvasWork')
49980                     .remove();
49981             }
49982
49983             // Add the Streetside working canvases. These are used for 'stitching', or combining,
49984             // multiple images for each of the six faces, before passing to the Pannellum control as DataUrls
49985             selection.selectAll('#divForCanvasWork')
49986                 .data([0])
49987                 .enter()
49988                 .append('div')
49989                 .attr('id', 'divForCanvasWork')
49990                 .attr('display', 'none')
49991                 .selectAll('canvas')
49992                 .data(['canvas01', 'canvas02', 'canvas03', 'canvas10', 'canvas11', 'canvas12'])
49993                 .enter()
49994                 .append('canvas')
49995                 .attr('id', function(d) { return d; })
49996                 .attr('width', _resolution)
49997                 .attr('height', _resolution);
49998         }
49999
50000
50001         /**
50002          * processFaces()
50003          */
50004         function processFaces(imgFaceInfoGroups) {
50005             var response = q.defer();
50006             var loadCanvasPromises = imgFaceInfoGroups.map(function(faceImgGroup) {
50007                 return loadCanvas(faceImgGroup);
50008             });
50009
50010             q.all(loadCanvasPromises).then(function() {
50011                 response.resolve({status: 'processFaces done'});
50012             });
50013
50014             return response.promise;
50015         }
50016
50017
50018
50019         function qkToXY(qk) {
50020             var x = 0;
50021             var y = 0;
50022             var scale = 256;
50023             for (var i = qk.length; i > 0; i--) {
50024                 var key = qk[i-1];
50025                 x += (+(key === '1' || key === '3')) * scale;
50026                 y += (+(key === '2' || key === '3')) * scale;
50027                 scale *= 2;
50028             }
50029             return [x, y];
50030         }
50031
50032
50033         function getQuadKeys() {
50034             var dim = _resolution / 256;
50035             var quadKeys;
50036
50037             if (dim === 16) {
50038                 quadKeys = [
50039                     '0000','0001','0010','0011','0100','0101','0110','0111',  '1000','1001','1010','1011','1100','1101','1110','1111',
50040                     '0002','0003','0012','0013','0102','0103','0112','0113',  '1002','1003','1012','1013','1102','1103','1112','1113',
50041                     '0020','0021','0030','0031','0120','0121','0130','0131',  '1020','1021','1030','1031','1120','1121','1130','1131',
50042                     '0022','0023','0032','0033','0122','0123','0132','0133',  '1022','1023','1032','1033','1122','1123','1132','1133',
50043                     '0200','0201','0210','0211','0300','0301','0310','0311',  '1200','1201','1210','1211','1300','1301','1310','1311',
50044                     '0202','0203','0212','0213','0302','0303','0312','0313',  '1202','1203','1212','1213','1302','1303','1312','1313',
50045                     '0220','0221','0230','0231','0320','0321','0330','0331',  '1220','1221','1230','1231','1320','1321','1330','1331',
50046                     '0222','0223','0232','0233','0322','0323','0332','0333',  '1222','1223','1232','1233','1322','1323','1332','1333',
50047
50048                     '2000','2001','2010','2011','2100','2101','2110','2111',  '3000','3001','3010','3011','3100','3101','3110','3111',
50049                     '2002','2003','2012','2013','2102','2103','2112','2113',  '3002','3003','3012','3013','3102','3103','3112','3113',
50050                     '2020','2021','2030','2031','2120','2121','2130','2131',  '3020','3021','3030','3031','3120','3121','3130','3131',
50051                     '2022','2023','2032','2033','2122','2123','2132','2133',  '3022','3023','3032','3033','3122','3123','3132','3133',
50052                     '2200','2201','2210','2211','2300','2301','2310','2311',  '3200','3201','3210','3211','3300','3301','3310','3311',
50053                     '2202','2203','2212','2213','2302','2303','2312','2313',  '3202','3203','3212','3213','3302','3303','3312','3313',
50054                     '2220','2221','2230','2231','2320','2321','2330','2331',  '3220','3221','3230','3231','3320','3321','3330','3331',
50055                     '2222','2223','2232','2233','2322','2323','2332','2333',  '3222','3223','3232','3233','3322','3323','3332','3333'
50056                 ];
50057
50058             } else if (dim === 8) {
50059                 quadKeys = [
50060                     '000','001','010','011',  '100','101','110','111',
50061                     '002','003','012','013',  '102','103','112','113',
50062                     '020','021','030','031',  '120','121','130','131',
50063                     '022','023','032','033',  '122','123','132','133',
50064
50065                     '200','201','210','211',  '300','301','310','311',
50066                     '202','203','212','213',  '302','303','312','313',
50067                     '220','221','230','231',  '320','321','330','331',
50068                     '222','223','232','233',  '322','323','332','333'
50069                 ];
50070
50071             } else if (dim === 4) {
50072                 quadKeys = [
50073                     '00','01',  '10','11',
50074                     '02','03',  '12','13',
50075
50076                     '20','21',  '30','31',
50077                     '22','23',  '32','33'
50078                 ];
50079
50080             } else {  // dim === 2
50081                 quadKeys = [
50082                     '0', '1',
50083                     '2', '3'
50084                 ];
50085             }
50086
50087             return quadKeys;
50088         }
50089
50090
50091
50092         var serviceStreetside = {
50093             /**
50094              * init() initialize streetside.
50095              */
50096             init: function () {
50097                 if (!_ssCache) {
50098                     this.reset();
50099                 }
50100
50101                 this.event = utilRebind(this, dispatch$6, 'on');
50102             },
50103
50104             /**
50105              * reset() reset the cache.
50106              */
50107             reset: function () {
50108                 if (_ssCache) {
50109                     Object.values(_ssCache.bubbles.inflight).forEach(abortRequest$5);
50110                 }
50111
50112                 _ssCache = {
50113                     bubbles: { inflight: {}, loaded: {}, nextPage: {}, rtree: rbush_1(), points: {}, leaders: [] },
50114                     sequences: {}
50115                 };
50116             },
50117
50118             /**
50119              * bubbles()
50120              */
50121             bubbles: function (projection) {
50122                 var limit = 5;
50123                 return searchLimited$2(limit, projection, _ssCache.bubbles.rtree);
50124             },
50125
50126
50127             sequences: function(projection) {
50128                 var viewport = projection.clipExtent();
50129                 var min = [viewport[0][0], viewport[1][1]];
50130                 var max = [viewport[1][0], viewport[0][1]];
50131                 var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
50132                 var seen = {};
50133                 var results = [];
50134
50135                 // all sequences for bubbles in viewport
50136                 _ssCache.bubbles.rtree.search(bbox)
50137                     .forEach(function(d) {
50138                         var key = d.data.sequenceKey;
50139                         if (key && !seen[key]) {
50140                             seen[key] = true;
50141                             results.push(_ssCache.sequences[key].geojson);
50142                         }
50143                     });
50144
50145                 return results;
50146             },
50147
50148
50149             /**
50150              * loadBubbles()
50151              */
50152             loadBubbles: function (projection, margin) {
50153                 // by default: request 2 nearby tiles so we can connect sequences.
50154                 if (margin === undefined) margin = 2;
50155
50156                 loadTiles$2('bubbles', bubbleApi, projection, margin);
50157             },
50158
50159
50160             viewer: function() {
50161                 return _pannellumViewer;
50162             },
50163
50164
50165             initViewer: function () {
50166                 if (!window.pannellum) return;
50167                 if (_pannellumViewer) return;
50168
50169                 var sceneID = ++_currScene + '';
50170                 var options = {
50171                     'default': { firstScene: sceneID },
50172                     scenes: {}
50173                 };
50174                 options.scenes[sceneID] = _sceneOptions;
50175
50176                 _pannellumViewer = window.pannellum.viewer('viewer-streetside', options);
50177
50178                 _pannellumViewer
50179                     .on('mousedown', function() {
50180                         d3_select(window).on('mousemove.pannellum', function() {
50181                             dispatch$6.call('viewerChanged');
50182                         });
50183                     })
50184                     .on('mouseup', function() {
50185                         d3_select(window).on('mousemove.pannellum', null);
50186                         // continue dispatching events for a few seconds, in case viewer has inertia.
50187                         var t = timer(function(elapsed) {
50188                             dispatch$6.call('viewerChanged');
50189                             if (elapsed > 2000) {
50190                                 t.stop();
50191                             }
50192                         });
50193                     });
50194             },
50195
50196
50197             /**
50198              * loadViewer() create the streeside viewer.
50199              */
50200             loadViewer: function (context) {
50201                 var that = this;
50202
50203                 // create ms-wrapper, a photo wrapper class
50204                 var wrap = d3_select('#photoviewer').selectAll('.ms-wrapper')
50205                     .data([0]);
50206
50207                 // inject ms-wrapper into the photoviewer div
50208                 // (used by all to house each custom photo viewer)
50209                 var wrapEnter = wrap.enter()
50210                     .append('div')
50211                     .attr('id', 'ms')
50212                     .attr('class', 'photo-wrapper ms-wrapper')
50213                     .classed('hide', true);
50214
50215                 // inject div to support streetside viewer (pannellum) and attribution line
50216                 wrapEnter
50217                     .append('div')
50218                     .attr('id', 'viewer-streetside')
50219                     .append('div')
50220                     .attr('class', 'photo-attribution fillD');
50221
50222                 var controlsEnter = wrapEnter
50223                     .append('div')
50224                     .attr('class', 'photo-controls-wrap')
50225                     .append('div')
50226                     .attr('class', 'photo-controls');
50227
50228                 controlsEnter
50229                     .append('button')
50230                     .on('click.back', step(-1))
50231                     .text('◄');
50232
50233                 controlsEnter
50234                     .append('button')
50235                     .on('click.forward', step(1))
50236                     .text('►');
50237
50238
50239                 // create working canvas for stitching together images
50240                 wrap = wrap
50241                     .merge(wrapEnter)
50242                     .call(setupCanvas, true);
50243
50244                 // load streetside pannellum viewer css
50245                 d3_select('head').selectAll('#streetside-viewercss')
50246                     .data([0])
50247                     .enter()
50248                     .append('link')
50249                     .attr('id', 'streetside-viewercss')
50250                     .attr('rel', 'stylesheet')
50251                     .attr('href', context.asset(pannellumViewerCSS));
50252
50253                 // load streetside pannellum viewer js
50254                 d3_select('head').selectAll('#streetside-viewerjs')
50255                     .data([0])
50256                     .enter()
50257                     .append('script')
50258                     .attr('id', 'streetside-viewerjs')
50259                     .attr('src', context.asset(pannellumViewerJS));
50260
50261
50262                 // Register viewer resize handler
50263                 context.ui().photoviewer.on('resize', function() {
50264                     if (_pannellumViewer) {
50265                         _pannellumViewer.resize();
50266                     }
50267                 });
50268
50269
50270                 function step(stepBy) {
50271                     return function() {
50272                         var viewer = d3_select('#photoviewer');
50273                         var selected = viewer.empty() ? undefined : viewer.datum();
50274                         if (!selected) return;
50275
50276                         var nextID = (stepBy === 1 ? selected.ne : selected.pr);
50277                         var yaw = _pannellumViewer.getYaw();
50278                         var ca = selected.ca + yaw;
50279                         var origin = selected.loc;
50280
50281                         // construct a search trapezoid pointing out from current bubble
50282                         var meters = 35;
50283                         var p1 = [
50284                             origin[0] + geoMetersToLon(meters / 5, origin[1]),
50285                             origin[1]
50286                         ];
50287                         var p2 = [
50288                             origin[0] + geoMetersToLon(meters / 2, origin[1]),
50289                             origin[1] + geoMetersToLat(meters)
50290                         ];
50291                         var p3 = [
50292                             origin[0] - geoMetersToLon(meters / 2, origin[1]),
50293                             origin[1] + geoMetersToLat(meters)
50294                         ];
50295                         var p4 = [
50296                             origin[0] - geoMetersToLon(meters / 5, origin[1]),
50297                             origin[1]
50298                         ];
50299
50300                         var poly = [p1, p2, p3, p4, p1];
50301
50302                         // rotate it to face forward/backward
50303                         var angle = (stepBy === 1 ? ca : ca + 180) * (Math.PI / 180);
50304                         poly = geoRotate(poly, -angle, origin);
50305
50306                         var extent = poly.reduce(function(extent, point) {
50307                             return extent.extend(geoExtent(point));
50308                         }, geoExtent());
50309
50310                         // find nearest other bubble in the search polygon
50311                         var minDist = Infinity;
50312                         _ssCache.bubbles.rtree.search(extent.bbox())
50313                             .forEach(function(d) {
50314                                 if (d.data.key === selected.key) return;
50315                                 if (!geoPointInPolygon(d.data.loc, poly)) return;
50316
50317                                 var dist = geoVecLength(d.data.loc, selected.loc);
50318                                 var theta = selected.ca - d.data.ca;
50319                                 var minTheta = Math.min(Math.abs(theta), 360 - Math.abs(theta));
50320                                 if (minTheta > 20) {
50321                                     dist += 5;  // penalize distance if camera angles don't match
50322                                 }
50323
50324                                 if (dist < minDist) {
50325                                     nextID = d.data.key;
50326                                     minDist = dist;
50327                                 }
50328                             });
50329
50330                         var nextBubble = nextID && _ssCache.bubbles.points[nextID];
50331                         if (!nextBubble) return;
50332
50333                         context.map().centerEase(nextBubble.loc);
50334
50335                         that.selectImage(nextBubble)
50336                             .then(function(r) {
50337                                 if (r.status === 'ok') {
50338                                     _sceneOptions.yaw = yaw;
50339                                     that.showViewer();
50340                                 }
50341                             });
50342                     };
50343                 }
50344             },
50345
50346             /**
50347              * showViewer()
50348              */
50349             showViewer: function (yaw) {
50350                 if (!_sceneOptions) return;
50351
50352                 if (yaw !== undefined) {
50353                     _sceneOptions.yaw = yaw;
50354                 }
50355
50356                 if (!_pannellumViewer) {
50357                     this.initViewer();
50358                 } else {
50359                     // make a new scene
50360                     var sceneID = ++_currScene + '';
50361                     _pannellumViewer
50362                         .addScene(sceneID, _sceneOptions)
50363                         .loadScene(sceneID);
50364
50365                     // remove previous scene
50366                     if (_currScene > 2) {
50367                         sceneID = (_currScene - 1) + '';
50368                         _pannellumViewer
50369                             .removeScene(sceneID);
50370                     }
50371                 }
50372
50373                 var wrap = d3_select('#photoviewer')
50374                     .classed('hide', false);
50375
50376                 var isHidden = wrap.selectAll('.photo-wrapper.ms-wrapper.hide').size();
50377
50378                 if (isHidden) {
50379                     wrap
50380                         .selectAll('.photo-wrapper:not(.ms-wrapper)')
50381                         .classed('hide', true);
50382
50383                     wrap
50384                         .selectAll('.photo-wrapper.ms-wrapper')
50385                         .classed('hide', false);
50386                 }
50387
50388                 return this;
50389             },
50390
50391             /**
50392              * hideViewer()
50393              */
50394             hideViewer: function () {
50395                 var viewer = d3_select('#photoviewer');
50396                 if (!viewer.empty()) viewer.datum(null);
50397
50398                 viewer
50399                     .classed('hide', true)
50400                     .selectAll('.photo-wrapper')
50401                     .classed('hide', true);
50402
50403                 d3_selectAll('.viewfield-group, .sequence, .icon-sign')
50404                     .classed('currentView', false);
50405
50406                 return this.setStyles(null, true);
50407             },
50408
50409             /**
50410              * selectImage().
50411              */
50412             selectImage: function (d) {
50413                 var response = q.defer();
50414                 var that = this;
50415
50416                 var viewer = d3_select('#photoviewer');
50417                 if (!viewer.empty()) viewer.datum(d);
50418
50419                 this.setStyles(null, true);
50420
50421                 var wrap = d3_select('#photoviewer .ms-wrapper');
50422                 var attribution = wrap.selectAll('.photo-attribution').html('');
50423
50424                 wrap.selectAll('.pnlm-load-box')   // display "loading.."
50425                     .style('display', 'block');
50426
50427                 if (!d) {
50428                     response.resolve({status: 'ok'});
50429                     return response.promise;
50430                 }
50431
50432                 var line1 = attribution
50433                     .append('div')
50434                     .attr('class', 'attribution-row');
50435
50436                 // Add hires checkbox
50437                 var label = line1
50438                     .append('label')
50439                     .attr('class', 'streetside-hires');
50440
50441                 label
50442                     .append('input')
50443                     .attr('type', 'checkbox')
50444                     .attr('id', 'streetside-hires-input')
50445                     .property('checked', _hires)
50446                     .on('click', function() {
50447                         event.stopPropagation();
50448
50449                         _hires = !_hires;
50450                         _resolution = _hires ? 1024 : 512;
50451                         wrap.call(setupCanvas, true);
50452
50453                         var viewstate = {
50454                             yaw: _pannellumViewer.getYaw(),
50455                             pitch: _pannellumViewer.getPitch(),
50456                             hfov: _pannellumViewer.getHfov()
50457                         };
50458
50459                         that.selectImage(d)
50460                             .then(function(r) {
50461                                 if (r.status === 'ok') {
50462                                     _sceneOptions = Object.assign(_sceneOptions, viewstate);
50463                                     that.showViewer();
50464                                 }
50465                             });
50466                     });
50467
50468                 label
50469                     .append('span')
50470                     .text(t('streetside.hires'));
50471
50472
50473                 var captureInfo = line1
50474                     .append('div')
50475                     .attr('class', 'attribution-capture-info');
50476
50477                 // Add capture date
50478                 if (d.captured_by) {
50479                     var yyyy = (new Date()).getFullYear();
50480
50481                     captureInfo
50482                         .append('a')
50483                         .attr('class', 'captured_by')
50484                         .attr('target', '_blank')
50485                         .attr('href', 'https://www.microsoft.com/en-us/maps/streetside')
50486                         .text('©' + yyyy + ' Microsoft');
50487
50488                     captureInfo
50489                         .append('span')
50490                         .text('|');
50491                 }
50492
50493                 if (d.captured_at) {
50494                     captureInfo
50495                         .append('span')
50496                         .attr('class', 'captured_at')
50497                         .text(localeTimestamp(d.captured_at));
50498                 }
50499
50500                 // Add image links
50501                 var line2 = attribution
50502                     .append('div')
50503                     .attr('class', 'attribution-row');
50504
50505                 line2
50506                     .append('a')
50507                     .attr('class', 'image-view-link')
50508                     .attr('target', '_blank')
50509                     .attr('href', 'https://www.bing.com/maps?cp=' + d.loc[1] + '~' + d.loc[0] +
50510                         '&lvl=17&dir=' + d.ca + '&style=x&v=2&sV=1')
50511                     .text(t('streetside.view_on_bing'));
50512
50513                 line2
50514                     .append('a')
50515                     .attr('class', 'image-report-link')
50516                     .attr('target', '_blank')
50517                     .attr('href', 'https://www.bing.com/maps/privacyreport/streetsideprivacyreport?bubbleid=' + encodeURIComponent(d.key) +
50518                         '&focus=photo&lat=' + d.loc[1] + '&lng=' + d.loc[0] + '&z=17')
50519                     .text(t('streetside.report'));
50520
50521
50522                 var bubbleIdQuadKey = d.key.toString(4);
50523                 var paddingNeeded = 16 - bubbleIdQuadKey.length;
50524                 for (var i = 0; i < paddingNeeded; i++) {
50525                     bubbleIdQuadKey = '0' + bubbleIdQuadKey;
50526                 }
50527                 var imgUrlPrefix = streetsideImagesApi + 'hs' + bubbleIdQuadKey;
50528                 var imgUrlSuffix = '.jpg?g=6338&n=z';
50529
50530                 // Cubemap face code order matters here: front=01, right=02, back=03, left=10, up=11, down=12
50531                 var faceKeys = ['01','02','03','10','11','12'];
50532
50533                 // Map images to cube faces
50534                 var quadKeys = getQuadKeys();
50535                 var faces = faceKeys.map(function(faceKey) {
50536                     return quadKeys.map(function(quadKey) {
50537                         var xy = qkToXY(quadKey);
50538                         return {
50539                             face: faceKey,
50540                             url: imgUrlPrefix + faceKey + quadKey + imgUrlSuffix,
50541                             x: xy[0],
50542                             y: xy[1]
50543                         };
50544                     });
50545                 });
50546
50547                 processFaces(faces).then(function() {
50548                     _sceneOptions = {
50549                         showFullscreenCtrl: false,
50550                         autoLoad: true,
50551                         compass: true,
50552                         northOffset: d.ca,
50553                         yaw: 0,
50554                         minHfov: minHfov,
50555                         maxHfov: maxHfov,
50556                         hfov: defaultHfov,
50557                         type: 'cubemap',
50558                         cubeMap: [
50559                             _dataUrlArray[0],
50560                             _dataUrlArray[1],
50561                             _dataUrlArray[2],
50562                             _dataUrlArray[3],
50563                             _dataUrlArray[4],
50564                             _dataUrlArray[5]
50565                         ]
50566                     };
50567                     response.resolve({status: 'ok'});
50568                 });
50569
50570                 return response.promise;
50571             },
50572
50573
50574             getSequenceKeyForBubble: function(d) {
50575                 return d && d.sequenceKey;
50576             },
50577
50578
50579             // Updates the currently highlighted sequence and selected bubble.
50580             // Reset is only necessary when interacting with the viewport because
50581             // this implicitly changes the currently selected bubble/sequence
50582             setStyles: function (hovered, reset) {
50583                 if (reset) {  // reset all layers
50584                     d3_selectAll('.viewfield-group')
50585                         .classed('highlighted', false)
50586                         .classed('hovered', false)
50587                         .classed('currentView', false);
50588
50589                     d3_selectAll('.sequence')
50590                         .classed('highlighted', false)
50591                         .classed('currentView', false);
50592                 }
50593
50594                 var hoveredBubbleKey = hovered && hovered.key;
50595                 var hoveredSequenceKey = this.getSequenceKeyForBubble(hovered);
50596                 var hoveredSequence = hoveredSequenceKey && _ssCache.sequences[hoveredSequenceKey];
50597                 var hoveredBubbleKeys =  (hoveredSequence && hoveredSequence.bubbles.map(function (d) { return d.key; })) || [];
50598
50599                 var viewer = d3_select('#photoviewer');
50600                 var selected = viewer.empty() ? undefined : viewer.datum();
50601                 var selectedBubbleKey = selected && selected.key;
50602                 var selectedSequenceKey = this.getSequenceKeyForBubble(selected);
50603                 var selectedSequence = selectedSequenceKey && _ssCache.sequences[selectedSequenceKey];
50604                 var selectedBubbleKeys = (selectedSequence && selectedSequence.bubbles.map(function (d) { return d.key; })) || [];
50605
50606                 // highlight sibling viewfields on either the selected or the hovered sequences
50607                 var highlightedBubbleKeys = utilArrayUnion(hoveredBubbleKeys, selectedBubbleKeys);
50608
50609                 d3_selectAll('.layer-streetside-images .viewfield-group')
50610                     .classed('highlighted', function (d) { return highlightedBubbleKeys.indexOf(d.key) !== -1; })
50611                     .classed('hovered', function (d) { return d.key === hoveredBubbleKey; })
50612                     .classed('currentView', function (d) { return d.key === selectedBubbleKey; });
50613
50614                 d3_selectAll('.layer-streetside-images .sequence')
50615                     .classed('highlighted', function (d) { return d.properties.key === hoveredSequenceKey; })
50616                     .classed('currentView', function (d) { return d.properties.key === selectedSequenceKey; });
50617
50618                 // update viewfields if needed
50619                 d3_selectAll('.viewfield-group .viewfield')
50620                     .attr('d', viewfieldPath);
50621
50622                 function viewfieldPath() {
50623                     var d = this.parentNode.__data__;
50624                     if (d.pano && d.key !== selectedBubbleKey) {
50625                         return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
50626                     } else {
50627                         return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
50628                     }
50629                 }
50630
50631                 return this;
50632             },
50633
50634             /**
50635              * cache().
50636              */
50637             cache: function () {
50638                 return _ssCache;
50639             }
50640         };
50641
50642         var apibase$4 = 'https://taginfo.openstreetmap.org/api/4/';
50643         var _inflight$2 = {};
50644         var _popularKeys = {};
50645         var _taginfoCache = {};
50646
50647         var tag_sorts = {
50648             point: 'count_nodes',
50649             vertex: 'count_nodes',
50650             area: 'count_ways',
50651             line: 'count_ways'
50652         };
50653         var tag_sort_members = {
50654             point: 'count_node_members',
50655             vertex: 'count_node_members',
50656             area: 'count_way_members',
50657             line: 'count_way_members',
50658             relation: 'count_relation_members'
50659         };
50660         var tag_filters = {
50661             point: 'nodes',
50662             vertex: 'nodes',
50663             area: 'ways',
50664             line: 'ways'
50665         };
50666         var tag_members_fractions = {
50667             point: 'count_node_members_fraction',
50668             vertex: 'count_node_members_fraction',
50669             area: 'count_way_members_fraction',
50670             line: 'count_way_members_fraction',
50671             relation: 'count_relation_members_fraction'
50672         };
50673
50674
50675         function sets(params, n, o) {
50676             if (params.geometry && o[params.geometry]) {
50677                 params[n] = o[params.geometry];
50678             }
50679             return params;
50680         }
50681
50682
50683         function setFilter(params) {
50684             return sets(params, 'filter', tag_filters);
50685         }
50686
50687
50688         function setSort(params) {
50689             return sets(params, 'sortname', tag_sorts);
50690         }
50691
50692
50693         function setSortMembers(params) {
50694             return sets(params, 'sortname', tag_sort_members);
50695         }
50696
50697
50698         function clean(params) {
50699             return utilObjectOmit(params, ['geometry', 'debounce']);
50700         }
50701
50702
50703         function filterKeys(type) {
50704             var count_type = type ? 'count_' + type : 'count_all';
50705             return function(d) {
50706                 return parseFloat(d[count_type]) > 2500 || d.in_wiki;
50707             };
50708         }
50709
50710
50711         function filterMultikeys(prefix) {
50712             return function(d) {
50713                 // d.key begins with prefix, and d.key contains no additional ':'s
50714                 var re = new RegExp('^' + prefix + '(.*)$');
50715                 var matches = d.key.match(re) || [];
50716                 return (matches.length === 2 && matches[1].indexOf(':') === -1);
50717             };
50718         }
50719
50720
50721         function filterValues(allowUpperCase) {
50722             return function(d) {
50723                 if (d.value.match(/[;,]/) !== null) return false;  // exclude some punctuation
50724                 if (!allowUpperCase && d.value.match(/[A-Z*]/) !== null) return false;  // exclude uppercase letters
50725                 return parseFloat(d.fraction) > 0.0;
50726             };
50727         }
50728
50729
50730         function filterRoles(geometry) {
50731             return function(d) {
50732                 if (d.role === '') return false; // exclude empty role
50733                 if (d.role.match(/[A-Z*;,]/) !== null) return false;  // exclude uppercase letters and some punctuation
50734                 return parseFloat(d[tag_members_fractions[geometry]]) > 0.0;
50735             };
50736         }
50737
50738
50739         function valKey(d) {
50740             return {
50741                 value: d.key,
50742                 title: d.key
50743             };
50744         }
50745
50746
50747         function valKeyDescription(d) {
50748             return {
50749                 value: d.value,
50750                 title: d.description || d.value
50751             };
50752         }
50753
50754
50755         function roleKey(d) {
50756             return {
50757                 value: d.role,
50758                 title: d.role
50759             };
50760         }
50761
50762
50763         // sort keys with ':' lower than keys without ':'
50764         function sortKeys(a, b) {
50765             return (a.key.indexOf(':') === -1 && b.key.indexOf(':') !== -1) ? -1
50766                 : (a.key.indexOf(':') !== -1 && b.key.indexOf(':') === -1) ? 1
50767                 : 0;
50768         }
50769
50770
50771         var debouncedRequest$1 = debounce(request$1, 300, { leading: false });
50772
50773         function request$1(url, params, exactMatch, callback, loaded) {
50774             if (_inflight$2[url]) return;
50775
50776             if (checkCache(url, params, exactMatch, callback)) return;
50777
50778             var controller = new AbortController();
50779             _inflight$2[url] = controller;
50780
50781             d3_json(url, { signal: controller.signal })
50782                 .then(function(result) {
50783                     delete _inflight$2[url];
50784                     if (loaded) loaded(null, result);
50785                 })
50786                 .catch(function(err) {
50787                     delete _inflight$2[url];
50788                     if (err.name === 'AbortError') return;
50789                     if (loaded) loaded(err.message);
50790                 });
50791         }
50792
50793
50794         function checkCache(url, params, exactMatch, callback) {
50795             var rp = params.rp || 25;
50796             var testQuery = params.query || '';
50797             var testUrl = url;
50798
50799             do {
50800                 var hit = _taginfoCache[testUrl];
50801
50802                 // exact match, or shorter match yielding fewer than max results (rp)
50803                 if (hit && (url === testUrl || hit.length < rp)) {
50804                     callback(null, hit);
50805                     return true;
50806                 }
50807
50808                 // don't try to shorten the query
50809                 if (exactMatch || !testQuery.length) return false;
50810
50811                 // do shorten the query to see if we already have a cached result
50812                 // that has returned fewer than max results (rp)
50813                 testQuery = testQuery.slice(0, -1);
50814                 testUrl = url.replace(/&query=(.*?)&/, '&query=' + testQuery + '&');
50815             } while (testQuery.length >= 0);
50816
50817             return false;
50818         }
50819
50820
50821         var serviceTaginfo = {
50822
50823             init: function() {
50824                 _inflight$2 = {};
50825                 _taginfoCache = {};
50826                 _popularKeys = {
50827                     postal_code: true   // #5377
50828                 };
50829
50830                 // Fetch popular keys.  We'll exclude these from `values`
50831                 // lookups because they stress taginfo, and they aren't likely
50832                 // to yield meaningful autocomplete results.. see #3955
50833                 var params = {
50834                     rp: 100,
50835                     sortname: 'values_all',
50836                     sortorder: 'desc',
50837                     page: 1,
50838                     debounce: false,
50839                     lang: currentLocale
50840                 };
50841                 this.keys(params, function(err, data) {
50842                     if (err) return;
50843                     data.forEach(function(d) {
50844                         if (d.value === 'opening_hours') return;  // exception
50845                         _popularKeys[d.value] = true;
50846                     });
50847                 });
50848             },
50849
50850
50851             reset: function() {
50852                 Object.values(_inflight$2).forEach(function(controller) { controller.abort(); });
50853                 _inflight$2 = {};
50854             },
50855
50856
50857             keys: function(params, callback) {
50858                 var doRequest = params.debounce ? debouncedRequest$1 : request$1;
50859                 params = clean(setSort(params));
50860                 params = Object.assign({
50861                     rp: 10,
50862                     sortname: 'count_all',
50863                     sortorder: 'desc',
50864                     page: 1,
50865                     lang: currentLocale
50866                 }, params);
50867
50868                 var url = apibase$4 + 'keys/all?' + utilQsString(params);
50869                 doRequest(url, params, false, callback, function(err, d) {
50870                     if (err) {
50871                         callback(err);
50872                     } else {
50873                         var f = filterKeys(params.filter);
50874                         var result = d.data.filter(f).sort(sortKeys).map(valKey);
50875                         _taginfoCache[url] = result;
50876                         callback(null, result);
50877                     }
50878                 });
50879             },
50880
50881
50882             multikeys: function(params, callback) {
50883                 var doRequest = params.debounce ? debouncedRequest$1 : request$1;
50884                 params = clean(setSort(params));
50885                 params = Object.assign({
50886                     rp: 25,
50887                     sortname: 'count_all',
50888                     sortorder: 'desc',
50889                     page: 1,
50890                     lang: currentLocale
50891                 }, params);
50892
50893                 var prefix = params.query;
50894                 var url = apibase$4 + 'keys/all?' + utilQsString(params);
50895                 doRequest(url, params, true, callback, function(err, d) {
50896                     if (err) {
50897                         callback(err);
50898                     } else {
50899                         var f = filterMultikeys(prefix);
50900                         var result = d.data.filter(f).map(valKey);
50901                         _taginfoCache[url] = result;
50902                         callback(null, result);
50903                     }
50904                 });
50905             },
50906
50907
50908             values: function(params, callback) {
50909                 // Exclude popular keys from values lookups.. see #3955
50910                 var key = params.key;
50911                 if (key && _popularKeys[key]) {
50912                     callback(null, []);
50913                     return;
50914                 }
50915
50916                 var doRequest = params.debounce ? debouncedRequest$1 : request$1;
50917                 params = clean(setSort(setFilter(params)));
50918                 params = Object.assign({
50919                     rp: 25,
50920                     sortname: 'count_all',
50921                     sortorder: 'desc',
50922                     page: 1,
50923                     lang: currentLocale
50924                 }, params);
50925
50926                 var url = apibase$4 + 'key/values?' + utilQsString(params);
50927                 doRequest(url, params, false, callback, function(err, d) {
50928                     if (err) {
50929                         callback(err);
50930                     } else {
50931                         // In most cases we prefer taginfo value results with lowercase letters.
50932                         // A few OSM keys expect values to contain uppercase values (see #3377).
50933                         // This is not an exhaustive list (e.g. `name` also has uppercase values)
50934                         // but these are the fields where taginfo value lookup is most useful.
50935                         var re = /network|taxon|genus|species|brand|grape_variety|royal_cypher|listed_status|booth|rating|stars|:output|_hours|_times|_ref|manufacturer/;
50936                         var allowUpperCase = re.test(params.key);
50937                         var f = filterValues(allowUpperCase);
50938
50939                         var result = d.data.filter(f).map(valKeyDescription);
50940                         _taginfoCache[url] = result;
50941                         callback(null, result);
50942                     }
50943                 });
50944             },
50945
50946
50947             roles: function(params, callback) {
50948                 var doRequest = params.debounce ? debouncedRequest$1 : request$1;
50949                 var geometry = params.geometry;
50950                 params = clean(setSortMembers(params));
50951                 params = Object.assign({
50952                     rp: 25,
50953                     sortname: 'count_all_members',
50954                     sortorder: 'desc',
50955                     page: 1,
50956                     lang: currentLocale
50957                 }, params);
50958
50959                 var url = apibase$4 + 'relation/roles?' + utilQsString(params);
50960                 doRequest(url, params, true, callback, function(err, d) {
50961                     if (err) {
50962                         callback(err);
50963                     } else {
50964                         var f = filterRoles(geometry);
50965                         var result = d.data.filter(f).map(roleKey);
50966                         _taginfoCache[url] = result;
50967                         callback(null, result);
50968                     }
50969                 });
50970             },
50971
50972
50973             docs: function(params, callback) {
50974                 var doRequest = params.debounce ? debouncedRequest$1 : request$1;
50975                 params = clean(setSort(params));
50976
50977                 var path = 'key/wiki_pages?';
50978                 if (params.value) {
50979                     path = 'tag/wiki_pages?';
50980                 } else if (params.rtype) {
50981                     path = 'relation/wiki_pages?';
50982                 }
50983
50984                 var url = apibase$4 + path + utilQsString(params);
50985                 doRequest(url, params, true, callback, function(err, d) {
50986                     if (err) {
50987                         callback(err);
50988                     } else {
50989                         _taginfoCache[url] = d.data;
50990                         callback(null, d.data);
50991                     }
50992                 });
50993             },
50994
50995
50996             apibase: function(_) {
50997                 if (!arguments.length) return apibase$4;
50998                 apibase$4 = _;
50999                 return this;
51000             }
51001
51002         };
51003
51004         var helpers = createCommonjsModule(function (module, exports) {
51005         Object.defineProperty(exports, "__esModule", { value: true });
51006         /**
51007          * @module helpers
51008          */
51009         /**
51010          * Earth Radius used with the Harvesine formula and approximates using a spherical (non-ellipsoid) Earth.
51011          *
51012          * @memberof helpers
51013          * @type {number}
51014          */
51015         exports.earthRadius = 6371008.8;
51016         /**
51017          * Unit of measurement factors using a spherical (non-ellipsoid) earth radius.
51018          *
51019          * @memberof helpers
51020          * @type {Object}
51021          */
51022         exports.factors = {
51023             centimeters: exports.earthRadius * 100,
51024             centimetres: exports.earthRadius * 100,
51025             degrees: exports.earthRadius / 111325,
51026             feet: exports.earthRadius * 3.28084,
51027             inches: exports.earthRadius * 39.370,
51028             kilometers: exports.earthRadius / 1000,
51029             kilometres: exports.earthRadius / 1000,
51030             meters: exports.earthRadius,
51031             metres: exports.earthRadius,
51032             miles: exports.earthRadius / 1609.344,
51033             millimeters: exports.earthRadius * 1000,
51034             millimetres: exports.earthRadius * 1000,
51035             nauticalmiles: exports.earthRadius / 1852,
51036             radians: 1,
51037             yards: exports.earthRadius / 1.0936,
51038         };
51039         /**
51040          * Units of measurement factors based on 1 meter.
51041          *
51042          * @memberof helpers
51043          * @type {Object}
51044          */
51045         exports.unitsFactors = {
51046             centimeters: 100,
51047             centimetres: 100,
51048             degrees: 1 / 111325,
51049             feet: 3.28084,
51050             inches: 39.370,
51051             kilometers: 1 / 1000,
51052             kilometres: 1 / 1000,
51053             meters: 1,
51054             metres: 1,
51055             miles: 1 / 1609.344,
51056             millimeters: 1000,
51057             millimetres: 1000,
51058             nauticalmiles: 1 / 1852,
51059             radians: 1 / exports.earthRadius,
51060             yards: 1 / 1.0936,
51061         };
51062         /**
51063          * Area of measurement factors based on 1 square meter.
51064          *
51065          * @memberof helpers
51066          * @type {Object}
51067          */
51068         exports.areaFactors = {
51069             acres: 0.000247105,
51070             centimeters: 10000,
51071             centimetres: 10000,
51072             feet: 10.763910417,
51073             inches: 1550.003100006,
51074             kilometers: 0.000001,
51075             kilometres: 0.000001,
51076             meters: 1,
51077             metres: 1,
51078             miles: 3.86e-7,
51079             millimeters: 1000000,
51080             millimetres: 1000000,
51081             yards: 1.195990046,
51082         };
51083         /**
51084          * Wraps a GeoJSON {@link Geometry} in a GeoJSON {@link Feature}.
51085          *
51086          * @name feature
51087          * @param {Geometry} geometry input geometry
51088          * @param {Object} [properties={}] an Object of key-value pairs to add as properties
51089          * @param {Object} [options={}] Optional Parameters
51090          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
51091          * @param {string|number} [options.id] Identifier associated with the Feature
51092          * @returns {Feature} a GeoJSON Feature
51093          * @example
51094          * var geometry = {
51095          *   "type": "Point",
51096          *   "coordinates": [110, 50]
51097          * };
51098          *
51099          * var feature = turf.feature(geometry);
51100          *
51101          * //=feature
51102          */
51103         function feature(geom, properties, options) {
51104             if (options === void 0) { options = {}; }
51105             var feat = { type: "Feature" };
51106             if (options.id === 0 || options.id) {
51107                 feat.id = options.id;
51108             }
51109             if (options.bbox) {
51110                 feat.bbox = options.bbox;
51111             }
51112             feat.properties = properties || {};
51113             feat.geometry = geom;
51114             return feat;
51115         }
51116         exports.feature = feature;
51117         /**
51118          * Creates a GeoJSON {@link Geometry} from a Geometry string type & coordinates.
51119          * For GeometryCollection type use `helpers.geometryCollection`
51120          *
51121          * @name geometry
51122          * @param {string} type Geometry Type
51123          * @param {Array<any>} coordinates Coordinates
51124          * @param {Object} [options={}] Optional Parameters
51125          * @returns {Geometry} a GeoJSON Geometry
51126          * @example
51127          * var type = "Point";
51128          * var coordinates = [110, 50];
51129          * var geometry = turf.geometry(type, coordinates);
51130          * // => geometry
51131          */
51132         function geometry(type, coordinates, options) {
51133             switch (type) {
51134                 case "Point": return point(coordinates).geometry;
51135                 case "LineString": return lineString(coordinates).geometry;
51136                 case "Polygon": return polygon(coordinates).geometry;
51137                 case "MultiPoint": return multiPoint(coordinates).geometry;
51138                 case "MultiLineString": return multiLineString(coordinates).geometry;
51139                 case "MultiPolygon": return multiPolygon(coordinates).geometry;
51140                 default: throw new Error(type + " is invalid");
51141             }
51142         }
51143         exports.geometry = geometry;
51144         /**
51145          * Creates a {@link Point} {@link Feature} from a Position.
51146          *
51147          * @name point
51148          * @param {Array<number>} coordinates longitude, latitude position (each in decimal degrees)
51149          * @param {Object} [properties={}] an Object of key-value pairs to add as properties
51150          * @param {Object} [options={}] Optional Parameters
51151          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
51152          * @param {string|number} [options.id] Identifier associated with the Feature
51153          * @returns {Feature<Point>} a Point feature
51154          * @example
51155          * var point = turf.point([-75.343, 39.984]);
51156          *
51157          * //=point
51158          */
51159         function point(coordinates, properties, options) {
51160             if (options === void 0) { options = {}; }
51161             var geom = {
51162                 type: "Point",
51163                 coordinates: coordinates,
51164             };
51165             return feature(geom, properties, options);
51166         }
51167         exports.point = point;
51168         /**
51169          * Creates a {@link Point} {@link FeatureCollection} from an Array of Point coordinates.
51170          *
51171          * @name points
51172          * @param {Array<Array<number>>} coordinates an array of Points
51173          * @param {Object} [properties={}] Translate these properties to each Feature
51174          * @param {Object} [options={}] Optional Parameters
51175          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north]
51176          * associated with the FeatureCollection
51177          * @param {string|number} [options.id] Identifier associated with the FeatureCollection
51178          * @returns {FeatureCollection<Point>} Point Feature
51179          * @example
51180          * var points = turf.points([
51181          *   [-75, 39],
51182          *   [-80, 45],
51183          *   [-78, 50]
51184          * ]);
51185          *
51186          * //=points
51187          */
51188         function points(coordinates, properties, options) {
51189             if (options === void 0) { options = {}; }
51190             return featureCollection(coordinates.map(function (coords) {
51191                 return point(coords, properties);
51192             }), options);
51193         }
51194         exports.points = points;
51195         /**
51196          * Creates a {@link Polygon} {@link Feature} from an Array of LinearRings.
51197          *
51198          * @name polygon
51199          * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings
51200          * @param {Object} [properties={}] an Object of key-value pairs to add as properties
51201          * @param {Object} [options={}] Optional Parameters
51202          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
51203          * @param {string|number} [options.id] Identifier associated with the Feature
51204          * @returns {Feature<Polygon>} Polygon Feature
51205          * @example
51206          * var polygon = turf.polygon([[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]], { name: 'poly1' });
51207          *
51208          * //=polygon
51209          */
51210         function polygon(coordinates, properties, options) {
51211             if (options === void 0) { options = {}; }
51212             for (var _i = 0, coordinates_1 = coordinates; _i < coordinates_1.length; _i++) {
51213                 var ring = coordinates_1[_i];
51214                 if (ring.length < 4) {
51215                     throw new Error("Each LinearRing of a Polygon must have 4 or more Positions.");
51216                 }
51217                 for (var j = 0; j < ring[ring.length - 1].length; j++) {
51218                     // Check if first point of Polygon contains two numbers
51219                     if (ring[ring.length - 1][j] !== ring[0][j]) {
51220                         throw new Error("First and last Position are not equivalent.");
51221                     }
51222                 }
51223             }
51224             var geom = {
51225                 type: "Polygon",
51226                 coordinates: coordinates,
51227             };
51228             return feature(geom, properties, options);
51229         }
51230         exports.polygon = polygon;
51231         /**
51232          * Creates a {@link Polygon} {@link FeatureCollection} from an Array of Polygon coordinates.
51233          *
51234          * @name polygons
51235          * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygon coordinates
51236          * @param {Object} [properties={}] an Object of key-value pairs to add as properties
51237          * @param {Object} [options={}] Optional Parameters
51238          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
51239          * @param {string|number} [options.id] Identifier associated with the FeatureCollection
51240          * @returns {FeatureCollection<Polygon>} Polygon FeatureCollection
51241          * @example
51242          * var polygons = turf.polygons([
51243          *   [[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]],
51244          *   [[[-15, 42], [-14, 46], [-12, 41], [-17, 44], [-15, 42]]],
51245          * ]);
51246          *
51247          * //=polygons
51248          */
51249         function polygons(coordinates, properties, options) {
51250             if (options === void 0) { options = {}; }
51251             return featureCollection(coordinates.map(function (coords) {
51252                 return polygon(coords, properties);
51253             }), options);
51254         }
51255         exports.polygons = polygons;
51256         /**
51257          * Creates a {@link LineString} {@link Feature} from an Array of Positions.
51258          *
51259          * @name lineString
51260          * @param {Array<Array<number>>} coordinates an array of Positions
51261          * @param {Object} [properties={}] an Object of key-value pairs to add as properties
51262          * @param {Object} [options={}] Optional Parameters
51263          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
51264          * @param {string|number} [options.id] Identifier associated with the Feature
51265          * @returns {Feature<LineString>} LineString Feature
51266          * @example
51267          * var linestring1 = turf.lineString([[-24, 63], [-23, 60], [-25, 65], [-20, 69]], {name: 'line 1'});
51268          * var linestring2 = turf.lineString([[-14, 43], [-13, 40], [-15, 45], [-10, 49]], {name: 'line 2'});
51269          *
51270          * //=linestring1
51271          * //=linestring2
51272          */
51273         function lineString(coordinates, properties, options) {
51274             if (options === void 0) { options = {}; }
51275             if (coordinates.length < 2) {
51276                 throw new Error("coordinates must be an array of two or more positions");
51277             }
51278             var geom = {
51279                 type: "LineString",
51280                 coordinates: coordinates,
51281             };
51282             return feature(geom, properties, options);
51283         }
51284         exports.lineString = lineString;
51285         /**
51286          * Creates a {@link LineString} {@link FeatureCollection} from an Array of LineString coordinates.
51287          *
51288          * @name lineStrings
51289          * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings
51290          * @param {Object} [properties={}] an Object of key-value pairs to add as properties
51291          * @param {Object} [options={}] Optional Parameters
51292          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north]
51293          * associated with the FeatureCollection
51294          * @param {string|number} [options.id] Identifier associated with the FeatureCollection
51295          * @returns {FeatureCollection<LineString>} LineString FeatureCollection
51296          * @example
51297          * var linestrings = turf.lineStrings([
51298          *   [[-24, 63], [-23, 60], [-25, 65], [-20, 69]],
51299          *   [[-14, 43], [-13, 40], [-15, 45], [-10, 49]]
51300          * ]);
51301          *
51302          * //=linestrings
51303          */
51304         function lineStrings(coordinates, properties, options) {
51305             if (options === void 0) { options = {}; }
51306             return featureCollection(coordinates.map(function (coords) {
51307                 return lineString(coords, properties);
51308             }), options);
51309         }
51310         exports.lineStrings = lineStrings;
51311         /**
51312          * Takes one or more {@link Feature|Features} and creates a {@link FeatureCollection}.
51313          *
51314          * @name featureCollection
51315          * @param {Feature[]} features input features
51316          * @param {Object} [options={}] Optional Parameters
51317          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
51318          * @param {string|number} [options.id] Identifier associated with the Feature
51319          * @returns {FeatureCollection} FeatureCollection of Features
51320          * @example
51321          * var locationA = turf.point([-75.343, 39.984], {name: 'Location A'});
51322          * var locationB = turf.point([-75.833, 39.284], {name: 'Location B'});
51323          * var locationC = turf.point([-75.534, 39.123], {name: 'Location C'});
51324          *
51325          * var collection = turf.featureCollection([
51326          *   locationA,
51327          *   locationB,
51328          *   locationC
51329          * ]);
51330          *
51331          * //=collection
51332          */
51333         function featureCollection(features, options) {
51334             if (options === void 0) { options = {}; }
51335             var fc = { type: "FeatureCollection" };
51336             if (options.id) {
51337                 fc.id = options.id;
51338             }
51339             if (options.bbox) {
51340                 fc.bbox = options.bbox;
51341             }
51342             fc.features = features;
51343             return fc;
51344         }
51345         exports.featureCollection = featureCollection;
51346         /**
51347          * Creates a {@link Feature<MultiLineString>} based on a
51348          * coordinate array. Properties can be added optionally.
51349          *
51350          * @name multiLineString
51351          * @param {Array<Array<Array<number>>>} coordinates an array of LineStrings
51352          * @param {Object} [properties={}] an Object of key-value pairs to add as properties
51353          * @param {Object} [options={}] Optional Parameters
51354          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
51355          * @param {string|number} [options.id] Identifier associated with the Feature
51356          * @returns {Feature<MultiLineString>} a MultiLineString feature
51357          * @throws {Error} if no coordinates are passed
51358          * @example
51359          * var multiLine = turf.multiLineString([[[0,0],[10,10]]]);
51360          *
51361          * //=multiLine
51362          */
51363         function multiLineString(coordinates, properties, options) {
51364             if (options === void 0) { options = {}; }
51365             var geom = {
51366                 type: "MultiLineString",
51367                 coordinates: coordinates,
51368             };
51369             return feature(geom, properties, options);
51370         }
51371         exports.multiLineString = multiLineString;
51372         /**
51373          * Creates a {@link Feature<MultiPoint>} based on a
51374          * coordinate array. Properties can be added optionally.
51375          *
51376          * @name multiPoint
51377          * @param {Array<Array<number>>} coordinates an array of Positions
51378          * @param {Object} [properties={}] an Object of key-value pairs to add as properties
51379          * @param {Object} [options={}] Optional Parameters
51380          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
51381          * @param {string|number} [options.id] Identifier associated with the Feature
51382          * @returns {Feature<MultiPoint>} a MultiPoint feature
51383          * @throws {Error} if no coordinates are passed
51384          * @example
51385          * var multiPt = turf.multiPoint([[0,0],[10,10]]);
51386          *
51387          * //=multiPt
51388          */
51389         function multiPoint(coordinates, properties, options) {
51390             if (options === void 0) { options = {}; }
51391             var geom = {
51392                 type: "MultiPoint",
51393                 coordinates: coordinates,
51394             };
51395             return feature(geom, properties, options);
51396         }
51397         exports.multiPoint = multiPoint;
51398         /**
51399          * Creates a {@link Feature<MultiPolygon>} based on a
51400          * coordinate array. Properties can be added optionally.
51401          *
51402          * @name multiPolygon
51403          * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygons
51404          * @param {Object} [properties={}] an Object of key-value pairs to add as properties
51405          * @param {Object} [options={}] Optional Parameters
51406          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
51407          * @param {string|number} [options.id] Identifier associated with the Feature
51408          * @returns {Feature<MultiPolygon>} a multipolygon feature
51409          * @throws {Error} if no coordinates are passed
51410          * @example
51411          * var multiPoly = turf.multiPolygon([[[[0,0],[0,10],[10,10],[10,0],[0,0]]]]);
51412          *
51413          * //=multiPoly
51414          *
51415          */
51416         function multiPolygon(coordinates, properties, options) {
51417             if (options === void 0) { options = {}; }
51418             var geom = {
51419                 type: "MultiPolygon",
51420                 coordinates: coordinates,
51421             };
51422             return feature(geom, properties, options);
51423         }
51424         exports.multiPolygon = multiPolygon;
51425         /**
51426          * Creates a {@link Feature<GeometryCollection>} based on a
51427          * coordinate array. Properties can be added optionally.
51428          *
51429          * @name geometryCollection
51430          * @param {Array<Geometry>} geometries an array of GeoJSON Geometries
51431          * @param {Object} [properties={}] an Object of key-value pairs to add as properties
51432          * @param {Object} [options={}] Optional Parameters
51433          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
51434          * @param {string|number} [options.id] Identifier associated with the Feature
51435          * @returns {Feature<GeometryCollection>} a GeoJSON GeometryCollection Feature
51436          * @example
51437          * var pt = turf.geometry("Point", [100, 0]);
51438          * var line = turf.geometry("LineString", [[101, 0], [102, 1]]);
51439          * var collection = turf.geometryCollection([pt, line]);
51440          *
51441          * // => collection
51442          */
51443         function geometryCollection(geometries, properties, options) {
51444             if (options === void 0) { options = {}; }
51445             var geom = {
51446                 type: "GeometryCollection",
51447                 geometries: geometries,
51448             };
51449             return feature(geom, properties, options);
51450         }
51451         exports.geometryCollection = geometryCollection;
51452         /**
51453          * Round number to precision
51454          *
51455          * @param {number} num Number
51456          * @param {number} [precision=0] Precision
51457          * @returns {number} rounded number
51458          * @example
51459          * turf.round(120.4321)
51460          * //=120
51461          *
51462          * turf.round(120.4321, 2)
51463          * //=120.43
51464          */
51465         function round(num, precision) {
51466             if (precision === void 0) { precision = 0; }
51467             if (precision && !(precision >= 0)) {
51468                 throw new Error("precision must be a positive number");
51469             }
51470             var multiplier = Math.pow(10, precision || 0);
51471             return Math.round(num * multiplier) / multiplier;
51472         }
51473         exports.round = round;
51474         /**
51475          * Convert a distance measurement (assuming a spherical Earth) from radians to a more friendly unit.
51476          * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
51477          *
51478          * @name radiansToLength
51479          * @param {number} radians in radians across the sphere
51480          * @param {string} [units="kilometers"] can be degrees, radians, miles, or kilometers inches, yards, metres,
51481          * meters, kilometres, kilometers.
51482          * @returns {number} distance
51483          */
51484         function radiansToLength(radians, units) {
51485             if (units === void 0) { units = "kilometers"; }
51486             var factor = exports.factors[units];
51487             if (!factor) {
51488                 throw new Error(units + " units is invalid");
51489             }
51490             return radians * factor;
51491         }
51492         exports.radiansToLength = radiansToLength;
51493         /**
51494          * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into radians
51495          * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
51496          *
51497          * @name lengthToRadians
51498          * @param {number} distance in real units
51499          * @param {string} [units="kilometers"] can be degrees, radians, miles, or kilometers inches, yards, metres,
51500          * meters, kilometres, kilometers.
51501          * @returns {number} radians
51502          */
51503         function lengthToRadians(distance, units) {
51504             if (units === void 0) { units = "kilometers"; }
51505             var factor = exports.factors[units];
51506             if (!factor) {
51507                 throw new Error(units + " units is invalid");
51508             }
51509             return distance / factor;
51510         }
51511         exports.lengthToRadians = lengthToRadians;
51512         /**
51513          * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into degrees
51514          * Valid units: miles, nauticalmiles, inches, yards, meters, metres, centimeters, kilometres, feet
51515          *
51516          * @name lengthToDegrees
51517          * @param {number} distance in real units
51518          * @param {string} [units="kilometers"] can be degrees, radians, miles, or kilometers inches, yards, metres,
51519          * meters, kilometres, kilometers.
51520          * @returns {number} degrees
51521          */
51522         function lengthToDegrees(distance, units) {
51523             return radiansToDegrees(lengthToRadians(distance, units));
51524         }
51525         exports.lengthToDegrees = lengthToDegrees;
51526         /**
51527          * Converts any bearing angle from the north line direction (positive clockwise)
51528          * and returns an angle between 0-360 degrees (positive clockwise), 0 being the north line
51529          *
51530          * @name bearingToAzimuth
51531          * @param {number} bearing angle, between -180 and +180 degrees
51532          * @returns {number} angle between 0 and 360 degrees
51533          */
51534         function bearingToAzimuth(bearing) {
51535             var angle = bearing % 360;
51536             if (angle < 0) {
51537                 angle += 360;
51538             }
51539             return angle;
51540         }
51541         exports.bearingToAzimuth = bearingToAzimuth;
51542         /**
51543          * Converts an angle in radians to degrees
51544          *
51545          * @name radiansToDegrees
51546          * @param {number} radians angle in radians
51547          * @returns {number} degrees between 0 and 360 degrees
51548          */
51549         function radiansToDegrees(radians) {
51550             var degrees = radians % (2 * Math.PI);
51551             return degrees * 180 / Math.PI;
51552         }
51553         exports.radiansToDegrees = radiansToDegrees;
51554         /**
51555          * Converts an angle in degrees to radians
51556          *
51557          * @name degreesToRadians
51558          * @param {number} degrees angle between 0 and 360 degrees
51559          * @returns {number} angle in radians
51560          */
51561         function degreesToRadians(degrees) {
51562             var radians = degrees % 360;
51563             return radians * Math.PI / 180;
51564         }
51565         exports.degreesToRadians = degreesToRadians;
51566         /**
51567          * Converts a length to the requested unit.
51568          * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
51569          *
51570          * @param {number} length to be converted
51571          * @param {Units} [originalUnit="kilometers"] of the length
51572          * @param {Units} [finalUnit="kilometers"] returned unit
51573          * @returns {number} the converted length
51574          */
51575         function convertLength(length, originalUnit, finalUnit) {
51576             if (originalUnit === void 0) { originalUnit = "kilometers"; }
51577             if (finalUnit === void 0) { finalUnit = "kilometers"; }
51578             if (!(length >= 0)) {
51579                 throw new Error("length must be a positive number");
51580             }
51581             return radiansToLength(lengthToRadians(length, originalUnit), finalUnit);
51582         }
51583         exports.convertLength = convertLength;
51584         /**
51585          * Converts a area to the requested unit.
51586          * Valid units: kilometers, kilometres, meters, metres, centimetres, millimeters, acres, miles, yards, feet, inches
51587          * @param {number} area to be converted
51588          * @param {Units} [originalUnit="meters"] of the distance
51589          * @param {Units} [finalUnit="kilometers"] returned unit
51590          * @returns {number} the converted distance
51591          */
51592         function convertArea(area, originalUnit, finalUnit) {
51593             if (originalUnit === void 0) { originalUnit = "meters"; }
51594             if (finalUnit === void 0) { finalUnit = "kilometers"; }
51595             if (!(area >= 0)) {
51596                 throw new Error("area must be a positive number");
51597             }
51598             var startFactor = exports.areaFactors[originalUnit];
51599             if (!startFactor) {
51600                 throw new Error("invalid original units");
51601             }
51602             var finalFactor = exports.areaFactors[finalUnit];
51603             if (!finalFactor) {
51604                 throw new Error("invalid final units");
51605             }
51606             return (area / startFactor) * finalFactor;
51607         }
51608         exports.convertArea = convertArea;
51609         /**
51610          * isNumber
51611          *
51612          * @param {*} num Number to validate
51613          * @returns {boolean} true/false
51614          * @example
51615          * turf.isNumber(123)
51616          * //=true
51617          * turf.isNumber('foo')
51618          * //=false
51619          */
51620         function isNumber(num) {
51621             return !isNaN(num) && num !== null && !Array.isArray(num) && !/^\s*$/.test(num);
51622         }
51623         exports.isNumber = isNumber;
51624         /**
51625          * isObject
51626          *
51627          * @param {*} input variable to validate
51628          * @returns {boolean} true/false
51629          * @example
51630          * turf.isObject({elevation: 10})
51631          * //=true
51632          * turf.isObject('foo')
51633          * //=false
51634          */
51635         function isObject(input) {
51636             return (!!input) && (input.constructor === Object);
51637         }
51638         exports.isObject = isObject;
51639         /**
51640          * Validate BBox
51641          *
51642          * @private
51643          * @param {Array<number>} bbox BBox to validate
51644          * @returns {void}
51645          * @throws Error if BBox is not valid
51646          * @example
51647          * validateBBox([-180, -40, 110, 50])
51648          * //=OK
51649          * validateBBox([-180, -40])
51650          * //=Error
51651          * validateBBox('Foo')
51652          * //=Error
51653          * validateBBox(5)
51654          * //=Error
51655          * validateBBox(null)
51656          * //=Error
51657          * validateBBox(undefined)
51658          * //=Error
51659          */
51660         function validateBBox(bbox) {
51661             if (!bbox) {
51662                 throw new Error("bbox is required");
51663             }
51664             if (!Array.isArray(bbox)) {
51665                 throw new Error("bbox must be an Array");
51666             }
51667             if (bbox.length !== 4 && bbox.length !== 6) {
51668                 throw new Error("bbox must be an Array of 4 or 6 numbers");
51669             }
51670             bbox.forEach(function (num) {
51671                 if (!isNumber(num)) {
51672                     throw new Error("bbox must only contain numbers");
51673                 }
51674             });
51675         }
51676         exports.validateBBox = validateBBox;
51677         /**
51678          * Validate Id
51679          *
51680          * @private
51681          * @param {string|number} id Id to validate
51682          * @returns {void}
51683          * @throws Error if Id is not valid
51684          * @example
51685          * validateId([-180, -40, 110, 50])
51686          * //=Error
51687          * validateId([-180, -40])
51688          * //=Error
51689          * validateId('Foo')
51690          * //=OK
51691          * validateId(5)
51692          * //=OK
51693          * validateId(null)
51694          * //=Error
51695          * validateId(undefined)
51696          * //=Error
51697          */
51698         function validateId(id) {
51699             if (!id) {
51700                 throw new Error("id is required");
51701             }
51702             if (["string", "number"].indexOf(typeof id) === -1) {
51703                 throw new Error("id must be a number or a string");
51704             }
51705         }
51706         exports.validateId = validateId;
51707         // Deprecated methods
51708         function radians2degrees() {
51709             throw new Error("method has been renamed to `radiansToDegrees`");
51710         }
51711         exports.radians2degrees = radians2degrees;
51712         function degrees2radians() {
51713             throw new Error("method has been renamed to `degreesToRadians`");
51714         }
51715         exports.degrees2radians = degrees2radians;
51716         function distanceToDegrees() {
51717             throw new Error("method has been renamed to `lengthToDegrees`");
51718         }
51719         exports.distanceToDegrees = distanceToDegrees;
51720         function distanceToRadians() {
51721             throw new Error("method has been renamed to `lengthToRadians`");
51722         }
51723         exports.distanceToRadians = distanceToRadians;
51724         function radiansToDistance() {
51725             throw new Error("method has been renamed to `radiansToLength`");
51726         }
51727         exports.radiansToDistance = radiansToDistance;
51728         function bearingToAngle() {
51729             throw new Error("method has been renamed to `bearingToAzimuth`");
51730         }
51731         exports.bearingToAngle = bearingToAngle;
51732         function convertDistance() {
51733             throw new Error("method has been renamed to `convertLength`");
51734         }
51735         exports.convertDistance = convertDistance;
51736         });
51737
51738         unwrapExports(helpers);
51739         var helpers_1 = helpers.earthRadius;
51740         var helpers_2 = helpers.factors;
51741         var helpers_3 = helpers.unitsFactors;
51742         var helpers_4 = helpers.areaFactors;
51743         var helpers_5 = helpers.feature;
51744         var helpers_6 = helpers.geometry;
51745         var helpers_7 = helpers.point;
51746         var helpers_8 = helpers.points;
51747         var helpers_9 = helpers.polygon;
51748         var helpers_10 = helpers.polygons;
51749         var helpers_11 = helpers.lineString;
51750         var helpers_12 = helpers.lineStrings;
51751         var helpers_13 = helpers.featureCollection;
51752         var helpers_14 = helpers.multiLineString;
51753         var helpers_15 = helpers.multiPoint;
51754         var helpers_16 = helpers.multiPolygon;
51755         var helpers_17 = helpers.geometryCollection;
51756         var helpers_18 = helpers.round;
51757         var helpers_19 = helpers.radiansToLength;
51758         var helpers_20 = helpers.lengthToRadians;
51759         var helpers_21 = helpers.lengthToDegrees;
51760         var helpers_22 = helpers.bearingToAzimuth;
51761         var helpers_23 = helpers.radiansToDegrees;
51762         var helpers_24 = helpers.degreesToRadians;
51763         var helpers_25 = helpers.convertLength;
51764         var helpers_26 = helpers.convertArea;
51765         var helpers_27 = helpers.isNumber;
51766         var helpers_28 = helpers.isObject;
51767         var helpers_29 = helpers.validateBBox;
51768         var helpers_30 = helpers.validateId;
51769         var helpers_31 = helpers.radians2degrees;
51770         var helpers_32 = helpers.degrees2radians;
51771         var helpers_33 = helpers.distanceToDegrees;
51772         var helpers_34 = helpers.distanceToRadians;
51773         var helpers_35 = helpers.radiansToDistance;
51774         var helpers_36 = helpers.bearingToAngle;
51775         var helpers_37 = helpers.convertDistance;
51776
51777         var invariant = createCommonjsModule(function (module, exports) {
51778         Object.defineProperty(exports, "__esModule", { value: true });
51779
51780         /**
51781          * Unwrap a coordinate from a Point Feature, Geometry or a single coordinate.
51782          *
51783          * @name getCoord
51784          * @param {Array<number>|Geometry<Point>|Feature<Point>} coord GeoJSON Point or an Array of numbers
51785          * @returns {Array<number>} coordinates
51786          * @example
51787          * var pt = turf.point([10, 10]);
51788          *
51789          * var coord = turf.getCoord(pt);
51790          * //= [10, 10]
51791          */
51792         function getCoord(coord) {
51793             if (!coord) {
51794                 throw new Error("coord is required");
51795             }
51796             if (!Array.isArray(coord)) {
51797                 if (coord.type === "Feature" && coord.geometry !== null && coord.geometry.type === "Point") {
51798                     return coord.geometry.coordinates;
51799                 }
51800                 if (coord.type === "Point") {
51801                     return coord.coordinates;
51802                 }
51803             }
51804             if (Array.isArray(coord) && coord.length >= 2 && !Array.isArray(coord[0]) && !Array.isArray(coord[1])) {
51805                 return coord;
51806             }
51807             throw new Error("coord must be GeoJSON Point or an Array of numbers");
51808         }
51809         exports.getCoord = getCoord;
51810         /**
51811          * Unwrap coordinates from a Feature, Geometry Object or an Array
51812          *
51813          * @name getCoords
51814          * @param {Array<any>|Geometry|Feature} coords Feature, Geometry Object or an Array
51815          * @returns {Array<any>} coordinates
51816          * @example
51817          * var poly = turf.polygon([[[119.32, -8.7], [119.55, -8.69], [119.51, -8.54], [119.32, -8.7]]]);
51818          *
51819          * var coords = turf.getCoords(poly);
51820          * //= [[[119.32, -8.7], [119.55, -8.69], [119.51, -8.54], [119.32, -8.7]]]
51821          */
51822         function getCoords(coords) {
51823             if (Array.isArray(coords)) {
51824                 return coords;
51825             }
51826             // Feature
51827             if (coords.type === "Feature") {
51828                 if (coords.geometry !== null) {
51829                     return coords.geometry.coordinates;
51830                 }
51831             }
51832             else {
51833                 // Geometry
51834                 if (coords.coordinates) {
51835                     return coords.coordinates;
51836                 }
51837             }
51838             throw new Error("coords must be GeoJSON Feature, Geometry Object or an Array");
51839         }
51840         exports.getCoords = getCoords;
51841         /**
51842          * Checks if coordinates contains a number
51843          *
51844          * @name containsNumber
51845          * @param {Array<any>} coordinates GeoJSON Coordinates
51846          * @returns {boolean} true if Array contains a number
51847          */
51848         function containsNumber(coordinates) {
51849             if (coordinates.length > 1 && helpers.isNumber(coordinates[0]) && helpers.isNumber(coordinates[1])) {
51850                 return true;
51851             }
51852             if (Array.isArray(coordinates[0]) && coordinates[0].length) {
51853                 return containsNumber(coordinates[0]);
51854             }
51855             throw new Error("coordinates must only contain numbers");
51856         }
51857         exports.containsNumber = containsNumber;
51858         /**
51859          * Enforce expectations about types of GeoJSON objects for Turf.
51860          *
51861          * @name geojsonType
51862          * @param {GeoJSON} value any GeoJSON object
51863          * @param {string} type expected GeoJSON type
51864          * @param {string} name name of calling function
51865          * @throws {Error} if value is not the expected type.
51866          */
51867         function geojsonType(value, type, name) {
51868             if (!type || !name) {
51869                 throw new Error("type and name required");
51870             }
51871             if (!value || value.type !== type) {
51872                 throw new Error("Invalid input to " + name + ": must be a " + type + ", given " + value.type);
51873             }
51874         }
51875         exports.geojsonType = geojsonType;
51876         /**
51877          * Enforce expectations about types of {@link Feature} inputs for Turf.
51878          * Internally this uses {@link geojsonType} to judge geometry types.
51879          *
51880          * @name featureOf
51881          * @param {Feature} feature a feature with an expected geometry type
51882          * @param {string} type expected GeoJSON type
51883          * @param {string} name name of calling function
51884          * @throws {Error} error if value is not the expected type.
51885          */
51886         function featureOf(feature, type, name) {
51887             if (!feature) {
51888                 throw new Error("No feature passed");
51889             }
51890             if (!name) {
51891                 throw new Error(".featureOf() requires a name");
51892             }
51893             if (!feature || feature.type !== "Feature" || !feature.geometry) {
51894                 throw new Error("Invalid input to " + name + ", Feature with geometry required");
51895             }
51896             if (!feature.geometry || feature.geometry.type !== type) {
51897                 throw new Error("Invalid input to " + name + ": must be a " + type + ", given " + feature.geometry.type);
51898             }
51899         }
51900         exports.featureOf = featureOf;
51901         /**
51902          * Enforce expectations about types of {@link FeatureCollection} inputs for Turf.
51903          * Internally this uses {@link geojsonType} to judge geometry types.
51904          *
51905          * @name collectionOf
51906          * @param {FeatureCollection} featureCollection a FeatureCollection for which features will be judged
51907          * @param {string} type expected GeoJSON type
51908          * @param {string} name name of calling function
51909          * @throws {Error} if value is not the expected type.
51910          */
51911         function collectionOf(featureCollection, type, name) {
51912             if (!featureCollection) {
51913                 throw new Error("No featureCollection passed");
51914             }
51915             if (!name) {
51916                 throw new Error(".collectionOf() requires a name");
51917             }
51918             if (!featureCollection || featureCollection.type !== "FeatureCollection") {
51919                 throw new Error("Invalid input to " + name + ", FeatureCollection required");
51920             }
51921             for (var _i = 0, _a = featureCollection.features; _i < _a.length; _i++) {
51922                 var feature = _a[_i];
51923                 if (!feature || feature.type !== "Feature" || !feature.geometry) {
51924                     throw new Error("Invalid input to " + name + ", Feature with geometry required");
51925                 }
51926                 if (!feature.geometry || feature.geometry.type !== type) {
51927                     throw new Error("Invalid input to " + name + ": must be a " + type + ", given " + feature.geometry.type);
51928                 }
51929             }
51930         }
51931         exports.collectionOf = collectionOf;
51932         /**
51933          * Get Geometry from Feature or Geometry Object
51934          *
51935          * @param {Feature|Geometry} geojson GeoJSON Feature or Geometry Object
51936          * @returns {Geometry|null} GeoJSON Geometry Object
51937          * @throws {Error} if geojson is not a Feature or Geometry Object
51938          * @example
51939          * var point = {
51940          *   "type": "Feature",
51941          *   "properties": {},
51942          *   "geometry": {
51943          *     "type": "Point",
51944          *     "coordinates": [110, 40]
51945          *   }
51946          * }
51947          * var geom = turf.getGeom(point)
51948          * //={"type": "Point", "coordinates": [110, 40]}
51949          */
51950         function getGeom(geojson) {
51951             if (geojson.type === "Feature") {
51952                 return geojson.geometry;
51953             }
51954             return geojson;
51955         }
51956         exports.getGeom = getGeom;
51957         /**
51958          * Get GeoJSON object's type, Geometry type is prioritize.
51959          *
51960          * @param {GeoJSON} geojson GeoJSON object
51961          * @param {string} [name="geojson"] name of the variable to display in error message
51962          * @returns {string} GeoJSON type
51963          * @example
51964          * var point = {
51965          *   "type": "Feature",
51966          *   "properties": {},
51967          *   "geometry": {
51968          *     "type": "Point",
51969          *     "coordinates": [110, 40]
51970          *   }
51971          * }
51972          * var geom = turf.getType(point)
51973          * //="Point"
51974          */
51975         function getType(geojson, name) {
51976             if (geojson.type === "FeatureCollection") {
51977                 return "FeatureCollection";
51978             }
51979             if (geojson.type === "GeometryCollection") {
51980                 return "GeometryCollection";
51981             }
51982             if (geojson.type === "Feature" && geojson.geometry !== null) {
51983                 return geojson.geometry.type;
51984             }
51985             return geojson.type;
51986         }
51987         exports.getType = getType;
51988         });
51989
51990         unwrapExports(invariant);
51991         var invariant_1 = invariant.getCoord;
51992         var invariant_2 = invariant.getCoords;
51993         var invariant_3 = invariant.containsNumber;
51994         var invariant_4 = invariant.geojsonType;
51995         var invariant_5 = invariant.featureOf;
51996         var invariant_6 = invariant.collectionOf;
51997         var invariant_7 = invariant.getGeom;
51998         var invariant_8 = invariant.getType;
51999
52000         var lineclip_1$1 = lineclip$1;
52001         var default_1$1 = lineclip$1;
52002
52003         lineclip$1.polyline = lineclip$1;
52004         lineclip$1.polygon = polygonclip$1;
52005
52006
52007         // Cohen-Sutherland line clippign algorithm, adapted to efficiently
52008         // handle polylines rather than just segments
52009
52010         function lineclip$1(points, bbox, result) {
52011
52012             var len = points.length,
52013                 codeA = bitCode$1(points[0], bbox),
52014                 part = [],
52015                 i, a, b, codeB, lastCode;
52016
52017             if (!result) result = [];
52018
52019             for (i = 1; i < len; i++) {
52020                 a = points[i - 1];
52021                 b = points[i];
52022                 codeB = lastCode = bitCode$1(b, bbox);
52023
52024                 while (true) {
52025
52026                     if (!(codeA | codeB)) { // accept
52027                         part.push(a);
52028
52029                         if (codeB !== lastCode) { // segment went outside
52030                             part.push(b);
52031
52032                             if (i < len - 1) { // start a new line
52033                                 result.push(part);
52034                                 part = [];
52035                             }
52036                         } else if (i === len - 1) {
52037                             part.push(b);
52038                         }
52039                         break;
52040
52041                     } else if (codeA & codeB) { // trivial reject
52042                         break;
52043
52044                     } else if (codeA) { // a outside, intersect with clip edge
52045                         a = intersect$2(a, b, codeA, bbox);
52046                         codeA = bitCode$1(a, bbox);
52047
52048                     } else { // b outside
52049                         b = intersect$2(a, b, codeB, bbox);
52050                         codeB = bitCode$1(b, bbox);
52051                     }
52052                 }
52053
52054                 codeA = lastCode;
52055             }
52056
52057             if (part.length) result.push(part);
52058
52059             return result;
52060         }
52061
52062         // Sutherland-Hodgeman polygon clipping algorithm
52063
52064         function polygonclip$1(points, bbox) {
52065
52066             var result, edge, prev, prevInside, i, p, inside;
52067
52068             // clip against each side of the clip rectangle
52069             for (edge = 1; edge <= 8; edge *= 2) {
52070                 result = [];
52071                 prev = points[points.length - 1];
52072                 prevInside = !(bitCode$1(prev, bbox) & edge);
52073
52074                 for (i = 0; i < points.length; i++) {
52075                     p = points[i];
52076                     inside = !(bitCode$1(p, bbox) & edge);
52077
52078                     // if segment goes through the clip window, add an intersection
52079                     if (inside !== prevInside) result.push(intersect$2(prev, p, edge, bbox));
52080
52081                     if (inside) result.push(p); // add a point if it's inside
52082
52083                     prev = p;
52084                     prevInside = inside;
52085                 }
52086
52087                 points = result;
52088
52089                 if (!points.length) break;
52090             }
52091
52092             return result;
52093         }
52094
52095         // intersect a segment against one of the 4 lines that make up the bbox
52096
52097         function intersect$2(a, b, edge, bbox) {
52098             return edge & 8 ? [a[0] + (b[0] - a[0]) * (bbox[3] - a[1]) / (b[1] - a[1]), bbox[3]] : // top
52099                    edge & 4 ? [a[0] + (b[0] - a[0]) * (bbox[1] - a[1]) / (b[1] - a[1]), bbox[1]] : // bottom
52100                    edge & 2 ? [bbox[2], a[1] + (b[1] - a[1]) * (bbox[2] - a[0]) / (b[0] - a[0])] : // right
52101                    edge & 1 ? [bbox[0], a[1] + (b[1] - a[1]) * (bbox[0] - a[0]) / (b[0] - a[0])] : // left
52102                    null;
52103         }
52104
52105         // bit code reflects the point position relative to the bbox:
52106
52107         //         left  mid  right
52108         //    top  1001  1000  1010
52109         //    mid  0001  0000  0010
52110         // bottom  0101  0100  0110
52111
52112         function bitCode$1(p, bbox) {
52113             var code = 0;
52114
52115             if (p[0] < bbox[0]) code |= 1; // left
52116             else if (p[0] > bbox[2]) code |= 2; // right
52117
52118             if (p[1] < bbox[1]) code |= 4; // bottom
52119             else if (p[1] > bbox[3]) code |= 8; // top
52120
52121             return code;
52122         }
52123         lineclip_1$1.default = default_1$1;
52124
52125         var bboxClip_1 = createCommonjsModule(function (module, exports) {
52126         var __importStar = (commonjsGlobal && commonjsGlobal.__importStar) || function (mod) {
52127             if (mod && mod.__esModule) return mod;
52128             var result = {};
52129             if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
52130             result["default"] = mod;
52131             return result;
52132         };
52133         Object.defineProperty(exports, "__esModule", { value: true });
52134
52135
52136         var lineclip = __importStar(lineclip_1$1);
52137         /**
52138          * Takes a {@link Feature} and a bbox and clips the feature to the bbox using
52139          * [lineclip](https://github.com/mapbox/lineclip).
52140          * May result in degenerate edges when clipping Polygons.
52141          *
52142          * @name bboxClip
52143          * @param {Feature<LineString|MultiLineString|Polygon|MultiPolygon>} feature feature to clip to the bbox
52144          * @param {BBox} bbox extent in [minX, minY, maxX, maxY] order
52145          * @returns {Feature<LineString|MultiLineString|Polygon|MultiPolygon>} clipped Feature
52146          * @example
52147          * var bbox = [0, 0, 10, 10];
52148          * var poly = turf.polygon([[[2, 2], [8, 4], [12, 8], [3, 7], [2, 2]]]);
52149          *
52150          * var clipped = turf.bboxClip(poly, bbox);
52151          *
52152          * //addToMap
52153          * var addToMap = [bbox, poly, clipped]
52154          */
52155         function bboxClip(feature, bbox) {
52156             var geom = invariant.getGeom(feature);
52157             var type = geom.type;
52158             var properties = feature.type === "Feature" ? feature.properties : {};
52159             var coords = geom.coordinates;
52160             switch (type) {
52161                 case "LineString":
52162                 case "MultiLineString":
52163                     var lines_1 = [];
52164                     if (type === "LineString") {
52165                         coords = [coords];
52166                     }
52167                     coords.forEach(function (line) {
52168                         lineclip.polyline(line, bbox, lines_1);
52169                     });
52170                     if (lines_1.length === 1) {
52171                         return helpers.lineString(lines_1[0], properties);
52172                     }
52173                     return helpers.multiLineString(lines_1, properties);
52174                 case "Polygon":
52175                     return helpers.polygon(clipPolygon(coords, bbox), properties);
52176                 case "MultiPolygon":
52177                     return helpers.multiPolygon(coords.map(function (poly) {
52178                         return clipPolygon(poly, bbox);
52179                     }), properties);
52180                 default:
52181                     throw new Error("geometry " + type + " not supported");
52182             }
52183         }
52184         exports.default = bboxClip;
52185         function clipPolygon(rings, bbox) {
52186             var outRings = [];
52187             for (var _i = 0, rings_1 = rings; _i < rings_1.length; _i++) {
52188                 var ring = rings_1[_i];
52189                 var clipped = lineclip.polygon(ring, bbox);
52190                 if (clipped.length > 0) {
52191                     if (clipped[0][0] !== clipped[clipped.length - 1][0] || clipped[0][1] !== clipped[clipped.length - 1][1]) {
52192                         clipped.push(clipped[0]);
52193                     }
52194                     if (clipped.length >= 4) {
52195                         outRings.push(clipped);
52196                     }
52197                 }
52198             }
52199             return outRings;
52200         }
52201         });
52202
52203         var turf_bboxClip = unwrapExports(bboxClip_1);
52204
52205         var fastJsonStableStringify = function (data, opts) {
52206             if (!opts) opts = {};
52207             if (typeof opts === 'function') opts = { cmp: opts };
52208             var cycles = (typeof opts.cycles === 'boolean') ? opts.cycles : false;
52209
52210             var cmp = opts.cmp && (function (f) {
52211                 return function (node) {
52212                     return function (a, b) {
52213                         var aobj = { key: a, value: node[a] };
52214                         var bobj = { key: b, value: node[b] };
52215                         return f(aobj, bobj);
52216                     };
52217                 };
52218             })(opts.cmp);
52219
52220             var seen = [];
52221             return (function stringify (node) {
52222                 if (node && node.toJSON && typeof node.toJSON === 'function') {
52223                     node = node.toJSON();
52224                 }
52225
52226                 if (node === undefined) return;
52227                 if (typeof node == 'number') return isFinite(node) ? '' + node : 'null';
52228                 if (typeof node !== 'object') return JSON.stringify(node);
52229
52230                 var i, out;
52231                 if (Array.isArray(node)) {
52232                     out = '[';
52233                     for (i = 0; i < node.length; i++) {
52234                         if (i) out += ',';
52235                         out += stringify(node[i]) || 'null';
52236                     }
52237                     return out + ']';
52238                 }
52239
52240                 if (node === null) return 'null';
52241
52242                 if (seen.indexOf(node) !== -1) {
52243                     if (cycles) return JSON.stringify('__cycle__');
52244                     throw new TypeError('Converting circular structure to JSON');
52245                 }
52246
52247                 var seenIndex = seen.push(node) - 1;
52248                 var keys = Object.keys(node).sort(cmp && cmp(node));
52249                 out = '';
52250                 for (i = 0; i < keys.length; i++) {
52251                     var key = keys[i];
52252                     var value = stringify(node[key]);
52253
52254                     if (!value) continue;
52255                     if (out) out += ',';
52256                     out += JSON.stringify(key) + ':' + value;
52257                 }
52258                 seen.splice(seenIndex, 1);
52259                 return '{' + out + '}';
52260             })(data);
52261         };
52262
52263         var martinez_umd = createCommonjsModule(function (module, exports) {
52264         /**
52265          * martinez v0.5.0
52266          * Martinez polygon clipping algorithm, does boolean operation on polygons (multipolygons, polygons with holes etc): intersection, union, difference, xor
52267          *
52268          * @author Alex Milevski <info@w8r.name>
52269          * @license MIT
52270          * @preserve
52271          */
52272
52273         (function (global, factory) {
52274            factory(exports) ;
52275         }(commonjsGlobal, (function (exports) {
52276           function DEFAULT_COMPARE (a, b) { return a > b ? 1 : a < b ? -1 : 0; }
52277
52278           var SplayTree = function SplayTree(compare, noDuplicates) {
52279             if ( compare === void 0 ) compare = DEFAULT_COMPARE;
52280             if ( noDuplicates === void 0 ) noDuplicates = false;
52281
52282             this._compare = compare;
52283             this._root = null;
52284             this._size = 0;
52285             this._noDuplicates = !!noDuplicates;
52286           };
52287
52288           var prototypeAccessors = { size: { configurable: true } };
52289
52290
52291           SplayTree.prototype.rotateLeft = function rotateLeft (x) {
52292             var y = x.right;
52293             if (y) {
52294               x.right = y.left;
52295               if (y.left) { y.left.parent = x; }
52296               y.parent = x.parent;
52297             }
52298
52299             if (!x.parent)              { this._root = y; }
52300             else if (x === x.parent.left) { x.parent.left = y; }
52301             else                        { x.parent.right = y; }
52302             if (y) { y.left = x; }
52303             x.parent = y;
52304           };
52305
52306
52307           SplayTree.prototype.rotateRight = function rotateRight (x) {
52308             var y = x.left;
52309             if (y) {
52310               x.left = y.right;
52311               if (y.right) { y.right.parent = x; }
52312               y.parent = x.parent;
52313             }
52314
52315             if (!x.parent)             { this._root = y; }
52316             else if(x === x.parent.left) { x.parent.left = y; }
52317             else                       { x.parent.right = y; }
52318             if (y) { y.right = x; }
52319             x.parent = y;
52320           };
52321
52322
52323           SplayTree.prototype._splay = function _splay (x) {
52324               var this$1 = this;
52325
52326             while (x.parent) {
52327               var p = x.parent;
52328               if (!p.parent) {
52329                 if (p.left === x) { this$1.rotateRight(p); }
52330                 else            { this$1.rotateLeft(p); }
52331               } else if (p.left === x && p.parent.left === p) {
52332                 this$1.rotateRight(p.parent);
52333                 this$1.rotateRight(p);
52334               } else if (p.right === x && p.parent.right === p) {
52335                 this$1.rotateLeft(p.parent);
52336                 this$1.rotateLeft(p);
52337               } else if (p.left === x && p.parent.right === p) {
52338                 this$1.rotateRight(p);
52339                 this$1.rotateLeft(p);
52340               } else {
52341                 this$1.rotateLeft(p);
52342                 this$1.rotateRight(p);
52343               }
52344             }
52345           };
52346
52347
52348           SplayTree.prototype.splay = function splay (x) {
52349               var this$1 = this;
52350
52351             var p, gp, ggp, l, r;
52352
52353             while (x.parent) {
52354               p = x.parent;
52355               gp = p.parent;
52356
52357               if (gp && gp.parent) {
52358                 ggp = gp.parent;
52359                 if (ggp.left === gp) { ggp.left= x; }
52360                 else               { ggp.right = x; }
52361                 x.parent = ggp;
52362               } else {
52363                 x.parent = null;
52364                 this$1._root = x;
52365               }
52366
52367               l = x.left; r = x.right;
52368
52369               if (x === p.left) { // left
52370                 if (gp) {
52371                   if (gp.left === p) {
52372                     /* zig-zig */
52373                     if (p.right) {
52374                       gp.left = p.right;
52375                       gp.left.parent = gp;
52376                     } else { gp.left = null; }
52377
52378                     p.right = gp;
52379                     gp.parent = p;
52380                   } else {
52381                     /* zig-zag */
52382                     if (l) {
52383                       gp.right = l;
52384                       l.parent = gp;
52385                     } else { gp.right = null; }
52386
52387                     x.left  = gp;
52388                     gp.parent = x;
52389                   }
52390                 }
52391                 if (r) {
52392                   p.left = r;
52393                   r.parent = p;
52394                 } else { p.left = null; }
52395
52396                 x.right= p;
52397                 p.parent = x;
52398               } else { // right
52399                 if (gp) {
52400                   if (gp.right === p) {
52401                     /* zig-zig */
52402                     if (p.left) {
52403                       gp.right = p.left;
52404                       gp.right.parent = gp;
52405                     } else { gp.right = null; }
52406
52407                     p.left = gp;
52408                     gp.parent = p;
52409                   } else {
52410                     /* zig-zag */
52411                     if (r) {
52412                       gp.left = r;
52413                       r.parent = gp;
52414                     } else { gp.left = null; }
52415
52416                     x.right = gp;
52417                     gp.parent = x;
52418                   }
52419                 }
52420                 if (l) {
52421                   p.right = l;
52422                   l.parent = p;
52423                 } else { p.right = null; }
52424
52425                 x.left = p;
52426                 p.parent = x;
52427               }
52428             }
52429           };
52430
52431
52432           SplayTree.prototype.replace = function replace (u, v) {
52433             if (!u.parent) { this._root = v; }
52434             else if (u === u.parent.left) { u.parent.left = v; }
52435             else { u.parent.right = v; }
52436             if (v) { v.parent = u.parent; }
52437           };
52438
52439
52440           SplayTree.prototype.minNode = function minNode (u) {
52441               if ( u === void 0 ) u = this._root;
52442
52443             if (u) { while (u.left) { u = u.left; } }
52444             return u;
52445           };
52446
52447
52448           SplayTree.prototype.maxNode = function maxNode (u) {
52449               if ( u === void 0 ) u = this._root;
52450
52451             if (u) { while (u.right) { u = u.right; } }
52452             return u;
52453           };
52454
52455
52456           SplayTree.prototype.insert = function insert (key, data) {
52457             var z = this._root;
52458             var p = null;
52459             var comp = this._compare;
52460             var cmp;
52461
52462             if (this._noDuplicates) {
52463               while (z) {
52464                 p = z;
52465                 cmp = comp(z.key, key);
52466                 if (cmp === 0) { return; }
52467                 else if (comp(z.key, key) < 0) { z = z.right; }
52468                 else { z = z.left; }
52469               }
52470             } else {
52471               while (z) {
52472                 p = z;
52473                 if (comp(z.key, key) < 0) { z = z.right; }
52474                 else { z = z.left; }
52475               }
52476             }
52477
52478             z = { key: key, data: data, left: null, right: null, parent: p };
52479
52480             if (!p)                        { this._root = z; }
52481             else if (comp(p.key, z.key) < 0) { p.right = z; }
52482             else                           { p.left= z; }
52483
52484             this.splay(z);
52485             this._size++;
52486             return z;
52487           };
52488
52489
52490           SplayTree.prototype.find = function find (key) {
52491             var z  = this._root;
52492             var comp = this._compare;
52493             while (z) {
52494               var cmp = comp(z.key, key);
52495               if    (cmp < 0) { z = z.right; }
52496               else if (cmp > 0) { z = z.left; }
52497               else            { return z; }
52498             }
52499             return null;
52500           };
52501
52502           /**
52503            * Whether the tree contains a node with the given key
52504            * @param{Key} key
52505            * @return {boolean} true/false
52506            */
52507           SplayTree.prototype.contains = function contains (key) {
52508             var node     = this._root;
52509             var comparator = this._compare;
52510             while (node){
52511               var cmp = comparator(key, node.key);
52512               if    (cmp === 0) { return true; }
52513               else if (cmp < 0) { node = node.left; }
52514               else              { node = node.right; }
52515             }
52516
52517             return false;
52518           };
52519
52520
52521           SplayTree.prototype.remove = function remove (key) {
52522             var z = this.find(key);
52523
52524             if (!z) { return false; }
52525
52526             this.splay(z);
52527
52528             if (!z.left) { this.replace(z, z.right); }
52529             else if (!z.right) { this.replace(z, z.left); }
52530             else {
52531               var y = this.minNode(z.right);
52532               if (y.parent !== z) {
52533                 this.replace(y, y.right);
52534                 y.right = z.right;
52535                 y.right.parent = y;
52536               }
52537               this.replace(z, y);
52538               y.left = z.left;
52539               y.left.parent = y;
52540             }
52541
52542             this._size--;
52543             return true;
52544           };
52545
52546
52547           SplayTree.prototype.removeNode = function removeNode (z) {
52548             if (!z) { return false; }
52549
52550             this.splay(z);
52551
52552             if (!z.left) { this.replace(z, z.right); }
52553             else if (!z.right) { this.replace(z, z.left); }
52554             else {
52555               var y = this.minNode(z.right);
52556               if (y.parent !== z) {
52557                 this.replace(y, y.right);
52558                 y.right = z.right;
52559                 y.right.parent = y;
52560               }
52561               this.replace(z, y);
52562               y.left = z.left;
52563               y.left.parent = y;
52564             }
52565
52566             this._size--;
52567             return true;
52568           };
52569
52570
52571           SplayTree.prototype.erase = function erase (key) {
52572             var z = this.find(key);
52573             if (!z) { return; }
52574
52575             this.splay(z);
52576
52577             var s = z.left;
52578             var t = z.right;
52579
52580             var sMax = null;
52581             if (s) {
52582               s.parent = null;
52583               sMax = this.maxNode(s);
52584               this.splay(sMax);
52585               this._root = sMax;
52586             }
52587             if (t) {
52588               if (s) { sMax.right = t; }
52589               else { this._root = t; }
52590               t.parent = sMax;
52591             }
52592
52593             this._size--;
52594           };
52595
52596           /**
52597            * Removes and returns the node with smallest key
52598            * @return {?Node}
52599            */
52600           SplayTree.prototype.pop = function pop () {
52601             var node = this._root, returnValue = null;
52602             if (node) {
52603               while (node.left) { node = node.left; }
52604               returnValue = { key: node.key, data: node.data };
52605               this.remove(node.key);
52606             }
52607             return returnValue;
52608           };
52609
52610
52611           /* eslint-disable class-methods-use-this */
52612
52613           /**
52614            * Successor node
52615            * @param{Node} node
52616            * @return {?Node}
52617            */
52618           SplayTree.prototype.next = function next (node) {
52619             var successor = node;
52620             if (successor) {
52621               if (successor.right) {
52622                 successor = successor.right;
52623                 while (successor && successor.left) { successor = successor.left; }
52624               } else {
52625                 successor = node.parent;
52626                 while (successor && successor.right === node) {
52627                   node = successor; successor = successor.parent;
52628                 }
52629               }
52630             }
52631             return successor;
52632           };
52633
52634
52635           /**
52636            * Predecessor node
52637            * @param{Node} node
52638            * @return {?Node}
52639            */
52640           SplayTree.prototype.prev = function prev (node) {
52641             var predecessor = node;
52642             if (predecessor) {
52643               if (predecessor.left) {
52644                 predecessor = predecessor.left;
52645                 while (predecessor && predecessor.right) { predecessor = predecessor.right; }
52646               } else {
52647                 predecessor = node.parent;
52648                 while (predecessor && predecessor.left === node) {
52649                   node = predecessor;
52650                   predecessor = predecessor.parent;
52651                 }
52652               }
52653             }
52654             return predecessor;
52655           };
52656           /* eslint-enable class-methods-use-this */
52657
52658
52659           /**
52660            * @param{forEachCallback} callback
52661            * @return {SplayTree}
52662            */
52663           SplayTree.prototype.forEach = function forEach (callback) {
52664             var current = this._root;
52665             var s = [], done = false, i = 0;
52666
52667             while (!done) {
52668               // Reach the left most Node of the current Node
52669               if (current) {
52670                 // Place pointer to a tree node on the stack
52671                 // before traversing the node's left subtree
52672                 s.push(current);
52673                 current = current.left;
52674               } else {
52675                 // BackTrack from the empty subtree and visit the Node
52676                 // at the top of the stack; however, if the stack is
52677                 // empty you are done
52678                 if (s.length > 0) {
52679                   current = s.pop();
52680                   callback(current, i++);
52681
52682                   // We have visited the node and its left
52683                   // subtree. Now, it's right subtree's turn
52684                   current = current.right;
52685                 } else { done = true; }
52686               }
52687             }
52688             return this;
52689           };
52690
52691
52692           /**
52693            * Walk key range from `low` to `high`. Stops if `fn` returns a value.
52694            * @param{Key}    low
52695            * @param{Key}    high
52696            * @param{Function} fn
52697            * @param{*?}     ctx
52698            * @return {SplayTree}
52699            */
52700           SplayTree.prototype.range = function range (low, high, fn, ctx) {
52701               var this$1 = this;
52702
52703             var Q = [];
52704             var compare = this._compare;
52705             var node = this._root, cmp;
52706
52707             while (Q.length !== 0 || node) {
52708               if (node) {
52709                 Q.push(node);
52710                 node = node.left;
52711               } else {
52712                 node = Q.pop();
52713                 cmp = compare(node.key, high);
52714                 if (cmp > 0) {
52715                   break;
52716                 } else if (compare(node.key, low) >= 0) {
52717                   if (fn.call(ctx, node)) { return this$1; } // stop if smth is returned
52718                 }
52719                 node = node.right;
52720               }
52721             }
52722             return this;
52723           };
52724
52725           /**
52726            * Returns all keys in order
52727            * @return {Array<Key>}
52728            */
52729           SplayTree.prototype.keys = function keys () {
52730             var current = this._root;
52731             var s = [], r = [], done = false;
52732
52733             while (!done) {
52734               if (current) {
52735                 s.push(current);
52736                 current = current.left;
52737               } else {
52738                 if (s.length > 0) {
52739                   current = s.pop();
52740                   r.push(current.key);
52741                   current = current.right;
52742                 } else { done = true; }
52743               }
52744             }
52745             return r;
52746           };
52747
52748
52749           /**
52750            * Returns `data` fields of all nodes in order.
52751            * @return {Array<Value>}
52752            */
52753           SplayTree.prototype.values = function values () {
52754             var current = this._root;
52755             var s = [], r = [], done = false;
52756
52757             while (!done) {
52758               if (current) {
52759                 s.push(current);
52760                 current = current.left;
52761               } else {
52762                 if (s.length > 0) {
52763                   current = s.pop();
52764                   r.push(current.data);
52765                   current = current.right;
52766                 } else { done = true; }
52767               }
52768             }
52769             return r;
52770           };
52771
52772
52773           /**
52774            * Returns node at given index
52775            * @param{number} index
52776            * @return {?Node}
52777            */
52778           SplayTree.prototype.at = function at (index) {
52779             // removed after a consideration, more misleading than useful
52780             // index = index % this.size;
52781             // if (index < 0) index = this.size - index;
52782
52783             var current = this._root;
52784             var s = [], done = false, i = 0;
52785
52786             while (!done) {
52787               if (current) {
52788                 s.push(current);
52789                 current = current.left;
52790               } else {
52791                 if (s.length > 0) {
52792                   current = s.pop();
52793                   if (i === index) { return current; }
52794                   i++;
52795                   current = current.right;
52796                 } else { done = true; }
52797               }
52798             }
52799             return null;
52800           };
52801
52802           /**
52803            * Bulk-load items. Both array have to be same size
52804            * @param{Array<Key>}  keys
52805            * @param{Array<Value>}[values]
52806            * @param{Boolean}     [presort=false] Pre-sort keys and values, using
52807            *                                       tree's comparator. Sorting is done
52808            *                                       in-place
52809            * @return {AVLTree}
52810            */
52811           SplayTree.prototype.load = function load (keys, values, presort) {
52812               if ( keys === void 0 ) keys = [];
52813               if ( values === void 0 ) values = [];
52814               if ( presort === void 0 ) presort = false;
52815
52816             if (this._size !== 0) { throw new Error('bulk-load: tree is not empty'); }
52817             var size = keys.length;
52818             if (presort) { sort(keys, values, 0, size - 1, this._compare); }
52819             this._root = loadRecursive(null, keys, values, 0, size);
52820             this._size = size;
52821             return this;
52822           };
52823
52824
52825           SplayTree.prototype.min = function min () {
52826             var node = this.minNode(this._root);
52827             if (node) { return node.key; }
52828             else    { return null; }
52829           };
52830
52831
52832           SplayTree.prototype.max = function max () {
52833             var node = this.maxNode(this._root);
52834             if (node) { return node.key; }
52835             else    { return null; }
52836           };
52837
52838           SplayTree.prototype.isEmpty = function isEmpty () { return this._root === null; };
52839           prototypeAccessors.size.get = function () { return this._size; };
52840
52841
52842           /**
52843            * Create a tree and load it with items
52844            * @param{Array<Key>}        keys
52845            * @param{Array<Value>?}      [values]
52846
52847            * @param{Function?}          [comparator]
52848            * @param{Boolean?}           [presort=false] Pre-sort keys and values, using
52849            *                                             tree's comparator. Sorting is done
52850            *                                             in-place
52851            * @param{Boolean?}           [noDuplicates=false] Allow duplicates
52852            * @return {SplayTree}
52853            */
52854           SplayTree.createTree = function createTree (keys, values, comparator, presort, noDuplicates) {
52855             return new SplayTree(comparator, noDuplicates).load(keys, values, presort);
52856           };
52857
52858           Object.defineProperties( SplayTree.prototype, prototypeAccessors );
52859
52860
52861           function loadRecursive (parent, keys, values, start, end) {
52862             var size = end - start;
52863             if (size > 0) {
52864               var middle = start + Math.floor(size / 2);
52865               var key    = keys[middle];
52866               var data   = values[middle];
52867               var node   = { key: key, data: data, parent: parent };
52868               node.left    = loadRecursive(node, keys, values, start, middle);
52869               node.right   = loadRecursive(node, keys, values, middle + 1, end);
52870               return node;
52871             }
52872             return null;
52873           }
52874
52875
52876           function sort(keys, values, left, right, compare) {
52877             if (left >= right) { return; }
52878
52879             var pivot = keys[(left + right) >> 1];
52880             var i = left - 1;
52881             var j = right + 1;
52882
52883             while (true) {
52884               do { i++; } while (compare(keys[i], pivot) < 0);
52885               do { j--; } while (compare(keys[j], pivot) > 0);
52886               if (i >= j) { break; }
52887
52888               var tmp = keys[i];
52889               keys[i] = keys[j];
52890               keys[j] = tmp;
52891
52892               tmp = values[i];
52893               values[i] = values[j];
52894               values[j] = tmp;
52895             }
52896
52897             sort(keys, values,  left,     j, compare);
52898             sort(keys, values, j + 1, right, compare);
52899           }
52900
52901           var NORMAL               = 0;
52902           var NON_CONTRIBUTING     = 1;
52903           var SAME_TRANSITION      = 2;
52904           var DIFFERENT_TRANSITION = 3;
52905
52906           var INTERSECTION = 0;
52907           var UNION        = 1;
52908           var DIFFERENCE   = 2;
52909           var XOR          = 3;
52910
52911           /**
52912            * @param  {SweepEvent} event
52913            * @param  {SweepEvent} prev
52914            * @param  {Operation} operation
52915            */
52916           function computeFields (event, prev, operation) {
52917             // compute inOut and otherInOut fields
52918             if (prev === null) {
52919               event.inOut      = false;
52920               event.otherInOut = true;
52921
52922             // previous line segment in sweepline belongs to the same polygon
52923             } else {
52924               if (event.isSubject === prev.isSubject) {
52925                 event.inOut      = !prev.inOut;
52926                 event.otherInOut = prev.otherInOut;
52927
52928               // previous line segment in sweepline belongs to the clipping polygon
52929               } else {
52930                 event.inOut      = !prev.otherInOut;
52931                 event.otherInOut = prev.isVertical() ? !prev.inOut : prev.inOut;
52932               }
52933
52934               // compute prevInResult field
52935               if (prev) {
52936                 event.prevInResult = (!inResult(prev, operation) || prev.isVertical())
52937                   ? prev.prevInResult : prev;
52938               }
52939             }
52940
52941             // check if the line segment belongs to the Boolean operation
52942             event.inResult = inResult(event, operation);
52943           }
52944
52945
52946           /* eslint-disable indent */
52947           function inResult(event, operation) {
52948             switch (event.type) {
52949               case NORMAL:
52950                 switch (operation) {
52951                   case INTERSECTION:
52952                     return !event.otherInOut;
52953                   case UNION:
52954                     return event.otherInOut;
52955                   case DIFFERENCE:
52956                     // return (event.isSubject && !event.otherInOut) ||
52957                     //         (!event.isSubject && event.otherInOut);
52958                     return (event.isSubject && event.otherInOut) ||
52959                             (!event.isSubject && !event.otherInOut);
52960                   case XOR:
52961                     return true;
52962                 }
52963                 break;
52964               case SAME_TRANSITION:
52965                 return operation === INTERSECTION || operation === UNION;
52966               case DIFFERENT_TRANSITION:
52967                 return operation === DIFFERENCE;
52968               case NON_CONTRIBUTING:
52969                 return false;
52970             }
52971             return false;
52972           }
52973           /* eslint-enable indent */
52974
52975           var SweepEvent = function SweepEvent (point, left, otherEvent, isSubject, edgeType) {
52976
52977             /**
52978              * Is left endpoint?
52979              * @type {Boolean}
52980              */
52981             this.left = left;
52982
52983             /**
52984              * @type {Array.<Number>}
52985              */
52986             this.point = point;
52987
52988             /**
52989              * Other edge reference
52990              * @type {SweepEvent}
52991              */
52992             this.otherEvent = otherEvent;
52993
52994             /**
52995              * Belongs to source or clipping polygon
52996              * @type {Boolean}
52997              */
52998             this.isSubject = isSubject;
52999
53000             /**
53001              * Edge contribution type
53002              * @type {Number}
53003              */
53004             this.type = edgeType || NORMAL;
53005
53006
53007             /**
53008              * In-out transition for the sweepline crossing polygon
53009              * @type {Boolean}
53010              */
53011             this.inOut = false;
53012
53013
53014             /**
53015              * @type {Boolean}
53016              */
53017             this.otherInOut = false;
53018
53019             /**
53020              * Previous event in result?
53021              * @type {SweepEvent}
53022              */
53023             this.prevInResult = null;
53024
53025             /**
53026              * Does event belong to result?
53027              * @type {Boolean}
53028              */
53029             this.inResult = false;
53030
53031
53032             // connection step
53033
53034             /**
53035              * @type {Boolean}
53036              */
53037             this.resultInOut = false;
53038
53039             this.isExteriorRing = true;
53040           };
53041
53042
53043           /**
53044            * @param{Array.<Number>}p
53045            * @return {Boolean}
53046            */
53047           SweepEvent.prototype.isBelow = function isBelow (p) {
53048             var p0 = this.point, p1 = this.otherEvent.point;
53049             return this.left
53050               ? (p0[0] - p[0]) * (p1[1] - p[1]) - (p1[0] - p[0]) * (p0[1] - p[1]) > 0
53051               // signedArea(this.point, this.otherEvent.point, p) > 0 :
53052               : (p1[0] - p[0]) * (p0[1] - p[1]) - (p0[0] - p[0]) * (p1[1] - p[1]) > 0;
53053               //signedArea(this.otherEvent.point, this.point, p) > 0;
53054           };
53055
53056
53057           /**
53058            * @param{Array.<Number>}p
53059            * @return {Boolean}
53060            */
53061           SweepEvent.prototype.isAbove = function isAbove (p) {
53062             return !this.isBelow(p);
53063           };
53064
53065
53066           /**
53067            * @return {Boolean}
53068            */
53069           SweepEvent.prototype.isVertical = function isVertical () {
53070             return this.point[0] === this.otherEvent.point[0];
53071           };
53072
53073
53074           SweepEvent.prototype.clone = function clone () {
53075             var copy = new SweepEvent(
53076               this.point, this.left, this.otherEvent, this.isSubject, this.type);
53077
53078             copy.inResult     = this.inResult;
53079             copy.prevInResult = this.prevInResult;
53080             copy.isExteriorRing = this.isExteriorRing;
53081             copy.inOut        = this.inOut;
53082             copy.otherInOut   = this.otherInOut;
53083
53084             return copy;
53085           };
53086
53087           function equals(p1, p2) {
53088             if (p1[0] === p2[0]) {
53089               if (p1[1] === p2[1]) {
53090                 return true;
53091               } else {
53092                 return false;
53093               }
53094             }
53095             return false;
53096           }
53097
53098           // const EPSILON = 1e-9;
53099           // const abs = Math.abs;
53100           // TODO https://github.com/w8r/martinez/issues/6#issuecomment-262847164
53101           // Precision problem.
53102           //
53103           // module.exports = function equals(p1, p2) {
53104           //   return abs(p1[0] - p2[0]) <= EPSILON && abs(p1[1] - p2[1]) <= EPSILON;
53105           // };
53106
53107           /**
53108            * Signed area of the triangle (p0, p1, p2)
53109            * @param  {Array.<Number>} p0
53110            * @param  {Array.<Number>} p1
53111            * @param  {Array.<Number>} p2
53112            * @return {Number}
53113            */
53114           function signedArea(p0, p1, p2) {
53115             return (p0[0] - p2[0]) * (p1[1] - p2[1]) - (p1[0] - p2[0]) * (p0[1] - p2[1]);
53116           }
53117
53118           /**
53119            * @param  {SweepEvent} e1
53120            * @param  {SweepEvent} e2
53121            * @return {Number}
53122            */
53123           function compareEvents(e1, e2) {
53124             var p1 = e1.point;
53125             var p2 = e2.point;
53126
53127             // Different x-coordinate
53128             if (p1[0] > p2[0]) { return 1; }
53129             if (p1[0] < p2[0]) { return -1; }
53130
53131             // Different points, but same x-coordinate
53132             // Event with lower y-coordinate is processed first
53133             if (p1[1] !== p2[1]) { return p1[1] > p2[1] ? 1 : -1; }
53134
53135             return specialCases(e1, e2, p1);
53136           }
53137
53138
53139           /* eslint-disable no-unused-vars */
53140           function specialCases(e1, e2, p1, p2) {
53141             // Same coordinates, but one is a left endpoint and the other is
53142             // a right endpoint. The right endpoint is processed first
53143             if (e1.left !== e2.left)
53144               { return e1.left ? 1 : -1; }
53145
53146             // const p2 = e1.otherEvent.point, p3 = e2.otherEvent.point;
53147             // const sa = (p1[0] - p3[0]) * (p2[1] - p3[1]) - (p2[0] - p3[0]) * (p1[1] - p3[1])
53148             // Same coordinates, both events
53149             // are left endpoints or right endpoints.
53150             // not collinear
53151             if (signedArea(p1, e1.otherEvent.point, e2.otherEvent.point) !== 0) {
53152               // the event associate to the bottom segment is processed first
53153               return (!e1.isBelow(e2.otherEvent.point)) ? 1 : -1;
53154             }
53155
53156             return (!e1.isSubject && e2.isSubject) ? 1 : -1;
53157           }
53158           /* eslint-enable no-unused-vars */
53159
53160           /**
53161            * @param  {SweepEvent} se
53162            * @param  {Array.<Number>} p
53163            * @param  {Queue} queue
53164            * @return {Queue}
53165            */
53166           function divideSegment(se, p, queue)  {
53167             var r = new SweepEvent(p, false, se,            se.isSubject);
53168             var l = new SweepEvent(p, true,  se.otherEvent, se.isSubject);
53169
53170             /* eslint-disable no-console */
53171             if (equals(se.point, se.otherEvent.point)) {
53172
53173               console.warn('what is that, a collapsed segment?', se);
53174             }
53175             /* eslint-enable no-console */
53176
53177             r.contourId = l.contourId = se.contourId;
53178
53179             // avoid a rounding error. The left event would be processed after the right event
53180             if (compareEvents(l, se.otherEvent) > 0) {
53181               se.otherEvent.left = true;
53182               l.left = false;
53183             }
53184
53185             // avoid a rounding error. The left event would be processed after the right event
53186             // if (compareEvents(se, r) > 0) {}
53187
53188             se.otherEvent.otherEvent = l;
53189             se.otherEvent = r;
53190
53191             queue.push(l);
53192             queue.push(r);
53193
53194             return queue;
53195           }
53196
53197           //const EPS = 1e-9;
53198
53199           /**
53200            * Finds the magnitude of the cross product of two vectors (if we pretend
53201            * they're in three dimensions)
53202            *
53203            * @param {Object} a First vector
53204            * @param {Object} b Second vector
53205            * @private
53206            * @returns {Number} The magnitude of the cross product
53207            */
53208           function crossProduct(a, b) {
53209             return (a[0] * b[1]) - (a[1] * b[0]);
53210           }
53211
53212           /**
53213            * Finds the dot product of two vectors.
53214            *
53215            * @param {Object} a First vector
53216            * @param {Object} b Second vector
53217            * @private
53218            * @returns {Number} The dot product
53219            */
53220           function dotProduct(a, b) {
53221             return (a[0] * b[0]) + (a[1] * b[1]);
53222           }
53223
53224           /**
53225            * Finds the intersection (if any) between two line segments a and b, given the
53226            * line segments' end points a1, a2 and b1, b2.
53227            *
53228            * This algorithm is based on Schneider and Eberly.
53229            * http://www.cimec.org.ar/~ncalvo/Schneider_Eberly.pdf
53230            * Page 244.
53231            *
53232            * @param {Array.<Number>} a1 point of first line
53233            * @param {Array.<Number>} a2 point of first line
53234            * @param {Array.<Number>} b1 point of second line
53235            * @param {Array.<Number>} b2 point of second line
53236            * @param {Boolean=}       noEndpointTouch whether to skip single touchpoints
53237            *                                         (meaning connected segments) as
53238            *                                         intersections
53239            * @returns {Array.<Array.<Number>>|Null} If the lines intersect, the point of
53240            * intersection. If they overlap, the two end points of the overlapping segment.
53241            * Otherwise, null.
53242            */
53243           function intersection (a1, a2, b1, b2, noEndpointTouch) {
53244             // The algorithm expects our lines in the form P + sd, where P is a point,
53245             // s is on the interval [0, 1], and d is a vector.
53246             // We are passed two points. P can be the first point of each pair. The
53247             // vector, then, could be thought of as the distance (in x and y components)
53248             // from the first point to the second point.
53249             // So first, let's make our vectors:
53250             var va = [a2[0] - a1[0], a2[1] - a1[1]];
53251             var vb = [b2[0] - b1[0], b2[1] - b1[1]];
53252             // We also define a function to convert back to regular point form:
53253
53254             /* eslint-disable arrow-body-style */
53255
53256             function toPoint(p, s, d) {
53257               return [
53258                 p[0] + s * d[0],
53259                 p[1] + s * d[1]
53260               ];
53261             }
53262
53263             /* eslint-enable arrow-body-style */
53264
53265             // The rest is pretty much a straight port of the algorithm.
53266             var e = [b1[0] - a1[0], b1[1] - a1[1]];
53267             var kross    = crossProduct(va, vb);
53268             var sqrKross = kross * kross;
53269             var sqrLenA  = dotProduct(va, va);
53270             //const sqrLenB  = dotProduct(vb, vb);
53271
53272             // Check for line intersection. This works because of the properties of the
53273             // cross product -- specifically, two vectors are parallel if and only if the
53274             // cross product is the 0 vector. The full calculation involves relative error
53275             // to account for possible very small line segments. See Schneider & Eberly
53276             // for details.
53277             if (sqrKross > 0/* EPS * sqrLenB * sqLenA */) {
53278               // If they're not parallel, then (because these are line segments) they
53279               // still might not actually intersect. This code checks that the
53280               // intersection point of the lines is actually on both line segments.
53281               var s = crossProduct(e, vb) / kross;
53282               if (s < 0 || s > 1) {
53283                 // not on line segment a
53284                 return null;
53285               }
53286               var t = crossProduct(e, va) / kross;
53287               if (t < 0 || t > 1) {
53288                 // not on line segment b
53289                 return null;
53290               }
53291               if (s === 0 || s === 1) {
53292                 // on an endpoint of line segment a
53293                 return noEndpointTouch ? null : [toPoint(a1, s, va)];
53294               }
53295               if (t === 0 || t === 1) {
53296                 // on an endpoint of line segment b
53297                 return noEndpointTouch ? null : [toPoint(b1, t, vb)];
53298               }
53299               return [toPoint(a1, s, va)];
53300             }
53301
53302             // If we've reached this point, then the lines are either parallel or the
53303             // same, but the segments could overlap partially or fully, or not at all.
53304             // So we need to find the overlap, if any. To do that, we can use e, which is
53305             // the (vector) difference between the two initial points. If this is parallel
53306             // with the line itself, then the two lines are the same line, and there will
53307             // be overlap.
53308             //const sqrLenE = dotProduct(e, e);
53309             kross = crossProduct(e, va);
53310             sqrKross = kross * kross;
53311
53312             if (sqrKross > 0 /* EPS * sqLenB * sqLenE */) {
53313             // Lines are just parallel, not the same. No overlap.
53314               return null;
53315             }
53316
53317             var sa = dotProduct(va, e) / sqrLenA;
53318             var sb = sa + dotProduct(va, vb) / sqrLenA;
53319             var smin = Math.min(sa, sb);
53320             var smax = Math.max(sa, sb);
53321
53322             // this is, essentially, the FindIntersection acting on floats from
53323             // Schneider & Eberly, just inlined into this function.
53324             if (smin <= 1 && smax >= 0) {
53325
53326               // overlap on an end point
53327               if (smin === 1) {
53328                 return noEndpointTouch ? null : [toPoint(a1, smin > 0 ? smin : 0, va)];
53329               }
53330
53331               if (smax === 0) {
53332                 return noEndpointTouch ? null : [toPoint(a1, smax < 1 ? smax : 1, va)];
53333               }
53334
53335               if (noEndpointTouch && smin === 0 && smax === 1) { return null; }
53336
53337               // There's overlap on a segment -- two points of intersection. Return both.
53338               return [
53339                 toPoint(a1, smin > 0 ? smin : 0, va),
53340                 toPoint(a1, smax < 1 ? smax : 1, va)
53341               ];
53342             }
53343
53344             return null;
53345           }
53346
53347           /**
53348            * @param  {SweepEvent} se1
53349            * @param  {SweepEvent} se2
53350            * @param  {Queue}      queue
53351            * @return {Number}
53352            */
53353           function possibleIntersection (se1, se2, queue) {
53354             // that disallows self-intersecting polygons,
53355             // did cost us half a day, so I'll leave it
53356             // out of respect
53357             // if (se1.isSubject === se2.isSubject) return;
53358             var inter = intersection(
53359               se1.point, se1.otherEvent.point,
53360               se2.point, se2.otherEvent.point
53361             );
53362
53363             var nintersections = inter ? inter.length : 0;
53364             if (nintersections === 0) { return 0; } // no intersection
53365
53366             // the line segments intersect at an endpoint of both line segments
53367             if ((nintersections === 1) &&
53368                 (equals(se1.point, se2.point) ||
53369                  equals(se1.otherEvent.point, se2.otherEvent.point))) {
53370               return 0;
53371             }
53372
53373             if (nintersections === 2 && se1.isSubject === se2.isSubject) {
53374               // if(se1.contourId === se2.contourId){
53375               // console.warn('Edges of the same polygon overlap',
53376               //   se1.point, se1.otherEvent.point, se2.point, se2.otherEvent.point);
53377               // }
53378               //throw new Error('Edges of the same polygon overlap');
53379               return 0;
53380             }
53381
53382             // The line segments associated to se1 and se2 intersect
53383             if (nintersections === 1) {
53384
53385               // if the intersection point is not an endpoint of se1
53386               if (!equals(se1.point, inter[0]) && !equals(se1.otherEvent.point, inter[0])) {
53387                 divideSegment(se1, inter[0], queue);
53388               }
53389
53390               // if the intersection point is not an endpoint of se2
53391               if (!equals(se2.point, inter[0]) && !equals(se2.otherEvent.point, inter[0])) {
53392                 divideSegment(se2, inter[0], queue);
53393               }
53394               return 1;
53395             }
53396
53397             // The line segments associated to se1 and se2 overlap
53398             var events        = [];
53399             var leftCoincide  = false;
53400             var rightCoincide = false;
53401
53402             if (equals(se1.point, se2.point)) {
53403               leftCoincide = true; // linked
53404             } else if (compareEvents(se1, se2) === 1) {
53405               events.push(se2, se1);
53406             } else {
53407               events.push(se1, se2);
53408             }
53409
53410             if (equals(se1.otherEvent.point, se2.otherEvent.point)) {
53411               rightCoincide = true;
53412             } else if (compareEvents(se1.otherEvent, se2.otherEvent) === 1) {
53413               events.push(se2.otherEvent, se1.otherEvent);
53414             } else {
53415               events.push(se1.otherEvent, se2.otherEvent);
53416             }
53417
53418             if ((leftCoincide && rightCoincide) || leftCoincide) {
53419               // both line segments are equal or share the left endpoint
53420               se2.type = NON_CONTRIBUTING;
53421               se1.type = (se2.inOut === se1.inOut)
53422                 ? SAME_TRANSITION : DIFFERENT_TRANSITION;
53423
53424               if (leftCoincide && !rightCoincide) {
53425                 // honestly no idea, but changing events selection from [2, 1]
53426                 // to [0, 1] fixes the overlapping self-intersecting polygons issue
53427                 divideSegment(events[1].otherEvent, events[0].point, queue);
53428               }
53429               return 2;
53430             }
53431
53432             // the line segments share the right endpoint
53433             if (rightCoincide) {
53434               divideSegment(events[0], events[1].point, queue);
53435               return 3;
53436             }
53437
53438             // no line segment includes totally the other one
53439             if (events[0] !== events[3].otherEvent) {
53440               divideSegment(events[0], events[1].point, queue);
53441               divideSegment(events[1], events[2].point, queue);
53442               return 3;
53443             }
53444
53445             // one line segment includes the other one
53446             divideSegment(events[0], events[1].point, queue);
53447             divideSegment(events[3].otherEvent, events[2].point, queue);
53448
53449             return 3;
53450           }
53451
53452           /**
53453            * @param  {SweepEvent} le1
53454            * @param  {SweepEvent} le2
53455            * @return {Number}
53456            */
53457           function compareSegments(le1, le2) {
53458             if (le1 === le2) { return 0; }
53459
53460             // Segments are not collinear
53461             if (signedArea(le1.point, le1.otherEvent.point, le2.point) !== 0 ||
53462               signedArea(le1.point, le1.otherEvent.point, le2.otherEvent.point) !== 0) {
53463
53464               // If they share their left endpoint use the right endpoint to sort
53465               if (equals(le1.point, le2.point)) { return le1.isBelow(le2.otherEvent.point) ? -1 : 1; }
53466
53467               // Different left endpoint: use the left endpoint to sort
53468               if (le1.point[0] === le2.point[0]) { return le1.point[1] < le2.point[1] ? -1 : 1; }
53469
53470               // has the line segment associated to e1 been inserted
53471               // into S after the line segment associated to e2 ?
53472               if (compareEvents(le1, le2) === 1) { return le2.isAbove(le1.point) ? -1 : 1; }
53473
53474               // The line segment associated to e2 has been inserted
53475               // into S after the line segment associated to e1
53476               return le1.isBelow(le2.point) ? -1 : 1;
53477             }
53478
53479             if (le1.isSubject === le2.isSubject) { // same polygon
53480               var p1 = le1.point, p2 = le2.point;
53481               if (p1[0] === p2[0] && p1[1] === p2[1]/*equals(le1.point, le2.point)*/) {
53482                 p1 = le1.otherEvent.point; p2 = le2.otherEvent.point;
53483                 if (p1[0] === p2[0] && p1[1] === p2[1]) { return 0; }
53484                 else { return le1.contourId > le2.contourId ? 1 : -1; }
53485               }
53486             } else { // Segments are collinear, but belong to separate polygons
53487               return le1.isSubject ? -1 : 1;
53488             }
53489
53490             return compareEvents(le1, le2) === 1 ? 1 : -1;
53491           }
53492
53493           function subdivide(eventQueue, subject, clipping, sbbox, cbbox, operation) {
53494             var sweepLine = new SplayTree(compareSegments);
53495             var sortedEvents = [];
53496
53497             var rightbound = Math.min(sbbox[2], cbbox[2]);
53498
53499             var prev, next, begin;
53500
53501             while (eventQueue.length !== 0) {
53502               var event = eventQueue.pop();
53503               sortedEvents.push(event);
53504
53505               // optimization by bboxes for intersection and difference goes here
53506               if ((operation === INTERSECTION && event.point[0] > rightbound) ||
53507                   (operation === DIFFERENCE   && event.point[0] > sbbox[2])) {
53508                 break;
53509               }
53510
53511               if (event.left) {
53512                 next  = prev = sweepLine.insert(event);
53513                 begin = sweepLine.minNode();
53514
53515                 if (prev !== begin) { prev = sweepLine.prev(prev); }
53516                 else                { prev = null; }
53517
53518                 next = sweepLine.next(next);
53519
53520                 var prevEvent = prev ? prev.key : null;
53521                 var prevprevEvent = (void 0);
53522                 computeFields(event, prevEvent, operation);
53523                 if (next) {
53524                   if (possibleIntersection(event, next.key, eventQueue) === 2) {
53525                     computeFields(event, prevEvent, operation);
53526                     computeFields(event, next.key, operation);
53527                   }
53528                 }
53529
53530                 if (prev) {
53531                   if (possibleIntersection(prev.key, event, eventQueue) === 2) {
53532                     var prevprev = prev;
53533                     if (prevprev !== begin) { prevprev = sweepLine.prev(prevprev); }
53534                     else                    { prevprev = null; }
53535
53536                     prevprevEvent = prevprev ? prevprev.key : null;
53537                     computeFields(prevEvent, prevprevEvent, operation);
53538                     computeFields(event,     prevEvent,     operation);
53539                   }
53540                 }
53541               } else {
53542                 event = event.otherEvent;
53543                 next = prev = sweepLine.find(event);
53544
53545                 if (prev && next) {
53546
53547                   if (prev !== begin) { prev = sweepLine.prev(prev); }
53548                   else                { prev = null; }
53549
53550                   next = sweepLine.next(next);
53551                   sweepLine.remove(event);
53552
53553                   if (next && prev) {
53554                     possibleIntersection(prev.key, next.key, eventQueue);
53555                   }
53556                 }
53557               }
53558             }
53559             return sortedEvents;
53560           }
53561
53562           /**
53563            * @param  {Array.<SweepEvent>} sortedEvents
53564            * @return {Array.<SweepEvent>}
53565            */
53566           function orderEvents(sortedEvents) {
53567             var event, i, len, tmp;
53568             var resultEvents = [];
53569             for (i = 0, len = sortedEvents.length; i < len; i++) {
53570               event = sortedEvents[i];
53571               if ((event.left && event.inResult) ||
53572                 (!event.left && event.otherEvent.inResult)) {
53573                 resultEvents.push(event);
53574               }
53575             }
53576             // Due to overlapping edges the resultEvents array can be not wholly sorted
53577             var sorted = false;
53578             while (!sorted) {
53579               sorted = true;
53580               for (i = 0, len = resultEvents.length; i < len; i++) {
53581                 if ((i + 1) < len &&
53582                   compareEvents(resultEvents[i], resultEvents[i + 1]) === 1) {
53583                   tmp = resultEvents[i];
53584                   resultEvents[i] = resultEvents[i + 1];
53585                   resultEvents[i + 1] = tmp;
53586                   sorted = false;
53587                 }
53588               }
53589             }
53590
53591
53592             for (i = 0, len = resultEvents.length; i < len; i++) {
53593               event = resultEvents[i];
53594               event.pos = i;
53595             }
53596
53597             // imagine, the right event is found in the beginning of the queue,
53598             // when his left counterpart is not marked yet
53599             for (i = 0, len = resultEvents.length; i < len; i++) {
53600               event = resultEvents[i];
53601               if (!event.left) {
53602                 tmp = event.pos;
53603                 event.pos = event.otherEvent.pos;
53604                 event.otherEvent.pos = tmp;
53605               }
53606             }
53607
53608             return resultEvents;
53609           }
53610
53611
53612           /**
53613            * @param  {Number} pos
53614            * @param  {Array.<SweepEvent>} resultEvents
53615            * @param  {Object>}    processed
53616            * @return {Number}
53617            */
53618           function nextPos(pos, resultEvents, processed, origIndex) {
53619             var p, p1;
53620             var newPos = pos + 1;
53621             var length = resultEvents.length;
53622
53623             p  = resultEvents[pos].point;
53624
53625             if (newPos < length)
53626               { p1 = resultEvents[newPos].point; }
53627
53628
53629             // while in range and not the current one by value
53630             while (newPos < length && p1[0] === p[0] && p1[1] === p[1]) {
53631               if (!processed[newPos]) {
53632                 return newPos;
53633               } else   {
53634                 newPos++;
53635               }
53636               p1 = resultEvents[newPos].point;
53637             }
53638
53639             newPos = pos - 1;
53640
53641             while (processed[newPos] && newPos >= origIndex) {
53642               newPos--;
53643             }
53644             return newPos;
53645           }
53646
53647
53648           /**
53649            * @param  {Array.<SweepEvent>} sortedEvents
53650            * @return {Array.<*>} polygons
53651            */
53652           function connectEdges(sortedEvents, operation) {
53653             var i, len;
53654             var resultEvents = orderEvents(sortedEvents);
53655
53656             // "false"-filled array
53657             var processed = {};
53658             var result = [];
53659             var event;
53660
53661             for (i = 0, len = resultEvents.length; i < len; i++) {
53662               if (processed[i]) { continue; }
53663               var contour = [[]];
53664
53665               if (!resultEvents[i].isExteriorRing) {
53666                 if (operation === DIFFERENCE && !resultEvents[i].isSubject && result.length === 0) {
53667                   result.push(contour);
53668                 } else if (result.length === 0) {
53669                   result.push([[contour]]);
53670                 } else {
53671                   result[result.length - 1].push(contour[0]);
53672                 }
53673               } else if (operation === DIFFERENCE && !resultEvents[i].isSubject && result.length > 1) {
53674                 result[result.length - 1].push(contour[0]);
53675               } else {
53676                 result.push(contour);
53677               }
53678
53679               var ringId = result.length - 1;
53680               var pos = i;
53681
53682               var initial = resultEvents[i].point;
53683               contour[0].push(initial);
53684
53685               while (pos >= i) {
53686                 event = resultEvents[pos];
53687                 processed[pos] = true;
53688
53689                 if (event.left) {
53690                   event.resultInOut = false;
53691                   event.contourId   = ringId;
53692                 } else {
53693                   event.otherEvent.resultInOut = true;
53694                   event.otherEvent.contourId   = ringId;
53695                 }
53696
53697                 pos = event.pos;
53698                 processed[pos] = true;
53699                 contour[0].push(resultEvents[pos].point);
53700                 pos = nextPos(pos, resultEvents, processed, i);
53701               }
53702
53703               pos = pos === -1 ? i : pos;
53704
53705               event = resultEvents[pos];
53706               processed[pos] = processed[event.pos] = true;
53707               event.otherEvent.resultInOut = true;
53708               event.otherEvent.contourId   = ringId;
53709             }
53710
53711             // Handle if the result is a polygon (eg not multipoly)
53712             // Commented it again, let's see what do we mean by that
53713             // if (result.length === 1) result = result[0];
53714             return result;
53715           }
53716
53717           var tinyqueue = TinyQueue;
53718           var default_1 = TinyQueue;
53719
53720           function TinyQueue(data, compare) {
53721               var this$1 = this;
53722
53723               if (!(this instanceof TinyQueue)) { return new TinyQueue(data, compare); }
53724
53725               this.data = data || [];
53726               this.length = this.data.length;
53727               this.compare = compare || defaultCompare;
53728
53729               if (this.length > 0) {
53730                   for (var i = (this.length >> 1) - 1; i >= 0; i--) { this$1._down(i); }
53731               }
53732           }
53733
53734           function defaultCompare(a, b) {
53735               return a < b ? -1 : a > b ? 1 : 0;
53736           }
53737
53738           TinyQueue.prototype = {
53739
53740               push: function (item) {
53741                   this.data.push(item);
53742                   this.length++;
53743                   this._up(this.length - 1);
53744               },
53745
53746               pop: function () {
53747                   if (this.length === 0) { return undefined; }
53748
53749                   var top = this.data[0];
53750                   this.length--;
53751
53752                   if (this.length > 0) {
53753                       this.data[0] = this.data[this.length];
53754                       this._down(0);
53755                   }
53756                   this.data.pop();
53757
53758                   return top;
53759               },
53760
53761               peek: function () {
53762                   return this.data[0];
53763               },
53764
53765               _up: function (pos) {
53766                   var data = this.data;
53767                   var compare = this.compare;
53768                   var item = data[pos];
53769
53770                   while (pos > 0) {
53771                       var parent = (pos - 1) >> 1;
53772                       var current = data[parent];
53773                       if (compare(item, current) >= 0) { break; }
53774                       data[pos] = current;
53775                       pos = parent;
53776                   }
53777
53778                   data[pos] = item;
53779               },
53780
53781               _down: function (pos) {
53782                   var this$1 = this;
53783
53784                   var data = this.data;
53785                   var compare = this.compare;
53786                   var halfLength = this.length >> 1;
53787                   var item = data[pos];
53788
53789                   while (pos < halfLength) {
53790                       var left = (pos << 1) + 1;
53791                       var right = left + 1;
53792                       var best = data[left];
53793
53794                       if (right < this$1.length && compare(data[right], best) < 0) {
53795                           left = right;
53796                           best = data[right];
53797                       }
53798                       if (compare(best, item) >= 0) { break; }
53799
53800                       data[pos] = best;
53801                       pos = left;
53802                   }
53803
53804                   data[pos] = item;
53805               }
53806           };
53807           tinyqueue.default = default_1;
53808
53809           var max = Math.max;
53810           var min = Math.min;
53811
53812           var contourId = 0;
53813
53814
53815           function processPolygon(contourOrHole, isSubject, depth, Q, bbox, isExteriorRing) {
53816             var i, len, s1, s2, e1, e2;
53817             for (i = 0, len = contourOrHole.length - 1; i < len; i++) {
53818               s1 = contourOrHole[i];
53819               s2 = contourOrHole[i + 1];
53820               e1 = new SweepEvent(s1, false, undefined, isSubject);
53821               e2 = new SweepEvent(s2, false, e1,        isSubject);
53822               e1.otherEvent = e2;
53823
53824               if (s1[0] === s2[0] && s1[1] === s2[1]) {
53825                 continue; // skip collapsed edges, or it breaks
53826               }
53827
53828               e1.contourId = e2.contourId = depth;
53829               if (!isExteriorRing) {
53830                 e1.isExteriorRing = false;
53831                 e2.isExteriorRing = false;
53832               }
53833               if (compareEvents(e1, e2) > 0) {
53834                 e2.left = true;
53835               } else {
53836                 e1.left = true;
53837               }
53838
53839               var x = s1[0], y = s1[1];
53840               bbox[0] = min(bbox[0], x);
53841               bbox[1] = min(bbox[1], y);
53842               bbox[2] = max(bbox[2], x);
53843               bbox[3] = max(bbox[3], y);
53844
53845               // Pushing it so the queue is sorted from left to right,
53846               // with object on the left having the highest priority.
53847               Q.push(e1);
53848               Q.push(e2);
53849             }
53850           }
53851
53852
53853           function fillQueue(subject, clipping, sbbox, cbbox, operation) {
53854             var eventQueue = new tinyqueue(null, compareEvents);
53855             var polygonSet, isExteriorRing, i, ii, j, jj; //, k, kk;
53856
53857             for (i = 0, ii = subject.length; i < ii; i++) {
53858               polygonSet = subject[i];
53859               for (j = 0, jj = polygonSet.length; j < jj; j++) {
53860                 isExteriorRing = j === 0;
53861                 if (isExteriorRing) { contourId++; }
53862                 processPolygon(polygonSet[j], true, contourId, eventQueue, sbbox, isExteriorRing);
53863               }
53864             }
53865
53866             for (i = 0, ii = clipping.length; i < ii; i++) {
53867               polygonSet = clipping[i];
53868               for (j = 0, jj = polygonSet.length; j < jj; j++) {
53869                 isExteriorRing = j === 0;
53870                 if (operation === DIFFERENCE) { isExteriorRing = false; }
53871                 if (isExteriorRing) { contourId++; }
53872                 processPolygon(polygonSet[j], false, contourId, eventQueue, cbbox, isExteriorRing);
53873               }
53874             }
53875
53876             return eventQueue;
53877           }
53878
53879           var EMPTY = [];
53880
53881
53882           function trivialOperation(subject, clipping, operation) {
53883             var result = null;
53884             if (subject.length * clipping.length === 0) {
53885               if        (operation === INTERSECTION) {
53886                 result = EMPTY;
53887               } else if (operation === DIFFERENCE) {
53888                 result = subject;
53889               } else if (operation === UNION ||
53890                          operation === XOR) {
53891                 result = (subject.length === 0) ? clipping : subject;
53892               }
53893             }
53894             return result;
53895           }
53896
53897
53898           function compareBBoxes(subject, clipping, sbbox, cbbox, operation) {
53899             var result = null;
53900             if (sbbox[0] > cbbox[2] ||
53901                 cbbox[0] > sbbox[2] ||
53902                 sbbox[1] > cbbox[3] ||
53903                 cbbox[1] > sbbox[3]) {
53904               if        (operation === INTERSECTION) {
53905                 result = EMPTY;
53906               } else if (operation === DIFFERENCE) {
53907                 result = subject;
53908               } else if (operation === UNION ||
53909                          operation === XOR) {
53910                 result = subject.concat(clipping);
53911               }
53912             }
53913             return result;
53914           }
53915
53916
53917           function boolean(subject, clipping, operation) {
53918             if (typeof subject[0][0][0] === 'number') {
53919               subject = [subject];
53920             }
53921             if (typeof clipping[0][0][0] === 'number') {
53922               clipping = [clipping];
53923             }
53924             var trivial = trivialOperation(subject, clipping, operation);
53925             if (trivial) {
53926               return trivial === EMPTY ? null : trivial;
53927             }
53928             var sbbox = [Infinity, Infinity, -Infinity, -Infinity];
53929             var cbbox = [Infinity, Infinity, -Infinity, -Infinity];
53930
53931             //console.time('fill queue');
53932             var eventQueue = fillQueue(subject, clipping, sbbox, cbbox, operation);
53933             //console.timeEnd('fill queue');
53934
53935             trivial = compareBBoxes(subject, clipping, sbbox, cbbox, operation);
53936             if (trivial) {
53937               return trivial === EMPTY ? null : trivial;
53938             }
53939             //console.time('subdivide edges');
53940             var sortedEvents = subdivide(eventQueue, subject, clipping, sbbox, cbbox, operation);
53941             //console.timeEnd('subdivide edges');
53942
53943             //console.time('connect vertices');
53944             var result = connectEdges(sortedEvents, operation);
53945             //console.timeEnd('connect vertices');
53946             return result;
53947           }
53948
53949           function union (subject, clipping) {
53950             return boolean(subject, clipping, UNION);
53951           }
53952
53953           function diff (subject, clipping) {
53954             return boolean(subject, clipping, DIFFERENCE);
53955           }
53956
53957           function xor (subject, clipping){
53958             return boolean(subject, clipping, XOR);
53959           }
53960
53961           function intersection$1 (subject, clipping) {
53962             return boolean(subject, clipping, INTERSECTION);
53963           }
53964
53965           /**
53966            * @enum {Number}
53967            */
53968           var operations = { UNION: UNION, DIFFERENCE: DIFFERENCE, INTERSECTION: INTERSECTION, XOR: XOR };
53969
53970           exports.union = union;
53971           exports.diff = diff;
53972           exports.xor = xor;
53973           exports.intersection = intersection$1;
53974           exports.operations = operations;
53975
53976           Object.defineProperty(exports, '__esModule', { value: true });
53977
53978         })));
53979
53980         });
53981
53982         var martinez = unwrapExports(martinez_umd);
53983
53984         var read$6 = function (buffer, offset, isLE, mLen, nBytes) {
53985           var e, m;
53986           var eLen = (nBytes * 8) - mLen - 1;
53987           var eMax = (1 << eLen) - 1;
53988           var eBias = eMax >> 1;
53989           var nBits = -7;
53990           var i = isLE ? (nBytes - 1) : 0;
53991           var d = isLE ? -1 : 1;
53992           var s = buffer[offset + i];
53993
53994           i += d;
53995
53996           e = s & ((1 << (-nBits)) - 1);
53997           s >>= (-nBits);
53998           nBits += eLen;
53999           for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}
54000
54001           m = e & ((1 << (-nBits)) - 1);
54002           e >>= (-nBits);
54003           nBits += mLen;
54004           for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}
54005
54006           if (e === 0) {
54007             e = 1 - eBias;
54008           } else if (e === eMax) {
54009             return m ? NaN : ((s ? -1 : 1) * Infinity)
54010           } else {
54011             m = m + Math.pow(2, mLen);
54012             e = e - eBias;
54013           }
54014           return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
54015         };
54016
54017         var write$6 = function (buffer, value, offset, isLE, mLen, nBytes) {
54018           var e, m, c;
54019           var eLen = (nBytes * 8) - mLen - 1;
54020           var eMax = (1 << eLen) - 1;
54021           var eBias = eMax >> 1;
54022           var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0);
54023           var i = isLE ? 0 : (nBytes - 1);
54024           var d = isLE ? 1 : -1;
54025           var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0;
54026
54027           value = Math.abs(value);
54028
54029           if (isNaN(value) || value === Infinity) {
54030             m = isNaN(value) ? 1 : 0;
54031             e = eMax;
54032           } else {
54033             e = Math.floor(Math.log(value) / Math.LN2);
54034             if (value * (c = Math.pow(2, -e)) < 1) {
54035               e--;
54036               c *= 2;
54037             }
54038             if (e + eBias >= 1) {
54039               value += rt / c;
54040             } else {
54041               value += rt * Math.pow(2, 1 - eBias);
54042             }
54043             if (value * c >= 2) {
54044               e++;
54045               c /= 2;
54046             }
54047
54048             if (e + eBias >= eMax) {
54049               m = 0;
54050               e = eMax;
54051             } else if (e + eBias >= 1) {
54052               m = ((value * c) - 1) * Math.pow(2, mLen);
54053               e = e + eBias;
54054             } else {
54055               m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen);
54056               e = 0;
54057             }
54058           }
54059
54060           for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
54061
54062           e = (e << mLen) | m;
54063           eLen += mLen;
54064           for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
54065
54066           buffer[offset + i - d] |= s * 128;
54067         };
54068
54069         var ieee754 = {
54070                 read: read$6,
54071                 write: write$6
54072         };
54073
54074         var pbf = Pbf;
54075
54076
54077
54078         function Pbf(buf) {
54079             this.buf = ArrayBuffer.isView && ArrayBuffer.isView(buf) ? buf : new Uint8Array(buf || 0);
54080             this.pos = 0;
54081             this.type = 0;
54082             this.length = this.buf.length;
54083         }
54084
54085         Pbf.Varint  = 0; // varint: int32, int64, uint32, uint64, sint32, sint64, bool, enum
54086         Pbf.Fixed64 = 1; // 64-bit: double, fixed64, sfixed64
54087         Pbf.Bytes   = 2; // length-delimited: string, bytes, embedded messages, packed repeated fields
54088         Pbf.Fixed32 = 5; // 32-bit: float, fixed32, sfixed32
54089
54090         var SHIFT_LEFT_32 = (1 << 16) * (1 << 16),
54091             SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32;
54092
54093         Pbf.prototype = {
54094
54095             destroy: function() {
54096                 this.buf = null;
54097             },
54098
54099             // === READING =================================================================
54100
54101             readFields: function(readField, result, end) {
54102                 end = end || this.length;
54103
54104                 while (this.pos < end) {
54105                     var val = this.readVarint(),
54106                         tag = val >> 3,
54107                         startPos = this.pos;
54108
54109                     this.type = val & 0x7;
54110                     readField(tag, result, this);
54111
54112                     if (this.pos === startPos) this.skip(val);
54113                 }
54114                 return result;
54115             },
54116
54117             readMessage: function(readField, result) {
54118                 return this.readFields(readField, result, this.readVarint() + this.pos);
54119             },
54120
54121             readFixed32: function() {
54122                 var val = readUInt32(this.buf, this.pos);
54123                 this.pos += 4;
54124                 return val;
54125             },
54126
54127             readSFixed32: function() {
54128                 var val = readInt32(this.buf, this.pos);
54129                 this.pos += 4;
54130                 return val;
54131             },
54132
54133             // 64-bit int handling is based on github.com/dpw/node-buffer-more-ints (MIT-licensed)
54134
54135             readFixed64: function() {
54136                 var val = readUInt32(this.buf, this.pos) + readUInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;
54137                 this.pos += 8;
54138                 return val;
54139             },
54140
54141             readSFixed64: function() {
54142                 var val = readUInt32(this.buf, this.pos) + readInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;
54143                 this.pos += 8;
54144                 return val;
54145             },
54146
54147             readFloat: function() {
54148                 var val = ieee754.read(this.buf, this.pos, true, 23, 4);
54149                 this.pos += 4;
54150                 return val;
54151             },
54152
54153             readDouble: function() {
54154                 var val = ieee754.read(this.buf, this.pos, true, 52, 8);
54155                 this.pos += 8;
54156                 return val;
54157             },
54158
54159             readVarint: function(isSigned) {
54160                 var buf = this.buf,
54161                     val, b;
54162
54163                 b = buf[this.pos++]; val  =  b & 0x7f;        if (b < 0x80) return val;
54164                 b = buf[this.pos++]; val |= (b & 0x7f) << 7;  if (b < 0x80) return val;
54165                 b = buf[this.pos++]; val |= (b & 0x7f) << 14; if (b < 0x80) return val;
54166                 b = buf[this.pos++]; val |= (b & 0x7f) << 21; if (b < 0x80) return val;
54167                 b = buf[this.pos];   val |= (b & 0x0f) << 28;
54168
54169                 return readVarintRemainder(val, isSigned, this);
54170             },
54171
54172             readVarint64: function() { // for compatibility with v2.0.1
54173                 return this.readVarint(true);
54174             },
54175
54176             readSVarint: function() {
54177                 var num = this.readVarint();
54178                 return num % 2 === 1 ? (num + 1) / -2 : num / 2; // zigzag encoding
54179             },
54180
54181             readBoolean: function() {
54182                 return Boolean(this.readVarint());
54183             },
54184
54185             readString: function() {
54186                 var end = this.readVarint() + this.pos,
54187                     str = readUtf8(this.buf, this.pos, end);
54188                 this.pos = end;
54189                 return str;
54190             },
54191
54192             readBytes: function() {
54193                 var end = this.readVarint() + this.pos,
54194                     buffer = this.buf.subarray(this.pos, end);
54195                 this.pos = end;
54196                 return buffer;
54197             },
54198
54199             // verbose for performance reasons; doesn't affect gzipped size
54200
54201             readPackedVarint: function(arr, isSigned) {
54202                 if (this.type !== Pbf.Bytes) return arr.push(this.readVarint(isSigned));
54203                 var end = readPackedEnd(this);
54204                 arr = arr || [];
54205                 while (this.pos < end) arr.push(this.readVarint(isSigned));
54206                 return arr;
54207             },
54208             readPackedSVarint: function(arr) {
54209                 if (this.type !== Pbf.Bytes) return arr.push(this.readSVarint());
54210                 var end = readPackedEnd(this);
54211                 arr = arr || [];
54212                 while (this.pos < end) arr.push(this.readSVarint());
54213                 return arr;
54214             },
54215             readPackedBoolean: function(arr) {
54216                 if (this.type !== Pbf.Bytes) return arr.push(this.readBoolean());
54217                 var end = readPackedEnd(this);
54218                 arr = arr || [];
54219                 while (this.pos < end) arr.push(this.readBoolean());
54220                 return arr;
54221             },
54222             readPackedFloat: function(arr) {
54223                 if (this.type !== Pbf.Bytes) return arr.push(this.readFloat());
54224                 var end = readPackedEnd(this);
54225                 arr = arr || [];
54226                 while (this.pos < end) arr.push(this.readFloat());
54227                 return arr;
54228             },
54229             readPackedDouble: function(arr) {
54230                 if (this.type !== Pbf.Bytes) return arr.push(this.readDouble());
54231                 var end = readPackedEnd(this);
54232                 arr = arr || [];
54233                 while (this.pos < end) arr.push(this.readDouble());
54234                 return arr;
54235             },
54236             readPackedFixed32: function(arr) {
54237                 if (this.type !== Pbf.Bytes) return arr.push(this.readFixed32());
54238                 var end = readPackedEnd(this);
54239                 arr = arr || [];
54240                 while (this.pos < end) arr.push(this.readFixed32());
54241                 return arr;
54242             },
54243             readPackedSFixed32: function(arr) {
54244                 if (this.type !== Pbf.Bytes) return arr.push(this.readSFixed32());
54245                 var end = readPackedEnd(this);
54246                 arr = arr || [];
54247                 while (this.pos < end) arr.push(this.readSFixed32());
54248                 return arr;
54249             },
54250             readPackedFixed64: function(arr) {
54251                 if (this.type !== Pbf.Bytes) return arr.push(this.readFixed64());
54252                 var end = readPackedEnd(this);
54253                 arr = arr || [];
54254                 while (this.pos < end) arr.push(this.readFixed64());
54255                 return arr;
54256             },
54257             readPackedSFixed64: function(arr) {
54258                 if (this.type !== Pbf.Bytes) return arr.push(this.readSFixed64());
54259                 var end = readPackedEnd(this);
54260                 arr = arr || [];
54261                 while (this.pos < end) arr.push(this.readSFixed64());
54262                 return arr;
54263             },
54264
54265             skip: function(val) {
54266                 var type = val & 0x7;
54267                 if (type === Pbf.Varint) while (this.buf[this.pos++] > 0x7f) {}
54268                 else if (type === Pbf.Bytes) this.pos = this.readVarint() + this.pos;
54269                 else if (type === Pbf.Fixed32) this.pos += 4;
54270                 else if (type === Pbf.Fixed64) this.pos += 8;
54271                 else throw new Error('Unimplemented type: ' + type);
54272             },
54273
54274             // === WRITING =================================================================
54275
54276             writeTag: function(tag, type) {
54277                 this.writeVarint((tag << 3) | type);
54278             },
54279
54280             realloc: function(min) {
54281                 var length = this.length || 16;
54282
54283                 while (length < this.pos + min) length *= 2;
54284
54285                 if (length !== this.length) {
54286                     var buf = new Uint8Array(length);
54287                     buf.set(this.buf);
54288                     this.buf = buf;
54289                     this.length = length;
54290                 }
54291             },
54292
54293             finish: function() {
54294                 this.length = this.pos;
54295                 this.pos = 0;
54296                 return this.buf.subarray(0, this.length);
54297             },
54298
54299             writeFixed32: function(val) {
54300                 this.realloc(4);
54301                 writeInt32(this.buf, val, this.pos);
54302                 this.pos += 4;
54303             },
54304
54305             writeSFixed32: function(val) {
54306                 this.realloc(4);
54307                 writeInt32(this.buf, val, this.pos);
54308                 this.pos += 4;
54309             },
54310
54311             writeFixed64: function(val) {
54312                 this.realloc(8);
54313                 writeInt32(this.buf, val & -1, this.pos);
54314                 writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);
54315                 this.pos += 8;
54316             },
54317
54318             writeSFixed64: function(val) {
54319                 this.realloc(8);
54320                 writeInt32(this.buf, val & -1, this.pos);
54321                 writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);
54322                 this.pos += 8;
54323             },
54324
54325             writeVarint: function(val) {
54326                 val = +val || 0;
54327
54328                 if (val > 0xfffffff || val < 0) {
54329                     writeBigVarint(val, this);
54330                     return;
54331                 }
54332
54333                 this.realloc(4);
54334
54335                 this.buf[this.pos++] =           val & 0x7f  | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
54336                 this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
54337                 this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
54338                 this.buf[this.pos++] =   (val >>> 7) & 0x7f;
54339             },
54340
54341             writeSVarint: function(val) {
54342                 this.writeVarint(val < 0 ? -val * 2 - 1 : val * 2);
54343             },
54344
54345             writeBoolean: function(val) {
54346                 this.writeVarint(Boolean(val));
54347             },
54348
54349             writeString: function(str) {
54350                 str = String(str);
54351                 this.realloc(str.length * 4);
54352
54353                 this.pos++; // reserve 1 byte for short string length
54354
54355                 var startPos = this.pos;
54356                 // write the string directly to the buffer and see how much was written
54357                 this.pos = writeUtf8(this.buf, str, this.pos);
54358                 var len = this.pos - startPos;
54359
54360                 if (len >= 0x80) makeRoomForExtraLength(startPos, len, this);
54361
54362                 // finally, write the message length in the reserved place and restore the position
54363                 this.pos = startPos - 1;
54364                 this.writeVarint(len);
54365                 this.pos += len;
54366             },
54367
54368             writeFloat: function(val) {
54369                 this.realloc(4);
54370                 ieee754.write(this.buf, val, this.pos, true, 23, 4);
54371                 this.pos += 4;
54372             },
54373
54374             writeDouble: function(val) {
54375                 this.realloc(8);
54376                 ieee754.write(this.buf, val, this.pos, true, 52, 8);
54377                 this.pos += 8;
54378             },
54379
54380             writeBytes: function(buffer) {
54381                 var len = buffer.length;
54382                 this.writeVarint(len);
54383                 this.realloc(len);
54384                 for (var i = 0; i < len; i++) this.buf[this.pos++] = buffer[i];
54385             },
54386
54387             writeRawMessage: function(fn, obj) {
54388                 this.pos++; // reserve 1 byte for short message length
54389
54390                 // write the message directly to the buffer and see how much was written
54391                 var startPos = this.pos;
54392                 fn(obj, this);
54393                 var len = this.pos - startPos;
54394
54395                 if (len >= 0x80) makeRoomForExtraLength(startPos, len, this);
54396
54397                 // finally, write the message length in the reserved place and restore the position
54398                 this.pos = startPos - 1;
54399                 this.writeVarint(len);
54400                 this.pos += len;
54401             },
54402
54403             writeMessage: function(tag, fn, obj) {
54404                 this.writeTag(tag, Pbf.Bytes);
54405                 this.writeRawMessage(fn, obj);
54406             },
54407
54408             writePackedVarint:   function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedVarint, arr);   },
54409             writePackedSVarint:  function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedSVarint, arr);  },
54410             writePackedBoolean:  function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedBoolean, arr);  },
54411             writePackedFloat:    function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedFloat, arr);    },
54412             writePackedDouble:   function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedDouble, arr);   },
54413             writePackedFixed32:  function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedFixed32, arr);  },
54414             writePackedSFixed32: function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedSFixed32, arr); },
54415             writePackedFixed64:  function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedFixed64, arr);  },
54416             writePackedSFixed64: function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedSFixed64, arr); },
54417
54418             writeBytesField: function(tag, buffer) {
54419                 this.writeTag(tag, Pbf.Bytes);
54420                 this.writeBytes(buffer);
54421             },
54422             writeFixed32Field: function(tag, val) {
54423                 this.writeTag(tag, Pbf.Fixed32);
54424                 this.writeFixed32(val);
54425             },
54426             writeSFixed32Field: function(tag, val) {
54427                 this.writeTag(tag, Pbf.Fixed32);
54428                 this.writeSFixed32(val);
54429             },
54430             writeFixed64Field: function(tag, val) {
54431                 this.writeTag(tag, Pbf.Fixed64);
54432                 this.writeFixed64(val);
54433             },
54434             writeSFixed64Field: function(tag, val) {
54435                 this.writeTag(tag, Pbf.Fixed64);
54436                 this.writeSFixed64(val);
54437             },
54438             writeVarintField: function(tag, val) {
54439                 this.writeTag(tag, Pbf.Varint);
54440                 this.writeVarint(val);
54441             },
54442             writeSVarintField: function(tag, val) {
54443                 this.writeTag(tag, Pbf.Varint);
54444                 this.writeSVarint(val);
54445             },
54446             writeStringField: function(tag, str) {
54447                 this.writeTag(tag, Pbf.Bytes);
54448                 this.writeString(str);
54449             },
54450             writeFloatField: function(tag, val) {
54451                 this.writeTag(tag, Pbf.Fixed32);
54452                 this.writeFloat(val);
54453             },
54454             writeDoubleField: function(tag, val) {
54455                 this.writeTag(tag, Pbf.Fixed64);
54456                 this.writeDouble(val);
54457             },
54458             writeBooleanField: function(tag, val) {
54459                 this.writeVarintField(tag, Boolean(val));
54460             }
54461         };
54462
54463         function readVarintRemainder(l, s, p) {
54464             var buf = p.buf,
54465                 h, b;
54466
54467             b = buf[p.pos++]; h  = (b & 0x70) >> 4;  if (b < 0x80) return toNum(l, h, s);
54468             b = buf[p.pos++]; h |= (b & 0x7f) << 3;  if (b < 0x80) return toNum(l, h, s);
54469             b = buf[p.pos++]; h |= (b & 0x7f) << 10; if (b < 0x80) return toNum(l, h, s);
54470             b = buf[p.pos++]; h |= (b & 0x7f) << 17; if (b < 0x80) return toNum(l, h, s);
54471             b = buf[p.pos++]; h |= (b & 0x7f) << 24; if (b < 0x80) return toNum(l, h, s);
54472             b = buf[p.pos++]; h |= (b & 0x01) << 31; if (b < 0x80) return toNum(l, h, s);
54473
54474             throw new Error('Expected varint not more than 10 bytes');
54475         }
54476
54477         function readPackedEnd(pbf) {
54478             return pbf.type === Pbf.Bytes ?
54479                 pbf.readVarint() + pbf.pos : pbf.pos + 1;
54480         }
54481
54482         function toNum(low, high, isSigned) {
54483             if (isSigned) {
54484                 return high * 0x100000000 + (low >>> 0);
54485             }
54486
54487             return ((high >>> 0) * 0x100000000) + (low >>> 0);
54488         }
54489
54490         function writeBigVarint(val, pbf) {
54491             var low, high;
54492
54493             if (val >= 0) {
54494                 low  = (val % 0x100000000) | 0;
54495                 high = (val / 0x100000000) | 0;
54496             } else {
54497                 low  = ~(-val % 0x100000000);
54498                 high = ~(-val / 0x100000000);
54499
54500                 if (low ^ 0xffffffff) {
54501                     low = (low + 1) | 0;
54502                 } else {
54503                     low = 0;
54504                     high = (high + 1) | 0;
54505                 }
54506             }
54507
54508             if (val >= 0x10000000000000000 || val < -0x10000000000000000) {
54509                 throw new Error('Given varint doesn\'t fit into 10 bytes');
54510             }
54511
54512             pbf.realloc(10);
54513
54514             writeBigVarintLow(low, high, pbf);
54515             writeBigVarintHigh(high, pbf);
54516         }
54517
54518         function writeBigVarintLow(low, high, pbf) {
54519             pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
54520             pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
54521             pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
54522             pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
54523             pbf.buf[pbf.pos]   = low & 0x7f;
54524         }
54525
54526         function writeBigVarintHigh(high, pbf) {
54527             var lsb = (high & 0x07) << 4;
54528
54529             pbf.buf[pbf.pos++] |= lsb         | ((high >>>= 3) ? 0x80 : 0); if (!high) return;
54530             pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
54531             pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
54532             pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
54533             pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
54534             pbf.buf[pbf.pos++]  = high & 0x7f;
54535         }
54536
54537         function makeRoomForExtraLength(startPos, len, pbf) {
54538             var extraLen =
54539                 len <= 0x3fff ? 1 :
54540                 len <= 0x1fffff ? 2 :
54541                 len <= 0xfffffff ? 3 : Math.floor(Math.log(len) / (Math.LN2 * 7));
54542
54543             // if 1 byte isn't enough for encoding message length, shift the data to the right
54544             pbf.realloc(extraLen);
54545             for (var i = pbf.pos - 1; i >= startPos; i--) pbf.buf[i + extraLen] = pbf.buf[i];
54546         }
54547
54548         function writePackedVarint(arr, pbf)   { for (var i = 0; i < arr.length; i++) pbf.writeVarint(arr[i]);   }
54549         function writePackedSVarint(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeSVarint(arr[i]);  }
54550         function writePackedFloat(arr, pbf)    { for (var i = 0; i < arr.length; i++) pbf.writeFloat(arr[i]);    }
54551         function writePackedDouble(arr, pbf)   { for (var i = 0; i < arr.length; i++) pbf.writeDouble(arr[i]);   }
54552         function writePackedBoolean(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeBoolean(arr[i]);  }
54553         function writePackedFixed32(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeFixed32(arr[i]);  }
54554         function writePackedSFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed32(arr[i]); }
54555         function writePackedFixed64(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeFixed64(arr[i]);  }
54556         function writePackedSFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed64(arr[i]); }
54557
54558         // Buffer code below from https://github.com/feross/buffer, MIT-licensed
54559
54560         function readUInt32(buf, pos) {
54561             return ((buf[pos]) |
54562                 (buf[pos + 1] << 8) |
54563                 (buf[pos + 2] << 16)) +
54564                 (buf[pos + 3] * 0x1000000);
54565         }
54566
54567         function writeInt32(buf, val, pos) {
54568             buf[pos] = val;
54569             buf[pos + 1] = (val >>> 8);
54570             buf[pos + 2] = (val >>> 16);
54571             buf[pos + 3] = (val >>> 24);
54572         }
54573
54574         function readInt32(buf, pos) {
54575             return ((buf[pos]) |
54576                 (buf[pos + 1] << 8) |
54577                 (buf[pos + 2] << 16)) +
54578                 (buf[pos + 3] << 24);
54579         }
54580
54581         function readUtf8(buf, pos, end) {
54582             var str = '';
54583             var i = pos;
54584
54585             while (i < end) {
54586                 var b0 = buf[i];
54587                 var c = null; // codepoint
54588                 var bytesPerSequence =
54589                     b0 > 0xEF ? 4 :
54590                     b0 > 0xDF ? 3 :
54591                     b0 > 0xBF ? 2 : 1;
54592
54593                 if (i + bytesPerSequence > end) break;
54594
54595                 var b1, b2, b3;
54596
54597                 if (bytesPerSequence === 1) {
54598                     if (b0 < 0x80) {
54599                         c = b0;
54600                     }
54601                 } else if (bytesPerSequence === 2) {
54602                     b1 = buf[i + 1];
54603                     if ((b1 & 0xC0) === 0x80) {
54604                         c = (b0 & 0x1F) << 0x6 | (b1 & 0x3F);
54605                         if (c <= 0x7F) {
54606                             c = null;
54607                         }
54608                     }
54609                 } else if (bytesPerSequence === 3) {
54610                     b1 = buf[i + 1];
54611                     b2 = buf[i + 2];
54612                     if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80) {
54613                         c = (b0 & 0xF) << 0xC | (b1 & 0x3F) << 0x6 | (b2 & 0x3F);
54614                         if (c <= 0x7FF || (c >= 0xD800 && c <= 0xDFFF)) {
54615                             c = null;
54616                         }
54617                     }
54618                 } else if (bytesPerSequence === 4) {
54619                     b1 = buf[i + 1];
54620                     b2 = buf[i + 2];
54621                     b3 = buf[i + 3];
54622                     if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80) {
54623                         c = (b0 & 0xF) << 0x12 | (b1 & 0x3F) << 0xC | (b2 & 0x3F) << 0x6 | (b3 & 0x3F);
54624                         if (c <= 0xFFFF || c >= 0x110000) {
54625                             c = null;
54626                         }
54627                     }
54628                 }
54629
54630                 if (c === null) {
54631                     c = 0xFFFD;
54632                     bytesPerSequence = 1;
54633
54634                 } else if (c > 0xFFFF) {
54635                     c -= 0x10000;
54636                     str += String.fromCharCode(c >>> 10 & 0x3FF | 0xD800);
54637                     c = 0xDC00 | c & 0x3FF;
54638                 }
54639
54640                 str += String.fromCharCode(c);
54641                 i += bytesPerSequence;
54642             }
54643
54644             return str;
54645         }
54646
54647         function writeUtf8(buf, str, pos) {
54648             for (var i = 0, c, lead; i < str.length; i++) {
54649                 c = str.charCodeAt(i); // code point
54650
54651                 if (c > 0xD7FF && c < 0xE000) {
54652                     if (lead) {
54653                         if (c < 0xDC00) {
54654                             buf[pos++] = 0xEF;
54655                             buf[pos++] = 0xBF;
54656                             buf[pos++] = 0xBD;
54657                             lead = c;
54658                             continue;
54659                         } else {
54660                             c = lead - 0xD800 << 10 | c - 0xDC00 | 0x10000;
54661                             lead = null;
54662                         }
54663                     } else {
54664                         if (c > 0xDBFF || (i + 1 === str.length)) {
54665                             buf[pos++] = 0xEF;
54666                             buf[pos++] = 0xBF;
54667                             buf[pos++] = 0xBD;
54668                         } else {
54669                             lead = c;
54670                         }
54671                         continue;
54672                     }
54673                 } else if (lead) {
54674                     buf[pos++] = 0xEF;
54675                     buf[pos++] = 0xBF;
54676                     buf[pos++] = 0xBD;
54677                     lead = null;
54678                 }
54679
54680                 if (c < 0x80) {
54681                     buf[pos++] = c;
54682                 } else {
54683                     if (c < 0x800) {
54684                         buf[pos++] = c >> 0x6 | 0xC0;
54685                     } else {
54686                         if (c < 0x10000) {
54687                             buf[pos++] = c >> 0xC | 0xE0;
54688                         } else {
54689                             buf[pos++] = c >> 0x12 | 0xF0;
54690                             buf[pos++] = c >> 0xC & 0x3F | 0x80;
54691                         }
54692                         buf[pos++] = c >> 0x6 & 0x3F | 0x80;
54693                     }
54694                     buf[pos++] = c & 0x3F | 0x80;
54695                 }
54696             }
54697             return pos;
54698         }
54699
54700         var pointGeometry = Point;
54701
54702         /**
54703          * A standalone point geometry with useful accessor, comparison, and
54704          * modification methods.
54705          *
54706          * @class Point
54707          * @param {Number} x the x-coordinate. this could be longitude or screen
54708          * pixels, or any other sort of unit.
54709          * @param {Number} y the y-coordinate. this could be latitude or screen
54710          * pixels, or any other sort of unit.
54711          * @example
54712          * var point = new Point(-77, 38);
54713          */
54714         function Point(x, y) {
54715             this.x = x;
54716             this.y = y;
54717         }
54718
54719         Point.prototype = {
54720
54721             /**
54722              * Clone this point, returning a new point that can be modified
54723              * without affecting the old one.
54724              * @return {Point} the clone
54725              */
54726             clone: function() { return new Point(this.x, this.y); },
54727
54728             /**
54729              * Add this point's x & y coordinates to another point,
54730              * yielding a new point.
54731              * @param {Point} p the other point
54732              * @return {Point} output point
54733              */
54734             add:     function(p) { return this.clone()._add(p); },
54735
54736             /**
54737              * Subtract this point's x & y coordinates to from point,
54738              * yielding a new point.
54739              * @param {Point} p the other point
54740              * @return {Point} output point
54741              */
54742             sub:     function(p) { return this.clone()._sub(p); },
54743
54744             /**
54745              * Multiply this point's x & y coordinates by point,
54746              * yielding a new point.
54747              * @param {Point} p the other point
54748              * @return {Point} output point
54749              */
54750             multByPoint:    function(p) { return this.clone()._multByPoint(p); },
54751
54752             /**
54753              * Divide this point's x & y coordinates by point,
54754              * yielding a new point.
54755              * @param {Point} p the other point
54756              * @return {Point} output point
54757              */
54758             divByPoint:     function(p) { return this.clone()._divByPoint(p); },
54759
54760             /**
54761              * Multiply this point's x & y coordinates by a factor,
54762              * yielding a new point.
54763              * @param {Point} k factor
54764              * @return {Point} output point
54765              */
54766             mult:    function(k) { return this.clone()._mult(k); },
54767
54768             /**
54769              * Divide this point's x & y coordinates by a factor,
54770              * yielding a new point.
54771              * @param {Point} k factor
54772              * @return {Point} output point
54773              */
54774             div:     function(k) { return this.clone()._div(k); },
54775
54776             /**
54777              * Rotate this point around the 0, 0 origin by an angle a,
54778              * given in radians
54779              * @param {Number} a angle to rotate around, in radians
54780              * @return {Point} output point
54781              */
54782             rotate:  function(a) { return this.clone()._rotate(a); },
54783
54784             /**
54785              * Rotate this point around p point by an angle a,
54786              * given in radians
54787              * @param {Number} a angle to rotate around, in radians
54788              * @param {Point} p Point to rotate around
54789              * @return {Point} output point
54790              */
54791             rotateAround:  function(a,p) { return this.clone()._rotateAround(a,p); },
54792
54793             /**
54794              * Multiply this point by a 4x1 transformation matrix
54795              * @param {Array<Number>} m transformation matrix
54796              * @return {Point} output point
54797              */
54798             matMult: function(m) { return this.clone()._matMult(m); },
54799
54800             /**
54801              * Calculate this point but as a unit vector from 0, 0, meaning
54802              * that the distance from the resulting point to the 0, 0
54803              * coordinate will be equal to 1 and the angle from the resulting
54804              * point to the 0, 0 coordinate will be the same as before.
54805              * @return {Point} unit vector point
54806              */
54807             unit:    function() { return this.clone()._unit(); },
54808
54809             /**
54810              * Compute a perpendicular point, where the new y coordinate
54811              * is the old x coordinate and the new x coordinate is the old y
54812              * coordinate multiplied by -1
54813              * @return {Point} perpendicular point
54814              */
54815             perp:    function() { return this.clone()._perp(); },
54816
54817             /**
54818              * Return a version of this point with the x & y coordinates
54819              * rounded to integers.
54820              * @return {Point} rounded point
54821              */
54822             round:   function() { return this.clone()._round(); },
54823
54824             /**
54825              * Return the magitude of this point: this is the Euclidean
54826              * distance from the 0, 0 coordinate to this point's x and y
54827              * coordinates.
54828              * @return {Number} magnitude
54829              */
54830             mag: function() {
54831                 return Math.sqrt(this.x * this.x + this.y * this.y);
54832             },
54833
54834             /**
54835              * Judge whether this point is equal to another point, returning
54836              * true or false.
54837              * @param {Point} other the other point
54838              * @return {boolean} whether the points are equal
54839              */
54840             equals: function(other) {
54841                 return this.x === other.x &&
54842                        this.y === other.y;
54843             },
54844
54845             /**
54846              * Calculate the distance from this point to another point
54847              * @param {Point} p the other point
54848              * @return {Number} distance
54849              */
54850             dist: function(p) {
54851                 return Math.sqrt(this.distSqr(p));
54852             },
54853
54854             /**
54855              * Calculate the distance from this point to another point,
54856              * without the square root step. Useful if you're comparing
54857              * relative distances.
54858              * @param {Point} p the other point
54859              * @return {Number} distance
54860              */
54861             distSqr: function(p) {
54862                 var dx = p.x - this.x,
54863                     dy = p.y - this.y;
54864                 return dx * dx + dy * dy;
54865             },
54866
54867             /**
54868              * Get the angle from the 0, 0 coordinate to this point, in radians
54869              * coordinates.
54870              * @return {Number} angle
54871              */
54872             angle: function() {
54873                 return Math.atan2(this.y, this.x);
54874             },
54875
54876             /**
54877              * Get the angle from this point to another point, in radians
54878              * @param {Point} b the other point
54879              * @return {Number} angle
54880              */
54881             angleTo: function(b) {
54882                 return Math.atan2(this.y - b.y, this.x - b.x);
54883             },
54884
54885             /**
54886              * Get the angle between this point and another point, in radians
54887              * @param {Point} b the other point
54888              * @return {Number} angle
54889              */
54890             angleWith: function(b) {
54891                 return this.angleWithSep(b.x, b.y);
54892             },
54893
54894             /*
54895              * Find the angle of the two vectors, solving the formula for
54896              * the cross product a x b = |a||b|sin(θ) for θ.
54897              * @param {Number} x the x-coordinate
54898              * @param {Number} y the y-coordinate
54899              * @return {Number} the angle in radians
54900              */
54901             angleWithSep: function(x, y) {
54902                 return Math.atan2(
54903                     this.x * y - this.y * x,
54904                     this.x * x + this.y * y);
54905             },
54906
54907             _matMult: function(m) {
54908                 var x = m[0] * this.x + m[1] * this.y,
54909                     y = m[2] * this.x + m[3] * this.y;
54910                 this.x = x;
54911                 this.y = y;
54912                 return this;
54913             },
54914
54915             _add: function(p) {
54916                 this.x += p.x;
54917                 this.y += p.y;
54918                 return this;
54919             },
54920
54921             _sub: function(p) {
54922                 this.x -= p.x;
54923                 this.y -= p.y;
54924                 return this;
54925             },
54926
54927             _mult: function(k) {
54928                 this.x *= k;
54929                 this.y *= k;
54930                 return this;
54931             },
54932
54933             _div: function(k) {
54934                 this.x /= k;
54935                 this.y /= k;
54936                 return this;
54937             },
54938
54939             _multByPoint: function(p) {
54940                 this.x *= p.x;
54941                 this.y *= p.y;
54942                 return this;
54943             },
54944
54945             _divByPoint: function(p) {
54946                 this.x /= p.x;
54947                 this.y /= p.y;
54948                 return this;
54949             },
54950
54951             _unit: function() {
54952                 this._div(this.mag());
54953                 return this;
54954             },
54955
54956             _perp: function() {
54957                 var y = this.y;
54958                 this.y = this.x;
54959                 this.x = -y;
54960                 return this;
54961             },
54962
54963             _rotate: function(angle) {
54964                 var cos = Math.cos(angle),
54965                     sin = Math.sin(angle),
54966                     x = cos * this.x - sin * this.y,
54967                     y = sin * this.x + cos * this.y;
54968                 this.x = x;
54969                 this.y = y;
54970                 return this;
54971             },
54972
54973             _rotateAround: function(angle, p) {
54974                 var cos = Math.cos(angle),
54975                     sin = Math.sin(angle),
54976                     x = p.x + cos * (this.x - p.x) - sin * (this.y - p.y),
54977                     y = p.y + sin * (this.x - p.x) + cos * (this.y - p.y);
54978                 this.x = x;
54979                 this.y = y;
54980                 return this;
54981             },
54982
54983             _round: function() {
54984                 this.x = Math.round(this.x);
54985                 this.y = Math.round(this.y);
54986                 return this;
54987             }
54988         };
54989
54990         /**
54991          * Construct a point from an array if necessary, otherwise if the input
54992          * is already a Point, or an unknown type, return it unchanged
54993          * @param {Array<Number>|Point|*} a any kind of input value
54994          * @return {Point} constructed point, or passed-through value.
54995          * @example
54996          * // this
54997          * var point = Point.convert([0, 1]);
54998          * // is equivalent to
54999          * var point = new Point(0, 1);
55000          */
55001         Point.convert = function (a) {
55002             if (a instanceof Point) {
55003                 return a;
55004             }
55005             if (Array.isArray(a)) {
55006                 return new Point(a[0], a[1]);
55007             }
55008             return a;
55009         };
55010
55011         var vectortilefeature = VectorTileFeature;
55012
55013         function VectorTileFeature(pbf, end, extent, keys, values) {
55014             // Public
55015             this.properties = {};
55016             this.extent = extent;
55017             this.type = 0;
55018
55019             // Private
55020             this._pbf = pbf;
55021             this._geometry = -1;
55022             this._keys = keys;
55023             this._values = values;
55024
55025             pbf.readFields(readFeature, this, end);
55026         }
55027
55028         function readFeature(tag, feature, pbf) {
55029             if (tag == 1) feature.id = pbf.readVarint();
55030             else if (tag == 2) readTag(pbf, feature);
55031             else if (tag == 3) feature.type = pbf.readVarint();
55032             else if (tag == 4) feature._geometry = pbf.pos;
55033         }
55034
55035         function readTag(pbf, feature) {
55036             var end = pbf.readVarint() + pbf.pos;
55037
55038             while (pbf.pos < end) {
55039                 var key = feature._keys[pbf.readVarint()],
55040                     value = feature._values[pbf.readVarint()];
55041                 feature.properties[key] = value;
55042             }
55043         }
55044
55045         VectorTileFeature.types = ['Unknown', 'Point', 'LineString', 'Polygon'];
55046
55047         VectorTileFeature.prototype.loadGeometry = function() {
55048             var pbf = this._pbf;
55049             pbf.pos = this._geometry;
55050
55051             var end = pbf.readVarint() + pbf.pos,
55052                 cmd = 1,
55053                 length = 0,
55054                 x = 0,
55055                 y = 0,
55056                 lines = [],
55057                 line;
55058
55059             while (pbf.pos < end) {
55060                 if (length <= 0) {
55061                     var cmdLen = pbf.readVarint();
55062                     cmd = cmdLen & 0x7;
55063                     length = cmdLen >> 3;
55064                 }
55065
55066                 length--;
55067
55068                 if (cmd === 1 || cmd === 2) {
55069                     x += pbf.readSVarint();
55070                     y += pbf.readSVarint();
55071
55072                     if (cmd === 1) { // moveTo
55073                         if (line) lines.push(line);
55074                         line = [];
55075                     }
55076
55077                     line.push(new pointGeometry(x, y));
55078
55079                 } else if (cmd === 7) {
55080
55081                     // Workaround for https://github.com/mapbox/mapnik-vector-tile/issues/90
55082                     if (line) {
55083                         line.push(line[0].clone()); // closePolygon
55084                     }
55085
55086                 } else {
55087                     throw new Error('unknown command ' + cmd);
55088                 }
55089             }
55090
55091             if (line) lines.push(line);
55092
55093             return lines;
55094         };
55095
55096         VectorTileFeature.prototype.bbox = function() {
55097             var pbf = this._pbf;
55098             pbf.pos = this._geometry;
55099
55100             var end = pbf.readVarint() + pbf.pos,
55101                 cmd = 1,
55102                 length = 0,
55103                 x = 0,
55104                 y = 0,
55105                 x1 = Infinity,
55106                 x2 = -Infinity,
55107                 y1 = Infinity,
55108                 y2 = -Infinity;
55109
55110             while (pbf.pos < end) {
55111                 if (length <= 0) {
55112                     var cmdLen = pbf.readVarint();
55113                     cmd = cmdLen & 0x7;
55114                     length = cmdLen >> 3;
55115                 }
55116
55117                 length--;
55118
55119                 if (cmd === 1 || cmd === 2) {
55120                     x += pbf.readSVarint();
55121                     y += pbf.readSVarint();
55122                     if (x < x1) x1 = x;
55123                     if (x > x2) x2 = x;
55124                     if (y < y1) y1 = y;
55125                     if (y > y2) y2 = y;
55126
55127                 } else if (cmd !== 7) {
55128                     throw new Error('unknown command ' + cmd);
55129                 }
55130             }
55131
55132             return [x1, y1, x2, y2];
55133         };
55134
55135         VectorTileFeature.prototype.toGeoJSON = function(x, y, z) {
55136             var size = this.extent * Math.pow(2, z),
55137                 x0 = this.extent * x,
55138                 y0 = this.extent * y,
55139                 coords = this.loadGeometry(),
55140                 type = VectorTileFeature.types[this.type],
55141                 i, j;
55142
55143             function project(line) {
55144                 for (var j = 0; j < line.length; j++) {
55145                     var p = line[j], y2 = 180 - (p.y + y0) * 360 / size;
55146                     line[j] = [
55147                         (p.x + x0) * 360 / size - 180,
55148                         360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90
55149                     ];
55150                 }
55151             }
55152
55153             switch (this.type) {
55154             case 1:
55155                 var points = [];
55156                 for (i = 0; i < coords.length; i++) {
55157                     points[i] = coords[i][0];
55158                 }
55159                 coords = points;
55160                 project(coords);
55161                 break;
55162
55163             case 2:
55164                 for (i = 0; i < coords.length; i++) {
55165                     project(coords[i]);
55166                 }
55167                 break;
55168
55169             case 3:
55170                 coords = classifyRings(coords);
55171                 for (i = 0; i < coords.length; i++) {
55172                     for (j = 0; j < coords[i].length; j++) {
55173                         project(coords[i][j]);
55174                     }
55175                 }
55176                 break;
55177             }
55178
55179             if (coords.length === 1) {
55180                 coords = coords[0];
55181             } else {
55182                 type = 'Multi' + type;
55183             }
55184
55185             var result = {
55186                 type: "Feature",
55187                 geometry: {
55188                     type: type,
55189                     coordinates: coords
55190                 },
55191                 properties: this.properties
55192             };
55193
55194             if ('id' in this) {
55195                 result.id = this.id;
55196             }
55197
55198             return result;
55199         };
55200
55201         // classifies an array of rings into polygons with outer rings and holes
55202
55203         function classifyRings(rings) {
55204             var len = rings.length;
55205
55206             if (len <= 1) return [rings];
55207
55208             var polygons = [],
55209                 polygon,
55210                 ccw;
55211
55212             for (var i = 0; i < len; i++) {
55213                 var area = signedArea(rings[i]);
55214                 if (area === 0) continue;
55215
55216                 if (ccw === undefined) ccw = area < 0;
55217
55218                 if (ccw === area < 0) {
55219                     if (polygon) polygons.push(polygon);
55220                     polygon = [rings[i]];
55221
55222                 } else {
55223                     polygon.push(rings[i]);
55224                 }
55225             }
55226             if (polygon) polygons.push(polygon);
55227
55228             return polygons;
55229         }
55230
55231         function signedArea(ring) {
55232             var sum = 0;
55233             for (var i = 0, len = ring.length, j = len - 1, p1, p2; i < len; j = i++) {
55234                 p1 = ring[i];
55235                 p2 = ring[j];
55236                 sum += (p2.x - p1.x) * (p1.y + p2.y);
55237             }
55238             return sum;
55239         }
55240
55241         var vectortilelayer = VectorTileLayer;
55242
55243         function VectorTileLayer(pbf, end) {
55244             // Public
55245             this.version = 1;
55246             this.name = null;
55247             this.extent = 4096;
55248             this.length = 0;
55249
55250             // Private
55251             this._pbf = pbf;
55252             this._keys = [];
55253             this._values = [];
55254             this._features = [];
55255
55256             pbf.readFields(readLayer, this, end);
55257
55258             this.length = this._features.length;
55259         }
55260
55261         function readLayer(tag, layer, pbf) {
55262             if (tag === 15) layer.version = pbf.readVarint();
55263             else if (tag === 1) layer.name = pbf.readString();
55264             else if (tag === 5) layer.extent = pbf.readVarint();
55265             else if (tag === 2) layer._features.push(pbf.pos);
55266             else if (tag === 3) layer._keys.push(pbf.readString());
55267             else if (tag === 4) layer._values.push(readValueMessage(pbf));
55268         }
55269
55270         function readValueMessage(pbf) {
55271             var value = null,
55272                 end = pbf.readVarint() + pbf.pos;
55273
55274             while (pbf.pos < end) {
55275                 var tag = pbf.readVarint() >> 3;
55276
55277                 value = tag === 1 ? pbf.readString() :
55278                     tag === 2 ? pbf.readFloat() :
55279                     tag === 3 ? pbf.readDouble() :
55280                     tag === 4 ? pbf.readVarint64() :
55281                     tag === 5 ? pbf.readVarint() :
55282                     tag === 6 ? pbf.readSVarint() :
55283                     tag === 7 ? pbf.readBoolean() : null;
55284             }
55285
55286             return value;
55287         }
55288
55289         // return feature `i` from this layer as a `VectorTileFeature`
55290         VectorTileLayer.prototype.feature = function(i) {
55291             if (i < 0 || i >= this._features.length) throw new Error('feature index out of bounds');
55292
55293             this._pbf.pos = this._features[i];
55294
55295             var end = this._pbf.readVarint() + this._pbf.pos;
55296             return new vectortilefeature(this._pbf, end, this.extent, this._keys, this._values);
55297         };
55298
55299         var vectortile = VectorTile;
55300
55301         function VectorTile(pbf, end) {
55302             this.layers = pbf.readFields(readTile, {}, end);
55303         }
55304
55305         function readTile(tag, layers, pbf) {
55306             if (tag === 3) {
55307                 var layer = new vectortilelayer(pbf, pbf.readVarint() + pbf.pos);
55308                 if (layer.length) layers[layer.name] = layer;
55309             }
55310         }
55311
55312         var VectorTile$1 = vectortile;
55313         var VectorTileFeature$1 = vectortilefeature;
55314         var VectorTileLayer$1 = vectortilelayer;
55315
55316         var vectorTile = {
55317                 VectorTile: VectorTile$1,
55318                 VectorTileFeature: VectorTileFeature$1,
55319                 VectorTileLayer: VectorTileLayer$1
55320         };
55321
55322         var tiler$6 = utilTiler().tileSize(512).margin(1);
55323         var dispatch$7 = dispatch('loadedData');
55324         var _vtCache;
55325
55326
55327         function abortRequest$6(controller) {
55328             controller.abort();
55329         }
55330
55331
55332         function vtToGeoJSON(data, tile, mergeCache) {
55333             var vectorTile$1 = new vectorTile.VectorTile(new pbf(data));
55334             var layers = Object.keys(vectorTile$1.layers);
55335             if (!Array.isArray(layers)) { layers = [layers]; }
55336
55337             var features = [];
55338             layers.forEach(function(layerID) {
55339                 var layer = vectorTile$1.layers[layerID];
55340                 if (layer) {
55341                     for (var i = 0; i < layer.length; i++) {
55342                         var feature = layer.feature(i).toGeoJSON(tile.xyz[0], tile.xyz[1], tile.xyz[2]);
55343                         var geometry = feature.geometry;
55344
55345                         // Treat all Polygons as MultiPolygons
55346                         if (geometry.type === 'Polygon') {
55347                             geometry.type = 'MultiPolygon';
55348                             geometry.coordinates = [geometry.coordinates];
55349                         }
55350
55351                         // Clip to tile bounds
55352                         if (geometry.type === 'MultiPolygon') {
55353                             var isClipped = false;
55354                             var featureClip = turf_bboxClip(feature, tile.extent.rectangle());
55355                             if (!fastDeepEqual(feature.geometry, featureClip.geometry)) {
55356                                 // feature = featureClip;
55357                                 isClipped = true;
55358                             }
55359                             if (!feature.geometry.coordinates.length) continue;   // not actually on this tile
55360                             if (!feature.geometry.coordinates[0].length) continue;   // not actually on this tile
55361                         }
55362
55363                         // Generate some unique IDs and add some metadata
55364                         var featurehash = utilHashcode(fastJsonStableStringify(feature));
55365                         var propertyhash = utilHashcode(fastJsonStableStringify(feature.properties || {}));
55366                         feature.__layerID__ = layerID.replace(/[^_a-zA-Z0-9\-]/g, '_');
55367                         feature.__featurehash__ = featurehash;
55368                         feature.__propertyhash__ = propertyhash;
55369                         features.push(feature);
55370
55371                         // Clipped Polygons at same zoom with identical properties can get merged
55372                         if (isClipped && geometry.type === 'MultiPolygon') {
55373                             var merged = mergeCache[propertyhash];
55374                             if (merged && merged.length) {
55375                                 var other = merged[0];
55376                                 var coords = martinez.union(
55377                                     feature.geometry.coordinates, other.geometry.coordinates
55378                                 );
55379
55380                                 if (!coords || !coords.length) {
55381                                     continue;  // something failed in martinez union
55382                                 }
55383
55384                                 merged.push(feature);
55385                                 for (var j = 0; j < merged.length; j++) {      // all these features get...
55386                                     merged[j].geometry.coordinates = coords;   // same coords
55387                                     merged[j].__featurehash__ = featurehash;   // same hash, so deduplication works
55388                                 }
55389                             } else {
55390                                 mergeCache[propertyhash] = [feature];
55391                             }
55392                         }
55393                     }
55394                 }
55395             });
55396
55397             return features;
55398         }
55399
55400
55401         function loadTile(source, tile) {
55402             if (source.loaded[tile.id] || source.inflight[tile.id]) return;
55403
55404             var url = source.template
55405                 .replace('{x}', tile.xyz[0])
55406                 .replace('{y}', tile.xyz[1])
55407                 // TMS-flipped y coordinate
55408                 .replace(/\{[t-]y\}/, Math.pow(2, tile.xyz[2]) - tile.xyz[1] - 1)
55409                 .replace(/\{z(oom)?\}/, tile.xyz[2])
55410                 .replace(/\{switch:([^}]+)\}/, function(s, r) {
55411                     var subdomains = r.split(',');
55412                     return subdomains[(tile.xyz[0] + tile.xyz[1]) % subdomains.length];
55413                 });
55414
55415
55416             var controller = new AbortController();
55417             source.inflight[tile.id] = controller;
55418
55419             fetch(url, { signal: controller.signal })
55420                 .then(function(response) {
55421                     if (!response.ok) {
55422                         throw new Error(response.status + ' ' + response.statusText);
55423                     }
55424                     source.loaded[tile.id] = [];
55425                     delete source.inflight[tile.id];
55426                     return response.arrayBuffer();
55427                 })
55428                 .then(function(data) {
55429                     if (!data) {
55430                         throw new Error('No Data');
55431                     }
55432
55433                     var z = tile.xyz[2];
55434                     if (!source.canMerge[z]) {
55435                         source.canMerge[z] = {};  // initialize mergeCache
55436                     }
55437
55438                     source.loaded[tile.id] = vtToGeoJSON(data, tile, source.canMerge[z]);
55439                     dispatch$7.call('loadedData');
55440                 })
55441                 .catch(function() {
55442                     source.loaded[tile.id] = [];
55443                     delete source.inflight[tile.id];
55444                 });
55445         }
55446
55447
55448         var serviceVectorTile = {
55449
55450             init: function() {
55451                 if (!_vtCache) {
55452                     this.reset();
55453                 }
55454
55455                 this.event = utilRebind(this, dispatch$7, 'on');
55456             },
55457
55458
55459             reset: function() {
55460                 for (var sourceID in _vtCache) {
55461                     var source = _vtCache[sourceID];
55462                     if (source && source.inflight) {
55463                         Object.values(source.inflight).forEach(abortRequest$6);
55464                     }
55465                 }
55466
55467                 _vtCache = {};
55468             },
55469
55470
55471             addSource: function(sourceID, template) {
55472                 _vtCache[sourceID] = { template: template, inflight: {}, loaded: {}, canMerge: {} };
55473                 return _vtCache[sourceID];
55474             },
55475
55476
55477             data: function(sourceID, projection) {
55478                 var source = _vtCache[sourceID];
55479                 if (!source) return [];
55480
55481                 var tiles = tiler$6.getTiles(projection);
55482                 var seen = {};
55483                 var results = [];
55484
55485                 for (var i = 0; i < tiles.length; i++) {
55486                     var features = source.loaded[tiles[i].id];
55487                     if (!features || !features.length) continue;
55488
55489                     for (var j = 0; j < features.length; j++) {
55490                         var feature = features[j];
55491                         var hash = feature.__featurehash__;
55492                         if (seen[hash]) continue;
55493                         seen[hash] = true;
55494
55495                         // return a shallow copy, because the hash may change
55496                         // later if this feature gets merged with another
55497                         results.push(Object.assign({}, feature));  // shallow copy
55498                     }
55499                 }
55500
55501                 return results;
55502             },
55503
55504
55505             loadTiles: function(sourceID, template, projection) {
55506                 var source = _vtCache[sourceID];
55507                 if (!source) {
55508                     source = this.addSource(sourceID, template);
55509                 }
55510
55511                 var tiles = tiler$6.getTiles(projection);
55512
55513                 // abort inflight requests that are no longer needed
55514                 Object.keys(source.inflight).forEach(function(k) {
55515                     var wanted = tiles.find(function(tile) { return k === tile.id; });
55516                     if (!wanted) {
55517                         abortRequest$6(source.inflight[k]);
55518                         delete source.inflight[k];
55519                     }
55520                 });
55521
55522                 tiles.forEach(function(tile) {
55523                     loadTile(source, tile);
55524                 });
55525             },
55526
55527
55528             cache: function() {
55529                 return _vtCache;
55530             }
55531
55532         };
55533
55534         var apibase$5 = 'https://www.wikidata.org/w/api.php?';
55535         var _wikidataCache = {};
55536
55537
55538         var serviceWikidata = {
55539
55540             init: function() {},
55541
55542             reset: function() {
55543                 _wikidataCache = {};
55544             },
55545
55546
55547             // Search for Wikidata items matching the query
55548             itemsForSearchQuery: function(query, callback) {
55549                 if (!query) {
55550                     if (callback) callback('No query', {});
55551                     return;
55552                 }
55553
55554                 var url = apibase$5 + utilQsString({
55555                     action: 'wbsearchentities',
55556                     format: 'json',
55557                     formatversion: 2,
55558                     search: query,
55559                     type: 'item',
55560                     language: this.languagesToQuery()[0],
55561                     limit: 10,
55562                     origin: '*'
55563                 });
55564
55565                 d3_json(url)
55566                     .then(function(result) {
55567                         if (result && result.error) {
55568                             throw new Error(result.error);
55569                         }
55570                         if (callback) callback(null, result.search || {});
55571                     })
55572                     .catch(function(err) {
55573                         if (callback) callback(err.message, {});
55574                     });
55575             },
55576
55577
55578             // Given a Wikipedia language and article title,
55579             // return an array of corresponding Wikidata entities.
55580             itemsByTitle: function(lang, title, callback) {
55581                 if (!title) {
55582                     if (callback) callback('No title', {});
55583                     return;
55584                 }
55585
55586                 lang = lang || 'en';
55587                 var url = apibase$5 + utilQsString({
55588                     action: 'wbgetentities',
55589                     format: 'json',
55590                     formatversion: 2,
55591                     sites: lang.replace(/-/g, '_') + 'wiki',
55592                     titles: title,
55593                     languages: 'en', // shrink response by filtering to one language
55594                     origin: '*'
55595                 });
55596
55597                 d3_json(url)
55598                     .then(function(result) {
55599                         if (result && result.error) {
55600                             throw new Error(result.error);
55601                         }
55602                         if (callback) callback(null, result.entities || {});
55603                     })
55604                     .catch(function(err) {
55605                         if (callback) callback(err.message, {});
55606                     });
55607             },
55608
55609
55610             languagesToQuery: function() {
55611                 return utilArrayUniq([
55612                     currentLocale.toLowerCase(),
55613                     currentLocale.split('-', 2)[0].toLowerCase(),
55614                     'en'
55615                 ]);
55616             },
55617
55618
55619             entityByQID: function(qid, callback) {
55620                 if (!qid) {
55621                     callback('No qid', {});
55622                     return;
55623                 }
55624                 if (_wikidataCache[qid]) {
55625                     if (callback) callback(null, _wikidataCache[qid]);
55626                     return;
55627                 }
55628
55629                 var langs = this.languagesToQuery();
55630                 var url = apibase$5 + utilQsString({
55631                     action: 'wbgetentities',
55632                     format: 'json',
55633                     formatversion: 2,
55634                     ids: qid,
55635                     props: 'labels|descriptions|claims|sitelinks',
55636                     sitefilter: langs.map(function(d) { return d + 'wiki'; }).join('|'),
55637                     languages: langs.join('|'),
55638                     languagefallback: 1,
55639                     origin: '*'
55640                 });
55641
55642                 d3_json(url)
55643                     .then(function(result) {
55644                         if (result && result.error) {
55645                             throw new Error(result.error);
55646                         }
55647                         if (callback) callback(null, result.entities[qid] || {});
55648                     })
55649                     .catch(function(err) {
55650                         if (callback) callback(err.message, {});
55651                     });
55652             },
55653
55654
55655             // Pass `params` object of the form:
55656             // {
55657             //   qid: 'string'      // brand wikidata  (e.g. 'Q37158')
55658             // }
55659             //
55660             // Get an result object used to display tag documentation
55661             // {
55662             //   title:        'string',
55663             //   description:  'string',
55664             //   editURL:      'string',
55665             //   imageURL:     'string',
55666             //   wiki:         { title: 'string', text: 'string', url: 'string' }
55667             // }
55668             //
55669             getDocs: function(params, callback) {
55670                 var langs = this.languagesToQuery();
55671                 this.entityByQID(params.qid, function(err, entity) {
55672                     if (err || !entity) {
55673                         callback(err || 'No entity');
55674                         return;
55675                     }
55676
55677                     var i;
55678                     var description;
55679                     if (entity.descriptions && Object.keys(entity.descriptions).length > 0) {
55680                         description = entity.descriptions[Object.keys(entity.descriptions)[0]].value;
55681                     }
55682
55683                     // prepare result
55684                     var result = {
55685                         title: entity.id,
55686                         description: description,
55687                         editURL: 'https://www.wikidata.org/wiki/' + entity.id
55688                     };
55689
55690                     // add image
55691                     if (entity.claims) {
55692                         var imageroot = 'https://commons.wikimedia.org/w/index.php';
55693                         var props = ['P154','P18'];  // logo image, image
55694                         var prop, image;
55695                         for (i = 0; i < props.length; i++) {
55696                             prop = entity.claims[props[i]];
55697                             if (prop && Object.keys(prop).length > 0) {
55698                                 image = prop[Object.keys(prop)[0]].mainsnak.datavalue.value;
55699                                 if (image) {
55700                                     result.imageURL = imageroot + '?' + utilQsString({
55701                                         title: 'Special:Redirect/file/' + image,
55702                                         width: 400
55703                                     });
55704                                     break;
55705                                 }
55706                             }
55707                         }
55708                     }
55709
55710                     if (entity.sitelinks) {
55711                         var englishLocale = (currentLocale.split('-', 2)[0].toLowerCase() === 'en');
55712
55713                         // must be one of these that we requested..
55714                         for (i = 0; i < langs.length; i++) {   // check each, in order of preference
55715                             var w = langs[i] + 'wiki';
55716                             if (entity.sitelinks[w]) {
55717                                 var title = entity.sitelinks[w].title;
55718                                 var tKey = 'inspector.wiki_reference';
55719                                 if (!englishLocale && langs[i] === 'en') {   // user's currentLocale isn't English but
55720                                     tKey = 'inspector.wiki_en_reference';    // we are sending them to enwiki anyway..
55721                                 }
55722
55723                                 result.wiki = {
55724                                     title: title,
55725                                     text: tKey,
55726                                     url: 'https://' + langs[i] + '.wikipedia.org/wiki/' + title.replace(/ /g, '_')
55727                                 };
55728                                 break;
55729                             }
55730                         }
55731                     }
55732
55733                     callback(null, result);
55734                 });
55735             }
55736
55737         };
55738
55739         var endpoint = 'https://en.wikipedia.org/w/api.php?';
55740
55741         var serviceWikipedia = {
55742
55743             init: function() {},
55744             reset: function() {},
55745
55746
55747             search: function(lang, query, callback) {
55748                 if (!query) {
55749                     if (callback) callback('No Query', []);
55750                     return;
55751                 }
55752
55753                 lang = lang || 'en';
55754                 var url = endpoint.replace('en', lang) +
55755                     utilQsString({
55756                         action: 'query',
55757                         list: 'search',
55758                         srlimit: '10',
55759                         srinfo: 'suggestion',
55760                         format: 'json',
55761                         origin: '*',
55762                         srsearch: query
55763                     });
55764
55765                 d3_json(url)
55766                     .then(function(result) {
55767                         if (result && result.error) {
55768                             throw new Error(result.error);
55769                         } else if (!result || !result.query || !result.query.search) {
55770                             throw new Error('No Results');
55771                         }
55772                         if (callback) {
55773                             var titles = result.query.search.map(function(d) { return d.title; });
55774                             callback(null, titles);
55775                         }
55776                     })
55777                     .catch(function(err) {
55778                         if (callback) callback(err, []);
55779                     });
55780             },
55781
55782
55783             suggestions: function(lang, query, callback) {
55784                 if (!query) {
55785                     if (callback) callback('', []);
55786                     return;
55787                 }
55788
55789                 lang = lang || 'en';
55790                 var url = endpoint.replace('en', lang) +
55791                     utilQsString({
55792                         action: 'opensearch',
55793                         namespace: 0,
55794                         suggest: '',
55795                         format: 'json',
55796                         origin: '*',
55797                         search: query
55798                     });
55799
55800                 d3_json(url)
55801                     .then(function(result) {
55802                         if (result && result.error) {
55803                             throw new Error(result.error);
55804                         } else if (!result || result.length < 2) {
55805                             throw new Error('No Results');
55806                         }
55807                         if (callback) callback(null, result[1] || []);
55808                     })
55809                     .catch(function(err) {
55810                         if (callback) callback(err.message, []);
55811                     });
55812             },
55813
55814
55815             translations: function(lang, title, callback) {
55816                 if (!title) {
55817                     if (callback) callback('No Title');
55818                     return;
55819                 }
55820
55821                 var url = endpoint.replace('en', lang) +
55822                     utilQsString({
55823                         action: 'query',
55824                         prop: 'langlinks',
55825                         format: 'json',
55826                         origin: '*',
55827                         lllimit: 500,
55828                         titles: title
55829                     });
55830
55831                 d3_json(url)
55832                     .then(function(result) {
55833                         if (result && result.error) {
55834                             throw new Error(result.error);
55835                         } else if (!result || !result.query || !result.query.pages) {
55836                             throw new Error('No Results');
55837                         }
55838                         if (callback) {
55839                             var list = result.query.pages[Object.keys(result.query.pages)[0]];
55840                             var translations = {};
55841                             if (list && list.langlinks) {
55842                                 list.langlinks.forEach(function(d) { translations[d.lang] = d['*']; });
55843                             }
55844                             callback(null, translations);
55845                         }
55846                     })
55847                     .catch(function(err) {
55848                         if (callback) callback(err.message);
55849                     });
55850             }
55851
55852         };
55853
55854         var services$1 = {
55855             geocoder: serviceNominatim,
55856             keepRight: serviceKeepRight,
55857             improveOSM: serviceImproveOSM,
55858             mapillary: serviceMapillary,
55859             openstreetcam: serviceOpenstreetcam,
55860             osm: serviceOsm,
55861             osmWikibase: serviceOsmWikibase,
55862             maprules: serviceMapRules,
55863             streetside: serviceStreetside,
55864             taginfo: serviceTaginfo,
55865             vectorTile: serviceVectorTile,
55866             wikidata: serviceWikidata,
55867             wikipedia: serviceWikipedia
55868         };
55869
55870         function svgIcon(name, svgklass, useklass) {
55871             return function drawIcon(selection) {
55872                 selection.selectAll('svg.icon')
55873                     .data([0])
55874                     .enter()
55875                     .append('svg')
55876                     .attr('class', 'icon ' + (svgklass || ''))
55877                     .append('use')
55878                     .attr('xlink:href', name)
55879                     .attr('class', useklass);
55880             };
55881         }
55882
55883         function uiNoteComments() {
55884             var _note;
55885
55886
55887             function noteComments(selection) {
55888                 if (_note.isNew()) return; // don't draw .comments-container
55889
55890                 var comments = selection.selectAll('.comments-container')
55891                     .data([0]);
55892
55893                 comments = comments.enter()
55894                     .append('div')
55895                     .attr('class', 'comments-container')
55896                     .merge(comments);
55897
55898                 var commentEnter = comments.selectAll('.comment')
55899                     .data(_note.comments)
55900                     .enter()
55901                     .append('div')
55902                     .attr('class', 'comment');
55903
55904                 commentEnter
55905                     .append('div')
55906                     .attr('class', function(d) { return 'comment-avatar user-' + d.uid; })
55907                     .call(svgIcon('#iD-icon-avatar', 'comment-avatar-icon'));
55908
55909                 var mainEnter = commentEnter
55910                     .append('div')
55911                     .attr('class', 'comment-main');
55912
55913                 var metadataEnter = mainEnter
55914                     .append('div')
55915                     .attr('class', 'comment-metadata');
55916
55917                 metadataEnter
55918                     .append('div')
55919                     .attr('class', 'comment-author')
55920                     .each(function(d) {
55921                         var selection = d3_select(this);
55922                         var osm = services$1.osm;
55923                         if (osm && d.user) {
55924                             selection = selection
55925                                 .append('a')
55926                                 .attr('class', 'comment-author-link')
55927                                 .attr('href', osm.userURL(d.user))
55928                                 .attr('tabindex', -1)
55929                                 .attr('target', '_blank');
55930                         }
55931                         selection
55932                             .text(function(d) { return d.user || t('note.anonymous'); });
55933                     });
55934
55935                 metadataEnter
55936                     .append('div')
55937                     .attr('class', 'comment-date')
55938                     .text(function(d) {
55939                         return t('note.status.' + d.action, { when: localeDateString(d.date) });
55940                     });
55941
55942                 mainEnter
55943                     .append('div')
55944                     .attr('class', 'comment-text')
55945                     .html(function(d) { return d.html; });
55946
55947                 comments
55948                     .call(replaceAvatars);
55949             }
55950
55951
55952             function replaceAvatars(selection) {
55953                 var osm = services$1.osm;
55954                 if (!osm) return;
55955
55956                 var uids = {};  // gather uids in the comment thread
55957                 _note.comments.forEach(function(d) {
55958                     if (d.uid) uids[d.uid] = true;
55959                 });
55960
55961                 Object.keys(uids).forEach(function(uid) {
55962                     osm.loadUser(uid, function(err, user) {
55963                         if (!user || !user.image_url) return;
55964
55965                         selection.selectAll('.comment-avatar.user-' + uid)
55966                             .html('')
55967                             .append('img')
55968                             .attr('class', 'icon comment-avatar-icon')
55969                             .attr('src', user.image_url)
55970                             .attr('alt', user.display_name);
55971                     });
55972                 });
55973             }
55974
55975
55976             function localeDateString(s) {
55977                 if (!s) return null;
55978                 var detected = utilDetect();
55979                 var options = { day: 'numeric', month: 'short', year: 'numeric' };
55980                 s = s.replace(/-/g, '/'); // fix browser-specific Date() issues
55981                 var d = new Date(s);
55982                 if (isNaN(d.getTime())) return null;
55983                 return d.toLocaleDateString(detected.locale, options);
55984             }
55985
55986
55987             noteComments.note = function(val) {
55988                 if (!arguments.length) return _note;
55989                 _note = val;
55990                 return noteComments;
55991             };
55992
55993
55994             return noteComments;
55995         }
55996
55997         function uiNoteHeader() {
55998             var _note;
55999
56000
56001             function noteHeader(selection) {
56002                 var header = selection.selectAll('.note-header')
56003                     .data(
56004                         (_note ? [_note] : []),
56005                         function(d) { return d.status + d.id; }
56006                     );
56007
56008                 header.exit()
56009                     .remove();
56010
56011                 var headerEnter = header.enter()
56012                     .append('div')
56013                     .attr('class', 'note-header');
56014
56015                 var iconEnter = headerEnter
56016                     .append('div')
56017                     .attr('class', function(d) { return 'note-header-icon ' + d.status; })
56018                     .classed('new', function(d) { return d.id < 0; });
56019
56020                 iconEnter
56021                     .append('div')
56022                     .attr('class', 'preset-icon-28')
56023                     .call(svgIcon('#iD-icon-note', 'note-fill'));
56024
56025                 iconEnter.each(function(d) {
56026                     var statusIcon = '#iD-icon-' + (d.id < 0 ? 'plus' : (d.status === 'open' ? 'close' : 'apply'));
56027                     iconEnter
56028                         .append('div')
56029                         .attr('class', 'note-icon-annotation')
56030                         .call(svgIcon(statusIcon, 'icon-annotation'));
56031                 });
56032
56033                 headerEnter
56034                     .append('div')
56035                     .attr('class', 'note-header-label')
56036                     .text(function(d) {
56037                         if (_note.isNew()) { return t('note.new'); }
56038                         return t('note.note') + ' ' + d.id + ' ' +
56039                             (d.status === 'closed' ? t('note.closed') : '');
56040                     });
56041             }
56042
56043
56044             noteHeader.note = function(val) {
56045                 if (!arguments.length) return _note;
56046                 _note = val;
56047                 return noteHeader;
56048             };
56049
56050
56051             return noteHeader;
56052         }
56053
56054         function uiNoteReport() {
56055             var _note;
56056
56057             function noteReport(selection) {
56058                 var url;
56059                 if (services$1.osm && (_note instanceof osmNote) && (!_note.isNew())) {
56060                     url = services$1.osm.noteReportURL(_note);
56061                 }
56062
56063                 var link = selection.selectAll('.note-report')
56064                     .data(url ? [url] : []);
56065
56066                 // exit
56067                 link.exit()
56068                     .remove();
56069
56070                 // enter
56071                 var linkEnter = link.enter()
56072                     .append('a')
56073                     .attr('class', 'note-report')
56074                     .attr('target', '_blank')
56075                     .attr('href', function(d) { return d; })
56076                     .call(svgIcon('#iD-icon-out-link', 'inline'));
56077
56078                 linkEnter
56079                     .append('span')
56080                     .text(t('note.report'));
56081             }
56082
56083
56084             noteReport.note = function(val) {
56085                 if (!arguments.length) return _note;
56086                 _note = val;
56087                 return noteReport;
56088             };
56089
56090             return noteReport;
56091         }
56092
56093         var _tooltipID = 0;
56094
56095         function tooltip(klass) {
56096             var _id = _tooltipID++;
56097             var tooltip = function(selection) {
56098                 selection.each(setup);
56099             };
56100             var _animation = utilFunctor(false);
56101             var _title = function() {
56102                 var title = this.getAttribute('data-original-title');
56103                 if (title) {
56104                     return title;
56105                 } else {
56106                     title = this.getAttribute('title');
56107                     this.removeAttribute('title');
56108                     this.setAttribute('data-original-title', title);
56109                 }
56110                 return title;
56111             };
56112             var _html = utilFunctor(false);
56113             var _placement = utilFunctor('top');
56114
56115
56116             tooltip.title = function(val) {
56117                 if (arguments.length) {
56118                     _title = utilFunctor(val);
56119                     return tooltip;
56120                 } else {
56121                     return _title;
56122                 }
56123             };
56124
56125
56126             tooltip.html = function(val) {
56127                 if (arguments.length) {
56128                     _html = utilFunctor(val);
56129                     return tooltip;
56130                 } else {
56131                     return _html;
56132                 }
56133             };
56134
56135
56136             tooltip.placement = function(val) {
56137                 if (arguments.length) {
56138                     _placement = utilFunctor(val);
56139                     return tooltip;
56140                 } else {
56141                     return _placement;
56142                 }
56143             };
56144
56145
56146             tooltip.show = function(selection) {
56147                 selection.each(show);
56148             };
56149
56150
56151             tooltip.hide = function(selection) {
56152                 selection.each(hide);
56153             };
56154
56155
56156             tooltip.toggle = function(selection) {
56157                 selection.each(toggle);
56158             };
56159
56160
56161             tooltip.destroy = function(selection, selector) {
56162                 // by default, just destroy the current tooltip
56163                 selector = selector || '.tooltip-' + _id;
56164
56165                 selection
56166                     .on('mouseenter.tooltip', null)
56167                     .on('mouseleave.tooltip', null)
56168                     .attr('title', function() {
56169                         return this.getAttribute('data-original-title') || this.getAttribute('title');
56170                     })
56171                     .attr('data-original-title', null)
56172                     .selectAll(selector)
56173                     .remove();
56174             };
56175
56176
56177             tooltip.destroyAny = function(selection) {
56178                 selection.call(tooltip.destroy, '.tooltip');
56179             };
56180
56181             var isTouchEvent = false;
56182
56183             function setup() {
56184                 var root = d3_select(this);
56185                 var animate = _animation.apply(this, arguments);
56186                 var tip = root.selectAll('.tooltip-' + _id)
56187                     .data([0]);
56188
56189                 var enter = tip.enter()
56190                     .append('div')
56191                     .attr('class', 'tooltip tooltip-' + _id + ' ' + (klass ? klass : ''));
56192
56193                 enter
56194                     .append('div')
56195                     .attr('class', 'tooltip-arrow');
56196
56197                 enter
56198                     .append('div')
56199                     .attr('class', 'tooltip-inner');
56200
56201                 tip = enter
56202                     .merge(tip);
56203
56204                 if (animate) {
56205                     tip.classed('fade', true);
56206                 }
56207
56208                 var place = _placement.apply(this, arguments);
56209                 tip.classed(place, true);
56210
56211                 root.on('touchstart.tooltip', function() {
56212                     // hack to avoid showing tooltips upon touch input
56213                     isTouchEvent = true;
56214                 });
56215                 root.on('mouseenter.tooltip', show);
56216                 root.on('mouseleave.tooltip', hide);
56217             }
56218
56219
56220             function show() {
56221                 if (isTouchEvent) {
56222                     isTouchEvent = false;
56223                     return;
56224                 }
56225                 var root = d3_select(this);
56226                 var content = _title.apply(this, arguments);
56227                 var tip = root.selectAll('.tooltip-' + _id);
56228
56229                 if (tip.empty()) {   // tooltip was removed somehow, put it back
56230                     root.call(tooltip.destroy);
56231                     root.each(setup);
56232                     tip = root.selectAll('.tooltip-' + _id);
56233                 }
56234
56235                 tip.classed('in', true);
56236                 var markup = _html.apply(this, arguments);
56237
56238                 tip.selectAll('.tooltip-inner')[markup ? 'html' : 'text'](content);
56239                 var place = _placement.apply(this, arguments);
56240                 var outer = getPosition(root.node());
56241                 var inner = getPosition(tip.node());
56242                 var pos;
56243
56244                 switch (place) {
56245                     case 'top':
56246                     pos = { x: outer.x + (outer.w - inner.w) / 2, y: outer.y - inner.h };
56247                     break;
56248                     case 'right':
56249                     pos = { x: outer.x + outer.w, y: outer.y + (outer.h - inner.h) / 2 };
56250                     break;
56251                     case 'left':
56252                     pos = { x: outer.x - inner.w, y: outer.y + (outer.h - inner.h) / 2 };
56253                     break;
56254                     case 'bottom':
56255                     pos = { x: outer.x + (outer.w - inner.w) / 2, y: outer.y + outer.h };
56256                     break;
56257                 }
56258
56259                 if (pos) {
56260                     tip.style('left', ~~pos.x + 'px').style('top', ~~pos.y + 'px');
56261                 } else {
56262                     tip.style('left', null).style('top', null);
56263                 }
56264
56265                 this.tooltipVisible = true;
56266
56267
56268                 function getPosition(node) {
56269                     var mode = d3_select(node).style('position');
56270                     if (mode === 'absolute' || mode === 'static') {
56271                         return {
56272                             x: node.offsetLeft,
56273                             y: node.offsetTop,
56274                             w: node.offsetWidth,
56275                             h: node.offsetHeight
56276                         };
56277                     } else {
56278                         return {
56279                             x: 0,
56280                             y: 0,
56281                             w: node.offsetWidth,
56282                             h: node.offsetHeight
56283                         };
56284                     }
56285                 }
56286             }
56287
56288
56289             function hide() {
56290                 d3_select(this).selectAll('.tooltip-' + _id).classed('in', false);
56291                 this.tooltipVisible = false;
56292             }
56293
56294
56295             function toggle() {
56296                 if (this.tooltipVisible) {
56297                     hide.apply(this, arguments);
56298                 } else {
56299                     show.apply(this, arguments);
56300                 }
56301             }
56302
56303
56304             return tooltip;
56305         }
56306
56307         function uiQuickLinks() {
56308             var _choices = [];
56309
56310
56311             function quickLinks(selection) {
56312                 var container = selection.selectAll('.quick-links')
56313                     .data([0]);
56314
56315                 container = container.enter()
56316                     .append('div')
56317                     .attr('class', 'quick-links')
56318                     .merge(container);
56319
56320                 var items = container.selectAll('.quick-link')
56321                     .data(_choices, function(d) { return d.id; });
56322
56323                 items.exit()
56324                     .remove();
56325
56326                 items.enter()
56327                     .append('a')
56328                     .attr('class', function(d) { return 'quick-link quick-link-' + d.id; })
56329                     .attr('href', '#')
56330                     .text(function(d) { return t(d.label); })
56331                     .each(function(d) {
56332                         if (typeof d.tooltip !== 'function') return;
56333                         d3_select(this)
56334                             .call(tooltip().html(true).title(d.tooltip).placement('bottom'));
56335                     })
56336                     .on('click', function(d) {
56337                         if (typeof d.click !== 'function') return;
56338                         event.preventDefault();
56339                         d.click(d);
56340                     });
56341             }
56342
56343
56344             //  val should be an array of choices like:
56345             //    [{
56346             //       id: 'link-id',
56347             //       label: 'translation.key',
56348             //       tooltip: function(d),
56349             //       click: function(d)
56350             //    }, ..]
56351             quickLinks.choices = function(val) {
56352                 if (!arguments.length) return _choices;
56353                 _choices = val;
56354                 return quickLinks;
56355             };
56356
56357
56358             return quickLinks;
56359         }
56360
56361         function uiTooltipHtml(text, key, heading) {
56362             var s = '';
56363
56364             if (heading) {
56365                 s += '<div class="tooltip-heading"><span>' + heading + '</span></div>';
56366             }
56367             if (text) {
56368                 s += '<div class="tooltip-text"><span>' + text + '</span></div>';
56369             }
56370             if (key) {
56371                 s += '<div class="keyhint-wrap"><span>' + t('tooltip_keyhint') + '</span>' +
56372                     '<span class="keyhint">' + key + '</span></div>';
56373             }
56374
56375             return s;
56376         }
56377
56378         function uiViewOnOSM(context) {
56379             var _what;   // an osmEntity or osmNote
56380
56381
56382             function viewOnOSM(selection) {
56383                 var url;
56384                 if (_what instanceof osmEntity) {
56385                     url = context.connection().entityURL(_what);
56386                 } else if (_what instanceof osmNote) {
56387                     url = context.connection().noteURL(_what);
56388                 }
56389
56390                 var data = ((!_what || _what.isNew()) ? [] : [_what]);
56391                 var link = selection.selectAll('.view-on-osm')
56392                     .data(data, function(d) { return d.id; });
56393
56394                 // exit
56395                 link.exit()
56396                     .remove();
56397
56398                 // enter
56399                 var linkEnter = link.enter()
56400                     .append('a')
56401                     .attr('class', 'view-on-osm')
56402                     .attr('target', '_blank')
56403                     .attr('href', url)
56404                     .call(svgIcon('#iD-icon-out-link', 'inline'));
56405
56406                 linkEnter
56407                     .append('span')
56408                     .text(t('inspector.view_on_osm'));
56409             }
56410
56411
56412             viewOnOSM.what = function(_) {
56413                 if (!arguments.length) return _what;
56414                 _what = _;
56415                 return viewOnOSM;
56416             };
56417
56418             return viewOnOSM;
56419         }
56420
56421         function uiNoteEditor(context) {
56422             var dispatch$1 = dispatch('change');
56423             var quickLinks = uiQuickLinks();
56424             var noteComments = uiNoteComments();
56425             var noteHeader = uiNoteHeader();
56426
56427             // var formFields = uiFormFields(context);
56428
56429             var _note;
56430             // var _fieldsArr;
56431
56432
56433             function noteEditor(selection) {
56434                 // quick links
56435                 var choices = [{
56436                     id: 'zoom_to',
56437                     label: 'inspector.zoom_to.title',
56438                     tooltip: function() {
56439                         return uiTooltipHtml(t('inspector.zoom_to.tooltip_note'), t('inspector.zoom_to.key'));
56440                     },
56441                     click: function zoomTo() {
56442                         context.mode().zoomToSelected();
56443                     }
56444                 }];
56445
56446
56447                 var header = selection.selectAll('.header')
56448                     .data([0]);
56449
56450                 var headerEnter = header.enter()
56451                     .append('div')
56452                     .attr('class', 'header fillL');
56453
56454                 headerEnter
56455                     .append('button')
56456                     .attr('class', 'fr note-editor-close')
56457                     .on('click', function() {
56458                         context.enter(modeBrowse(context));
56459                     })
56460                     .call(svgIcon('#iD-icon-close'));
56461
56462                 headerEnter
56463                     .append('h3')
56464                     .text(t('note.title'));
56465
56466
56467                 var body = selection.selectAll('.body')
56468                     .data([0]);
56469
56470                 body = body.enter()
56471                     .append('div')
56472                     .attr('class', 'body')
56473                     .merge(body);
56474
56475                 var editor = body.selectAll('.note-editor')
56476                     .data([0]);
56477
56478                 editor.enter()
56479                     .append('div')
56480                     .attr('class', 'modal-section note-editor')
56481                     .merge(editor)
56482                     .call(noteHeader.note(_note))
56483                     .call(quickLinks.choices(choices))
56484                     .call(noteComments.note(_note))
56485                     .call(noteSaveSection);
56486
56487
56488                 var footer = selection.selectAll('.footer')
56489                     .data([0]);
56490
56491                 footer.enter()
56492                     .append('div')
56493                     .attr('class', 'footer')
56494                     .merge(footer)
56495                     .call(uiViewOnOSM(context).what(_note))
56496                     .call(uiNoteReport().note(_note));
56497
56498
56499                 // rerender the note editor on any auth change
56500                 var osm = services$1.osm;
56501                 if (osm) {
56502                     osm.on('change.note-save', function() {
56503                         selection.call(noteEditor);
56504                     });
56505                 }
56506             }
56507
56508
56509             function noteSaveSection(selection) {
56510                 var isSelected = (_note && _note.id === context.selectedNoteID());
56511                 var noteSave = selection.selectAll('.note-save')
56512                     .data((isSelected ? [_note] : []), function(d) { return d.status + d.id; });
56513
56514                 // exit
56515                 noteSave.exit()
56516                     .remove();
56517
56518                 // enter
56519                 var noteSaveEnter = noteSave.enter()
56520                     .append('div')
56521                     .attr('class', 'note-save save-section cf');
56522
56523                 // // if new note, show categories to pick from
56524                 // if (_note.isNew()) {
56525                 //     var presets = context.presets();
56526
56527                 //     // NOTE: this key isn't a age and therefore there is no documentation (yet)
56528                 //     _fieldsArr = [
56529                 //         uiField(context, presets.field('category'), null, { show: true, revert: false }),
56530                 //     ];
56531
56532                 //     _fieldsArr.forEach(function(field) {
56533                 //         field
56534                 //             .on('change', changeCategory);
56535                 //     });
56536
56537                 //     noteSaveEnter
56538                 //         .append('div')
56539                 //         .attr('class', 'note-category')
56540                 //         .call(formFields.fieldsArr(_fieldsArr));
56541                 // }
56542
56543                 // function changeCategory() {
56544                 //     // NOTE: perhaps there is a better way to get value
56545                 //     var val = d3_select('input[name=\'category\']:checked').property('__data__') || undefined;
56546
56547                 //     // store the unsaved category with the note itself
56548                 //     _note = _note.update({ newCategory: val });
56549                 //     var osm = services.osm;
56550                 //     if (osm) {
56551                 //         osm.replaceNote(_note);  // update note cache
56552                 //     }
56553                 //     noteSave
56554                 //         .call(noteSaveButtons);
56555                 // }
56556
56557                 noteSaveEnter
56558                     .append('h4')
56559                     .attr('class', '.note-save-header')
56560                     .text(function() {
56561                         return _note.isNew() ? t('note.newDescription') : t('note.newComment');
56562                     });
56563
56564                 noteSaveEnter
56565                     .append('textarea')
56566                     .attr('class', 'new-comment-input')
56567                     .attr('placeholder', t('note.inputPlaceholder'))
56568                     .attr('maxlength', 1000)
56569                     .property('value', function(d) { return d.newComment; })
56570                     .call(utilNoAuto)
56571                     .on('keydown.note-input', keydown)
56572                     .on('input.note-input', changeInput)
56573                     .on('blur.note-input', changeInput);
56574
56575                 // update
56576                 noteSave = noteSaveEnter
56577                     .merge(noteSave)
56578                     .call(userDetails)
56579                     .call(noteSaveButtons);
56580
56581
56582                 // fast submit if user presses cmd+enter
56583                 function keydown() {
56584                     if (!(event.keyCode === 13 && event.metaKey)) return;
56585
56586                     var osm = services$1.osm;
56587                     if (!osm) return;
56588
56589                     var hasAuth = osm.authenticated();
56590                     if (!hasAuth) return;
56591
56592                     if (!_note.newComment) return;
56593
56594                     event.preventDefault();
56595
56596                     d3_select(this)
56597                         .on('keydown.note-input', null);
56598
56599                     // focus on button and submit
56600                     window.setTimeout(function() {
56601                         if (_note.isNew()) {
56602                             noteSave.selectAll('.save-button').node().focus();
56603                             clickSave(_note);
56604                         } else  {
56605                             noteSave.selectAll('.comment-button').node().focus();
56606                             clickComment(_note);
56607                         }
56608                     }, 10);
56609                 }
56610
56611
56612                 function changeInput() {
56613                     var input = d3_select(this);
56614                     var val = input.property('value').trim() || undefined;
56615
56616                     // store the unsaved comment with the note itself
56617                     _note = _note.update({ newComment: val });
56618
56619                     var osm = services$1.osm;
56620                     if (osm) {
56621                         osm.replaceNote(_note);  // update note cache
56622                     }
56623
56624                     noteSave
56625                         .call(noteSaveButtons);
56626                 }
56627             }
56628
56629
56630             function userDetails(selection) {
56631                 var detailSection = selection.selectAll('.detail-section')
56632                     .data([0]);
56633
56634                 detailSection = detailSection.enter()
56635                     .append('div')
56636                     .attr('class', 'detail-section')
56637                     .merge(detailSection);
56638
56639                 var osm = services$1.osm;
56640                 if (!osm) return;
56641
56642                 // Add warning if user is not logged in
56643                 var hasAuth = osm.authenticated();
56644                 var authWarning = detailSection.selectAll('.auth-warning')
56645                     .data(hasAuth ? [] : [0]);
56646
56647                 authWarning.exit()
56648                     .transition()
56649                     .duration(200)
56650                     .style('opacity', 0)
56651                     .remove();
56652
56653                 var authEnter = authWarning.enter()
56654                     .insert('div', '.tag-reference-body')
56655                     .attr('class', 'field-warning auth-warning')
56656                     .style('opacity', 0);
56657
56658                 authEnter
56659                     .call(svgIcon('#iD-icon-alert', 'inline'));
56660
56661                 authEnter
56662                     .append('span')
56663                     .text(t('note.login'));
56664
56665                 authEnter
56666                     .append('a')
56667                     .attr('target', '_blank')
56668                     .call(svgIcon('#iD-icon-out-link', 'inline'))
56669                     .append('span')
56670                     .text(t('login'))
56671                     .on('click.note-login', function() {
56672                         event.preventDefault();
56673                         osm.authenticate();
56674                     });
56675
56676                 authEnter
56677                     .transition()
56678                     .duration(200)
56679                     .style('opacity', 1);
56680
56681
56682                 var prose = detailSection.selectAll('.note-save-prose')
56683                     .data(hasAuth ? [0] : []);
56684
56685                 prose.exit()
56686                     .remove();
56687
56688                 prose = prose.enter()
56689                     .append('p')
56690                     .attr('class', 'note-save-prose')
56691                     .text(t('note.upload_explanation'))
56692                     .merge(prose);
56693
56694                 osm.userDetails(function(err, user) {
56695                     if (err) return;
56696
56697                     var userLink = d3_select(document.createElement('div'));
56698
56699                     if (user.image_url) {
56700                         userLink
56701                             .append('img')
56702                             .attr('src', user.image_url)
56703                             .attr('class', 'icon pre-text user-icon');
56704                     }
56705
56706                     userLink
56707                         .append('a')
56708                         .attr('class', 'user-info')
56709                         .text(user.display_name)
56710                         .attr('href', osm.userURL(user.display_name))
56711                         .attr('tabindex', -1)
56712                         .attr('target', '_blank');
56713
56714                     prose
56715                         .html(t('note.upload_explanation_with_user', { user: userLink.html() }));
56716                 });
56717             }
56718
56719
56720             function noteSaveButtons(selection) {
56721                 var osm = services$1.osm;
56722                 var hasAuth = osm && osm.authenticated();
56723
56724                 var isSelected = (_note && _note.id === context.selectedNoteID());
56725                 var buttonSection = selection.selectAll('.buttons')
56726                     .data((isSelected ? [_note] : []), function(d) { return d.status + d.id; });
56727
56728                 // exit
56729                 buttonSection.exit()
56730                     .remove();
56731
56732                 // enter
56733                 var buttonEnter = buttonSection.enter()
56734                     .append('div')
56735                     .attr('class', 'buttons');
56736
56737                 if (_note.isNew()) {
56738                     buttonEnter
56739                         .append('button')
56740                         .attr('class', 'button cancel-button secondary-action')
56741                         .text(t('confirm.cancel'));
56742
56743                     buttonEnter
56744                         .append('button')
56745                         .attr('class', 'button save-button action')
56746                         .text(t('note.save'));
56747
56748                 } else {
56749                     buttonEnter
56750                         .append('button')
56751                         .attr('class', 'button status-button action');
56752
56753                     buttonEnter
56754                         .append('button')
56755                         .attr('class', 'button comment-button action')
56756                         .text(t('note.comment'));
56757                 }
56758
56759
56760                 // update
56761                 buttonSection = buttonSection
56762                     .merge(buttonEnter);
56763
56764                 buttonSection.select('.cancel-button')   // select and propagate data
56765                     .on('click.cancel', clickCancel);
56766
56767                 buttonSection.select('.save-button')     // select and propagate data
56768                     .attr('disabled', isSaveDisabled)
56769                     .on('click.save', clickSave);
56770
56771                 buttonSection.select('.status-button')   // select and propagate data
56772                     .attr('disabled', (hasAuth ? null : true))
56773                     .text(function(d) {
56774                         var action = (d.status === 'open' ? 'close' : 'open');
56775                         var andComment = (d.newComment ? '_comment' : '');
56776                         return t('note.' + action + andComment);
56777                     })
56778                     .on('click.status', clickStatus);
56779
56780                 buttonSection.select('.comment-button')   // select and propagate data
56781                     .attr('disabled', isSaveDisabled)
56782                     .on('click.comment', clickComment);
56783
56784
56785                 function isSaveDisabled(d) {
56786                     return (hasAuth && d.status === 'open' && d.newComment) ? null : true;
56787                 }
56788             }
56789
56790
56791
56792             function clickCancel(d) {
56793                 this.blur();    // avoid keeping focus on the button - #4641
56794                 var osm = services$1.osm;
56795                 if (osm) {
56796                     osm.removeNote(d);
56797                 }
56798                 context.enter(modeBrowse(context));
56799                 dispatch$1.call('change');
56800             }
56801
56802
56803             function clickSave(d) {
56804                 this.blur();    // avoid keeping focus on the button - #4641
56805                 var osm = services$1.osm;
56806                 if (osm) {
56807                     osm.postNoteCreate(d, function(err, note) {
56808                         dispatch$1.call('change', note);
56809                     });
56810                 }
56811             }
56812
56813
56814             function clickStatus(d) {
56815                 this.blur();    // avoid keeping focus on the button - #4641
56816                 var osm = services$1.osm;
56817                 if (osm) {
56818                     var setStatus = (d.status === 'open' ? 'closed' : 'open');
56819                     osm.postNoteUpdate(d, setStatus, function(err, note) {
56820                         dispatch$1.call('change', note);
56821                     });
56822                 }
56823             }
56824
56825             function clickComment(d) {
56826                 this.blur();    // avoid keeping focus on the button - #4641
56827                 var osm = services$1.osm;
56828                 if (osm) {
56829                     osm.postNoteUpdate(d, d.status, function(err, note) {
56830                         dispatch$1.call('change', note);
56831                     });
56832                 }
56833             }
56834
56835
56836             noteEditor.note = function(val) {
56837                 if (!arguments.length) return _note;
56838                 _note = val;
56839                 return noteEditor;
56840             };
56841
56842
56843             return utilRebind(noteEditor, dispatch$1, 'on');
56844         }
56845
56846         function modeSelectNote(context, selectedNoteID) {
56847             var mode = {
56848                 id: 'select-note',
56849                 button: 'browse'
56850             };
56851
56852             var osm = services$1.osm;
56853             var keybinding = utilKeybinding('select-note');
56854             var noteEditor = uiNoteEditor(context)
56855                 .on('change', function() {
56856                     context.map().pan([0,0]);  // trigger a redraw
56857                     var note = checkSelectedID();
56858                     if (!note) return;
56859                     context.ui().sidebar
56860                         .show(noteEditor.note(note));
56861                 });
56862
56863             var behaviors = [
56864                 behaviorBreathe(),
56865                 behaviorHover(context),
56866                 behaviorSelect(context),
56867                 behaviorLasso(context),
56868                 modeDragNode(context).behavior,
56869                 modeDragNote(context).behavior
56870             ];
56871
56872             var newFeature = false;
56873
56874
56875             function checkSelectedID() {
56876                 if (!osm) return;
56877                 var note = osm.getNote(selectedNoteID);
56878                 if (!note) {
56879                     context.enter(modeBrowse(context));
56880                 }
56881                 return note;
56882             }
56883
56884
56885             // class the note as selected, or return to browse mode if the note is gone
56886             function selectNote(drawn) {
56887                 if (!checkSelectedID()) return;
56888
56889                 var selection = context.surface().selectAll('.layer-notes .note-' + selectedNoteID);
56890
56891                 if (selection.empty()) {
56892                     // Return to browse mode if selected DOM elements have
56893                     // disappeared because the user moved them out of view..
56894                     var source = event && event.type === 'zoom' && event.sourceEvent;
56895                     if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
56896                         context.enter(modeBrowse(context));
56897                     }
56898
56899                 } else {
56900                     selection
56901                         .classed('selected', true);
56902
56903                     context.selectedNoteID(selectedNoteID);
56904                 }
56905             }
56906
56907
56908             function esc() {
56909                 if (d3_select('.combobox').size()) return;
56910                 context.enter(modeBrowse(context));
56911             }
56912
56913
56914             mode.zoomToSelected = function() {
56915                 if (!osm) return;
56916                 var note = osm.getNote(selectedNoteID);
56917                 if (note) {
56918                     context.map().centerZoomEase(note.loc, 20);
56919                 }
56920             };
56921
56922
56923             mode.newFeature = function(val) {
56924                 if (!arguments.length) return newFeature;
56925                 newFeature = val;
56926                 return mode;
56927             };
56928
56929
56930             mode.enter = function() {
56931                 var note = checkSelectedID();
56932                 if (!note) return;
56933
56934                 behaviors.forEach(context.install);
56935
56936                 keybinding
56937                     .on(t('inspector.zoom_to.key'), mode.zoomToSelected)
56938                     .on('⎋', esc, true);
56939
56940                 d3_select(document)
56941                     .call(keybinding);
56942
56943                 selectNote();
56944
56945                 var sidebar = context.ui().sidebar;
56946                 sidebar.show(noteEditor.note(note));
56947
56948                 // expand the sidebar, avoid obscuring the note if needed
56949                 sidebar.expand(sidebar.intersects(note.extent()));
56950
56951                 context.map()
56952                     .on('drawn.select', selectNote);
56953             };
56954
56955
56956             mode.exit = function() {
56957                 behaviors.forEach(context.uninstall);
56958
56959                 d3_select(document)
56960                     .call(keybinding.unbind);
56961
56962                 context.surface()
56963                     .selectAll('.layer-notes .selected')
56964                     .classed('selected hover', false);
56965
56966                 context.map()
56967                     .on('drawn.select', null);
56968
56969                 context.ui().sidebar
56970                     .hide();
56971
56972                 context.selectedNoteID(null);
56973             };
56974
56975
56976             return mode;
56977         }
56978
56979         function modeDragNote(context) {
56980             var mode = {
56981                 id: 'drag-note',
56982                 button: 'browse'
56983             };
56984
56985             var edit = behaviorEdit(context);
56986
56987             var _nudgeInterval;
56988             var _lastLoc;
56989             var _note;    // most current note.. dragged note may have stale datum.
56990
56991
56992             function startNudge(nudge) {
56993                 if (_nudgeInterval) window.clearInterval(_nudgeInterval);
56994                 _nudgeInterval = window.setInterval(function() {
56995                     context.pan(nudge);
56996                     doMove(nudge);
56997                 }, 50);
56998             }
56999
57000
57001             function stopNudge() {
57002                 if (_nudgeInterval) {
57003                     window.clearInterval(_nudgeInterval);
57004                     _nudgeInterval = null;
57005                 }
57006             }
57007
57008
57009             function origin(note) {
57010                 return context.projection(note.loc);
57011             }
57012
57013
57014             function start(note) {
57015                 _note = note;
57016                 var osm = services$1.osm;
57017                 if (osm) {
57018                     // Get latest note from cache.. The marker may have a stale datum bound to it
57019                     // and dragging it around can sometimes delete the users note comment.
57020                     _note = osm.getNote(_note.id);
57021                 }
57022
57023                 context.surface().selectAll('.note-' + _note.id)
57024                     .classed('active', true);
57025
57026                 context.perform(actionNoop());
57027                 context.enter(mode);
57028                 context.selectedNoteID(_note.id);
57029             }
57030
57031
57032             function move() {
57033                 event.sourceEvent.stopPropagation();
57034                 _lastLoc = context.projection.invert(event.point);
57035
57036                 doMove();
57037                 var nudge = geoViewportEdge(event.point, context.map().dimensions());
57038                 if (nudge) {
57039                     startNudge(nudge);
57040                 } else {
57041                     stopNudge();
57042                 }
57043             }
57044
57045
57046             function doMove(nudge) {
57047                 nudge = nudge || [0, 0];
57048
57049                 var currPoint = (event && event.point) || context.projection(_lastLoc);
57050                 var currMouse = geoVecSubtract(currPoint, nudge);
57051                 var loc = context.projection.invert(currMouse);
57052
57053                 _note = _note.move(loc);
57054
57055                 var osm = services$1.osm;
57056                 if (osm) {
57057                     osm.replaceNote(_note);  // update note cache
57058                 }
57059
57060                 context.replace(actionNoop());   // trigger redraw
57061             }
57062
57063
57064             function end() {
57065                 context.replace(actionNoop());   // trigger redraw
57066
57067                 context
57068                     .selectedNoteID(_note.id)
57069                     .enter(modeSelectNote(context, _note.id));
57070             }
57071
57072
57073             var drag = behaviorDrag()
57074                 .selector('.layer-touch.markers .target.note.new')
57075                 .surface(d3_select('#map').node())
57076                 .origin(origin)
57077                 .on('start', start)
57078                 .on('move', move)
57079                 .on('end', end);
57080
57081
57082             mode.enter = function() {
57083                 context.install(edit);
57084             };
57085
57086
57087             mode.exit = function() {
57088                 context.ui().sidebar.hover.cancel();
57089                 context.uninstall(edit);
57090
57091                 context.surface()
57092                     .selectAll('.active')
57093                     .classed('active', false);
57094
57095                 stopNudge();
57096             };
57097
57098             mode.behavior = drag;
57099
57100             return mode;
57101         }
57102
57103         function uiDataHeader() {
57104             var _datum;
57105
57106
57107             function dataHeader(selection) {
57108                 var header = selection.selectAll('.data-header')
57109                     .data(
57110                         (_datum ? [_datum] : []),
57111                         function(d) { return d.__featurehash__; }
57112                     );
57113
57114                 header.exit()
57115                     .remove();
57116
57117                 var headerEnter = header.enter()
57118                     .append('div')
57119                     .attr('class', 'data-header');
57120
57121                 var iconEnter = headerEnter
57122                     .append('div')
57123                     .attr('class', 'data-header-icon');
57124
57125                 iconEnter
57126                     .append('div')
57127                     .attr('class', 'preset-icon-28')
57128                     .call(svgIcon('#iD-icon-data', 'note-fill'));
57129
57130                 headerEnter
57131                     .append('div')
57132                     .attr('class', 'data-header-label')
57133                     .text(t('map_data.layers.custom.title'));
57134             }
57135
57136
57137             dataHeader.datum = function(val) {
57138                 if (!arguments.length) return _datum;
57139                 _datum = val;
57140                 return this;
57141             };
57142
57143
57144             return dataHeader;
57145         }
57146
57147         // This code assumes that the combobox values will not have duplicate entries.
57148         // It is keyed on the `value` of the entry. Data should be an array of objects like:
57149         //   [{
57150         //       value:  'display text',  // required
57151         //       title:  'hover text'     // optional
57152         //   }, ...]
57153
57154         var _comboHideTimerID;
57155
57156         function uiCombobox(context, klass) {
57157             var dispatch$1 = dispatch('accept', 'cancel');
57158             var container = context.container();
57159
57160             var _suggestions = [];
57161             var _data = [];
57162             var _fetched = {};
57163             var _selected = null;
57164             var _canAutocomplete = true;
57165             var _caseSensitive = false;
57166             var _cancelFetch = false;
57167             var _minItems = 2;
57168             var _tDown = 0;
57169
57170             var _fetcher = function(val, cb) {
57171                 cb(_data.filter(function(d) {
57172                     return d.value
57173                         .toString()
57174                         .toLowerCase()
57175                         .indexOf(val.toLowerCase()) !== -1;
57176                 }));
57177             };
57178
57179             var combobox = function(input, attachTo) {
57180                 if (!input || input.empty()) return;
57181
57182                 input
57183                     .classed('combobox-input', true)
57184                     .on('focus.combo-input', focus)
57185                     .on('blur.combo-input', blur)
57186                     .on('keydown.combo-input', keydown)
57187                     .on('keyup.combo-input', keyup)
57188                     .on('input.combo-input', change)
57189                     .on('mousedown.combo-input', mousedown)
57190                     .each(function() {
57191                         var parent = this.parentNode;
57192                         var sibling = this.nextSibling;
57193
57194                         d3_select(parent).selectAll('.combobox-caret')
57195                             .filter(function(d) { return d === input.node(); })
57196                             .data([input.node()])
57197                             .enter()
57198                             .insert('div', function() { return sibling; })
57199                             .attr('class', 'combobox-caret')
57200                             .on('mousedown.combo-caret', function() {
57201                                 event.preventDefault(); // don't steal focus from input
57202                                 input.node().focus(); // focus the input as if it was clicked
57203                                 mousedown();
57204                             })
57205                             .on('mouseup.combo-caret', function() {
57206                                 event.preventDefault(); // don't steal focus from input
57207                                 mouseup();
57208                             });
57209                     });
57210
57211
57212                 function mousedown() {
57213                     if (event.button !== 0) return;    // left click only
57214                     _tDown = +new Date();
57215
57216                     // clear selection
57217                     var start = input.property('selectionStart');
57218                     var end = input.property('selectionEnd');
57219                     if (start !== end) {
57220                         var val = utilGetSetValue(input);
57221                         input.node().setSelectionRange(val.length, val.length);
57222                         return;
57223                     }
57224
57225                     input.on('mouseup.combo-input', mouseup);
57226                 }
57227
57228
57229                 function mouseup() {
57230                     input.on('mouseup.combo-input', null);
57231                     if (event.button !== 0) return;    // left click only
57232                     if (input.node() !== document.activeElement) return;   // exit if this input is not focused
57233
57234                     var start = input.property('selectionStart');
57235                     var end = input.property('selectionEnd');
57236                     if (start !== end) return;  // exit if user is selecting
57237
57238                     // not showing or showing for a different field - try to show it.
57239                     var combo = container.selectAll('.combobox');
57240                     if (combo.empty() || combo.datum() !== input.node()) {
57241                         var tOrig = _tDown;
57242                         window.setTimeout(function() {
57243                             if (tOrig !== _tDown) return;   // exit if user double clicked
57244                             fetchComboData('', function() {
57245                                 show();
57246                                 render();
57247                             });
57248                         }, 250);
57249
57250                     } else {
57251                         hide();
57252                     }
57253                 }
57254
57255
57256                 function focus() {
57257                     fetchComboData('');   // prefetch values (may warm taginfo cache)
57258                 }
57259
57260
57261                 function blur() {
57262                     _comboHideTimerID = window.setTimeout(hide, 75);
57263                 }
57264
57265
57266                 function show() {
57267                     hide();   // remove any existing
57268
57269                     container
57270                         .insert('div', ':first-child')
57271                         .datum(input.node())
57272                         .attr('class', 'combobox' + (klass ? ' combobox-' + klass : ''))
57273                         .style('position', 'absolute')
57274                         .style('display', 'block')
57275                         .style('left', '0px')
57276                         .on('mousedown.combo-container', function () {
57277                             // prevent moving focus out of the input field
57278                             event.preventDefault();
57279                         });
57280
57281                     d3_select('body')
57282                         .on('scroll.combo-scroll', render, true);
57283                 }
57284
57285
57286                 function hide() {
57287                     if (_comboHideTimerID) {
57288                         window.clearTimeout(_comboHideTimerID);
57289                         _comboHideTimerID = undefined;
57290                     }
57291
57292                     container.selectAll('.combobox')
57293                         .remove();
57294
57295                     d3_select('body')
57296                         .on('scroll.combo-scroll', null);
57297                 }
57298
57299
57300                 function keydown() {
57301                     var shown = !container.selectAll('.combobox').empty();
57302                     var tagName = input.node() ? input.node().tagName.toLowerCase() : '';
57303
57304                     switch (event.keyCode) {
57305                         case 8:   // ⌫ Backspace
57306                         case 46:  // ⌦ Delete
57307                             event.stopPropagation();
57308                             _selected = null;
57309                             render();
57310                             input.on('input.combo-input', function() {
57311                                 var start = input.property('selectionStart');
57312                                 input.node().setSelectionRange(start, start);
57313                                 input.on('input.combo-input', change);
57314                             });
57315                             break;
57316
57317                         case 9:   // ⇥ Tab
57318                             accept();
57319                             break;
57320
57321                         case 13:  // ↩ Return
57322                             event.preventDefault();
57323                             event.stopPropagation();
57324                             break;
57325
57326                         case 38:  // ↑ Up arrow
57327                             if (tagName === 'textarea' && !shown) return;
57328                             event.preventDefault();
57329                             if (tagName === 'input' && !shown) {
57330                                 show();
57331                             }
57332                             nav(-1);
57333                             break;
57334
57335                         case 40:  // ↓ Down arrow
57336                             if (tagName === 'textarea' && !shown) return;
57337                             event.preventDefault();
57338                             if (tagName === 'input' && !shown) {
57339                                 show();
57340                             }
57341                             nav(+1);
57342                             break;
57343                     }
57344                 }
57345
57346
57347                 function keyup() {
57348                     switch (event.keyCode) {
57349                         case 27:  // ⎋ Escape
57350                             cancel();
57351                             break;
57352
57353                         case 13:  // ↩ Return
57354                             accept();
57355                             break;
57356                     }
57357                 }
57358
57359
57360                 // Called whenever the input value is changed (e.g. on typing)
57361                 function change() {
57362                     fetchComboData(value(), function() {
57363                         _selected = null;
57364                         var val = input.property('value');
57365
57366                         if (_suggestions.length) {
57367                             if (input.property('selectionEnd') === val.length) {
57368                                 _selected = tryAutocomplete();
57369                             }
57370
57371                             if (!_selected) {
57372                                 _selected = val;
57373                             }
57374                         }
57375
57376                         if (val.length) {
57377                             var combo = container.selectAll('.combobox');
57378                             if (combo.empty()) {
57379                                 show();
57380                             }
57381                         } else {
57382                             hide();
57383                         }
57384
57385                         render();
57386                     });
57387                 }
57388
57389
57390                 // Called when the user presses up/down arrows to navigate the list
57391                 function nav(dir) {
57392                     if (_suggestions.length) {
57393                         // try to determine previously selected index..
57394                         var index = -1;
57395                         for (var i = 0; i < _suggestions.length; i++) {
57396                             if (_selected && _suggestions[i].value === _selected) {
57397                                 index = i;
57398                                 break;
57399                             }
57400                         }
57401
57402                         // pick new _selected
57403                         index = Math.max(Math.min(index + dir, _suggestions.length - 1), 0);
57404                         _selected = _suggestions[index].value;
57405                         input.property('value', _selected);
57406                     }
57407
57408                     render();
57409                     ensureVisible();
57410                 }
57411
57412
57413                 function ensureVisible() {
57414                     var combo = container.selectAll('.combobox');
57415                     if (combo.empty()) return;
57416
57417                     var containerRect = container.node().getBoundingClientRect();
57418                     var comboRect = combo.node().getBoundingClientRect();
57419
57420                     if (comboRect.bottom > containerRect.bottom) {
57421                         var node = attachTo ? attachTo.node() : input.node();
57422                         node.scrollIntoView({ behavior: 'instant', block: 'center' });
57423                         render();
57424                     }
57425
57426                     // https://stackoverflow.com/questions/11039885/scrollintoview-causing-the-whole-page-to-move
57427                     var selected = combo.selectAll('.combobox-option.selected').node();
57428                     if (selected) {
57429                         selected.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
57430                     }
57431                 }
57432
57433
57434                 function value() {
57435                     var value = input.property('value');
57436                     var start = input.property('selectionStart');
57437                     var end = input.property('selectionEnd');
57438
57439                     if (start && end) {
57440                         value = value.substring(0, start);
57441                     }
57442
57443                     return value;
57444                 }
57445
57446
57447                 function fetchComboData(v, cb) {
57448                     _cancelFetch = false;
57449
57450                     _fetcher.call(input, v, function(results) {
57451                         // already chose a value, don't overwrite or autocomplete it
57452                         if (_cancelFetch) return;
57453
57454                         _suggestions = results;
57455                         results.forEach(function(d) { _fetched[d.value] = d; });
57456
57457                         if (cb) {
57458                             cb();
57459                         }
57460                     });
57461                 }
57462
57463
57464                 function tryAutocomplete() {
57465                     if (!_canAutocomplete) return;
57466
57467                     var val = _caseSensitive ? value() : value().toLowerCase();
57468                     if (!val) return;
57469
57470                     // Don't autocomplete if user is typing a number - #4935
57471                     if (!isNaN(parseFloat(val)) && isFinite(val)) return;
57472
57473                     var bestIndex = -1;
57474                     for (var i = 0; i < _suggestions.length; i++) {
57475                         var suggestion = _suggestions[i].value;
57476                         var compare = _caseSensitive ? suggestion : suggestion.toLowerCase();
57477
57478                         // if search string matches suggestion exactly, pick it..
57479                         if (compare === val) {
57480                             bestIndex = i;
57481                             break;
57482
57483                         // otherwise lock in the first result that starts with the search string..
57484                         } else if (bestIndex === -1 && compare.indexOf(val) === 0) {
57485                             bestIndex = i;
57486                         }
57487                     }
57488
57489                     if (bestIndex !== -1) {
57490                         var bestVal = _suggestions[bestIndex].value;
57491                         input.property('value', bestVal);
57492                         input.node().setSelectionRange(val.length, bestVal.length);
57493                         return bestVal;
57494                     }
57495                 }
57496
57497
57498                 function render() {
57499                     if (_suggestions.length < _minItems || document.activeElement !== input.node()) {
57500                         hide();
57501                         return;
57502                     }
57503
57504                     var shown = !container.selectAll('.combobox').empty();
57505                     if (!shown) return;
57506
57507                     var combo = container.selectAll('.combobox');
57508                     var options = combo.selectAll('.combobox-option')
57509                         .data(_suggestions, function(d) { return d.value; });
57510
57511                     options.exit()
57512                         .remove();
57513
57514                     // enter/update
57515                     options.enter()
57516                         .append('a')
57517                         .attr('class', 'combobox-option')
57518                         .attr('title', function(d) { return d.title; })
57519                         .text(function(d) { return d.display || d.value; })
57520                         .merge(options)
57521                         .classed('selected', function(d) { return d.value === _selected; })
57522                         .on('click.combo-option', accept)
57523                         .order();
57524
57525                     var node = attachTo ? attachTo.node() : input.node();
57526                     var rect = node.getBoundingClientRect();
57527
57528                     combo
57529                         .style('left', (rect.left + 5) + 'px')
57530                         .style('width', (rect.width - 10) + 'px')
57531                         .style('top', rect.height + rect.top + 'px');
57532                 }
57533
57534
57535                 // Dispatches an 'accept' event
57536                 // Then hides the combobox.
57537                 function accept(d) {
57538                     _cancelFetch = true;
57539                     var thiz = input.node();
57540
57541                     if (d) {   // user clicked on a suggestion
57542                         utilGetSetValue(input, d.value);    // replace field contents
57543                         utilTriggerEvent(input, 'change');
57544                     }
57545
57546                     // clear (and keep) selection
57547                     var val = utilGetSetValue(input);
57548                     thiz.setSelectionRange(val.length, val.length);
57549
57550                     d = _fetched[val];
57551                     dispatch$1.call('accept', thiz, d, val);
57552                     hide();
57553                 }
57554
57555
57556                 // Dispatches an 'cancel' event
57557                 // Then hides the combobox.
57558                 function cancel() {
57559                     _cancelFetch = true;
57560                     var thiz = input.node();
57561
57562                     // clear (and remove) selection, and replace field contents
57563                     var val = utilGetSetValue(input);
57564                     var start = input.property('selectionStart');
57565                     var end = input.property('selectionEnd');
57566                     val = val.slice(0, start) + val.slice(end);
57567                     utilGetSetValue(input, val);
57568                     thiz.setSelectionRange(val.length, val.length);
57569
57570                     dispatch$1.call('cancel', thiz);
57571                     hide();
57572                 }
57573
57574             };
57575
57576
57577             combobox.canAutocomplete = function(val) {
57578                 if (!arguments.length) return _canAutocomplete;
57579                 _canAutocomplete = val;
57580                 return combobox;
57581             };
57582
57583             combobox.caseSensitive = function(val) {
57584                 if (!arguments.length) return _caseSensitive;
57585                 _caseSensitive = val;
57586                 return combobox;
57587             };
57588
57589             combobox.data = function(val) {
57590                 if (!arguments.length) return _data;
57591                 _data = val;
57592                 return combobox;
57593             };
57594
57595             combobox.fetcher = function(val) {
57596                 if (!arguments.length) return _fetcher;
57597                 _fetcher = val;
57598                 return combobox;
57599             };
57600
57601             combobox.minItems = function(val) {
57602                 if (!arguments.length) return _minItems;
57603                 _minItems = val;
57604                 return combobox;
57605             };
57606
57607
57608             return utilRebind(combobox, dispatch$1, 'on');
57609         }
57610
57611
57612         uiCombobox.off = function(input) {
57613             input
57614                 .on('focus.combo-input', null)
57615                 .on('blur.combo-input', null)
57616                 .on('keydown.combo-input', null)
57617                 .on('keyup.combo-input', null)
57618                 .on('input.combo-input', null)
57619                 .on('mousedown.combo-input', null)
57620                 .on('mouseup.combo-input', null);
57621
57622
57623             d3_select('body')
57624                 .on('scroll.combo-scroll', null);
57625         };
57626
57627         // toggles the visibility of ui elements, using a combination of the
57628         // hide class, which sets display=none, and a d3 transition for opacity.
57629         // this will cause blinking when called repeatedly, so check that the
57630         // value actually changes between calls.
57631         function uiToggle(show, callback) {
57632             return function(selection) {
57633                 selection
57634                     .style('opacity', show ? 0 : 1)
57635                     .classed('hide', false)
57636                     .transition()
57637                     .style('opacity', show ? 1 : 0)
57638                     .on('end', function() {
57639                         d3_select(this)
57640                             .classed('hide', !show)
57641                             .style('opacity', null);
57642                         if (callback) callback.apply(this);
57643                     });
57644             };
57645         }
57646
57647         function uiDisclosure(context, key, expandedDefault) {
57648             var dispatch$1 = dispatch('toggled');
57649             var _preference = (context.storage('disclosure.' + key + '.expanded'));
57650             var _expanded = (_preference === null ? !!expandedDefault : (_preference === 'true'));
57651             var _title;
57652             var _updatePreference = true;
57653             var _content = function () {};
57654
57655
57656             var disclosure = function(selection) {
57657                 var hideToggle = selection.selectAll('.hide-toggle-' + key)
57658                     .data([0]);
57659
57660                 // enter
57661                 var hideToggleEnter = hideToggle.enter()
57662                     .append('a')
57663                     .attr('href', '#')
57664                     .attr('class', 'hide-toggle hide-toggle-' + key)
57665                     .call(svgIcon('', 'pre-text', 'hide-toggle-icon'));
57666
57667                 hideToggleEnter
57668                     .append('span')
57669                     .attr('class', 'hide-toggle-text');
57670
57671                 // update
57672                 hideToggle = hideToggleEnter
57673                     .merge(hideToggle);
57674
57675                 hideToggle
57676                     .on('click', toggle)
57677                     .classed('expanded', _expanded);
57678
57679                 hideToggle.selectAll('.hide-toggle-text')
57680                     .text(_title);
57681
57682                 hideToggle.selectAll('.hide-toggle-icon')
57683                     .attr('xlink:href', _expanded ? '#iD-icon-down'
57684                         : (textDirection === 'rtl') ? '#iD-icon-backward' : '#iD-icon-forward'
57685                     );
57686
57687
57688                 var wrap = selection.selectAll('.disclosure-wrap')
57689                     .data([0]);
57690
57691                 // enter/update
57692                 wrap = wrap.enter()
57693                     .append('div')
57694                     .attr('class', 'disclosure-wrap disclosure-wrap-' + key)
57695                     .merge(wrap)
57696                     .classed('hide', !_expanded);
57697
57698                 if (_expanded) {
57699                     wrap
57700                         .call(_content);
57701                 }
57702
57703
57704                 function toggle() {
57705                     event.preventDefault();
57706
57707                     _expanded = !_expanded;
57708
57709                     if (_updatePreference) {
57710                         context.storage('disclosure.' + key + '.expanded', _expanded);
57711                     }
57712
57713                     hideToggle
57714                         .classed('expanded', _expanded);
57715
57716                     hideToggle.selectAll('.hide-toggle-icon')
57717                         .attr('xlink:href', _expanded ? '#iD-icon-down'
57718                             : (textDirection === 'rtl') ? '#iD-icon-backward' : '#iD-icon-forward'
57719                         );
57720
57721                     wrap
57722                         .call(uiToggle(_expanded));
57723
57724                     if (_expanded) {
57725                         wrap
57726                             .call(_content);
57727                     }
57728
57729                     dispatch$1.call('toggled', this, _expanded);
57730                 }
57731             };
57732
57733
57734             disclosure.title = function(val) {
57735                 if (!arguments.length) return _title;
57736                 _title = val;
57737                 return disclosure;
57738             };
57739
57740
57741             disclosure.expanded = function(val) {
57742                 if (!arguments.length) return _expanded;
57743                 _expanded = val;
57744                 return disclosure;
57745             };
57746
57747
57748             disclosure.updatePreference = function(val) {
57749                 if (!arguments.length) return _updatePreference;
57750                 _updatePreference = val;
57751                 return disclosure;
57752             };
57753
57754
57755             disclosure.content = function(val) {
57756                 if (!arguments.length) return _content;
57757                 _content = val;
57758                 return disclosure;
57759             };
57760
57761
57762             return utilRebind(disclosure, dispatch$1, 'on');
57763         }
57764
57765         // Pass `which` object of the form:
57766         // {
57767         //   key: 'string',     // required
57768         //   value: 'string'    // optional
57769         // }
57770         //   -or-
57771         // {
57772         //   rtype: 'string'    // relation type  (e.g. 'multipolygon')
57773         // }
57774         //   -or-
57775         // {
57776         //   qid: 'string'      // brand wikidata  (e.g. 'Q37158')
57777         // }
57778         //
57779         function uiTagReference(what) {
57780             var wikibase = what.qid ? services$1.wikidata : services$1.osmWikibase;
57781             var tagReference = {};
57782
57783             var _button = d3_select(null);
57784             var _body = d3_select(null);
57785             var _loaded;
57786             var _showing;
57787
57788
57789             function load() {
57790                 if (!wikibase) return;
57791
57792                 _button
57793                     .classed('tag-reference-loading', true);
57794
57795                 wikibase.getDocs(what, gotDocs);
57796             }
57797
57798
57799             function gotDocs(err, docs) {
57800                 _body.html('');
57801
57802                 if (!docs || !docs.title) {
57803                     _body
57804                         .append('p')
57805                         .attr('class', 'tag-reference-description')
57806                         .text(t('inspector.no_documentation_key'));
57807                     done();
57808                     return;
57809                 }
57810
57811                 if (docs.imageURL) {
57812                     _body
57813                         .append('img')
57814                         .attr('class', 'tag-reference-wiki-image')
57815                         .attr('src', docs.imageURL)
57816                         .on('load', function() { done(); })
57817                         .on('error', function() { d3_select(this).remove(); done(); });
57818                 } else {
57819                     done();
57820                 }
57821
57822                 _body
57823                     .append('p')
57824                     .attr('class', 'tag-reference-description')
57825                     .text(docs.description || t('inspector.no_documentation_key'))
57826                     .append('a')
57827                     .attr('class', 'tag-reference-edit')
57828                     .attr('target', '_blank')
57829                     .attr('tabindex', -1)
57830                     .attr('title', t('inspector.edit_reference'))
57831                     .attr('href', docs.editURL)
57832                     .call(svgIcon('#iD-icon-edit', 'inline'));
57833
57834                 if (docs.wiki) {
57835                     _body
57836                       .append('a')
57837                       .attr('class', 'tag-reference-link')
57838                       .attr('target', '_blank')
57839                       .attr('tabindex', -1)
57840                       .attr('href', docs.wiki.url)
57841                       .call(svgIcon('#iD-icon-out-link', 'inline'))
57842                       .append('span')
57843                       .text(t(docs.wiki.text));
57844                 }
57845
57846                 // Add link to info about "good changeset comments" - #2923
57847                 if (what.key === 'comment') {
57848                     _body
57849                         .append('a')
57850                         .attr('class', 'tag-reference-comment-link')
57851                         .attr('target', '_blank')
57852                         .attr('tabindex', -1)
57853                         .call(svgIcon('#iD-icon-out-link', 'inline'))
57854                         .attr('href', t('commit.about_changeset_comments_link'))
57855                         .append('span')
57856                         .text(t('commit.about_changeset_comments'));
57857                 }
57858             }
57859
57860
57861             function done() {
57862                 _loaded = true;
57863
57864                 _button
57865                     .classed('tag-reference-loading', false);
57866
57867                 _body
57868                     .classed('expanded', true)
57869                     .transition()
57870                     .duration(200)
57871                     .style('max-height', '200px')
57872                     .style('opacity', '1');
57873
57874                 _showing = true;
57875
57876                 _button.selectAll('svg.icon use').each(function() {
57877                     var iconUse = d3_select(this);
57878                     if (iconUse.attr('href') === '#iD-icon-info') {
57879                         iconUse.attr('href', '#iD-icon-info-filled');
57880                     }
57881                 });
57882             }
57883
57884
57885             function hide() {
57886                 _body
57887                     .transition()
57888                     .duration(200)
57889                     .style('max-height', '0px')
57890                     .style('opacity', '0')
57891                     .on('end', function () {
57892                         _body.classed('expanded', false);
57893                     });
57894
57895                 _showing = false;
57896
57897                 _button.selectAll('svg.icon use').each(function() {
57898                     var iconUse = d3_select(this);
57899                     if (iconUse.attr('href') === '#iD-icon-info-filled') {
57900                         iconUse.attr('href', '#iD-icon-info');
57901                     }
57902                 });
57903
57904             }
57905
57906
57907             tagReference.button = function(selection, klass, iconName) {
57908                 _button = selection.selectAll('.tag-reference-button')
57909                     .data([0]);
57910
57911                 _button = _button.enter()
57912                     .append('button')
57913                     .attr('class', 'tag-reference-button ' + klass)
57914                     .attr('title', t('icons.information'))
57915                     .attr('tabindex', -1)
57916                     .call(svgIcon('#iD-icon-' + (iconName || 'inspect')))
57917                     .merge(_button);
57918
57919                 _button
57920                     .on('click', function () {
57921                         event.stopPropagation();
57922                         event.preventDefault();
57923                         this.blur();    // avoid keeping focus on the button - #4641
57924                         if (_showing) {
57925                             hide();
57926                         } else if (_loaded) {
57927                             done();
57928                         } else {
57929                             load();
57930                         }
57931                     });
57932             };
57933
57934
57935             tagReference.body = function(selection) {
57936                 var itemID = what.qid || what.rtype || (what.key + '-' + what.value);
57937                 _body = selection.selectAll('.tag-reference-body')
57938                     .data([itemID], function(d) { return d; });
57939
57940                 _body.exit()
57941                     .remove();
57942
57943                 _body = _body.enter()
57944                     .append('div')
57945                     .attr('class', 'tag-reference-body')
57946                     .style('max-height', '0')
57947                     .style('opacity', '0')
57948                     .merge(_body);
57949
57950                 if (_showing === false) {
57951                     hide();
57952                 }
57953             };
57954
57955
57956             tagReference.showing = function(val) {
57957                 if (!arguments.length) return _showing;
57958                 _showing = val;
57959                 return tagReference;
57960             };
57961
57962
57963             return tagReference;
57964         }
57965
57966         function uiRawTagEditor(context) {
57967             var taginfo = services$1.taginfo;
57968             var dispatch$1 = dispatch('change');
57969             var availableViews = [
57970                 { id: 'text', icon: '#fas-i-cursor' },
57971                 { id: 'list', icon: '#fas-th-list' }
57972             ];
57973
57974             var _tagView = (context.storage('raw-tag-editor-view') || 'list');   // 'list, 'text'
57975             var _readOnlyTags = [];
57976             var _indexedKeys = [];
57977             var _showBlank = false;
57978             var _updatePreference = true;
57979             var _expanded = false;
57980             var _pendingChange = null;
57981             var _state;
57982             var _preset;
57983             var _tags;
57984             var _entityID;
57985
57986
57987             function rawTagEditor(selection) {
57988                 var count = Object.keys(_tags).filter(function(d) { return d; }).length;
57989
57990                 var disclosure = uiDisclosure(context, 'raw_tag_editor', false)
57991                     .title(t('inspector.all_tags') + ' (' + count + ')')
57992                     .on('toggled', toggled)
57993                     .updatePreference(_updatePreference)
57994                     .content(content);
57995
57996                 // Sometimes we want to force the raw_tag_editor to be opened/closed..
57997                 // When undefined, uiDisclosure will use the user's stored preference.
57998                 if (_expanded !== undefined) {
57999                     disclosure.expanded(_expanded);
58000                 }
58001
58002                 selection.call(disclosure);
58003
58004                 function toggled(expanded) {
58005                     _expanded = expanded;
58006                     if (expanded) {
58007                         selection.node().parentNode.scrollTop += 200;
58008                     }
58009                 }
58010             }
58011
58012
58013             function content(wrap) {
58014                 // When switching to a different entity or changing the state (hover/select)
58015                 // reorder the keys alphabetically.
58016                 // We trigger this by emptying the `_indexedKeys` array, then it will be rebuilt here.
58017                 // Otherwise leave their order alone - #5857, #5927
58018                 var all = Object.keys(_tags).sort();
58019                 var known = _indexedKeys.map(function(t) { return t.key; });
58020                 var missing = utilArrayDifference(all, known);
58021                 for (var i = 0; i < missing.length; i++) {
58022                     _indexedKeys.push({ index: _indexedKeys.length, key: missing[i] });
58023                 }
58024
58025                 // assemble row data, excluding any deleted tags
58026                 var rowData = _indexedKeys.map(function(row) {
58027                     var v = _tags[row.key];
58028                     return (v === undefined) ? null : Object.assign(row, { value: v });
58029                 }).filter(Boolean);
58030
58031                 // append blank row last, if necessary
58032                 if (!_indexedKeys.length || _showBlank) {
58033                     _showBlank = false;
58034                     rowData.push({ index: _indexedKeys.length, key: '', value: '' });
58035                 }
58036
58037
58038                 // View Options
58039                 var options = wrap.selectAll('.raw-tag-options')
58040                     .data([0]);
58041
58042                 var optionsEnter = options.enter()
58043                     .append('div')
58044                     .attr('class', 'raw-tag-options');
58045
58046                 var optionEnter = optionsEnter.selectAll('.raw-tag-option')
58047                     .data(availableViews, function(d) { return d.id; })
58048                     .enter();
58049
58050                 optionEnter
58051                     .append('button')
58052                     .attr('class', function(d) {
58053                         return 'raw-tag-option raw-tag-option-' + d.id + (_tagView === d.id ? ' selected' : '');
58054                     })
58055                     .attr('title', function(d) { return d.id; })
58056                     .on('click', function(d) {
58057                         _tagView = d.id;
58058                         context.storage('raw-tag-editor-view', d.id);
58059
58060                         wrap.selectAll('.raw-tag-option')
58061                             .classed('selected', function(datum) { return datum === d; });
58062
58063                         wrap.selectAll('.tag-text')
58064                             .classed('hide', (d.id !== 'text'))
58065                             .each(setTextareaHeight);
58066
58067                         wrap.selectAll('.tag-list, .add-row')
58068                             .classed('hide', (d.id !== 'list'));
58069                     })
58070                     .each(function(d) {
58071                         d3_select(this)
58072                             .call(svgIcon(d.icon));
58073                     });
58074
58075
58076                 // View as Text
58077                 var textData = rowsToText(rowData);
58078                 var textarea = wrap.selectAll('.tag-text')
58079                     .data([0]);
58080
58081                 textarea = textarea.enter()
58082                     .append('textarea')
58083                     .attr('class', 'tag-text' + (_tagView !== 'text' ? ' hide' : ''))
58084                     .call(utilNoAuto)
58085                     .attr('spellcheck', 'false')
58086                     .merge(textarea);
58087
58088                 textarea
58089                     .call(utilGetSetValue, textData)
58090                     .each(setTextareaHeight)
58091                     .on('input', setTextareaHeight)
58092                     .on('blur', textChanged)
58093                     .on('change', textChanged);
58094
58095                 // If All Fields section is hidden, focus textarea and put cursor at end..
58096                 var fieldsExpanded = d3_select('.hide-toggle-preset_fields.expanded').size();
58097                 if (_state !== 'hover' && _tagView === 'text' && !fieldsExpanded) {
58098                     var element = textarea.node();
58099                     element.focus();
58100                     element.setSelectionRange(textData.length, textData.length);
58101                 }
58102
58103
58104                 // View as List
58105                 var list = wrap.selectAll('.tag-list')
58106                     .data([0]);
58107
58108                 list = list.enter()
58109                     .append('ul')
58110                     .attr('class', 'tag-list' + (_tagView !== 'list' ? ' hide' : ''))
58111                     .merge(list);
58112
58113
58114                 // Container for the Add button
58115                 var addRowEnter = wrap.selectAll('.add-row')
58116                     .data([0])
58117                     .enter()
58118                     .append('div')
58119                     .attr('class', 'add-row' + (_tagView !== 'list' ? ' hide' : ''));
58120
58121                 addRowEnter
58122                     .append('button')
58123                     .attr('class', 'add-tag')
58124                     .call(svgIcon('#iD-icon-plus', 'light'))
58125                     .on('click', addTag);
58126
58127                 addRowEnter
58128                     .append('div')
58129                     .attr('class', 'space-value');   // preserve space
58130
58131                 addRowEnter
58132                     .append('div')
58133                     .attr('class', 'space-buttons');  // preserve space
58134
58135
58136                 // Tag list items
58137                 var items = list.selectAll('.tag-row')
58138                     .data(rowData, function(d) { return d.key; });
58139
58140                 items.exit()
58141                     .each(unbind)
58142                     .remove();
58143
58144
58145                 // Enter
58146                 var itemsEnter = items.enter()
58147                     .append('li')
58148                     .attr('class', 'tag-row')
58149                     .classed('readonly', isReadOnly);
58150
58151                 var innerWrap = itemsEnter.append('div')
58152                     .attr('class', 'inner-wrap');
58153
58154                 innerWrap
58155                     .append('div')
58156                     .attr('class', 'key-wrap')
58157                     .append('input')
58158                     .property('type', 'text')
58159                     .attr('class', 'key')
58160                     .attr('maxlength', 255)
58161                     .call(utilNoAuto)
58162                     .on('blur', keyChange)
58163                     .on('change', keyChange);
58164
58165                 innerWrap
58166                     .append('div')
58167                     .attr('class', 'value-wrap')
58168                     .append('input')
58169                     .property('type', 'text')
58170                     .attr('class', 'value')
58171                     .attr('maxlength', 255)
58172                     .call(utilNoAuto)
58173                     .on('blur', valueChange)
58174                     .on('change', valueChange)
58175                     .on('keydown.push-more', pushMore);
58176
58177                 innerWrap
58178                     .append('button')
58179                     .attr('tabindex', -1)
58180                     .attr('class', 'form-field-button remove')
58181                     .attr('title', t('icons.remove'))
58182                     .call(svgIcon('#iD-operation-delete'));
58183
58184
58185                 // Update
58186                 items = items
58187                     .merge(itemsEnter)
58188                     .sort(function(a, b) { return a.index - b.index; });
58189
58190                 items
58191                     .each(function(d) {
58192                         var row = d3_select(this);
58193                         var key = row.select('input.key');      // propagate bound data
58194                         var value = row.select('input.value');  // propagate bound data
58195
58196                         if (_entityID && taginfo && _state !== 'hover') {
58197                             bindTypeahead(key, value);
58198                         }
58199
58200                         var isRelation = (_entityID && context.entity(_entityID).type === 'relation');
58201                         var reference;
58202
58203                         if (isRelation && d.key === 'type') {
58204                             reference = uiTagReference({ rtype: d.value });
58205                         } else {
58206                             reference = uiTagReference({ key: d.key, value: d.value });
58207                         }
58208
58209                         if (_state === 'hover') {
58210                             reference.showing(false);
58211                         }
58212
58213                         row.select('.inner-wrap')      // propagate bound data
58214                             .call(reference.button);
58215
58216                         row.call(reference.body);
58217
58218                         row.select('button.remove');   // propagate bound data
58219                     });
58220
58221                 items.selectAll('input.key')
58222                     .attr('title', function(d) { return d.key; })
58223                     .call(utilGetSetValue, function(d) { return d.key; })
58224                     .property('disabled', isReadOnly);
58225
58226                 items.selectAll('input.value')
58227                     .attr('title', function(d) { return d.value; })
58228                     .call(utilGetSetValue, function(d) { return d.value; })
58229                     .property('disabled', isReadOnly);
58230
58231                 items.selectAll('button.remove')
58232                     .on('mousedown', removeTag);  // 'click' fires too late - #5878
58233
58234
58235
58236                 function isReadOnly(d) {
58237                     for (var i = 0; i < _readOnlyTags.length; i++) {
58238                         if (d.key.match(_readOnlyTags[i]) !== null) {
58239                             return true;
58240                         }
58241                     }
58242                     return false;
58243                 }
58244
58245
58246                 function setTextareaHeight() {
58247                     if (_tagView !== 'text') return;
58248
58249                     var selection = d3_select(this);
58250                     selection.style('height', null);
58251                     selection.style('height', selection.node().scrollHeight + 5 + 'px');
58252                 }
58253
58254
58255                 function stringify(s) {
58256                     return JSON.stringify(s).slice(1, -1);   // without leading/trailing "
58257                 }
58258
58259                 function unstringify(s) {
58260                     var leading = '';
58261                     var trailing = '';
58262                     if (s.length < 1 || s.charAt(0) !== '"') {
58263                         leading = '"';
58264                     }
58265                     if (s.length < 2 || s.charAt(s.length - 1) !== '"' ||
58266                         (s.charAt(s.length - 1) === '"' && s.charAt(s.length - 2) === '\\')
58267                     ) {
58268                         trailing = '"';
58269                     }
58270                     return JSON.parse(leading + s + trailing);
58271                 }
58272
58273
58274                 function rowsToText(rows) {
58275                     var str = rows
58276                         .filter(function(row) { return row.key && row.key.trim() !== ''; })
58277                         .map(function(row) { return stringify(row.key) + '=' + stringify(row.value); })
58278                         .join('\n');
58279
58280                     return _state === 'hover' ? str : str + '\n';
58281                 }
58282
58283
58284                 function textChanged() {
58285                     var newText = this.value.trim();
58286                     var newTags = {};
58287                     newText.split('\n').forEach(function(row) {
58288                         var m = row.match(/^\s*([^=]+)=(.*)$/);
58289                         if (m !== null) {
58290                             var k = unstringify(m[1].trim());
58291                             var v = unstringify(m[2].trim());
58292                             newTags[k] = v;
58293                         }
58294                     });
58295
58296                     var tagDiff = utilTagDiff(_tags, newTags);
58297                     if (!tagDiff.length) return;
58298
58299                     _pendingChange  = _pendingChange || {};
58300
58301                     tagDiff.forEach(function(change) {
58302                         if (isReadOnly({ key: change.key })) return;
58303
58304                         if (change.type === '-') {
58305                             _pendingChange[change.key] = undefined;
58306                         } else if (change.type === '+') {
58307                             _pendingChange[change.key] = change.newVal || '';
58308                         }
58309                     });
58310
58311                     scheduleChange();
58312                 }
58313
58314
58315                 function pushMore() {
58316                     if (event.keyCode === 9 && !event.shiftKey &&
58317                         list.selectAll('li:last-child input.value').node() === this) {
58318                         addTag();
58319                     }
58320                 }
58321
58322
58323                 function bindTypeahead(key, value) {
58324                     if (isReadOnly(key.datum())) return;
58325
58326                     var geometry = context.geometry(_entityID);
58327
58328                     key.call(uiCombobox(context, 'tag-key')
58329                         .fetcher(function(value, callback) {
58330                             taginfo.keys({
58331                                 debounce: true,
58332                                 geometry: geometry,
58333                                 query: value
58334                             }, function(err, data) {
58335                                 if (!err) {
58336                                     var filtered = data.filter(function(d) { return _tags[d.value] === undefined; });
58337                                     callback(sort(value, filtered));
58338                                 }
58339                             });
58340                         }));
58341
58342                     value.call(uiCombobox(context, 'tag-value')
58343                         .fetcher(function(value, callback) {
58344                             taginfo.values({
58345                                 debounce: true,
58346                                 key: utilGetSetValue(key),
58347                                 geometry: geometry,
58348                                 query: value
58349                             }, function(err, data) {
58350                                 if (!err) callback(sort(value, data));
58351                             });
58352                         }));
58353
58354
58355                     function sort(value, data) {
58356                         var sameletter = [];
58357                         var other = [];
58358                         for (var i = 0; i < data.length; i++) {
58359                             if (data[i].value.substring(0, value.length) === value) {
58360                                 sameletter.push(data[i]);
58361                             } else {
58362                                 other.push(data[i]);
58363                             }
58364                         }
58365                         return sameletter.concat(other);
58366                     }
58367                 }
58368
58369
58370                 function unbind() {
58371                     var row = d3_select(this);
58372
58373                     row.selectAll('input.key')
58374                         .call(uiCombobox.off);
58375
58376                     row.selectAll('input.value')
58377                         .call(uiCombobox.off);
58378                 }
58379
58380
58381                 function keyChange(d) {
58382                     var kOld = d.key;
58383                     var kNew = this.value.trim();
58384                     var row = this.parentNode.parentNode;
58385                     var inputVal = d3_select(row).selectAll('input.value');
58386                     var vNew = utilGetSetValue(inputVal);
58387
58388                     // allow no change if the key should be readonly
58389                     if (isReadOnly({ key: kNew })) {
58390                         this.value = kOld;
58391                         return;
58392                     }
58393
58394                     // switch focus if key is already in use
58395                     if (kNew && kNew !== kOld) {
58396                         if (_tags[kNew] !== undefined) {      // new key is already in use
58397                             this.value = kOld;                // reset the key
58398                             list.selectAll('input.value')
58399                                 .each(function(d) {
58400                                     if (d.key === kNew) {     // send focus to that other value combo instead
58401                                         var input = d3_select(this).node();
58402                                         input.focus();
58403                                         input.select();
58404                                     }
58405                                 });
58406                             return;
58407                         }
58408                     }
58409
58410                     _pendingChange  = _pendingChange || {};
58411
58412                     // exit if we are currently about to delete this row anyway - #6366
58413                     if (_pendingChange.hasOwnProperty(d.key) && _pendingChange[d.key] === undefined) return;
58414
58415                     if (kOld) {
58416                         _pendingChange[kOld] = undefined;
58417                     }
58418
58419                     _pendingChange[kNew] = vNew;
58420
58421                     d.key = kNew;    // update datum to avoid exit/enter on tag update
58422                     d.value = vNew;
58423
58424                     this.value = kNew;
58425                     utilGetSetValue(inputVal, vNew);
58426                     scheduleChange();
58427                 }
58428
58429
58430                 function valueChange(d) {
58431                     if (isReadOnly(d)) return;
58432
58433                     _pendingChange  = _pendingChange || {};
58434
58435                     // exit if we are currently about to delete this row anyway - #6366
58436                     if (_pendingChange.hasOwnProperty(d.key) && _pendingChange[d.key] === undefined) return;
58437
58438                     _pendingChange[d.key] = this.value;
58439                     scheduleChange();
58440                 }
58441
58442
58443                 function removeTag(d) {
58444                     if (isReadOnly(d)) return;
58445
58446                     if (d.key === '') {    // removing the blank row
58447                         _showBlank = false;
58448                         content(wrap);
58449
58450                     } else {
58451                         // remove from indexedKeys too, so that if the user puts it back,
58452                         // it will be sorted to the end and not back to its original position
58453                         _indexedKeys = _indexedKeys.filter(function(row) { return row.key !== d.key; });
58454
58455                         _pendingChange  = _pendingChange || {};
58456                         _pendingChange[d.key] = undefined;
58457                         scheduleChange();
58458                     }
58459                 }
58460
58461
58462                 function addTag() {
58463                     // Delay render in case this click is blurring an edited combo.
58464                     // Without the setTimeout, the `content` render would wipe out the pending tag change.
58465                     window.setTimeout(function() {
58466                         _showBlank = true;
58467                         content(wrap);
58468                         list.selectAll('li:last-child input.key').node().focus();
58469                     }, 20);
58470                 }
58471
58472
58473                 function scheduleChange() {
58474                     // Delay change in case this change is blurring an edited combo. - #5878
58475                     window.setTimeout(function() {
58476                         dispatch$1.call('change', this, _pendingChange);
58477                         _pendingChange = null;
58478                     }, 10);
58479                 }
58480
58481             }
58482
58483
58484             rawTagEditor.state = function(val) {
58485                 if (!arguments.length) return _state;
58486                 if (_state !== val) {
58487                     _indexedKeys = [];
58488                     _state = val;
58489                 }
58490                 return rawTagEditor;
58491             };
58492
58493
58494             rawTagEditor.preset = function(val) {
58495                 if (!arguments.length) return _preset;
58496                 _preset = val;
58497                 if (_preset.isFallback()) {
58498                     _expanded = true;
58499                     _updatePreference = false;
58500                 } else {
58501                     _expanded = undefined;
58502                     _updatePreference = true;
58503                 }
58504                 return rawTagEditor;
58505             };
58506
58507
58508             rawTagEditor.tags = function(val) {
58509                 if (!arguments.length) return _tags;
58510                 _tags = val;
58511                 return rawTagEditor;
58512             };
58513
58514
58515             rawTagEditor.entityID = function(val) {
58516                 if (!arguments.length) return _entityID;
58517                 if (_entityID !== val) {
58518                     _indexedKeys = [];
58519                     _entityID = val;
58520                 }
58521                 return rawTagEditor;
58522             };
58523
58524
58525             rawTagEditor.expanded = function(val) {
58526                 if (!arguments.length) return _expanded;
58527                 _expanded = val;
58528                 _updatePreference = false;
58529                 return rawTagEditor;
58530             };
58531
58532
58533             // pass an array of regular expressions to test against the tag key
58534             rawTagEditor.readOnlyTags = function(val) {
58535                 if (!arguments.length) return _readOnlyTags;
58536                 _readOnlyTags = val;
58537                 return rawTagEditor;
58538             };
58539
58540
58541             return utilRebind(rawTagEditor, dispatch$1, 'on');
58542         }
58543
58544         function uiDataEditor(context) {
58545             var dataHeader = uiDataHeader();
58546             var quickLinks = uiQuickLinks();
58547             var rawTagEditor = uiRawTagEditor(context);
58548             var _datum;
58549
58550
58551             function dataEditor(selection) {
58552                 // quick links
58553                 var choices = [{
58554                     id: 'zoom_to',
58555                     label: 'inspector.zoom_to.title',
58556                     tooltip: function() {
58557                         return uiTooltipHtml(t('inspector.zoom_to.tooltip_data'), t('inspector.zoom_to.key'));
58558                     },
58559                     click: function zoomTo() {
58560                         context.mode().zoomToSelected();
58561                     }
58562                 }];
58563
58564
58565                 var header = selection.selectAll('.header')
58566                     .data([0]);
58567
58568                 var headerEnter = header.enter()
58569                     .append('div')
58570                     .attr('class', 'header fillL');
58571
58572                 headerEnter
58573                     .append('button')
58574                     .attr('class', 'fr data-editor-close')
58575                     .on('click', function() {
58576                         context.enter(modeBrowse(context));
58577                     })
58578                     .call(svgIcon('#iD-icon-close'));
58579
58580                 headerEnter
58581                     .append('h3')
58582                     .text(t('map_data.title'));
58583
58584
58585                 var body = selection.selectAll('.body')
58586                     .data([0]);
58587
58588                 body = body.enter()
58589                     .append('div')
58590                     .attr('class', 'body')
58591                     .merge(body);
58592
58593                 var editor = body.selectAll('.data-editor')
58594                     .data([0]);
58595
58596                 // enter/update
58597                 editor.enter()
58598                     .append('div')
58599                     .attr('class', 'modal-section data-editor')
58600                     .merge(editor)
58601                     .call(dataHeader.datum(_datum))
58602                     .call(quickLinks.choices(choices));
58603
58604                 var rte = body.selectAll('.raw-tag-editor')
58605                     .data([0]);
58606
58607                 // enter/update
58608                 rte.enter()
58609                     .append('div')
58610                     .attr('class', 'raw-tag-editor inspector-inner data-editor')
58611                     .merge(rte)
58612                     .call(rawTagEditor
58613                         .expanded(true)
58614                         .readOnlyTags([/./])
58615                         .tags((_datum && _datum.properties) || {})
58616                         .state('hover')
58617                     )
58618                     .selectAll('textarea.tag-text')
58619                     .property('disabled', true)
58620                     .classed('readonly', true);
58621             }
58622
58623
58624             dataEditor.datum = function(val) {
58625                 if (!arguments.length) return _datum;
58626                 _datum = val;
58627                 return this;
58628             };
58629
58630
58631             return dataEditor;
58632         }
58633
58634         function modeSelectData(context, selectedDatum) {
58635             var mode = {
58636                 id: 'select-data',
58637                 button: 'browse'
58638             };
58639
58640             var keybinding = utilKeybinding('select-data');
58641             var dataEditor = uiDataEditor(context);
58642
58643             var behaviors = [
58644                 behaviorBreathe(),
58645                 behaviorHover(context),
58646                 behaviorSelect(context),
58647                 behaviorLasso(context),
58648                 modeDragNode(context).behavior,
58649                 modeDragNote(context).behavior
58650             ];
58651
58652
58653             // class the data as selected, or return to browse mode if the data is gone
58654             function selectData(drawn) {
58655                 var selection = context.surface().selectAll('.layer-mapdata .data' + selectedDatum.__featurehash__);
58656
58657                 if (selection.empty()) {
58658                     // Return to browse mode if selected DOM elements have
58659                     // disappeared because the user moved them out of view..
58660                     var source = event && event.type === 'zoom' && event.sourceEvent;
58661                     if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
58662                         context.enter(modeBrowse(context));
58663                     }
58664                 } else {
58665                     selection.classed('selected', true);
58666                 }
58667             }
58668
58669
58670             function esc() {
58671                 if (d3_select('.combobox').size()) return;
58672                 context.enter(modeBrowse(context));
58673             }
58674
58675
58676             mode.zoomToSelected = function() {
58677                 var extent = geoExtent(d3_geoBounds(selectedDatum));
58678                 context.map().centerZoomEase(extent.center(), context.map().trimmedExtentZoom(extent));
58679             };
58680
58681
58682             mode.enter = function() {
58683                 behaviors.forEach(context.install);
58684
58685                 keybinding
58686                     .on(t('inspector.zoom_to.key'), mode.zoomToSelected)
58687                     .on('⎋', esc, true);
58688
58689                 d3_select(document)
58690                     .call(keybinding);
58691
58692                 selectData();
58693
58694                 var sidebar = context.ui().sidebar;
58695                 sidebar.show(dataEditor.datum(selectedDatum));
58696
58697                 // expand the sidebar, avoid obscuring the data if needed
58698                 var extent = geoExtent(d3_geoBounds(selectedDatum));
58699                 sidebar.expand(sidebar.intersects(extent));
58700
58701                 context.map()
58702                     .on('drawn.select-data', selectData);
58703             };
58704
58705
58706             mode.exit = function() {
58707                 behaviors.forEach(context.uninstall);
58708
58709                 d3_select(document)
58710                     .call(keybinding.unbind);
58711
58712                 context.surface()
58713                     .selectAll('.layer-mapdata .selected')
58714                     .classed('selected hover', false);
58715
58716                 context.map()
58717                     .on('drawn.select-data', null);
58718
58719                 context.ui().sidebar
58720                     .hide();
58721             };
58722
58723
58724             return mode;
58725         }
58726
58727         function uiImproveOsmComments() {
58728             var _error;
58729
58730
58731             function errorComments(selection) {
58732                 // make the div immediately so it appears above the buttons
58733                 var comments = selection.selectAll('.comments-container')
58734                     .data([0]);
58735
58736                 comments = comments.enter()
58737                     .append('div')
58738                     .attr('class', 'comments-container')
58739                     .merge(comments);
58740
58741                 // must retrieve comments from API before they can be displayed
58742                 services$1.improveOSM.getComments(_error, function(err, d) {
58743                     if (!d.comments) { return; } // nothing to do here
58744
58745                     var commentEnter = comments.selectAll('.comment')
58746                         .data(d.comments)
58747                         .enter()
58748                         .append('div')
58749                         .attr('class', 'comment');
58750
58751                     commentEnter
58752                         .append('div')
58753                         .attr('class', 'comment-avatar')
58754                         .call(svgIcon('#iD-icon-avatar', 'comment-avatar-icon'));
58755
58756                     var mainEnter = commentEnter
58757                         .append('div')
58758                         .attr('class', 'comment-main');
58759
58760                     var metadataEnter = mainEnter
58761                         .append('div')
58762                         .attr('class', 'comment-metadata');
58763
58764                     metadataEnter
58765                         .append('div')
58766                         .attr('class', 'comment-author')
58767                         .each(function(d) {
58768                             var selection = d3_select(this);
58769                             var osm = services$1.osm;
58770                             if (osm && d.username) {
58771                                 selection = selection
58772                                     .append('a')
58773                                     .attr('class', 'comment-author-link')
58774                                     .attr('href', osm.userURL(d.username))
58775                                     .attr('tabindex', -1)
58776                                     .attr('target', '_blank');
58777                             }
58778                             selection
58779                                 .text(function(d) { return d.username; });
58780                         });
58781
58782                     metadataEnter
58783                         .append('div')
58784                         .attr('class', 'comment-date')
58785                         .text(function(d) {
58786                             return t('note.status.commented', { when: localeDateString(d.timestamp) });
58787                         });
58788
58789                     mainEnter
58790                         .append('div')
58791                         .attr('class', 'comment-text')
58792                         .append('p')
58793                         .text(function(d) { return d.text; });
58794                 });
58795             }
58796
58797             function localeDateString(s) {
58798                 if (!s) return null;
58799                 var detected = utilDetect();
58800                 var options = { day: 'numeric', month: 'short', year: 'numeric' };
58801                 var d = new Date(s * 1000); // timestamp is served in seconds, date takes ms
58802                 if (isNaN(d.getTime())) return null;
58803                 return d.toLocaleDateString(detected.locale, options);
58804             }
58805
58806             errorComments.error = function(val) {
58807                 if (!arguments.length) return _error;
58808                 _error = val;
58809                 return errorComments;
58810             };
58811
58812             return errorComments;
58813         }
58814
58815         function uiImproveOsmDetails(context) {
58816             var _error;
58817
58818
58819             function errorDetail(d) {
58820                 var unknown = t('inspector.unknown');
58821
58822                 if (!d) return unknown;
58823
58824                 if (d.desc) return d.desc;
58825
58826                 var errorType = d.error_key;
58827                 var et = en.QA.improveOSM.error_types[errorType];
58828
58829                 var detail;
58830                 if (et && et.description) {
58831                     detail = t('QA.improveOSM.error_types.' + errorType + '.description', d.replacements);
58832                 } else {
58833                     detail = unknown;
58834                 }
58835
58836                 return detail;
58837             }
58838
58839
58840             function improveOsmDetails(selection) {
58841                 var details = selection.selectAll('.error-details')
58842                     .data(
58843                         (_error ? [_error] : []),
58844                         function(d) { return d.id + '-' + (d.status || 0); }
58845                     );
58846
58847                 details.exit()
58848                     .remove();
58849
58850                 var detailsEnter = details.enter()
58851                     .append('div')
58852                     .attr('class', 'error-details error-details-container');
58853
58854
58855                 // description
58856                 var descriptionEnter = detailsEnter
58857                     .append('div')
58858                     .attr('class', 'error-details-description');
58859
58860                 descriptionEnter
58861                     .append('h4')
58862                     .text(function() { return t('QA.keepRight.detail_description'); });
58863
58864                 descriptionEnter
58865                     .append('div')
58866                     .attr('class', 'error-details-description-text')
58867                     .html(errorDetail);
58868
58869                 // If there are entity links in the error message..
58870                 var relatedEntities = [];
58871                 descriptionEnter.selectAll('.error_entity_link, .error_object_link')
58872                     .each(function() {
58873                         var link = d3_select(this);
58874                         var isObjectLink = link.classed('error_object_link');
58875                         var entityID = isObjectLink ?
58876                             (utilEntityRoot(_error.object_type) + _error.object_id)
58877                             : this.textContent;
58878                         var entity = context.hasEntity(entityID);
58879
58880                         relatedEntities.push(entityID);
58881
58882                         // Add click handler
58883                         link
58884                             .on('mouseover', function() {
58885                                 context.surface().selectAll(utilEntityOrMemberSelector([entityID], context.graph()))
58886                                     .classed('hover', true);
58887                             })
58888                             .on('mouseout', function() {
58889                                 context.surface().selectAll('.hover')
58890                                     .classed('hover', false);
58891                             })
58892                             .on('click', function() {
58893                                 event.preventDefault();
58894                                 var osmlayer = context.layers().layer('osm');
58895                                 if (!osmlayer.enabled()) {
58896                                     osmlayer.enabled(true);
58897                                 }
58898
58899                                 context.map().centerZoom(_error.loc, 20);
58900
58901                                 if (entity) {
58902                                     context.enter(modeSelect(context, [entityID]));
58903                                 } else {
58904                                     context.loadEntity(entityID, function() {
58905                                         context.enter(modeSelect(context, [entityID]));
58906                                     });
58907                                 }
58908                             });
58909
58910                         // Replace with friendly name if possible
58911                         // (The entity may not yet be loaded into the graph)
58912                         if (entity) {
58913                             var name = utilDisplayName(entity);  // try to use common name
58914
58915                             if (!name && !isObjectLink) {
58916                                 var preset = context.presets().match(entity, context.graph());
58917                                 name = preset && !preset.isFallback() && preset.name();  // fallback to preset name
58918                             }
58919
58920                             if (name) {
58921                                 this.innerText = name;
58922                             }
58923                         }
58924                     });
58925
58926                 // Don't hide entities related to this error - #5880
58927                 context.features().forceVisible(relatedEntities);
58928             }
58929
58930
58931             improveOsmDetails.error = function(val) {
58932                 if (!arguments.length) return _error;
58933                 _error = val;
58934                 return improveOsmDetails;
58935             };
58936
58937
58938             return improveOsmDetails;
58939         }
58940
58941         function uiImproveOsmHeader() {
58942             var _error;
58943
58944
58945             function errorTitle(d) {
58946                 var unknown = t('inspector.unknown');
58947
58948                 if (!d) return unknown;
58949                 var errorType = d.error_key;
58950                 var et = en.QA.improveOSM.error_types[errorType];
58951
58952                 if (et && et.title) {
58953                     return t('QA.improveOSM.error_types.' + errorType + '.title');
58954                 } else {
58955                     return unknown;
58956                 }
58957             }
58958
58959
58960             function improveOsmHeader(selection) {
58961                 var header = selection.selectAll('.error-header')
58962                     .data(
58963                         (_error ? [_error] : []),
58964                         function(d) { return d.id + '-' + (d.status || 0); }
58965                     );
58966
58967                 header.exit()
58968                     .remove();
58969
58970                 var headerEnter = header.enter()
58971                     .append('div')
58972                     .attr('class', 'error-header');
58973
58974                 var iconEnter = headerEnter
58975                     .append('div')
58976                     .attr('class', 'error-header-icon')
58977                     .classed('new', function(d) { return d.id < 0; });
58978
58979                 var svgEnter = iconEnter
58980                     .append('svg')
58981                     .attr('width', '20px')
58982                     .attr('height', '30px')
58983                     .attr('viewbox', '0 0 20 30')
58984                     .attr('class', function(d) {
58985                         return [
58986                             'preset-icon-28',
58987                             'qa_error',
58988                             d.service,
58989                             'error_id-' + d.id,
58990                             'error_type-' + d.error_type,
58991                             'category-' + d.category
58992                         ].join(' ');
58993                     });
58994
58995                 svgEnter
58996                     .append('polygon')
58997                     .attr('fill', 'currentColor')
58998                     .attr('class', 'qa_error-fill')
58999                     .attr('points', '16,3 4,3 1,6 1,17 4,20 7,20 10,27 13,20 16,20 19,17.033 19,6');
59000
59001                 svgEnter
59002                     .append('use')
59003                     .attr('class', 'icon-annotation')
59004                     .attr('width', '11px')
59005                     .attr('height', '11px')
59006                     .attr('transform', 'translate(4.5, 7)')
59007                     .attr('xlink:href', function(d) {
59008                         var picon = d.icon;
59009
59010                         if (!picon) {
59011                             return '';
59012                         } else {
59013                             var isMaki = /^maki-/.test(picon);
59014                             return '#' + picon + (isMaki ? '-11' : '');
59015                         }
59016                     });
59017
59018                 headerEnter
59019                     .append('div')
59020                     .attr('class', 'error-header-label')
59021                     .text(errorTitle);
59022             }
59023
59024
59025             improveOsmHeader.error = function(val) {
59026                 if (!arguments.length) return _error;
59027                 _error = val;
59028                 return improveOsmHeader;
59029             };
59030
59031
59032             return improveOsmHeader;
59033         }
59034
59035         function uiImproveOsmEditor(context) {
59036             var dispatch$1 = dispatch('change');
59037             var errorDetails = uiImproveOsmDetails(context);
59038             var errorComments = uiImproveOsmComments();
59039             var errorHeader = uiImproveOsmHeader();
59040             var quickLinks = uiQuickLinks();
59041
59042             var _error;
59043
59044
59045             function improveOsmEditor(selection) {
59046                 // quick links
59047                 var choices = [{
59048                     id: 'zoom_to',
59049                     label: 'inspector.zoom_to.title',
59050                     tooltip: function() {
59051                         return uiTooltipHtml(t('inspector.zoom_to.tooltip_issue'), t('inspector.zoom_to.key'));
59052                     },
59053                     click: function zoomTo() {
59054                         context.mode().zoomToSelected();
59055                     }
59056                 }];
59057
59058
59059                 var header = selection.selectAll('.header')
59060                     .data([0]);
59061
59062                 var headerEnter = header.enter()
59063                     .append('div')
59064                     .attr('class', 'header fillL');
59065
59066                 headerEnter
59067                     .append('button')
59068                     .attr('class', 'fr error-editor-close')
59069                     .on('click', function() {
59070                         context.enter(modeBrowse(context));
59071                     })
59072                     .call(svgIcon('#iD-icon-close'));
59073
59074                 headerEnter
59075                     .append('h3')
59076                     .text(t('QA.improveOSM.title'));
59077
59078
59079                 var body = selection.selectAll('.body')
59080                     .data([0]);
59081
59082                 body = body.enter()
59083                     .append('div')
59084                     .attr('class', 'body')
59085                     .merge(body);
59086
59087                 var editor = body.selectAll('.error-editor')
59088                     .data([0]);
59089
59090                 editor.enter()
59091                     .append('div')
59092                     .attr('class', 'modal-section error-editor')
59093                     .merge(editor)
59094                     .call(errorHeader.error(_error))
59095                     .call(quickLinks.choices(choices))
59096                     .call(errorDetails.error(_error))
59097                     .call(errorComments.error(_error))
59098                     .call(improveOsmSaveSection);
59099             }
59100
59101             function improveOsmSaveSection(selection) {
59102                 var isSelected = (_error && _error.id === context.selectedErrorID());
59103                 var isShown = (_error && (isSelected || _error.newComment || _error.comment));
59104                 var saveSection = selection.selectAll('.error-save')
59105                     .data(
59106                         (isShown ? [_error] : []),
59107                         function(d) { return d.id + '-' + (d.status || 0); }
59108                     );
59109
59110                 // exit
59111                 saveSection.exit()
59112                     .remove();
59113
59114                 // enter
59115                 var saveSectionEnter = saveSection.enter()
59116                     .append('div')
59117                     .attr('class', 'error-save save-section cf');
59118
59119                 saveSectionEnter
59120                     .append('h4')
59121                     .attr('class', '.error-save-header')
59122                     .text(t('note.newComment'));
59123
59124                 saveSectionEnter
59125                     .append('textarea')
59126                     .attr('class', 'new-comment-input')
59127                     .attr('placeholder', t('QA.keepRight.comment_placeholder'))
59128                     .attr('maxlength', 1000)
59129                     .property('value', function(d) { return d.newComment; })
59130                     .call(utilNoAuto)
59131                     .on('input', changeInput)
59132                     .on('blur', changeInput);
59133
59134                 // update
59135                 saveSection = saveSectionEnter
59136                     .merge(saveSection)
59137                     .call(errorSaveButtons);
59138
59139                 function changeInput() {
59140                     var input = d3_select(this);
59141                     var val = input.property('value').trim();
59142
59143                     if (val === '') {
59144                         val = undefined;
59145                     }
59146
59147                     // store the unsaved comment with the error itself
59148                     _error = _error.update({ newComment: val });
59149
59150                     var errorService = services$1.improveOSM;
59151                     if (errorService) {
59152                         errorService.replaceError(_error);
59153                     }
59154
59155                     saveSection
59156                         .call(errorSaveButtons);
59157                 }
59158             }
59159
59160             function errorSaveButtons(selection) {
59161                 var isSelected = (_error && _error.id === context.selectedErrorID());
59162                 var buttonSection = selection.selectAll('.buttons')
59163                     .data((isSelected ? [_error] : []), function(d) { return d.status + d.id; });
59164
59165                 // exit
59166                 buttonSection.exit()
59167                     .remove();
59168
59169                 // enter
59170                 var buttonEnter = buttonSection.enter()
59171                     .append('div')
59172                     .attr('class', 'buttons');
59173
59174                 buttonEnter
59175                     .append('button')
59176                     .attr('class', 'button comment-button action')
59177                     .text(t('QA.keepRight.save_comment'));
59178
59179                 buttonEnter
59180                     .append('button')
59181                     .attr('class', 'button close-button action');
59182
59183                 buttonEnter
59184                     .append('button')
59185                     .attr('class', 'button ignore-button action');
59186
59187
59188                 // update
59189                 buttonSection = buttonSection
59190                     .merge(buttonEnter);
59191
59192                 buttonSection.select('.comment-button')
59193                     .attr('disabled', function(d) {
59194                         return d.newComment === undefined ? true : null;
59195                     })
59196                     .on('click.comment', function(d) {
59197                         this.blur();    // avoid keeping focus on the button - #4641
59198                         var errorService = services$1.improveOSM;
59199                         if (errorService) {
59200                             errorService.postUpdate(d, function(err, error) {
59201                                 dispatch$1.call('change', error);
59202                             });
59203                         }
59204                     });
59205
59206                 buttonSection.select('.close-button')
59207                     .text(function(d) {
59208                         var andComment = (d.newComment !== undefined ? '_comment' : '');
59209                         return t('QA.keepRight.close' + andComment);
59210                     })
59211                     .on('click.close', function(d) {
59212                         this.blur();    // avoid keeping focus on the button - #4641
59213                         var errorService = services$1.improveOSM;
59214                         if (errorService) {
59215                             d.newStatus = 'SOLVED';
59216                             errorService.postUpdate(d, function(err, error) {
59217                                 dispatch$1.call('change', error);
59218                             });
59219                         }
59220                     });
59221
59222                 buttonSection.select('.ignore-button')
59223                     .text(function(d) {
59224                         var andComment = (d.newComment !== undefined ? '_comment' : '');
59225                         return t('QA.keepRight.ignore' + andComment);
59226                     })
59227                     .on('click.ignore', function(d) {
59228                         this.blur();    // avoid keeping focus on the button - #4641
59229                         var errorService = services$1.improveOSM;
59230                         if (errorService) {
59231                             d.newStatus = 'INVALID';
59232                             errorService.postUpdate(d, function(err, error) {
59233                                 dispatch$1.call('change', error);
59234                             });
59235                         }
59236                     });
59237             }
59238
59239             improveOsmEditor.error = function(val) {
59240                 if (!arguments.length) return _error;
59241                 _error = val;
59242                 return improveOsmEditor;
59243             };
59244
59245
59246             return utilRebind(improveOsmEditor, dispatch$1, 'on');
59247         }
59248
59249         function uiKeepRightDetails(context) {
59250             var _error;
59251
59252
59253             function errorDetail(d) {
59254                 var unknown = t('inspector.unknown');
59255
59256                 if (!d) return unknown;
59257                 var errorType = d.error_type;
59258                 var parentErrorType = d.parent_error_type;
59259
59260                 var et = en.QA.keepRight.errorTypes[errorType];
59261                 var pt = en.QA.keepRight.errorTypes[parentErrorType];
59262
59263                 var detail;
59264                 if (et && et.description) {
59265                     detail = t('QA.keepRight.errorTypes.' + errorType + '.description', d.replacements);
59266                 } else if (pt && pt.description) {
59267                     detail = t('QA.keepRight.errorTypes.' + parentErrorType + '.description', d.replacements);
59268                 } else {
59269                     detail = unknown;
59270                 }
59271
59272                 return detail;
59273             }
59274
59275
59276             function keepRightDetails(selection) {
59277                 var details = selection.selectAll('.error-details')
59278                     .data(
59279                         (_error ? [_error] : []),
59280                         function(d) { return d.id + '-' + (d.status || 0); }
59281                     );
59282
59283                 details.exit()
59284                     .remove();
59285
59286                 var detailsEnter = details.enter()
59287                     .append('div')
59288                     .attr('class', 'error-details error-details-container');
59289
59290
59291                 // description
59292                 var descriptionEnter = detailsEnter
59293                     .append('div')
59294                     .attr('class', 'error-details-description');
59295
59296                 descriptionEnter
59297                     .append('h4')
59298                     .text(function() { return t('QA.keepRight.detail_description'); });
59299
59300                 descriptionEnter
59301                     .append('div')
59302                     .attr('class', 'error-details-description-text')
59303                     .html(errorDetail);
59304
59305                 // If there are entity links in the error message..
59306                 var relatedEntities = [];
59307                 descriptionEnter.selectAll('.error_entity_link, .error_object_link')
59308                     .each(function() {
59309                         var link = d3_select(this);
59310                         var isObjectLink = link.classed('error_object_link');
59311                         var entityID = isObjectLink ?
59312                             (utilEntityRoot(_error.object_type) + _error.object_id)
59313                             : this.textContent;
59314                         var entity = context.hasEntity(entityID);
59315
59316                         relatedEntities.push(entityID);
59317
59318                         // Add click handler
59319                         link
59320                             .on('mouseover', function() {
59321                                 context.surface().selectAll(utilEntityOrMemberSelector([entityID], context.graph()))
59322                                     .classed('hover', true);
59323                             })
59324                             .on('mouseout', function() {
59325                                 context.surface().selectAll('.hover')
59326                                     .classed('hover', false);
59327                             })
59328                             .on('click', function() {
59329                                 event.preventDefault();
59330                                 var osmlayer = context.layers().layer('osm');
59331                                 if (!osmlayer.enabled()) {
59332                                     osmlayer.enabled(true);
59333                                 }
59334
59335                                 context.map().centerZoomEase(_error.loc, 20);
59336
59337                                 if (entity) {
59338                                     context.enter(modeSelect(context, [entityID]));
59339                                 } else {
59340                                     context.loadEntity(entityID, function() {
59341                                         context.enter(modeSelect(context, [entityID]));
59342                                     });
59343                                 }
59344                             });
59345
59346                         // Replace with friendly name if possible
59347                         // (The entity may not yet be loaded into the graph)
59348                         if (entity) {
59349                             var name = utilDisplayName(entity);  // try to use common name
59350
59351                             if (!name && !isObjectLink) {
59352                                 var preset = context.presets().match(entity, context.graph());
59353                                 name = preset && !preset.isFallback() && preset.name();  // fallback to preset name
59354                             }
59355
59356                             if (name) {
59357                                 this.innerText = name;
59358                             }
59359                         }
59360                     });
59361
59362                 // Don't hide entities related to this error - #5880
59363                 context.features().forceVisible(relatedEntities);
59364             }
59365
59366
59367             keepRightDetails.error = function(val) {
59368                 if (!arguments.length) return _error;
59369                 _error = val;
59370                 return keepRightDetails;
59371             };
59372
59373
59374             return keepRightDetails;
59375         }
59376
59377         function uiKeepRightHeader() {
59378             var _error;
59379
59380
59381             function errorTitle(d) {
59382                 var unknown = t('inspector.unknown');
59383
59384                 if (!d) return unknown;
59385                 var errorType = d.error_type;
59386                 var parentErrorType = d.parent_error_type;
59387
59388                 var et = en.QA.keepRight.errorTypes[errorType];
59389                 var pt = en.QA.keepRight.errorTypes[parentErrorType];
59390
59391                 if (et && et.title) {
59392                     return t('QA.keepRight.errorTypes.' + errorType + '.title');
59393                 } else if (pt && pt.title) {
59394                     return t('QA.keepRight.errorTypes.' + parentErrorType + '.title');
59395                 } else {
59396                     return unknown;
59397                 }
59398             }
59399
59400
59401             function keepRightHeader(selection) {
59402                 var header = selection.selectAll('.error-header')
59403                     .data(
59404                         (_error ? [_error] : []),
59405                         function(d) { return d.id + '-' + (d.status || 0); }
59406                     );
59407
59408                 header.exit()
59409                     .remove();
59410
59411                 var headerEnter = header.enter()
59412                     .append('div')
59413                     .attr('class', 'error-header');
59414
59415                 var iconEnter = headerEnter
59416                     .append('div')
59417                     .attr('class', 'error-header-icon')
59418                     .classed('new', function(d) { return d.id < 0; });
59419
59420                 iconEnter
59421                     .append('div')
59422                     .attr('class', function(d) {
59423                         return 'preset-icon-28 qa_error ' + d.service + ' error_id-' + d.id + ' error_type-' + d.parent_error_type;
59424                     })
59425                     .call(svgIcon('#iD-icon-bolt', 'qa_error-fill'));
59426
59427                 headerEnter
59428                     .append('div')
59429                     .attr('class', 'error-header-label')
59430                     .text(errorTitle);
59431             }
59432
59433
59434             keepRightHeader.error = function(val) {
59435                 if (!arguments.length) return _error;
59436                 _error = val;
59437                 return keepRightHeader;
59438             };
59439
59440
59441             return keepRightHeader;
59442         }
59443
59444         function uiViewOnKeepRight() {
59445             var _error;   // a keepright error
59446
59447
59448             function viewOnKeepRight(selection) {
59449                 var url;
59450                 if (services$1.keepRight && (_error instanceof qaError)) {
59451                     url = services$1.keepRight.errorURL(_error);
59452                 }
59453
59454                 var link = selection.selectAll('.view-on-keepRight')
59455                     .data(url ? [url] : []);
59456
59457                 // exit
59458                 link.exit()
59459                     .remove();
59460
59461                 // enter
59462                 var linkEnter = link.enter()
59463                     .append('a')
59464                     .attr('class', 'view-on-keepRight')
59465                     .attr('target', '_blank')
59466                     .attr('href', function(d) { return d; })
59467                     .call(svgIcon('#iD-icon-out-link', 'inline'));
59468
59469                 linkEnter
59470                     .append('span')
59471                     .text(t('inspector.view_on_keepRight'));
59472             }
59473
59474
59475             viewOnKeepRight.what = function(val) {
59476                 if (!arguments.length) return _error;
59477                 _error = val;
59478                 return viewOnKeepRight;
59479             };
59480
59481             return viewOnKeepRight;
59482         }
59483
59484         function uiKeepRightEditor(context) {
59485             var dispatch$1 = dispatch('change');
59486             var keepRightDetails = uiKeepRightDetails(context);
59487             var keepRightHeader = uiKeepRightHeader();
59488             var quickLinks = uiQuickLinks();
59489
59490             var _error;
59491
59492
59493             function keepRightEditor(selection) {
59494                 // quick links
59495                 var choices = [{
59496                     id: 'zoom_to',
59497                     label: 'inspector.zoom_to.title',
59498                     tooltip: function() {
59499                         return uiTooltipHtml(t('inspector.zoom_to.tooltip_issue'), t('inspector.zoom_to.key'));
59500                     },
59501                     click: function zoomTo() {
59502                         context.mode().zoomToSelected();
59503                     }
59504                 }];
59505
59506
59507                 var header = selection.selectAll('.header')
59508                     .data([0]);
59509
59510                 var headerEnter = header.enter()
59511                     .append('div')
59512                     .attr('class', 'header fillL');
59513
59514                 headerEnter
59515                     .append('button')
59516                     .attr('class', 'fr error-editor-close')
59517                     .on('click', function() {
59518                         context.enter(modeBrowse(context));
59519                     })
59520                     .call(svgIcon('#iD-icon-close'));
59521
59522                 headerEnter
59523                     .append('h3')
59524                     .text(t('QA.keepRight.title'));
59525
59526
59527                 var body = selection.selectAll('.body')
59528                     .data([0]);
59529
59530                 body = body.enter()
59531                     .append('div')
59532                     .attr('class', 'body')
59533                     .merge(body);
59534
59535                 var editor = body.selectAll('.error-editor')
59536                     .data([0]);
59537
59538                 editor.enter()
59539                     .append('div')
59540                     .attr('class', 'modal-section error-editor')
59541                     .merge(editor)
59542                     .call(keepRightHeader.error(_error))
59543                     .call(quickLinks.choices(choices))
59544                     .call(keepRightDetails.error(_error))
59545                     .call(keepRightSaveSection);
59546
59547
59548                 var footer = selection.selectAll('.footer')
59549                     .data([0]);
59550
59551                 footer.enter()
59552                     .append('div')
59553                     .attr('class', 'footer')
59554                     .merge(footer)
59555                     .call(uiViewOnKeepRight().what(_error));
59556             }
59557
59558
59559             function keepRightSaveSection(selection) {
59560                 var isSelected = (_error && _error.id === context.selectedErrorID());
59561                 var isShown = (_error && (isSelected || _error.newComment || _error.comment));
59562                 var saveSection = selection.selectAll('.error-save')
59563                     .data(
59564                         (isShown ? [_error] : []),
59565                         function(d) { return d.id + '-' + (d.status || 0); }
59566                     );
59567
59568                 // exit
59569                 saveSection.exit()
59570                     .remove();
59571
59572                 // enter
59573                 var saveSectionEnter = saveSection.enter()
59574                     .append('div')
59575                     .attr('class', 'error-save save-section cf');
59576
59577                 saveSectionEnter
59578                     .append('h4')
59579                     .attr('class', '.error-save-header')
59580                     .text(t('QA.keepRight.comment'));
59581
59582                 saveSectionEnter
59583                     .append('textarea')
59584                     .attr('class', 'new-comment-input')
59585                     .attr('placeholder', t('QA.keepRight.comment_placeholder'))
59586                     .attr('maxlength', 1000)
59587                     .property('value', function(d) { return d.newComment || d.comment; })
59588                     .call(utilNoAuto)
59589                     .on('input', changeInput)
59590                     .on('blur', changeInput);
59591
59592                 // update
59593                 saveSection = saveSectionEnter
59594                     .merge(saveSection)
59595                     .call(keepRightSaveButtons);
59596
59597
59598                 function changeInput() {
59599                     var input = d3_select(this);
59600                     var val = input.property('value').trim();
59601
59602                     if (val === _error.comment) {
59603                         val = undefined;
59604                     }
59605
59606                     // store the unsaved comment with the error itself
59607                     _error = _error.update({ newComment: val });
59608
59609                     var keepRight = services$1.keepRight;
59610                     if (keepRight) {
59611                         keepRight.replaceError(_error);  // update keepright cache
59612                     }
59613
59614                     saveSection
59615                         .call(keepRightSaveButtons);
59616                 }
59617             }
59618
59619
59620             function keepRightSaveButtons(selection) {
59621                 var isSelected = (_error && _error.id === context.selectedErrorID());
59622                 var buttonSection = selection.selectAll('.buttons')
59623                     .data((isSelected ? [_error] : []), function(d) { return d.status + d.id; });
59624
59625                 // exit
59626                 buttonSection.exit()
59627                     .remove();
59628
59629                 // enter
59630                 var buttonEnter = buttonSection.enter()
59631                     .append('div')
59632                     .attr('class', 'buttons');
59633
59634                 buttonEnter
59635                     .append('button')
59636                     .attr('class', 'button comment-button action')
59637                     .text(t('QA.keepRight.save_comment'));
59638
59639                 buttonEnter
59640                     .append('button')
59641                     .attr('class', 'button close-button action');
59642
59643                 buttonEnter
59644                     .append('button')
59645                     .attr('class', 'button ignore-button action');
59646
59647
59648                 // update
59649                 buttonSection = buttonSection
59650                     .merge(buttonEnter);
59651
59652                 buttonSection.select('.comment-button')   // select and propagate data
59653                     .attr('disabled', function(d) {
59654                         return d.newComment === undefined ? true : null;
59655                     })
59656                     .on('click.comment', function(d) {
59657                         this.blur();    // avoid keeping focus on the button - #4641
59658                         var keepRight = services$1.keepRight;
59659                         if (keepRight) {
59660                             keepRight.postKeepRightUpdate(d, function(err, error) {
59661                                 dispatch$1.call('change', error);
59662                             });
59663                         }
59664                     });
59665
59666                 buttonSection.select('.close-button')   // select and propagate data
59667                     .text(function(d) {
59668                         var andComment = (d.newComment !== undefined ? '_comment' : '');
59669                         return t('QA.keepRight.close' + andComment);
59670                     })
59671                     .on('click.close', function(d) {
59672                         this.blur();    // avoid keeping focus on the button - #4641
59673                         var keepRight = services$1.keepRight;
59674                         if (keepRight) {
59675                             d.state = 'ignore_t';   // ignore temporarily (error fixed)
59676                             keepRight.postKeepRightUpdate(d, function(err, error) {
59677                                 dispatch$1.call('change', error);
59678                             });
59679                         }
59680                     });
59681
59682                 buttonSection.select('.ignore-button')   // select and propagate data
59683                     .text(function(d) {
59684                         var andComment = (d.newComment !== undefined ? '_comment' : '');
59685                         return t('QA.keepRight.ignore' + andComment);
59686                     })
59687                     .on('click.ignore', function(d) {
59688                         this.blur();    // avoid keeping focus on the button - #4641
59689                         var keepRight = services$1.keepRight;
59690                         if (keepRight) {
59691                             d.state = 'ignore';   // ignore permanently (false positive)
59692                             keepRight.postKeepRightUpdate(d, function(err, error) {
59693                                 dispatch$1.call('change', error);
59694                             });
59695                         }
59696                     });
59697             }
59698
59699
59700             keepRightEditor.error = function(val) {
59701                 if (!arguments.length) return _error;
59702                 _error = val;
59703                 return keepRightEditor;
59704             };
59705
59706
59707             return utilRebind(keepRightEditor, dispatch$1, 'on');
59708         }
59709
59710         function modeSelectError(context, selectedErrorID, selectedErrorService) {
59711             var mode = {
59712                 id: 'select-error',
59713                 button: 'browse'
59714             };
59715
59716             var keybinding = utilKeybinding('select-error');
59717
59718             var errorService = services$1[selectedErrorService];
59719             var errorEditor;
59720             switch (selectedErrorService) {
59721                 case 'improveOSM':
59722                     errorEditor = uiImproveOsmEditor(context)
59723                     .on('change', function() {
59724                         context.map().pan([0,0]);  // trigger a redraw
59725                         var error = checkSelectedID();
59726                         if (!error) return;
59727                         context.ui().sidebar
59728                             .show(errorEditor.error(error));
59729                     });
59730                     break;
59731                 case 'keepRight':
59732                     errorEditor = uiKeepRightEditor(context)
59733                     .on('change', function() {
59734                         context.map().pan([0,0]);  // trigger a redraw
59735                         var error = checkSelectedID();
59736                         if (!error) return;
59737                         context.ui().sidebar
59738                             .show(errorEditor.error(error));
59739                     });
59740                     break;
59741             }
59742
59743
59744             var behaviors = [
59745                 behaviorBreathe(),
59746                 behaviorHover(context),
59747                 behaviorSelect(context),
59748                 behaviorLasso(context),
59749                 modeDragNode(context).behavior,
59750                 modeDragNote(context).behavior
59751             ];
59752
59753
59754             function checkSelectedID() {
59755                 if (!errorService) return;
59756                 var error = errorService.getError(selectedErrorID);
59757                 if (!error) {
59758                     context.enter(modeBrowse(context));
59759                 }
59760                 return error;
59761             }
59762
59763
59764             mode.zoomToSelected = function() {
59765                 if (!errorService) return;
59766                 var error = errorService.getError(selectedErrorID);
59767                 if (error) {
59768                     context.map().centerZoomEase(error.loc, 20);
59769                 }
59770             };
59771
59772
59773             mode.enter = function() {
59774                 var error = checkSelectedID();
59775                 if (!error) return;
59776
59777                 behaviors.forEach(context.install);
59778                 keybinding
59779                     .on(t('inspector.zoom_to.key'), mode.zoomToSelected)
59780                     .on('⎋', esc, true);
59781
59782                 d3_select(document)
59783                     .call(keybinding);
59784
59785                 selectError();
59786
59787                 var sidebar = context.ui().sidebar;
59788                 sidebar.show(errorEditor.error(error));
59789
59790                 context.map()
59791                     .on('drawn.select-error', selectError);
59792
59793
59794                 // class the error as selected, or return to browse mode if the error is gone
59795                 function selectError(drawn) {
59796                     if (!checkSelectedID()) return;
59797
59798                     var selection = context.surface()
59799                         .selectAll('.error_id-' + selectedErrorID + '.' + selectedErrorService);
59800
59801                     if (selection.empty()) {
59802                         // Return to browse mode if selected DOM elements have
59803                         // disappeared because the user moved them out of view..
59804                         var source = event && event.type === 'zoom' && event.sourceEvent;
59805                         if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
59806                             context.enter(modeBrowse(context));
59807                         }
59808
59809                     } else {
59810                         selection
59811                             .classed('selected', true);
59812
59813                         context.selectedErrorID(selectedErrorID);
59814                     }
59815                 }
59816
59817                 function esc() {
59818                     if (d3_select('.combobox').size()) return;
59819                     context.enter(modeBrowse(context));
59820                 }
59821             };
59822
59823
59824             mode.exit = function() {
59825                 behaviors.forEach(context.uninstall);
59826
59827                 d3_select(document)
59828                     .call(keybinding.unbind);
59829
59830                 context.surface()
59831                     .selectAll('.qa_error.selected')
59832                     .classed('selected hover', false);
59833
59834                 context.map()
59835                     .on('drawn.select-error', null);
59836
59837                 context.ui().sidebar
59838                     .hide();
59839
59840                 context.selectedErrorID(null);
59841                 context.features().forceVisible([]);
59842             };
59843
59844
59845             return mode;
59846         }
59847
59848         function behaviorSelect(context) {
59849             // legacy option to show menu on every click
59850             var isShowAlways = +context.storage('edit-menu-show-always') === 1;
59851             var tolerance = 4;
59852             var _lastMouse = null;
59853             var _suppressMenu = true;
59854             var _p1 = null;
59855
59856
59857             function point() {
59858                 return d3_mouse(context.container().node());
59859             }
59860
59861
59862             function keydown() {
59863                 var e = event;
59864                 if (e && e.shiftKey) {
59865                     context.surface()
59866                         .classed('behavior-multiselect', true);
59867                 }
59868
59869                 if (e && e.keyCode === 93) {  // context menu
59870                     e.preventDefault();
59871                     e.stopPropagation();
59872                 }
59873             }
59874
59875
59876             function keyup() {
59877                 var e = event;
59878                 if (!e || !e.shiftKey) {
59879                     context.surface()
59880                         .classed('behavior-multiselect', false);
59881                 }
59882
59883
59884                 if (e && e.keyCode === 93) {  // context menu
59885                     e.preventDefault();
59886                     e.stopPropagation();
59887                     contextmenu();
59888                 }
59889             }
59890
59891
59892             function mousedown() {
59893                 if (!_p1) {
59894                     _p1 = point();
59895                 }
59896                 d3_select(window)
59897                     .on('mouseup.select', mouseup, true);
59898
59899                 _suppressMenu = !isShowAlways;
59900             }
59901
59902
59903             function mousemove() {
59904                 if (event) {
59905                     _lastMouse = event;
59906                 }
59907             }
59908
59909
59910             function mouseup() {
59911                 click();
59912             }
59913
59914
59915             function contextmenu() {
59916                 var e = event;
59917                 e.preventDefault();
59918                 e.stopPropagation();
59919
59920                 if (!+e.clientX && !+e.clientY) {
59921                     if (_lastMouse) {
59922                         e.sourceEvent = _lastMouse;
59923                     } else {
59924                         return;
59925                     }
59926                 }
59927
59928                 if (!_p1) {
59929                     _p1 = point();
59930                 }
59931                 _suppressMenu = false;
59932                 click();
59933             }
59934
59935
59936             function click() {
59937                 d3_select(window)
59938                     .on('mouseup.select', null, true);
59939
59940                 if (!_p1) return;
59941                 var p2 = point();
59942                 var dist = geoVecLength(_p1, p2);
59943                 _p1 = null;
59944                 if (dist > tolerance) return;
59945
59946                 // Defer processing the click,
59947                 // because this click may trigger a blur event,
59948                 // and the blur event may trigger a tag change,
59949                 // and we really want that tag change to go to the already selected entity
59950                 // and not the one that we are about to select with the click  #6028, #5878
59951                 // (Be very careful entering modeSelect anywhere that might also blur a field!)
59952                 var datum = event.target.__data__ || (_lastMouse && _lastMouse.target.__data__);
59953                 var isMultiselect = event.shiftKey || d3_select('#surface .lasso').node();
59954                 window.setTimeout(function() {
59955                     processClick(datum, isMultiselect);
59956                 }, 20);  // delay > whatever raw_tag_editor.js `scheduleChange` does (10ms).
59957             }
59958
59959
59960             function processClick(datum, isMultiselect) {
59961                 var mode = context.mode();
59962
59963                 var entity = datum && datum.properties && datum.properties.entity;
59964                 if (entity) datum = entity;
59965
59966                 if (datum && datum.type === 'midpoint') {
59967                     datum = datum.parents[0];
59968                 }
59969
59970                 if (datum instanceof osmEntity) {    // clicked an entity..
59971                     var selectedIDs = context.selectedIDs();
59972                     context.selectedNoteID(null);
59973                     context.selectedErrorID(null);
59974
59975                     if (!isMultiselect) {
59976                         if (selectedIDs.length > 1 && (!_suppressMenu && !isShowAlways)) {
59977                             // multiple things already selected, just show the menu...
59978                             mode.suppressMenu(false).reselect();
59979                         } else {
59980                             // select a single thing..
59981                             context.enter(modeSelect(context, [datum.id]).suppressMenu(_suppressMenu));
59982                         }
59983
59984                     } else {
59985                         if (selectedIDs.indexOf(datum.id) !== -1) {
59986                             // clicked entity is already in the selectedIDs list..
59987                             if (!_suppressMenu && !isShowAlways) {
59988                                 // don't deselect clicked entity, just show the menu.
59989                                 mode.suppressMenu(false).reselect();
59990                             } else {
59991                                 // deselect clicked entity, then reenter select mode or return to browse mode..
59992                                 selectedIDs = selectedIDs.filter(function(id) { return id !== datum.id; });
59993                                 context.enter(selectedIDs.length ? modeSelect(context, selectedIDs) : modeBrowse(context));
59994                             }
59995                         } else {
59996                             // clicked entity is not in the selected list, add it..
59997                             selectedIDs = selectedIDs.concat([datum.id]);
59998                             context.enter(modeSelect(context, selectedIDs).suppressMenu(_suppressMenu));
59999                         }
60000                     }
60001
60002                 } else if (datum && datum.__featurehash__ && !isMultiselect) {    // clicked Data..
60003                     context
60004                         .selectedNoteID(null)
60005                         .enter(modeSelectData(context, datum));
60006
60007                 } else if (datum instanceof osmNote && !isMultiselect) {    // clicked a Note..
60008                     context
60009                         .selectedNoteID(datum.id)
60010                         .enter(modeSelectNote(context, datum.id));
60011
60012                 } else if (datum instanceof qaError & !isMultiselect) {  // clicked an external QA error
60013                     context
60014                         .selectedErrorID(datum.id)
60015                         .enter(modeSelectError(context, datum.id, datum.service));
60016
60017                 } else {    // clicked nothing..
60018                     context.selectedNoteID(null);
60019                     context.selectedErrorID(null);
60020                     if (!isMultiselect && mode.id !== 'browse') {
60021                         context.enter(modeBrowse(context));
60022                     }
60023                 }
60024
60025                 // reset for next time..
60026                 _suppressMenu = true;
60027             }
60028
60029
60030             function behavior(selection) {
60031                 _lastMouse = null;
60032                 _suppressMenu = true;
60033                 _p1 = null;
60034
60035                 d3_select(window)
60036                     .on('keydown.select', keydown)
60037                     .on('keyup.select', keyup)
60038                     .on('contextmenu.select-window', function() {
60039                         // Edge and IE really like to show the contextmenu on the
60040                         // menubar when user presses a keyboard menu button
60041                         // even after we've already preventdefaulted the key event.
60042                         var e = event;
60043                         if (+e.clientX === 0 && +e.clientY === 0) {
60044                             event.preventDefault();
60045                             event.stopPropagation();
60046                         }
60047                     });
60048
60049                 selection
60050                     .on('mousedown.select', mousedown)
60051                     .on('mousemove.select', mousemove)
60052                     .on('contextmenu.select', contextmenu);
60053
60054                 if (event && event.shiftKey) {
60055                     context.surface()
60056                         .classed('behavior-multiselect', true);
60057                 }
60058             }
60059
60060
60061             behavior.off = function(selection) {
60062                 d3_select(window)
60063                     .on('keydown.select', null)
60064                     .on('keyup.select', null)
60065                     .on('contextmenu.select-window', null)
60066                     .on('mouseup.select', null, true);
60067
60068                 selection
60069                     .on('mousedown.select', null)
60070                     .on('mousemove.select', null)
60071                     .on('contextmenu.select', null);
60072
60073                 context.surface()
60074                     .classed('behavior-multiselect', false);
60075             };
60076
60077
60078             return behavior;
60079         }
60080
60081         function behaviorDrawWay(context, wayID, index, mode, startGraph, baselineGraph) {
60082
60083             var origWay = context.entity(wayID);
60084
60085             var annotation = t((origWay.isDegenerate() ?
60086                 'operations.start.annotation.' :
60087                 'operations.continue.annotation.') + context.geometry(wayID)
60088             );
60089
60090             var behavior = behaviorDraw(context);
60091             behavior.hover().initialNodeID(index ? origWay.nodes[index] :
60092                 (origWay.isClosed() ? origWay.nodes[origWay.nodes.length - 2] : origWay.nodes[origWay.nodes.length - 1]));
60093
60094             var _tempEdits = 0;
60095
60096             var end = osmNode({ loc: context.map().mouseCoordinates() });
60097
60098             // Push an annotated state for undo to return back to.
60099             // We must make sure to remove this edit later.
60100             context.pauseChangeDispatch();
60101             context.perform(actionNoop(), annotation);
60102             _tempEdits++;
60103
60104             // Add the drawing node to the graph.
60105             // We must make sure to remove this edit later.
60106             context.perform(_actionAddDrawNode());
60107             _tempEdits++;
60108             context.resumeChangeDispatch();
60109
60110
60111             function keydown() {
60112                 if (event.keyCode === utilKeybinding.modifierCodes.alt) {
60113                     if (context.surface().classed('nope')) {
60114                         context.surface()
60115                             .classed('nope-suppressed', true);
60116                     }
60117                     context.surface()
60118                         .classed('nope', false)
60119                         .classed('nope-disabled', true);
60120                 }
60121             }
60122
60123
60124             function keyup() {
60125                 if (event.keyCode === utilKeybinding.modifierCodes.alt) {
60126                     if (context.surface().classed('nope-suppressed')) {
60127                         context.surface()
60128                             .classed('nope', true);
60129                     }
60130                     context.surface()
60131                         .classed('nope-suppressed', false)
60132                         .classed('nope-disabled', false);
60133                 }
60134             }
60135
60136
60137             function allowsVertex(d) {
60138                 return d.geometry(context.graph()) === 'vertex' || context.presets().allowsVertex(d, context.graph());
60139             }
60140
60141
60142             // related code
60143             // - `mode/drag_node.js`     `doMode()`
60144             // - `behavior/draw.js`      `click()`
60145             // - `behavior/draw_way.js`  `move()`
60146             function move(datum) {
60147                 context.surface().classed('nope-disabled', event.altKey);
60148
60149                 var targetLoc = datum && datum.properties && datum.properties.entity && allowsVertex(datum.properties.entity) && datum.properties.entity.loc;
60150                 var targetNodes = datum && datum.properties && datum.properties.nodes;
60151                 var loc = context.map().mouseCoordinates();
60152
60153                 if (targetLoc) {   // snap to node/vertex - a point target with `.loc`
60154                     loc = targetLoc;
60155
60156                 } else if (targetNodes) {   // snap to way - a line target with `.nodes`
60157                     var choice = geoChooseEdge(targetNodes, context.mouse(), context.projection, end.id);
60158                     if (choice) {
60159                         loc = choice.loc;
60160                     }
60161                 }
60162
60163                 context.replace(actionMoveNode(end.id, loc));
60164                 end = context.entity(end.id);
60165                 checkGeometry(false);
60166             }
60167
60168
60169             // Check whether this edit causes the geometry to break.
60170             // If so, class the surface with a nope cursor.
60171             // `finishDraw` - Only checks the relevant line segments if finishing drawing
60172             function checkGeometry(finishDraw) {
60173                 var nopeDisabled = context.surface().classed('nope-disabled');
60174                 var isInvalid = isInvalidGeometry(end, context.graph(), finishDraw);
60175
60176                 if (nopeDisabled) {
60177                     context.surface()
60178                         .classed('nope', false)
60179                         .classed('nope-suppressed', isInvalid);
60180                 } else {
60181                     context.surface()
60182                         .classed('nope', isInvalid)
60183                         .classed('nope-suppressed', false);
60184                 }
60185             }
60186
60187
60188             function isInvalidGeometry(entity, graph, finishDraw) {
60189                 var parents = graph.parentWays(entity);
60190
60191                 for (var i = 0; i < parents.length; i++) {
60192                     var parent = parents[i];
60193                     var nodes = graph.childNodes(parent).slice();  // shallow copy
60194
60195                     if (origWay.isClosed()) { // Check if Area
60196                         if (finishDraw) {
60197                             if (nodes.length < 3) return false;
60198                             nodes.splice(-2, 1);
60199                             entity = nodes[nodes.length-2];
60200                         } else {
60201                             nodes.pop();
60202                         }
60203                     } else { // Line
60204                         if (finishDraw) {
60205                             nodes.pop();
60206                         }
60207                     }
60208
60209                     if (geoHasSelfIntersections(nodes, entity.id)) {
60210                         return true;
60211                     }
60212                 }
60213
60214                 return false;
60215             }
60216
60217
60218             function undone() {
60219                 context.pauseChangeDispatch();
60220                 // Undo popped the history back to the initial annotated no-op edit.
60221                 _tempEdits = 0;     // We will deal with the temp edits here
60222                 context.pop(1);     // Remove initial no-op edit
60223
60224                 if (context.graph() === baselineGraph) {    // We've undone back to the beginning
60225                     // baselineGraph may be behind startGraph if this way was added rather than continued
60226                     resetToStartGraph();
60227                     context.resumeChangeDispatch();
60228                     context.enter(modeSelect(context, [wayID]));
60229                 } else {
60230                     // Remove whatever segment was drawn previously and continue drawing
60231                     context.pop(1);
60232                     context.resumeChangeDispatch();
60233                     context.enter(mode);
60234                 }
60235             }
60236
60237
60238             function setActiveElements() {
60239                 context.surface().selectAll('.' + end.id)
60240                     .classed('active', true);
60241             }
60242
60243
60244             function resetToStartGraph() {
60245                 while (context.graph() !== startGraph) {
60246                     context.pop();
60247                 }
60248             }
60249
60250
60251             var drawWay = function(surface) {
60252                 behavior
60253                     .on('move', move)
60254                     .on('click', drawWay.add)
60255                     .on('clickWay', drawWay.addWay)
60256                     .on('clickNode', drawWay.addNode)
60257                     .on('undo', context.undo)
60258                     .on('cancel', drawWay.cancel)
60259                     .on('finish', drawWay.finish);
60260
60261                 d3_select(window)
60262                     .on('keydown.drawWay', keydown)
60263                     .on('keyup.drawWay', keyup);
60264
60265                 context.map()
60266                     .dblclickEnable(false)
60267                     .on('drawn.draw', setActiveElements);
60268
60269                 setActiveElements();
60270
60271                 surface.call(behavior);
60272
60273                 context.history()
60274                     .on('undone.draw', undone);
60275             };
60276
60277
60278             drawWay.off = function(surface) {
60279                 // Drawing was interrupted unexpectedly.
60280                 // This can happen if the user changes modes,
60281                 // clicks geolocate button, a hashchange event occurs, etc.
60282                 if (_tempEdits) {
60283                     context.pauseChangeDispatch();
60284                     context.pop(_tempEdits);
60285                     resetToStartGraph();
60286                     context.resumeChangeDispatch();
60287                 }
60288
60289                 context.map()
60290                     .on('drawn.draw', null);
60291
60292                 surface.call(behavior.off)
60293                     .selectAll('.active')
60294                     .classed('active', false);
60295
60296                 surface
60297                     .classed('nope', false)
60298                     .classed('nope-suppressed', false)
60299                     .classed('nope-disabled', false);
60300
60301                 d3_select(window)
60302                     .on('keydown.hover', null)
60303                     .on('keyup.hover', null);
60304
60305                 context.history()
60306                     .on('undone.draw', null);
60307             };
60308
60309
60310             function _actionAddDrawNode() {
60311                 return function(graph) {
60312                     return graph
60313                         .replace(end)
60314                         .replace(origWay.addNode(end.id, index));
60315                 };
60316             }
60317
60318
60319             function _actionReplaceDrawNode(newNode) {
60320                 return function(graph) {
60321                     return graph
60322                         .replace(origWay.addNode(newNode.id, index))
60323                         .remove(end);
60324                 };
60325             }
60326
60327
60328             // Accept the current position of the drawing node and continue drawing.
60329             drawWay.add = function(loc, d) {
60330                 if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
60331                     return;   // can't click here
60332                 }
60333
60334                 context.pauseChangeDispatch();
60335                 context.pop(_tempEdits);
60336                 _tempEdits = 0;
60337
60338                 context.perform(
60339                     _actionAddDrawNode(),
60340                     annotation
60341                 );
60342
60343                 context.resumeChangeDispatch();
60344                 checkGeometry(false);   // finishDraw = false
60345                 context.enter(mode);
60346             };
60347
60348
60349             // Connect the way to an existing way.
60350             drawWay.addWay = function(loc, edge, d) {
60351                 if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
60352                     return;   // can't click here
60353                 }
60354
60355                 context.pauseChangeDispatch();
60356                 context.pop(_tempEdits);
60357                 _tempEdits = 0;
60358
60359                 context.perform(
60360                     _actionAddDrawNode(),
60361                     actionAddMidpoint({ loc: loc, edge: edge }, end),
60362                     annotation
60363                 );
60364
60365                 context.resumeChangeDispatch();
60366                 checkGeometry(false);   // finishDraw = false
60367                 context.enter(mode);
60368             };
60369
60370
60371             // Connect the way to an existing node and continue drawing.
60372             drawWay.addNode = function(node, d) {
60373                 if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
60374                     return;   // can't click here
60375                 }
60376
60377                 context.pauseChangeDispatch();
60378                 context.pop(_tempEdits);
60379                 _tempEdits = 0;
60380
60381                 context.perform(
60382                     _actionReplaceDrawNode(node),
60383                     annotation
60384                 );
60385
60386                 context.resumeChangeDispatch();
60387                 checkGeometry(false);   // finishDraw = false
60388                 context.enter(mode);
60389             };
60390
60391
60392             // Finish the draw operation, removing the temporary edits.
60393             // If the way has enough nodes to be valid, it's selected.
60394             // Otherwise, delete everything and return to browse mode.
60395             drawWay.finish = function() {
60396                 checkGeometry(true);   // finishDraw = true
60397                 if (context.surface().classed('nope')) {
60398                     return;   // can't click here
60399                 }
60400
60401                 context.pauseChangeDispatch();
60402                 context.pop(_tempEdits);
60403                 _tempEdits = 0;
60404
60405                 var way = context.hasEntity(wayID);
60406                 if (!way || way.isDegenerate()) {
60407                     drawWay.cancel();
60408                     return;
60409                 }
60410
60411                 context.resumeChangeDispatch();
60412
60413                 window.setTimeout(function() {
60414                     context.map().dblclickEnable(true);
60415                 }, 1000);
60416
60417                 var isNewFeature = !mode.isContinuing;
60418                 context.enter(modeSelect(context, [wayID]).newFeature(isNewFeature));
60419             };
60420
60421
60422             // Cancel the draw operation, delete everything, and return to browse mode.
60423             drawWay.cancel = function() {
60424                 context.pauseChangeDispatch();
60425                 context.pop(_tempEdits);
60426                 _tempEdits = 0;
60427
60428                 resetToStartGraph();
60429                 context.resumeChangeDispatch();
60430
60431                 window.setTimeout(function() {
60432                     context.map().dblclickEnable(true);
60433                 }, 1000);
60434
60435                 context.surface()
60436                     .classed('nope', false)
60437                     .classed('nope-disabled', false)
60438                     .classed('nope-suppressed', false);
60439
60440                 context.enter(modeBrowse(context));
60441             };
60442
60443
60444             drawWay.activeID = function() {
60445                 if (!arguments.length) return end.id;
60446                 // no assign
60447                 return drawWay;
60448             };
60449
60450
60451             drawWay.tail = function(text) {
60452                 behavior.tail(text);
60453                 return drawWay;
60454             };
60455
60456
60457             return drawWay;
60458         }
60459
60460         function modeDrawLine(context, wayID, startGraph, baselineGraph, button, affix, continuing) {
60461             var mode = {
60462                 button: button,
60463                 id: 'draw-line'
60464             };
60465
60466             var behavior;
60467
60468             mode.wayID = wayID;
60469
60470             mode.isContinuing = continuing;
60471
60472             mode.enter = function() {
60473                 var way = context.entity(wayID);
60474                 var index = (affix === 'prefix') ? 0 : undefined;
60475                 var headID = (affix === 'prefix') ? way.first() : way.last();
60476
60477                 behavior = behaviorDrawWay(context, wayID, index, mode, startGraph, baselineGraph)
60478                     .tail(t('modes.draw_line.tail'));
60479
60480                 var addNode = behavior.addNode;
60481                 behavior.addNode = function(node, d) {
60482                     if (node.id === headID) {
60483                         behavior.finish();
60484                     } else {
60485                         addNode(node, d);
60486                     }
60487                 };
60488
60489                 context.install(behavior);
60490             };
60491
60492
60493             mode.exit = function() {
60494                 context.uninstall(behavior);
60495             };
60496
60497
60498             mode.selectedIDs = function() {
60499                 return [wayID];
60500             };
60501
60502
60503             mode.activeID = function() {
60504                 return (behavior && behavior.activeID()) || [];
60505             };
60506
60507             return mode;
60508         }
60509
60510         function operationContinue(selectedIDs, context) {
60511             var graph = context.graph();
60512             var entities = selectedIDs.map(function(id) { return graph.entity(id); });
60513             var geometries = Object.assign(
60514                 { line: [], vertex: [] },
60515                 utilArrayGroupBy(entities, function(entity) { return entity.geometry(graph); })
60516             );
60517             var vertex = geometries.vertex[0];
60518
60519
60520             function candidateWays() {
60521                 return graph.parentWays(vertex).filter(function(parent) {
60522                     return parent.geometry(graph) === 'line' &&
60523                         !parent.isClosed() &&
60524                         parent.affix(vertex.id) &&
60525                         (geometries.line.length === 0 || geometries.line[0] === parent);
60526                 });
60527             }
60528
60529
60530             var operation = function() {
60531                 var candidate = candidateWays()[0];
60532                 context.enter(
60533                     modeDrawLine(context, candidate.id, context.graph(), context.graph(), 'line', candidate.affix(vertex.id), true)
60534                 );
60535             };
60536
60537
60538             operation.available = function() {
60539                 return geometries.vertex.length === 1 &&
60540                     geometries.line.length <= 1 &&
60541                     !context.features().hasHiddenConnections(vertex, context.graph());
60542             };
60543
60544
60545             operation.disabled = function() {
60546                 var candidates = candidateWays();
60547                 if (candidates.length === 0) {
60548                     return 'not_eligible';
60549                 } else if (candidates.length > 1) {
60550                     return 'multiple';
60551                 }
60552
60553                 return false;
60554             };
60555
60556
60557             operation.tooltip = function() {
60558                 var disable = operation.disabled();
60559                 return disable ?
60560                     t('operations.continue.' + disable) :
60561                     t('operations.continue.description');
60562             };
60563
60564
60565             operation.annotation = function() {
60566                 return t('operations.continue.annotation.line');
60567             };
60568
60569
60570             operation.id = 'continue';
60571             operation.keys = [t('operations.continue.key')];
60572             operation.title = t('operations.continue.title');
60573             operation.behavior = behaviorOperation(context).which(operation);
60574
60575             return operation;
60576         }
60577
60578         function operationDisconnect(selectedIDs, context) {
60579             var vertexIDs = [];
60580             var wayIDs = [];
60581             var otherIDs = [];
60582             var actions = [];
60583
60584             selectedIDs.forEach(function(id) {
60585                 if (context.geometry(id) === 'vertex') {
60586                     vertexIDs.push(id);
60587                 } else if (context.entity(id).type === 'way'){
60588                     wayIDs.push(id);
60589                 } else {
60590                     otherIDs.push(id);
60591                 }
60592             });
60593
60594             var disconnectingWayID = (vertexIDs.length === 0 && wayIDs.length === 1 && wayIDs[0]);
60595             var extent, nodes, coords;
60596
60597             if (disconnectingWayID) {   // disconnecting a way
60598                 var way = context.entity(disconnectingWayID);
60599                 extent = way.extent(context.graph());
60600                 nodes = utilGetAllNodes([disconnectingWayID], context.graph());
60601                 coords = nodes.map(function(n) { return n.loc; });
60602
60603                 way.nodes.forEach(function(vertexID) {
60604                     var action = actionDisconnect(vertexID).limitWays(wayIDs);
60605                     if (action.disabled(context.graph()) !== 'not_connected') {
60606                         actions.push(action);
60607                     }
60608                 });
60609
60610             } else {    // disconnecting a vertex
60611                 vertexIDs.forEach(function(vertexID) {
60612                     var action = actionDisconnect(vertexID);
60613
60614                     if (wayIDs.length > 0) {
60615                         var waysIDsForVertex = wayIDs.filter(function(wayID) {
60616                             var way = context.entity(wayID);
60617                             return way.nodes.indexOf(vertexID) !== -1;
60618                         });
60619                         action.limitWays(waysIDsForVertex);
60620                     }
60621                     actions.push(action);
60622                 });
60623             }
60624
60625
60626             var operation = function() {
60627                 context.perform(function(graph) {
60628                     return actions.reduce(function(graph, action) { return action(graph); }, graph);
60629                 }, operation.annotation());
60630
60631                 context.validator().validate();
60632             };
60633
60634
60635             operation.available = function() {
60636                 if (actions.length === 0) return false;
60637                 if (otherIDs.length !== 0) return false;
60638
60639                 if (vertexIDs.length !== 0 && wayIDs.length !== 0 && !wayIDs.every(function(wayID) {
60640                     return vertexIDs.some(function(vertexID) {
60641                         var way = context.entity(wayID);
60642                         return way.nodes.indexOf(vertexID) !== -1;
60643                     });
60644                 })) return false;
60645
60646                 return true;
60647             };
60648
60649
60650             operation.disabled = function() {
60651                 var reason;
60652                 for (var actionIndex in actions) {
60653                     reason = actions[actionIndex].disabled(context.graph());
60654                     if (reason) return reason;
60655                 }
60656
60657                 if (disconnectingWayID && extent.percentContainedIn(context.extent()) < 0.8) {
60658                     return 'too_large.single';
60659                 } else if (disconnectingWayID && someMissing()) {
60660                     return 'not_downloaded';
60661                 } else if (selectedIDs.some(context.hasHiddenConnections)) {
60662                     return 'connected_to_hidden';
60663                 }
60664
60665                 return false;
60666
60667
60668                 function someMissing() {
60669                     if (context.inIntro()) return false;
60670                     var osm = context.connection();
60671                     if (osm) {
60672                         var missing = coords.filter(function(loc) { return !osm.isDataLoaded(loc); });
60673                         if (missing.length) {
60674                             missing.forEach(function(loc) { context.loadTileAtLoc(loc); });
60675                             return true;
60676                         }
60677                     }
60678                     return false;
60679                 }
60680             };
60681
60682
60683             operation.tooltip = function() {
60684                 var disable = operation.disabled();
60685                 if (disable) {
60686                     return t('operations.disconnect.' + disable);
60687                 }
60688                 if (disconnectingWayID) {
60689                     return t('operations.disconnect.' + context.geometry(disconnectingWayID) + '.description');
60690                 }
60691                 return t('operations.disconnect.description');
60692             };
60693
60694
60695             operation.annotation = function() {
60696                 return t('operations.disconnect.annotation');
60697             };
60698
60699
60700             operation.id = 'disconnect';
60701             operation.keys = [t('operations.disconnect.key')];
60702             operation.title = t('operations.disconnect.title');
60703             operation.behavior = behaviorOperation(context).which(operation);
60704
60705             return operation;
60706         }
60707
60708         function operationDowngrade(selectedIDs, context) {
60709             var affectedFeatureCount = 0;
60710             var downgradeType;
60711
60712             setDowngradeTypeForEntityIDs();
60713
60714             var multi = affectedFeatureCount === 1 ? 'single' : 'multiple';
60715
60716             function setDowngradeTypeForEntityIDs() {
60717                 for (var i in selectedIDs) {
60718                     var entityID = selectedIDs[i];
60719                     var type = downgradeTypeForEntityID(entityID);
60720                     if (type) {
60721                         affectedFeatureCount += 1;
60722                         if (downgradeType && type !== downgradeType) {
60723                             downgradeType = 'building_address';
60724                         } else {
60725                             downgradeType = type;
60726                         }
60727                     }
60728                 }
60729             }
60730
60731             function downgradeTypeForEntityID(entityID) {
60732                 var graph = context.graph();
60733                 var entity = graph.entity(entityID);
60734                 var preset = context.presets().match(entity, graph);
60735
60736                 if (preset.isFallback()) return null;
60737
60738                 if (entity.type === 'node' &&
60739                     preset.id !== 'address' &&
60740                     Object.keys(entity.tags).some(function(key) {
60741                         return key.match(/^addr:.{1,}/);
60742                     })) {
60743
60744                     return 'address';
60745                 }
60746                 if (entity.geometry(graph) === 'area' &&
60747                     entity.tags.building &&
60748                     !preset.tags.building) {
60749
60750                     return 'building';
60751                 }
60752
60753                 return null;
60754             }
60755
60756             var buildingKeysToKeep = ['architect', 'building', 'height', 'layer', 'source', 'type', 'wheelchair'];
60757             var addressKeysToKeep = ['source'];
60758
60759             var operation = function () {
60760                 context.perform(function(graph) {
60761
60762                     for (var i in selectedIDs) {
60763                         var entityID = selectedIDs[i];
60764                         var type = downgradeTypeForEntityID(entityID);
60765                         if (!type) continue;
60766
60767                         var tags = Object.assign({}, graph.entity(entityID).tags);  // shallow copy
60768                         for (var key in tags) {
60769                             if (type === 'address' && addressKeysToKeep.indexOf(key) !== -1) continue;
60770                             if (type === 'building') {
60771                                 if (buildingKeysToKeep.indexOf(key) !== -1 ||
60772                                     key.match(/^building:.{1,}/) ||
60773                                     key.match(/^roof:.{1,}/)) continue;
60774                             }
60775                             // keep address tags for buildings too
60776                             if (key.match(/^addr:.{1,}/)) continue;
60777
60778                             delete tags[key];
60779                         }
60780                         graph = actionChangeTags(entityID, tags)(graph);
60781                     }
60782                     return graph;
60783                 }, operation.annotation());
60784
60785                 context.validator().validate();
60786
60787                 // refresh the select mode to enable the delete operation
60788                 context.enter(modeSelect(context, selectedIDs));
60789             };
60790
60791
60792             operation.available = function () {
60793                 return downgradeType;
60794             };
60795
60796
60797             operation.disabled = function () {
60798                 if (selectedIDs.some(hasWikidataTag)) {
60799                     return 'has_wikidata_tag';
60800                 }
60801                 return false;
60802
60803                 function hasWikidataTag(id) {
60804                     var entity = context.entity(id);
60805                     return entity.tags.wikidata && entity.tags.wikidata.trim().length > 0;
60806                 }
60807             };
60808
60809
60810             operation.tooltip = function () {
60811                 var disable = operation.disabled();
60812                 return disable ?
60813                     t('operations.downgrade.' + disable + '.' + multi) :
60814                     t('operations.downgrade.description.' + downgradeType);
60815             };
60816
60817
60818             operation.annotation = function () {
60819                 var suffix;
60820                 if (downgradeType === 'building_address') {
60821                     suffix = 'multiple';
60822                 } else {
60823                     suffix = downgradeType + '.' + multi;
60824                 }
60825                 return t('operations.downgrade.annotation.' + suffix, { n: affectedFeatureCount});
60826             };
60827
60828
60829             operation.id = 'downgrade';
60830             operation.keys = [uiCmd('⌘⌫'), uiCmd('⌘⌦'), uiCmd('⌦')];
60831             operation.title = t('operations.downgrade.title');
60832             operation.behavior = behaviorOperation(context).which(operation);
60833
60834
60835             return operation;
60836         }
60837
60838         function operationExtract(selectedIDs, context) {
60839             var entityID = selectedIDs.length && selectedIDs[0];
60840             var action = actionExtract(entityID, context.projection);
60841
60842             var geometry = entityID && context.geometry(entityID);
60843             var extent = geometry === 'area' && context.entity(entityID).extent(context.graph());
60844
60845
60846             var operation = function () {
60847                 context.perform(action);  // do the extract
60848                 context.validator().validate();
60849
60850                 var extractedNodeID = action.getExtractedNodeID();
60851
60852                 var mouse = context.map().mouseCoordinates();
60853                 if (mouse.some(isNaN)) {
60854                     enterMoveMode();
60855
60856                 } else {
60857                     // move detached node to the mouse location (transitioned)
60858                     context.perform(actionMoveNode(extractedNodeID, mouse));
60859
60860                     // after transition completes, put at final mouse location and enter move mode.
60861                     window.setTimeout(function() {
60862                         mouse = context.map().mouseCoordinates();
60863                         context.replace(actionMoveNode(extractedNodeID, mouse));
60864                         enterMoveMode();
60865                     }, 150);
60866                 }
60867
60868                 function enterMoveMode() {
60869                     var baseGraph = context.graph();
60870                     context.enter(modeMove(context, [extractedNodeID], baseGraph));
60871                 }
60872             };
60873
60874
60875             operation.available = function () {
60876                 if (selectedIDs.length !== 1) return false;
60877
60878                 var graph = context.graph();
60879                 var entity = graph.hasEntity(entityID);
60880                 if (!entity) return false;
60881
60882                 if (!entity.hasInterestingTags()) return false;
60883
60884                 if (geometry === 'area') {
60885                     var preset = context.presets().match(entity, graph);
60886                     return preset.geometry.indexOf('point') !== -1;
60887                 }
60888
60889                 return entity.type === 'node' && graph.parentWays(entity).length > 0;
60890             };
60891
60892
60893             operation.disabled = function () {
60894                 var reason = action.disabled(context.graph());
60895                 if (reason) {
60896                     return reason;
60897                 } else if (geometry === 'vertex' && selectedIDs.some(context.hasHiddenConnections)) {
60898                     return 'connected_to_hidden';
60899                 } else if (extent && extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
60900                     return 'too_large';
60901                 }
60902
60903                 return false;
60904             };
60905
60906
60907             operation.tooltip = function () {
60908                 var disableReason = operation.disabled();
60909                 if (disableReason) {
60910                     return t('operations.extract.' + disableReason + '.' + geometry + '.single',
60911                         { relation: context.presets().item('type/restriction').name() });
60912                 } else {
60913                     return t('operations.extract.description.' + geometry + '.single');
60914                 }
60915             };
60916
60917
60918             operation.annotation = function () {
60919                 return t('operations.extract.annotation.single');
60920             };
60921
60922
60923             operation.id = 'extract';
60924             operation.keys = [t('operations.extract.key')];
60925             operation.title = t('operations.extract.title');
60926             operation.behavior = behaviorOperation(context).which(operation);
60927
60928
60929             return operation;
60930         }
60931
60932         function operationMerge(selectedIDs, context) {
60933
60934             function updatePresetTags(newGraph, ids) {
60935                 var id = ids[0];
60936                 var newEntity = newGraph.hasEntity(id);
60937
60938                 if (!newEntity) return;
60939                 var newPreset = context.presets().match(newEntity, newGraph);
60940                 context.replace(actionChangePreset(id, null, newPreset), operation.annotation());
60941             }
60942
60943
60944             var join = actionJoin(selectedIDs);
60945             var merge = actionMerge(selectedIDs);
60946             var mergePolygon = actionMergePolygon(selectedIDs);
60947             var mergeNodes = actionMergeNodes(selectedIDs);
60948
60949
60950             var operation = function() {
60951                 var doUpdateTags;
60952                 var action;
60953
60954                 if (!join.disabled(context.graph())) {
60955                     doUpdateTags = false;
60956                     action = join;
60957                 } else if (!merge.disabled(context.graph())) {
60958                     doUpdateTags = true;
60959                     action = merge;
60960                 } else if (!mergePolygon.disabled(context.graph())) {
60961                     doUpdateTags = false;
60962                     action = mergePolygon;
60963                 } else {
60964                     doUpdateTags = true;
60965                     action = mergeNodes;
60966                 }
60967
60968                 context.perform(action, operation.annotation());
60969
60970                 var ids = selectedIDs.filter(function(id) {
60971                     var entity = context.hasEntity(id);
60972                     return entity && entity.type !== 'node';
60973                 });
60974
60975                 // if we merged tags, rematch preset to update tags if necessary (#3851)
60976                 if (doUpdateTags) {
60977                     updatePresetTags(context.graph(), ids);
60978                 }
60979
60980                 context.validator().validate();
60981                 context.enter(modeSelect(context, ids));
60982             };
60983
60984
60985             operation.available = function() {
60986                 return selectedIDs.length >= 2;
60987             };
60988
60989
60990             operation.disabled = function() {
60991                 return join.disabled(context.graph()) &&
60992                     merge.disabled(context.graph()) &&
60993                     mergePolygon.disabled(context.graph()) &&
60994                     mergeNodes.disabled(context.graph());
60995             };
60996
60997
60998             operation.tooltip = function() {
60999                 var j = join.disabled(context.graph());          // 'not_eligible', 'not_adjacent', 'restriction', 'conflicting_tags'
61000                 var m = merge.disabled(context.graph());         // 'not_eligible'
61001                 var p = mergePolygon.disabled(context.graph());  // 'not_eligible', 'incomplete_relation'
61002                 var n = mergeNodes.disabled(context.graph());    // 'not_eligible', 'relation', 'restriction'
61003
61004                 // disabled for one of various reasons
61005                 if (j && m && p && n) {
61006                     if (j === 'restriction' || n === 'restriction') {
61007                         return t('operations.merge.restriction',
61008                             { relation: context.presets().item('type/restriction').name() });
61009
61010                     } else if (p === 'incomplete_relation') {
61011                         return t('operations.merge.incomplete_relation');
61012
61013                     } else if (n === 'relation') {
61014                         return t('operations.merge.relation');
61015
61016                     } else {
61017                         return t('operations.merge.' + j);
61018                     }
61019
61020                 } else {
61021                     return t('operations.merge.description');
61022                 }
61023             };
61024
61025
61026             operation.annotation = function() {
61027                 return t('operations.merge.annotation', { n: selectedIDs.length });
61028             };
61029
61030
61031             operation.id = 'merge';
61032             operation.keys = [t('operations.merge.key')];
61033             operation.title = t('operations.merge.title');
61034             operation.behavior = behaviorOperation(context).which(operation);
61035
61036             return operation;
61037         }
61038
61039         function operationReverse(selectedIDs, context) {
61040             var entityID = selectedIDs[0];
61041
61042             var operation = function() {
61043                 context.perform(actionReverse(entityID), operation.annotation());
61044                 context.validator().validate();
61045             };
61046
61047
61048             operation.available = function() {
61049                 return selectedIDs.length === 1 && context.geometry(entityID) === 'line';
61050             };
61051
61052
61053             operation.disabled = function() {
61054                 return false;
61055             };
61056
61057
61058             operation.tooltip = function() {
61059                 return t('operations.reverse.description');
61060             };
61061
61062
61063             operation.annotation = function() {
61064                 return t('operations.reverse.annotation');
61065             };
61066
61067
61068             operation.id = 'reverse';
61069             operation.keys = [t('operations.reverse.key')];
61070             operation.title = t('operations.reverse.title');
61071             operation.behavior = behaviorOperation(context).which(operation);
61072
61073             return operation;
61074         }
61075
61076         function operationSplit(selectedIDs, context) {
61077             var vertices = selectedIDs
61078                 .filter(function(id) { return context.geometry(id) === 'vertex'; });
61079             var entityID = vertices[0];
61080             var action = actionSplit(entityID);
61081             var ways = [];
61082
61083             if (vertices.length === 1) {
61084                 if (entityID && selectedIDs.length > 1) {
61085                     var ids = selectedIDs.filter(function(id) { return id !== entityID; });
61086                     action.limitWays(ids);
61087                 }
61088                 ways = action.ways(context.graph());
61089             }
61090
61091
61092             var operation = function() {
61093                 var difference = context.perform(action, operation.annotation());
61094                 context.enter(modeSelect(context, difference.extantIDs()));
61095             };
61096
61097
61098             operation.available = function() {
61099                 return vertices.length === 1;
61100             };
61101
61102
61103             operation.disabled = function() {
61104                 var reason = action.disabled(context.graph());
61105                 if (reason) {
61106                     return reason;
61107                 } else if (selectedIDs.some(context.hasHiddenConnections)) {
61108                     return 'connected_to_hidden';
61109                 }
61110
61111                 return false;
61112             };
61113
61114
61115             operation.tooltip = function() {
61116                 var disable = operation.disabled();
61117                 if (disable) {
61118                     return t('operations.split.' + disable);
61119                 } else if (ways.length === 1) {
61120                     return t('operations.split.description.' + context.geometry(ways[0].id));
61121                 } else {
61122                     return t('operations.split.description.multiple');
61123                 }
61124             };
61125
61126
61127             operation.annotation = function() {
61128                 return ways.length === 1 ?
61129                     t('operations.split.annotation.' + context.geometry(ways[0].id)) :
61130                     t('operations.split.annotation.multiple', { n: ways.length });
61131             };
61132
61133
61134             operation.id = 'split';
61135             operation.keys = [t('operations.split.key')];
61136             operation.title = t('operations.split.title');
61137             operation.behavior = behaviorOperation(context).which(operation);
61138
61139             return operation;
61140         }
61141
61142         function operationStraighten(selectedIDs, context) {
61143             var wayIDs = selectedIDs.filter(function(id) { return id.charAt(0) === 'w'; });
61144             var nodeIDs = selectedIDs.filter(function(id) { return id.charAt(0) === 'n'; });
61145
61146             var nodes = utilGetAllNodes(selectedIDs, context.graph());
61147             var coords = nodes.map(function(n) { return n.loc; });
61148             var action = chooseAction();
61149             var geometry;
61150
61151
61152             function chooseAction() {
61153                 // straighten selected nodes
61154                 if (wayIDs.length === 0 && nodeIDs.length > 2) {
61155                     geometry = 'points';
61156                     return actionStraightenNodes(nodeIDs, context.projection);
61157
61158                 // straighten selected ways (possibly between range of 2 selected nodes)
61159                 } else if (wayIDs.length > 0 && (nodeIDs.length === 0 || nodeIDs.length === 2)) {
61160                     var startNodeIDs = [];
61161                     var endNodeIDs = [];
61162
61163                     for (var i = 0; i < selectedIDs.length; i++) {
61164                         var entity = context.entity(selectedIDs[i]);
61165                         if (entity.type === 'node') {
61166                             continue;
61167                         } else if (entity.type !== 'way' || entity.isClosed()) {
61168                             return false;  // exit early, can't straighten these
61169                         }
61170
61171                         startNodeIDs.push(entity.first());
61172                         endNodeIDs.push(entity.last());
61173                     }
61174
61175                     // Remove duplicate end/startNodeIDs (duplicate nodes cannot be at the line end)
61176                     startNodeIDs = startNodeIDs.filter(function(n) {
61177                         return startNodeIDs.indexOf(n) === startNodeIDs.lastIndexOf(n);
61178                     });
61179                     endNodeIDs = endNodeIDs.filter(function(n) {
61180                         return endNodeIDs.indexOf(n) === endNodeIDs.lastIndexOf(n);
61181                     });
61182
61183                     // Ensure all ways are connected (i.e. only 2 unique endpoints/startpoints)
61184                     if (utilArrayDifference(startNodeIDs, endNodeIDs).length +
61185                         utilArrayDifference(endNodeIDs, startNodeIDs).length !== 2) return false;
61186
61187                     // Ensure path contains at least 3 unique nodes
61188                     var wayNodeIDs = utilGetAllNodes(wayIDs, context.graph())
61189                         .map(function(node) { return node.id; });
61190                     if (wayNodeIDs.length <= 2) return false;
61191
61192                     // If range of 2 selected nodes is supplied, ensure nodes lie on the selected path
61193                     if (nodeIDs.length === 2 && (
61194                         wayNodeIDs.indexOf(nodeIDs[0]) === -1 || wayNodeIDs.indexOf(nodeIDs[1]) === -1
61195                     )) return false;
61196
61197                     geometry = 'line';
61198                     return actionStraightenWay(selectedIDs, context.projection);
61199                 }
61200
61201                 return false;
61202             }
61203
61204
61205             function operation() {
61206                 if (!action) return;
61207
61208                 context.perform(action, operation.annotation());
61209
61210                 window.setTimeout(function() {
61211                     context.validator().validate();
61212                 }, 300);  // after any transition
61213             }
61214
61215
61216             operation.available = function() {
61217                 return Boolean(action);
61218             };
61219
61220
61221             operation.disabled = function() {
61222                 var reason = action.disabled(context.graph());
61223                 if (reason) {
61224                     return reason;
61225                 } else if (someMissing()) {
61226                     return 'not_downloaded';
61227                 } else if (selectedIDs.some(context.hasHiddenConnections)) {
61228                     return 'connected_to_hidden';
61229                 }
61230
61231                 return false;
61232
61233
61234                 function someMissing() {
61235                     if (context.inIntro()) return false;
61236                     var osm = context.connection();
61237                     if (osm) {
61238                         var missing = coords.filter(function(loc) { return !osm.isDataLoaded(loc); });
61239                         if (missing.length) {
61240                             missing.forEach(function(loc) { context.loadTileAtLoc(loc); });
61241                             return true;
61242                         }
61243                     }
61244                     return false;
61245                 }
61246             };
61247
61248
61249             operation.tooltip = function() {
61250                 var disable = operation.disabled();
61251                 return disable ?
61252                     t('operations.straighten.' + disable) :
61253                     t('operations.straighten.description.' + geometry);
61254             };
61255
61256
61257             operation.annotation = function() {
61258                 return t('operations.straighten.annotation.' + geometry);
61259             };
61260
61261
61262             operation.id = 'straighten';
61263             operation.keys = [t('operations.straighten.key')];
61264             operation.title = t('operations.straighten.title');
61265             operation.behavior = behaviorOperation(context).which(operation);
61266
61267             return operation;
61268         }
61269
61270
61271
61272         var Operations = /*#__PURE__*/Object.freeze({
61273                 operationCircularize: operationCircularize,
61274                 operationContinue: operationContinue,
61275                 operationDelete: operationDelete,
61276                 operationDisconnect: operationDisconnect,
61277                 operationDowngrade: operationDowngrade,
61278                 operationExtract: operationExtract,
61279                 operationMerge: operationMerge,
61280                 operationMove: operationMove,
61281                 operationOrthogonalize: operationOrthogonalize,
61282                 operationReflectShort: operationReflectShort,
61283                 operationReflectLong: operationReflectLong,
61284                 operationReverse: operationReverse,
61285                 operationRotate: operationRotate,
61286                 operationSplit: operationSplit,
61287                 operationStraighten: operationStraighten
61288         });
61289
61290         function uiEditMenu(context, operations) {
61291             var menu;
61292             var center = [0, 0];
61293             var offset = [0, 0];
61294             var tooltip;
61295
61296             var p = 8;               // top padding
61297             var m = 4;               // top margin
61298             var h = 15;              // height of icon
61299             var vpBottomMargin = 45; // viewport bottom margin
61300             var vpSideMargin = 35;   // viewport side margin
61301             var buttonWidth = 44;
61302             var buttonHeight = (2 * p + h);
61303             var menuWidth = buttonWidth;
61304             var menuHeight = (2 * m) + operations.length * buttonHeight;
61305             var menuSideMargin = 10;
61306             var tooltipWidth = 200;
61307             var tooltipHeight = 200;  // a reasonable guess, real height depends on tooltip contents
61308
61309
61310             var editMenu = function (selection) {
61311                 if (!operations.length) return;
61312
61313                 selection.node().parentNode.focus();
61314
61315                 var isRTL = textDirection === 'rtl';
61316                 var viewport = context.surfaceRect();
61317
61318                 if (!isRTL && (center[0] + menuSideMargin + menuWidth) > (viewport.width - vpSideMargin)) {
61319                     // menu is going left-to-right and near right viewport edge, go left instead
61320                     isRTL = true;
61321                 } else if (isRTL && (center[0] - menuSideMargin - menuWidth) < vpSideMargin) {
61322                     // menu is going right-to-left and near left viewport edge, go right instead
61323                     isRTL = false;
61324                 }
61325
61326                 offset[0] = (isRTL ? -1 * (menuSideMargin + menuWidth) : menuSideMargin);
61327
61328                 if (center[1] + menuHeight > (viewport.height - vpBottomMargin)) {
61329                     // menu is near bottom viewport edge, shift upwards
61330                     offset[1] = -1 * (center[1] + menuHeight - viewport.height + vpBottomMargin);
61331                 }
61332
61333                 var origin = geoVecAdd(center, offset);
61334
61335                 menu = selection
61336                     .append('g')
61337                     .attr('class', 'edit-menu')
61338                     .attr('transform', 'translate(' + origin + ')')
61339                     .attr('opacity', 0);
61340
61341                 menu
61342                     .transition()
61343                     .attr('opacity', 1);
61344
61345                 menu
61346                     .append('rect')
61347                     .attr('class', 'edit-menu-background')
61348                     .attr('x', 4)
61349                     .attr('rx', 4)
61350                     .attr('ry', 4)
61351                     .attr('width', menuWidth)
61352                     .attr('height', menuHeight)
61353                     .attr('stroke-linecap', 'round');
61354
61355
61356                 var buttons = menu.selectAll('.edit-menu-item')
61357                     .data(operations);
61358
61359                 // enter
61360                 var buttonsEnter = buttons.enter()
61361                     .append('g')
61362                     .attr('class', function (d) { return 'edit-menu-item edit-menu-item-' + d.id; })
61363                     .attr('transform', function(d, i) {
61364                         return 'translate(' + geoVecFloor([0, m + i * buttonHeight]).join(',') + ')';
61365                     });
61366
61367                 buttonsEnter
61368                     .append('rect')
61369                     .attr('x', 4)
61370                     .attr('width', buttonWidth)
61371                     .attr('height', buttonHeight)
61372                     .on('click', click)
61373                     .on('mousedown', mousedown)
61374                     .on('mouseover', mouseover)
61375                     .on('mouseout', mouseout);
61376
61377                 buttonsEnter
61378                     .append('use')
61379                     .attr('width', '20')
61380                     .attr('height', '20')
61381                     .attr('transform', function () { return 'translate(' + [2 * p, 5] + ')'; })
61382                     .attr('xlink:href', function (d) { return '#iD-operation-' + d.id; });
61383
61384                 // update
61385                 buttons = buttonsEnter
61386                     .merge(buttons)
61387                     .classed('disabled', function(d) { return d.disabled(); });
61388
61389
61390                 tooltip = d3_select('#id-container')
61391                     .append('div')
61392                     .attr('class', 'tooltip-inner edit-menu-tooltip');
61393
61394
61395                 function click(operation) {
61396                     event.stopPropagation();
61397                     if (operation.disabled()) return;
61398                     operation();
61399                     editMenu.close();
61400                 }
61401
61402                 function mousedown() {
61403                     event.stopPropagation();  // https://github.com/openstreetmap/iD/issues/1869
61404                 }
61405
61406                 function mouseover(d, i) {
61407                     var tipX, tipY;
61408
61409                     if (!isRTL) {
61410                         tipX = viewport.left + origin[0] + menuSideMargin + menuWidth;
61411                     } else {
61412                         tipX = viewport.left + origin[0] - 4 - tooltipWidth;
61413                     }
61414
61415                     if (tipX + tooltipWidth > viewport.right) {
61416                         // tip is going left-to-right and near right viewport edge, go left instead
61417                         tipX = viewport.left + origin[0] - 4 - tooltipWidth;
61418                     } else if (tipX < viewport.left) {
61419                         // tip is going right-to-left and near left viewport edge, go right instead
61420                         tipX = viewport.left + origin[0] + menuSideMargin + menuWidth;
61421                     }
61422
61423                     tipY = viewport.top + origin[1] + (i * buttonHeight);
61424                     if (tipY + tooltipHeight > viewport.bottom) {
61425                         // tip is near bottom viewport edge, shift upwards
61426                         tipY -= tipY + tooltipHeight - viewport.bottom;
61427                     }
61428
61429                     tooltip
61430                         .style('left', tipX + 'px')
61431                         .style('top', tipY + 'px')
61432                         .style('display', 'block')
61433                         .html(uiTooltipHtml(d.tooltip(), d.keys[0], d.title));
61434
61435                     // update disabled again, just in case tooltip and disabled state disagree
61436                     // https://github.com/openstreetmap/iD/issues/6296#issuecomment-489259027
61437                     d3_select(this.parentNode)
61438                         .classed('disabled', d.disabled());
61439
61440                 }
61441
61442                 function mouseout() {
61443                     tooltip.style('display', 'none');
61444                 }
61445             };
61446
61447
61448             editMenu.close = function () {
61449                 if (menu) {
61450                     menu
61451                         .style('pointer-events', 'none')
61452                         .transition()
61453                         .attr('opacity', 0)
61454                         .remove();
61455                 }
61456
61457                 if (tooltip) {
61458                     tooltip.remove();
61459                 }
61460             };
61461
61462
61463             editMenu.center = function(val) {
61464                 if (!arguments.length) return center;
61465                 center = val;
61466                 return editMenu;
61467             };
61468
61469
61470             return editMenu;
61471         }
61472
61473         function uiSelectionList(context, selectedIDs) {
61474
61475             function selectEntity(entity) {
61476                 context.enter(modeSelect(context, [entity.id]));
61477             }
61478
61479
61480             function deselectEntity(entity) {
61481                 event.stopPropagation();
61482                 var index = selectedIDs.indexOf(entity.id);
61483                 if (index > -1) {
61484                     selectedIDs.splice(index, 1);
61485                 }
61486                 context.enter(modeSelect(context, selectedIDs));
61487             }
61488
61489
61490             function selectionList(selection) {
61491                 selection.classed('selection-list-pane', true);
61492
61493                 var header = selection
61494                     .append('div')
61495                     .attr('class', 'header fillL cf');
61496
61497                 header
61498                     .append('h3')
61499                     .text(t('inspector.multiselect'));
61500
61501                 var listWrap = selection
61502                     .append('div')
61503                     .attr('class', 'inspector-body');
61504
61505                 var list = listWrap
61506                     .append('div')
61507                     .attr('class', 'feature-list cf');
61508
61509
61510                 context.history()
61511                     .on('change.selectionList', function(difference) {
61512                         if (difference) drawList();
61513                     });
61514
61515                 drawList();
61516
61517
61518                 function drawList() {
61519                     var entities = selectedIDs
61520                         .map(function(id) { return context.hasEntity(id); })
61521                         .filter(function(entity) { return entity; });
61522
61523                     var items = list.selectAll('.feature-list-item')
61524                         .data(entities, osmEntity.key);
61525
61526                     items.exit()
61527                         .remove();
61528
61529                     // Enter
61530                     var enter = items.enter()
61531                         .append('div')
61532                         .attr('class', 'feature-list-item')
61533                         .on('click', selectEntity);
61534
61535                     enter
61536                         .each(function(d) {
61537                             d3_select(this).on('mouseover', function() {
61538                                 utilHighlightEntities([d.id], true, context);
61539                             });
61540                             d3_select(this).on('mouseout', function() {
61541                                 utilHighlightEntities([d.id], false, context);
61542                             });
61543                         });
61544
61545                     var label = enter
61546                         .append('button')
61547                         .attr('class', 'label');
61548
61549                     enter
61550                         .append('button')
61551                         .attr('class', 'close')
61552                         .on('click', deselectEntity)
61553                         .call(svgIcon('#iD-icon-close'));
61554
61555                     label
61556                         .append('span')
61557                         .attr('class', 'entity-geom-icon')
61558                         .call(svgIcon('', 'pre-text'));
61559
61560                     label
61561                         .append('span')
61562                         .attr('class', 'entity-type');
61563
61564                     label
61565                         .append('span')
61566                         .attr('class', 'entity-name');
61567
61568                     // Update
61569                     items = items.merge(enter);
61570
61571                     items.selectAll('.entity-geom-icon use')
61572                         .attr('href', function() {
61573                             var entity = this.parentNode.parentNode.__data__;
61574                             return '#iD-icon-' + context.geometry(entity.id);
61575                         });
61576
61577                     items.selectAll('.entity-type')
61578                         .text(function(entity) { return context.presets().match(entity, context.graph()).name(); });
61579
61580                     items.selectAll('.entity-name')
61581                         .text(function(entity) { return utilDisplayName(entity); });
61582                 }
61583             }
61584
61585             return selectionList;
61586         }
61587
61588         function uiRadialMenu(context, operations) {
61589             var menu;
61590             var center = [0, 0];
61591             var tooltip;
61592
61593
61594             var radialMenu = function(selection) {
61595                 if (!operations.length) return;
61596
61597                 selection.node().parentNode.focus();
61598
61599                 function click(operation) {
61600                     event.stopPropagation();
61601                     if (operation.disabled()) return;
61602                     operation();
61603                     radialMenu.close();
61604                 }
61605
61606                 menu = selection
61607                     .append('g')
61608                     .attr('class', 'radial-menu')
61609                     .attr('transform', 'translate(' + center + ')')
61610                     .attr('opacity', 0);
61611
61612                 menu
61613                     .transition()
61614                     .attr('opacity', 1);
61615
61616                 var r = 50;
61617                 var a = Math.PI / 4;
61618                 var a0 = -Math.PI / 4;
61619                 var a1 = a0 + (operations.length - 1) * a;
61620
61621                 menu
61622                     .append('path')
61623                     .attr('class', 'radial-menu-background')
61624                     .attr('d', 'M' + r * Math.sin(a0) + ',' +
61625                                      r * Math.cos(a0) +
61626                               ' A' + r + ',' + r + ' 0 ' + (operations.length > 5 ? '1' : '0') + ',0 ' +
61627                                      (r * Math.sin(a1) + 1e-3) + ',' +
61628                                      (r * Math.cos(a1) + 1e-3)) // Force positive-length path (#1305)
61629                     .attr('stroke-width', 50)
61630                     .attr('stroke-linecap', 'round');
61631
61632                 var button = menu.selectAll()
61633                     .data(operations)
61634                     .enter()
61635                     .append('g')
61636                     .attr('class', function(d) { return 'radial-menu-item radial-menu-item-' + d.id; })
61637                     .classed('disabled', function(d) { return d.disabled(); })
61638                     .attr('transform', function(d, i) {
61639                         return 'translate(' + geoVecFloor([
61640                                 r * Math.sin(a0 + i * a),
61641                                 r * Math.cos(a0 + i * a)]).join(',') + ')';
61642                     });
61643
61644                 button
61645                     .append('circle')
61646                     .attr('r', 15)
61647                     .on('click', click)
61648                     .on('mousedown', mousedown)
61649                     .on('mouseover', mouseover)
61650                     .on('mouseout', mouseout);
61651
61652                 button
61653                     .append('use')
61654                     .attr('transform', 'translate(-10,-10)')
61655                     .attr('width', '20')
61656                     .attr('height', '20')
61657                     .attr('xlink:href', function(d) { return '#iD-operation-' + d.id; });
61658
61659                 tooltip = d3_select(document.body)
61660                     .append('div')
61661                     .attr('class', 'tooltip-inner radial-menu-tooltip');
61662
61663                 function mousedown() {
61664                     event.stopPropagation(); // https://github.com/openstreetmap/iD/issues/1869
61665                 }
61666
61667                 function mouseover(d, i) {
61668                     var rect = context.surfaceRect();
61669                     var angle = a0 + i * a;
61670                     var top = rect.top + (r + 25) * Math.cos(angle) + center[1] + 'px';
61671                     var left = rect.left + (r + 25) * Math.sin(angle) + center[0] + 'px';
61672                     var bottom = rect.height - (r + 25) * Math.cos(angle) - center[1] + 'px';
61673                     var right = rect.width - (r + 25) * Math.sin(angle) - center[0] + 'px';
61674
61675                     tooltip
61676                         .style('top', null)
61677                         .style('left', null)
61678                         .style('bottom', null)
61679                         .style('right', null)
61680                         .style('display', 'block')
61681                         .html(uiTooltipHtml(d.tooltip(), d.keys[0]));
61682
61683                     if (i === 0) {
61684                         tooltip
61685                             .style('right', right)
61686                             .style('top', top);
61687                     } else if (i >= 4) {
61688                         tooltip
61689                             .style('left', left)
61690                             .style('bottom', bottom);
61691                     } else {
61692                         tooltip
61693                             .style('left', left)
61694                             .style('top', top);
61695                     }
61696                 }
61697
61698                 function mouseout() {
61699                     tooltip.style('display', 'none');
61700                 }
61701             };
61702
61703
61704             radialMenu.close = function() {
61705                 if (menu) {
61706                     menu
61707                         .style('pointer-events', 'none')
61708                         .transition()
61709                         .attr('opacity', 0)
61710                         .remove();
61711                 }
61712
61713                 if (tooltip) {
61714                     tooltip.remove();
61715                 }
61716             };
61717
61718
61719             radialMenu.center = function(_) {
61720                 if (!arguments.length) return center;
61721                 center = _;
61722                 return radialMenu;
61723             };
61724
61725
61726             return radialMenu;
61727         }
61728
61729         var _relatedParent;
61730
61731
61732         function modeSelect(context, selectedIDs) {
61733             var mode = {
61734                 id: 'select',
61735                 button: 'browse'
61736             };
61737
61738             var keybinding = utilKeybinding('select');
61739             var behaviors = [
61740                 behaviorCopy(context),
61741                 behaviorPaste(context),
61742                 behaviorBreathe(),
61743                 behaviorHover(context),
61744                 behaviorSelect(context),
61745                 behaviorLasso(context),
61746                 modeDragNode(context).restoreSelectedIDs(selectedIDs).behavior,
61747                 modeDragNote(context).behavior
61748             ];
61749             var editMenu;
61750             var _timeout = null;
61751             var _newFeature = false;
61752             var _suppressMenu = true;
61753             var _follow = false;
61754
61755
61756             var wrap = context.container()
61757                 .select('.inspector-wrap');
61758
61759
61760             function singular() {
61761                 if (selectedIDs && selectedIDs.length === 1) {
61762                     return context.hasEntity(selectedIDs[0]);
61763                 }
61764             }
61765
61766
61767             function checkSelectedIDs() {
61768                 var ids = [];
61769                 if (Array.isArray(selectedIDs)) {
61770                     ids = selectedIDs.filter(function(id) {
61771                         return context.hasEntity(id);
61772                     });
61773                 }
61774
61775                 if (ids.length) {
61776                     selectedIDs = ids;
61777                 } else {
61778                     context.enter(modeBrowse(context));
61779                 }
61780                 return !!ids.length;
61781             }
61782
61783
61784             // find the common parent ways for nextVertex, previousVertex
61785             function commonParents() {
61786                 var graph = context.graph();
61787                 var commonParents = [];
61788
61789                 for (var i = 0; i < selectedIDs.length; i++) {
61790                     var entity = context.hasEntity(selectedIDs[i]);
61791                     if (!entity || entity.geometry(graph) !== 'vertex') {
61792                         return [];  // selection includes some not vertexes
61793                     }
61794
61795                     var currParents = graph.parentWays(entity).map(function(w) { return w.id; });
61796                     if (!commonParents.length) {
61797                         commonParents = currParents;
61798                         continue;
61799                     }
61800
61801                     commonParents = utilArrayIntersection(commonParents, currParents);
61802                     if (!commonParents.length) {
61803                         return [];
61804                     }
61805                 }
61806
61807                 return commonParents;
61808             }
61809
61810
61811             function singularParent() {
61812                 var parents = commonParents();
61813                 if (!parents || parents.length === 0) {
61814                     _relatedParent = null;
61815                     return null;
61816                 }
61817
61818                 // relatedParent is used when we visit a vertex with multiple
61819                 // parents, and we want to remember which parent line we started on.
61820
61821                 if (parents.length === 1) {
61822                     _relatedParent = parents[0];  // remember this parent for later
61823                     return _relatedParent;
61824                 }
61825
61826                 if (parents.indexOf(_relatedParent) !== -1) {
61827                     return _relatedParent;   // prefer the previously seen parent
61828                 }
61829
61830                 return parents[0];
61831             }
61832
61833
61834             function closeMenu() {
61835                 if (editMenu) {
61836                     context.surface().call(editMenu.close);
61837                 }
61838             }
61839
61840
61841             function positionMenu() {
61842                 if (!editMenu) return;
61843
61844                 var entity = singular();
61845                 if (entity && context.geometry(entity.id) === 'relation') {
61846                     _suppressMenu = true;
61847                 } else {
61848                     var point = context.mouse();
61849                     var viewport = geoExtent(context.projection.clipExtent()).polygon();
61850
61851                     if (point && geoPointInPolygon(point, viewport)) {
61852                         editMenu.center(point);
61853                     } else {
61854                         _suppressMenu = true;
61855                     }
61856                 }
61857             }
61858
61859
61860             function showMenu() {
61861                 closeMenu();
61862                 if (editMenu) {
61863                     context.surface().call(editMenu);
61864                 }
61865             }
61866
61867
61868             function toggleMenu() {
61869                 // deprecation warning - Radial Menu to be removed in iD v3
61870                 if (d3_select('.edit-menu, .radial-menu').empty()) {
61871                     positionMenu();
61872                     showMenu();
61873                 } else {
61874                     closeMenu();
61875                 }
61876             }
61877
61878
61879             mode.selectedIDs = function() {
61880                 return selectedIDs;
61881             };
61882
61883
61884             mode.zoomToSelected = function() {
61885                 var entity = singular();
61886                 if (entity) {
61887                     context.map().zoomToEase(entity);
61888                 }
61889             };
61890
61891
61892             mode.reselect = function() {
61893                 if (!checkSelectedIDs()) return;
61894
61895                 var surfaceNode = context.surface().node();
61896                 if (surfaceNode.focus) {   // FF doesn't support it
61897                     surfaceNode.focus();
61898                 }
61899
61900                 positionMenu();
61901                 if (!_suppressMenu) {
61902                     showMenu();
61903                 }
61904             };
61905
61906
61907             mode.newFeature = function(val) {
61908                 if (!arguments.length) return _newFeature;
61909                 _newFeature = val;
61910                 return mode;
61911             };
61912
61913
61914             mode.suppressMenu = function(val) {
61915                 if (!arguments.length) return _suppressMenu;
61916                 _suppressMenu = val;
61917                 return mode;
61918             };
61919
61920
61921             mode.follow = function(val) {
61922                 if (!arguments.length) return _follow;
61923                 _follow = val;
61924                 return mode;
61925             };
61926
61927
61928             mode.enter = function() {
61929                 if (!checkSelectedIDs()) return;
61930
61931                 context.features().forceVisible(selectedIDs);
61932
61933                 var operations = Object.values(Operations)
61934                     .map(function(o) { return o(selectedIDs, context); })
61935                     .filter(function(o) { return o.available() && o.id !== 'delete' && o.id !== 'downgrade'; });
61936
61937                 var downgradeOperation = operationDowngrade(selectedIDs, context);
61938                 // don't allow delete if downgrade is available
61939                 var lastOperation = !context.inIntro() && downgradeOperation.available() ? downgradeOperation : operationDelete(selectedIDs, context);
61940
61941                 // deprecation warning - Radial Menu to be removed in iD v3
61942                 var isRadialMenu = context.storage('edit-menu-style') === 'radial';
61943                 if (isRadialMenu) {
61944                     operations = operations.slice(0,7);
61945                     operations.unshift(lastOperation);
61946                 } else {
61947                     operations.push(lastOperation);
61948                 }
61949
61950                 operations.forEach(function(operation) {
61951                     if (operation.behavior) {
61952                         behaviors.push(operation.behavior);
61953                     }
61954                 });
61955
61956                 behaviors.forEach(context.install);
61957
61958                 keybinding
61959                     .on(t('inspector.zoom_to.key'), mode.zoomToSelected)
61960                     .on(['[', 'pgup'], previousVertex)
61961                     .on([']', 'pgdown'], nextVertex)
61962                     .on(['{', uiCmd('⌘['), 'home'], firstVertex)
61963                     .on(['}', uiCmd('⌘]'), 'end'], lastVertex)
61964                     .on(['\\', 'pause'], nextParent)
61965                     .on('⎋', esc, true)
61966                     .on('space', toggleMenu);
61967
61968                 d3_select(document)
61969                     .call(keybinding);
61970
61971
61972                 // deprecation warning - Radial Menu to be removed in iD v3
61973                 editMenu = isRadialMenu
61974                     ? uiRadialMenu(context, operations)
61975                     : uiEditMenu(context, operations);
61976
61977                 context.ui().sidebar
61978                     .select(singular() ? singular().id : null, _newFeature);
61979
61980                 context.history()
61981                     .on('undone.select', update)
61982                     .on('redone.select', update);
61983
61984                 context.map()
61985                     .on('move.select', closeMenu)
61986                     .on('drawn.select', selectElements);
61987
61988                 context.surface()
61989                     .on('dblclick.select', dblclick);
61990
61991
61992                 selectElements();
61993
61994                 if (selectedIDs.length > 1) {
61995                     var entities = uiSelectionList(context, selectedIDs);
61996                     context.ui().sidebar.show(entities);
61997                 }
61998
61999                 if (_follow) {
62000                     var extent = geoExtent();
62001                     var graph = context.graph();
62002                     selectedIDs.forEach(function(id) {
62003                         var entity = context.entity(id);
62004                         extent._extend(entity.extent(graph));
62005                     });
62006
62007                     var loc = extent.center();
62008                     context.map().centerEase(loc);
62009                 } else if (singular() && singular().type === 'way') {
62010                     context.map().pan([0,0]);  // full redraw, to adjust z-sorting #2914
62011                 }
62012
62013                 _timeout = window.setTimeout(function() {
62014                     positionMenu();
62015                     if (!_suppressMenu) {
62016                         showMenu();
62017                     }
62018                 }, 270);  /* after any centerEase completes */
62019
62020
62021                 function update() {
62022                     closeMenu();
62023                     checkSelectedIDs();
62024                 }
62025
62026
62027                 function dblclick() {
62028                     var target = d3_select(event.target);
62029
62030                     var datum = target.datum();
62031                     var entity = datum && datum.properties && datum.properties.entity;
62032                     if (!entity) return;
62033
62034                     if (entity instanceof osmWay && target.classed('target')) {
62035                         var choice = geoChooseEdge(context.childNodes(entity), context.mouse(), context.projection);
62036                         var prev = entity.nodes[choice.index - 1];
62037                         var next = entity.nodes[choice.index];
62038
62039                         context.perform(
62040                             actionAddMidpoint({ loc: choice.loc, edge: [prev, next] }, osmNode()),
62041                             t('operations.add.annotation.vertex')
62042                         );
62043
62044                         event.preventDefault();
62045                         event.stopPropagation();
62046
62047                     } else if (entity.type === 'midpoint') {
62048                         context.perform(
62049                             actionAddMidpoint({ loc: entity.loc, edge: entity.edge }, osmNode()),
62050                             t('operations.add.annotation.vertex'));
62051
62052                         event.preventDefault();
62053                         event.stopPropagation();
62054                     }
62055                 }
62056
62057
62058                 function selectElements(drawn) {
62059                     if (!checkSelectedIDs()) return;
62060
62061                     var surface = context.surface();
62062                     var entity = singular();
62063
62064                     if (entity && context.geometry(entity.id) === 'relation') {
62065                         _suppressMenu = true;
62066                         return;
62067                     }
62068
62069                     surface.selectAll('.related')
62070                         .classed('related', false);
62071
62072                     singularParent();
62073                     if (_relatedParent) {
62074                         surface.selectAll(utilEntitySelector([_relatedParent]))
62075                             .classed('related', true);
62076                     }
62077
62078                     var selection = context.surface()
62079                         .selectAll(utilEntityOrMemberSelector(selectedIDs, context.graph()));
62080
62081                     if (selection.empty()) {
62082                         // Return to browse mode if selected DOM elements have
62083                         // disappeared because the user moved them out of view..
62084                         var source = event && event.type === 'zoom' && event.sourceEvent;
62085                         if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
62086                             context.enter(modeBrowse(context));
62087                         }
62088                     } else {
62089                         selection
62090                             .classed('selected', true);
62091                     }
62092                 }
62093
62094
62095                 function esc() {
62096                     if (d3_select('.combobox').size()) return;
62097                     context.enter(modeBrowse(context));
62098                 }
62099
62100
62101                 function firstVertex() {
62102                     event.preventDefault();
62103                     var entity = singular();
62104                     var parent = singularParent();
62105                     var way;
62106
62107                     if (entity && entity.type === 'way') {
62108                         way = entity;
62109                     } else if (parent) {
62110                         way = context.entity(parent);
62111                     }
62112
62113                     if (way) {
62114                         context.enter(
62115                             modeSelect(context, [way.first()]).follow(true)
62116                         );
62117                     }
62118                 }
62119
62120
62121                 function lastVertex() {
62122                     event.preventDefault();
62123                     var entity = singular();
62124                     var parent = singularParent();
62125                     var way;
62126
62127                     if (entity && entity.type === 'way') {
62128                         way = entity;
62129                     } else if (parent) {
62130                         way = context.entity(parent);
62131                     }
62132
62133                     if (way) {
62134                         context.enter(
62135                             modeSelect(context, [way.last()]).follow(true)
62136                         );
62137                     }
62138                 }
62139
62140
62141                 function previousVertex() {
62142                     event.preventDefault();
62143                     var parent = singularParent();
62144                     if (!parent) return;
62145
62146                     var way = context.entity(parent);
62147                     var length = way.nodes.length;
62148                     var curr = way.nodes.indexOf(selectedIDs[0]);
62149                     var index = -1;
62150
62151                     if (curr > 0) {
62152                         index = curr - 1;
62153                     } else if (way.isClosed()) {
62154                         index = length - 2;
62155                     }
62156
62157                     if (index !== -1) {
62158                         context.enter(
62159                             modeSelect(context, [way.nodes[index]]).follow(true)
62160                         );
62161                     }
62162                 }
62163
62164
62165                 function nextVertex() {
62166                     event.preventDefault();
62167                     var parent = singularParent();
62168                     if (!parent) return;
62169
62170                     var way = context.entity(parent);
62171                     var length = way.nodes.length;
62172                     var curr = way.nodes.indexOf(selectedIDs[0]);
62173                     var index = -1;
62174
62175                     if (curr < length - 1) {
62176                         index = curr + 1;
62177                     } else if (way.isClosed()) {
62178                         index = 0;
62179                     }
62180
62181                     if (index !== -1) {
62182                         context.enter(
62183                             modeSelect(context, [way.nodes[index]]).follow(true)
62184                         );
62185                     }
62186                 }
62187
62188
62189                 function nextParent() {
62190                     event.preventDefault();
62191                     var parents = commonParents();
62192                     if (!parents || parents.length < 2) return;
62193
62194                     var index = parents.indexOf(_relatedParent);
62195                     if (index < 0 || index > parents.length - 2) {
62196                         _relatedParent = parents[0];
62197                     } else {
62198                         _relatedParent = parents[index + 1];
62199                     }
62200
62201                     var surface = context.surface();
62202                     surface.selectAll('.related')
62203                         .classed('related', false);
62204
62205                     if (_relatedParent) {
62206                         surface.selectAll(utilEntitySelector([_relatedParent]))
62207                             .classed('related', true);
62208                     }
62209                 }
62210             };
62211
62212
62213             mode.exit = function() {
62214                 if (_timeout) window.clearTimeout(_timeout);
62215
62216                 behaviors.forEach(context.uninstall);
62217
62218                 d3_select(document)
62219                     .call(keybinding.unbind);
62220
62221                 closeMenu();
62222                 editMenu = undefined;
62223
62224                 context.history()
62225                     .on('undone.select', null)
62226                     .on('redone.select', null);
62227
62228                 var surface = context.surface();
62229
62230                 surface
62231                     .on('dblclick.select', null);
62232
62233                 surface
62234                     .selectAll('.selected')
62235                     .classed('selected', false);
62236
62237                 surface
62238                     .selectAll('.related')
62239                     .classed('related', false);
62240
62241                 context.map().on('drawn.select', null);
62242                 context.ui().sidebar.hide();
62243                 context.features().forceVisible([]);
62244
62245                 var entity = singular();
62246                 if (_newFeature && entity && entity.type === 'relation' &&
62247                     // no tags
62248                     Object.keys(entity.tags).length === 0 &&
62249                     // no parent relations
62250                     context.graph().parentRelations(entity).length === 0 &&
62251                     // no members or one member with no role
62252                     (entity.members.length === 0 || (entity.members.length === 1 && !entity.members[0].role))
62253                 ) {
62254                     // the user added this relation but didn't edit it at all, so just delete it
62255                     var deleteAction = actionDeleteRelation(entity.id, true /* don't delete untagged members */);
62256                     context.perform(deleteAction, t('operations.delete.annotation.relation'));
62257                 }
62258             };
62259
62260
62261             return mode;
62262         }
62263
62264         function uiLasso(context) {
62265             var group, polygon;
62266
62267             lasso.coordinates = [];
62268
62269             function lasso(selection) {
62270                 context.container()
62271                     .classed('lasso', true);
62272
62273                 group = selection
62274                     .append('g')
62275                     .attr('class', 'lasso hide');
62276
62277                 polygon = group
62278                     .append('path')
62279                     .attr('class', 'lasso-path');
62280
62281                 group
62282                     .call(uiToggle(true));
62283             }
62284
62285
62286             function draw() {
62287                 if (polygon) {
62288                     polygon.data([lasso.coordinates])
62289                         .attr('d', function(d) { return 'M' + d.join(' L') + ' Z'; });
62290                 }
62291             }
62292
62293
62294             lasso.extent = function () {
62295                 return lasso.coordinates.reduce(function(extent, point) {
62296                     return extent.extend(geoExtent(point));
62297                 }, geoExtent());
62298             };
62299
62300
62301             lasso.p = function(_) {
62302                 if (!arguments.length) return lasso;
62303                 lasso.coordinates.push(_);
62304                 draw();
62305                 return lasso;
62306             };
62307
62308
62309             lasso.close = function() {
62310                 if (group) {
62311                     group.call(uiToggle(false, function() {
62312                         d3_select(this).remove();
62313                     }));
62314                 }
62315                 context.container().classed('lasso', false);
62316             };
62317
62318
62319             return lasso;
62320         }
62321
62322         function behaviorLasso(context) {
62323
62324             var behavior = function(selection) {
62325                 var lasso;
62326
62327
62328                 function mousedown() {
62329                     var button = 0;  // left
62330                     if (event.button === button && event.shiftKey === true) {
62331                         lasso = null;
62332
62333                         d3_select(window)
62334                             .on('mousemove.lasso', mousemove)
62335                             .on('mouseup.lasso', mouseup);
62336
62337                         event.stopPropagation();
62338                     }
62339                 }
62340
62341
62342                 function mousemove() {
62343                     if (!lasso) {
62344                         lasso = uiLasso(context);
62345                         context.surface().call(lasso);
62346                     }
62347
62348                     lasso.p(context.mouse());
62349                 }
62350
62351
62352                 function normalize(a, b) {
62353                     return [
62354                         [Math.min(a[0], b[0]), Math.min(a[1], b[1])],
62355                         [Math.max(a[0], b[0]), Math.max(a[1], b[1])]
62356                     ];
62357                 }
62358
62359
62360                 function lassoed() {
62361                     if (!lasso) return [];
62362
62363                     var graph = context.graph();
62364                     var bounds = lasso.extent().map(context.projection.invert);
62365                     var extent = geoExtent(normalize(bounds[0], bounds[1]));
62366
62367                     var intersects = context.intersects(extent).filter(function(entity) {
62368                         return entity.type === 'node' &&
62369                             geoPointInPolygon(context.projection(entity.loc), lasso.coordinates) &&
62370                             !context.features().isHidden(entity, graph, entity.geometry(graph));
62371                     });
62372
62373                     return intersects.map(function(entity) { return entity.id; });
62374                 }
62375
62376
62377                 function mouseup() {
62378                     d3_select(window)
62379                         .on('mousemove.lasso', null)
62380                         .on('mouseup.lasso', null);
62381
62382                     if (!lasso) return;
62383
62384                     var ids = lassoed();
62385                     lasso.close();
62386
62387                     if (ids.length) {
62388                         context.enter(modeSelect(context, ids));
62389                     }
62390                 }
62391
62392                 selection
62393                     .on('mousedown.lasso', mousedown);
62394             };
62395
62396
62397             behavior.off = function(selection) {
62398                 selection.on('mousedown.lasso', null);
62399             };
62400
62401
62402             return behavior;
62403         }
62404
62405         function modeBrowse(context) {
62406             var mode = {
62407                 button: 'browse',
62408                 id: 'browse',
62409                 title: t('modes.browse.title'),
62410                 description: t('modes.browse.description')
62411             }, sidebar;
62412
62413             var behaviors = [
62414                 behaviorPaste(context),
62415                 behaviorHover(context).on('hover', context.ui().sidebar.hover),
62416                 behaviorSelect(context),
62417                 behaviorLasso(context),
62418                 modeDragNode(context).behavior,
62419                 modeDragNote(context).behavior
62420             ];
62421
62422
62423             mode.enter = function() {
62424                 behaviors.forEach(context.install);
62425
62426                 // Get focus on the body.
62427                 if (document.activeElement && document.activeElement.blur) {
62428                     document.activeElement.blur();
62429                 }
62430
62431                 if (sidebar) {
62432                     context.ui().sidebar.show(sidebar);
62433                 } else {
62434                     context.ui().sidebar.select(null);
62435                 }
62436             };
62437
62438
62439             mode.exit = function() {
62440                 context.ui().sidebar.hover.cancel();
62441                 behaviors.forEach(context.uninstall);
62442
62443                 if (sidebar) {
62444                     context.ui().sidebar.hide();
62445                 }
62446             };
62447
62448
62449             mode.sidebar = function(_) {
62450                 if (!arguments.length) return sidebar;
62451                 sidebar = _;
62452                 return mode;
62453             };
62454
62455
62456             return mode;
62457         }
62458
62459         function behaviorAddWay(context) {
62460             var dispatch$1 = dispatch('start', 'startFromWay', 'startFromNode');
62461             var draw = behaviorDraw(context);
62462
62463             function behavior(surface) {
62464                 draw.on('click', function() { dispatch$1.apply('start', this, arguments); })
62465                     .on('clickWay', function() { dispatch$1.apply('startFromWay', this, arguments); })
62466                     .on('clickNode', function() { dispatch$1.apply('startFromNode', this, arguments); })
62467                     .on('cancel', behavior.cancel)
62468                     .on('finish', behavior.cancel);
62469
62470                 context.map()
62471                     .dblclickEnable(false);
62472
62473                 surface.call(draw);
62474             }
62475
62476
62477             behavior.off = function(surface) {
62478                 surface.call(draw.off);
62479             };
62480
62481
62482             behavior.cancel = function() {
62483                 window.setTimeout(function() {
62484                     context.map().dblclickEnable(true);
62485                 }, 1000);
62486
62487                 context.enter(modeBrowse(context));
62488             };
62489
62490
62491             behavior.tail = function(text) {
62492                 draw.tail(text);
62493                 return behavior;
62494             };
62495
62496
62497             return utilRebind(behavior, dispatch$1, 'on');
62498         }
62499
62500         function behaviorHash(context) {
62501             var s0 = null; // cached window.location.hash
62502             var lat = 90 - 1e-8; // allowable latitude range
62503
62504
62505             var parser = function(map, s) {
62506                 var q = utilStringQs(s);
62507                 var args = (q.map || '').split('/').map(Number);
62508
62509                 if (args.length < 3 || args.some(isNaN)) {
62510                     return true; // replace bogus hash
62511
62512                 } else if (s !== formatter(map).slice(1)) {   // hash has changed
62513                     var mode = context.mode();
62514                     var dist = geoSphericalDistance(map.center(), [args[2], args[1]]);
62515                     var maxdist = 500;
62516
62517                     // Don't allow the hash location to change too much while drawing
62518                     // This can happen if the user accidently hit the back button.  #3996
62519                     if (mode && mode.id.match(/^draw/) !== null && dist > maxdist) {
62520                         context.enter(modeBrowse(context));
62521                     }
62522
62523                     map.centerZoom([args[2], Math.min(lat, Math.max(-lat, args[1]))], args[0]);
62524                 }
62525             };
62526
62527
62528             var formatter = function(map) {
62529                 var center = map.center();
62530                 var zoom = map.zoom();
62531                 var precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2));
62532                 var q = utilObjectOmit(utilStringQs(window.location.hash.substring(1)),
62533                     ['comment', 'source', 'hashtags', 'walkthrough']
62534                 );
62535                 var newParams = {};
62536
62537                 delete q.id;
62538                 var selected = context.selectedIDs().filter(function(id) {
62539                     return !context.entity(id).isNew();
62540                 });
62541                 if (selected.length) {
62542                     newParams.id = selected.join(',');
62543                 }
62544
62545                 newParams.map = zoom.toFixed(2) +
62546                     '/' + center[1].toFixed(precision) +
62547                     '/' + center[0].toFixed(precision);
62548
62549                 return '#' + utilQsString(Object.assign(q, newParams), true);
62550             };
62551
62552
62553             function update() {
62554                 if (context.inIntro()) return;
62555                 var s1 = formatter(context.map());
62556                 if (s0 !== s1) {
62557                     window.location.replace(s0 = s1);  // don't recenter the map!
62558                 }
62559             }
62560
62561
62562             var throttledUpdate = throttle(update, 500);
62563
62564
62565             function hashchange() {
62566                 if (window.location.hash === s0) return;  // ignore spurious hashchange events
62567                 if (parser(context.map(), (s0 = window.location.hash).substring(1))) {
62568                     update(); // replace bogus hash
62569                 }
62570             }
62571
62572
62573             function behavior() {
62574                 context.map()
62575                     .on('move.hash', throttledUpdate);
62576
62577                 context
62578                     .on('enter.hash', throttledUpdate);
62579
62580                 d3_select(window)
62581                     .on('hashchange.hash', hashchange);
62582
62583                 if (window.location.hash) {
62584                     var q = utilStringQs(window.location.hash.substring(1));
62585
62586                     if (q.id) {
62587                         context.zoomToEntity(q.id.split(',')[0], !q.map);
62588                     }
62589
62590                     if (q.comment) {
62591                         context.storage('comment', q.comment);
62592                         context.storage('commentDate', Date.now());
62593                     }
62594
62595                     if (q.source) {
62596                         context.storage('source', q.source);
62597                         context.storage('commentDate', Date.now());
62598                     }
62599
62600                     if (q.hashtags) {
62601                         context.storage('hashtags', q.hashtags);
62602                     }
62603
62604                     if (q.walkthrough === 'true') {
62605                         behavior.startWalkthrough = true;
62606                     }
62607
62608                     hashchange();
62609
62610                     if (q.map) {
62611                         behavior.hadHash = true;
62612                     }
62613                 }
62614             }
62615
62616
62617             behavior.off = function() {
62618                 throttledUpdate.cancel();
62619
62620                 context.map()
62621                     .on('move.hash', null);
62622
62623                 context
62624                     .on('enter.hash', null);
62625
62626                 d3_select(window)
62627                     .on('hashchange.hash', null);
62628
62629                 window.location.hash = '';
62630             };
62631
62632
62633             return behavior;
62634         }
62635
62636         /*
62637             iD.coreDifference represents the difference between two graphs.
62638             It knows how to calculate the set of entities that were
62639             created, modified, or deleted, and also contains the logic
62640             for recursively extending a difference to the complete set
62641             of entities that will require a redraw, taking into account
62642             child and parent relationships.
62643          */
62644         function coreDifference(base, head) {
62645             var _changes = {};
62646             var _didChange = {};  // 'addition', 'deletion', 'geometry', 'properties'
62647             var _diff = {};
62648
62649             function checkEntityID(id) {
62650                 var h = head.entities[id];
62651                 var b = base.entities[id];
62652
62653                 if (h === b) return;
62654                 if (_changes[id]) return;
62655
62656                 if (!h && b) {
62657                     _changes[id] = { base: b, head: h };
62658                     _didChange.deletion = true;
62659                     return;
62660                 }
62661                 if (h && !b) {
62662                     _changes[id] = { base: b, head: h };
62663                     _didChange.addition = true;
62664                     return;
62665                 }
62666
62667                 if (h && b) {
62668                     if (h.members && b.members && !fastDeepEqual(h.members, b.members)) {
62669                         _changes[id] = { base: b, head: h };
62670                         _didChange.geometry = true;
62671                         _didChange.properties = true;
62672                         return;
62673                     }
62674                     if (h.loc && b.loc && !geoVecEqual(h.loc, b.loc)) {
62675                         _changes[id] = { base: b, head: h };
62676                         _didChange.geometry = true;
62677                     }
62678                     if (h.nodes && b.nodes && !fastDeepEqual(h.nodes, b.nodes)) {
62679                         _changes[id] = { base: b, head: h };
62680                         _didChange.geometry = true;
62681                     }
62682                     if (h.tags && b.tags && !fastDeepEqual(h.tags, b.tags)) {
62683                         _changes[id] = { base: b, head: h };
62684                         _didChange.properties = true;
62685                     }
62686                 }
62687             }
62688
62689             Object.keys(head.entities).forEach(checkEntityID);
62690             Object.keys(base.entities).forEach(checkEntityID);
62691
62692
62693             _diff.length = function length() {
62694                 return Object.keys(_changes).length;
62695             };
62696
62697
62698             _diff.changes = function changes() {
62699                 return _changes;
62700             };
62701
62702             _diff.didChange = _didChange;
62703
62704
62705             // pass true to include affected relation members
62706             _diff.extantIDs = function extantIDs(includeRelMembers) {
62707                 var result = new Set();
62708                 Object.keys(_changes).forEach(function(id) {
62709                     if (_changes[id].head) {
62710                         result.add(id);
62711                     }
62712
62713                     var h = _changes[id].head;
62714                     var b = _changes[id].base;
62715                     var entity = h || b;
62716
62717                     if (includeRelMembers && entity.type === 'relation') {
62718                         var mh = h ? h.members.map(function(m) { return m.id; }) : [];
62719                         var mb = b ? b.members.map(function(m) { return m.id; }) : [];
62720                         utilArrayUnion(mh, mb).forEach(function(memberID) {
62721                             if (head.hasEntity(memberID)) {
62722                                 result.add(memberID);
62723                             }
62724                         });
62725                     }
62726                 });
62727
62728                 return Array.from(result);
62729             };
62730
62731
62732             _diff.modified = function modified() {
62733                 var result = [];
62734                 Object.values(_changes).forEach(function(change) {
62735                     if (change.base && change.head) {
62736                         result.push(change.head);
62737                     }
62738                 });
62739                 return result;
62740             };
62741
62742
62743             _diff.created = function created() {
62744                 var result = [];
62745                 Object.values(_changes).forEach(function(change) {
62746                     if (!change.base && change.head) {
62747                         result.push(change.head);
62748                     }
62749                 });
62750                 return result;
62751             };
62752
62753
62754             _diff.deleted = function deleted() {
62755                 var result = [];
62756                 Object.values(_changes).forEach(function(change) {
62757                     if (change.base && !change.head) {
62758                         result.push(change.base);
62759                     }
62760                 });
62761                 return result;
62762             };
62763
62764
62765             _diff.summary = function summary() {
62766                 var relevant = {};
62767
62768                 var keys = Object.keys(_changes);
62769                 for (var i = 0; i < keys.length; i++) {
62770                     var change = _changes[keys[i]];
62771
62772                     if (change.head && change.head.geometry(head) !== 'vertex') {
62773                         addEntity(change.head, head, change.base ? 'modified' : 'created');
62774
62775                     } else if (change.base && change.base.geometry(base) !== 'vertex') {
62776                         addEntity(change.base, base, 'deleted');
62777
62778                     } else if (change.base && change.head) { // modified vertex
62779                         var moved    = !fastDeepEqual(change.base.loc,  change.head.loc);
62780                         var retagged = !fastDeepEqual(change.base.tags, change.head.tags);
62781
62782                         if (moved) {
62783                             addParents(change.head);
62784                         }
62785
62786                         if (retagged || (moved && change.head.hasInterestingTags())) {
62787                             addEntity(change.head, head, 'modified');
62788                         }
62789
62790                     } else if (change.head && change.head.hasInterestingTags()) { // created vertex
62791                         addEntity(change.head, head, 'created');
62792
62793                     } else if (change.base && change.base.hasInterestingTags()) { // deleted vertex
62794                         addEntity(change.base, base, 'deleted');
62795                     }
62796                 }
62797
62798                 return Object.values(relevant);
62799
62800
62801                 function addEntity(entity, graph, changeType) {
62802                     relevant[entity.id] = {
62803                         entity: entity,
62804                         graph: graph,
62805                         changeType: changeType
62806                     };
62807                 }
62808
62809                 function addParents(entity) {
62810                     var parents = head.parentWays(entity);
62811                     for (var j = parents.length - 1; j >= 0; j--) {
62812                         var parent = parents[j];
62813                         if (!(parent.id in relevant)) {
62814                             addEntity(parent, head, 'modified');
62815                         }
62816                     }
62817                 }
62818             };
62819
62820
62821             // returns complete set of entities that require a redraw
62822             //  (optionally within given `extent`)
62823             _diff.complete = function complete(extent) {
62824                 var result = {};
62825                 var id, change;
62826
62827                 for (id in _changes) {
62828                     change = _changes[id];
62829
62830                     var h = change.head;
62831                     var b = change.base;
62832                     var entity = h || b;
62833                     var i;
62834
62835                     if (extent &&
62836                         (!h || !h.intersects(extent, head)) &&
62837                         (!b || !b.intersects(extent, base)))
62838                         continue;
62839
62840                     result[id] = h;
62841
62842                     if (entity.type === 'way') {
62843                         var nh = h ? h.nodes : [];
62844                         var nb = b ? b.nodes : [];
62845                         var diff;
62846
62847                         diff = utilArrayDifference(nh, nb);
62848                         for (i = 0; i < diff.length; i++) {
62849                             result[diff[i]] = head.hasEntity(diff[i]);
62850                         }
62851
62852                         diff = utilArrayDifference(nb, nh);
62853                         for (i = 0; i < diff.length; i++) {
62854                             result[diff[i]] = head.hasEntity(diff[i]);
62855                         }
62856                     }
62857
62858                     if (entity.type === 'relation' && entity.isMultipolygon()) {
62859                         var mh = h ? h.members.map(function(m) { return m.id; }) : [];
62860                         var mb = b ? b.members.map(function(m) { return m.id; }) : [];
62861                         var ids = utilArrayUnion(mh, mb);
62862                         for (i = 0; i < ids.length; i++) {
62863                             var member = head.hasEntity(ids[i]);
62864                             if (!member) continue;   // not downloaded
62865                             if (extent && !member.intersects(extent, head)) continue;   // not visible
62866                             result[ids[i]] = member;
62867                         }
62868                     }
62869
62870                     addParents(head.parentWays(entity), result);
62871                     addParents(head.parentRelations(entity), result);
62872                 }
62873
62874                 return result;
62875
62876
62877                 function addParents(parents, result) {
62878                     for (var i = 0; i < parents.length; i++) {
62879                         var parent = parents[i];
62880                         if (parent.id in result) continue;
62881
62882                         result[parent.id] = parent;
62883                         addParents(head.parentRelations(parent), result);
62884                     }
62885                 }
62886             };
62887
62888
62889             return _diff;
62890         }
62891
62892         function coreTree(head) {
62893             var rtree = rbush_1();
62894             var bboxes = {};
62895             var tree = {};
62896
62897
62898             function entityBBox(entity) {
62899                 var bbox = entity.extent(head).bbox();
62900                 bbox.id = entity.id;
62901                 bboxes[entity.id] = bbox;
62902                 return bbox;
62903             }
62904
62905
62906             function updateParents(entity, insertions, memo) {
62907                 head.parentWays(entity).forEach(function(way) {
62908                     if (bboxes[way.id]) {
62909                         rtree.remove(bboxes[way.id]);
62910                         insertions[way.id] = way;
62911                     }
62912                     updateParents(way, insertions, memo);
62913                 });
62914
62915                 head.parentRelations(entity).forEach(function(relation) {
62916                     if (memo[entity.id]) return;
62917                     memo[entity.id] = true;
62918                     if (bboxes[relation.id]) {
62919                         rtree.remove(bboxes[relation.id]);
62920                         insertions[relation.id] = relation;
62921                     }
62922                     updateParents(relation, insertions, memo);
62923                 });
62924             }
62925
62926
62927             tree.rebase = function(entities, force) {
62928                 var insertions = {};
62929
62930                 for (var i = 0; i < entities.length; i++) {
62931                     var entity = entities[i];
62932                     if (!entity.visible) continue;
62933
62934                     if (head.entities.hasOwnProperty(entity.id) || bboxes[entity.id]) {
62935                         if (!force) {
62936                             continue;
62937                         } else if (bboxes[entity.id]) {
62938                             rtree.remove(bboxes[entity.id]);
62939                         }
62940                     }
62941
62942                     insertions[entity.id] = entity;
62943                     updateParents(entity, insertions, {});
62944                 }
62945
62946                 rtree.load(Object.values(insertions).map(entityBBox));
62947
62948                 return tree;
62949             };
62950
62951
62952             tree.intersects = function(extent, graph) {
62953                 if (graph !== head) {
62954                     var diff = coreDifference(head, graph);
62955                     var changed = diff.didChange;
62956
62957                     if (changed.addition || changed.deletion || changed.geometry) {
62958                         var insertions = {};
62959                         head = graph;
62960
62961                         if (changed.deletion) {
62962                             diff.deleted().forEach(function(entity) {
62963                                 rtree.remove(bboxes[entity.id]);
62964                                 delete bboxes[entity.id];
62965                             });
62966                         }
62967
62968                         if (changed.geometry) {
62969                             diff.modified().forEach(function(entity) {
62970                                 rtree.remove(bboxes[entity.id]);
62971                                 insertions[entity.id] = entity;
62972                                 updateParents(entity, insertions, {});
62973                             });
62974                         }
62975
62976                         if (changed.addition) {
62977                             diff.created().forEach(function(entity) {
62978                                 insertions[entity.id] = entity;
62979                             });
62980                         }
62981
62982                         rtree.load(Object.values(insertions).map(entityBBox));
62983                     }
62984                 }
62985
62986                 return rtree.search(extent.bbox())
62987                     .map(function(bbox) { return graph.entity(bbox.id); });
62988             };
62989
62990
62991             return tree;
62992         }
62993
62994         function uiModal(selection, blocking) {
62995             var keybinding = utilKeybinding('modal');
62996             var previous = selection.select('div.modal');
62997             var animate = previous.empty();
62998
62999             previous.transition()
63000                 .duration(200)
63001                 .style('opacity', 0)
63002                 .remove();
63003
63004             var shaded = selection
63005                 .append('div')
63006                 .attr('class', 'shaded')
63007                 .style('opacity', 0);
63008
63009             shaded.close = function() {
63010                 shaded
63011                     .transition()
63012                     .duration(200)
63013                     .style('opacity',0)
63014                     .remove();
63015
63016                 modal
63017                     .transition()
63018                     .duration(200)
63019                     .style('top','0px');
63020
63021                 d3_select(document)
63022                     .call(keybinding.unbind);
63023             };
63024
63025
63026             var modal = shaded
63027                 .append('div')
63028                 .attr('class', 'modal fillL');
63029
63030             if (!blocking) {
63031                 shaded.on('click.remove-modal', function() {
63032                     if (event.target === this) {
63033                         shaded.close();
63034                     }
63035                 });
63036
63037                 modal.append('button')
63038                     .attr('class', 'close')
63039                     .on('click', shaded.close)
63040                     .call(svgIcon('#iD-icon-close'));
63041
63042                 keybinding
63043                     .on('⌫', shaded.close)
63044                     .on('⎋', shaded.close);
63045
63046                 d3_select(document)
63047                     .call(keybinding);
63048             }
63049
63050             modal
63051                 .append('div')
63052                 .attr('class', 'content');
63053
63054             if (animate) {
63055                 shaded.transition().style('opacity', 1);
63056             } else {
63057                 shaded.style('opacity', 1);
63058             }
63059
63060
63061             return shaded;
63062         }
63063
63064         function uiLoading(context) {
63065             var _modalSelection = d3_select(null);
63066             var _message = '';
63067             var _blocking = false;
63068
63069
63070             var loading = function(selection) {
63071                 _modalSelection = uiModal(selection, _blocking);
63072
63073                 var loadertext = _modalSelection.select('.content')
63074                     .classed('loading-modal', true)
63075                     .append('div')
63076                     .attr('class', 'modal-section fillL');
63077
63078                 loadertext
63079                     .append('img')
63080                     .attr('class', 'loader')
63081                     .attr('src', context.imagePath('loader-white.gif'));
63082
63083                 loadertext
63084                     .append('h3')
63085                     .text(_message);
63086
63087                 _modalSelection.select('button.close')
63088                     .attr('class', 'hide');
63089
63090                 return loading;
63091             };
63092
63093
63094             loading.message = function(_) {
63095                 if (!arguments.length) return _message;
63096                 _message = _;
63097                 return loading;
63098             };
63099
63100
63101             loading.blocking = function(_) {
63102                 if (!arguments.length) return _blocking;
63103                 _blocking = _;
63104                 return loading;
63105             };
63106
63107
63108             loading.close = function() {
63109                 _modalSelection.remove();
63110             };
63111
63112
63113             return loading;
63114         }
63115
63116         function coreHistory(context) {
63117             var dispatch$1 = dispatch('change', 'merge', 'restore', 'undone', 'redone');
63118             var lock = utilSessionMutex('lock');
63119             var duration = 150;
63120             var _imageryUsed = [];
63121             var _photoOverlaysUsed = [];
63122             var _checkpoints = {};
63123             var _pausedGraph;
63124             var _stack;
63125             var _index;
63126             var _tree;
63127
63128
63129             // internal _act, accepts list of actions and eased time
63130             function _act(actions, t) {
63131                 actions = Array.prototype.slice.call(actions);
63132
63133                 var annotation;
63134                 if (typeof actions[actions.length - 1] !== 'function') {
63135                     annotation = actions.pop();
63136                 }
63137
63138                 var graph = _stack[_index].graph;
63139                 for (var i = 0; i < actions.length; i++) {
63140                     graph = actions[i](graph, t);
63141                 }
63142
63143                 return {
63144                     graph: graph,
63145                     annotation: annotation,
63146                     imageryUsed: _imageryUsed,
63147                     photoOverlaysUsed: _photoOverlaysUsed,
63148                     transform: context.projection.transform(),
63149                     selectedIDs: context.selectedIDs()
63150                 };
63151             }
63152
63153
63154             // internal _perform with eased time
63155             function _perform(args, t) {
63156                 var previous = _stack[_index].graph;
63157                 _stack = _stack.slice(0, _index + 1);
63158                 var actionResult = _act(args, t);
63159                 _stack.push(actionResult);
63160                 _index++;
63161                 return change(previous);
63162             }
63163
63164
63165             // internal _replace with eased time
63166             function _replace(args, t) {
63167                 var previous = _stack[_index].graph;
63168                 // assert(_index == _stack.length - 1)
63169                 var actionResult = _act(args, t);
63170                 _stack[_index] = actionResult;
63171                 return change(previous);
63172             }
63173
63174
63175             // internal _overwrite with eased time
63176             function _overwrite(args, t) {
63177                 var previous = _stack[_index].graph;
63178                 if (_index > 0) {
63179                     _index--;
63180                     _stack.pop();
63181                 }
63182                 _stack = _stack.slice(0, _index + 1);
63183                 var actionResult = _act(args, t);
63184                 _stack.push(actionResult);
63185                 _index++;
63186                 return change(previous);
63187             }
63188
63189
63190             // determine difference and dispatch a change event
63191             function change(previous) {
63192                 var difference = coreDifference(previous, history.graph());
63193                 if (!_pausedGraph) {
63194                     dispatch$1.call('change', this, difference);
63195                 }
63196                 return difference;
63197             }
63198
63199
63200             // iD uses namespaced keys so multiple installations do not conflict
63201             function getKey(n) {
63202                 return 'iD_' + window.location.origin + '_' + n;
63203             }
63204
63205
63206             var history = {
63207
63208                 graph: function() {
63209                     return _stack[_index].graph;
63210                 },
63211
63212
63213                 tree: function() {
63214                     return _tree;
63215                 },
63216
63217
63218                 base: function() {
63219                     return _stack[0].graph;
63220                 },
63221
63222
63223                 merge: function(entities, extent) {
63224                     var stack = _stack.map(function(state) { return state.graph; });
63225                     _stack[0].graph.rebase(entities, stack, false);
63226                     _tree.rebase(entities, false);
63227
63228                     dispatch$1.call('merge', this, entities);
63229                 },
63230
63231
63232                 perform: function() {
63233                     // complete any transition already in progress
63234                     d3_select(document).interrupt('history.perform');
63235
63236                     var transitionable = false;
63237                     var action0 = arguments[0];
63238
63239                     if (arguments.length === 1 ||
63240                         (arguments.length === 2 && (typeof arguments[1] !== 'function'))) {
63241                         transitionable = !!action0.transitionable;
63242                     }
63243
63244                     if (transitionable) {
63245                         var origArguments = arguments;
63246                         d3_select(document)
63247                             .transition('history.perform')
63248                             .duration(duration)
63249                             .ease(linear$1)
63250                             .tween('history.tween', function() {
63251                                 return function(t) {
63252                                     if (t < 1) _overwrite([action0], t);
63253                                 };
63254                             })
63255                             .on('start', function() {
63256                                 _perform([action0], 0);
63257                             })
63258                             .on('end interrupt', function() {
63259                                 _overwrite(origArguments, 1);
63260                             });
63261
63262                     } else {
63263                         return _perform(arguments);
63264                     }
63265                 },
63266
63267
63268                 replace: function() {
63269                     d3_select(document).interrupt('history.perform');
63270                     return _replace(arguments, 1);
63271                 },
63272
63273
63274                 // Same as calling pop and then perform
63275                 overwrite: function() {
63276                     d3_select(document).interrupt('history.perform');
63277                     return _overwrite(arguments, 1);
63278                 },
63279
63280
63281                 pop: function(n) {
63282                     d3_select(document).interrupt('history.perform');
63283
63284                     var previous = _stack[_index].graph;
63285                     if (isNaN(+n) || +n < 0) {
63286                         n = 1;
63287                     }
63288                     while (n-- > 0 && _index > 0) {
63289                         _index--;
63290                         _stack.pop();
63291                     }
63292                     return change(previous);
63293                 },
63294
63295
63296                 // Back to the previous annotated state or _index = 0.
63297                 undo: function() {
63298                     d3_select(document).interrupt('history.perform');
63299
63300                     var previousStack = _stack[_index];
63301                     var previous = previousStack.graph;
63302                     while (_index > 0) {
63303                         _index--;
63304                         if (_stack[_index].annotation) break;
63305                     }
63306
63307                     dispatch$1.call('undone', this, _stack[_index], previousStack);
63308                     return change(previous);
63309                 },
63310
63311
63312                 // Forward to the next annotated state.
63313                 redo: function() {
63314                     d3_select(document).interrupt('history.perform');
63315
63316                     var previousStack = _stack[_index];
63317                     var previous = previousStack.graph;
63318                     var tryIndex = _index;
63319                     while (tryIndex < _stack.length - 1) {
63320                         tryIndex++;
63321                         if (_stack[tryIndex].annotation) {
63322                             _index = tryIndex;
63323                             dispatch$1.call('redone', this, _stack[_index], previousStack);
63324                             break;
63325                         }
63326                     }
63327
63328                     return change(previous);
63329                 },
63330
63331
63332                 pauseChangeDispatch: function() {
63333                     if (!_pausedGraph) {
63334                         _pausedGraph = _stack[_index].graph;
63335                     }
63336                 },
63337
63338
63339                 resumeChangeDispatch: function() {
63340                     if (_pausedGraph) {
63341                         var previous = _pausedGraph;
63342                         _pausedGraph = null;
63343                         return change(previous);
63344                     }
63345                 },
63346
63347
63348                 undoAnnotation: function() {
63349                     var i = _index;
63350                     while (i >= 0) {
63351                         if (_stack[i].annotation) return _stack[i].annotation;
63352                         i--;
63353                     }
63354                 },
63355
63356
63357                 redoAnnotation: function() {
63358                     var i = _index + 1;
63359                     while (i <= _stack.length - 1) {
63360                         if (_stack[i].annotation) return _stack[i].annotation;
63361                         i++;
63362                     }
63363                 },
63364
63365
63366                 intersects: function(extent) {
63367                     return _tree.intersects(extent, _stack[_index].graph);
63368                 },
63369
63370
63371                 difference: function() {
63372                     var base = _stack[0].graph;
63373                     var head = _stack[_index].graph;
63374                     return coreDifference(base, head);
63375                 },
63376
63377
63378                 changes: function(action) {
63379                     var base = _stack[0].graph;
63380                     var head = _stack[_index].graph;
63381
63382                     if (action) {
63383                         head = action(head);
63384                     }
63385
63386                     var difference = coreDifference(base, head);
63387
63388                     return {
63389                         modified: difference.modified(),
63390                         created: difference.created(),
63391                         deleted: difference.deleted()
63392                     };
63393                 },
63394
63395
63396                 hasChanges: function() {
63397                     return this.difference().length() > 0;
63398                 },
63399
63400
63401                 imageryUsed: function(sources) {
63402                     if (sources) {
63403                         _imageryUsed = sources;
63404                         return history;
63405                     } else {
63406                         var s = new Set();
63407                         _stack.slice(1, _index + 1).forEach(function(state) {
63408                             state.imageryUsed.forEach(function(source) {
63409                                 if (source !== 'Custom') {
63410                                     s.add(source);
63411                                 }
63412                             });
63413                         });
63414                         return Array.from(s);
63415                     }
63416                 },
63417
63418
63419                 photoOverlaysUsed: function(sources) {
63420                     if (sources) {
63421                         _photoOverlaysUsed = sources;
63422                         return history;
63423                     } else {
63424                         var s = new Set();
63425                         _stack.slice(1, _index + 1).forEach(function(state) {
63426                             if (state.photoOverlaysUsed && Array.isArray(state.photoOverlaysUsed)) {
63427                                 state.photoOverlaysUsed.forEach(function(photoOverlay) {
63428                                     s.add(photoOverlay);
63429                                 });
63430                             }
63431                         });
63432                         return Array.from(s);
63433                     }
63434                 },
63435
63436
63437                 // save the current history state
63438                 checkpoint: function(key) {
63439                     _checkpoints[key] = {
63440                         stack: _stack,
63441                         index: _index
63442                     };
63443                     return history;
63444                 },
63445
63446
63447                 // restore history state to a given checkpoint or reset completely
63448                 reset: function(key) {
63449                     if (key !== undefined && _checkpoints.hasOwnProperty(key)) {
63450                         _stack = _checkpoints[key].stack;
63451                         _index = _checkpoints[key].index;
63452                     } else {
63453                         _stack = [{graph: coreGraph()}];
63454                         _index = 0;
63455                         _tree = coreTree(_stack[0].graph);
63456                         _checkpoints = {};
63457                     }
63458                     dispatch$1.call('change');
63459                     return history;
63460                 },
63461
63462
63463                 // `toIntroGraph()` is used to export the intro graph used by the walkthrough.
63464                 //
63465                 // To use it:
63466                 //  1. Start the walkthrough.
63467                 //  2. Get to a "free editing" tutorial step
63468                 //  3. Make your edits to the walkthrough map
63469                 //  4. In your browser dev console run:
63470                 //        `id.history().toIntroGraph()`
63471                 //  5. This outputs stringified JSON to the browser console
63472                 //  6. Copy it to `data/intro_graph.json` and prettify it in your code editor
63473                 toIntroGraph: function() {
63474                     var nextID = { n: 0, r: 0, w: 0 };
63475                     var permIDs = {};
63476                     var graph = this.graph();
63477                     var baseEntities = {};
63478
63479                     // clone base entities..
63480                     Object.values(graph.base().entities).forEach(function(entity) {
63481                         var copy = copyIntroEntity(entity);
63482                         baseEntities[copy.id] = copy;
63483                     });
63484
63485                     // replace base entities with head entities..
63486                     Object.keys(graph.entities).forEach(function(id) {
63487                         var entity = graph.entities[id];
63488                         if (entity) {
63489                             var copy = copyIntroEntity(entity);
63490                             baseEntities[copy.id] = copy;
63491                         } else {
63492                             delete baseEntities[id];
63493                         }
63494                     });
63495
63496                     // swap temporary for permanent ids..
63497                     Object.values(baseEntities).forEach(function(entity) {
63498                         if (Array.isArray(entity.nodes)) {
63499                             entity.nodes = entity.nodes.map(function(node) {
63500                                 return permIDs[node] || node;
63501                             });
63502                         }
63503                         if (Array.isArray(entity.members)) {
63504                             entity.members = entity.members.map(function(member) {
63505                                 member.id = permIDs[member.id] || member.id;
63506                                 return member;
63507                             });
63508                         }
63509                     });
63510
63511                     return JSON.stringify({ dataIntroGraph: baseEntities });
63512
63513
63514                     function copyIntroEntity(source) {
63515                         var copy = utilObjectOmit(source, ['type', 'user', 'v', 'version', 'visible']);
63516
63517                         // Note: the copy is no longer an osmEntity, so it might not have `tags`
63518                         if (copy.tags && !Object.keys(copy.tags)) {
63519                             delete copy.tags;
63520                         }
63521
63522                         if (Array.isArray(copy.loc)) {
63523                             copy.loc[0] = +copy.loc[0].toFixed(6);
63524                             copy.loc[1] = +copy.loc[1].toFixed(6);
63525                         }
63526
63527                         var match = source.id.match(/([nrw])-\d*/);  // temporary id
63528                         if (match !== null) {
63529                             var nrw = match[1];
63530                             var permID;
63531                             do { permID = nrw + (++nextID[nrw]); }
63532                             while (baseEntities.hasOwnProperty(permID));
63533
63534                             copy.id = permIDs[source.id] = permID;
63535                         }
63536                         return copy;
63537                     }
63538                 },
63539
63540
63541                 toJSON: function() {
63542                     if (!this.hasChanges()) return;
63543
63544                     var allEntities = {};
63545                     var baseEntities = {};
63546                     var base = _stack[0];
63547
63548                     var s = _stack.map(function(i) {
63549                         var modified = [];
63550                         var deleted = [];
63551
63552                         Object.keys(i.graph.entities).forEach(function(id) {
63553                             var entity = i.graph.entities[id];
63554                             if (entity) {
63555                                 var key = osmEntity.key(entity);
63556                                 allEntities[key] = entity;
63557                                 modified.push(key);
63558                             } else {
63559                                 deleted.push(id);
63560                             }
63561
63562                             // make sure that the originals of changed or deleted entities get merged
63563                             // into the base of the _stack after restoring the data from JSON.
63564                             if (id in base.graph.entities) {
63565                                 baseEntities[id] = base.graph.entities[id];
63566                             }
63567                             if (entity && entity.nodes) {
63568                                 // get originals of pre-existing child nodes
63569                                 entity.nodes.forEach(function(nodeID) {
63570                                     if (nodeID in base.graph.entities) {
63571                                         baseEntities[nodeID] = base.graph.entities[nodeID];
63572                                     }
63573                                 });
63574                             }
63575                             // get originals of parent entities too
63576                             var baseParents = base.graph._parentWays[id];
63577                             if (baseParents) {
63578                                 baseParents.forEach(function(parentID) {
63579                                     if (parentID in base.graph.entities) {
63580                                         baseEntities[parentID] = base.graph.entities[parentID];
63581                                     }
63582                                 });
63583                             }
63584                         });
63585
63586                         var x = {};
63587
63588                         if (modified.length) x.modified = modified;
63589                         if (deleted.length) x.deleted = deleted;
63590                         if (i.imageryUsed) x.imageryUsed = i.imageryUsed;
63591                         if (i.photoOverlaysUsed) x.photoOverlaysUsed = i.photoOverlaysUsed;
63592                         if (i.annotation) x.annotation = i.annotation;
63593                         if (i.transform) x.transform = i.transform;
63594                         if (i.selectedIDs) x.selectedIDs = i.selectedIDs;
63595
63596                         return x;
63597                     });
63598
63599                     return JSON.stringify({
63600                         version: 3,
63601                         entities: Object.values(allEntities),
63602                         baseEntities: Object.values(baseEntities),
63603                         stack: s,
63604                         nextIDs: osmEntity.id.next,
63605                         index: _index
63606                     });
63607                 },
63608
63609
63610                 fromJSON: function(json, loadChildNodes) {
63611                     var h = JSON.parse(json);
63612                     var loadComplete = true;
63613
63614                     osmEntity.id.next = h.nextIDs;
63615                     _index = h.index;
63616
63617                     if (h.version === 2 || h.version === 3) {
63618                         var allEntities = {};
63619
63620                         h.entities.forEach(function(entity) {
63621                             allEntities[osmEntity.key(entity)] = osmEntity(entity);
63622                         });
63623
63624                         if (h.version === 3) {
63625                             // This merges originals for changed entities into the base of
63626                             // the _stack even if the current _stack doesn't have them (for
63627                             // example when iD has been restarted in a different region)
63628                             var baseEntities = h.baseEntities.map(function(d) { return osmEntity(d); });
63629                             var stack = _stack.map(function(state) { return state.graph; });
63630                             _stack[0].graph.rebase(baseEntities, stack, true);
63631                             _tree.rebase(baseEntities, true);
63632
63633                             // When we restore a modified way, we also need to fetch any missing
63634                             // childnodes that would normally have been downloaded with it.. #2142
63635                             if (loadChildNodes) {
63636                                 var osm = context.connection();
63637                                 var baseWays = baseEntities
63638                                     .filter(function(e) { return e.type === 'way'; });
63639                                 var nodeIDs = baseWays
63640                                     .reduce(function(acc, way) { return utilArrayUnion(acc, way.nodes); }, []);
63641                                 var missing = nodeIDs
63642                                     .filter(function(n) { return !_stack[0].graph.hasEntity(n); });
63643
63644                                 if (missing.length && osm) {
63645                                     loadComplete = false;
63646                                     context.redrawEnable(false);
63647
63648                                     var loading = uiLoading(context).blocking(true);
63649                                     context.container().call(loading);
63650
63651                                     var childNodesLoaded = function(err, result) {
63652                                         if (!err) {
63653                                             var visibleGroups = utilArrayGroupBy(result.data, 'visible');
63654                                             var visibles = visibleGroups.true || [];      // alive nodes
63655                                             var invisibles = visibleGroups.false || [];   // deleted nodes
63656
63657                                             if (visibles.length) {
63658                                                 var visibleIDs = visibles.map(function(entity) { return entity.id; });
63659                                                 var stack = _stack.map(function(state) { return state.graph; });
63660                                                 missing = utilArrayDifference(missing, visibleIDs);
63661                                                 _stack[0].graph.rebase(visibles, stack, true);
63662                                                 _tree.rebase(visibles, true);
63663                                             }
63664
63665                                             // fetch older versions of nodes that were deleted..
63666                                             invisibles.forEach(function(entity) {
63667                                                 osm.loadEntityVersion(entity.id, +entity.version - 1, childNodesLoaded);
63668                                             });
63669                                         }
63670
63671                                         if (err || !missing.length) {
63672                                             loading.close();
63673                                             context.redrawEnable(true);
63674                                             dispatch$1.call('change');
63675                                             dispatch$1.call('restore', this);
63676                                         }
63677                                     };
63678
63679                                     osm.loadMultiple(missing, childNodesLoaded);
63680                                 }
63681                             }
63682                         }
63683
63684                         _stack = h.stack.map(function(d) {
63685                             var entities = {}, entity;
63686
63687                             if (d.modified) {
63688                                 d.modified.forEach(function(key) {
63689                                     entity = allEntities[key];
63690                                     entities[entity.id] = entity;
63691                                 });
63692                             }
63693
63694                             if (d.deleted) {
63695                                 d.deleted.forEach(function(id) {
63696                                     entities[id] = undefined;
63697                                 });
63698                             }
63699
63700                             return {
63701                                 graph: coreGraph(_stack[0].graph).load(entities),
63702                                 annotation: d.annotation,
63703                                 imageryUsed: d.imageryUsed,
63704                                 photoOverlaysUsed: d.photoOverlaysUsed,
63705                                 transform: d.transform,
63706                                 selectedIDs: d.selectedIDs
63707                             };
63708                         });
63709
63710                     } else { // original version
63711                         _stack = h.stack.map(function(d) {
63712                             var entities = {};
63713
63714                             for (var i in d.entities) {
63715                                 var entity = d.entities[i];
63716                                 entities[i] = entity === 'undefined' ? undefined : osmEntity(entity);
63717                             }
63718
63719                             d.graph = coreGraph(_stack[0].graph).load(entities);
63720                             return d;
63721                         });
63722                     }
63723
63724                     var transform = _stack[_index].transform;
63725                     if (transform) {
63726                         context.map().transformEase(transform, 0);   // 0 = immediate, no easing
63727                     }
63728
63729                     if (loadComplete) {
63730                         dispatch$1.call('change');
63731                         dispatch$1.call('restore', this);
63732                     }
63733
63734                     return history;
63735                 },
63736
63737
63738                 save: function() {
63739                     if (lock.locked()) context.storage(getKey('saved_history'), history.toJSON() || null);
63740                     return history;
63741                 },
63742
63743
63744                 clearSaved: function() {
63745                     context.debouncedSave.cancel();
63746                     if (lock.locked()) context.storage(getKey('saved_history'), null);
63747                     return history;
63748                 },
63749
63750
63751                 lock: function() {
63752                     return lock.lock();
63753                 },
63754
63755
63756                 unlock: function() {
63757                     lock.unlock();
63758                 },
63759
63760
63761                 // is iD not open in another window and it detects that
63762                 // there's a history stored in localStorage that's recoverable?
63763                 restorableChanges: function() {
63764                     return lock.locked() && !!context.storage(getKey('saved_history'));
63765                 },
63766
63767
63768                 // load history from a version stored in localStorage
63769                 restore: function() {
63770                     if (!lock.locked()) return;
63771
63772                     var json = context.storage(getKey('saved_history'));
63773                     if (json) history.fromJSON(json, true);
63774                 },
63775
63776
63777                 _getKey: getKey
63778
63779             };
63780
63781
63782             history.reset();
63783
63784             return utilRebind(history, dispatch$1, 'on');
63785         }
63786
63787         /**
63788          * Look for roads that can be connected to other roads with a short extension
63789          */
63790         function validationAlmostJunction(context) {
63791             var type = 'almost_junction';
63792
63793
63794             function isHighway(entity) {
63795                 return entity.type === 'way' &&
63796                     osmRoutableHighwayTagValues[entity.tags.highway];
63797             }
63798
63799             function isTaggedAsNotContinuing(node) {
63800                 return node.tags.noexit === 'yes' ||
63801                     node.tags.amenity === 'parking_entrance' ||
63802                     (node.tags.entrance && node.tags.entrance !== 'no');
63803             }
63804
63805
63806             var validation = function checkAlmostJunction(entity, graph) {
63807                 if (!isHighway(entity)) return [];
63808                 if (entity.isDegenerate()) return [];
63809
63810                 var tree = context.history().tree();
63811                 var issues = [];
63812
63813                 var extendableNodeInfos = findConnectableEndNodesByExtension(entity);
63814                 extendableNodeInfos.forEach(function(extendableNodeInfo) {
63815                     var node = extendableNodeInfo.node;
63816                     var edgeHighway = graph.entity(extendableNodeInfo.wid);
63817
63818                     var fixes = [new validationIssueFix({
63819                         icon: 'iD-icon-abutment',
63820                         title: t('issues.fix.connect_features.title'),
63821                         onClick: function(context) {
63822                             var endNodeId = this.issue.entityIds[1];
63823                             var endNode = context.entity(endNodeId);
63824                             var targetEdge = this.issue.data.edge;
63825                             var crossLoc = this.issue.data.cross_loc;
63826                             var edgeNodes = [context.entity(targetEdge[0]), context.entity(targetEdge[1])];
63827                             var closestNodeInfo = geoSphericalClosestNode(edgeNodes, crossLoc);
63828
63829                             var annotation = t('issues.fix.connect_almost_junction.annotation');
63830                             // already a point nearby, just connect to that
63831                             if (closestNodeInfo.distance < 0.75) {
63832                                 context.perform(
63833                                     actionMergeNodes([closestNodeInfo.node.id, endNode.id], closestNodeInfo.node.loc),
63834                                     annotation
63835                                 );
63836                             // else add the end node to the edge way
63837                             } else {
63838                                 context.perform(
63839                                     actionAddMidpoint({loc: crossLoc, edge: targetEdge}, endNode),
63840                                     annotation
63841                                 );
63842                             }
63843                         }
63844                     })];
63845
63846                     if (Object.keys(node.tags).length === 0) {
63847                         // node has no tags, suggest noexit fix
63848                         fixes.push(new validationIssueFix({
63849                             icon: 'maki-barrier',
63850                             title: t('issues.fix.tag_as_disconnected.title'),
63851                             onClick: function(context) {
63852                                 var nodeID = this.issue.entityIds[1];
63853                                 context.perform(
63854                                     actionChangeTags(nodeID, { noexit: 'yes' }),
63855                                     t('issues.fix.tag_as_disconnected.annotation')
63856                                 );
63857                             }
63858                         }));
63859                     }
63860
63861                     issues.push(new validationIssue({
63862                         type: type,
63863                         severity: 'warning',
63864                         message: function(context) {
63865                             var entity1 = context.hasEntity(this.entityIds[0]);
63866                             if (this.entityIds[0] === this.entityIds[2]) {
63867                                 return entity1 ? t('issues.almost_junction.self.message', {
63868                                     feature: utilDisplayLabel(entity1, context)
63869                                 }) : '';
63870                             } else {
63871                                 var entity2 = context.hasEntity(this.entityIds[2]);
63872                                 return (entity1 && entity2) ? t('issues.almost_junction.message', {
63873                                     feature: utilDisplayLabel(entity1, context),
63874                                     feature2: utilDisplayLabel(entity2, context)
63875                                 }) : '';
63876                             }
63877                         },
63878                         reference: showReference,
63879                         entityIds: [entity.id, node.id, edgeHighway.id],
63880                         loc: extendableNodeInfo.node.loc,
63881                         hash: JSON.stringify(extendableNodeInfo.node.loc),
63882                         data: {
63883                             edge: extendableNodeInfo.edge,
63884                             cross_loc: extendableNodeInfo.cross_loc
63885                         },
63886                         fixes: fixes
63887                     }));
63888                 });
63889
63890                 return issues;
63891
63892
63893                 function showReference(selection) {
63894                     selection.selectAll('.issue-reference')
63895                         .data([0])
63896                         .enter()
63897                         .append('div')
63898                         .attr('class', 'issue-reference')
63899                         .text(t('issues.almost_junction.highway-highway.reference'));
63900                 }
63901
63902
63903                 function isExtendableCandidate(node, way) {
63904                     // can not accurately test vertices on tiles not downloaded from osm - #5938
63905                     var osm = services$1.osm;
63906                     if (osm && !osm.isDataLoaded(node.loc)) {
63907                         return false;
63908                     }
63909                     if (isTaggedAsNotContinuing(node) || graph.parentWays(node).length !== 1) {
63910                         return false;
63911                     }
63912
63913                     var occurences = 0;
63914                     for (var index in way.nodes) {
63915                         if (way.nodes[index] === node.id) {
63916                             occurences += 1;
63917                             if (occurences > 1) {
63918                                 return false;
63919                             }
63920                         }
63921                     }
63922                     return true;
63923                 }
63924
63925
63926                 function findConnectableEndNodesByExtension(way) {
63927                     var results = [];
63928                     if (way.isClosed()) return results;
63929
63930                     var testNodes;
63931                     var indices = [0, way.nodes.length - 1];
63932                     indices.forEach(function(nodeIndex) {
63933                         var nodeID = way.nodes[nodeIndex];
63934                         var node = graph.entity(nodeID);
63935
63936                         if (!isExtendableCandidate(node, way)) return;
63937
63938                         var connectionInfo = canConnectByExtend(way, nodeIndex);
63939                         if (!connectionInfo) return;
63940
63941                         testNodes = graph.childNodes(way).slice();   // shallow copy
63942                         testNodes[nodeIndex] = testNodes[nodeIndex].move(connectionInfo.cross_loc);
63943
63944                         // don't flag issue if connecting the ways would cause self-intersection
63945                         if (geoHasSelfIntersections(testNodes, nodeID)) return;
63946
63947                         results.push(connectionInfo);
63948                     });
63949
63950                     return results;
63951                 }
63952
63953                 function hasTag(tags, key) {
63954                     return tags[key] !== undefined && tags[key] !== 'no';
63955                 }
63956
63957                 function canConnectWays(way, way2) {
63958
63959                     // allow self-connections
63960                     if (way.id === way2.id) return true;
63961
63962                     // if one is bridge or tunnel, both must be bridge or tunnel
63963                     if ((hasTag(way.tags, 'bridge') || hasTag(way2.tags, 'bridge')) &&
63964                         !(hasTag(way.tags, 'bridge') && hasTag(way2.tags, 'bridge'))) return false;
63965                     if ((hasTag(way.tags, 'tunnel') || hasTag(way2.tags, 'tunnel')) &&
63966                         !(hasTag(way.tags, 'tunnel') && hasTag(way2.tags, 'tunnel'))) return false;
63967
63968                     // must have equivalent layers and levels
63969                     var layer1 = way.tags.layer || '0',
63970                         layer2 = way2.tags.layer || '0';
63971                     if (layer1 !== layer2) return false;
63972
63973                     var level1 = way.tags.level || '0',
63974                         level2 = way2.tags.level || '0';
63975                     if (level1 !== level2) return false;
63976
63977                     return true;
63978                 }
63979
63980
63981                 function canConnectByExtend(way, endNodeIdx) {
63982                     var EXTEND_TH_METERS = 5;
63983                     var tipNid = way.nodes[endNodeIdx];  // the 'tip' node for extension point
63984                     var midNid = endNodeIdx === 0 ? way.nodes[1] : way.nodes[way.nodes.length - 2];  // the other node of the edge
63985                     var tipNode = graph.entity(tipNid);
63986                     var midNode = graph.entity(midNid);
63987                     var lon = tipNode.loc[0];
63988                     var lat = tipNode.loc[1];
63989                     var lon_range = geoMetersToLon(EXTEND_TH_METERS, lat) / 2;
63990                     var lat_range = geoMetersToLat(EXTEND_TH_METERS) / 2;
63991                     var queryExtent = geoExtent([
63992                         [lon - lon_range, lat - lat_range],
63993                         [lon + lon_range, lat + lat_range]
63994                     ]);
63995
63996                     // first, extend the edge of [midNode -> tipNode] by EXTEND_TH_METERS and find the "extended tip" location
63997                     var edgeLen = geoSphericalDistance(midNode.loc, tipNode.loc);
63998                     var t = EXTEND_TH_METERS / edgeLen + 1.0;
63999                     var extTipLoc = geoVecInterp(midNode.loc, tipNode.loc, t);
64000
64001                     // then, check if the extension part [tipNode.loc -> extTipLoc] intersects any other ways
64002                     var intersected = tree.intersects(queryExtent, graph);
64003                     for (var i = 0; i < intersected.length; i++) {
64004                         var way2 = intersected[i];
64005
64006                         if (!isHighway(way2)) continue;
64007
64008                         if (!canConnectWays(way, way2)) continue;
64009
64010                         for (var j = 0; j < way2.nodes.length - 1; j++) {
64011                             var nAid = way2.nodes[j],
64012                                 nBid = way2.nodes[j + 1];
64013
64014                             if (nAid === tipNid || nBid === tipNid) continue;
64015
64016                             var nA = graph.entity(nAid),
64017                                 nB = graph.entity(nBid);
64018                             var crossLoc = geoLineIntersection([tipNode.loc, extTipLoc], [nA.loc, nB.loc]);
64019                             if (crossLoc) {
64020                                 return {
64021                                     node: tipNode,
64022                                     wid: way2.id,
64023                                     edge: [nA.id, nB.id],
64024                                     cross_loc: crossLoc
64025                                 };
64026                             }
64027                         }
64028                     }
64029                     return null;
64030                 }
64031             };
64032
64033             validation.type = type;
64034
64035             return validation;
64036         }
64037
64038         function validationCloseNodes(context) {
64039             var type = 'close_nodes';
64040
64041             var pointThresholdMeters = 0.2;
64042
64043             var defaultWayThresholdMeters = 0.2;
64044             // expect some features to be mapped with higher levels of detail
64045             var indoorThresholdMeters = 0.01;
64046             var buildingThresholdMeters = 0.05;
64047             var pathThresholdMeters = 0.1;
64048
64049             var validation = function(entity, graph) {
64050                 if (entity.type === 'node') {
64051                     return getIssuesForNode(entity);
64052                 } else if (entity.type === 'way') {
64053                     return getIssuesForWay(entity);
64054                 }
64055                 return [];
64056
64057                 function featureTypeForWay(way) {
64058
64059                     if (way.tags.boundary && way.tags.boundary !== 'no') return 'boundary';
64060                     if (way.tags.indoor && way.tags.indoor !== 'no') return 'indoor';
64061                     if ((way.tags.building && way.tags.building !== 'no') ||
64062                         (way.tags['building:part'] && way.tags['building:part'] !== 'no')) return 'building';
64063                     if (osmPathHighwayTagValues[way.tags.highway]) return 'path';
64064
64065                     var parentRelations = graph.parentRelations(way);
64066                     for (var i in parentRelations) {
64067                         var relation = parentRelations[i];
64068
64069                         if (relation.tags.type === 'boundary') return 'boundary';
64070
64071                         if (relation.isMultipolygon()) {
64072                             if (relation.tags.indoor && relation.tags.indoor !== 'no') return 'indoor';
64073                             if ((relation.tags.building && relation.tags.building !== 'no') ||
64074                                 (relation.tags['building:part'] && relation.tags['building:part'] !== 'no')) return 'building';
64075                         }
64076                     }
64077
64078                     return 'other';
64079                 }
64080
64081                 function shouldCheckWay(way) {
64082
64083                     // don't flag issues where merging would create degenerate ways
64084                     if (way.nodes.length <= 2 ||
64085                         (way.isClosed() && way.nodes.length <= 4)) return false;
64086
64087                     var featureType = featureTypeForWay(way);
64088                     if (featureType === 'boundary') return false;
64089
64090                     var bbox = way.extent(graph).bbox();
64091                     var hypotenuseMeters = geoSphericalDistance([bbox.minX, bbox.minY], [bbox.maxX, bbox.maxY]);
64092                     // don't flag close nodes in very small ways
64093                     if (hypotenuseMeters < 1.5) return false;
64094
64095                     return true;
64096                 }
64097
64098                 function getIssuesForWay(way) {
64099                     if (!shouldCheckWay(way)) return [];
64100
64101                     var issues = [],
64102                         nodes = graph.childNodes(way);
64103                     for (var i = 0; i < nodes.length - 1; i++) {
64104                         var node1 = nodes[i];
64105                         var node2 = nodes[i+1];
64106
64107                         var issue = getWayIssueIfAny(node1, node2, way);
64108                         if (issue) issues.push(issue);
64109                     }
64110                     return issues;
64111                 }
64112
64113                 function getIssuesForVertex(node, parentWays) {
64114                     var issues = [];
64115
64116                     function checkForCloseness(node1, node2, way) {
64117                         var issue = getWayIssueIfAny(node1, node2, way);
64118                         if (issue) issues.push(issue);
64119                     }
64120
64121                     for (var i = 0; i < parentWays.length; i++) {
64122                         var parentWay = parentWays[i];
64123
64124                         if (!shouldCheckWay(parentWay)) continue;
64125
64126                         var lastIndex = parentWay.nodes.length - 1;
64127                         for (var j = 0; j < parentWay.nodes.length; j++) {
64128                             if (j !== 0) {
64129                                 if (parentWay.nodes[j-1] === node.id) {
64130                                     checkForCloseness(node, graph.entity(parentWay.nodes[j]), parentWay);
64131                                 }
64132                             }
64133                             if (j !== lastIndex) {
64134                                 if (parentWay.nodes[j+1] === node.id) {
64135                                     checkForCloseness(graph.entity(parentWay.nodes[j]), node, parentWay);
64136                                 }
64137                             }
64138                         }
64139                     }
64140                     return issues;
64141                 }
64142
64143                 function getIssuesForDetachedPoint(node) {
64144
64145                     var issues = [];
64146
64147                     var lon = node.loc[0];
64148                     var lat = node.loc[1];
64149                     var lon_range = geoMetersToLon(pointThresholdMeters, lat) / 2;
64150                     var lat_range = geoMetersToLat(pointThresholdMeters) / 2;
64151                     var queryExtent = geoExtent([
64152                         [lon - lon_range, lat - lat_range],
64153                         [lon + lon_range, lat + lat_range]
64154                     ]);
64155
64156                     var intersected = context.history().tree().intersects(queryExtent, graph);
64157                     for (var j = 0; j < intersected.length; j++) {
64158                         var nearby = intersected[j];
64159
64160                         if (nearby.id === node.id) continue;
64161                         if (nearby.type !== 'node' || nearby.geometry(graph) !== 'point') continue;
64162
64163                         if (nearby.loc === node.loc ||
64164                             geoSphericalDistance(node.loc, nearby.loc) < pointThresholdMeters) {
64165
64166                             issues.push(new validationIssue({
64167                                 type: type,
64168                                 severity: 'warning',
64169                                 message: function(context) {
64170                                     var entity = context.hasEntity(this.entityIds[0]),
64171                                         entity2 = context.hasEntity(this.entityIds[1]);
64172                                     return (entity && entity2) ? t('issues.close_nodes.detached.message', {
64173                                         feature: utilDisplayLabel(entity, context),
64174                                         feature2: utilDisplayLabel(entity2, context)
64175                                     }) : '';
64176                                 },
64177                                 reference: showReference,
64178                                 entityIds: [node.id, nearby.id],
64179                                 fixes: [
64180                                     new validationIssueFix({
64181                                         icon: 'iD-operation-disconnect',
64182                                         title: t('issues.fix.move_points_apart.title')
64183                                     })
64184                                 ]
64185                             }));
64186                         }
64187                     }
64188
64189                     return issues;
64190
64191                     function showReference(selection) {
64192                         var referenceText = t('issues.close_nodes.detached.reference');
64193                         selection.selectAll('.issue-reference')
64194                             .data([0])
64195                             .enter()
64196                             .append('div')
64197                             .attr('class', 'issue-reference')
64198                             .text(referenceText);
64199                     }
64200                 }
64201
64202                 function getIssuesForNode(node) {
64203                     var parentWays = graph.parentWays(node);
64204                     if (parentWays.length) {
64205                         return getIssuesForVertex(node, parentWays);
64206                     } else {
64207                         return getIssuesForDetachedPoint(node);
64208                     }
64209                 }
64210
64211                 function getWayIssueIfAny(node1, node2, way) {
64212                     if (node1.id === node2.id ||
64213                         (node1.hasInterestingTags() && node2.hasInterestingTags())) {
64214                         return null;
64215                     }
64216
64217                     if (node1.loc !== node2.loc) {
64218
64219                         var featureType = featureTypeForWay(way);
64220                         var threshold = defaultWayThresholdMeters;
64221                         if (featureType === 'indoor') threshold = indoorThresholdMeters;
64222                         else if (featureType === 'building') threshold = buildingThresholdMeters;
64223                         else if (featureType === 'path') threshold = pathThresholdMeters;
64224
64225                         var distance = geoSphericalDistance(node1.loc, node2.loc);
64226                         if (distance > threshold) return null;
64227                     }
64228
64229                     return new validationIssue({
64230                         type: type,
64231                         severity: 'warning',
64232                         message: function(context) {
64233                             var entity = context.hasEntity(this.entityIds[0]);
64234                             return entity ? t('issues.close_nodes.message', { way: utilDisplayLabel(entity, context) }) : '';
64235                         },
64236                         reference: showReference,
64237                         entityIds: [way.id, node1.id, node2.id],
64238                         loc: node1.loc,
64239                         fixes: [
64240                             new validationIssueFix({
64241                                 icon: 'iD-icon-plus',
64242                                 title: t('issues.fix.merge_points.title'),
64243                                 onClick: function(context) {
64244                                     var entityIds = this.issue.entityIds;
64245                                     var action = actionMergeNodes([entityIds[1], entityIds[2]]);
64246                                     context.perform(action, t('issues.fix.merge_close_vertices.annotation'));
64247                                 }
64248                             }),
64249                             new validationIssueFix({
64250                                 icon: 'iD-operation-disconnect',
64251                                 title: t('issues.fix.move_points_apart.title')
64252                             })
64253                         ]
64254                     });
64255
64256                     function showReference(selection) {
64257                         var referenceText = t('issues.close_nodes.reference');
64258                         selection.selectAll('.issue-reference')
64259                             .data([0])
64260                             .enter()
64261                             .append('div')
64262                             .attr('class', 'issue-reference')
64263                             .text(referenceText);
64264                     }
64265                 }
64266
64267             };
64268
64269
64270             validation.type = type;
64271
64272             return validation;
64273         }
64274
64275         function validationCrossingWays(context) {
64276             var type = 'crossing_ways';
64277
64278             /*
64279             Avoid duplicate work by cacheing issues. The same issues live under two paths.
64280             {
64281                 w-123: {
64282                     w-456: [{issue1}, {issue2}…]
64283                 },
64284                 w-456: {
64285                     w-123: [{issue1}, {issue2}…]
64286                 }
64287             }
64288             */
64289             var _issueCache = {};
64290
64291             // returns the way or its parent relation, whichever has a useful feature type
64292             function getFeatureWithFeatureTypeTagsForWay(way, graph) {
64293                 if (getFeatureTypeForTags(way.tags) === null) {
64294                     // if the way doesn't match a feature type, check its parent relations
64295                     var parentRels = graph.parentRelations(way);
64296                     for (var i = 0; i < parentRels.length; i++) {
64297                         var rel = parentRels[i];
64298                         if (getFeatureTypeForTags(rel.tags) !== null) {
64299                             return rel;
64300                         }
64301                     }
64302                 }
64303                 return way;
64304             }
64305
64306
64307             function hasTag(tags, key) {
64308                 return tags[key] !== undefined && tags[key] !== 'no';
64309             }
64310
64311             function tagsImplyIndoors(tags) {
64312                 return hasTag(tags, 'level') || tags.highway === 'corridor';
64313             }
64314
64315             function allowsStructures(featureType) {
64316                 return allowsBridge(featureType) || allowsTunnel(featureType);
64317             }
64318             function allowsBridge(featureType) {
64319                 return featureType === 'highway' || featureType === 'railway' || featureType === 'waterway';
64320             }
64321             function allowsTunnel(featureType) {
64322                 return featureType === 'highway' || featureType === 'railway' || featureType === 'waterway';
64323             }
64324             function canCover(featureType) {
64325                 return featureType === 'building';
64326             }
64327
64328
64329             function getFeatureTypeForCrossingCheck(way, graph) {
64330                 var tags = getFeatureWithFeatureTypeTagsForWay(way, graph).tags;
64331                 return getFeatureTypeForTags(tags);
64332             }
64333
64334             // blacklist
64335             var ignoredBuildings = {
64336                 demolished: true, dismantled: true, proposed: true, razed: true
64337             };
64338
64339
64340             function getFeatureTypeForTags(tags) {
64341                 if (hasTag(tags, 'building') && !ignoredBuildings[tags.building]) return 'building';
64342
64343                 // don't check non-building areas
64344                 if (hasTag(tags, 'area')) return null;
64345
64346                 if (hasTag(tags, 'highway') && osmRoutableHighwayTagValues[tags.highway]) return 'highway';
64347                 if (hasTag(tags, 'railway') && osmRailwayTrackTagValues[tags.railway]) return 'railway';
64348                 if (hasTag(tags, 'waterway') && osmFlowingWaterwayTagValues[tags.waterway]) return 'waterway';
64349
64350                 return null;
64351             }
64352
64353
64354             function isLegitCrossing(way1, featureType1, way2, featureType2) {
64355                 var tags1 = way1.tags;
64356                 var tags2 = way2.tags;
64357
64358                 // assume 0 by default
64359                 var level1 = tags1.level || '0';
64360                 var level2 = tags2.level || '0';
64361
64362                 if (tagsImplyIndoors(tags1) && tagsImplyIndoors(tags2) && level1 !== level2) {
64363                     // assume features don't interact if they're indoor on different levels
64364                     return true;
64365                 }
64366
64367                 // assume 0 by default; don't use way.layer() since we account for structures here
64368                 var layer1 = tags1.layer || '0';
64369                 var layer2 = tags2.layer || '0';
64370
64371                 if (allowsBridge(featureType1) && allowsBridge(featureType2)) {
64372                     if (hasTag(tags1, 'bridge') && !hasTag(tags2, 'bridge')) return true;
64373                     if (!hasTag(tags1, 'bridge') && hasTag(tags2, 'bridge')) return true;
64374                     // crossing bridges must use different layers
64375                     if (hasTag(tags1, 'bridge') && hasTag(tags2, 'bridge') && layer1 !== layer2) return true;
64376                 } else if (allowsBridge(featureType1) && hasTag(tags1, 'bridge')) return true;
64377                 else if (allowsBridge(featureType2) && hasTag(tags2, 'bridge')) return true;
64378
64379                 if (allowsTunnel(featureType1) && allowsTunnel(featureType2)) {
64380                     if (hasTag(tags1, 'tunnel') && !hasTag(tags2, 'tunnel')) return true;
64381                     if (!hasTag(tags1, 'tunnel') && hasTag(tags2, 'tunnel')) return true;
64382                     // crossing tunnels must use different layers
64383                     if (hasTag(tags1, 'tunnel') && hasTag(tags2, 'tunnel') && layer1 !== layer2) return true;
64384                 } else if (allowsTunnel(featureType1) && hasTag(tags1, 'tunnel')) return true;
64385                 else if (allowsTunnel(featureType2) && hasTag(tags2, 'tunnel')) return true;
64386
64387                 if (canCover(featureType1) && canCover(featureType2)) {
64388                     if (hasTag(tags1, 'covered') && !hasTag(tags2, 'covered')) return true;
64389                     if (!hasTag(tags1, 'covered') && hasTag(tags2, 'covered')) return true;
64390                     // crossing covered features that can themselves cover must use different layers
64391                     if (hasTag(tags1, 'covered') && hasTag(tags2, 'covered') && layer1 !== layer2) return true;
64392                 } else if (canCover(featureType1) && hasTag(tags2, 'covered')) return true;
64393                 else if (canCover(featureType2) && hasTag(tags1, 'covered')) return true;
64394
64395                 // don't flag crossing waterways and pier/highways
64396                 if (featureType1 === 'waterway' && featureType2 === 'highway' && tags2.man_made === 'pier') return true;
64397                 if (featureType2 === 'waterway' && featureType1 === 'highway' && tags1.man_made === 'pier') return true;
64398
64399                 if (!allowsStructures(featureType1) && !allowsStructures(featureType2)) {
64400                     // if no structures are applicable, the layers must be different
64401                     if (layer1 !== layer2) return true;
64402                 }
64403                 return false;
64404             }
64405
64406
64407             // highway values for which we shouldn't recommend connecting to waterways
64408             var highwaysDisallowingFords = {
64409                 motorway: true, motorway_link: true, trunk: true, trunk_link: true,
64410                 primary: true, primary_link: true, secondary: true, secondary_link: true
64411             };
64412             var nonCrossingHighways = { track: true };
64413
64414             function tagsForConnectionNodeIfAllowed(entity1, entity2) {
64415                 var featureType1 = getFeatureTypeForTags(entity1.tags);
64416                 var featureType2 = getFeatureTypeForTags(entity2.tags);
64417                 if (featureType1 === featureType2) {
64418                     if (featureType1 === 'highway') {
64419                         var entity1IsPath = osmPathHighwayTagValues[entity1.tags.highway];
64420                         var entity2IsPath = osmPathHighwayTagValues[entity2.tags.highway];
64421                         if ((entity1IsPath || entity2IsPath) && entity1IsPath !== entity2IsPath) {
64422                             // one feature is a path but not both
64423
64424                             var roadFeature = entity1IsPath ? entity2 : entity1;
64425                             if (nonCrossingHighways[roadFeature.tags.highway]) {
64426                                 // don't mark path connections with certain roads as crossings
64427                                 return {};
64428                             }
64429                             var pathFeature = entity1IsPath ? entity1 : entity2;
64430                             if (['marked', 'unmarked'].indexOf(pathFeature.tags.crossing) !== -1) {
64431                                 // if the path is a crossing, match the crossing type
64432                                 return { highway: 'crossing', crossing: pathFeature.tags.crossing };
64433                             }
64434                             // don't add a `crossing` subtag to ambiguous crossings
64435                             return { highway: 'crossing' };
64436                         }
64437                         return {};
64438                     }
64439                     if (featureType1 === 'waterway') return {};
64440                     if (featureType1 === 'railway') return {};
64441
64442                 } else {
64443                     var featureTypes = [featureType1, featureType2];
64444                     if (featureTypes.indexOf('highway') !== -1) {
64445                         if (featureTypes.indexOf('railway') !== -1) {
64446                             if (osmPathHighwayTagValues[entity1.tags.highway] ||
64447                                 osmPathHighwayTagValues[entity2.tags.highway]) {
64448                                 // path-rail connections use this tag
64449                                 return { railway: 'crossing' };
64450                             } else {
64451                                 // road-rail connections use this tag
64452                                 return { railway: 'level_crossing' };
64453                             }
64454                         }
64455
64456                         if (featureTypes.indexOf('waterway') !== -1) {
64457                             // do not allow fords on structures
64458                             if (hasTag(entity1.tags, 'tunnel') && hasTag(entity2.tags, 'tunnel')) return null;
64459                             if (hasTag(entity1.tags, 'bridge') && hasTag(entity2.tags, 'bridge')) return null;
64460
64461                             if (highwaysDisallowingFords[entity1.tags.highway] ||
64462                                 highwaysDisallowingFords[entity2.tags.highway]) {
64463                                 // do not allow fords on major highways
64464                                 return null;
64465                             }
64466                             return { ford: 'yes' };
64467                         }
64468                     }
64469                 }
64470                 return null;
64471             }
64472
64473
64474             function findCrossingsByWay(way1, graph, tree) {
64475                 var edgeCrossInfos = [];
64476                 if (way1.type !== 'way') return edgeCrossInfos;
64477
64478                 var way1FeatureType = getFeatureTypeForCrossingCheck(way1, graph);
64479                 if (way1FeatureType === null) return edgeCrossInfos;
64480
64481                 var checkedSingleCrossingWays = {};
64482
64483                 // declare vars ahead of time to reduce garbage collection
64484                 var i, j, nodeIndex;
64485                 var extent;
64486                 var n1, n2, nA, nB;
64487                 var segment1, segment2;
64488                 var oneOnly;
64489                 var intersected, way2, way2FeatureType, way2Nodes;
64490                 var way1Nodes = graph.childNodes(way1);
64491                 var comparedWays = {};
64492                 for (i = 0; i < way1Nodes.length - 1; i++) {
64493                     n1 = way1Nodes[i];
64494                     n2 = way1Nodes[i + 1];
64495                     extent = geoExtent([
64496                         [
64497                             Math.min(n1.loc[0], n2.loc[0]),
64498                             Math.min(n1.loc[1], n2.loc[1])
64499                         ],
64500                         [
64501                             Math.max(n1.loc[0], n2.loc[0]),
64502                             Math.max(n1.loc[1], n2.loc[1])
64503                         ]
64504                     ]);
64505
64506                     intersected = tree.intersects(extent, graph);
64507                     for (j = 0; j < intersected.length; j++) {
64508                         way2 = intersected[j];
64509
64510                         if (way2.type !== 'way') continue;
64511
64512                         // don't check for self-intersection in this validation
64513                         if (way2.id === way1.id) continue;
64514
64515                         // skip if this way was already checked and only one issue is needed
64516                         if (checkedSingleCrossingWays[way2.id]) continue;
64517
64518                         // don't re-check previously checked features
64519                         if (_issueCache[way1.id] && _issueCache[way1.id][way2.id]) continue;
64520
64521                         // mark this way as checked even if there are no crossings
64522                         comparedWays[way2.id] = true;
64523
64524                         // only check crossing highway, waterway, building, and railway
64525                         way2FeatureType = getFeatureTypeForCrossingCheck(way2, graph);
64526                         if (way2FeatureType === null ||
64527                             isLegitCrossing(way1, way1FeatureType, way2, way2FeatureType)) {
64528                             continue;
64529                         }
64530
64531                         // create only one issue for building crossings
64532                         oneOnly = way1FeatureType === 'building' || way2FeatureType === 'building';
64533                         segment1 = [n1.loc, n2.loc];
64534
64535                         way2Nodes = graph.childNodes(way2);
64536                         for (nodeIndex = 0; nodeIndex < way2Nodes.length - 1; nodeIndex++) {
64537                             nA = way2Nodes[nodeIndex];
64538                             nB = way2Nodes[nodeIndex + 1];
64539                             if (nA.id === n1.id || nA.id === n2.id ||
64540                                 nB.id === n1.id || nB.id === n2.id) {
64541                                 // n1 or n2 is a connection node; skip
64542                                 continue;
64543                             }
64544                             segment2 = [nA.loc, nB.loc];
64545                             var point = geoLineIntersection(segment1, segment2);
64546                             if (point) {
64547                                 edgeCrossInfos.push({
64548                                     ways: [way1, way2],
64549                                     featureTypes: [way1FeatureType, way2FeatureType],
64550                                     edges: [[n1.id, n2.id], [nA.id, nB.id]],
64551                                     crossPoint: point
64552                                 });
64553                                 if (oneOnly) {
64554                                     checkedSingleCrossingWays[way2.id] = true;
64555                                     break;
64556                                 }
64557                             }
64558                         }
64559                     }
64560                 }
64561                 for (var way2ID in comparedWays) {
64562                     if (!_issueCache[way1.id]) _issueCache[way1.id] = {};
64563                     if (!_issueCache[way1.id][way2ID]) _issueCache[way1.id][way2ID] = [];
64564                     if (!_issueCache[way2ID]) _issueCache[way2ID] = {};
64565                     if (!_issueCache[way2ID][way1.id]) _issueCache[way2ID][way1.id] = [];
64566                 }
64567                 return edgeCrossInfos;
64568             }
64569
64570
64571             function waysToCheck(entity, graph) {
64572                 if (!getFeatureTypeForTags(entity.tags)) {
64573                     return [];
64574                 }
64575                 if (entity.type === 'way') {
64576                     return [entity];
64577                 } else if (entity.type === 'relation' &&
64578                     entity.isMultipolygon() &&
64579                     // only check multipolygons if they are buildings
64580                     hasTag(entity.tags, 'building')) {
64581                     return entity.members.reduce(function(array, member) {
64582                         if (member.type === 'way' &&
64583                             //(member.role === 'outer' || member.role === 'inner') &&
64584                             graph.hasEntity(member.id)) {
64585                             var entity = graph.entity(member.id);
64586                             array.push(entity);
64587                         }
64588                         return array;
64589                     }, []);
64590                 }
64591                 return [];
64592             }
64593
64594
64595             var validation = function checkCrossingWays(entity, graph) {
64596
64597                 var tree = context.history().tree();
64598
64599                 var ways = waysToCheck(entity, graph);
64600
64601                 var issues = [];
64602                 // declare these here to reduce garbage collection
64603                 var wayIndex, crossingIndex, key, crossings, crossing, issue;
64604                 for (wayIndex in ways) {
64605                     var way = ways[wayIndex];
64606                     crossings = findCrossingsByWay(way, graph, tree);
64607                     for (crossingIndex in crossings) {
64608                         crossing = crossings[crossingIndex];
64609                         var way2 = crossing.ways[1];
64610                         issue = createIssue(crossing, graph);
64611                         // cache the issues for each way
64612                         _issueCache[way.id][way2.id].push(issue);
64613                         _issueCache[way2.id][way.id].push(issue);
64614                     }
64615                     for (key in _issueCache[way.id]) {
64616                         issues = issues.concat(_issueCache[way.id][key]);
64617                     }
64618                 }
64619                 return issues;
64620             };
64621
64622
64623             function createIssue(crossing, graph) {
64624
64625                 // use the entities with the tags that define the feature type
64626                 var entities = crossing.ways.sort(function(entity1, entity2) {
64627                     var type1 = getFeatureTypeForCrossingCheck(entity1, graph);
64628                     var type2 = getFeatureTypeForCrossingCheck(entity2, graph);
64629                     if (type1 === type2) {
64630                         return utilDisplayLabel(entity1, context) > utilDisplayLabel(entity2, context);
64631                     } else if (type1 === 'waterway') {
64632                         return true;
64633                     } else if (type2 === 'waterway') {
64634                         return false;
64635                     }
64636                     return type1 < type2;
64637                 });
64638                 entities = entities.map(function(way) {
64639                     return getFeatureWithFeatureTypeTagsForWay(way, graph);
64640                 });
64641
64642                 var connectionTags = tagsForConnectionNodeIfAllowed(entities[0], entities[1]);
64643
64644                 var featureType1 = crossing.featureTypes[0];
64645                 var featureType2 = crossing.featureTypes[1];
64646
64647                 var isCrossingIndoors = tagsImplyIndoors(entities[0].tags) && tagsImplyIndoors(entities[1].tags);
64648                 var isCrossingTunnels = allowsTunnel(featureType1) && hasTag(entities[0].tags, 'tunnel') &&
64649                                         allowsTunnel(featureType2) && hasTag(entities[1].tags, 'tunnel');
64650                 var isCrossingBridges = allowsBridge(featureType1) && hasTag(entities[0].tags, 'bridge') &&
64651                                         allowsBridge(featureType2) && hasTag(entities[1].tags, 'bridge');
64652
64653                 var crossingTypeID;
64654
64655                 if (isCrossingIndoors) {
64656                     crossingTypeID = 'indoor-indoor';
64657                 } else if (isCrossingTunnels) {
64658                     crossingTypeID = 'tunnel-tunnel';
64659                 } else if (isCrossingBridges) {
64660                     crossingTypeID = 'bridge-bridge';
64661                 } else {
64662                     crossingTypeID = crossing.featureTypes.sort().join('-');
64663                 }
64664                 if (connectionTags && (isCrossingIndoors || isCrossingTunnels || isCrossingBridges)) {
64665                     crossingTypeID += '_connectable';
64666                 }
64667
64668                 var fixes = [];
64669                 if (connectionTags) {
64670                     fixes.push(makeConnectWaysFix());
64671                 }
64672
64673                 var useFixIcon = 'iD-icon-layers';
64674                 var useFixID;
64675                 if (isCrossingIndoors) {
64676                     useFixID = 'use_different_levels';
64677                 } else if (isCrossingTunnels || isCrossingBridges) {
64678                     useFixID = 'use_different_layers';
64679                 // don't recommend bridges for waterways even though they're okay
64680                 } else if ((allowsBridge(featureType1) && featureType1 !== 'waterway') ||
64681                         (allowsBridge(featureType2) && featureType2 !== 'waterway')) {
64682                     useFixID = 'use_bridge_or_tunnel';
64683                     useFixIcon = 'maki-bridge';
64684                 } else if (allowsTunnel(featureType1) || allowsTunnel(featureType2)) {
64685                     useFixID = 'use_tunnel';
64686                 } else {
64687                     useFixID = 'use_different_layers';
64688                 }
64689                 if (useFixID === 'use_different_layers') {
64690                     fixes.push(makeChangeLayerFix('higher'));
64691                     fixes.push(makeChangeLayerFix('lower'));
64692                 } else {
64693                     fixes.push(new validationIssueFix({
64694                         icon: useFixIcon,
64695                         title: t('issues.fix.' + useFixID + '.title')
64696                     }));
64697                 }
64698                 fixes.push(new validationIssueFix({
64699                     icon: 'iD-operation-move',
64700                     title: t('issues.fix.reposition_features.title')
64701                 }));
64702
64703                 return new validationIssue({
64704                     type: type,
64705                     severity: 'warning',
64706                     message: function(context) {
64707                         var entity1 = context.hasEntity(this.entityIds[0]),
64708                             entity2 = context.hasEntity(this.entityIds[1]);
64709                         return (entity1 && entity2) ? t('issues.crossing_ways.message', {
64710                             feature: utilDisplayLabel(entity1, context),
64711                             feature2: utilDisplayLabel(entity2, context)
64712                         }) : '';
64713                     },
64714                     reference: showReference,
64715                     entityIds: entities.map(function(entity) {
64716                         return entity.id;
64717                     }),
64718                     data: {
64719                         edges: crossing.edges,
64720                         connectionTags: connectionTags
64721                     },
64722                     // differentiate based on the loc since two ways can cross multiple times
64723                     hash: JSON.stringify(crossing.crossPoint) +
64724                         // if the edges change then so does the fix
64725                         JSON.stringify(crossing.edges) +
64726                         // ensure the correct connection tags are added in the fix
64727                         JSON.stringify(connectionTags),
64728                     loc: crossing.crossPoint,
64729                     fixes: fixes
64730                 });
64731
64732                 function showReference(selection) {
64733                     selection.selectAll('.issue-reference')
64734                         .data([0])
64735                         .enter()
64736                         .append('div')
64737                         .attr('class', 'issue-reference')
64738                         .text(t('issues.crossing_ways.' + crossingTypeID + '.reference'));
64739                 }
64740             }
64741
64742             function makeConnectWaysFix() {
64743                 return new validationIssueFix({
64744                     icon: 'iD-icon-crossing',
64745                     title: t('issues.fix.connect_features.title'),
64746                     onClick: function(context) {
64747                         var loc = this.issue.loc;
64748                         var connectionTags = this.issue.data.connectionTags;
64749                         var edges = this.issue.data.edges;
64750
64751                         context.perform(
64752                             function actionConnectCrossingWays(graph) {
64753                                 // create the new node for the points
64754                                 var node = osmNode({ loc: loc, tags: connectionTags });
64755                                 graph = graph.replace(node);
64756
64757                                 var nodesToMerge = [node.id];
64758                                 var mergeThresholdInMeters = 0.75;
64759
64760                                 edges.forEach(function(edge) {
64761                                     var edgeNodes = [graph.entity(edge[0]), graph.entity(edge[1])];
64762                                     var closestNodeInfo = geoSphericalClosestNode(edgeNodes, loc);
64763                                     // if there is already a point nearby, use that
64764                                     if (closestNodeInfo.distance < mergeThresholdInMeters) {
64765                                         nodesToMerge.push(closestNodeInfo.node.id);
64766                                     // else add the new node to the way
64767                                     } else {
64768                                         graph = actionAddMidpoint({loc: loc, edge: edge}, node)(graph);
64769                                     }
64770                                 });
64771
64772                                 if (nodesToMerge.length > 1) {
64773                                     // if we're using nearby nodes, merge them with the new node
64774                                     graph = actionMergeNodes(nodesToMerge, loc)(graph);
64775                                 }
64776
64777                                 return graph;
64778                             },
64779                             t('issues.fix.connect_crossing_features.annotation')
64780                         );
64781                     }
64782                 });
64783             }
64784
64785             function makeChangeLayerFix(higherOrLower) {
64786                 return new validationIssueFix({
64787                     icon: 'iD-icon-' + (higherOrLower === 'higher' ? 'up' : 'down'),
64788                     title: t('issues.fix.tag_this_as_' + higherOrLower + '.title'),
64789                     onClick: function(context) {
64790
64791                         var mode = context.mode();
64792                         if (!mode || mode.id !== 'select') return;
64793
64794                         var selectedIDs = mode.selectedIDs();
64795                         if (selectedIDs.length !== 1) return;
64796
64797                         var selectedID = selectedIDs[0];
64798                         if (!this.issue.entityIds.some(function(entityId) {
64799                             return entityId === selectedID;
64800                         })) return;
64801
64802                         var entity = context.hasEntity(selectedID);
64803                         if (!entity) return;
64804
64805                         var tags = Object.assign({}, entity.tags);   // shallow copy
64806                         var layer = tags.layer && Number(tags.layer);
64807                         if (layer && !isNaN(layer)) {
64808                             if (higherOrLower === 'higher') {
64809                                 layer += 1;
64810                             } else {
64811                                 layer -= 1;
64812                             }
64813                         } else {
64814                             if (higherOrLower === 'higher') {
64815                                 layer = 1;
64816                             } else {
64817                                 layer = -1;
64818                             }
64819                         }
64820                         tags.layer = layer;
64821                         context.perform(
64822                             actionChangeTags(entity.id, tags),
64823                             t('operations.change_tags.annotation')
64824                         );
64825                     }
64826                 });
64827             }
64828
64829             validation.reset = function() {
64830                 _issueCache = {};
64831             };
64832
64833             validation.type = type;
64834
64835             return validation;
64836         }
64837
64838         function validationDisconnectedWay() {
64839             var type = 'disconnected_way';
64840
64841             function isTaggedAsHighway(entity) {
64842                 return osmRoutableHighwayTagValues[entity.tags.highway];
64843             }
64844
64845             var validation = function checkDisconnectedWay(entity, graph) {
64846
64847                 var routingIslandWays = routingIslandForEntity(entity);
64848                 if (!routingIslandWays) return [];
64849
64850                 var fixes = [];
64851
64852                 var isSingle = routingIslandWays.size === 1;
64853
64854                 if (isSingle) {
64855
64856                     if (entity.type === 'way' && !entity.isClosed()) {
64857                         var firstID = entity.first();
64858                         var lastID = entity.last();
64859
64860                         var first = graph.entity(firstID);
64861                         if (first.tags.noexit !== 'yes') {
64862                             fixes.push(new validationIssueFix({
64863                                 icon: 'iD-operation-continue-left',
64864                                 title: t('issues.fix.continue_from_start.title'),
64865                                 entityIds: [firstID],
64866                                 onClick: function(context) {
64867                                     var wayId = this.issue.entityIds[0];
64868                                     var way = context.entity(wayId);
64869                                     var vertexId = this.entityIds[0];
64870                                     var vertex = context.entity(vertexId);
64871                                     continueDrawing(way, vertex, context);
64872                                 }
64873                             }));
64874                         }
64875                         var last = graph.entity(lastID);
64876                         if (last.tags.noexit !== 'yes') {
64877                             fixes.push(new validationIssueFix({
64878                                 icon: 'iD-operation-continue',
64879                                 title: t('issues.fix.continue_from_end.title'),
64880                                 entityIds: [lastID],
64881                                 onClick: function(context) {
64882                                     var wayId = this.issue.entityIds[0];
64883                                     var way = context.entity(wayId);
64884                                     var vertexId = this.entityIds[0];
64885                                     var vertex = context.entity(vertexId);
64886                                     continueDrawing(way, vertex, context);
64887                                 }
64888                             }));
64889                         }
64890
64891                     } else {
64892                         fixes.push(new validationIssueFix({
64893                             title: t('issues.fix.connect_feature.title')
64894                         }));
64895                     }
64896
64897                     fixes.push(new validationIssueFix({
64898                         icon: 'iD-operation-delete',
64899                         title: t('issues.fix.delete_feature.title'),
64900                         entityIds: [entity.id],
64901                         onClick: function(context) {
64902                             var id = this.issue.entityIds[0];
64903                             var operation = operationDelete([id], context);
64904                             if (!operation.disabled()) {
64905                                 operation();
64906                             }
64907                         }
64908                     }));
64909                 } else {
64910                     fixes.push(new validationIssueFix({
64911                         title: t('issues.fix.connect_features.title')
64912                     }));
64913                 }
64914
64915                 return [new validationIssue({
64916                     type: type,
64917                     severity: 'warning',
64918                     message: function(context) {
64919                         if (this.entityIds.length === 1) {
64920                             var entity = context.hasEntity(this.entityIds[0]);
64921                             return entity ? t('issues.disconnected_way.highway.message', { highway: utilDisplayLabel(entity, context) }) : '';
64922                         }
64923                         return t('issues.disconnected_way.routable.message.multiple', { count: this.entityIds.length.toString() });
64924                     },
64925                     reference: showReference,
64926                     entityIds: Array.from(routingIslandWays).map(function(way) { return way.id; }),
64927                     fixes: fixes
64928                 })];
64929
64930
64931                 function showReference(selection) {
64932                     selection.selectAll('.issue-reference')
64933                         .data([0])
64934                         .enter()
64935                         .append('div')
64936                         .attr('class', 'issue-reference')
64937                         .text(t('issues.disconnected_way.routable.reference'));
64938                 }
64939
64940                 function routingIslandForEntity(entity) {
64941
64942                     if (entity.type !== 'way') return null;
64943
64944                     if (!isRoutableWay(entity, true)) return null;
64945
64946                     var waysToCheck = [entity];
64947                     var routingIsland = new Set([entity]);
64948
64949                     while (waysToCheck.length) {
64950                         var wayToCheck = waysToCheck.pop();
64951                         var childNodes = graph.childNodes(wayToCheck);
64952                         for (var i in childNodes) {
64953                             var vertex = childNodes[i];
64954                             var result = isConnectedVertex(vertex, routingIsland);
64955                             if (result === true) {
64956                                 return null;
64957                             } else if (result === false) {
64958                                 continue;
64959                             }
64960                             result.forEach(function(connectedWay) {
64961                                 if (!routingIsland.has(connectedWay)) {
64962                                     routingIsland.add(connectedWay);
64963                                     waysToCheck.push(connectedWay);
64964                                 }
64965                             });
64966                         }
64967                     }
64968
64969                     return routingIsland;
64970                 }
64971
64972                 function isConnectedVertex(vertex, routingIslandWays) {
64973                     // assume ways overlapping unloaded tiles are connected to the wider road network  - #5938
64974                     var osm = services$1.osm;
64975                     if (osm && !osm.isDataLoaded(vertex.loc)) return true;
64976
64977                     // entrances are considered connected
64978                     if (vertex.tags.entrance &&
64979                         vertex.tags.entrance !== 'no') return true;
64980                     if (vertex.tags.amenity === 'parking_entrance') return true;
64981
64982                     var parentsWays = graph.parentWays(vertex);
64983
64984                     // standalone vertex
64985                     if (parentsWays.length === 1) return false;
64986
64987                     var connectedWays = new Set();
64988
64989                     for (var i in parentsWays) {
64990                         var parentWay = parentsWays[i];
64991
64992                         // ignore any way we've already accounted for
64993                         if (routingIslandWays.has(parentWay)) continue;
64994
64995                         if (isRoutableWay(parentWay, false)) connectedWays.add(parentWay);
64996                     }
64997
64998                     if (connectedWays.size) return connectedWays;
64999
65000                     return false;
65001                 }
65002
65003                 function isRoutableWay(way, ignoreInnerWays) {
65004                     if (isTaggedAsHighway(way) || way.tags.route === 'ferry') return true;
65005
65006                     return graph.parentRelations(way).some(function(parentRelation) {
65007                         if (parentRelation.tags.type === 'route' &&
65008                             parentRelation.tags.route === 'ferry') return true;
65009
65010                         if (parentRelation.isMultipolygon() &&
65011                             isTaggedAsHighway(parentRelation) &&
65012                             (!ignoreInnerWays || parentRelation.memberById(way.id).role !== 'inner')) return true;
65013                     });
65014                 }
65015
65016             };
65017
65018             function continueDrawing(way, vertex, context) {
65019                 // make sure the vertex is actually visible and editable
65020                 var map = context.map();
65021                 if (!map.editable() || !map.trimmedExtent().contains(vertex.loc)) {
65022                     map.zoomToEase(vertex);
65023                 }
65024
65025                 context.enter(
65026                     modeDrawLine(context, way.id, context.graph(), context.graph(), 'line', way.affix(vertex.id), true)
65027                 );
65028             }
65029
65030
65031             validation.type = type;
65032
65033             return validation;
65034         }
65035
65036         function validationFixmeTag(context) {
65037             var type = 'fixme_tag';
65038
65039
65040             var validation = function checkFixmeTag(entity) {
65041
65042                 if (!entity.tags.fixme) return [];
65043
65044                 // don't flag fixmes on features added by the user
65045                 if (entity.version === undefined) return [];
65046
65047                 if (entity.v !== undefined) {
65048                     var baseEntity = context.history().base().hasEntity(entity.id);
65049                     // don't flag fixmes added by the user on existing features
65050                     if (!baseEntity || !baseEntity.tags.fixme) return [];
65051                 }
65052
65053                 return [new validationIssue({
65054                     type: type,
65055                     severity: 'warning',
65056                     message: function(context) {
65057                         var entity = context.hasEntity(this.entityIds[0]);
65058                         return entity ? t('issues.fixme_tag.message', { feature: utilDisplayLabel(entity, context) }) : '';
65059                     },
65060                     reference: showReference,
65061                     entityIds: [entity.id]
65062                 })];
65063
65064                 function showReference(selection) {
65065                     selection.selectAll('.issue-reference')
65066                         .data([0])
65067                         .enter()
65068                         .append('div')
65069                         .attr('class', 'issue-reference')
65070                         .text(t('issues.fixme_tag.reference'));
65071                 }
65072             };
65073
65074             validation.type = type;
65075
65076             return validation;
65077         }
65078
65079         var brands = {"amenity/bank|ABANCA":{countryCodes:["es"],tags:{amenity:"bank",brand:"ABANCA","brand:wikidata":"Q9598744","brand:wikipedia":"es:Abanca",name:"ABANCA",official_name:"ABANCA Corporación Bancaria"}},"amenity/bank|ABN AMRO":{countryCodes:["nl"],tags:{amenity:"bank",brand:"ABN AMRO","brand:wikidata":"Q287471","brand:wikipedia":"en:ABN AMRO",name:"ABN AMRO",official_name:"ABN AMRO Bank N.V."}},"amenity/bank|ABSA":{countryCodes:["za"],tags:{amenity:"bank",brand:"ABSA","brand:wikidata":"Q331688","brand:wikipedia":"en:ABSA Group Limited",name:"ABSA"}},"amenity/bank|AIB":{countryCodes:["gb","ie"],tags:{amenity:"bank",brand:"AIB","brand:wikidata":"Q1642179","brand:wikipedia":"en:Allied Irish Banks",name:"AIB",official_name:"Allied Irish Banks"}},"amenity/bank|ANZ":{countryCodes:["au","nz"],matchNames:["anz bank"],tags:{amenity:"bank",brand:"ANZ","brand:wikidata":"Q714641","brand:wikipedia":"en:Australia and New Zealand Banking Group",name:"ANZ",official_name:"Australia and New Zealand Banking Group Limited"}},"amenity/bank|ASB Bank":{countryCodes:["nz"],tags:{amenity:"bank",brand:"ASB Bank","brand:wikidata":"Q297214","brand:wikipedia":"en:ASB Bank",name:"ASB Bank"}},"amenity/bank|ATB Financial":{countryCodes:["ca"],tags:{amenity:"bank",brand:"ATB Financial","brand:wikidata":"Q298762","brand:wikipedia":"en:ATB Financial",name:"ATB Financial",official_name:"Alberta Treasury Branches"}},"amenity/bank|AXA":{nomatch:["office/insurance|AXA"],tags:{amenity:"bank",brand:"AXA","brand:wikidata":"Q160054","brand:wikipedia":"en:AXA",name:"AXA"}},"amenity/bank|Access Bank":{tags:{amenity:"bank",brand:"Access Bank","brand:wikidata":"Q4672418","brand:wikipedia":"en:Access Bank plc",name:"Access Bank"}},"amenity/bank|Addiko Bank":{countryCodes:["ba","hr","me","rs","si"],tags:{amenity:"bank",brand:"Addiko Bank","brand:wikidata":"Q27926559","brand:wikipedia":"en:Addiko Bank",name:"Addiko Bank"}},"amenity/bank|Affinity Credit Union":{countryCodes:["ca"],matchNames:["affinity"],tags:{amenity:"bank",brand:"Affinity Credit Union","brand:wikidata":"Q4688969","brand:wikipedia":"en:Affinity Credit Union",name:"Affinity Credit Union"}},"amenity/bank|Agrani Bank Limited অগ্রণী ব্যাংক লিমিটেড":{countryCodes:["bd"],tags:{amenity:"bank",brand:"Agrani Bank Limited অগ্রণী ব্যাংক লিমিটেড","brand:wikidata":"Q517050","brand:wikipedia":"en:Agrani Bank",name:"Agrani Bank Limited অগ্রণী ব্যাংক লিমিটেড","name:en":"Agrani Bank Limited"}},"amenity/bank|Agribank~(USA)":{countryCodes:["us"],tags:{amenity:"bank",brand:"Agribank","brand:wikidata":"Q4693829","brand:wikipedia":"en:AgriBank",name:"Agribank"}},"amenity/bank|Agribank~(Vietnam)":{countryCodes:["vn"],tags:{amenity:"bank",brand:"Agribank","brand:wikidata":"Q1924723","brand:wikipedia":"vn:Ngân hàng Nông nghiệp và Phát triển Nông thôn Việt Nam",name:"Agribank",official_name:"Ngân hàng Nông nghiệp và Phát triển Nông thôn Việt Nam","official_name:en":"Vietnam Bank for Agriculture and Rural Development"}},"amenity/bank|Agribank~(Zimbabwe)":{countryCodes:["zw"],tags:{amenity:"bank",brand:"Agribank","brand:wikidata":"Q4693887","brand:wikipedia":"en:Agricultural Development Bank of Zimbabwe",name:"Agribank"}},"amenity/bank|Akbank":{countryCodes:["tr"],tags:{amenity:"bank",brand:"Akbank","brand:wikidata":"Q416624","brand:wikipedia":"en:Akbank",name:"Akbank"}},"amenity/bank|Aktia":{countryCodes:["fi"],tags:{amenity:"bank",brand:"Aktia","brand:wikidata":"Q11850417","brand:wikipedia":"fi:Aktia",name:"Aktia"}},"amenity/bank|Alior Bank":{countryCodes:["pl"],tags:{amenity:"bank",brand:"Alior Bank","brand:wikidata":"Q9148395","brand:wikipedia":"pl:Alior Bank",name:"Alior Bank"}},"amenity/bank|Allahabad Bank":{countryCodes:["in"],tags:{amenity:"bank",brand:"Allahabad Bank","brand:wikidata":"Q2018840","brand:wikipedia":"en:Allahabad Bank",name:"Allahabad Bank"}},"amenity/bank|Allied Bank~(Pakistan)":{countryCodes:["pk"],tags:{amenity:"bank",brand:"Allied Bank","brand:wikidata":"Q4732553","brand:wikipedia":"en:Allied Bank Limited",name:"Allied Bank"}},"amenity/bank|Allied Bank~(defunct bank in Philipiness)":{countryCodes:["ph"],tags:{amenity:"bank",brand:"Allied Bank","brand:wikidata":"Q4732555","brand:wikipedia":"en:Allied Banking Corporation",name:"Allied Bank"}},"amenity/bank|Alpha Bank":{tags:{amenity:"bank",brand:"Alpha Bank","brand:wikidata":"Q747394","brand:wikipedia":"en:Alpha Bank",name:"Alpha Bank"}},"amenity/bank|America First Credit Union":{countryCodes:["us"],tags:{amenity:"bank",brand:"America First Credit Union","brand:wikidata":"Q4742758","brand:wikipedia":"en:America First Credit Union",name:"America First Credit Union",short_name:"AFCU"}},"amenity/bank|Andhra Bank":{countryCodes:["in"],tags:{amenity:"bank",brand:"Andhra Bank","brand:wikidata":"Q2003476","brand:wikipedia":"en:Andhra Bank",name:"Andhra Bank"}},"amenity/bank|Antonveneta":{countryCodes:["it"],tags:{amenity:"bank",brand:"Antonveneta","brand:wikidata":"Q3633689","brand:wikipedia":"en:Banca Antonveneta",name:"Antonveneta"}},"amenity/bank|Apple Bank":{countryCodes:["us"],nomatch:["shop/electronics|Apple Store"],tags:{amenity:"bank",brand:"Apple Bank","brand:wikidata":"Q4781125","brand:wikipedia":"en:Apple Bank for Savings",name:"Apple Bank"}},"amenity/bank|Argenta":{countryCodes:["be","lu","nl"],tags:{amenity:"bank",brand:"Argenta","brand:wikidata":"Q932856","brand:wikipedia":"en:Argenta (bank)",name:"Argenta"}},"amenity/bank|Arvest Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"Arvest Bank","brand:wikidata":"Q4802393","brand:wikipedia":"en:Arvest Bank",name:"Arvest Bank"}},"amenity/bank|Asia United Bank":{countryCodes:["ph"],tags:{amenity:"bank",brand:"Asia United Bank","brand:wikidata":"Q4806482","brand:wikipedia":"en:Asia United Bank",name:"Asia United Bank"}},"amenity/bank|Askari Bank":{countryCodes:["pk"],tags:{amenity:"bank",brand:"Askari Bank","brand:wikidata":"Q4807137","brand:wikipedia":"en:Askari Bank",name:"Askari Bank"}},"amenity/bank|Associated Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"Associated Bank","brand:wikidata":"Q4809155","brand:wikipedia":"en:Associated Banc-Corp",name:"Associated Bank"}},"amenity/bank|Attijariwafa Bank":{tags:{amenity:"bank",brand:"Attijariwafa Bank","brand:wikidata":"Q758052","brand:wikipedia":"en:Attijariwafa Bank",name:"Attijariwafa Bank"}},"amenity/bank|Axis Bank":{countryCodes:["in"],tags:{amenity:"bank",brand:"Axis Bank","brand:wikidata":"Q2003549","brand:wikipedia":"en:Axis Bank",name:"Axis Bank"}},"amenity/bank|BAC":{tags:{amenity:"bank",brand:"BAC","brand:wikidata":"Q5715556","brand:wikipedia":"en:Banco de América Central",name:"BAC",official_name:"Banco de America Central"}},"amenity/bank|BAWAG PSK":{countryCodes:["at"],tags:{amenity:"bank",brand:"BAWAG PSK","brand:wikidata":"Q379938","brand:wikipedia":"en:BAWAG P.S.K.",name:"BAWAG PSK"}},"amenity/bank|BB&T":{countryCodes:["us"],tags:{amenity:"bank",brand:"BB&T","brand:wikidata":"Q795486","brand:wikipedia":"en:BB&T",name:"BB&T",official_name:"Branch Banking and Trust Company"}},"amenity/bank|BBBank":{countryCodes:["de"],tags:{amenity:"bank",brand:"BBBank","brand:wikidata":"Q795504","brand:wikipedia":"en:BBBank",name:"BBBank"}},"amenity/bank|BBVA":{tags:{amenity:"bank",brand:"BBVA","brand:wikidata":"Q806189","brand:wikipedia":"en:Banco Bilbao Vizcaya Argentaria",name:"BBVA",official_name:"Banco Bilbao Vizcaya Argentaria"}},"amenity/bank|BBVA Bancomer":{countryCodes:["mx"],tags:{amenity:"bank",brand:"BBVA Bancomer","brand:wikidata":"Q2876794","brand:wikipedia":"en:BBVA Bancomer",name:"BBVA Bancomer"}},"amenity/bank|BBVA Compass":{countryCodes:["us"],tags:{amenity:"bank",brand:"BBVA Compass","brand:wikidata":"Q4835088","brand:wikipedia":"en:BBVA Compass",name:"BBVA Compass",official_name:"BBVA Compass Bancshares"}},"amenity/bank|BBVA Continental":{countryCodes:["pe"],tags:{amenity:"bank",brand:"BBVA Continental","brand:wikidata":"Q4835089","brand:wikipedia":"en:BBVA Continental",name:"BBVA Continental"}},"amenity/bank|BBVA Francés":{countryCodes:["ar"],tags:{amenity:"bank",brand:"BBVA Francés","brand:en":"BBVA France","brand:fr":"BBVA France","brand:wikidata":"Q2876788","brand:wikipedia":"en:BBVA Francés",name:"BBVA Francés","name:en":"BBVA France","name:fr":"BBVA Francés"}},"amenity/bank|BCA":{matchNames:["bank bca"],tags:{amenity:"bank",brand:"BCA","brand:wikidata":"Q806626","brand:wikipedia":"id:Bank Central Asia",name:"BCA",official_name:"Bank Central Asia"}},"amenity/bank|BCI":{matchNames:["banco bci"],tags:{amenity:"bank",brand:"BCI","brand:wikidata":"Q2882083","brand:wikipedia":"es:Banco de Crédito e Inversiones",name:"BCI",official_name:"Banco de Crédito e Inversiones","official_name:en":"Bank of Credit and Investments","official_name:es":"Banco de Crédito e Inversiones"}},"amenity/bank|BCP~(Bolivia)":{countryCodes:["bo"],nomatch:["amenity/bank|BCP~(France)","amenity/bank|BCP~(Luxembourg)","amenity/bank|BCP~(Peru)"],tags:{amenity:"bank",brand:"BCP","brand:wikidata":"Q16826675","brand:wikipedia":"es:Banco de Crédito de Bolivia",name:"BCP",official_name:"Banco de Crédito de Bolivia","official_name:en":"Credit Bank of Bolivia","official_name:es":"Banco de Crédito de Bolivia"}},"amenity/bank|BCP~(France)":{countryCodes:["fr"],matchNames:["banque bcp","bcp"],nomatch:["amenity/bank|BCP~(Bolivia)","amenity/bank|BCP~(Luxembourg)","amenity/bank|BCP~(Peru)"],tags:{amenity:"bank",brand:"BCP","brand:wikidata":"Q118581","brand:wikipedia":"pt:Banco Comercial Português",name:"BCP"}},"amenity/bank|BCP~(Luxembourg)":{countryCodes:["lu"],matchNames:["banque bcp","bcp"],nomatch:["amenity/bank|BCP~(Bolivia)","amenity/bank|BCP~(France)","amenity/bank|BCP~(Peru)"],tags:{amenity:"bank",brand:"BCP","brand:wikidata":"Q118581","brand:wikipedia":"pt:Banco Comercial Português",name:"BCP"}},"amenity/bank|BCP~(Peru)":{countryCodes:["pe"],matchNames:["banco de crédito del perú"],nomatch:["amenity/bank|BCP~(Bolivia)","amenity/bank|BCP~(France)","amenity/bank|BCP~(Luxembourg)"],tags:{amenity:"bank",brand:"BCP","brand:wikidata":"Q4854124","brand:wikipedia":"es:Banco de Crédito del Perú",name:"BCP"}},"amenity/bank|BCR~(Banca Comercială Română)":{countryCodes:["ro"],matchNames:["banca comercială română"],tags:{amenity:"bank",brand:"BCR","brand:wikidata":"Q806149","brand:wikipedia":"en:Banca Comercială Română",name:"BCR",official_name:"Banca Comercială Română","official_name:en":"Romanian Commercial Bank","official_name:ro":"Banca Comercială Română"}},"amenity/bank|BCR~(Costa Rica)":{countryCodes:["cr"],matchNames:["banco de costa rica"],tags:{amenity:"bank",brand:"BCR","brand:wikidata":"Q6951632","brand:wikipedia":"es:Banco de Costa Rica",name:"BCR",official_name:"Banco de Costa Rica","official_name:en":"Bank of Costa Rica","official_name:es":"Banco de Costa Rica"}},"amenity/bank|BDO":{countryCodes:["ph"],tags:{amenity:"bank",brand:"BDO","brand:wikidata":"Q4854129","brand:wikipedia":"en:Banco de Oro",name:"BDO",official_name:"Banco de Oro","official_name:en":"Gold Bank","official_name:es":"Banco de Oro"}},"amenity/bank|BGŻ BNP Paribas":{countryCodes:["pl"],tags:{amenity:"bank",brand:"BGŻ BNP Paribas","brand:wikidata":"Q20744004","brand:wikipedia":"pl:BNP Paribas Bank Polska",name:"BGŻ BNP Paribas"}},"amenity/bank|BIAT":{countryCodes:["tn"],tags:{amenity:"bank",brand:"BIAT","brand:wikidata":"Q690739","brand:wikipedia":"en:Banque Internationale Arabe de Tunisie",name:"BIAT"}},"amenity/bank|BMCE Bank":{countryCodes:["ma"],matchNames:["bmce"],tags:{amenity:"bank",brand:"BMCE Bank","brand:wikidata":"Q2300433","brand:wikipedia":"ar:البنك المغربي للتجارة الخارجية",name:"BMCE Bank"}},"amenity/bank|BMCI":{countryCodes:["ma"],matchNames:["bmci bank"],tags:{amenity:"bank",brand:"BMCI","brand:wikidata":"Q2883409","brand:wikipedia":"ar:البنك المغربي للتجارة والصناعة",name:"BMCI"}},"amenity/bank|BMN":{countryCodes:["es"],tags:{amenity:"bank",brand:"BMN","brand:wikidata":"Q3754900","brand:wikipedia":"es:Banco Mare Nostrum",name:"BMN",official_name:"Banco Mare Nostrum"}},"amenity/bank|BMO":{countryCodes:["ca","us"],matchNames:["bmo bank of montreal"],tags:{amenity:"bank",brand:"BMO","brand:wikidata":"Q806693","brand:wikipedia":"en:Bank of Montreal",name:"BMO",official_name:"Bank of Montreal"}},"amenity/bank|BMO Harris Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"BMO Harris Bank","brand:wikidata":"Q4835981","brand:wikipedia":"en:BMO Harris Bank",name:"BMO Harris Bank"}},"amenity/bank|BNA~(Algeria)":{countryCodes:["dz"],tags:{amenity:"bank",brand:"BNA","brand:wikidata":"Q2883410","brand:wikipedia":"fr:Banque nationale d'Algérie",name:"BNA",official_name:"Banque nationale d'Algérie","official_name:en":"National Bank of Algeria","official_name:fr":"Banque nationale d'Algérie"}},"amenity/bank|BNA~(Tunisia)":{countryCodes:["tn"],tags:{amenity:"bank",brand:"BNA","brand:wikidata":"Q2883413","brand:wikipedia":"fr:Banque nationale agricole",name:"BNA"}},"amenity/bank|BNI":{matchNames:["bank bni"],tags:{amenity:"bank",brand:"BNI","brand:wikidata":"Q2882611","brand:wikipedia":"id:Bank Negara Indonesia",name:"BNI",official_name:"Bank Negara Indonesia","official_name:en":"State Bank of Indonesia","official_name:id":"Bank Negara Indonesia"}},"amenity/bank|BNL":{countryCodes:["it"],tags:{amenity:"bank",brand:"BNL","brand:wikidata":"Q2201225","brand:wikipedia":"en:Banca Nazionale del Lavoro",name:"BNL",official_name:"Banca Nazionale del Lavoro","official_name:en":"National Labor Bank","official_name:it":"Banca Nazionale del Lavoro"}},"amenity/bank|BNP Paribas":{tags:{amenity:"bank",brand:"BNP Paribas","brand:wikidata":"Q499707","brand:wikipedia":"en:BNP Paribas",name:"BNP Paribas"}},"amenity/bank|BNP Paribas Fortis":{countryCodes:["be"],tags:{amenity:"bank",brand:"BNP Paribas Fortis","brand:wikidata":"Q796827","brand:wikipedia":"en:BNP Paribas Fortis",name:"BNP Paribas Fortis"}},"amenity/bank|BOC":{tags:{amenity:"bank",brand:"BOC","brand:wikidata":"Q790068","brand:wikipedia":"en:Bank of China",name:"BOC",official_name:"Bank of China"}},"amenity/bank|BOQ":{countryCodes:["au"],tags:{amenity:"bank",brand:"BOQ","brand:wikidata":"Q4856173","brand:wikipedia":"en:Bank of Queensland",name:"BOQ",official_name:"Bank of Queensland"}},"amenity/bank|BPI":{matchNames:["bpi family savings bank"],tags:{amenity:"bank",brand:"BPI","brand:wikidata":"Q2501256","brand:wikipedia":"en:Bank of the Philippine Islands",name:"BPI",official_name:"Bank of the Philippine Islands"}},"amenity/bank|BRD":{countryCodes:["ro"],tags:{amenity:"bank",brand:"BRD","brand:wikidata":"Q796927","brand:wikipedia":"ro:BRD - Groupe Société Générale",name:"BRD"}},"amenity/bank|BRED":{countryCodes:["fr"],tags:{amenity:"bank",brand:"BRED","brand:wikidata":"Q2877455","brand:wikipedia":"fr:BRED Banque populaire",name:"BRED",official_name:"Banque régionale d'escompte et de dépôts","official_name:en":"Regional Discount and Deposit Bank","official_name:fr":"Banque régionale d'escompte et de dépôts"}},"amenity/bank|BRI":{countryCodes:["id"],matchNames:["bank bri"],tags:{amenity:"bank",brand:"BRI","brand:wikidata":"Q623042","brand:wikipedia":"id:Bank Rakyat Indonesia",name:"BRI",official_name:"Bank Rakyat Indonesia","official_name:en":"People's Bank of Indonesia","official_name:id":"Bank Rakyat Indonesia"}},"amenity/bank|BTN":{countryCodes:["id"],tags:{amenity:"bank",brand:"BTN","brand:en":"BTN","brand:id":"BTN","brand:wikidata":"Q12474534","brand:wikipedia":"id:Bank Tabungan Negara",name:"BTN","name:en":"BTN","name:id":"BTN",official_name:"Bank Tabungan Negara","official_name:en":"State Savings Bank","official_name:id":"Bank Tabungan Negara"}},"amenity/bank|BW-Bank":{countryCodes:["de"],matchNames:["baden-württembergische bank"],tags:{amenity:"bank",brand:"BW-Bank","brand:de":"BW-Bank","brand:en":"BW-Bank","brand:wikidata":"Q798891","brand:wikipedia":"de:Baden-Württembergische Bank",name:"BW-Bank","name:de":"BW-Bank","name:en":"BW-Bank"}},"amenity/bank|Banamex":{countryCodes:["mx"],tags:{amenity:"bank",brand:"Banamex","brand:wikidata":"Q749474","brand:wikipedia":"en:Grupo Financiero Banamex",name:"Banamex",official_name:"Grupo Financiero Banamex","official_name:en":"Banamex Financial Group","official_name:es":"Grupo Financiero Banamex"}},"amenity/bank|Banca Intesa":{countryCodes:["it","rs"],tags:{amenity:"bank",brand:"Banca Intesa","brand:wikidata":"Q647092","brand:wikipedia":"en:Banca Intesa",name:"Banca Intesa","name:en":"Intesa Bank","name:it":"Banca Intesa"}},"amenity/bank|Banca March":{countryCodes:["es"],tags:{amenity:"bank",brand:"Banca March","brand:wikidata":"Q578252","brand:wikipedia":"en:Banca March",name:"Banca March"}},"amenity/bank|Banca Popolare di Milano":{countryCodes:["it"],matchNames:["bpm"],tags:{amenity:"bank",brand:"Banca Popolare di Milano","brand:en":"Popular Bank of Milan","brand:it":"Banca Popolare di Milano","brand:wikidata":"Q806154","brand:wikipedia":"en:Banca Popolare di Milano",name:"Banca Popolare di Milano","name:en":"Popular Bank of Milan","name:it":"Banca Popolare di Milano"}},"amenity/bank|Banca Popolare di Novara":{countryCodes:["it"],tags:{amenity:"bank",brand:"Banca Popolare di Novara","brand:en":"Popular Bank of Novara","brand:it":"Banca Popolare di Novara","brand:wikidata":"Q3633742","brand:wikipedia":"en:Banca Popolare di Novara",name:"Banca Popolare di Novara","name:en":"Popular Bank of Novara","name:it":"Banca Popolare di Novara"}},"amenity/bank|Banca Popolare di Sondrio":{countryCodes:["it"],tags:{amenity:"bank",brand:"Banca Popolare di Sondrio","brand:en":"Popular Bank of Sandrio","brand:it":"Banca Popolare di Sondrio","brand:wikidata":"Q686176","brand:wikipedia":"en:Banca Popolare di Sondrio",name:"Banca Popolare di Sondrio","name:en":"Popular Bank of Sandrio","name:it":"Banca Popolare di Sondrio"}},"amenity/bank|Banca Popolare di Verona":{countryCodes:["it"],tags:{amenity:"bank",brand:"Banca Popolare di Verona","brand:en":"Popular Bank of Verona","brand:it":"Banca Popolare di Verona","brand:wikidata":"Q3167468","brand:wikipedia":"en:Banca Popolare di Verona",name:"Banca Popolare di Verona","name:en":"Popular Bank of Verona","name:it":"Banca Popolare di Verona"}},"amenity/bank|Banca Popolare di Vicenza":{countryCodes:["it"],tags:{amenity:"bank",brand:"Banca Popolare di Vicenza","brand:en":"Popular Bank of Vicenza","brand:it":"Banca Popolare di Vicenza","brand:wikidata":"Q3127200","brand:wikipedia":"en:Banca Popolare di Vicenza",name:"Banca Popolare di Vicenza","name:en":"Popular Bank of Vicena","name:it":"Banca Popolare di Vicenza"}},"amenity/bank|Banca Românească":{countryCodes:["ro"],tags:{amenity:"bank",brand:"Banca Românească","brand:en":"Romanian Bank","brand:ro":"Banca Românească","brand:wikidata":"Q4854052","brand:wikipedia":"ro:Banca Românească",name:"Banca Românească","name:en":"Popular Bank of Vicena","name:ro":"Banca Românească"}},"amenity/bank|Banca Sella":{countryCodes:["it"],tags:{amenity:"bank",brand:"Banca Sella","brand:en":"Sella Bank","brand:it":"Banca Sella","brand:wikidata":"Q3633749","brand:wikipedia":"en:Banca Sella Group",name:"Banca Sella","name:en":"Sella Bank","name:it":"Banca Sella"}},"amenity/bank|Banca Transilvania":{countryCodes:["ro"],tags:{amenity:"bank",brand:"Banca Transilvania","brand:en":"Transilvania Bank","brand:ro":"Banca Transilvania","brand:wikidata":"Q806161","brand:wikipedia":"en:Banca Transilvania",name:"Banca Transilvania","name:en":"Transilvania Bank","name:ro":"Banca Transilvania"}},"amenity/bank|Bancaribe":{countryCodes:["ve"],tags:{amenity:"bank",brand:"Bancaribe","brand:wikidata":"Q5717827","brand:wikipedia":"en:Bancaribe",name:"Bancaribe"}},"amenity/bank|Banco AV Villas":{countryCodes:["co"],tags:{amenity:"bank",brand:"Banco AV Villas","brand:en":"Bank of Villas","brand:es":"Banco AV Villas","brand:wikidata":"Q4854068","brand:wikipedia":"en:Banco AV Villas",name:"Banco AV Villas","name:en":"Bank of Villas","name:es":"Banco AV Villas"}},"amenity/bank|Banco Agrario":{countryCodes:["co"],tags:{amenity:"bank",brand:"Banco Agrario","brand:en":"Agrarian Bank","brand:wikidata":"Q20013358","brand:wikipedia":"es:Banco Agrario de Colombia",name:"Banco Agrario","name:en":"Agrarian Bank","name:es":"Banco Agrario",official_name:"Banco Agrario de Colombia","official_name:en":"Agrarian Bank of Colombia","official_name:es":"Banco Agrario de Colombia"}},"amenity/bank|Banco Azteca":{tags:{amenity:"bank",brand:"Banco Azteca","brand:en":"Aztec Bank","brand:es":"Banco Azteca","brand:wikidata":"Q4854076","brand:wikipedia":"en:Banco Azteca",name:"Banco Azteca","name:en":"Aztec Bank","name:es":"Banco Azteca"}},"amenity/bank|Banco BPM":{countryCodes:["it"],tags:{amenity:"bank",brand:"Banco BPM","brand:en":"BPM Bank","brand:es":"Banco BPM","brand:wikidata":"Q27331643","brand:wikipedia":"en:Banco BPM",name:"Banco BPM","name:en":"BPM Bank","name:es":"Banco BPM"}},"amenity/bank|Banco Caja Social":{countryCodes:["co"],tags:{amenity:"bank",brand:"Banco Caja Social","brand:en":"Social Housing Bank","brand:es":"Banco Caja Social","brand:wikidata":"Q5717869","brand:wikipedia":"es:Banco Caja Social",name:"Banco Caja Social","name:en":"Social Housing Bank","name:es":"Banco Caja Social"}},"amenity/bank|Banco Ciudad":{countryCodes:["ar"],tags:{amenity:"bank",brand:"Banco Ciudad","brand:en":"City Bank","brand:es":"Banco Ciudad","brand:wikidata":"Q4856204","brand:wikipedia":"en:Bank of the City of Buenos Aires",name:"Banco Ciudad","name:en":"City Bank","name:es":"Banco Ciudad",official_name:"Banco Ciudad de Buenos Aires","official_name:en":"Bank of the City of Buenos Aires","official_name:es":"Banco Ciudad de Buenos Aires"}},"amenity/bank|Banco Continental~(Paraguay)":{countryCodes:["py"],tags:{amenity:"bank",brand:"Banco Continental","brand:en":"Continental Bank","brand:es":"Banco Continental","brand:wikidata":"Q62054564",name:"Banco Continental","name:en":"Continental Bank","name:es":"Banco Continental"}},"amenity/bank|Banco Continental~(Peru)":{countryCodes:["pe"],tags:{amenity:"bank",brand:"Banco Continental","brand:en":"Continental Bank","brand:es":"Banco Continental","brand:wikidata":"Q4835089","brand:wikipedia":"en:BBVA Continental",name:"Banco Continental","name:en":"Continental Bank","name:es":"Banco Continental"}},"amenity/bank|Banco Estado":{countryCodes:["cl"],tags:{amenity:"bank",brand:"Banco Estado","brand:en":"State Bank","brand:es":"Banco Estado","brand:wikidata":"Q5718188","brand:wikipedia":"es:Banco del Estado de Chile",name:"Banco Estado","name:en":"State Bank","name:es":"Banco Estado",official_name:"Banco del Estado de Chile","official_name:en":"Bank of the State of Chile","official_name:es":"Banco del Estado de Chile"}},"amenity/bank|Banco Falabella":{countryCodes:["cl","co","pe"],nomatch:["shop/department_store|Falabella"],tags:{amenity:"bank",brand:"Banco Falabella","brand:en":"Falabella Bank","brand:es":"Banco Falabella","brand:wikidata":"Q4854088","brand:wikipedia":"en:Banco Falabella",name:"Banco Falabella","name:en":"Falabella Bank","name:es":"Banco Falabella"}},"amenity/bank|Banco Fassil":{countryCodes:["bo"],tags:{amenity:"bank",brand:"Banco Fassil","brand:en":"Fassil Bank","brand:es":"Banco Fassil","brand:wikidata":"Q62118592",name:"Banco Fassil","name:en":"Fassil Bank","name:es":"Banco Fassil"}},"amenity/bank|Banco G&T Continental":{countryCodes:["gt","sv"],tags:{amenity:"bank",brand:"Banco G&T Continental","brand:en":"G&T Continental Bank","brand:es":"Banco G&T Continental","brand:wikidata":"Q5717949","brand:wikipedia":"es:Banco GYT Continental, S.A.",name:"Banco G&T Continental","name:en":"G&T Continental Bank","name:es":"Banco G&T Continental"}},"amenity/bank|Banco General":{countryCodes:["cr","pa"],tags:{amenity:"bank",brand:"BW-Bank","brand:en":"BW-Bank","brand:es":"BW-Bank","brand:wikidata":"Q27618271","brand:wikipedia":"es:Banco General (Panamá)",name:"Banco General","name:en":"General Bank","name:es":"Banco General"}},"amenity/bank|Banco Industrial":{tags:{amenity:"bank",brand:"Banco Industrial","brand:en":"Industrial Bank","brand:es":"Banco Industrial","brand:wikidata":"Q16489444","brand:wikipedia":"es:Banco Industrial",name:"Banco Industrial","name:en":"Industrial Bank","name:es":"Banco Industrial"}},"amenity/bank|Banco Internacional~(Chile)":{countryCodes:["cl"],tags:{amenity:"bank",brand:"Banco Internacional","brand:en":"International Bank","brand:es":"Banco Internacional","brand:wikidata":"Q56605586","brand:wikipedia":"es:Banco Internacional (Chile)",name:"Banco Internacional","name:en":"International Bank","name:es":"Banco Internacional"}},"amenity/bank|Banco Internacional~(Ecuador)":{countryCodes:["ec"],tags:{amenity:"bank",brand:"Banco Internacional","brand:en":"International Bank","brand:es":"Banco Internacional","brand:wikidata":"Q806187","brand:wikipedia":"es:Banco Internacional",name:"Banco Internacional","name:en":"International Bank","name:es":"Banco Internacional"}},"amenity/bank|Banco Metropolitano":{countryCodes:["cu"],tags:{amenity:"bank",brand:"Banco Metropolitano","brand:en":"Metroplitan Bank","brand:es":"Banco Metropolitano","brand:wikidata":"Q62118612",name:"Banco Metropolitano","name:en":"Metropolitan Bank","name:es":"Banco Metropolitano"}},"amenity/bank|Banco Nacional":{countryCodes:["br"],tags:{amenity:"bank",brand:"Banco Nacional","brand:en":"National Bank","brand:es":"Banco Nacional","brand:wikidata":"Q4854104","brand:wikipedia":"en:Banco Nacional",name:"Banco Nacional","name:en":"National Bank","name:es":"Banco Nacional"}},"amenity/bank|Banco Nación":{countryCodes:["ar"],tags:{amenity:"bank",brand:"Banco Nación","brand:en":"Nation Bank","brand:es":"Banco Nación","brand:wikidata":"Q2883376","brand:wikipedia":"en:Banco de la Nación Argentina",name:"Banco Nación","name:en":"Nation Bank","name:es":"Banco Nación",official_name:"Banco de la Nación Argentina","official_name:en":"Bank of the Argentine Nation","official_name:es":"Banco de la Nación Argentina"}},"amenity/bank|Banco Pastor":{countryCodes:["es"],tags:{amenity:"bank",brand:"Banco Pastor","brand:en":"Shepherd Bank","brand:es":"Banco Pastor","brand:wikidata":"Q806193","brand:wikipedia":"en:Banco Pastor",name:"Banco Pastor","name:en":"Shepherd Bank","name:es":"Banco Pastor",official_name:"Banco Popular Pastor","official_name:en":"Popular Shepherd Bank","official_name:es":"Banco Popular Pastor"}},"amenity/bank|Banco Pichincha":{tags:{amenity:"bank",brand:"Banco Pichincha","brand:en":"Pichincha Bank","brand:es":"Banco Pichincha","brand:wikidata":"Q4854135","brand:wikipedia":"en:Banco Pichincha",name:"Banco Pichincha","name:en":"Pichincha Bank","name:es":"Banco Pichincha"}},"amenity/bank|Banco Popular":{countryCodes:["us","vi"],matchNames:["popular"],tags:{amenity:"bank",brand:"Banco Popular","brand:en":"Popular Bank","brand:es":"Banco Popular","brand:wikidata":"Q537259","brand:wikipedia":"es:Banco Popular Español",name:"Banco Popular","name:en":"Popular Bank","name:es":"Banco Popular",official_name:"Banco Popular Español","official_name:en":"Spanish Popular Bank","official_name:es":"Banco Popular Español"}},"amenity/bank|Banco Popular de Ahorro":{countryCodes:["cu"],matchNames:["bpa"],tags:{amenity:"bank",brand:"Banco Popular de Ahorro","brand:en":"Popular Saving Bank","brand:es":"Banco Popular de Ahorro","brand:wikidata":"Q62118626",name:"Banco Popular de Ahorro","name:en":"Popular Saving Bank","name:es":"Banco Popular de Ahorro"}},"amenity/bank|Banco Provincia":{countryCodes:["ar"],tags:{amenity:"bank",brand:"Banco Provincia","brand:en":"Province Bank","brand:es":"Banco Provincia","brand:wikidata":"Q4856209","brand:wikipedia":"es:Banco de la Provincia de Buenos Aires",name:"Banco Provincia","name:en":"Province Bank","name:es":"Banco Provincia",official_name:"Banco de la Provincia de Buenos Aires","official_name:en":"Bank of the Province of Buenos Aires","official_name:es":"Banco de la Provincia de Buenos Aires"}},"amenity/bank|Banco Sabadell":{countryCodes:["es"],matchNames:["banc sabadell","sabadell"],tags:{amenity:"bank",brand:"Banco Sabadell","brand:en":"Sabadell Bank","brand:es":"Banco Sabadell","brand:wikidata":"Q762330","brand:wikipedia":"es:Banco Sabadell",name:"Banco Sabadell","name:en":"Sabadell Bank","name:es":"Banco Sabadell"}},"amenity/bank|Banco Santa Fe":{countryCodes:["ar"],tags:{amenity:"bank",brand:"Banco Santa Fe","brand:en":"Santa Fe Bank","brand:es":"Banco Santa Fe","brand:wikidata":"Q6046871","brand:wikipedia":"es:Nuevo Banco de Santa Fe",name:"Banco Santa Fe","name:en":"Santa Fe Bank","name:es":"Banco Santa Fe",official_name:"Nuevo Banco de Santa Fe","official_name:en":"New Bank of Santa Fe","official_name:es":"Nuevo Banco de Santa Fe"}},"amenity/bank|Banco Santander":{nomatch:["amenity/bank|Santander"],tags:{amenity:"bank",brand:"Banco Santander","brand:en":"Santander Bank","brand:es":"Banco Santander","brand:wikidata":"Q6496310","brand:wikipedia":"es:Banco Santander",name:"Banco Santander","name:en":"Santander Bank","name:es":"Banco Santander",official_name:"Santander Group"}},"amenity/bank|Banco Sol~(Angola)":{countryCodes:["ao"],tags:{amenity:"bank",brand:"Banco Sol","brand:en":"Sol Bank","brand:pt":"Banco Sol","brand:wikidata":"Q62118744",name:"Banco Sol","name:en":"Sol Bank","name:pt":"Banco Sol"}},"amenity/bank|Banco Sol~(Bolivia)":{countryCodes:["bo"],tags:{amenity:"bank",brand:"Banco Sol","brand:en":"Sol Bank","brand:pt":"Banco Sol","brand:wikidata":"Q62118746",name:"Banco Sol","name:en":"Sol Bank","name:pt":"Banco Sol"}},"amenity/bank|Banco Unión":{countryCodes:["bo"],nomatch:["amenity/bank|UnionBank","amenity/money_transfer|Express Union"],tags:{amenity:"bank",brand:"Banco Unión","brand:en":"Union Bank","brand:es":"Banco Unión",name:"Banco Unión","name:en":"Union Bank","name:es":"Banco Unión"}},"amenity/bank|Banco de Bogotá":{countryCodes:["co"],tags:{amenity:"bank",brand:"Banco de Bogotá","brand:en":"Bank of Bogota","brand:es":"Banco de Bogotá","brand:wikidata":"Q4854122","brand:wikipedia":"es:Banco de Bogotá",name:"Banco de Bogotá","name:en":"Bank of Bogota","name:es":"Banco de Bogotá"}},"amenity/bank|Banco de Chile":{countryCodes:["cl"],tags:{amenity:"bank",brand:"Banco de Chile","brand:en":"Bank of Chile","brand:es":"Banco de Chile","brand:wikidata":"Q2882085","brand:wikipedia":"es:Banco de Chile",name:"Banco de Chile","name:en":"Bank of Chile","name:es":"Banco de Chile"}},"amenity/bank|Banco de Desarrollo Banrural":{countryCodes:["gt"],tags:{amenity:"bank",brand:"Banco de Desarrollo Banrural","brand:en":"Bank of Banrural Development","brand:es":"Banco de Desarrollo Banrural","brand:wikidata":"Q5719130","brand:wikipedia":"es:Banrural",name:"Banco de Desarrollo Banrural","name:en":"Bank of Banrural Development","name:es":"Banco de Desarrollo Banrural"}},"amenity/bank|Banco de Fomento Angola (BFA)":{countryCodes:["ao"],tags:{amenity:"bank",brand:"Banco de Fomento Angola (BFA)","brand:en":"Angola Development Bank (BFA)","brand:es":"Banco de Fomento Angola (BFA)","brand:wikidata":"Q806197","brand:wikipedia":"de:Banco de Fomento Angola",name:"Banco de Fomento Angola (BFA)","name:en":"Angola Development Bank (BFA)","name:es":"Banco de Fomento Angola (BFA)"}},"amenity/bank|Banco de Occidente":{tags:{amenity:"bank",brand:"Banco de Occidente","brand:wikidata":"Q4854127","brand:wikipedia":"es:Banco de Occidente (Colombia)",name:"Banco de Occidente"}},"amenity/bank|Banco de Venezuela":{countryCodes:["ve"],matchNames:["de venezuela"],tags:{amenity:"bank",brand:"Banco de Venezuela","brand:wikidata":"Q517093","brand:wikipedia":"es:Banco de Venezuela",name:"Banco de Venezuela"}},"amenity/bank|Banco de la Nación~(Argentina)":{countryCodes:["ar"],tags:{amenity:"bank",brand:"Banco de la Nación","brand:wikidata":"Q2883376","brand:wikipedia":"en:Banco de la Nación Argentina",name:"Banco de la Nación"}},"amenity/bank|Banco de la Nación~(Peru)":{countryCodes:["pe"],tags:{amenity:"bank",brand:"Banco de la Nación","brand:wikidata":"Q4856206","brand:wikipedia":"en:Bank of the Nation (Peru)",name:"Banco de la Nación"}},"amenity/bank|Banco del Austro":{countryCodes:["ec"],tags:{amenity:"bank",brand:"Banco del Austro","brand:wikidata":"Q62122344",name:"Banco del Austro"}},"amenity/bank|Banco di Napoli":{countryCodes:["it"],tags:{amenity:"bank",brand:"Banco di Napoli","brand:wikidata":"Q3633835","brand:wikipedia":"en:Banco di Napoli",name:"Banco di Napoli"}},"amenity/bank|Banco di Sardegna":{countryCodes:["it"],tags:{amenity:"bank",brand:"Banco di Sardegna","brand:wikidata":"Q806205","brand:wikipedia":"en:Banco di Sardegna",name:"Banco di Sardegna"}},"amenity/bank|Banco do Brasil":{countryCodes:["br"],tags:{amenity:"bank",brand:"Banco do Brasil","brand:wikidata":"Q610817","brand:wikipedia":"en:Banco do Brasil",name:"Banco do Brasil"}},"amenity/bank|Banco do Nordeste":{countryCodes:["br"],tags:{amenity:"bank",brand:"Banco do Nordeste","brand:wikidata":"Q4854137","brand:wikipedia":"en:Banco do Nordeste",name:"Banco do Nordeste"}},"amenity/bank|Bancolombia":{countryCodes:["co"],tags:{amenity:"bank",brand:"Bancolombia","brand:wikidata":"Q806206","brand:wikipedia":"en:Bancolombia",name:"Bancolombia"}},"amenity/bank|Bancomer":{countryCodes:["mx"],tags:{amenity:"bank",brand:"Bancomer","brand:wikidata":"Q2876794","brand:wikipedia":"en:BBVA Bancomer",name:"Bancomer"}},"amenity/bank|Bancpost":{countryCodes:["ro"],nomatch:["amenity/bank|Postbank"],tags:{amenity:"bank",brand:"Bancpost","brand:wikidata":"Q4854143","brand:wikipedia":"ro:Bancpost",name:"Bancpost"}},"amenity/bank|Banesco":{tags:{amenity:"bank",brand:"Banesco","brand:wikidata":"Q4854841","brand:wikipedia":"en:Banesco",name:"Banesco"}},"amenity/bank|Bangkok Bank":{countryCodes:["th"],tags:{amenity:"bank",brand:"Bangkok Bank","brand:wikidata":"Q806483","brand:wikipedia":"en:Bangkok Bank",name:"Bangkok Bank"}},"amenity/bank|Bank Al Habib":{countryCodes:["pk"],tags:{amenity:"bank",brand:"Bank Al Habib","brand:wikidata":"Q4034833","brand:wikipedia":"ur:بينک الحبيب لمیٹڈ",name:"Bank Al Habib"}},"amenity/bank|Bank Alfalah":{countryCodes:["pk"],tags:{amenity:"bank",brand:"Bank Alfalah","brand:wikidata":"Q4855895","brand:wikipedia":"en:Bank Alfalah",name:"Bank Alfalah"}},"amenity/bank|Bank Austria":{countryCodes:["at"],tags:{amenity:"bank",brand:"Bank Austria","brand:wikidata":"Q697619","brand:wikipedia":"en:Bank Austria",name:"Bank Austria"}},"amenity/bank|Bank Danamon":{countryCodes:["id"],tags:{amenity:"bank",brand:"Bank Danamon","brand:wikidata":"Q4855913","brand:wikipedia":"en:Bank Danamon",name:"Bank Danamon"}},"amenity/bank|Bank Mandiri":{countryCodes:["id"],tags:{amenity:"bank",brand:"Bank Mandiri","brand:wikidata":"Q806639","brand:wikipedia":"en:Bank Mandiri",name:"Bank Mandiri"}},"amenity/bank|Bank Mandiri Syariah":{countryCodes:["id"],tags:{amenity:"bank",brand:"Bank Mandiri Syariah","brand:wikidata":"Q12474533","brand:wikipedia":"id:Bank Syariah Mandiri",name:"Bank Mandiri Syariah"}},"amenity/bank|Bank Mega":{countryCodes:["id"],tags:{amenity:"bank",brand:"Bank Mega","brand:wikidata":"Q12474504","brand:wikipedia":"id:Bank Mega",name:"Bank Mega"}},"amenity/bank|Bank Muamalat":{countryCodes:["id","my"],tags:{amenity:"bank",brand:"Bank Muamalat","brand:wikidata":"Q4855949","brand:wikipedia":"en:Bank Muamalat",name:"Bank Muamalat"}},"amenity/bank|Bank Pekao":{countryCodes:["pl"],tags:{amenity:"bank",brand:"Bank Pekao","brand:wikidata":"Q806642","brand:wikipedia":"pl:Bank Polska Kasa Opieki",name:"Bank Pekao"}},"amenity/bank|Bank Rakyat":{countryCodes:["my"],tags:{amenity:"bank",brand:"Bank Rakyat","brand:wikidata":"Q4855964","brand:wikipedia":"ms:Bank Rakyat",name:"Bank Rakyat"}},"amenity/bank|Bank of Africa":{tags:{amenity:"bank",brand:"Bank of Africa","brand:wikidata":"Q2882627","brand:wikipedia":"en:Bank of Africa Group",name:"Bank of Africa",short_name:"BOA"}},"amenity/bank|Bank of America":{countryCodes:["us"],tags:{amenity:"bank",brand:"Bank of America","brand:wikidata":"Q487907","brand:wikipedia":"en:Bank of America",name:"Bank of America"}},"amenity/bank|Bank of Baroda":{tags:{amenity:"bank",brand:"Bank of Baroda","brand:wikidata":"Q2003797","brand:wikipedia":"en:Bank of Baroda",name:"Bank of Baroda"}},"amenity/bank|Bank of Ceylon":{countryCodes:["lk"],tags:{amenity:"bank",brand:"Bank of Ceylon","brand:wikidata":"Q2882652","brand:wikipedia":"en:Bank of Ceylon",name:"Bank of Ceylon"}},"amenity/bank|Bank of Commerce":{countryCodes:["ph"],tags:{amenity:"bank",brand:"Bank of Commerce","brand:wikidata":"Q4856092","brand:wikipedia":"en:Bank of Commerce",name:"Bank of Commerce"}},"amenity/bank|Bank of Cyprus":{countryCodes:["cy","gr"],tags:{amenity:"bank",brand:"Bank of Cyprus","brand:wikidata":"Q806678","brand:wikipedia":"en:Bank of Cyprus",name:"Bank of Cyprus"}},"amenity/bank|Bank of India":{tags:{amenity:"bank",brand:"Bank of India","brand:wikidata":"Q2004439","brand:wikipedia":"en:Bank of India",name:"Bank of India"}},"amenity/bank|Bank of Ireland":{countryCodes:["gb","ie"],tags:{amenity:"bank",brand:"Bank of Ireland","brand:wikidata":"Q806689","brand:wikipedia":"en:Bank of Ireland",name:"Bank of Ireland"}},"amenity/bank|Bank of Maharashtra":{countryCodes:["in"],tags:{amenity:"bank",brand:"Bank of Maharashtra","brand:wikidata":"Q2004304","brand:wikipedia":"en:Bank of Maharashtra",name:"Bank of Maharashtra"}},"amenity/bank|Bank of New Zealand":{countryCodes:["nz"],tags:{amenity:"bank",brand:"Bank of New Zealand","brand:wikidata":"Q806687","brand:wikipedia":"en:Bank of New Zealand",name:"Bank of New Zealand"}},"amenity/bank|Bank of Scotland":{countryCodes:["gb"],tags:{amenity:"bank",brand:"Bank of Scotland","brand:wikidata":"Q627381","brand:wikipedia":"en:Bank of Scotland",name:"Bank of Scotland"}},"amenity/bank|Bank of the West":{countryCodes:["us"],tags:{amenity:"bank",brand:"Bank of the West","brand:wikidata":"Q2881919","brand:wikipedia":"en:Bank of the West",name:"Bank of the West"}},"amenity/bank|Bankia":{countryCodes:["es"],tags:{amenity:"bank",brand:"Bankia","brand:wikidata":"Q806807","brand:wikipedia":"en:Bankia",name:"Bankia"}},"amenity/bank|Bankinter":{countryCodes:["es","pt"],nomatch:["amenity/bank|Interbank"],tags:{amenity:"bank",brand:"Bankinter","brand:wikidata":"Q806808","brand:wikipedia":"es:Bankinter",name:"Bankinter"}},"amenity/bank|Bankwest":{countryCodes:["au"],tags:{amenity:"bank",brand:"Bankwest","brand:wikidata":"Q4856817","brand:wikipedia":"en:Bankwest",name:"Bankwest"}},"amenity/bank|Banner Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"Banner Bank","brand:wikidata":"Q4856910","brand:wikipedia":"en:Banner Bank",name:"Banner Bank"}},"amenity/bank|Banorte":{countryCodes:["mx"],tags:{amenity:"bank",brand:"Banorte","brand:wikidata":"Q806914","brand:wikipedia":"en:Banorte",name:"Banorte"}},"amenity/bank|Banque Atlantique":{tags:{amenity:"bank",brand:"Banque Atlantique","brand:wikidata":"Q2882890","brand:wikipedia":"en:Atlantic Bank Group",name:"Banque Atlantique"}},"amenity/bank|Banque Laurentienne":{countryCodes:["ca"],tags:{amenity:"bank",brand:"Banque Laurentienne","brand:wikidata":"Q1360087","brand:wikipedia":"en:Laurentian Bank of Canada",name:"Banque Laurentienne"}},"amenity/bank|Banque Nationale~(Canada)":{countryCodes:["ca"],matchNames:["banque nationale du canada","national bank of canada"],tags:{amenity:"bank",brand:"Banque Nationale","brand:wikidata":"Q634298","brand:wikipedia":"en:National Bank of Canada",name:"Banque Nationale"}},"amenity/bank|Banque Populaire":{tags:{amenity:"bank",brand:"Banque Populaire","brand:wikidata":"Q2883441","brand:wikipedia":"en:Banque Populaire du Maroc",name:"Banque Populaire"}},"amenity/bank|Banrisul":{countryCodes:["br"],tags:{amenity:"bank",brand:"Banrisul","brand:wikidata":"Q4857098","brand:wikipedia":"en:Banrisul",name:"Banrisul"}},"amenity/bank|Banrural":{countryCodes:["gt","hn"],tags:{amenity:"bank",brand:"Banrural","brand:wikidata":"Q5719130","brand:wikipedia":"es:Banrural",name:"Banrural"}},"amenity/bank|Barclays":{matchNames:["barclays bank"],tags:{amenity:"bank",brand:"Barclays","brand:wikidata":"Q245343","brand:wikipedia":"en:Barclays",name:"Barclays"}},"amenity/bank|Bcc":{countryCodes:["it"],tags:{amenity:"bank",brand:"Bcc","brand:wikidata":"Q25060394","brand:wikipedia":"en:Banca di Credito Cooperativo di Roma",name:"Bcc"}},"amenity/bank|Belfius":{countryCodes:["be"],tags:{amenity:"bank",brand:"Belfius","brand:wikidata":"Q1956014","brand:wikipedia":"en:Belfius",name:"Belfius"}},"amenity/bank|Bendigo Bank":{countryCodes:["au"],tags:{amenity:"bank",brand:"Bendigo Bank","brand:wikidata":"Q4887077","brand:wikipedia":"en:Bendigo and Adelaide Bank",name:"Bendigo Bank"}},"amenity/bank|Berliner Volksbank":{countryCodes:["de"],tags:{amenity:"bank",brand:"Berliner Volksbank","brand:wikidata":"Q821855","brand:wikipedia":"de:Berliner Volksbank",name:"Berliner Volksbank"}},"amenity/bank|Bicentenario":{countryCodes:["ve"],tags:{amenity:"bank",brand:"Bicentenario","brand:wikidata":"Q5728123","brand:wikipedia":"es:Bicentenario Banco Universal",name:"Bicentenario"}},"amenity/bank|Bicici":{countryCodes:["ci"],matchNames:["agence bicici"],tags:{amenity:"bank",brand:"Bicici","brand:wikidata":"Q1667302","brand:wikipedia":"fr:Banque internationale pour le commerce et l'industrie de la Côte d'Ivoire",name:"Bicici"}},"amenity/bank|Bradesco":{countryCodes:["br"],matchNames:["banco bradesco"],tags:{amenity:"bank",brand:"Bradesco","brand:wikidata":"Q806181","brand:wikipedia":"en:Banco Bradesco",name:"Bradesco"}},"amenity/bank|Budapest Bank":{countryCodes:["hu"],tags:{amenity:"bank",brand:"Budapest Bank","brand:wikidata":"Q27493463","brand:wikipedia":"en:Budapest Bank",name:"Budapest Bank"}},"amenity/bank|CBAO":{countryCodes:["sn"],tags:{amenity:"bank",brand:"CBAO","brand:wikidata":"Q532104","brand:wikipedia":"fr:CBAO Groupe Attijariwafa bank",name:"CBAO"}},"amenity/bank|CEC Bank":{countryCodes:["ro"],tags:{amenity:"bank",brand:"CEC Bank","brand:wikidata":"Q1023306","brand:wikipedia":"en:CEC Bank",name:"CEC Bank"}},"amenity/bank|CIB Bank":{tags:{amenity:"bank",brand:"CIB Bank","brand:wikidata":"Q839566","brand:wikipedia":"en:CIB Bank",name:"CIB Bank"}},"amenity/bank|CIBC":{countryCodes:["ca"],matchNames:["cibc banking centre"],tags:{amenity:"bank",brand:"CIBC","brand:wikidata":"Q666694","brand:wikipedia":"en:Canadian Imperial Bank of Commerce",name:"CIBC"}},"amenity/bank|CIC":{countryCodes:["fr"],tags:{amenity:"bank",brand:"CIC","brand:wikidata":"Q746525","brand:wikipedia":"en:Crédit Industriel et Commercial",name:"CIC"}},"amenity/bank|CIH Bank":{countryCodes:["ma"],tags:{amenity:"bank",brand:"CIH Bank","brand:wikidata":"Q3006220","brand:wikipedia":"en:CIH Bank",name:"CIH Bank"}},"amenity/bank|CIMB Bank":{countryCodes:["my"],tags:{amenity:"bank",brand:"CIMB Bank","brand:wikidata":"Q3045976","brand:wikipedia":"en:CIMB",name:"CIMB Bank"}},"amenity/bank|CIMB Niaga":{countryCodes:["id"],tags:{amenity:"bank",brand:"CIMB Niaga","brand:wikidata":"Q5011747","brand:wikipedia":"en:CIMB Niaga",name:"CIMB Niaga"}},"amenity/bank|CNEP":{countryCodes:["dz"],tags:{amenity:"bank",brand:"CNEP","brand:wikidata":"Q2931752","brand:wikipedia":"fr:CNEP-Banque",name:"CNEP"}},"amenity/bank|CRDB Bank":{countryCodes:["tz"],tags:{amenity:"bank",brand:"CRDB Bank","brand:wikidata":"Q5013848","brand:wikipedia":"en:CRDB Bank",name:"CRDB Bank"}},"amenity/bank|Caisse Desjardins":{countryCodes:["ca"],tags:{amenity:"bank",brand:"Caisse Desjardins","brand:wikidata":"Q2933350","brand:wikipedia":"en:Desjardins Group",name:"Caisse Desjardins"}},"amenity/bank|Caisse d'Épargne":{tags:{amenity:"bank",brand:"Caisse d'Épargne","brand:wikidata":"Q1547738","brand:wikipedia":"en:Groupe Caisse d'Épargne",name:"Caisse d'Épargne"}},"amenity/bank|Caixa Econômica Federal~(Brazil)":{countryCodes:["br"],matchNames:["caixa","caixabank"],nomatch:["amenity/bank|Caixabank~(Spain)"],tags:{amenity:"bank",brand:"Caixa Econômica Federal","brand:wikidata":"Q835283","brand:wikipedia":"pt:Caixa Econômica Federal",name:"Caixa Econômica Federal"}},"amenity/bank|Caixa Geral de Depósitos":{countryCodes:["es","fr","pt"],tags:{amenity:"bank",brand:"Caixa Geral de Depósitos","brand:wikidata":"Q1026044","brand:wikipedia":"pt:Caixa Geral de Depósitos",name:"Caixa Geral de Depósitos"}},"amenity/bank|Caixabank~(Spain)":{countryCodes:["es"],nomatch:["amenity/bank|Caixa Econômica Federal~(Brazil)"],tags:{amenity:"bank",brand:"Caixabank","brand:wikidata":"Q847225","brand:wikipedia":"en:CaixaBank",name:"Caixabank"}},"amenity/bank|Caja Duero":{countryCodes:["es"],tags:{amenity:"bank",brand:"Caja Duero","brand:wikidata":"Q3821055","brand:wikipedia":"es:Caja Duero",name:"Caja Duero"}},"amenity/bank|Caja España":{countryCodes:["es"],tags:{amenity:"bank",brand:"Caja España","brand:wikidata":"Q966985","brand:wikipedia":"es:Caja España",name:"Caja España"}},"amenity/bank|Caja Rural":{countryCodes:["es"],tags:{amenity:"bank",brand:"Caja Rural","brand:wikidata":"Q3649971","brand:wikipedia":"es:Caja Rural",name:"Caja Rural"}},"amenity/bank|Caja Rural de Jaén":{countryCodes:["es"],tags:{amenity:"bank",brand:"Caja Rural de Jaén","brand:wikidata":"Q18720350","brand:wikipedia":"es:Caja Rural de Jaén",name:"Caja Rural de Jaén"}},"amenity/bank|CajaSur":{countryCodes:["es"],tags:{amenity:"bank",brand:"CajaSur","brand:wikidata":"Q3751637","brand:wikipedia":"en:CajaSur",name:"CajaSur"}},"amenity/bank|Cajamar":{countryCodes:["es"],tags:{amenity:"bank",brand:"Cajamar","brand:wikidata":"Q8254971","brand:wikipedia":"es:Cajamar",name:"Cajamar"}},"amenity/bank|Canara Bank":{countryCodes:["in"],tags:{amenity:"bank",brand:"Canara Bank","brand:wikidata":"Q2003777","brand:wikipedia":"en:Canara Bank",name:"Canara Bank"}},"amenity/bank|Capital Bank":{tags:{amenity:"bank",brand:"Capital Bank","brand:wikidata":"Q5035481","brand:wikipedia":"en:Capital Bank Financial",name:"Capital Bank"}},"amenity/bank|Capital One":{countryCodes:["us"],matchNames:["capital one bank"],tags:{amenity:"bank",brand:"Capital One","brand:wikidata":"Q1034654","brand:wikipedia":"en:Capital One",name:"Capital One"}},"amenity/bank|Carige":{countryCodes:["it"],tags:{amenity:"bank",brand:"Carige","brand:wikidata":"Q3633695","brand:wikipedia":"en:Banca Carige",name:"Carige"}},"amenity/bank|Cariparma":{countryCodes:["it"],tags:{amenity:"bank",brand:"Cariparma","brand:wikidata":"Q2938832","brand:wikipedia":"en:Crédit Agricole Italia",name:"Cariparma"}},"amenity/bank|Carisbo":{countryCodes:["it"],tags:{amenity:"bank",brand:"Carisbo","brand:wikidata":"Q3661937","brand:wikipedia":"en:Cassa di Risparmio in Bologna",name:"Carisbo"}},"amenity/bank|Cassa di Risparmio del Veneto":{countryCodes:["it"],tags:{amenity:"bank",brand:"Cassa di Risparmio del Veneto","brand:wikidata":"Q3661909","brand:wikipedia":"en:Cassa di Risparmio del Veneto",name:"Cassa di Risparmio del Veneto"}},"amenity/bank|CatalunyaCaixa":{countryCodes:["es"],tags:{amenity:"bank",brand:"CatalunyaCaixa","brand:wikidata":"Q3750952","brand:wikipedia":"en:CatalunyaCaixa",name:"CatalunyaCaixa"}},"amenity/bank|Cathay Bank":{countryCodes:["cn","tw","us"],tags:{amenity:"bank",brand:"Cathay Bank","brand:wikidata":"Q4189507","brand:wikipedia":"en:Cathay Bank",name:"Cathay Bank"}},"amenity/bank|Central Bank":{tags:{amenity:"bank",brand:"Central Bank",name:"Central Bank"}},"amenity/bank|Central Bank of India":{countryCodes:["in"],tags:{amenity:"bank",brand:"Central Bank of India","brand:wikidata":"Q2007090","brand:wikipedia":"en:Central Bank of India",name:"Central Bank of India"}},"amenity/bank|Chase":{matchNames:["chase bank"],tags:{amenity:"bank",brand:"Chase","brand:wikidata":"Q524629","brand:wikipedia":"en:Chase Bank",name:"Chase"}},"amenity/bank|China Bank":{tags:{amenity:"bank",brand:"China Bank","brand:wikidata":"Q5100080","brand:wikipedia":"en:Chinabank",name:"China Bank"}},"amenity/bank|China Bank Savings":{countryCodes:["ph"],tags:{amenity:"bank",brand:"China Bank Savings","brand:wikidata":"Q18387359","brand:wikipedia":"en:China Bank Savings",name:"China Bank Savings"}},"amenity/bank|China Construction Bank":{tags:{amenity:"bank",brand:"China Construction Bank","brand:wikidata":"Q26299","brand:wikipedia":"en:China Construction Bank",name:"China Construction Bank"}},"amenity/bank|Citibank":{tags:{amenity:"bank",brand:"Citibank","brand:wikidata":"Q857063","brand:wikipedia":"en:Citibank",name:"Citibank",short_name:"Citi"}},"amenity/bank|Citizens Bank~(Eastern USA)":{countryCodes:["us"],tags:{amenity:"bank",brand:"Citizens Bank","brand:wikidata":"Q5122694","brand:wikipedia":"en:Citizens Financial Group",name:"Citizens Bank",short_name:"Citizens"}},"amenity/bank|Citizens Bank~(Kentucky)":{countryCodes:["us"],tags:{alt_name:"Citizens Bank of Kentucky",amenity:"bank",brand:"Citizens Bank","brand:wikidata":"Q5122711","brand:wikipedia":"en:Citizens National Bank (Eastern Kentucky)",name:"Citizens Bank",official_name:"Citizens National Bank",short_name:"Citizens"}},"amenity/bank|Citizens Bank~(Nepal)":{countryCodes:["np"],tags:{amenity:"bank",brand:"Citizens Bank International","brand:wikidata":"Q13186934","brand:wikipedia":"en:Citizens Bank International",name:"Citizens Bank",official_name:"Citizens Bank International Ltd.",short_name:"Citizens"}},"amenity/bank|City National Bank~(California)":{countryCodes:["us"],tags:{amenity:"bank",brand:"City National Bank","brand:wikidata":"Q5123314","brand:wikipedia":"en:City National Bank (California)",name:"City National Bank"}},"amenity/bank|City National Bank~(Florida)":{countryCodes:["us"],tags:{amenity:"bank",brand:"City National Bank","brand:wikidata":"Q16958644","brand:wikipedia":"en:City National Bank of Florida",name:"City National Bank",official_name:"City National Bank of Florida"}},"amenity/bank|Clydesdale Bank":{countryCodes:["gb"],tags:{amenity:"bank",brand:"Clydesdale Bank","brand:wikidata":"Q971680","brand:wikipedia":"en:Clydesdale Bank",name:"Clydesdale Bank"}},"amenity/bank|Coast Capital Savings":{countryCodes:["ca"],matchNames:["coast capital","coast capital savings credit union"],tags:{amenity:"bank",brand:"Coast Capital Savings","brand:wikidata":"Q5138088","brand:wikipedia":"en:Coast Capital Savings",name:"Coast Capital Savings",official_name:"Coast Capital Savings Federal Credit Union"}},"amenity/bank|Columbia Bank~(New Jersey)":{countryCodes:["us"],nomatch:["amenity/bank|Columbia Bank~(Washington)","shop/clothes|Columbia"],tags:{amenity:"bank",brand:"Columbia Bank","brand:wikidata":"Q62084096",name:"Columbia Bank"}},"amenity/bank|Columbia Bank~(Washington)":{countryCodes:["us"],nomatch:["amenity/bank|Columbia Bank~(New Jersey)","shop/clothes|Columbia"],tags:{amenity:"bank",brand:"Columbia Bank","brand:wikidata":"Q62084089",name:"Columbia Bank"}},"amenity/bank|Comerica Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"Comerica Bank","brand:wikidata":"Q1114148","brand:wikipedia":"en:Comerica",name:"Comerica Bank"}},"amenity/bank|Commerce Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"Commerce Bank",name:"Commerce Bank"}},"amenity/bank|Commercial Bank":{tags:{amenity:"bank",brand:"Commercial Bank",name:"Commercial Bank"}},"amenity/bank|Commercial Bank of Ceylon PLC":{countryCodes:["lk"],tags:{amenity:"bank",brand:"Commercial Bank of Ceylon PLC","brand:wikidata":"Q5152468","brand:wikipedia":"en:Commercial Bank of Ceylon",name:"Commercial Bank of Ceylon PLC"}},"amenity/bank|Commerzbank":{countryCodes:["de"],tags:{amenity:"bank",brand:"Commerzbank","brand:wikidata":"Q157617","brand:wikipedia":"en:Commerzbank",name:"Commerzbank"}},"amenity/bank|Commonwealth Bank":{tags:{amenity:"bank",brand:"Commonwealth Bank","brand:wikidata":"Q285328","brand:wikipedia":"en:Commonwealth Bank",name:"Commonwealth Bank"}},"amenity/bank|Community Bank":{countryCodes:["de","us"],tags:{amenity:"bank",brand:"Community Bank","brand:wikidata":"Q5154635","brand:wikipedia":"en:Community Bank, N.A.",name:"Community Bank"}},"amenity/bank|Corporation Bank":{countryCodes:["in"],tags:{amenity:"bank",brand:"Corporation Bank","brand:wikidata":"Q2003387","brand:wikipedia":"en:Corporation Bank",name:"Corporation Bank"}},"amenity/bank|Credem":{countryCodes:["it"],tags:{amenity:"bank",brand:"Credem","brand:wikidata":"Q3696881","brand:wikipedia":"en:Credito Emiliano",name:"Credem"}},"amenity/bank|Credicoop":{countryCodes:["ar"],tags:{amenity:"bank",brand:"Credicoop","brand:wikidata":"Q4854086","brand:wikipedia":"en:Banco Credicoop",name:"Credicoop"}},"amenity/bank|Credit Suisse":{countryCodes:["ch"],tags:{amenity:"bank",brand:"Credit Suisse","brand:wikidata":"Q372657","brand:wikipedia":"en:Credit Suisse",name:"Credit Suisse"}},"amenity/bank|Credito Valtellinese":{countryCodes:["it"],tags:{amenity:"bank",brand:"Credito Valtellinese","brand:wikidata":"Q3696888","brand:wikipedia":"en:Credito Valtellinese",name:"Credito Valtellinese"}},"amenity/bank|Crelan":{countryCodes:["be"],tags:{amenity:"bank",brand:"Crelan","brand:wikidata":"Q389872","brand:wikipedia":"en:Crelan",name:"Crelan"}},"amenity/bank|Crédit Agricole":{tags:{amenity:"bank",brand:"Crédit Agricole","brand:wikidata":"Q590952","brand:wikipedia":"fr:Crédit agricole",name:"Crédit Agricole"}},"amenity/bank|Crédit Maritime":{countryCodes:["fr"],tags:{amenity:"bank",brand:"Crédit Maritime","brand:wikidata":"Q17176866","brand:wikipedia":"fr:Crédit maritime",name:"Crédit Maritime"}},"amenity/bank|Crédit Mutuel":{tags:{amenity:"bank",brand:"Crédit Mutuel","brand:wikidata":"Q642627","brand:wikipedia":"en:Crédit Mutuel",name:"Crédit Mutuel"}},"amenity/bank|Crédit Mutuel de Bretagne":{countryCodes:["fr"],tags:{amenity:"bank",brand:"Crédit Mutuel de Bretagne","brand:wikidata":"Q3006236","brand:wikipedia":"fr:Crédit mutuel Arkéa",name:"Crédit Mutuel de Bretagne"}},"amenity/bank|Crédit du Nord":{countryCodes:["fr"],tags:{amenity:"bank",brand:"Crédit du Nord","brand:wikidata":"Q3006209","brand:wikipedia":"en:Crédit du Nord",name:"Crédit du Nord"}},"amenity/bank|Crédito Agrícola":{countryCodes:["pt"],tags:{amenity:"bank",brand:"Crédito Agrícola","brand:wikidata":"Q10262017","brand:wikipedia":"pt:Crédito Agrícola",name:"Crédito Agrícola"}},"amenity/bank|Danske Bank":{countryCodes:["dk","fi","gb","lt","no","se"],tags:{amenity:"bank",brand:"Danske Bank","brand:wikidata":"Q1636974","brand:wikipedia":"en:Danske Bank",name:"Danske Bank"}},"amenity/bank|Davivienda":{tags:{amenity:"bank",brand:"Davivienda","brand:wikidata":"Q5242054","brand:wikipedia":"en:Davivienda",name:"Davivienda"}},"amenity/bank|Denizbank":{tags:{amenity:"bank",brand:"Denizbank","brand:wikidata":"Q1115064","brand:wikipedia":"en:DenizBank",name:"Denizbank"}},"amenity/bank|Desjardins":{countryCodes:["ca"],tags:{amenity:"bank",brand:"Desjardins","brand:wikidata":"Q2933350","brand:wikipedia":"en:Desjardins Group",name:"Desjardins"}},"amenity/bank|Deutsche Bank":{tags:{amenity:"bank",brand:"Deutsche Bank","brand:wikidata":"Q66048","brand:wikipedia":"en:Deutsche Bank",name:"Deutsche Bank"}},"amenity/bank|Dollar Bank":{countryCodes:["us"],nomatch:["amenity/car_rental|Dollar","shop/variety_store|Dollar General","shop/variety_store|Dollar Tree","shop/variety_store|Dollarama","shop/variety_store|Family Dollar"],tags:{amenity:"bank",brand:"Dollar Bank","brand:wikidata":"Q5289205","brand:wikipedia":"en:Dollar Bank",name:"Dollar Bank"}},"amenity/bank|Dubai Islamic Bank":{tags:{amenity:"bank",brand:"Dubai Islamic Bank","brand:wikidata":"Q5310570","brand:wikipedia":"en:Dubai Islamic Bank",name:"Dubai Islamic Bank"}},"amenity/bank|EastWest Bank":{tags:{amenity:"bank",brand:"EastWest Bank","brand:wikidata":"Q5327595","brand:wikipedia":"en:EastWest Bank",name:"EastWest Bank"}},"amenity/bank|EastWest Unibank":{countryCodes:["ph"],tags:{amenity:"bank",brand:"EastWest Unibank","brand:wikidata":"Q5327595","brand:wikipedia":"en:EastWest Bank",name:"EastWest Unibank"}},"amenity/bank|Ecobank":{matchNames:["agence ecobank"],tags:{amenity:"bank",brand:"Ecobank","brand:wikidata":"Q930225","brand:wikipedia":"en:Ecobank",name:"Ecobank"}},"amenity/bank|Emigrant Savings Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"Emigrant Savings Bank","brand:wikidata":"Q5371104","brand:wikipedia":"en:Emigrant Savings Bank",name:"Emigrant Savings Bank"}},"amenity/bank|Emirates NBD":{countryCodes:["ae"],tags:{amenity:"bank",brand:"Emirates NBD","brand:wikidata":"Q5372575","brand:wikipedia":"en:Emirates NBD",name:"Emirates NBD"}},"amenity/bank|Equity Bank~(Congo)":{countryCodes:["cd"],tags:{amenity:"bank",brand:"Equity Bank","brand:wikidata":"Q21178738","brand:wikipedia":"en:Equity Bank Congo",name:"Equity Bank"}},"amenity/bank|Equity Bank~(Kenya)":{countryCodes:["ke"],tags:{amenity:"bank",brand:"Equity Bank","brand:wikidata":"Q5384664","brand:wikipedia":"en:Equity Bank Kenya Limited",name:"Equity Bank"}},"amenity/bank|Equity Bank~(Rwanda)":{countryCodes:["rw"],tags:{amenity:"bank",brand:"Equity Bank","brand:wikidata":"Q5384665","brand:wikipedia":"en:Equity Bank Rwanda Limited",name:"Equity Bank"}},"amenity/bank|Equity Bank~(South Sudan)":{countryCodes:["ss"],tags:{amenity:"bank",brand:"Equity Bank","brand:wikidata":"Q5384666","brand:wikipedia":"en:Equity Bank South Sudan Limited",name:"Equity Bank"}},"amenity/bank|Equity Bank~(Tanzania)":{countryCodes:["tz"],tags:{amenity:"bank",brand:"Equity Bank","brand:wikidata":"Q5384667","brand:wikipedia":"en:Equity Bank Tanzania Limited",name:"Equity Bank"}},"amenity/bank|Equity Bank~(USA)":{countryCodes:["us"],tags:{amenity:"bank",brand:"Equity Bank","brand:wikidata":"Q62260414",name:"Equity Bank"}},"amenity/bank|Equity Bank~(Uganda)":{countryCodes:["ug"],tags:{amenity:"bank",brand:"Equity Bank","brand:wikidata":"Q5384668","brand:wikipedia":"en:Equity Bank Uganda Limited",name:"Equity Bank"}},"amenity/bank|Erste Bank":{countryCodes:["at","hr","hu"],tags:{amenity:"bank",brand:"Erste Bank","brand:wikidata":"Q696867","brand:wikipedia":"de:Erste Bank",name:"Erste Bank"}},"amenity/bank|Eurobank~(Greece)":{countryCodes:["gr"],matchNames:["eurobank ergasias"],tags:{amenity:"bank",brand:"Eurobank","brand:wikidata":"Q951850","brand:wikipedia":"el:Eurobank",name:"Eurobank"}},"amenity/bank|Eurobank~(Poland)":{countryCodes:["pl"],tags:{amenity:"bank",brand:"Eurobank","brand:wikidata":"Q9256201","brand:wikipedia":"pl:Euro Bank",name:"Eurobank"}},"amenity/bank|Eurobank~(Serbia)":{countryCodes:["rs"],tags:{amenity:"bank",brand:"Eurobank","brand:wikidata":"Q5411684","brand:wikipedia":"sr:Eurobanka",name:"Eurobank"}},"amenity/bank|FNB~(South Africa)":{countryCodes:["bw","mz","na","us","za","zm"],tags:{amenity:"bank",brand:"FNB","brand:wikidata":"Q3072956","brand:wikipedia":"en:First National Bank (South Africa)",name:"FNB",official_name:"First National Bank"}},"amenity/bank|Faysal Bank":{countryCodes:["pk"],tags:{amenity:"bank",brand:"Faysal Bank","brand:wikidata":"Q5439099","brand:wikipedia":"en:Faysal Bank",name:"Faysal Bank"}},"amenity/bank|Federal Bank":{countryCodes:["in"],tags:{amenity:"bank",brand:"Federal Bank","brand:wikidata":"Q2044983","brand:wikipedia":"en:Federal Bank",name:"Federal Bank"}},"amenity/bank|Fidelity Bank~(Ghana)":{countryCodes:["gh"],tags:{amenity:"bank",brand:"Fidelity Bank","brand:wikidata":"Q5446778","brand:wikipedia":"en:Fidelity Bank Ghana",name:"Fidelity Bank"}},"amenity/bank|Fidelity Bank~(Nigeria)":{countryCodes:["ng"],tags:{amenity:"bank",brand:"Fidelity Bank","brand:wikidata":"Q5446777","brand:wikipedia":"en:Fidelity Bank Nigeria",name:"Fidelity Bank"}},"amenity/bank|Fidelity Bank~(USA)":{countryCodes:["us"],tags:{amenity:"bank",brand:"Fidelity Bank","brand:wikidata":"Q1411292","brand:wikipedia":"en:Fidelity Investments",name:"Fidelity Bank"}},"amenity/bank|Fifth Third Bank":{countryCodes:["us"],matchNames:["5/3"],tags:{amenity:"bank",brand:"Fifth Third Bank","brand:wikidata":"Q1411810","brand:wikipedia":"en:Fifth Third Bank",name:"Fifth Third Bank",short_name:"5/3 Bank"}},"amenity/bank|Finansbank":{countryCodes:["tr"],tags:{amenity:"bank",brand:"Finansbank","brand:wikidata":"Q1416237","brand:wikipedia":"en:Finansbank",name:"Finansbank"}},"amenity/bank|First Bank~(Western USA)":{countryCodes:["us"],tags:{amenity:"bank",brand:"First Bank","brand:wikidata":"Q5452217","brand:wikipedia":"en:FirstBank Holding Co",name:"First Bank",short_name:"1STBank"}},"amenity/bank|First Citizens Bank~(Trinidad and Tobago)":{countryCodes:["bb","tt"],matchNames:["1st citizens bank"],tags:{amenity:"bank",brand:"First Citizens Bank","brand:wikidata":"Q5452734","brand:wikipedia":"en:First Citizens Bank (Trinidad and Tobago)",name:"First Citizens Bank"}},"amenity/bank|First Citizens Bank~(USA)":{countryCodes:["us"],matchNames:["1st citizens bank"],tags:{amenity:"bank",brand:"First Citizens Bank","brand:wikidata":"Q5452733","brand:wikipedia":"en:First Citizens BancShares",name:"First Citizens Bank"}},"amenity/bank|First Financial Bank":{countryCodes:["us"],matchNames:["1st financial bank"],tags:{amenity:"bank",brand:"First Financial Bank","brand:wikidata":"Q5453009","brand:wikipedia":"en:First Financial Bank (Ohio)",name:"First Financial Bank"}},"amenity/bank|First Midwest Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"First Midwest Bank","brand:wikidata":"Q5453331","brand:wikipedia":"en:First Midwest Bank",name:"First Midwest Bank"}},"amenity/bank|First National Bank~(USA)":{countryCodes:["us"],tags:{amenity:"bank",brand:"First National Bank","brand:wikidata":"Q5426765","brand:wikipedia":"en:F.N.B. Corporation",name:"First National Bank"}},"amenity/bank|First State Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"First State Bank",name:"First State Bank"}},"amenity/bank|First West Credit Union":{countryCodes:["ca"],tags:{alt_name:"First West",amenity:"bank",brand:"First West Credit Union","brand:wikidata":"Q5454073","brand:wikipedia":"en:First West Credit Union",name:"First West Credit Union"}},"amenity/bank|Frost Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"Frost Bank","brand:wikidata":"Q5506152","brand:wikipedia":"en:Frost Bank",name:"Frost Bank"}},"amenity/bank|Fulton Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"Fulton Bank","brand:wikidata":"Q16976594",name:"Fulton Bank"}},"amenity/bank|GCB Bank":{countryCodes:["gh"],tags:{amenity:"bank",brand:"GCB Bank","brand:wikidata":"Q1521346","brand:wikipedia":"en:GCB Bank",name:"GCB Bank"}},"amenity/bank|Galicia":{countryCodes:["ar"],tags:{amenity:"bank",brand:"Galicia","brand:wikidata":"Q5717952","brand:wikipedia":"es:Banco Galicia",name:"Galicia"}},"amenity/bank|Garanti":{countryCodes:["tr"],tags:{amenity:"bank",brand:"Garanti","brand:wikidata":"Q322962","brand:wikipedia":"en:Garanti Bank",name:"Garanti"}},"amenity/bank|Garanti Bankası":{tags:{amenity:"bank",brand:"Garanti Bankası","brand:wikidata":"Q322962","brand:wikipedia":"en:Garanti Bank",name:"Garanti Bankası"}},"amenity/bank|Getin Bank":{countryCodes:["pl"],tags:{amenity:"bank",brand:"Getin Bank","brand:wikidata":"Q9267646","brand:wikipedia":"pl:Getin Bank",name:"Getin Bank"}},"amenity/bank|Golden 1 Credit Union":{countryCodes:["us"],matchNames:["golden 1","golden one","golden one credit union","the golden 1 credit union","the golden one credit union"],tags:{amenity:"bank",brand:"Golden 1 Credit Union","brand:wikidata":"Q7736976","brand:wikipedia":"en:Golden 1 Credit Union",name:"Golden 1 Credit Union"}},"amenity/bank|Great Western Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"Great Western Bank","brand:wikidata":"Q5600185","brand:wikipedia":"en:Great Western Bank (1907–present)",name:"Great Western Bank"}},"amenity/bank|Groupama":{tags:{amenity:"bank",brand:"Groupama","brand:wikidata":"Q3083531","brand:wikipedia":"en:Groupama",name:"Groupama"}},"amenity/bank|HBL Bank":{countryCodes:["pk"],matchNames:["hbl"],tags:{amenity:"bank",brand:"HBL Bank","brand:wikidata":"Q1566843","brand:wikipedia":"ur:ایچ بی ایل پاکستان",name:"HBL Bank"}},"amenity/bank|HDFC Bank":{tags:{amenity:"bank",brand:"HDFC Bank","brand:wikidata":"Q631047","brand:wikipedia":"en:HDFC Bank",name:"HDFC Bank"}},"amenity/bank|HNB":{tags:{amenity:"bank",brand:"HNB","brand:wikidata":"Q3532080","brand:wikipedia":"en:Hatton National Bank",name:"HNB"}},"amenity/bank|HSBC UK~(UK)":{countryCodes:["gb"],tags:{amenity:"bank",brand:"HSBC UK","brand:wikidata":"Q64767453",name:"HSBC UK"}},"amenity/bank|HSBC~(Global)":{tags:{amenity:"bank",brand:"HSBC","brand:wikidata":"Q190464","brand:wikipedia":"en:HSBC",name:"HSBC"}},"amenity/bank|Halifax":{countryCodes:["gb"],tags:{amenity:"bank",brand:"Halifax","brand:wikidata":"Q3310164","brand:wikipedia":"en:Halifax (bank)",name:"Halifax"}},"amenity/bank|Halkbank":{tags:{amenity:"bank",brand:"Halkbank","brand:wikidata":"Q3593818","brand:wikipedia":"en:Halkbank a.d.",name:"Halkbank"}},"amenity/bank|Handelsbanken":{countryCodes:["dk","fi","gb","no","se"],tags:{amenity:"bank",brand:"Handelsbanken","brand:wikidata":"Q1421630","brand:wikipedia":"en:Handelsbanken",name:"Handelsbanken"}},"amenity/bank|Heritage Bank":{tags:{amenity:"bank",brand:"Heritage Bank","brand:wikidata":"Q5738690","brand:wikipedia":"en:Heritage Bank",name:"Heritage Bank"}},"amenity/bank|Hong Leong Bank":{countryCodes:["my"],tags:{amenity:"bank",brand:"Hong Leong Bank","brand:wikidata":"Q4383943","brand:wikipedia":"en:Hong Leong Bank",name:"Hong Leong Bank"}},"amenity/bank|Hrvatska poštanska banka":{countryCodes:["hr"],tags:{amenity:"bank",brand:"Hrvatska poštanska banka","brand:wikidata":"Q5923981","brand:wikipedia":"en:Hrvatska poštanska banka",name:"Hrvatska poštanska banka"}},"amenity/bank|Huntington Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"Huntington Bank","brand:wikidata":"Q798819","brand:wikipedia":"en:Huntington Bancshares",name:"Huntington Bank"}},"amenity/bank|HypoVereinsbank":{countryCodes:["de"],tags:{amenity:"bank",brand:"HypoVereinsbank","brand:wikidata":"Q220189","brand:wikipedia":"en:HypoVereinsbank",name:"HypoVereinsbank"}},"amenity/bank|ICBC":{tags:{amenity:"bank",brand:"ICBC","brand:wikidata":"Q26463","brand:wikipedia":"en:Industrial and Commercial Bank of China",name:"ICBC"}},"amenity/bank|ICICI Bank":{countryCodes:["ca","gb","in"],tags:{amenity:"bank",brand:"ICICI Bank","brand:wikidata":"Q1653258","brand:wikipedia":"en:ICICI Bank",name:"ICICI Bank"}},"amenity/bank|IDBI Bank":{countryCodes:["in"],tags:{amenity:"bank",brand:"IDBI Bank","brand:wikidata":"Q3633485","brand:wikipedia":"en:IDBI Bank",name:"IDBI Bank"}},"amenity/bank|ING":{matchNames:["ing bank"],tags:{amenity:"bank",brand:"ING","brand:wikidata":"Q645708","brand:wikipedia":"en:ING Group",name:"ING"}},"amenity/bank|ING Bank Śląski":{countryCodes:["pl"],tags:{amenity:"bank",brand:"ING Bank Śląski","brand:wikidata":"Q1410383","brand:wikipedia":"pl:ING Bank Śląski",name:"ING Bank Śląski"}},"amenity/bank|Ibercaja":{countryCodes:["es"],tags:{amenity:"bank",brand:"Ibercaja","brand:wikidata":"Q5907815","brand:wikipedia":"es:Ibercaja",name:"Ibercaja"}},"amenity/bank|Indian Bank":{countryCodes:["in"],tags:{amenity:"bank",brand:"Indian Bank","brand:wikidata":"Q2003789","brand:wikipedia":"en:Indian Bank",name:"Indian Bank"}},"amenity/bank|Indian Overseas Bank":{countryCodes:["in"],tags:{amenity:"bank",brand:"Indian Overseas Bank","brand:wikidata":"Q2003611","brand:wikipedia":"en:Indian Overseas Bank",name:"Indian Overseas Bank"}},"amenity/bank|Interbank":{nomatch:["amenity/bank|Bankinter"],tags:{amenity:"bank",brand:"Interbank","brand:wikidata":"Q2835558","brand:wikipedia":"es:Banco Interbank",name:"Interbank"}},"amenity/bank|Intesa Sanpaolo":{tags:{amenity:"bank",brand:"Intesa Sanpaolo","brand:wikidata":"Q1343118","brand:wikipedia":"it:Intesa Sanpaolo",name:"Intesa Sanpaolo"}},"amenity/bank|Investors Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"Investors Bank","brand:wikidata":"Q15109896","brand:wikipedia":"en:Investors Bank",name:"Investors Bank"}},"amenity/bank|Itaú~(Brazil)":{countryCodes:["br"],matchNames:["banco itau"],nomatch:["amenity/bank|Itaú~(Brazil)"],tags:{amenity:"bank",brand:"Itaú Unibanco","brand:wikidata":"Q1424293","brand:wikipedia":"pt:Itaú Unibanco",name:"Itaú"}},"amenity/bank|Itaú~(Chile)":{countryCodes:["cl"],matchNames:["banco itau"],nomatch:["amenity/bank|Itaú~(Chile)"],tags:{amenity:"bank",brand:"Itaú Corpbanca","brand:wikidata":"Q2423252","brand:wikipedia":"en:Itaú Corpbanca",name:"Itaú"}},"amenity/bank|JS Bank":{countryCodes:["pk"],tags:{amenity:"bank",brand:"JS Bank","brand:wikidata":"Q6108986","brand:wikipedia":"en:JS Bank",name:"JS Bank"}},"amenity/bank|Janata Bank Limited জনতা ব্যাংক লিমিটেড":{tags:{amenity:"bank",brand:"জনতা ব্যাংক লিমিটেড","brand:bn":"জনতা ব্যাংক লিমিটেড","brand:en":"Janata Bank Limited","brand:wikidata":"Q3347028","brand:wikipedia":"en:Janata Bank",name:"জনতা ব্যাংক লিমিটেড","name:bn":"জনতা ব্যাংক লিমিটেড","name:en":"Janata Bank Limited"}},"amenity/bank|Jyske Bank":{countryCodes:["dk"],tags:{amenity:"bank",brand:"Jyske Bank","brand:wikidata":"Q136672","brand:wikipedia":"en:Jyske Bank",name:"Jyske Bank"}},"amenity/bank|K&H Bank":{countryCodes:["hu"],tags:{amenity:"bank",brand:"K&H Bank","brand:wikidata":"Q6393834","brand:wikipedia":"en:K&H Bank",name:"K&H Bank"}},"amenity/bank|KBC":{countryCodes:["be","ie"],tags:{amenity:"bank",brand:"KBC","brand:wikidata":"Q941020","brand:wikipedia":"en:KBC Bank",name:"KBC"}},"amenity/bank|KBZ Bank":{countryCodes:["mm"],tags:{amenity:"bank",brand:"KBZ Bank","brand:wikidata":"Q6360949","brand:wikipedia":"en:Kanbawza Bank",name:"KBZ Bank"}},"amenity/bank|Karnataka Bank":{countryCodes:["in"],tags:{amenity:"bank",brand:"Karnataka Bank","brand:wikidata":"Q2042632","brand:wikipedia":"en:Karnataka Bank",name:"Karnataka Bank"}},"amenity/bank|Kasa Stefczyka":{countryCodes:["pl"],tags:{amenity:"bank",brand:"Kasa Stefczyka","brand:wikidata":"Q57624461",name:"Kasa Stefczyka"}},"amenity/bank|KeyBank":{countryCodes:["us"],tags:{amenity:"bank",brand:"KeyBank","brand:wikidata":"Q1740314","brand:wikipedia":"en:KeyBank",name:"KeyBank"}},"amenity/bank|Komerční banka":{countryCodes:["cz"],tags:{amenity:"bank",brand:"Komerční banka","brand:wikidata":"Q1541079","brand:wikipedia":"en:Komerční banka",name:"Komerční banka"}},"amenity/bank|Kotak Mahindra Bank":{countryCodes:["in"],tags:{amenity:"bank",brand:"Kotak Mahindra Bank","brand:wikidata":"Q2040404","brand:wikipedia":"en:Kotak Mahindra Bank",name:"Kotak Mahindra Bank"}},"amenity/bank|Kutxabank":{countryCodes:["es"],tags:{amenity:"bank",brand:"Kutxabank","brand:wikidata":"Q5139377","brand:wikipedia":"en:Kutxabank",name:"Kutxabank"}},"amenity/bank|Kuveyt Türk":{countryCodes:["tr"],tags:{amenity:"bank",brand:"Kuveyt Türk","brand:wikidata":"Q6036058","brand:wikipedia":"tr:Kuveyt Türk",name:"Kuveyt Türk"}},"amenity/bank|LCL":{countryCodes:["fr"],tags:{amenity:"bank",brand:"LCL","brand:wikidata":"Q779722","brand:wikipedia":"en:Crédit Lyonnais",name:"LCL"}},"amenity/bank|La Banque Postale":{countryCodes:["fr"],tags:{amenity:"bank",brand:"La Banque Postale","brand:wikidata":"Q3206431","brand:wikipedia":"en:La Banque postale",name:"La Banque Postale"}},"amenity/bank|La Caixa":{countryCodes:["es"],tags:{amenity:"bank",brand:"La Caixa","brand:wikidata":"Q287753","brand:wikipedia":"en:La Caixa",name:"La Caixa"}},"amenity/bank|Laboral Kutxa":{countryCodes:["es"],tags:{amenity:"bank",brand:"Laboral Kutxa","brand:wikidata":"Q12052386","brand:wikipedia":"en:Laboral Kutxa",name:"Laboral Kutxa"}},"amenity/bank|Lake Michigan Credit Union":{countryCodes:["us"],tags:{amenity:"bank",brand:"Lake Michigan Credit Union","brand:wikidata":"Q6476906","brand:wikipedia":"en:Lake Michigan Credit Union",name:"Lake Michigan Credit Union",short_name:"LMCU"}},"amenity/bank|Landbank":{countryCodes:["ph"],matchNames:["bangko sa lupa ng pilipinas","land bank of the philippines","lbp"],tags:{amenity:"bank",brand:"Landbank","brand:wikidata":"Q6483872","brand:wikipedia":"en:Land Bank of the Philippines",name:"Landbank"}},"amenity/bank|Leeds Building Society":{countryCodes:["gb"],tags:{amenity:"bank",brand:"Leeds Building Society","brand:wikidata":"Q6515848","brand:wikipedia":"en:Leeds Building Society",name:"Leeds Building Society"}},"amenity/bank|Liberbank":{countryCodes:["es"],tags:{amenity:"bank",brand:"Liberbank","brand:wikidata":"Q2891018","brand:wikipedia":"en:Liberbank",name:"Liberbank"}},"amenity/bank|Liberty Bank":{nomatch:["amenity/fuel|Liberty"],tags:{amenity:"bank",brand:"Liberty Bank",name:"Liberty Bank"}},"amenity/bank|Lloyds Bank":{countryCodes:["gb","im"],matchNames:["lloyds","lloyds tsb"],tags:{amenity:"bank",brand:"Lloyds Bank","brand:wikidata":"Q1152847","brand:wikipedia":"en:Lloyds Bank",name:"Lloyds Bank"}},"amenity/bank|M&T Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"M&T Bank","brand:wikidata":"Q3272257","brand:wikipedia":"en:M&T Bank",name:"M&T Bank"}},"amenity/bank|MCB":{matchNames:["mcb bank"],tags:{amenity:"bank",brand:"MCB","brand:wikidata":"Q15982510","brand:wikipedia":"ur:ایم سی بی بینک لمیٹڈ",name:"MCB"}},"amenity/bank|MONETA Money Bank":{countryCodes:["cz"],tags:{amenity:"bank",brand:"MONETA Money Bank","brand:wikidata":"Q24282966","brand:wikipedia":"cs:Moneta Money Bank",name:"MONETA Money Bank"}},"amenity/bank|Macro":{countryCodes:["ar"],tags:{amenity:"bank",brand:"Macro","brand:wikidata":"Q2335199","brand:wikipedia":"en:Banco Macro",name:"Macro"}},"amenity/bank|Maybank":{tags:{amenity:"bank",brand:"Maybank","brand:wikidata":"Q1364018","brand:wikipedia":"en:Maybank",name:"Maybank"}},"amenity/bank|Meezan Bank":{countryCodes:["pk"],tags:{amenity:"bank",brand:"Meezan Bank","brand:wikidata":"Q6807934","brand:wikipedia":"en:Meezan Bank",name:"Meezan Bank"}},"amenity/bank|Mercantil":{tags:{amenity:"bank",brand:"Mercantil","brand:wikidata":"Q6818004","brand:wikipedia":"en:Mercantil Servicios Financieros",name:"Mercantil"}},"amenity/bank|Meridian Credit Union":{countryCodes:["ca"],tags:{alt_name:"Meridian",amenity:"bank",brand:"Meridian Credit Union","brand:wikidata":"Q6819303","brand:wikipedia":"en:Meridian Credit Union",name:"Meridian Credit Union"}},"amenity/bank|Metro Bank~(UK)":{countryCodes:["gb"],nomatch:["amenity/bank|Metrobank~(Philippines)"],tags:{amenity:"bank",brand:"Metro Bank","brand:wikidata":"Q6824499","brand:wikipedia":"en:Metro Bank (United Kingdom)",name:"Metro Bank"}},"amenity/bank|Metrobank~(Philippines)":{countryCodes:["ph"],nomatch:["amenity/bank|Metro Bank~(UK)"],tags:{amenity:"bank",brand:"Metrobank","brand:wikidata":"Q1925799","brand:wikipedia":"en:Metrobank (Philippines)",name:"Metrobank"}},"amenity/bank|Mibanco":{countryCodes:["pe"],tags:{amenity:"bank",brand:"Mibanco","brand:wikidata":"Q5558589","brand:wikipedia":"es:MiBanco",name:"Mibanco"}},"amenity/bank|MidFirst Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"MidFirst Bank","brand:wikidata":"Q17081131","brand:wikipedia":"en:MidFirst Bank",name:"MidFirst Bank"}},"amenity/bank|Millennium Bank":{countryCodes:["pl"],matchNames:["bank millennium"],tags:{amenity:"bank",brand:"Millennium Bank","brand:wikidata":"Q4855947","brand:wikipedia":"pl:Bank Millennium",name:"Millennium Bank"}},"amenity/bank|Millennium bcp":{countryCodes:["pt"],tags:{amenity:"bank",brand:"Millennium bcp","brand:wikidata":"Q118581","brand:wikipedia":"pt:Banco Comercial Português",name:"Millennium bcp",official_name:"Banco Comercial Português","official_name:en":"Portuguese Commercial Bank","official_name:es":"Banco Comercial Português"}},"amenity/bank|Monte dei Paschi di Siena":{countryCodes:["it"],tags:{amenity:"bank",brand:"Monte dei Paschi di Siena","brand:wikidata":"Q46730","brand:wikipedia":"en:Banca Monte dei Paschi di Siena",name:"Monte dei Paschi di Siena"}},"amenity/bank|Montepio":{countryCodes:["pt"],tags:{amenity:"bank",brand:"Montepio","brand:wikidata":"Q1946091","brand:wikipedia":"en:Montepio (bank)",name:"Montepio"}},"amenity/bank|Mountain America Credit Union":{countryCodes:["us"],tags:{amenity:"bank",brand:"Mountain America Credit Union","brand:wikidata":"Q6924862","brand:wikipedia":"en:Mountain America Credit Union",name:"Mountain America Credit Union"}},"amenity/bank|NAB":{tags:{amenity:"bank",brand:"NAB","brand:wikidata":"Q1430985","brand:wikipedia":"en:National Australia Bank",name:"NAB"}},"amenity/bank|NSB":{countryCodes:["lk"],matchNames:["national savings bank"],tags:{amenity:"bank",brand:"NSB","brand:wikidata":"Q12500189","brand:wikipedia":"en:National Savings Bank (Sri Lanka)",name:"NSB"}},"amenity/bank|NatWest":{countryCodes:["gb","gg"],tags:{amenity:"bank",brand:"NatWest","brand:wikidata":"Q2740021","brand:wikipedia":"en:NatWest",name:"NatWest"}},"amenity/bank|National Bank":{countryCodes:["ca"],tags:{amenity:"bank",brand:"National Bank","brand:wikidata":"Q634298","brand:wikipedia":"en:National Bank of Canada",name:"National Bank",official_name:"National Bank of Canada"}},"amenity/bank|Nationwide":{countryCodes:["gb"],nomatch:["office/insurance|Nationwide"],tags:{amenity:"bank",brand:"Nationwide","brand:wikidata":"Q846735","brand:wikipedia":"en:Nationwide Building Society",name:"Nationwide"}},"amenity/bank|Navy Federal Credit Union":{countryCodes:["us"],tags:{amenity:"bank",brand:"Navy Federal Credit Union","brand:wikidata":"Q6982632","brand:wikipedia":"en:Navy Federal Credit Union",name:"Navy Federal Credit Union"}},"amenity/bank|Nedbank":{tags:{amenity:"bank",brand:"Nedbank","brand:wikidata":"Q2751701","brand:wikipedia":"en:Nedbank",name:"Nedbank"}},"amenity/bank|Nordea":{tags:{amenity:"bank",brand:"Nordea","brand:wikidata":"Q1123823","brand:wikipedia":"en:Nordea",name:"Nordea"}},"amenity/bank|Novo Banco":{countryCodes:["es","pt"],tags:{amenity:"bank",brand:"Novo Banco","brand:wikidata":"Q17488861","brand:wikipedia":"en:Novo Banco",name:"Novo Banco"}},"amenity/bank|OLB":{countryCodes:["de"],tags:{amenity:"bank",brand:"OLB","brand:wikidata":"Q879591","brand:wikipedia":"en:Oldenburgische Landesbank",name:"OLB"}},"amenity/bank|OTP":{matchNames:["otp bank"],tags:{amenity:"bank",brand:"OTP","brand:wikidata":"Q912778","brand:wikipedia":"en:OTP Bank",name:"OTP"}},"amenity/bank|Oberbank":{countryCodes:["at","cz","de","hu"],tags:{amenity:"bank",brand:"Oberbank","brand:wikidata":"Q2009139","brand:wikipedia":"de:Oberbank",name:"Oberbank"}},"amenity/bank|Occidental de Descuento":{countryCodes:["ve"],tags:{amenity:"bank",brand:"Occidental de Descuento","brand:wikidata":"Q4854108","brand:wikipedia":"en:Banco Occidental de Descuento",name:"Occidental de Descuento"}},"amenity/bank|Oldenburgische Landesbank":{countryCodes:["de"],tags:{amenity:"bank",brand:"Oldenburgische Landesbank","brand:wikidata":"Q879591","brand:wikipedia":"en:Oldenburgische Landesbank",name:"Oldenburgische Landesbank"}},"amenity/bank|One Network Bank":{countryCodes:["ph"],tags:{amenity:"bank",brand:"One Network Bank","brand:wikidata":"Q7093019","brand:wikipedia":"en:One Network Bank",name:"One Network Bank"}},"amenity/bank|Oriental Bank of Commerce":{countryCodes:["in"],tags:{amenity:"bank",brand:"Oriental Bank of Commerce","brand:wikidata":"Q367008","brand:wikipedia":"en:Oriental Bank of Commerce",name:"Oriental Bank of Commerce"}},"amenity/bank|Osuuspankki":{countryCodes:["fi"],tags:{amenity:"bank",brand:"Osuuspankki","brand:wikidata":"Q4045597","brand:wikipedia":"fi:OP (finanssiryhmä)",name:"Osuuspankki"}},"amenity/bank|PBZ":{countryCodes:["hr"],tags:{amenity:"bank",brand:"PBZ","brand:wikidata":"Q7246343","brand:wikipedia":"en:Privredna banka Zagreb",name:"PBZ"}},"amenity/bank|PKO BP":{countryCodes:["pl"],matchNames:["pko bank polski"],tags:{amenity:"bank",brand:"PKO BP","brand:wikidata":"Q578832","brand:wikipedia":"pl:Powszechna Kasa Oszczędności Bank Polski",name:"PKO BP"}},"amenity/bank|PNB":{countryCodes:["ph"],tags:{amenity:"bank",brand:"PNB","brand:wikidata":"Q1657971","brand:wikipedia":"en:Philippine National Bank",name:"PNB",official_name:"Philippine National Bank"}},"amenity/bank|PNC Bank":{countryCodes:["us"],matchNames:["pnc"],tags:{amenity:"bank",brand:"PNC Bank","brand:wikidata":"Q38928","brand:wikipedia":"en:PNC Financial Services",name:"PNC Bank"}},"amenity/bank|PSBank":{countryCodes:["ph"],tags:{amenity:"bank",brand:"PSBank","brand:wikidata":"Q7185203","brand:wikipedia":"en:Philippine Savings Bank",name:"PSBank"}},"amenity/bank|Panin Bank":{countryCodes:["id"],tags:{amenity:"bank",brand:"Panin Bank","brand:wikidata":"Q12502751","brand:wikipedia":"id:Panin Bank",name:"Panin Bank"}},"amenity/bank|Patagonia":{countryCodes:["ar"],tags:{amenity:"bank",brand:"Patagonia","brand:wikidata":"Q2882078","brand:wikipedia":"en:Banco Patagonia",name:"Patagonia"}},"amenity/bank|Pekao SA":{countryCodes:["pl"],tags:{amenity:"bank",brand:"Pekao SA","brand:wikidata":"Q806642","brand:wikipedia":"pl:Bank Polska Kasa Opieki",name:"Pekao SA"}},"amenity/bank|PenFed Credit Union":{countryCodes:["us"],tags:{alt_name:"Pentagon Federal Credit Union",amenity:"bank",brand:"PenFed Credit Union","brand:wikidata":"Q3374885","brand:wikipedia":"en:Pentagon Federal Credit Union",name:"PenFed Credit Union",short_name:"PenFed"}},"amenity/bank|People's United Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"People's United Bank","brand:wikidata":"Q7165802","brand:wikipedia":"en:People's United Financial",name:"People's United Bank"}},"amenity/bank|Peoples Bank":{tags:{amenity:"bank",brand:"Peoples Bank","brand:wikidata":"Q7166050","brand:wikipedia":"en:Peoples Bank",name:"Peoples Bank"}},"amenity/bank|Piraeus Bank":{countryCodes:["bg","cy","gr","ro","ua"],tags:{amenity:"bank",brand:"Piraeus Bank","brand:wikidata":"Q3312","brand:wikipedia":"en:Piraeus Bank",name:"Piraeus Bank"}},"amenity/bank|Postbank~(Bulgaria)":{countryCodes:["bg"],nomatch:["amenity/bank|Bancpost"],tags:{amenity:"bank",brand:"Postbank","brand:wikidata":"Q7234083","brand:wikipedia":"en:Bulgarian Postbank",name:"Postbank"}},"amenity/bank|Postbank~(Germany)":{countryCodes:["de"],matchNames:["postbank finanzcenter"],nomatch:["amenity/bank|Bancpost"],tags:{amenity:"bank",brand:"Postbank","brand:wikidata":"Q708835","brand:wikipedia":"en:Deutsche Postbank",name:"Postbank"}},"amenity/bank|Prima banka":{countryCodes:["sk"],tags:{amenity:"bank",brand:"Prima banka","brand:wikidata":"Q13538661","brand:wikipedia":"sk:Prima banka Slovensko",name:"Prima banka"}},"amenity/bank|Provincial":{countryCodes:["ve"],matchNames:["bbva provincial"],tags:{amenity:"bank",brand:"Provincial","brand:wikidata":"Q4835087","brand:wikipedia":"es:BBVA Provincial",name:"Provincial"}},"amenity/bank|Public Bank~(Malaysia)":{matchNames:["public bank berhad"],tags:{amenity:"bank",brand:"Public Bank","brand:wikidata":"Q3046561","brand:wikipedia":"en:Public Bank Berhad",name:"Public Bank"}},"amenity/bank|Punjab National Bank":{countryCodes:["in"],tags:{amenity:"bank",brand:"Punjab National Bank","brand:wikidata":"Q2743499","brand:wikipedia":"en:Punjab National Bank",name:"Punjab National Bank"}},"amenity/bank|RBC":{matchNames:["rbc financial group","rbc royal bank","royal bank"],tags:{amenity:"bank",brand:"RBC","brand:wikidata":"Q735261","brand:wikipedia":"en:Royal Bank of Canada",name:"RBC",official_name:"Royal Bank of Canada"}},"amenity/bank|RBS":{countryCodes:["gb","je","ro"],tags:{amenity:"bank",brand:"RBS","brand:wikidata":"Q160126","brand:wikipedia":"en:Royal Bank of Scotland",name:"RBS",official_name:"Royal Bank of Scotland"}},"amenity/bank|RCBC":{countryCodes:["ph"],matchNames:["rcbc savings bank"],tags:{amenity:"bank",brand:"RCBC","brand:wikidata":"Q7339070","brand:wikipedia":"en:Rizal Commercial Banking Corporation",name:"RCBC",official_name:"Rizal Commercial Banking Corporation"}},"amenity/bank|Rabobank":{countryCodes:["au","id","nl","nz","us"],tags:{amenity:"bank",brand:"Rabobank","brand:wikidata":"Q252004","brand:wikipedia":"en:Rabobank",name:"Rabobank"}},"amenity/bank|Raiffeisen Polbank":{countryCodes:["de","pl"],tags:{amenity:"bank",brand:"Raiffeisen Polbank","brand:wikidata":"Q9303218","brand:wikipedia":"pl:Raiffeisen Bank Polska",name:"Raiffeisen Polbank"}},"amenity/bank|Raiffeisenbank":{matchNames:["raiffeisen","raiffeisenkasse"],nomatch:["amenity/fuel|Raiffeisen"],tags:{amenity:"bank",brand:"Raiffeisenbank","brand:wikidata":"Q24282825","brand:wikipedia":"cs:Raiffeisenbank",name:"Raiffeisenbank"}},"amenity/bank|Regions Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"Regions Bank","brand:wikidata":"Q917131","brand:wikipedia":"en:Regions Financial Corporation",name:"Regions Bank"}},"amenity/bank|Republic Bank":{tags:{amenity:"bank",brand:"Republic Bank",name:"Republic Bank"}},"amenity/bank|Republic Bank (Eastern Caribbean)":{countryCodes:["bb","gd","gy","tt"],tags:{amenity:"bank",brand:"Republic Bank","brand:wikidata":"Q7314386","brand:wikipedia":"en:Republic Bank",name:"Republic Bank"}},"amenity/bank|Republic Bank (USA)":{countryCodes:["us"],tags:{amenity:"bank",brand:"Republic Bank","brand:wikidata":"Q7314387","brand:wikipedia":"en:Republic Bank & Trust Company",name:"Republic Bank",official_name:"Republic Bank & Trust Company"}},"amenity/bank|República":{countryCodes:["uy"],tags:{amenity:"bank",brand:"República","brand:wikidata":"Q4077337","brand:wikipedia":"en:Banco de la República Oriental del Uruguay",name:"República"}},"amenity/bank|S-Pankki":{countryCodes:["fi"],tags:{amenity:"bank",brand:"S-Pankki","brand:wikidata":"Q7387053","brand:wikipedia":"fi:S-Pankki",name:"S-Pankki"}},"amenity/bank|SC제일은행":{countryCodes:["kr"],tags:{amenity:"bank",brand:"SC제일은행","brand:ko":"SC제일은행","brand:wikidata":"Q625531","brand:wikipedia":"en:Standard Chartered Korea",name:"SC제일은행","name:ko":"SC제일은행"}},"amenity/bank|SEB":{countryCodes:["de","ee","lt","lv","se"],tags:{amenity:"bank",brand:"SEB","brand:wikidata":"Q975655","brand:wikipedia":"en:SEB Group",name:"SEB"}},"amenity/bank|SGBCI":{countryCodes:["ci"],matchNames:["agence sgbci"],tags:{amenity:"bank",brand:"SGBCI","brand:wikidata":"Q3488360","brand:wikipedia":"fr:Société générale de banques en Côte d'Ivoire",name:"SGBCI"}},"amenity/bank|SNS Bank":{countryCodes:["nl"],tags:{amenity:"bank",brand:"SNS Bank","brand:wikidata":"Q1857899","brand:wikipedia":"en:De Volksbank",name:"SNS Bank"}},"amenity/bank|Sacombank":{tags:{amenity:"bank",brand:"Sacombank",name:"Sacombank"}},"amenity/bank|Sampath Bank":{countryCodes:["lk"],tags:{amenity:"bank",brand:"Sampath Bank","brand:wikidata":"Q7410095","brand:wikipedia":"en:Sampath Bank",name:"Sampath Bank"}},"amenity/bank|Santander":{matchNames:["santander consumer bank"],nomatch:["amenity/bank|Banco Santander"],tags:{amenity:"bank",brand:"Santander","brand:wikidata":"Q5835668","brand:wikipedia":"en:Santander Bank",name:"Santander"}},"amenity/bank|Santander Río":{countryCodes:["ar"],tags:{amenity:"bank",brand:"Santander Río","brand:wikidata":"Q3385268","brand:wikipedia":"es:Banco Santander Río",name:"Santander Río"}},"amenity/bank|Santander Totta":{countryCodes:["pt"],tags:{amenity:"bank",brand:"Santander Totta","brand:wikidata":"Q4854116","brand:wikipedia":"pt:Banco Santander Portugal",name:"Santander Totta"}},"amenity/bank|Sberbank":{tags:{amenity:"bank",brand:"Sberbank","brand:wikidata":"Q205012","brand:wikipedia":"en:Sberbank of Russia",name:"Sberbank"}},"amenity/bank|Scotiabank":{tags:{amenity:"bank",brand:"Scotiabank","brand:wikidata":"Q451476","brand:wikipedia":"en:Scotiabank",name:"Scotiabank"}},"amenity/bank|Security Bank":{countryCodes:["ph"],tags:{amenity:"bank",brand:"Security Bank","brand:wikidata":"Q7444945","brand:wikipedia":"en:Security Bank",name:"Security Bank"}},"amenity/bank|Security Service Federal Credit Union":{countryCodes:["us"],matchNames:["security service fcu"],tags:{amenity:"bank",brand:"Security Service Federal Credit Union","brand:wikidata":"Q7444993","brand:wikipedia":"en:Security Service Federal Credit Union",name:"Security Service Federal Credit Union",short_name:"SSFCU"}},"amenity/bank|Service Credit Union":{countryCodes:["de","us"],tags:{amenity:"bank",brand:"Service Credit Union","brand:wikidata":"Q7455675","brand:wikipedia":"en:Service Credit Union",name:"Service Credit Union"}},"amenity/bank|Servus Credit Union":{countryCodes:["ca"],tags:{alt_name:"Servus",amenity:"bank",brand:"Servus Credit Union","brand:wikidata":"Q2274396","brand:wikipedia":"en:Servus Credit Union",name:"Servus Credit Union"}},"amenity/bank|Seylan Bank":{countryCodes:["lk"],tags:{amenity:"bank",brand:"Seylan Bank","brand:wikidata":"Q3532083","brand:wikipedia":"en:Seylan Bank",name:"Seylan Bank"}},"amenity/bank|Siam Commercial Bank":{countryCodes:["th"],tags:{amenity:"bank",brand:"Siam Commercial Bank","brand:wikidata":"Q2038986","brand:wikipedia":"en:Siam Commercial Bank",name:"Siam Commercial Bank"}},"amenity/bank|Sicoob":{countryCodes:["br"],tags:{amenity:"bank",brand:"Sicoob","brand:wikidata":"Q28679754","brand:wikipedia":"pt:Sistema de Cooperativas de Crédito do Brasil",name:"Sicoob"}},"amenity/bank|Sicredi":{countryCodes:["br"],tags:{amenity:"bank",brand:"Sicredi","brand:wikidata":"Q3483060","brand:wikipedia":"pt:Sistema de Crédito Cooperativo",name:"Sicredi"}},"amenity/bank|Simmons Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"Simmons Bank","brand:wikidata":"Q28402389","brand:wikipedia":"en:Simmons Bank",name:"Simmons Bank"}},"amenity/bank|Slovenská sporiteľňa":{countryCodes:["sk"],tags:{amenity:"bank",brand:"Slovenská sporiteľňa","brand:wikidata":"Q7541907","brand:wikipedia":"en:Slovenská sporiteľňa",name:"Slovenská sporiteľňa"}},"amenity/bank|Société Générale":{tags:{amenity:"bank",brand:"Société Générale","brand:wikidata":"Q270363","brand:wikipedia":"en:Société Générale",name:"Société Générale"}},"amenity/bank|Société Marseillaise de Crédit":{countryCodes:["fr"],tags:{amenity:"bank",brand:"Société Marseillaise de Crédit","brand:wikidata":"Q3488479","brand:wikipedia":"fr:Société marseillaise de crédit",name:"Société Marseillaise de Crédit"}},"amenity/bank|Sonali Bank":{countryCodes:["bd"],matchNames:["sonali bank limited","sonali bank limited সোনালী ব্যাংক লিমিটেড"],tags:{amenity:"bank",brand:"Sonali Bank","brand:wikidata":"Q3350382","brand:wikipedia":"en:Sonali Bank",name:"Sonali Bank"}},"amenity/bank|South Indian Bank":{countryCodes:["in"],tags:{amenity:"bank",brand:"South Indian Bank","brand:wikidata":"Q2044973","brand:wikipedia":"en:South Indian Bank",name:"South Indian Bank"}},"amenity/bank|South State Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"South State Bank","brand:wikidata":"Q55633597","brand:wikipedia":"en:South State Bank",name:"South State Bank"}},"amenity/bank|Sparda-Bank":{countryCodes:["at","de"],tags:{amenity:"bank",brand:"Sparda-Bank","brand:wikidata":"Q2307136","brand:wikipedia":"en:Sparda-Bank",name:"Sparda-Bank"}},"amenity/bank|Stanbic Bank":{tags:{amenity:"bank",brand:"Stanbic Bank","brand:wikidata":"Q7597999","brand:wikipedia":"en:Stanbic Bank",name:"Stanbic Bank"}},"amenity/bank|Standard Bank":{tags:{amenity:"bank",brand:"Standard Bank","brand:wikidata":"Q1576610","brand:wikipedia":"en:Standard Bank",name:"Standard Bank"}},"amenity/bank|Standard Chartered":{matchNames:["standard chartered bank"],tags:{amenity:"bank",brand:"Standard Chartered","brand:wikidata":"Q548278","brand:wikipedia":"en:Standard Chartered",name:"Standard Chartered"}},"amenity/bank|State Bank of India":{tags:{amenity:"bank",brand:"State Bank of India","brand:wikidata":"Q1340361","brand:wikipedia":"en:State Bank of India",name:"State Bank of India"}},"amenity/bank|State Employees Credit Union":{countryCodes:["us"],tags:{amenity:"bank",brand:"State Employees Credit Union","brand:wikidata":"Q7603196","brand:wikipedia":"en:State Employees Credit Union",name:"State Employees Credit Union",short_name:"SECU"}},"amenity/bank|Summit Bank":{countryCodes:["pk"],tags:{amenity:"bank",brand:"Summit Bank","brand:wikidata":"Q7637775","brand:wikipedia":"en:Summit Bank",name:"Summit Bank"}},"amenity/bank|SunTrust":{countryCodes:["us"],matchNames:["suntrust bank"],tags:{amenity:"bank",brand:"SunTrust","brand:wikidata":"Q181507","brand:wikipedia":"en:SunTrust Banks",name:"SunTrust"}},"amenity/bank|Suncorp":{countryCodes:["au"],tags:{amenity:"bank",brand:"Suncorp","brand:wikidata":"Q24189567","brand:wikipedia":"en:Suncorp Bank",name:"Suncorp"}},"amenity/bank|Supervielle":{countryCodes:["ar"],tags:{amenity:"bank",brand:"Supervielle","brand:wikidata":"Q5718035","brand:wikipedia":"es:Banco Supervielle",name:"Supervielle"}},"amenity/bank|Swedbank":{countryCodes:["ee","lt","lv","se"],tags:{amenity:"bank",brand:"Swedbank","brand:wikidata":"Q1145493","brand:wikipedia":"en:Swedbank",name:"Swedbank"}},"amenity/bank|Syndicate Bank":{countryCodes:["in"],tags:{amenity:"bank",brand:"Syndicate Bank","brand:wikidata":"Q2004088","brand:wikipedia":"en:Syndicate Bank",name:"Syndicate Bank"}},"amenity/bank|TCF Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"TCF Bank","brand:wikidata":"Q7669687","brand:wikipedia":"en:TCF Bank",name:"TCF Bank"}},"amenity/bank|TD Bank":{countryCodes:["ca","us"],tags:{amenity:"bank",brand:"TD Bank","brand:wikidata":"Q7669891","brand:wikipedia":"en:TD Bank, N.A.",name:"TD Bank"}},"amenity/bank|TD Canada Trust":{countryCodes:["ca"],tags:{amenity:"bank",brand:"TD Canada Trust","brand:wikidata":"Q1080670","brand:wikipedia":"en:TD Canada Trust",name:"TD Canada Trust"}},"amenity/bank|TEB":{countryCodes:["tr"],tags:{amenity:"bank",brand:"TEB","brand:wikidata":"Q7862447","brand:wikipedia":"en:Türk Ekonomi Bankası",name:"TEB"}},"amenity/bank|TSB":{countryCodes:["gb"],tags:{amenity:"bank",brand:"TSB","brand:wikidata":"Q7671560","brand:wikipedia":"en:TSB Bank (United Kingdom)",name:"TSB"}},"amenity/bank|Takarékszövetkezet":{countryCodes:["hu"],tags:{amenity:"bank",brand:"Takarékszövetkezet","brand:wikidata":"Q30324674","brand:wikipedia":"en:TakarékBank",name:"Takarékszövetkezet"}},"amenity/bank|Targobank":{countryCodes:["de","es"],tags:{amenity:"bank",brand:"Targobank","brand:wikidata":"Q1455437","brand:wikipedia":"en:Targobank",name:"Targobank"}},"amenity/bank|Tatra banka":{countryCodes:["sk"],tags:{amenity:"bank",brand:"Tatra banka","brand:wikidata":"Q1718069","brand:wikipedia":"en:Tatra banka",name:"Tatra banka"}},"amenity/bank|Türkiye İş Bankası":{tags:{amenity:"bank",brand:"Türkiye İş Bankası","brand:wikidata":"Q909613","brand:wikipedia":"en:Türkiye İş Bankası",name:"Türkiye İş Bankası"}},"amenity/bank|U.S. Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"U.S. Bank","brand:wikidata":"Q739084","brand:wikipedia":"en:U.S. Bancorp",name:"U.S. Bank"}},"amenity/bank|UBA":{tags:{amenity:"bank",brand:"UBA","brand:wikidata":"Q513457","brand:wikipedia":"en:United Bank for Africa",name:"UBA"}},"amenity/bank|UBI Banca":{countryCodes:["it"],tags:{amenity:"bank",brand:"UBI Banca","brand:wikidata":"Q1476162","brand:wikipedia":"en:UBI Banca",name:"UBI Banca"}},"amenity/bank|UBL":{countryCodes:["pk"],matchNames:["ubl bank"],tags:{amenity:"bank",brand:"UBL","brand:en":"United Bank Limited Pakistan","brand:wikidata":"Q7887504","brand:wikipedia":"ur:یونائیٹڈ بینک (پاکستان)",name:"UBL","name:en":"United Bank Limited Pakistan"}},"amenity/bank|UBS":{tags:{amenity:"bank",brand:"UBS","brand:wikidata":"Q193199","brand:wikipedia":"en:UBS",name:"UBS"}},"amenity/bank|UCO Bank":{countryCodes:["in"],tags:{amenity:"bank",brand:"UCO Bank","brand:wikidata":"Q2005310","brand:wikipedia":"en:UCO Bank",name:"UCO Bank"}},"amenity/bank|UCPB":{countryCodes:["ph"],tags:{amenity:"bank",brand:"UCPB","brand:wikidata":"Q7887615","brand:wikipedia":"en:United Coconut Planters Bank",name:"UCPB"}},"amenity/bank|UIB":{tags:{amenity:"bank",brand:"UIB","brand:wikidata":"Q18636687","brand:wikipedia":"en:United Industrial Bank",name:"UIB"}},"amenity/bank|UNI":{countryCodes:["ca"],matchNames:["caisse populaire","caisse populaire acadienne"],tags:{amenity:"bank",brand:"UNI","brand:wikidata":"Q2933348","brand:wikipedia":"fr:UNI Coopération financière",name:"UNI",official_name:"UNI Coopération financière"}},"amenity/bank|UOB":{tags:{amenity:"bank",brand:"UOB","brand:wikidata":"Q2064074","brand:wikipedia":"en:United Overseas Bank",name:"UOB"}},"amenity/bank|USAA":{tags:{amenity:"bank",brand:"USAA","brand:wikidata":"Q7865722","brand:wikipedia":"en:USAA",name:"USAA",official_name:"United Services Automobile Association"}},"amenity/bank|Ulster Bank":{countryCodes:["gb","ie"],tags:{amenity:"bank",brand:"Ulster Bank","brand:wikidata":"Q2613366","brand:wikipedia":"en:Ulster Bank",name:"Ulster Bank"}},"amenity/bank|Umpqua Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"Umpqua Bank","brand:wikidata":"Q7881772","brand:wikipedia":"en:Umpqua Holdings Corporation",name:"Umpqua Bank"}},"amenity/bank|UniCredit Bank":{matchNames:["unicredit","unicredit banca"],tags:{amenity:"bank",brand:"UniCredit Bank","brand:wikidata":"Q45568","brand:wikipedia":"en:UniCredit",name:"UniCredit Bank"}},"amenity/bank|Unicaja Banco":{countryCodes:["es"],tags:{amenity:"bank",brand:"Unicaja Banco","brand:wikidata":"Q2543704","brand:wikipedia":"en:Unicaja",name:"Unicaja Banco",short_name:"Unicaja"}},"amenity/bank|Union Bank of India":{countryCodes:["in"],tags:{amenity:"bank",brand:"Union Bank of India","brand:wikidata":"Q2004078","brand:wikipedia":"en:Union Bank of India",name:"Union Bank of India"}},"amenity/bank|Union Bank~(USA)":{countryCodes:["us"],matchNames:["mufg union bank","union bank of california"],nomatch:["amenity/bank|Banco Unión","amenity/money_transfer|Express Union"],tags:{alt_name:"UnionBank",amenity:"bank",brand:"Union Bank","brand:wikidata":"Q1442804","brand:wikipedia":"en:MUFG Union Bank",name:"Union Bank"}},"amenity/bank|UnionBank~(Philippines)":{countryCodes:["ph"],matchNames:["union bank of the philippines"],nomatch:["amenity/bank|Banco Unión","amenity/money_transfer|Express Union"],tags:{amenity:"bank",brand:"UnionBank","brand:wikidata":"Q7885403","brand:wikipedia":"en:Union Bank of the Philippines",name:"UnionBank"}},"amenity/bank|United Bank~(Connecticut)":{countryCodes:["us"],tags:{amenity:"bank",brand:"United Bank","brand:wikidata":"Q64825157",name:"United Bank"}},"amenity/bank|United Bank~(WestVirginia)":{countryCodes:["us"],tags:{amenity:"bank",brand:"United Bank","brand:wikidata":"Q16920636","brand:wikipedia":"en:United Bank (West Virginia)",name:"United Bank"}},"amenity/bank|Vakıfbank":{countryCodes:["tr"],tags:{amenity:"bank",brand:"Vakıfbank","brand:wikidata":"Q1148521","brand:wikipedia":"en:VakıfBank",name:"Vakıfbank"}},"amenity/bank|Vancity":{countryCodes:["ca"],matchNames:["vancouver city savings"],tags:{amenity:"bank",brand:"Vancity","brand:wikidata":"Q7914085","brand:wikipedia":"en:Vancity",name:"Vancity",official_name:"Vancouver City Savings Credit Union"}},"amenity/bank|Veneto Banca":{countryCodes:["it"],tags:{amenity:"bank",brand:"Veneto Banca","brand:wikidata":"Q3127221","brand:wikipedia":"en:Veneto Banca",name:"Veneto Banca"}},"amenity/bank|Vijaya Bank":{countryCodes:["in"],tags:{amenity:"bank",brand:"Vijaya Bank","brand:wikidata":"Q2003171","brand:wikipedia":"en:Vijaya Bank",name:"Vijaya Bank"}},"amenity/bank|Volksbank Köln Bonn eG":{countryCodes:["de"],tags:{amenity:"bank",brand:"Volksbank Köln Bonn eG","brand:wikidata":"Q41680844","brand:wikipedia":"de:Volksbank Köln Bonn",name:"Volksbank Köln Bonn eG"}},"amenity/bank|VÚB":{countryCodes:["sk"],tags:{amenity:"bank",brand:"VÚB","brand:wikidata":"Q12778981","brand:wikipedia":"en:Všeobecná úverová banka",name:"VÚB"}},"amenity/bank|Washington Federal":{countryCodes:["us"],tags:{amenity:"bank",brand:"Washington Federal","brand:wikidata":"Q7971859","brand:wikipedia":"en:Washington Federal",name:"Washington Federal"}},"amenity/bank|Wells Fargo":{countryCodes:["us"],matchNames:["wells fargo bank"],tags:{amenity:"bank",brand:"Wells Fargo","brand:wikidata":"Q744149","brand:wikipedia":"en:Wells Fargo",name:"Wells Fargo"}},"amenity/bank|WesBanco":{countryCodes:["us"],tags:{amenity:"bank",brand:"WesBanco","brand:wikidata":"Q7983629","brand:wikipedia":"en:WesBanco",name:"WesBanco"}},"amenity/bank|Western Union":{nomatch:["amenity/money_transfer|Western Union"],tags:{amenity:"bank",brand:"Western Union","brand:wikidata":"Q861042","brand:wikipedia":"en:Western Union",name:"Western Union"}},"amenity/bank|Westpac":{tags:{amenity:"bank",brand:"Westpac","brand:wikidata":"Q2031726","brand:wikipedia":"en:Westpac",name:"Westpac"}},"amenity/bank|Yapı Kredi":{countryCodes:["tr"],tags:{amenity:"bank",brand:"Yapı Kredi","brand:wikidata":"Q8049138","brand:wikipedia":"en:Yapı ve Kredi Bankası",name:"Yapı Kredi"}},"amenity/bank|Yorkshire Bank":{countryCodes:["gb"],tags:{amenity:"bank",brand:"Yorkshire Bank","brand:wikidata":"Q8055678","brand:wikipedia":"en:Yorkshire Bank",name:"Yorkshire Bank"}},"amenity/bank|Yorkshire Building Society":{countryCodes:["gb"],tags:{amenity:"bank",brand:"Yorkshire Building Society","brand:wikidata":"Q12073381","brand:wikipedia":"en:Yorkshire Building Society",name:"Yorkshire Building Society"}},"amenity/bank|Zagrebačka banka":{countryCodes:["hr"],tags:{amenity:"bank",brand:"Zagrebačka banka","brand:wikidata":"Q140381","brand:wikipedia":"en:Zagrebačka banka",name:"Zagrebačka banka"}},"amenity/bank|Zenith Bank":{tags:{amenity:"bank",brand:"Zenith Bank","brand:wikidata":"Q5978240","brand:wikipedia":"en:Zenith Bank",name:"Zenith Bank"}},"amenity/bank|Ziraat Bankası":{tags:{amenity:"bank",brand:"Ziraat Bankası","brand:wikidata":"Q696003","brand:wikipedia":"en:Ziraat Bankası",name:"Ziraat Bankası"}},"amenity/bank|mBank":{tags:{amenity:"bank",brand:"mBank","brand:wikidata":"Q1160928","brand:wikipedia":"en:MBank",name:"mBank"}},"amenity/bank|st.george":{countryCodes:["au"],matchNames:["st.george bank"],tags:{amenity:"bank",brand:"st.george","brand:wikidata":"Q1606050","brand:wikipedia":"en:St.George Bank",name:"st.george"}},"amenity/bank|Ålandsbanken":{countryCodes:["fi"],tags:{amenity:"bank",brand:"Ålandsbanken","brand:wikidata":"Q4349236","brand:wikipedia":"sv:Ålandsbanken",name:"Ålandsbanken"}},"amenity/bank|ČSOB":{countryCodes:["cz","sk"],tags:{amenity:"bank",brand:"ČSOB","brand:wikidata":"Q340135","brand:wikipedia":"en:Československá obchodní banka",name:"ČSOB"}},"amenity/bank|Česká spořitelna":{countryCodes:["cz"],tags:{amenity:"bank",brand:"Česká spořitelna","brand:wikidata":"Q341100","brand:wikipedia":"en:Česká spořitelna",name:"Česká spořitelna"}},"amenity/bank|İş Bankası":{countryCodes:["tr"],tags:{amenity:"bank",brand:"İş Bankası","brand:wikidata":"Q909613","brand:wikipedia":"en:Türkiye İş Bankası",name:"İş Bankası"}},"amenity/bank|Εθνική Τράπεζα":{countryCodes:["gr"],tags:{amenity:"bank",brand:"Εθνική Τράπεζα","brand:el":"Εθνική Τράπεζα","brand:en":"National Bank of Greece","brand:wikidata":"Q1816028","brand:wikipedia":"en:National Bank of Greece",name:"Εθνική Τράπεζα","name:el":"Εθνική Τράπεζα","name:en":"National Bank of Greece"}},"amenity/bank|Πειραιώς":{countryCodes:["gr"],tags:{amenity:"bank",brand:"Πειραιώς",name:"Πειραιώς"}},"amenity/bank|Τράπεζα Πειραιώς":{countryCodes:["gr"],tags:{amenity:"bank",brand:"Τράπεζα Πειραιώς","brand:el":"Τράπεζα Πειραιώς","brand:en":"Piraeus Bank","brand:wikidata":"Q3312","brand:wikipedia":"en:Piraeus Bank",name:"Τράπεζα Πειραιώς","name:el":"Τράπεζα Πειραιώς","name:en":"Piraeus Bank"}},"amenity/bank|А-Банк":{countryCodes:["ua"],tags:{amenity:"bank",brand:"А-Банк","brand:wikidata":"Q28705400","brand:wikipedia":"uk:А-Банк",name:"А-Банк"}},"amenity/bank|Авангард":{countryCodes:["ru"],tags:{amenity:"bank",brand:"Авангард","brand:wikidata":"Q62122617",name:"Авангард"}},"amenity/bank|Альфа-Банк":{countryCodes:["by","kz","ru","ua"],tags:{amenity:"bank",brand:"Альфа-Банк","brand:en":"Alfa-Bank","brand:ru":"Альфа-Банк","brand:wikidata":"Q1377835","brand:wikipedia":"ru:Альфа-банк",name:"Альфа-Банк","name:en":"Alfa-Bank","name:ru":"Альфа-Банк"}},"amenity/bank|БПС-Сбербанк":{countryCodes:["by"],tags:{amenity:"bank",brand:"БПС-Сбербанк","brand:wikidata":"Q2074915","brand:wikipedia":"be:БПС-Сбербанк",name:"БПС-Сбербанк"}},"amenity/bank|Банк Дабрабыт":{countryCodes:["by"],tags:{amenity:"bank",brand:"Банк Дабрабыт","brand:wikidata":"Q63981850",name:"Банк Дабрабыт"}},"amenity/bank|Банка ДСК":{countryCodes:["bg"],tags:{amenity:"bank",brand:"Банка ДСК","brand:bg":"Банка ДСК","brand:en":"DSK Bank","brand:wikidata":"Q5206146","brand:wikipedia":"en:DSK Bank",name:"Банка ДСК","name:bg":"Банка ДСК","name:en":"DSK Bank"}},"amenity/bank|Белагропромбанк":{countryCodes:["by"],tags:{amenity:"bank",brand:"Белагропромбанк","brand:en":"Belagroprom Bank","brand:wikidata":"Q1991373","brand:wikipedia":"be:Белаграпрамбанк",name:"Белагропромбанк","name:en":"Belagroprom Bank"}},"amenity/bank|Беларусбанк":{countryCodes:["by"],tags:{amenity:"bank",brand:"Беларусбанк","brand:en":"Belarusbank","brand:wikidata":"Q1997334","brand:wikipedia":"en:Belarusbank",name:"Беларусбанк","name:en":"Belarusbank"}},"amenity/bank|Белинвестбанк":{countryCodes:["by"],tags:{amenity:"bank",brand:"Белинвестбанк","brand:wikidata":"Q4081940","brand:wikipedia":"ru:Белинвестбанк",name:"Белинвестбанк"}},"amenity/bank|Бинбанк":{countryCodes:["ru"],tags:{amenity:"bank",brand:"Бинбанк","brand:en":"B&N Bank","brand:wikidata":"Q4086829","brand:wikipedia":"en:B&N Bank",name:"Бинбанк","name:en":"B&N Bank"}},"amenity/bank|ВТБ":{countryCodes:["ru","ua"],matchNames:["втб банк москвы"],tags:{amenity:"bank",brand:"ВТБ","brand:en":"VTB Bank","brand:wikidata":"Q1549389","brand:wikipedia":"en:VTB Bank",name:"ВТБ","name:en":"VTB Bank"}},"amenity/bank|Возрождение":{countryCodes:["ru"],tags:{amenity:"bank",brand:"Возрождение","brand:wikidata":"Q4114952","brand:wikipedia":"ru:Возрождение (банк)",name:"Возрождение"}},"amenity/bank|Газпромбанк":{countryCodes:["ru"],tags:{amenity:"bank",brand:"Газпромбанк","brand:en":"Gazprombank","brand:wikidata":"Q1924338","brand:wikipedia":"en:Gazprombank",name:"Газпромбанк","name:en":"Gazprombank"}},"amenity/bank|Генбанк":{countryCodes:["ru"],tags:{amenity:"bank",brand:"Генбанк","brand:wikidata":"Q62122630",name:"Генбанк"}},"amenity/bank|Казкоммерцбанк":{countryCodes:["kz"],tags:{amenity:"bank",brand:"Казкоммерцбанк","brand:en":"Kazkommertsbank","brand:wikidata":"Q1168179","brand:wikipedia":"en:Kazkommertsbank",name:"Казкоммерцбанк","name:en":"Kazkommertsbank"}},"amenity/bank|Московский индустриальный банк":{countryCodes:["ru"],tags:{amenity:"bank",brand:"Московский индустриальный банк","brand:en":"Moscow Industrial Bank","brand:wikidata":"Q4304145","brand:wikipedia":"ru:Московский индустриальный банк",name:"Московский индустриальный банк","name:en":"Moscow Industrial Bank"}},"amenity/bank|Мособлбанк":{countryCodes:["ru"],tags:{amenity:"bank",brand:"Мособлбанк","brand:en":"Mosobl Bank","brand:wikidata":"Q4304446","brand:wikipedia":"ru:Мособлбанк",name:"Мособлбанк","name:en":"Mosobl Bank"}},"amenity/bank|Народный банк":{countryCodes:["kg","kz","uz"],tags:{amenity:"bank",brand:"Народный банк","brand:wikidata":"Q1046186","brand:wikipedia":"kk:Қазақстан Халық банкі",name:"Народный банк"}},"amenity/bank|ОТП Банк":{countryCodes:["ru","ua"],tags:{amenity:"bank",brand:"ОТП Банк","brand:en":"OTP Bank","brand:wikidata":"Q912778","brand:wikipedia":"en:OTP Bank",name:"ОТП Банк","name:en":"OTP Bank"}},"amenity/bank|Обединена Българска Банка":{countryCodes:["bg"],tags:{amenity:"bank",brand:"Обединена Българска Банка","brand:en":"United Bulgarian Bank","brand:wikidata":"Q7887555","brand:wikipedia":"en:United Bulgarian Bank",name:"Обединена Българска Банка","name:en":"United Bulgarian Bank"}},"amenity/bank|Открытие":{countryCodes:["ru"],matchNames:["банк открытие"],tags:{amenity:"bank",brand:"Открытие","brand:wikidata":"Q4327204","brand:wikipedia":"ru:Банк «Финансовая корпорация Открытие»",name:"Открытие"}},"amenity/bank|Ощадбанк":{countryCodes:["ua"],tags:{amenity:"bank",brand:"Ощадбанк","brand:en":"State Savings Bank of Ukraine","brand:wikidata":"Q4340839","brand:wikipedia":"uk:Ощадбанк",name:"Ощадбанк","name:en":"State Savings Bank of Ukraine"}},"amenity/bank|ПУМБ":{countryCodes:["ua"],tags:{amenity:"bank",brand:"ПУМБ","brand:en":"First Ukrainian International Bank","brand:wikidata":"Q4341156","brand:wikipedia":"en:First Ukrainian International Bank",name:"ПУМБ","name:en":"First Ukrainian International Bank"}},"amenity/bank|Почта Банк":{countryCodes:["ru"],tags:{amenity:"bank",brand:"Почта Банк","brand:en":"Post Bank","brand:wikidata":"Q24930461","brand:wikipedia":"en:Post Bank (Russia)",name:"Почта Банк","name:en":"Post Bank"}},"amenity/bank|Пощенска банка":{countryCodes:["bg"],tags:{amenity:"bank",brand:"Пощенска банка","brand:wikidata":"Q7234083","brand:wikipedia":"bg:Пощенска банка",name:"Пощенска банка","name:en":"Postbank"}},"amenity/bank|ПриватБанк":{tags:{amenity:"bank",brand:"ПриватБанк","brand:en":"PrivatBank","brand:wikidata":"Q1515015","brand:wikipedia":"uk:ПриватБанк",name:"ПриватБанк","name:en":"PrivatBank"}},"amenity/bank|Приднестровский Сбербанк":{countryCodes:["md"],matchNames:["приднестровский cбербанк"],tags:{amenity:"bank",brand:"Приднестровский Сбербанк","brand:en":"Pridnestrovian Savings Bank","brand:ru":"Приднестровский Сбербанк","brand:wikidata":"Q4378147","brand:wikipedia":"ru:Приднестровский Сбербанк",name:"Приднестровский Сбербанк","name:en":"Pridnestrovian Savings Bank","name:ru":"Приднестровский Сбербанк"}},"amenity/bank|Приорбанк":{countryCodes:["by"],tags:{amenity:"bank",brand:"Приорбанк","brand:en":"PriorBank","brand:wikidata":"Q3919658","brand:wikipedia":"be:Пріорбанк",name:"Приорбанк","name:en":"PriorBank"}},"amenity/bank|Промсвязьбанк":{countryCodes:["ru"],tags:{amenity:"bank",brand:"Промсвязьбанк","brand:en":"Promsvyazbank","brand:wikidata":"Q649100","brand:wikipedia":"en:Promsvyazbank",name:"Промсвязьбанк","name:en":"Promsvyazbank"}},"amenity/bank|РНКБ":{countryCodes:["ru","ua"],tags:{amenity:"bank",brand:"РНКБ","brand:wikidata":"Q16912944","brand:wikipedia":"en:Russian National Commercial Bank",name:"РНКБ"}},"amenity/bank|Райффайзен":{countryCodes:["ru","ua"],tags:{amenity:"bank",brand:"Райффайзен","brand:en":"Raiffeisenbank","brand:wikidata":"Q4389244","brand:wikipedia":"en:Raiffeisenbank (Russia)",name:"Райффайзен","name:en":"Raiffeisenbank"}},"amenity/bank|Райффайзен Банк Аваль":{countryCodes:["ua"],tags:{amenity:"bank",brand:"Райффайзен Банк Аваль","brand:en":"Raiffeisen Bank Aval","brand:wikidata":"Q4389243","brand:wikipedia":"en:Raiffeisen Bank Aval",name:"Райффайзен Банк Аваль","name:en":"Raiffeisen Bank Aval"}},"amenity/bank|Росбанк":{countryCodes:["ru"],tags:{amenity:"bank",brand:"Росбанк","brand:en":"Rosbank","brand:wikidata":"Q1119857","brand:wikipedia":"en:Rosbank",name:"Росбанк","name:en":"Rosbank"}},"amenity/bank|Россельхозбанк":{countryCodes:["ru"],tags:{amenity:"bank",brand:"Россельхозбанк","brand:en":"Rosselkhozbank","brand:wikidata":"Q3920226","brand:wikipedia":"en:Russian Agricultural Bank",name:"Россельхозбанк","name:en":"Rosselkhozbank"}},"amenity/bank|Русский Стандарт":{countryCodes:["ru"],tags:{amenity:"bank",brand:"Русский Стандарт","brand:en":"Russian Standard Bank","brand:wikidata":"Q4400854","brand:wikipedia":"en:Russian Standard Bank",name:"Русский Стандарт","name:en":"Russian Standard Bank"}},"amenity/bank|Сбербанк":{countryCodes:["kz","ru"],matchNames:["cбербанк","cбербанк россии","сбербанк россии"],tags:{amenity:"bank",brand:"Сбербанк","brand:en":"Sberbank","brand:ru":"Сбербанк","brand:wikidata":"Q205012","brand:wikipedia":"en:Sberbank of Russia",name:"Сбербанк","name:en":"Sberbank","name:ru":"Сбербанк"}},"amenity/bank|Совкомбанк":{countryCodes:["ru"],tags:{amenity:"bank",brand:"Совкомбанк","brand:en":"Sovcom Bank","brand:wikidata":"Q4426566","brand:wikipedia":"ru:Совкомбанк",name:"Совкомбанк","name:en":"Sovcom Bank"}},"amenity/bank|УкрСиббанк":{countryCodes:["ua"],tags:{amenity:"bank",brand:"УкрСиббанк","brand:en":"UkrSibbank","brand:wikidata":"Q1976290","brand:wikipedia":"en:UkrSibbank",name:"УкрСиббанк","name:en":"UkrSibbank"}},"amenity/bank|Укргазбанк":{countryCodes:["ua"],tags:{amenity:"bank",brand:"Укргазбанк","brand:en":"Ukrgasbank","brand:wikidata":"Q4470692","brand:wikipedia":"ru:Укргазбанк",name:"Укргазбанк","name:en":"Ukrgasbank"}},"amenity/bank|Укрсоцбанк":{countryCodes:["ua"],tags:{amenity:"bank",brand:"Укрсоцбанк","brand:en":"Ukrsotsbank","brand:wikidata":"Q3547885","brand:wikipedia":"en:Ukrsotsbank",name:"Укрсоцбанк","name:en":"Ukrsotsbank"}},"amenity/bank|Уралсиб":{countryCodes:["ru"],tags:{amenity:"bank",brand:"Уралсиб","brand:en":"Uralsib bank","brand:wikidata":"Q4476693","brand:wikipedia":"ru:Уралсиб (банк)",name:"Уралсиб","name:en":"Uralsib bank"}},"amenity/bank|Хаан банк":{countryCodes:["mn"],tags:{amenity:"bank",brand:"Хаан банк","brand:wikidata":"Q25632240","brand:wikipedia":"mn:ХААН банк",name:"Хаан банк"}},"amenity/bank|Хоум Кредит":{countryCodes:["ru"],tags:{amenity:"bank",brand:"Хоум Кредит","brand:en":"Home Credit & Finance Bank","brand:wikidata":"Q4500466","brand:wikipedia":"en:Home Credit & Finance Bank",name:"Хоум Кредит","name:en":"Home Credit & Finance Bank"}},"amenity/bank|בנק אגוד":{countryCodes:["il"],tags:{"alt_name:en":"Bank Igud",amenity:"bank",brand:"בנק אגוד","brand:en":"Union Bank of Israel","brand:he":"בנק אגוד","brand:wikidata":"Q2903265","brand:wikipedia":"en:Union Bank of Israel",name:"בנק אגוד","name:en":"Union Bank of Israel","name:he":"בנק אגוד"}},"amenity/bank|בנק אוצר החייל":{countryCodes:["il"],tags:{amenity:"bank",brand:"בנק אוצר החייל","brand:en":"Bank Otsar Ha-Hayal","brand:he":"בנק אוצר החייל","brand:wikidata":"Q2900674","brand:wikipedia":"en:Bank Otsar Ha-Hayal",name:"בנק אוצר החייל","name:en":"Bank Otsar Ha-Hayal","name:he":"בנק אוצר החייל"}},"amenity/bank|בנק דיסקונט":{countryCodes:["il"],tags:{amenity:"bank",brand:"בנק דיסקונט לישראל","brand:en":"Israel Discount Bank","brand:he":"בנק דיסקונט לישראל","brand:wikidata":"Q250362","brand:wikipedia":"en:Israel Discount Bank",name:"בנק דיסקונט","name:en":"Bank Discount","name:he":"בנק דיסקונט"}},"amenity/bank|בנק הפועלים":{countryCodes:["il"],tags:{amenity:"bank",brand:"בנק הפועלים","brand:en":"Bank Hapoalim","brand:he":"בנק הפועלים","brand:wikidata":"Q2666775","brand:wikipedia":"en:Bank Hapoalim",name:"בנק הפועלים","name:en":"Bank Hapoalim","name:he":"בנק הפועלים"}},"amenity/bank|בנק יהד":{countryCodes:["il"],tags:{amenity:"bank",brand:"בנק יהד","brand:en":"Bank Yahav","brand:he":"בנק יהד","brand:wikidata":"Q7187611","brand:wikipedia":"he:בנק יהב",name:"בנק יהד","name:en":"Bank Yahav","name:he":"בנק יהד"}},"amenity/bank|בנק ירושלים":{countryCodes:["il"],tags:{amenity:"bank",brand:"בנק ירושלים","brand:en":"Bank of Jerusalem","brand:he":"בנק ירושלים","brand:wikidata":"Q2900227","brand:wikipedia":"en:Bank of Jerusalem",name:"בנק ירושלים","name:en":"Bank of Jerusalem","name:he":"בנק ירושלים"}},"amenity/bank|בנק לאומי":{countryCodes:["il"],tags:{amenity:"bank",brand:"בנק לאומי","brand:en":"Bank Leumi","brand:he":"בנק לאומי","brand:wikidata":"Q806641","brand:wikipedia":"en:Bank Leumi",name:"בנק לאומי","name:en":"Bank Leumi","name:he":"בנק לאומי"}},"amenity/bank|בנק מסד":{countryCodes:["il"],tags:{amenity:"bank",brand:"בנק מסד","brand:en":"Bank Massad","brand:he":"בנק מסד","brand:wikidata":"Q7187667","brand:wikipedia":"en:Bank Massad",name:"בנק מסד","name:en":"Bank Massad","name:he":"בנק מסד"}},"amenity/bank|הבנק הבינלאומי":{countryCodes:["il"],tags:{amenity:"bank",brand:"הבנק הבינלאומי","brand:en":"First International Bank of Israel","brand:he":"הבנק הבינלאומי","brand:wikidata":"Q2777497","brand:wikipedia":"en:First International Bank of Israel",name:"הבנק הבינלאומי","name:en":"First International Bank of Israel","name:he":"הבנק הבינלאומי"}},"amenity/bank|מזרחי טפחות":{countryCodes:["il"],tags:{amenity:"bank",brand:"מזרחי טפחות","brand:en":"Mizrahi-Tefahot","brand:he":"מזרחי טפחות","brand:wikidata":"Q2777129","brand:wikipedia":"en:Bank Mizrahi-Tefahot",name:"בנק מזרחי טפחות","name:en":"Bank Mizrahi-Tefahot","name:he":"בנק מזרחי טפחות"}},"amenity/bank|بانک آینده":{countryCodes:["ir"],tags:{amenity:"bank",brand:"بانک آینده","brand:en":"Ayandeh Bank","brand:wikidata":"Q5938144","brand:wikipedia":"en:Ayandeh Bank",name:"بانک آینده","name:en":"Ayandeh Bank"}},"amenity/bank|بانک اقتصاد نوین":{countryCodes:["ir"],tags:{amenity:"bank",brand:"بانک اقتصاد نوین","brand:en":"EN Bank","brand:wikidata":"Q5323768","brand:wikipedia":"en:EN Bank",name:"بانک اقتصاد نوین","name:en":"EN Bank"}},"amenity/bank|بانک انصار":{countryCodes:["ir"],tags:{amenity:"bank",brand:"بانک انصار","brand:wikidata":"Q5862675","brand:wikipedia":"fa:بانک انصار",name:"بانک انصار"}},"amenity/bank|بانک ایران زمین":{countryCodes:["ir"],tags:{amenity:"bank",brand:"بانک ایران زمین","brand:wikidata":"Q5934423","brand:wikipedia":"en:Iran Zamin Bank",name:"بانک ایران زمین"}},"amenity/bank|بانک تجارت":{countryCodes:["ir"],tags:{amenity:"bank",brand:"بانک تجارت","brand:wikidata":"Q7695198","brand:wikipedia":"en:Tejarat Bank",name:"بانک تجارت"}},"amenity/bank|بانک توسعه تعاون":{countryCodes:["ir"],tags:{amenity:"bank",brand:"بانک توسعه تعاون","brand:wikidata":"Q5684450","brand:wikipedia":"fa:بانک توسعه تعاون",name:"بانک توسعه تعاون"}},"amenity/bank|بانک رفاه":{countryCodes:["ir"],matchNames:["بانک رفاه کارگران"],tags:{amenity:"bank",brand:"بانک رفاه","brand:en":"Refah Bank","brand:wikidata":"Q7307083","brand:wikipedia":"en:Refah Bank",name:"بانک رفاه","name:en":"Refah Bank"}},"amenity/bank|بانک سامان":{countryCodes:["ir"],tags:{amenity:"bank",brand:"بانک سامان","brand:en":"Saman Bank","brand:wikidata":"Q4117676","brand:wikipedia":"en:Saman Bank",name:"بانک سامان","name:en":"Saman Bank"}},"amenity/bank|بانک سرمایه":{countryCodes:["ir"],tags:{amenity:"bank",brand:"بانک سرمایه","brand:en":"Sarmayeh Bank","brand:wikidata":"Q7424291","brand:wikipedia":"en:Sarmayeh Bank",name:"بانک سرمایه","name:en":"Sarmayeh Bank"}},"amenity/bank|بانک سپه":{countryCodes:["ir"],tags:{amenity:"bank",brand:"بانک سپه","brand:en":"Bank Sepah","brand:wikidata":"Q2882624","brand:wikipedia":"en:Bank Sepah",name:"بانک سپه","name:en":"Bank Sepah"}},"amenity/bank|بانک سینا":{countryCodes:["ir"],tags:{amenity:"bank",brand:"بانک سینا","brand:en":"Sina Bank","brand:wikidata":"Q10860246","brand:wikipedia":"en:Sina Bank",name:"بانک سینا","name:en":"Sina Bank"}},"amenity/bank|بانک شهر":{countryCodes:["ir"],tags:{amenity:"bank",brand:"بانک شهر","brand:en":"Shahr Bank","brand:wikidata":"Q5941033","brand:wikipedia":"fa:بانک شهر",name:"بانک شهر","name:en":"Shahr Bank"}},"amenity/bank|بانک صادرات":{countryCodes:["ir"],matchNames:["بانک صادرات ایران","صادرات"],tags:{amenity:"bank",brand:"بانک صادرات","brand:en":"Bank Saderat Iran","brand:wikidata":"Q2882608","brand:wikipedia":"en:Bank Saderat Iran",name:"بانک صادرات","name:en":"Bank Saderat Iran"}},"amenity/bank|بانک قوامین":{countryCodes:["ir"],tags:{amenity:"bank",brand:"بانک قوامین","brand:en":"Ghavamin Bank","brand:wikidata":"Q10860253","brand:wikipedia":"en:Ghavamin Bank",name:"بانک قوامین","name:en":"Ghavamin Bank"}},"amenity/bank|بانک مسکن":{countryCodes:["ir"],tags:{amenity:"bank",brand:"بانک مسکن","brand:en":"Bank Maskan","brand:wikidata":"Q4855942","brand:wikipedia":"en:Bank Maskan",name:"بانک مسکن","name:en":"Bank Maskan"}},"amenity/bank|بانک ملت":{countryCodes:["ir"],tags:{amenity:"bank",brand:"بانک ملت","brand:en":"Bank Mellat","brand:wikidata":"Q4855944","brand:wikipedia":"en:Bank Mellat",name:"بانک ملت","name:en":"Bank Mellat"}},"amenity/bank|بانک ملی":{countryCodes:["ir"],matchNames:["بانک ملی ایران","ملی"],tags:{amenity:"bank",brand:"بانک ملی","brand:en":"Bank Melli Iran","brand:wikidata":"Q806640","brand:wikipedia":"en:Bank Melli Iran",name:"بانک ملی","name:en":"Bank Melli Iran"}},"amenity/bank|بانک مهر اقتصاد":{countryCodes:["ir"],tags:{amenity:"bank",brand:"بانک مهر اقتصاد","brand:wikidata":"Q5942921","brand:wikipedia":"fa:بانک مهر اقتصاد",name:"بانک مهر اقتصاد","name:en":"Mehr Eqtesad Bank"}},"amenity/bank|بانک پارسیان":{countryCodes:["ir"],tags:{amenity:"bank",brand:"بانک پارسیان","brand:en":"Parsian Bank","brand:wikidata":"Q2410404","brand:wikipedia":"en:Parsian Bank",name:"بانک پارسیان","name:en":"Parsian Bank"}},"amenity/bank|بانک پاسارگاد":{countryCodes:["ir"],tags:{amenity:"bank",brand:"بانک پاسارگاد","brand:en":"Bank Pasargad","brand:wikidata":"Q4855962","brand:wikipedia":"en:Bank Pasargad",name:"بانک پاسارگاد","name:en":"Bank Pasargad"}},"amenity/bank|بانک کشاورزی":{countryCodes:["ir"],tags:{amenity:"bank",brand:"بانک کشاورزی","brand:en":"Bank Keshavarzi Iran","brand:wikidata":"Q6395007","brand:wikipedia":"en:Bank Keshavarzi Iran",name:"بانک کشاورزی","name:en":"Bank Keshavarzi Iran"}},"amenity/bank|پست بانک":{countryCodes:["ir"],tags:{amenity:"bank",brand:"پست بانک","brand:en":"Post Bank of Iran","brand:wikidata":"Q7233625","brand:wikipedia":"en:Post Bank of Iran",name:"پست بانک","name:en":"Post Bank of Iran"}},"amenity/bank|অগ্রণী ব্যাংক লিমিটেড":{countryCodes:["bd"],tags:{amenity:"bank",brand:"অগ্রণী ব্যাংক লিমিটেড","brand:wikidata":"Q517050","brand:wikipedia":"en:Agrani Bank",name:"অগ্রণী ব্যাংক লিমিটেড","name:en":"Agrani Bank"}},"amenity/bank|গ্রামীণ ব্যাংক":{countryCodes:["bd"],tags:{amenity:"bank",brand:"গ্রামীণ ব্যাংক","brand:wikidata":"Q188567","brand:wikipedia":"en:Grameen Bank",name:"গ্রামীণ ব্যাংক","name:en":"Grameen Bank"}},"amenity/bank|জনতা ব্যাংক লিমিটেড":{tags:{amenity:"bank",brand:"জনতা ব্যাংক লিমিটেড",name:"জনতা ব্যাংক লিমিটেড"}},"amenity/bank|বাংলাদেশ কৃষি ব্যাংক":{countryCodes:["bd"],tags:{amenity:"bank",brand:"বাংলাদেশ কৃষি ব্যাংক","brand:wikidata":"Q16345932","brand:wikipedia":"en:Bangladesh Krishi Bank",name:"বাংলাদেশ কৃষি ব্যাংক","name:en":"Bangladesh Krishi Bank"}},"amenity/bank|সোনালী ব্যাংক লিমিটেড":{countryCodes:["bd"],tags:{amenity:"bank",brand:"সোনালী ব্যাংক লিমিটেড",name:"সোনালী ব্যাংক লিমিটেড"}},"amenity/bank|ธนาคารกรุงเทพ":{countryCodes:["th"],tags:{amenity:"bank",brand:"ธนาคารกรุงเทพ","brand:en":"Bangkok Bank","brand:th":"ธนาคารกรุงเทพ","brand:wikidata":"Q806483","brand:wikipedia":"en:Bangkok Bank",name:"ธนาคารกรุงเทพ","name:en":"Bangkok Bank","name:th":"ธนาคารกรุงเทพ"}},"amenity/bank|ธนาคารกรุงไทย":{countryCodes:["th"],tags:{amenity:"bank",brand:"ธนาคารกรุงไทย","brand:en":"Krung Thai Bank","brand:th":"ธนาคารกรุงไทย","brand:wikidata":"Q962865","brand:wikipedia":"en:Krung Thai Bank",name:"ธนาคารกรุงไทย","name:en":"Krung Thai Bank","name:th":"ธนาคารกรุงไทย"}},"amenity/bank|ธนาคารกสิกรไทย":{countryCodes:["th"],tags:{amenity:"bank",brand:"ธนาคารกสิกรไทย","brand:en":"en:Kasikornbank","brand:th":"ธนาคารกสิกรไทย","brand:wikidata":"Q276557","brand:wikipedia":"en:Kasikornbank",name:"ธนาคารกสิกรไทย","name:en":"en:Kasikornbank","name:th":"ธนาคารกสิกรไทย"}},"amenity/bank|ธนาคารออมสิน":{countryCodes:["th"],tags:{amenity:"bank",brand:"ธนาคารออมสิน","brand:en":"Government Savings Bank","brand:th":"ธนาคารออมสิน","brand:wikidata":"Q6579041","brand:wikipedia":"en:Government Savings Bank (Thailand)",name:"ธนาคารออมสิน","name:en":"Government Savings Bank","name:th":"ธนาคารออมสิน"}},"amenity/bank|ธนาคารไทยพาณิชย์":{countryCodes:["th"],tags:{amenity:"bank",brand:"ธนาคารไทยพาณิชย์","brand:en":"Siam Commercial Bank","brand:th":"ธนาคารไทยพาณิชย์","brand:wikidata":"Q2038986","brand:wikipedia":"en:Siam Commercial Bank",name:"ธนาคารไทยพาณิชย์","name:en":"Siam Commercial Bank","name:th":"ธนาคารไทยพาณิชย์"}},"amenity/bank|みずほ銀行":{countryCodes:["jp"],tags:{amenity:"bank",brand:"みずほ銀行","brand:en":"Mizuho Bank","brand:ja":"みずほ銀行","brand:wikidata":"Q2882956","brand:wikipedia":"en:Mizuho Bank",name:"みずほ銀行","name:en":"Mizuho Bank","name:ja":"みずほ銀行"}},"amenity/bank|ゆうちょ銀行":{countryCodes:["jp"],tags:{amenity:"bank",brand:"ゆうちょ銀行","brand:en":"Japan Post Bank","brand:ja":"ゆうちょ銀行","brand:wikidata":"Q907103","brand:wikipedia":"ja:ゆうちょ銀行",name:"ゆうちょ銀行","name:en":"Japan Post Bank","name:ja":"ゆうちょ銀行"}},"amenity/bank|りそな銀行":{countryCodes:["jp"],tags:{amenity:"bank",brand:"りそな銀行","brand:en":"Resona Bank","brand:ja":"りそな銀行","brand:wikidata":"Q11281447","brand:wikipedia":"ja:りそな銀行",name:"りそな銀行","name:en":"Resona Bank","name:ja":"りそな銀行"}},"amenity/bank|三井住友銀行":{countryCodes:["jp"],tags:{amenity:"bank",brand:"三井住友銀行","brand:en":"Sumitomo Mitsui Banking Corporation","brand:wikidata":"Q2660418","brand:wikipedia":"en:Sumitomo Mitsui Banking Corporation",name:"三井住友銀行","name:en":"Sumitomo Mitsui Banking Corporation"}},"amenity/bank|三菱東京UFJ銀行":{countryCodes:["jp"],tags:{amenity:"bank",brand:"三菱東京UFJ銀行","brand:en":"MUFG Bank","brand:wikidata":"Q988284","brand:wikipedia":"en:MUFG Bank",name:"三菱東京UFJ銀行","name:en":"MUFG Bank"}},"amenity/bank|上海商業儲蓄銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"上海商業儲蓄銀行","brand:en":"Shanghai Commercial and Savings Bank","brand:wikidata":"Q4207208","brand:wikipedia":"en:Shanghai Commercial and Savings Bank",name:"上海商業儲蓄銀行","name:en":"Shanghai Commercial and Savings Bank"}},"amenity/bank|上海浦东发展银行":{tags:{amenity:"bank",brand:"上海浦东发展银行",name:"上海浦东发展银行"}},"amenity/bank|东亚银行":{countryCodes:["cn"],tags:{amenity:"bank",brand:"东亚银行","brand:wikidata":"Q806679","brand:wikipedia":"en:Bank of East Asia",name:"东亚银行","name:en":"Bank of East Asia"}},"amenity/bank|中信银行":{countryCodes:["cn"],tags:{amenity:"bank",brand:"中信银行","brand:en":"China CITIC Bank","brand:wikidata":"Q38960","brand:wikipedia":"en:China CITIC Bank",name:"中信银行"}},"amenity/bank|中国光大银行":{tags:{amenity:"bank",brand:"中国光大银行",name:"中国光大银行"}},"amenity/bank|中国农业银行":{countryCodes:["cn"],tags:{amenity:"bank",brand:"中国农业银行","brand:en":"Agricultural Bank of China","brand:wikidata":"Q26298","brand:wikipedia":"en:Agricultural Bank of China",name:"中国农业银行","name:en":"Agricultural Bank of China"}},"amenity/bank|中国工商银行":{countryCodes:["cn"],tags:{amenity:"bank",brand:"中国工商银行","brand:en":"Industrial and Commercial Bank of China","brand:wikidata":"Q26463","brand:wikipedia":"en:Industrial and Commercial Bank of China",name:"中国工商银行","name:en":"Industrial and Commercial Bank of China"}},"amenity/bank|中国建设银行":{countryCodes:["cn"],tags:{amenity:"bank",brand:"中国建设银行","brand:en":"China Construction Bank","brand:wikidata":"Q26299","brand:wikipedia":"en:China Construction Bank",name:"中国建设银行","name:en":"China Construction Bank"}},"amenity/bank|中国民生银行":{countryCodes:["cn"],tags:{amenity:"bank",brand:"中国民生银行","brand:en":"China Minsheng Bank","brand:wikidata":"Q911543","brand:wikipedia":"en:China Minsheng Bank",name:"中国民生银行","name:en":"China Minsheng Bank"}},"amenity/bank|中国邮政储蓄银行":{countryCodes:["cn"],tags:{amenity:"bank",brand:"中国邮政储蓄银行","brand:en":"Postal Savings Bank of China","brand:wikidata":"Q986744","brand:wikipedia":"en:Postal Savings Bank of China",name:"中国邮政储蓄银行","name:en":"Postal Savings Bank of China"}},"amenity/bank|中国银行":{countryCodes:["cn"],tags:{amenity:"bank",brand:"中国银行","brand:en":"Bank of China","brand:wikidata":"Q790068","brand:wikipedia":"en:Bank of China",name:"中国银行","name:en":"Bank of China"}},"amenity/bank|中國信託商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"中國信託商業銀行","brand:en":"CTBC Bank","brand:wikidata":"Q5100191","brand:wikipedia":"en:CTBC Bank",name:"中國信託商業銀行","name:en":"CTBC Bank"}},"amenity/bank|交通银行":{countryCodes:["cn"],tags:{amenity:"bank",brand:"交通银行","brand:en":"Bank of Communications","brand:wikidata":"Q806680","brand:wikipedia":"en:Bank of Communications",name:"交通银行","name:en":"Bank of Communications"}},"amenity/bank|京城商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"京城商業銀行","brand:wikidata":"Q10883132","brand:wikipedia":"zh:京城商業銀行",name:"京城商業銀行"}},"amenity/bank|京都中央信用金庫":{countryCodes:["jp"],tags:{amenity:"bank",brand:"京都中央信用金庫","brand:en":"Kyoto Chuo Shinkin Bank","brand:wikidata":"Q11374844","brand:wikipedia":"ja:京都中央信用金庫",name:"京都中央信用金庫","name:en":"Kyoto Chuo Shinkin Bank"}},"amenity/bank|京都銀行":{countryCodes:["jp"],tags:{amenity:"bank",brand:"京都銀行","brand:en":"Bank of Kyoto","brand:wikidata":"Q11375713","brand:wikipedia":"en:Bank of Kyoto",name:"京都銀行","name:en":"Bank of Kyoto"}},"amenity/bank|元大商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"元大商業銀行","brand:en":"Yuanta Commercial Bank","brand:wikidata":"Q10889602","brand:wikipedia":"zh:元大商業銀行",name:"元大商業銀行","name:en":"Yuanta Commercial Bank"}},"amenity/bank|兆豐國際商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"兆豐國際商業銀行","brand:en":"Mega International Commercial Bank","brand:wikidata":"Q709757","brand:wikipedia":"en:Mega International Commercial Bank",name:"兆豐國際商業銀行","name:en":"Mega International Commercial Bank"}},"amenity/bank|兴业银行":{tags:{amenity:"bank",brand:"兴业银行",name:"兴业银行"}},"amenity/bank|农业银行":{countryCodes:["cn"],tags:{amenity:"bank",brand:"农业银行","brand:wikidata":"Q26298","brand:wikipedia":"zh:中国农业银行",name:"农业银行"}},"amenity/bank|北京银行":{tags:{amenity:"bank",brand:"北京银行",name:"北京银行"}},"amenity/bank|北洋銀行":{countryCodes:["jp"],tags:{amenity:"bank",brand:"北洋銀行","brand:en":"North Pacific Bank","brand:wikidata":"Q11402354","brand:wikipedia":"ja:北洋銀行",name:"北洋銀行","name:en":"North Pacific Bank"}},"amenity/bank|北海道銀行":{countryCodes:["jp"],tags:{amenity:"bank",brand:"北海道銀行","brand:en":"Hokkaido Bank","brand:wikidata":"Q5878076","brand:wikipedia":"en:Hokkaido Bank",name:"北海道銀行","name:en":"Hokkaido Bank"}},"amenity/bank|台中商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"台中商業銀行","brand:en":"Taichung Bank","brand:wikidata":"Q6136958","brand:wikipedia":"en:Taichung Bank",name:"台中商業銀行","name:en":"Taichung Bank"}},"amenity/bank|台北富邦商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"台北富邦商業銀行","brand:en":"Taipei Fubon Bank","brand:wikidata":"Q697293","brand:wikipedia":"en:Taipei Fubon Bank",name:"台北富邦商業銀行","name:en":"Taipei Fubon Bank"}},"amenity/bank|台新國際商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"台新國際商業銀行","brand:en":"Taishin International Bank","brand:wikidata":"Q7676420","brand:wikipedia":"en:Taishin International Bank",name:"台新國際商業銀行","name:en":"Taishin International Bank"}},"amenity/bank|合作金庫商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"合作金庫商業銀行","brand:en":"Taiwan Cooperative Bank","brand:wikidata":"Q701540","brand:wikipedia":"en:Taiwan Cooperative Bank",name:"合作金庫商業銀行","name:en":"Taiwan Cooperative Bank"}},"amenity/bank|國泰世華商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"國泰世華商業銀行","brand:en":"Cathay United Bank","brand:wikidata":"Q702656","brand:wikipedia":"en:Cathay United Bank",name:"國泰世華商業銀行","name:en":"Cathay United Bank"}},"amenity/bank|大眾商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"大眾商業銀行","brand:en":"Ta Chong Commercial Bank","brand:wikidata":"Q10937047","brand:wikipedia":"zh:大眾商業銀行",name:"大眾商業銀行","name:en":"Ta Chong Commercial Bank"}},"amenity/bank|安泰商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"安泰商業銀行","brand:en":"Entie Commercial Bank","brand:wikidata":"Q10946952","brand:wikipedia":"zh:安泰商業銀行",name:"安泰商業銀行","name:en":"Entie Commercial Bank"}},"amenity/bank|工商银行":{countryCodes:["cn"],tags:{amenity:"bank",brand:"工商银行","brand:en":"Industrial and Commercial Bank of China","brand:wikidata":"Q26463","brand:wikipedia":"en:Industrial and Commercial Bank of China",name:"工商银行","name:en":"Industrial and Commercial Bank of China"}},"amenity/bank|常陽銀行":{countryCodes:["jp"],tags:{amenity:"bank",brand:"常陽銀行","brand:wikidata":"Q6297774","brand:wikipedia":"en:Joyo Bank",name:"常陽銀行"}},"amenity/bank|建设银行":{countryCodes:["cn"],tags:{amenity:"bank",brand:"建设银行","brand:wikidata":"Q26299","brand:wikipedia":"zh:中国建设银行",name:"建设银行"}},"amenity/bank|彰化商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"彰化商業銀行","brand:en":"Chang Hwa Bank","brand:wikidata":"Q5071627","brand:wikipedia":"en:Chang Hwa Bank",name:"彰化商業銀行","name:en":"Chang Hwa Bank"}},"amenity/bank|招商银行":{countryCodes:["cn"],tags:{amenity:"bank",brand:"招商银行","brand:en":"China Merchants Bank","brand:wikidata":"Q1073327","brand:wikipedia":"en:China Merchants Bank",name:"招商银行","name:en":"China Merchants Bank"}},"amenity/bank|日本銀行":{countryCodes:["jp"],tags:{amenity:"bank",brand:"日本銀行","brand:en":"Bank of Japan","brand:wikidata":"Q333101","brand:wikipedia":"ja:日本銀行",name:"日本銀行","name:en":"Bank of Japan"}},"amenity/bank|東亞銀行":{countryCodes:["hk"],tags:{amenity:"bank",brand:"東亞銀行","brand:en":"Bank of East Asia","brand:wikidata":"Q806679","brand:wikipedia":"zh:東亞銀行","brand:zh-Hans":"东亚银行","brand:zh-Hant":"東亞銀行",name:"東亞銀行 BEA","name:en":"Bank of East Asia","name:zh-Hans":"东亚银行","name:zh-Hant":"東亞銀行"}},"amenity/bank|板信商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"板信商業銀行","brand:en":"Bank of Panshin","brand:wikidata":"Q11104946","brand:wikipedia":"zh:板信商業銀行",name:"板信商業銀行","name:en":"Bank of Panshin"}},"amenity/bank|横浜銀行":{countryCodes:["jp"],tags:{amenity:"bank",brand:"横浜銀行","brand:en":"Bank of Yokohama","brand:wikidata":"Q2744340","brand:wikipedia":"en:Bank of Yokohama",name:"横浜銀行","name:en":"Bank of Yokohama"}},"amenity/bank|永豐商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"永豐商業銀行","brand:en":"Bank SinoPac","brand:wikidata":"Q4855976","brand:wikipedia":"en:Bank SinoPac",name:"永豐商業銀行","name:en":"Bank SinoPac"}},"amenity/bank|渣打國際商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"渣打國際商業銀行","brand:wikidata":"Q62267023",name:"渣打國際商業銀行"}},"amenity/bank|玉山商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"玉山商業銀行","brand:en":"E.SUN Commercial Bank","brand:wikidata":"Q5321663","brand:wikipedia":"en:E.SUN Commercial Bank",name:"玉山商業銀行","name:en":"E.SUN Commercial Bank"}},"amenity/bank|第一商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"第一商業銀行","brand:en":"First Commercial Bank","brand:wikidata":"Q11602128","brand:wikipedia":"zh:第一商業銀行",name:"第一商業銀行","name:en":"First Commercial Bank"}},"amenity/bank|聯邦商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"聯邦商業銀行","brand:en":"Union Bank of Taiwan","brand:wikidata":"Q15927195","brand:wikipedia":"zh:聯邦商業銀行",name:"聯邦商業銀行","name:en":"Union Bank of Taiwan"}},"amenity/bank|臺灣中小企業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"臺灣中小企業銀行","brand:en":"Taiwan Business Bank","brand:wikidata":"Q15913812","brand:wikipedia":"zh:臺灣中小企業銀行",name:"臺灣中小企業銀行","name:en":"Taiwan Business Bank"}},"amenity/bank|臺灣土地銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"臺灣土地銀行","brand:en":"Land Bank of Taiwan","brand:wikidata":"Q717592","brand:wikipedia":"en:Land Bank of Taiwan",name:"臺灣土地銀行","name:en":"Land Bank of Taiwan"}},"amenity/bank|臺灣新光商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"臺灣新光商業銀行","brand:en":"Shin Kong Commercial Bank","brand:wikidata":"Q15909616","brand:wikipedia":"zh:臺灣新光商業銀行",name:"臺灣新光商業銀行","name:en":"Shin Kong Commercial Bank"}},"amenity/bank|臺灣銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"臺灣銀行","brand:en":"Bank of Taiwan","brand:wikidata":"Q706533","brand:wikipedia":"en:Bank of Taiwan",name:"臺灣銀行","name:en":"Bank of Taiwan"}},"amenity/bank|華南商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"華南商業銀行","brand:en":"Hua Nan Commercial Bank","brand:wikidata":"Q11620043","brand:wikipedia":"zh:華南銀行",name:"華南商業銀行","name:en":"Hua Nan Commercial Bank"}},"amenity/bank|遠東國際商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"遠東國際商業銀行","brand:en":"Far Eastern International Bank","brand:wikidata":"Q15911143","brand:wikipedia":"zh:遠東國際商業銀行",name:"遠東國際商業銀行","name:en":"Far Eastern International Bank"}},"amenity/bank|陽信商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"陽信商業銀行","brand:en":"Sunny Commercial Bank","brand:wikidata":"Q11658759","brand:wikipedia":"zh:陽信商業銀行",name:"陽信商業銀行","name:en":"Sunny Commercial Bank"}},"amenity/bank|静岡銀行":{countryCodes:["jp"],tags:{amenity:"bank",brand:"静岡銀行","brand:en":"Shizuoka Bank","brand:wikidata":"Q7499501","brand:wikipedia":"en:Shizuoka Bank",name:"静岡銀行","name:en":"Shizuoka Bank"}},"amenity/bank|국민은행":{countryCodes:["kr"],matchNames:["국민은행 (gungmin bank)"],tags:{amenity:"bank",brand:"국민은행","brand:en":"KB Kookmin Bank","brand:ko":"국민은행","brand:wikidata":"Q496606","brand:wikipedia":"en:KB Financial Group Inc",name:"국민은행","name:en":"KB Kookmin Bank","name:ko":"국민은행"}},"amenity/bank|기업은행":{countryCodes:["kr"],tags:{amenity:"bank",brand:"기업은행","brand:en":"Industrial Bank of Korea","brand:ko":"기업은행","brand:wikidata":"Q483855","brand:wikipedia":"en:Industrial Bank of Korea",name:"기업은행","name:en":"Industrial Bank of Korea","name:ko":"기업은행"}},"amenity/bank|농협":{countryCodes:["kr"],matchNames:["nh농협은행"],tags:{amenity:"bank",brand:"농협","brand:en":"NH","brand:ko":"농협","brand:wikidata":"Q15283673","brand:wikipedia":"ko:NH농협은행",name:"농협","name:en":"NH","name:ko":"농협"}},"amenity/bank|새마을금고":{countryCodes:["kr"],tags:{amenity:"bank",brand:"새마을금고","brand:ko":"새마을금고","brand:wikidata":"Q12600614","brand:wikipedia":"ko:새마을금고",name:"새마을금고","name:ko":"새마을금고"}},"amenity/bank|신한은행":{countryCodes:["kr"],matchNames:["신한은행 (sinhan bank)"],tags:{amenity:"bank",brand:"신한은행","brand:en":"Sinhan Bank","brand:ko":"신한은행","brand:wikidata":"Q487230","brand:wikipedia":"en:Shinhan Bank",name:"신한은행","name:en":"Sinhan Bank","name:ko":"신한은행"}},"amenity/bank|우리은행":{countryCodes:["kr"],matchNames:["우리은행 (uri bank)"],tags:{amenity:"bank",brand:"우리은행","brand:en":"Woori Bank","brand:ko":"우리은행","brand:wikidata":"Q494369","brand:wikipedia":"en:Woori Bank",name:"우리은행","name:en":"Woori Bank","name:ko":"우리은행"}},"amenity/bank|하나은행":{countryCodes:["kr"],tags:{amenity:"bank",brand:"하나은행","brand:en":"Korea Exchange Bank","brand:ko":"하나은행","brand:wikidata":"Q484047","brand:wikipedia":"en:Korea Exchange Bank",name:"하나은행","name:en":"Korea Exchange Bank","name:ko":"하나은행"}},"amenity/bar|All Bar One":{countryCodes:["gb"],tags:{amenity:"bar",brand:"All Bar One","brand:wikidata":"Q4728624","brand:wikipedia":"en:All Bar One",name:"All Bar One"}},"amenity/bar|Revolución de Cuba":{countryCodes:["gb"],tags:{amenity:"bar",brand:"Revolución de Cuba","brand:wikidata":"Q64024691",name:"Revolución de Cuba"}},"amenity/bar|Revolution":{countryCodes:["gb"],tags:{amenity:"bar",brand:"Revolution","brand:wikidata":"Q64024398",name:"Revolution"}},"amenity/bicycle_rental|Call a Bike":{countryCodes:["de"],tags:{amenity:"bicycle_rental",brand:"Call a Bike","brand:wikidata":"Q1060525","brand:wikipedia":"en:Call a Bike",name:"Call a Bike"}},"amenity/bicycle_rental|Grid":{countryCodes:["us"],tags:{amenity:"bicycle_rental",brand:"Grid","brand:wikidata":"Q62104168",name:"Grid"}},"amenity/bicycle_rental|MiBici":{countryCodes:["mx"],tags:{amenity:"bicycle_rental",brand:"MiBici","brand:wikidata":"Q60966987","brand:wikipedia":"es:MiBici",name:"MiBici"}},"amenity/bicycle_rental|Swapfiets":{countryCodes:["be","de","dk","nl"],tags:{amenity:"bicycle_rental",brand:"Swapfiets","brand:wikidata":"Q62104374",name:"Swapfiets"}},"amenity/bicycle_rental|metropolradruhr":{countryCodes:["de"],tags:{amenity:"bicycle_rental",brand:"metropolradruhr","brand:wikidata":"Q62104274",name:"metropolradruhr"}},"amenity/bicycle_rental|nextbike":{countryCodes:["at","de"],tags:{amenity:"bicycle_rental",brand:"nextbike","brand:wikidata":"Q2351279","brand:wikipedia":"de:Nextbike",name:"nextbike"}},"amenity/bureau_de_change|CADECA":{countryCodes:["cu"],tags:{amenity:"bureau_de_change",brand:"CADECA","brand:wikidata":"Q62122716",name:"CADECA"}},"amenity/bureau_de_change|Travelex":{tags:{amenity:"bureau_de_change",brand:"Travelex","brand:wikidata":"Q2337964","brand:wikipedia":"en:Travelex",name:"Travelex"}},"amenity/cafe|85°C":{countryCodes:["au","us"],matchNames:["85 cafe","85 degrees","85 degrees c","85 degrees celsius","85c bakery cafe","85c daily cafe","85oc"],tags:{alt_name:"85C",amenity:"cafe",brand:"85°C","brand:wikidata":"Q4644852","brand:wikipedia":"en:85C Bakery Cafe",cuisine:"coffee_shop;chinese",name:"85°C",takeaway:"yes"}},"amenity/cafe|85度C":{countryCodes:["cn","tw"],tags:{amenity:"cafe",brand:"85度C","brand:en":"85C Bakery Cafe","brand:wikidata":"Q4644852","brand:wikipedia":"en:85C Bakery Cafe",cuisine:"coffee_shop",name:"85度C","name:en":"85C Bakery Cafe",takeaway:"yes"}},"amenity/cafe|Barista":{countryCodes:["in","lk","mv","np"],tags:{amenity:"cafe",brand:"Barista","brand:wikidata":"Q644735","brand:wikipedia":"en:Barista (company)",cuisine:"coffee_shop",name:"Barista",takeaway:"yes"}},"amenity/cafe|Beck's Coffe Shop":{countryCodes:["jp"],tags:{alt_name:"ベックス・コーヒーショップ",amenity:"cafe",brand:"Beck's Coffe Shop","brand:wikidata":"Q11191008","brand:wikipedia":"ja:Beck's Coffe Shop",cuisine:"coffee_shop",name:"Beck's Coffe Shop",takeaway:"yes"}},"amenity/cafe|Black Rock Coffee":{countryCodes:["us"],tags:{amenity:"cafe",brand:"Black Rock Coffee","brand:wikidata":"Q64225934",cuisine:"coffee_shop",name:"Black Rock Coffee",takeaway:"yes"}},"amenity/cafe|Bonafide":{countryCodes:["ar","cl"],tags:{amenity:"cafe",brand:"Bonafide","brand:wikidata":"Q62122746",cuisine:"coffee_shop",name:"Bonafide",takeaway:"yes"}},"amenity/cafe|Cafe Coffee Day":{tags:{amenity:"cafe",brand:"Cafe Coffee Day","brand:wikidata":"Q5017235","brand:wikipedia":"en:Café Coffee Day",cuisine:"coffee_shop",name:"Cafe Coffee Day",takeaway:"yes"}},"amenity/cafe|Caffè Nero":{countryCodes:["gb","ie","tr","us"],matchNames:["cafe nero"],tags:{amenity:"cafe",brand:"Caffè Nero","brand:wikidata":"Q675808","brand:wikipedia":"en:Caffè Nero",cuisine:"coffee_shop",name:"Caffè Nero",takeaway:"yes"}},"amenity/cafe|Café Amazon":{tags:{amenity:"cafe",brand:"Café Amazon","brand:wikidata":"Q43247503","brand:wikipedia":"en:Café Amazon",cuisine:"coffee_shop",name:"Café Amazon",takeaway:"yes"}},"amenity/cafe|Café Martínez":{countryCodes:["ar"],tags:{amenity:"cafe",brand:"Café Martínez","brand:wikidata":"Q16540032","brand:wikipedia":"es:Café Martínez",cuisine:"coffee_shop",name:"Café Martínez",takeaway:"yes"}},"amenity/cafe|Café de Paris":{tags:{amenity:"cafe",brand:"Café de Paris",cuisine:"coffee_shop",name:"Café de Paris",takeaway:"yes"}},"amenity/cafe|Cappuccino":{countryCodes:["at","be","de","es","se"],tags:{amenity:"cafe",brand:"Cappuccino",cuisine:"coffee_shop",name:"Cappuccino",takeaway:"yes"}},"amenity/cafe|Caribou Coffee":{tags:{amenity:"cafe",brand:"Caribou Coffee","brand:wikidata":"Q5039494","brand:wikipedia":"en:Caribou Coffee",cuisine:"coffee_shop",name:"Caribou Coffee",takeaway:"yes"}},"amenity/cafe|Chatime":{tags:{amenity:"cafe",brand:"Chatime","brand:en":"Chatime","brand:wikidata":"Q16829306","brand:wikipedia":"en:Chatime","brand:zh":"日出茶太",cuisine:"bubble_tea",name:"Chatime","name:en":"Chatime","name:zh":"日出茶太",takeaway:"yes"}},"amenity/cafe|CoCo":{countryCodes:["au"],tags:{amenity:"cafe",brand:"CoCo","brand:wikidata":"Q64827025",cuisine:"bubble_tea",name:"Coco",takeaway:"yes"}},"amenity/cafe|Coffee Bean":{tags:{amenity:"cafe",brand:"Coffee Bean",cuisine:"coffee_shop",name:"Coffee Bean",takeaway:"yes"}},"amenity/cafe|Coffee Culture":{countryCodes:["ca","nz","us"],tags:{amenity:"cafe",brand:"Coffee Culture",cuisine:"coffee_shop",name:"Coffee Culture",takeaway:"yes"}},"amenity/cafe|Coffee Fellows":{countryCodes:["de","lu","nl"],tags:{amenity:"cafe",brand:"Coffee Fellows","brand:wikidata":"Q23461429","brand:wikipedia":"en:Coffee Fellows",cuisine:"coffee_shop",name:"Coffee Fellows",takeaway:"yes"}},"amenity/cafe|Coffee House~(Finland)":{countryCodes:["fi"],nomatch:["amenity/cafe|The Coffee House~(Vietnam)"],tags:{amenity:"cafe",brand:"Coffee House","brand:wikidata":"Q11855430","brand:wikipedia":"fi:Coffee House",cuisine:"coffee_shop",name:"Coffee House",takeaway:"yes"}},"amenity/cafe|Coffee Island":{countryCodes:["cy","gr"],tags:{amenity:"cafe",brand:"Coffee Island","brand:wikidata":"Q60867333","brand:wikipedia":"en:Coffee Island",cuisine:"coffee_shop",name:"Coffee Island",takeaway:"yes"}},"amenity/cafe|Coffee Like":{countryCodes:["kz","ru"],tags:{amenity:"cafe",brand:"Coffee Like",cuisine:"coffee_shop",name:"Coffee Like",takeaway:"yes"}},"amenity/cafe|Coffee Time":{tags:{amenity:"cafe",brand:"Coffee Time","brand:wikidata":"Q5140932","brand:wikipedia":"en:Coffee Time",cuisine:"coffee_shop",name:"Coffee Time",takeaway:"yes"}},"amenity/cafe|Cofix":{countryCodes:["il","ru"],tags:{amenity:"cafe",brand:"Cofix","brand:en":"Cofix","brand:he":"קפויקס","brand:wikidata":"Q16132717","brand:wikipedia":"he:קופיקס",cuisine:"coffee_shop",name:"Cofix","name:en":"Cofix","name:he":"קופיקס",takeaway:"yes"}},"amenity/cafe|Cofizz":{countryCodes:["il"],tags:{amenity:"cafe",brand:"Cofizz","brand:en":"Cofizz","brand:he":"קופיז","brand:wikidata":"Q64606270",cuisine:"coffee_shop",name:"Cofizz","name:en":"Cofizz","name:he":"קופיז",takeaway:"yes"}},"amenity/cafe|Costa":{matchNames:["costa coffee"],tags:{amenity:"cafe",brand:"Costa","brand:wikidata":"Q608845","brand:wikipedia":"en:Costa Coffee",cuisine:"coffee_shop",name:"Costa",takeaway:"yes"}},"amenity/cafe|Country Style":{countryCodes:["ca"],tags:{amenity:"cafe",brand:"Country Style","brand:wikidata":"Q5177435","brand:wikipedia":"en:Country Style",cuisine:"coffee_shop",name:"Country Style",takeaway:"yes"}},"amenity/cafe|Cộng Cà Phê":{countryCodes:["kr","vn"],matchNames:["cong"],tags:{amenity:"cafe",brand:"Cộng Cà Phê","brand:wikidata":"Q63864181",cuisine:"coffee_shop;vietnamese",name:"Cộng Cà Phê","name:vi":"Cộng Cà Phê",takeaway:"yes"}},"amenity/cafe|Dolce Vita":{tags:{amenity:"cafe",brand:"Dolce Vita",cuisine:"coffee_shop",name:"Dolce Vita",takeaway:"yes"}},"amenity/cafe|Dutch Bros. Coffee":{countryCodes:["us"],matchNames:["dutch bros","dutch brothers"],tags:{amenity:"cafe",brand:"Dutch Bros. Coffee","brand:wikidata":"Q5317253","brand:wikipedia":"en:Dutch Bros. Coffee",cuisine:"coffee_shop",name:"Dutch Bros. Coffee",takeaway:"only"}},"amenity/cafe|Espresso House":{countryCodes:["dk","fi","no","se"],tags:{amenity:"cafe",brand:"Espresso House","brand:wikidata":"Q10489162","brand:wikipedia":"en:Espresso House",cuisine:"coffee_shop",name:"Espresso House",takeaway:"yes"}},"amenity/cafe|Fran's Café":{countryCodes:["br"],tags:{amenity:"cafe",brand:"Fran's Café","brand:website":"http://www.franscafe.com.br","brand:wikidata":"Q62075645",cuisine:"coffee_shop",name:"Fran's Café",takeaway:"yes"}},"amenity/cafe|Gong Cha~(Vietnam)":{countryCodes:["vn"],tags:{"alt_name:vi":"Cống Trà",amenity:"cafe",brand:"Gong Cha","brand:vi":"Gong Cha","brand:wikidata":"Q5581670","brand:wikipedia":"vi:Gong Cha","brand:zh":"貢茶",cuisine:"bubble_tea",name:"Gong Cha","name:vi":"Gong Cha","name:zh":"貢茶",takeaway:"yes"}},"amenity/cafe|Gong Cha~(worldwide)":{countryCodes:["au","bn","ca","mm","mo","my","nz","ph","sg","us"],tags:{amenity:"cafe",brand:"Gong Cha","brand:wikidata":"Q5581670","brand:wikipedia":"en:Gong Cha","brand:zh":"貢茶",cuisine:"bubble_tea",int_name:"Gong Cha",name:"Gong Cha","name:zh":"貢茶",takeaway:"yes"}},"amenity/cafe|Havanna":{countryCodes:["ar","pe"],tags:{amenity:"cafe",brand:"Havanna","brand:wikidata":"Q2900869","brand:wikipedia":"es:Havanna",cuisine:"coffee_shop",name:"Havanna",takeaway:"yes"}},"amenity/cafe|Highlands Coffee":{countryCodes:["vn"],matchNames:["highlands"],tags:{amenity:"cafe",brand:"Highlands Coffee","brand:wikidata":"Q5759361","brand:wikipedia":"vi:Highlands Coffee",cuisine:"coffee_shop;vietnamese",name:"Highlands Coffee","name:en":"Highlands Coffee",takeaway:"yes"}},"amenity/cafe|Insomnia":{countryCodes:["ie"],tags:{amenity:"cafe",brand:"Insomnia","brand:wikidata":"Q6038271","brand:wikipedia":"en:Insomnia Coffee Company",cuisine:"coffee_shop",name:"Insomnia",takeaway:"yes"}},"amenity/cafe|Joe & The Juice":{tags:{amenity:"cafe",brand:"Joe & The Juice","brand:wikidata":"Q26221514","brand:wikipedia":"en:Joe & The Juice",cuisine:"coffee_shop",name:"Joe & The Juice",takeaway:"yes"}},"amenity/cafe|Le Pain Quotidien":{tags:{amenity:"cafe",brand:"Le Pain Quotidien","brand:wikidata":"Q2046903","brand:wikipedia":"en:Le Pain Quotidien",cuisine:"coffee_shop",name:"Le Pain Quotidien",takeaway:"yes"}},"amenity/cafe|Mado":{countryCodes:["tr"],tags:{amenity:"cafe",brand:"Mado","brand:wikidata":"Q17116336","brand:wikipedia":"en:Mado (food company)",cuisine:"coffee_shop",name:"Mado",takeaway:"yes"}},"amenity/cafe|McCafé":{tags:{amenity:"cafe",brand:"McCafé","brand:wikidata":"Q3114287","brand:wikipedia":"en:McCafé",cuisine:"coffee_shop",name:"McCafé",takeaway:"yes"}},"amenity/cafe|Mikel":{countryCodes:["gr"],tags:{amenity:"cafe",brand:"Mikel",cuisine:"coffee_shop",name:"Mikel",takeaway:"yes"}},"amenity/cafe|Patisserie Valerie":{countryCodes:["gb"],tags:{amenity:"cafe",brand:"Patisserie Valerie","brand:wikidata":"Q22101966","brand:wikipedia":"en:Patisserie Valerie",cuisine:"coffee_shop",name:"Patisserie Valerie",takeaway:"yes"}},"amenity/cafe|Peet's Coffee":{countryCodes:["us"],matchNames:["peets","peets coffee & tea","peets coffee and tea"],tags:{amenity:"cafe",brand:"Peet's Coffee","brand:wikidata":"Q1094101","brand:wikipedia":"en:Peet's Coffee",cuisine:"coffee_shop",name:"Peet's Coffee",takeaway:"yes"}},"amenity/cafe|Prime":{countryCodes:["ru"],tags:{amenity:"cafe",brand:"Prime","brand:wikidata":"Q62122839",cuisine:"coffee_shop",name:"Prime",takeaway:"yes"}},"amenity/cafe|Pronto":{countryCodes:["jp"],matchNames:["プロント"],nomatch:["shop/convenience|Coop Pronto"],tags:{amenity:"cafe",brand:"Pronto","brand:wikidata":"Q11336224","brand:wikipedia":"ja:プロントコーポレーション",cuisine:"coffee_shop",name:"Pronto","name:ja":"プロント",takeaway:"yes"}},"amenity/cafe|Pumpkin":{countryCodes:["gb"],matchNames:["pumpkin cafe","pumpkin cafe shop"],tags:{amenity:"cafe",brand:"Pumpkin","brand:wikidata":"Q27825961","brand:wikipedia":"en:Pumpkin Café Shop",cuisine:"coffee_shop",name:"Pumpkin",takeaway:"yes"}},"amenity/cafe|Quickly":{tags:{amenity:"cafe",brand:"Quickly","brand:en":"Quickly","brand:wikidata":"Q3771463","brand:wikipedia":"en:Quickly","brand:zh":"快可立",cuisine:"bubble_tea",name:"Quickly","name:en":"Quickly","name:zh":"快可立",takeaway:"yes"}},"amenity/cafe|Second Cup":{tags:{amenity:"cafe",brand:"Second Cup","brand:wikidata":"Q862180","brand:wikipedia":"en:Second Cup",cuisine:"coffee_shop",name:"Second Cup",takeaway:"yes"}},"amenity/cafe|Segafredo":{tags:{amenity:"cafe",brand:"Segafredo","brand:wikidata":"Q21282762","brand:wikipedia":"it:Segafredo Zanetti",cuisine:"coffee_shop",name:"Segafredo",takeaway:"yes"}},"amenity/cafe|Sharetea":{countryCodes:["au","us"],tags:{amenity:"cafe",brand:"Sharetea","brand:wikidata":"Q64827032",cuisine:"bubble_tea",name:"Sharetea","name:en":"Sharetea","name:zh":"歇腳亭",takeaway:"yes"}},"amenity/cafe|Starbucks":{tags:{amenity:"cafe",brand:"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"en:Starbucks",cuisine:"coffee_shop",name:"Starbucks",official_name:"Starbucks Coffee",takeaway:"yes"}},"amenity/cafe|The Coffee Bean & Tea Leaf":{tags:{amenity:"cafe",brand:"The Coffee Bean & Tea Leaf","brand:wikidata":"Q1141384","brand:wikipedia":"en:The Coffee Bean & Tea Leaf",cuisine:"coffee_shop",name:"The Coffee Bean & Tea Leaf",takeaway:"yes"}},"amenity/cafe|The Coffee Club":{tags:{amenity:"cafe",brand:"The Coffee Club","brand:wikidata":"Q7726599","brand:wikipedia":"en:The Coffee Club",cuisine:"coffee_shop",name:"The Coffee Club",takeaway:"yes"}},"amenity/cafe|The Coffee House~(Vietnam)":{countryCodes:["vn"],matchNames:["coffee house"],nomatch:["amenity/cafe|Coffee House~(Finland)"],tags:{amenity:"cafe",brand:"The Coffee House","brand:wikidata":"Q60775742","brand:wikipedia":"en:The Coffee House (coffeehouse chain)",cuisine:"coffee_shop;vietnamese",name:"The Coffee House","name:en":"The Coffee House",takeaway:"yes"}},"amenity/cafe|The Human Bean":{countryCodes:["us"],matchNames:["human bean"],tags:{amenity:"cafe",brand:"The Human Bean","brand:wikidata":"Q7740821","brand:wikipedia":"en:The Human Bean",cuisine:"coffee_shop",name:"The Human Bean",takeaway:"yes"}},"amenity/cafe|Tim Hortons":{tags:{amenity:"cafe",brand:"Tim Hortons","brand:wikidata":"Q175106","brand:wikipedia":"en:Tim Hortons",cuisine:"coffee_shop",name:"Tim Hortons",takeaway:"yes"}},"amenity/cafe|Traveler's Coffee":{countryCodes:["ru"],tags:{amenity:"cafe",brand:"Traveler's Coffee","brand:wikidata":"Q4051716","brand:wikipedia":"ru:Traveler’s Coffee",cuisine:"coffee_shop",name:"Traveler's Coffee",takeaway:"yes"}},"amenity/cafe|Trung Nguyên Coffee":{countryCodes:["vn"],matchNames:["trung nguyen"],tags:{amenity:"cafe",brand:"Trung Nguyên","brand:wikidata":"Q3541154","brand:wikipedia":"vi:Trung Nguyên (công ty)",cuisine:"coffee_shop;vietnamese",name:"Trung Nguyên Coffee","name:en":"Trung Nguyen Coffee","name:vi":"Cà phê Trung Nguyên",takeaway:"yes"}},"amenity/cafe|Wayne's Coffee":{countryCodes:["fi","no","se"],tags:{amenity:"cafe",brand:"Wayne's Coffee","brand:wikidata":"Q2637272","brand:wikipedia":"en:Wayne's Coffee",cuisine:"coffee_shop",name:"Wayne's Coffee",takeaway:"yes"}},"amenity/cafe|Wild Bean Cafe":{tags:{amenity:"cafe",brand:"Wild Bean Cafe","brand:wikidata":"Q61804826",cuisine:"coffee_shop",name:"Wild Bean Cafe",takeaway:"yes"}},"amenity/cafe|Берёзка":{tags:{amenity:"cafe",brand:"Берёзка",cuisine:"coffee_shop",name:"Берёзка",takeaway:"yes"}},"amenity/cafe|Виктория":{tags:{amenity:"cafe",brand:"Виктория",cuisine:"coffee_shop",name:"Виктория",takeaway:"yes"}},"amenity/cafe|Гурман":{tags:{amenity:"cafe",brand:"Гурман",cuisine:"coffee_shop",name:"Гурман",takeaway:"yes"}},"amenity/cafe|Даблби":{countryCodes:["ru"],tags:{amenity:"cafe",brand:"Даблби","brand:en":"Double B","brand:wikidata":"Q62501686",cuisine:"coffee_shop",name:"Даблби","name:en":"Double B",takeaway:"yes"}},"amenity/cafe|Лагуна":{countryCodes:["ru","ua"],tags:{amenity:"cafe",brand:"Лагуна",cuisine:"coffee_shop",name:"Лагуна",takeaway:"yes"}},"amenity/cafe|Лакомка":{tags:{amenity:"cafe",brand:"Лакомка",cuisine:"coffee_shop",name:"Лакомка",takeaway:"yes"}},"amenity/cafe|Оазис":{tags:{amenity:"cafe",brand:"Оазис","brand:en":"Oasis",cuisine:"coffee_shop",name:"Оазис","name:en":"Oasis",takeaway:"yes"}},"amenity/cafe|Сказка":{tags:{amenity:"cafe",brand:"Сказка",cuisine:"coffee_shop",name:"Сказка",takeaway:"yes"}},"amenity/cafe|Смак":{countryCodes:["kz","ru","ua","uz"],matchTags:["shop/convenience"],tags:{amenity:"cafe",brand:"Смак","brand:en":"Taste",cuisine:"coffee_shop",name:"Смак","name:en":"Taste",takeaway:"yes"}},"amenity/cafe|Старбакс":{countryCodes:["ru"],tags:{amenity:"cafe",brand:"Старбакс","brand:en":"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"en:Starbucks",cuisine:"coffee_shop",name:"Старбакс","name:en":"Starbucks",takeaway:"yes"}},"amenity/cafe|Транзит":{countryCodes:["kz","ru","ua"],tags:{amenity:"cafe",brand:"Транзит",cuisine:"coffee_shop",name:"Транзит",takeaway:"yes"}},"amenity/cafe|Фортуна":{tags:{amenity:"cafe",brand:"Фортуна",cuisine:"coffee_shop",name:"Фортуна",takeaway:"yes"}},"amenity/cafe|Хуторок":{tags:{amenity:"cafe",brand:"Хуторок",cuisine:"coffee_shop",name:"Хуторок",takeaway:"yes"}},"amenity/cafe|Шоколадница":{countryCodes:["ru"],matchNames:["шоколад"],tags:{amenity:"cafe",brand:"Шоколадница","brand:en":"Chocolate","brand:wikidata":"Q30891188","brand:wikipedia":"ru:Шоколадница (сеть кофеен)",cuisine:"coffee_shop",name:"Шоколадница","name:en":"Chocolate",takeaway:"yes"}},"amenity/cafe|Штолле":{countryCodes:["by","ru","ua"],tags:{amenity:"cafe",brand:"Штолле","brand:en":"Stolle","brand:wikidata":"Q62502236",cuisine:"coffee_shop",name:"Штолле","name:en":"Stolle",takeaway:"yes"}},"amenity/cafe|ארומה":{countryCodes:["il"],tags:{amenity:"cafe",brand:"ארומה","brand:en":"Aroma Espresso Bar","brand:he":"ארומה","brand:wikidata":"Q2909872","brand:wikipedia":"en:Aroma Espresso Bar",cuisine:"coffee_shop",name:"ארומה","name:en":"Aroma Espresso Bar","name:he":"ארומה",takeaway:"yes"}},"amenity/cafe|לנדוור":{countryCodes:["il"],matchNames:["קפה לדנוור"],matchTags:["amenity/restaurant"],tags:{amenity:"cafe",brand:"קפה לנדוור","brand:en":"Landwer Coffee","brand:he":"קפה לנדוור","brand:wikidata":"Q6485288","brand:wikipedia":"he:קפה לנדוור",cuisine:"coffee_shop",name:"לנדוור","name:en":"Landwer","name:he":"לנדוור",takeaway:"yes"}},"amenity/cafe|סי קפה":{countryCodes:["il"],matchNames:["si cafe","si espresso"],tags:{alt_name:"סי אספרסו","alt_name:en":"Si Espresso","alt_name:he":"סי אספרסו",amenity:"cafe",brand:"סי קפה","brand:en":"Si Cafe","brand:he":"סי קפה","brand:wikidata":"Q64606227",cuisine:"coffee_shop",name:"סי קפה","name:en":"Si Cafe","name:he":"סי קפה",takeaway:"yes"}},"amenity/cafe|קפה ג'ו":{countryCodes:["il"],matchNames:["ג'ו קפה"],tags:{alt_name:"קפה Joe",amenity:"cafe",brand:"קפה ג'ו","brand:en":"Cafe Joe","brand:he":"קפה ג'ו","brand:wikidata":"Q6774425","brand:wikipedia":"he:קפה ג'ו",cuisine:"coffee_shop",name:"קפה ג'ו","name:en":"Cafe Joe","name:he":"קפה ג'ו",takeaway:"yes"}},"amenity/cafe|קפה גרג":{countryCodes:["il"],matchTags:["amenity/restaurant"],tags:{amenity:"cafe",brand:"קפה גרג","brand:en":"Greg Cafe","brand:he":"קפה גרג","brand:wikidata":"Q43295499","brand:wikipedia":"he:קפה גרג",cuisine:"coffee_shop",name:"קפה גרג","name:en":"Greg Cafe","name:he":"קפה גרג",takeaway:"yes"}},"amenity/cafe|קפה נמרוד":{countryCodes:["il"],matchTags:["amenity/restaurant"],tags:{amenity:"cafe",brand:"קפה נמרוד","brand:en":"Cafe Nimrod","brand:he":"קפה נמרוד","brand:wikidata":"Q64606192",cuisine:"coffee_shop",name:"קפה נמרוד","name:en":"Cafe Nimrod","name:he":"קפה נמרוד",takeaway:"yes"}},"amenity/cafe|קפה קפה":{countryCodes:["il"],matchTags:["amenity/fast_food","amenity/restaurant"],tags:{amenity:"cafe",brand:"קפה קפה","brand:en":"Cafe Cafe","brand:he":"קפה קפה","brand:wikidata":"Q5017233","brand:wikipedia":"he:קפה קפה",cuisine:"coffee_shop",name:"קפה קפה","name:en":"Cafe Cafe","name:he":"קפה קפה",takeaway:"yes"}},"amenity/cafe|רולדין":{countryCodes:["il"],matchTags:["amenity/restaurant","shop/bakery","shop/pastry"],tags:{amenity:"cafe",brand:"רולדין","brand:en":"Roladin","brand:he":"רולדין","brand:wikidata":"Q18390972","brand:wikipedia":"he:רולדין",cuisine:"coffee_shop",name:"רולדין","name:en":"Roladin","name:he":"רולדין",takeaway:"yes"}},"amenity/cafe|คาเฟ่ อเมซอน":{countryCodes:["th"],tags:{amenity:"cafe",brand:"คาเฟ่ อเมซอน","brand:en":"Café Amazon","brand:th":"คาเฟ่ อเมซอน","brand:wikidata":"Q43247503","brand:wikipedia":"en:Café Amazon",cuisine:"coffee_shop",name:"คาเฟ่ อเมซอน","name:en":"Café Amazon","name:th":"คาเฟ่ อเมซอน",takeaway:"yes"}},"amenity/cafe|エクセルシオール カフェ":{countryCodes:["jp"],tags:{amenity:"cafe",brand:"エクセルシオール カフェ","brand:en":"EXCELSIOR CAFFÉ","brand:ja":"エクセルシオール カフェ","brand:wikidata":"Q11289828","brand:wikipedia":"ja:エクセルシオール カフェ",cuisine:"coffee_shop",name:"エクセルシオール カフェ","name:ja":"エクセルシオール カフェ",takeaway:"yes"}},"amenity/cafe|カフェ・ド・クリエ":{countryCodes:["jp"],tags:{amenity:"cafe",brand:"カフェ・ド・クリエ","brand:en":"Cafe de CRIE","brand:ja":"カフェ・ド・クリエ","brand:wikidata":"Q17219077","brand:wikipedia":"ja:ポッカクリエイト",cuisine:"coffee_shop",name:"カフェ・ド・クリエ","name:en":"Cafe de CRIE","name:ja":"カフェ・ド・クリエ",takeaway:"yes"}},"amenity/cafe|カフェ・ベローチェ":{countryCodes:["jp"],tags:{amenity:"cafe",brand:"カフェ・ベローチェ","brand:en":"CAFFÈ VELOCE","brand:ja":"カフェ・ベローチェ","brand:wikidata":"Q11294597","brand:wikipedia":"ja:カフェ・ベローチェ",cuisine:"coffee_shop",name:"カフェ・ベローチェ","name:en":"CAFFÈ VELOCE","name:ja":"カフェ・ベローチェ",takeaway:"yes"}},"amenity/cafe|コメダ珈琲店":{countryCodes:["jp"],tags:{amenity:"cafe",brand:"コメダ珈琲店","brand:en":"Komeda Coffee Shop","brand:ja":"コメダ珈琲店","brand:wikidata":"Q11302679","brand:wikipedia":"ja:コメダ",cuisine:"coffee_shop",name:"コメダ珈琲店","name:en":"Komeda Coffee Shop","name:ja":"コメダ珈琲店",takeaway:"yes"}},"amenity/cafe|サンマルクカフェ":{countryCodes:["jp"],tags:{"alt_name:en":"Saint Marc Café",amenity:"cafe",brand:"サンマルクカフェ","brand:en":"ST.MARC CAFÉ","brand:ja":"サンマルクカフェ","brand:wikidata":"Q11305989","brand:wikipedia":"ja:サンマルクホールディングス",cuisine:"coffee_shop",name:"サンマルクカフェ","name:en":"ST.MARC CAFÉ","name:ja":"サンマルクカフェ",takeaway:"yes"}},"amenity/cafe|スターバックス":{countryCodes:["jp"],tags:{amenity:"cafe",brand:"スターバックス","brand:en":"Starbucks","brand:ja":"スターバックス","brand:wikidata":"Q37158","brand:wikipedia":"ja:スターバックス",cuisine:"coffee_shop",name:"スターバックス","name:en":"Starbucks","name:ja":"スターバックス",takeaway:"yes"}},"amenity/cafe|スターバックスコーヒー":{countryCodes:["jp"],tags:{amenity:"cafe",brand:"スターバックスコーヒー","brand:ja":"スターバックスコーヒー",cuisine:"coffee_shop",name:"スターバックスコーヒー","name:ja":"スターバックスコーヒー",takeaway:"yes"}},"amenity/cafe|タリーズコーヒー":{countryCodes:["jp"],tags:{amenity:"cafe",brand:"タリーズコーヒー","brand:en":"Tully's Coffee","brand:ja":"タリーズコーヒー","brand:wikidata":"Q3541983","brand:wikipedia":"en:Tully's Coffee",cuisine:"coffee_shop",name:"タリーズコーヒー","name:en":"Tully's Coffee","name:ja":"タリーズコーヒー",takeaway:"yes"}},"amenity/cafe|ドトールコーヒーショップ":{countryCodes:["jp"],matchNames:["ドトールコーヒー"],tags:{amenity:"cafe",brand:"ドトールコーヒーショップ","brand:en":"Doutor","brand:ja":"ドトールコーヒーショップ","brand:wikidata":"Q11322732","brand:wikipedia":"ja:ドトールコーヒーショップ",cuisine:"coffee_shop",name:"ドトールコーヒーショップ","name:en":"Doutor Coffee Shop","name:ja":"ドトールコーヒーショップ",takeaway:"yes"}},"amenity/cafe|快可立":{countryCodes:["tw"],tags:{amenity:"cafe",brand:"快可立","brand:en":"Quickly","brand:wikidata":"Q3771463","brand:wikipedia":"zh:快可立","brand:zh":"快可立",cuisine:"bubble_tea",name:"快可立","name:en":"Quickly","name:zh":"快可立",takeaway:"yes"}},"amenity/cafe|日出茶太":{countryCodes:["tw"],tags:{amenity:"cafe",brand:"日出茶太","brand:en":"Chatime","brand:wikidata":"Q16829306","brand:wikipedia":"zh:日出茶太","brand:zh":"日出茶太",cuisine:"bubble_tea",name:"日出茶太","name:en":"Chatime","name:zh":"日出茶太",takeaway:"yes"}},"amenity/cafe|星巴克":{countryCodes:["cn","tw"],tags:{amenity:"cafe",brand:"星巴克","brand:en":"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"zh:星巴克","brand:zh":"星巴克",cuisine:"coffee_shop",name:"星巴克","name:en":"Starbucks","name:zh":"星巴克",takeaway:"yes"}},"amenity/cafe|珈琲館":{countryCodes:["jp"],tags:{amenity:"cafe",brand:"珈琲館","brand:en":"Kohikan","brand:ja":"珈琲館","brand:wikidata":"Q11573290","brand:wikipedia":"ja:珈琲館",cuisine:"coffee_shop",name:"珈琲館","name:en":"Kohikan","name:ja":"珈琲館",takeaway:"yes"}},"amenity/cafe|貢茶 Gong Cha":{countryCodes:["hk"],tags:{amenity:"cafe",brand:"貢茶 Gong Cha","brand:en":"Gong Cha","brand:wikidata":"Q5581670","brand:wikipedia":"zh:貢茶 (連鎖店)","brand:zh":"貢茶",cuisine:"bubble_tea",name:"貢茶 Gong Cha","name:en":"Gong Cha","name:zh":"貢茶",takeaway:"yes"}},"amenity/cafe|貢茶~(Japan)":{countryCodes:["ja"],tags:{amenity:"cafe",brand:"貢茶","brand:ja":"貢茶","brand:wikidata":"Q5581670","brand:wikipedia":"ja:貢茶","brand:zh":"貢茶",cuisine:"bubble_tea",int_name:"Gong Cha",name:"貢茶","name:ja":"貢茶","name:zh":"貢茶",takeaway:"yes"}},"amenity/cafe|貢茶~(Taiwan)":{countryCodes:["tw"],tags:{amenity:"cafe",brand:"貢茶","brand:wikidata":"Q5581670","brand:wikipedia":"zh:貢茶 (連鎖店)",cuisine:"bubble_tea",int_name:"Gong Cha",name:"貢茶","name:zh":"貢茶",takeaway:"yes"}},"amenity/cafe|贡茶~(China)":{countryCodes:["cn"],tags:{amenity:"cafe",brand:"贡茶","brand:wikidata":"Q5581670","brand:wikipedia":"zh:贡茶 (连锁店)","brand:zh-Hans":"贡茶","brand:zh-Hant":"貢茶",cuisine:"bubble_tea",int_name:"Gong Cha",name:"贡茶","name:zh-Hans":"贡茶","name:zh-Hant":"貢茶",takeaway:"yes"}},"amenity/cafe|공차":{countryCodes:["kr"],tags:{amenity:"cafe",brand:"공차","brand:ko":"공차","brand:wikidata":"Q5581670","brand:wikipedia":"ko:공차","brand:zh":"貢茶",cuisine:"bubble_tea",int_name:"Gong Cha",name:"공차","name:ko":"공차","name:zh":"貢茶",takeaway:"yes"}},"amenity/cafe|스타벅스":{countryCodes:["kr"],tags:{amenity:"cafe",brand:"스타벅스","brand:en":"Starbucks","brand:ko":"스타벅스","brand:wikidata":"Q37158","brand:wikipedia":"ko:스타벅스",cuisine:"coffee_shop",name:"스타벅스","name:en":"Starbucks","name:ko":"스타벅스",takeaway:"yes"}},"amenity/car_rental|Alamo":{tags:{amenity:"car_rental",brand:"Alamo","brand:wikidata":"Q1429287","brand:wikipedia":"en:Alamo Rent a Car",name:"Alamo"}},"amenity/car_rental|Avis":{matchNames:["avis car rental"],tags:{amenity:"car_rental",brand:"Avis","brand:wikidata":"Q791136","brand:wikipedia":"en:Avis Car Rental",name:"Avis"}},"amenity/car_rental|Budget":{matchNames:["budget car rental"],tags:{amenity:"car_rental",brand:"Budget","brand:wikidata":"Q1001437","brand:wikipedia":"en:Budget Rent a Car",name:"Budget",official_name:"Budget Rent a Car"}},"amenity/car_rental|Dollar":{countryCodes:["us"],nomatch:["amenity/bank|Dollar Bank","shop/variety_store|Dollar General","shop/variety_store|Dollar Tree","shop/variety_store|Dollarama","shop/variety_store|Family Dollar"],tags:{amenity:"car_rental",brand:"Dollar","brand:wikidata":"Q1235661","brand:wikipedia":"en:Dollar Rent A Car",name:"Dollar",official_name:"Dollar Rent A Car"}},"amenity/car_rental|Enterprise":{matchNames:["enterprise car rental"],tags:{amenity:"car_rental",brand:"Enterprise","brand:wikidata":"Q17085454","brand:wikipedia":"en:Enterprise Rent-A-Car",name:"Enterprise",official_name:"Enterprise Rent-A-Car"}},"amenity/car_rental|Europcar":{tags:{amenity:"car_rental",brand:"Europcar","brand:wikidata":"Q1376256","brand:wikipedia":"en:Europcar",name:"Europcar"}},"amenity/car_rental|Hertz":{matchNames:["hertz car rental"],tags:{amenity:"car_rental",brand:"Hertz","brand:wikidata":"Q1543874","brand:wikipedia":"en:The Hertz Corporation",name:"Hertz"}},"amenity/car_rental|Localiza":{tags:{amenity:"car_rental",brand:"Localiza","brand:wikidata":"Q10319490","brand:wikipedia":"en:Localiza",name:"Localiza"}},"amenity/car_rental|National":{countryCodes:["ca","gb","us"],nomatch:["amenity/bank|National Bank"],tags:{amenity:"car_rental",brand:"National","brand:wikidata":"Q1424142","brand:wikipedia":"en:National Car Rental",name:"National",official_name:"National Car Rental"}},"amenity/car_rental|Sixt":{tags:{amenity:"car_rental",brand:"Sixt","brand:wikidata":"Q705664","brand:wikipedia":"en:Sixt",name:"Sixt"}},"amenity/car_rental|Thrifty":{matchNames:["thrifty car rental"],tags:{amenity:"car_rental",brand:"Thrifty","brand:wikidata":"Q2429546","brand:wikipedia":"en:Thrifty Car Rental",name:"Thrifty"}},"amenity/car_rental|U-Haul":{countryCodes:["ca","us"],matchNames:["uhaul neighborhood dealer"],tags:{amenity:"car_rental",brand:"U-Haul","brand:wikidata":"Q7862902","brand:wikipedia":"en:U-Haul",name:"U-Haul"}},"amenity/car_rental|オリックスレンタカー":{countryCodes:["jp"],tags:{amenity:"car_rental",brand:"オリックスレンタカー","brand:en":"ORIX Car Rental","brand:ja":"オリックスレンタカー","brand:wikidata":"Q11123021","brand:wikipedia":"ja:オリックスレンタカー",name:"オリックスレンタカー","name:en":"ORIX Car Rental","name:ja":"オリックスレンタカー"}},"amenity/car_rental|トヨタレンタカー":{countryCodes:["jp"],matchNames:["トヨタレンタリース"],tags:{amenity:"car_rental",brand:"トヨタレンタカー","brand:en":"Toyota Rental Car","brand:ja":"トヨタレンタカー","brand:wikidata":"Q11321580","brand:wikipedia":"ja:トヨタレンタリース",name:"トヨタレンタカー","name:en":"Toyota Rental Car","name:ja":"トヨタレンタカー"}},"amenity/car_rental|ニッポンレンタカー":{countryCodes:["jp"],tags:{amenity:"car_rental",brand:"ニッポンレンタカー","brand:en":"Nippon Car Rental","brand:ja":"ニッポンレンタカー","brand:wikidata":"Q11086533","brand:wikipedia":"ja:ニッポンレンタカー",name:"ニッポンレンタカー","name:en":"Nippon Car Rental","name:ja":"ニッポンレンタカー"}},"amenity/car_rental|日産レンタカー":{countryCodes:["jp"],tags:{amenity:"car_rental",brand:"日産レンタカー","brand:en":"Nissan Car Rental","brand:ja":"日産レンタカー","brand:wikidata":"Q11086838","brand:wikipedia":"ja:日産レンタカー",name:"日産レンタカー","name:en":"Nissan Car Rental","name:ja":"日産レンタカー"}},"amenity/car_sharing|Bluely":{countryCodes:["fr"],matchNames:["station bluely"],tags:{amenity:"car_sharing",brand:"Bluely","brand:wikidata":"Q16039715","brand:wikipedia":"fr:Bluely",name:"Bluely"}},"amenity/car_sharing|Enterprise Car Club":{countryCodes:["gb"],matchNames:["city car club"],tags:{amenity:"car_sharing",brand:"Enterprise Car Club","brand:wikidata":"Q5123055","brand:wikipedia":"en:Enterprise Car Club",name:"Enterprise Car Club"}},"amenity/car_sharing|Greenwheels":{countryCodes:["de","nl"],tags:{amenity:"car_sharing",brand:"Greenwheels","brand:wikidata":"Q316782","brand:wikipedia":"en:Greenwheels",name:"Greenwheels"}},"amenity/car_sharing|Zipcar":{tags:{amenity:"car_sharing",brand:"Zipcar","brand:wikidata":"Q1069924","brand:wikipedia":"en:Zipcar",name:"Zipcar"}},"amenity/car_sharing|stadtmobil":{countryCodes:["de"],matchNames:["stadtmobil carsharing-station"],tags:{amenity:"car_sharing",brand:"stadtmobil","brand:wikidata":"Q2327629","brand:wikipedia":"en:Stadtmobil",name:"stadtmobil"}},"amenity/car_sharing|teilAuto":{countryCodes:["de"],tags:{amenity:"car_sharing",brand:"teilAuto","brand:wikidata":"Q2400658","brand:wikipedia":"de:TeilAuto",name:"teilAuto"}},"amenity/charging_station|Blink":{countryCodes:["us"],tags:{amenity:"charging_station",brand:"Blink","brand:wikidata":"Q62065645",name:"Blink"}},"amenity/charging_station|ChargePoint":{tags:{amenity:"charging_station",brand:"ChargePoint","brand:wikidata":"Q5176149","brand:wikipedia":"en:ChargePoint",name:"ChargePoint"}},"amenity/charging_station|E-WALD":{countryCodes:["de"],matchNames:["e-wald ladestation"],tags:{amenity:"charging_station",brand:"E-WALD","brand:wikidata":"Q61804335",name:"E-WALD"}},"amenity/charging_station|Enel":{countryCodes:["it"],matchNames:["enel - stazione di ricarica"],tags:{amenity:"charging_station",brand:"Enel","brand:wikidata":"Q651222","brand:wikipedia":"en:Enel",name:"Enel"}},"amenity/charging_station|Source London":{countryCodes:["gb"],tags:{amenity:"charging_station",brand:"Source London","brand:wikidata":"Q7565133","brand:wikipedia":"en:Source London",name:"Source London"}},"amenity/charging_station|Tesla Supercharger":{tags:{amenity:"charging_station",brand:"Tesla Supercharger","brand:wikidata":"Q17089620","brand:wikipedia":"en:Tesla Supercharger",name:"Tesla Supercharger"}},"amenity/charging_station|bike-energy Ladestation":{countryCodes:["at","ch","de","fr","it"],tags:{amenity:"charging_station",brand:"bike-energy Ladestation",name:"bike-energy Ladestation"}},"amenity/charging_station|eVgo":{countryCodes:["us"],tags:{amenity:"charging_station",brand:"eVgo","brand:wikidata":"Q61803820",name:"eVgo"}},"amenity/childcare|YMCA Child Care":{countryCodes:["us"],matchNames:["ymca","ymca child care center"],tags:{amenity:"childcare",brand:"YMCA","brand:wikidata":"Q157169","brand:wikipedia":"en:YMCA",name:"YMCA Child Care"}},"amenity/cinema|109シネマズ":{countryCodes:["jp"],tags:{amenity:"cinema",brand:"109シネマズ","brand:en":"109 Cinemas","brand:ja":"109シネマズ","brand:wikidata":"Q10854269","brand:wikipedia":"ja:109シネマズ",name:"109シネマズ","name:en":"109 Cinemas","name:ja":"109シネマズ"}},"amenity/cinema|AMC":{countryCodes:["us"],matchNames:["amc cinema","amc cinemas","amc theater","amc theaters","amc theatre","amc theatres"],tags:{amenity:"cinema",brand:"AMC","brand:wikidata":"Q294721","brand:wikipedia":"en:AMC Theatres",name:"AMC"}},"amenity/cinema|B&B Theatres":{countryCodes:["us"],matchNames:["b and b","b and b theatres","b&b theaters"],tags:{amenity:"cinema",brand:"B&B Theatres","brand:wikidata":"Q4833576","brand:wikipedia":"en:B&B Theatres",name:"B&B Theatres",short_name:"B&B"}},"amenity/cinema|Century Theatres":{countryCodes:["us"],matchNames:["century theater","century theaters","century theatre"],tags:{amenity:"cinema",brand:"Century Theatres","brand:wikidata":"Q2946307","brand:wikipedia":"en:Century Theatres",name:"Century Theatres",short_name:"Century"}},"amenity/cinema|CineStar":{countryCodes:["de"],tags:{amenity:"cinema",brand:"CineStar","brand:wikidata":"Q321889","brand:wikipedia":"de:Cinestar",name:"CineStar"}},"amenity/cinema|Cinema City":{countryCodes:["cz","hu","pl","ro"],tags:{amenity:"cinema",brand:"Cinema City","brand:wikidata":"Q543651","brand:wikipedia":"en:Cinema City International",name:"Cinema City"}},"amenity/cinema|Cinemark":{tags:{amenity:"cinema",brand:"Cinemark","brand:wikidata":"Q707530","brand:wikipedia":"en:Cinemark Theatres",name:"Cinemark"}},"amenity/cinema|Cinemaxx~(Europe)":{countryCodes:["de","dk"],nomatch:["amenity/cinema|Cinemaxx~(Indonesia)"],tags:{amenity:"cinema",brand:"Cinemaxx","brand:wikidata":"Q881860","brand:wikipedia":"de:CinemaxX",name:"Cinemaxx"}},"amenity/cinema|Cinemaxx~(Indonesia)":{countryCodes:["id"],nomatch:["amenity/cinema|Cinemaxx~(Europe)"],tags:{amenity:"cinema",brand:"Cinemaxx","brand:wikidata":"Q19942740","brand:wikipedia":"id:Cinemaxx",name:"Cinemaxx"}},"amenity/cinema|Cinemex":{countryCodes:["mx"],tags:{amenity:"cinema",brand:"Cinemex","brand:wikidata":"Q3333072","brand:wikipedia":"en:Cinemex",name:"Cinemex"}},"amenity/cinema|Cineplanet":{countryCodes:["cl","pe"],tags:{amenity:"cinema",brand:"Cineplanet","brand:wikidata":"Q5769680","brand:wikipedia":"es:Cineplanet",name:"Cineplanet"}},"amenity/cinema|Cineplexx":{countryCodes:["at","si"],tags:{amenity:"cinema",brand:"Cineplexx","brand:wikidata":"Q873340","brand:wikipedia":"en:Cineplexx Cinemas",name:"Cineplexx"}},"amenity/cinema|Cinepolis":{tags:{amenity:"cinema",brand:"Cinepolis","brand:wikidata":"Q5686673","brand:wikipedia":"en:Cinépolis",name:"Cinepolis"}},"amenity/cinema|Cineworld":{countryCodes:["gb"],tags:{amenity:"cinema",brand:"Cineworld","brand:wikidata":"Q5120901","brand:wikipedia":"en:Cineworld",name:"Cineworld"}},"amenity/cinema|Event":{countryCodes:["au","nz"],matchNames:["event cinema"],tags:{amenity:"cinema",brand:"Event","brand:wikidata":"Q5416698","brand:wikipedia":"en:Event Cinemas",name:"Event",official_name:"Event Cinemas"}},"amenity/cinema|Harkins Theatres":{countryCodes:["us"],matchNames:["harkins theater","harkins theaters","harkins theatre"],tags:{amenity:"cinema",brand:"Harkins Theatres","brand:wikidata":"Q5658199","brand:wikipedia":"en:Harkins Theatres",name:"Harkins Theatres",short_name:"Harkins"}},"amenity/cinema|Hoyts":{countryCodes:["au","nz"],tags:{amenity:"cinema",brand:"Hoyts","brand:wikidata":"Q5922976","brand:wikipedia":"en:Hoyts",name:"Hoyts"}},"amenity/cinema|Landmark Theatres":{countryCodes:["us"],matchNames:["landmark theater","landmark theaters","landmark theatre"],tags:{amenity:"cinema",brand:"Landmark Theatres","brand:wikidata":"Q6484805","brand:wikipedia":"en:Landmark Theatres",name:"Landmark Theatres",short_name:"Landmark"}},"amenity/cinema|MOVIX":{countryCodes:["jp"],tags:{amenity:"cinema",brand:"MOVIX","brand:wikidata":"Q11532184","brand:wikipedia":"ja:松竹マルチプレックスシアターズ",name:"MOVIX",official_name:"松竹マルチプレックスシアターズ","official_name:en":"Shochiku Multiplex Theatres"}},"amenity/cinema|Marcus Cinema":{countryCodes:["us"],matchNames:["marcus cinemas","marcus theater","marcus theaters","marcus theatre","marcus theatres"],tags:{amenity:"cinema",brand:"Marcus Cinema","brand:wikidata":"Q64083352",name:"Marcus Cinema",short_name:"Marcus"}},"amenity/cinema|Movie Tavern":{countryCodes:["us"],tags:{amenity:"cinema",brand:"Movie Tavern","brand:wikidata":"Q64083534",name:"Movie Tavern"}},"amenity/cinema|Multikino":{countryCodes:["lt","lv","pl"],tags:{amenity:"cinema",brand:"Multikino","brand:wikidata":"Q1144802","brand:wikipedia":"pl:Multikino",name:"Multikino"}},"amenity/cinema|Odeon":{countryCodes:["gb","gr","ie","it"],matchNames:["odeon cinema"],tags:{amenity:"cinema",brand:"Odeon","brand:wikidata":"Q6127470","brand:wikipedia":"en:Odeon Cinemas",name:"Odeon"}},"amenity/cinema|Regal Cinemas":{countryCodes:["us"],matchNames:["regal cinema"],tags:{amenity:"cinema",brand:"Regal Cinemas","brand:wikidata":"Q835638","brand:wikipedia":"en:Regal Cinemas",name:"Regal Cinemas",short_name:"Regal"}},"amenity/cinema|Showcase Cinemas":{countryCodes:["ar","gb","us"],matchNames:["showcase cinema"],tags:{amenity:"cinema",brand:"Showcase Cinemas","brand:wikidata":"Q7503170","brand:wikipedia":"en:Showcase Cinemas",name:"Showcase Cinemas",short_name:"Showcase"}},"amenity/cinema|TOHOシネマズ":{countryCodes:["jp"],tags:{amenity:"cinema",brand:"TOHOシネマズ","brand:en":"TOHO CINEMAS","brand:ja":"TOHOシネマズ","brand:wikidata":"Q11235261","brand:wikipedia":"ja:TOHOシネマズ",name:"TOHOシネマズ","name:en":"Toho Cinemas","name:ja":"TOHOシネマズ",short_name:"TOHO"}},"amenity/cinema|The Space Cinema":{countryCodes:["it"],matchNames:["the space"],tags:{amenity:"cinema",brand:"The Space Cinema","brand:wikidata":"Q3989406","brand:wikipedia":"it:The Space Cinema",name:"The Space Cinema"}},"amenity/cinema|Vue~(IrelandAndUK)":{countryCodes:["gb","ie"],matchNames:["vue cinema","vue cinemas"],nomatch:["amenity/cinema|Vue~(Netherlands)"],tags:{amenity:"cinema",brand:"Vue","brand:wikidata":"Q2535134","brand:wikipedia":"en:Vue Cinemas",name:"Vue"}},"amenity/cinema|Vue~(Netherlands)":{countryCodes:["nl"],matchNames:["vue cinema"],nomatch:["amenity/cinema|Vue~(IrelandAndUK)"],tags:{amenity:"cinema",brand:"Vue","brand:wikidata":"Q2421690","brand:wikipedia":"nl:Vue (bioscoopketen)",name:"Vue"}},"amenity/cinema|イオンシネマ":{countryCodes:["jp"],tags:{amenity:"cinema",brand:"イオンシネマ","brand:en":"AEON Cinema","brand:ja":"イオンシネマ","brand:wikidata":"Q17192792","brand:wikipedia":"ja:イオンエンターテイメント",name:"イオンシネマ","name:en":"AEON Cinema","name:ja":"イオンシネマ"}},"amenity/cinema|ユナイテッド・シネマ":{countryCodes:["jp"],tags:{amenity:"cinema",brand:"ユナイテッド・シネマ","brand:en":"United Cinemas","brand:ja":"ユナイテッド・シネマ","brand:wikidata":"Q11345629","brand:wikipedia":"ja:ユナイテッド・シネマ",name:"ユナイテッド・シネマ","name:en":"United Cinemas","name:ja":"ユナイテッド・シネマ"}},"amenity/clinic|DaVita Dialysis":{countryCodes:["us"],matchNames:["davita","davita kidney care"],tags:{amenity:"clinic",brand:"DaVita Dialysis","brand:wikidata":"Q5207184",healthcare:"dialysis","healthcare:speciality":"dialysis",name:"DaVita Dialysis"}},"amenity/clinic|Dialysis Clinic":{countryCodes:["us"],matchNames:["dialysis clinic inc"],tags:{amenity:"clinic",brand:"Dialysis Clinic","brand:wikidata":"Q5270633","brand:wikipedia":"en:Dialysis Clinic, Inc.",healthcare:"dialysis","healthcare:speciality":"dialysis",name:"Dialysis Clinic",short_name:"DCI"}},"amenity/clinic|Fresenius Kidney Care":{countryCodes:["us"],tags:{amenity:"clinic",brand:"Fresenius Kidney Care","brand:wikidata":"Q650259","brand:wikipedia":"en:Fresenius Medical Care",healthcare:"dialysis","healthcare:speciality":"dialysis",name:"Fresenius Kidney Care"}},"amenity/clinic|Fresenius Medical Care":{countryCodes:["us"],tags:{amenity:"clinic",brand:"Fresenius Medical Care","brand:wikidata":"Q650259","brand:wikipedia":"en:Fresenius Medical Care",healthcare:"dialysis","healthcare:speciality":"dialysis",name:"Fresenius Medical Care"}},"amenity/clinic|Satellite Healthcare":{countryCodes:["us"],matchNames:["satellite","satellite dialysis"],tags:{amenity:"clinic",brand:"Satellite Healthcare","brand:wikidata":"Q50039787",healthcare:"dialysis","healthcare:speciality":"dialysis",name:"Satellite Healthcare"}},"amenity/clinic|Terveystalo":{countryCodes:["fi"],tags:{amenity:"clinic",brand:"Terveystalo","brand:wikidata":"Q11897034","brand:wikipedia":"fi:Terveystalo",healthcare:"clinic",name:"Terveystalo"}},"amenity/dentist|Aspen Dental":{countryCodes:["us"],matchTags:["healthcare/dentist"],tags:{amenity:"dentist",brand:"Aspen Dental","brand:wikidata":"Q4807808","brand:wikipedia":"en:Aspen Dental",healthcare:"dentist",name:"Aspen Dental"}},"amenity/dentist|Comfort Dental":{countryCodes:["us"],matchTags:["healthcare/dentist"],tags:{amenity:"dentist",brand:"Comfort Dental","brand:wikidata":"Q22079521","brand:wikipedia":"en:Comfort Dental",healthcare:"dentist",name:"Comfort Dental"}},"amenity/dentist|Dentix":{tags:{amenity:"dentist",brand:"Dentix",name:"Dentix"}},"amenity/dentist|Gentle Dental":{countryCodes:["us"],tags:{amenity:"dentist",brand:"Gentle Dental",name:"Gentle Dental"}},"amenity/dentist|Kool Smiles":{countryCodes:["us"],matchTags:["healthcare/dentist"],tags:{amenity:"dentist",brand:"Kool Smiles","brand:wikidata":"Q6430587","brand:wikipedia":"en:Kool Smiles",healthcare:"dentist",name:"Kool Smiles"}},"amenity/dentist|Vitaldent":{countryCodes:["es","it"],tags:{amenity:"dentist",brand:"Vitaldent",name:"Vitaldent"}},"amenity/dentist|Western Dental":{countryCodes:["us"],matchNames:["western dental and orthodontics"],matchTags:["healthcare/dentist"],tags:{alt_name:"Western Dental & Orthodontics",amenity:"dentist",brand:"Western Dental","brand:wikidata":"Q64211989","brand:wikipedia":"en:Western Dental",healthcare:"dentist",name:"Western Dental"}},"amenity/doctors|MinuteClinic":{countryCodes:["us"],matchTags:["amenity/clinic"],tags:{amenity:"doctors",brand:"MinuteClinic","brand:wikidata":"Q6871141","brand:wikipedia":"en:MinuteClinic",healthcare:"doctor","healthcare:speciality":"community",name:"MinuteClinic"}},"amenity/doctors|RediClinic":{countryCodes:["us"],matchTags:["amenity/clinic"],tags:{amenity:"doctors",brand:"RediClinic","brand:wikidata":"Q64138408",healthcare:"doctor","healthcare:speciality":"community",name:"RediClinic"}},"amenity/doctors|The Little Clinic":{countryCodes:["us"],matchNames:["little clinic"],matchTags:["amenity/clinic"],tags:{amenity:"doctors",brand:"The Little Clinic","brand:wikidata":"Q64138262",healthcare:"doctor","healthcare:speciality":"community",name:"The Little Clinic"}},"amenity/doctors|Walgreens Healthcare Clinic":{countryCodes:["us"],matchNames:["healthcare clinic","takecare","takecare clinic","walgreens"],matchTags:["amenity/clinic"],tags:{amenity:"doctors",brand:"Walgreens","brand:wikidata":"Q1591889",healthcare:"doctor","healthcare:speciality":"community",name:"Walgreens Healthcare Clinic"}},"amenity/fast_food|A&W~(Canada)":{countryCodes:["ca"],nomatch:["amenity/fast_food|A&W~(USA)"],tags:{amenity:"fast_food",brand:"A&W","brand:wikidata":"Q2818848","brand:wikipedia":"en:A&W (Canada)",cuisine:"burger",name:"A&W",takeaway:"yes"}},"amenity/fast_food|A&W~(USA)":{countryCodes:["us"],nomatch:["amenity/fast_food|A&W~(Canada)"],tags:{amenity:"fast_food",brand:"A&W","brand:wikidata":"Q277641","brand:wikipedia":"en:A&W Restaurants",cuisine:"burger",name:"A&W",takeaway:"yes"}},"amenity/fast_food|Andok's":{countryCodes:["ph"],tags:{amenity:"fast_food",brand:"Andok's","brand:wikidata":"Q62267166",cuisine:"chicken",name:"Andok's",takeaway:"yes"}},"amenity/fast_food|Angel's Burger":{countryCodes:["ph"],tags:{amenity:"fast_food",brand:"Angel's Burger","brand:wikidata":"Q62267228",cuisine:"burger",name:"Angel's Burger",takeaway:"yes"}},"amenity/fast_food|Arby's":{countryCodes:["ca","tr","us"],tags:{amenity:"fast_food",brand:"Arby's","brand:wikidata":"Q630866","brand:wikipedia":"en:Arby's",cuisine:"sandwich",name:"Arby's",takeaway:"yes"}},"amenity/fast_food|Au Bon Pain":{countryCodes:["in","th","us"],tags:{amenity:"fast_food",brand:"Au Bon Pain","brand:wikidata":"Q4818942","brand:wikipedia":"en:Au Bon Pain",cuisine:"sandwich",name:"Au Bon Pain",takeaway:"yes"}},"amenity/fast_food|Auntie Anne's":{countryCodes:["us"],matchNames:["auntie annes pretzels"],tags:{amenity:"fast_food",brand:"Auntie Anne's","brand:wikidata":"Q4822010","brand:wikipedia":"en:Auntie Anne's",cuisine:"pretzel",name:"Auntie Anne's",takeaway:"yes"}},"amenity/fast_food|Baja Fresh":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Baja Fresh","brand:wikidata":"Q2880019","brand:wikipedia":"en:Baja Fresh",cuisine:"mexican",name:"Baja Fresh",takeaway:"yes"}},"amenity/fast_food|Barburrito":{countryCodes:["gb"],tags:{amenity:"fast_food",brand:"Barburrito","brand:wikidata":"Q16983668","brand:wikipedia":"en:Barburrito",cuisine:"mexican",name:"Barburrito",takeaway:"yes"}},"amenity/fast_food|Bembos":{countryCodes:["pe"],tags:{amenity:"fast_food",brand:"Bembos","brand:wikidata":"Q466971","brand:wikipedia":"en:Bembos",cuisine:"burger",name:"Bembos",takeaway:"yes"}},"amenity/fast_food|Blimpie":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Blimpie","brand:wikidata":"Q4926479","brand:wikipedia":"en:Blimpie",cuisine:"sandwich",name:"Blimpie",takeaway:"yes"}},"amenity/fast_food|Bob's":{countryCodes:["ao","br","cl","pt"],tags:{amenity:"fast_food",brand:"Bob's","brand:wikidata":"Q1392113","brand:wikipedia":"en:Bob's",cuisine:"burger",name:"Bob's",takeaway:"yes"}},"amenity/fast_food|Bojangles'":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Bojangles'","brand:wikidata":"Q891163","brand:wikipedia":"en:Bojangles' Famous Chicken 'n Biscuits",cuisine:"chicken",name:"Bojangles'",official_name:"Bojangles' Famous Chicken 'n Biscuits",takeaway:"yes"}},"amenity/fast_food|Booster Juice":{countryCodes:["ca"],matchTags:["shop/beverages"],tags:{amenity:"fast_food",brand:"Booster Juice","brand:wikidata":"Q4943796","brand:wikipedia":"en:Booster Juice",cuisine:"juice",name:"Booster Juice",takeaway:"yes"}},"amenity/fast_food|Boston Market":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Boston Market","brand:wikidata":"Q603617","brand:wikipedia":"en:Boston Market",cuisine:"american",name:"Boston Market",takeaway:"yes"}},"amenity/fast_food|Braum's":{countryCodes:["us"],matchTags:["shop/dairy"],tags:{amenity:"fast_food",brand:"Braum's","brand:wikidata":"Q4958263","brand:wikipedia":"en:Braum's",cuisine:"ice_cream",name:"Braum's",shop:"dairy",takeaway:"yes"}},"amenity/fast_food|Bruegger's Bagels":{countryCodes:["us"],matchNames:["breuger's","breugger's","bruger's","brugger's"],tags:{amenity:"fast_food",brand:"Bruegger's Bagels","brand:wikidata":"Q4978656","brand:wikipedia":"en:Bruegger's",cuisine:"bagel",name:"Bruegger's Bagels",short_name:"Bruegger's",takeaway:"yes"}},"amenity/fast_food|Burger King":{matchNames:["burguer king"],tags:{amenity:"fast_food",brand:"Burger King","brand:wikidata":"Q177054","brand:wikipedia":"en:Burger King",cuisine:"burger",name:"Burger King",takeaway:"yes"}},"amenity/fast_food|Burger Machine":{countryCodes:["ph"],tags:{amenity:"fast_food",brand:"Burger Machine","brand:wikidata":"Q4998549","brand:wikipedia":"en:Burger Machine",cuisine:"burger",name:"Burger Machine",takeaway:"yes"}},"amenity/fast_food|BurgerFi":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"BurgerFi","brand:wikidata":"Q39045496","brand:wikipedia":"en:BurgerFi",cuisine:"burger",name:"BurgerFi",takeaway:"yes"}},"amenity/fast_food|Burgerim":{countryCodes:["il"],tags:{amenity:"fast_food",brand:"Burgerim","brand:en":"Burgerim","brand:he":"בורגרים","brand:wikidata":"Q64760354",cuisine:"burger",name:"Burgerim","name:en":"Burgerim","name:he":"בורגרים",takeaway:"yes"}},"amenity/fast_food|Burgers Bar":{countryCodes:["il"],tags:{amenity:"fast_food",brand:"Burgers Bar","brand:en":"Burgers Bar","brand:he":"בורגרס בר","brand:wikidata":"Q64760337",cuisine:"burger","diet:kosher":"yes",name:"Burgers Bar","name:en":"Burgers Bar","name:he":"בורגרס בר",takeaway:"yes"}},"amenity/fast_food|Burgerville":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Burgerville","brand:wikidata":"Q4998570","brand:wikipedia":"en:Burgerville",cuisine:"burger",name:"Burgerville",takeaway:"yes"}},"amenity/fast_food|Captain D's":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Captain D's","brand:wikidata":"Q5036616","brand:wikipedia":"en:Captain D's",cuisine:"seafood",name:"Captain D's",takeaway:"yes"}},"amenity/fast_food|Carl's Jr.":{tags:{amenity:"fast_food",brand:"Carl's Jr.","brand:wikidata":"Q1043486","brand:wikipedia":"en:Carl's Jr.",cuisine:"burger",name:"Carl's Jr.",takeaway:"yes"}},"amenity/fast_food|Charleys Philly Steaks":{countryCodes:["us"],matchNames:["charleys"],tags:{amenity:"fast_food",brand:"Charleys Philly Steaks","brand:wikidata":"Q1066777","brand:wikipedia":"en:Charleys Philly Steaks",cuisine:"sandwich",name:"Charleys Philly Steaks",takeaway:"yes"}},"amenity/fast_food|Checkers":{nomatch:["shop/supermarket|Checkers"],tags:{amenity:"fast_food",brand:"Checkers","brand:wikidata":"Q63919315",cuisine:"burger",name:"Checkers",takeaway:"yes"}},"amenity/fast_food|Chick-fil-A":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Chick-fil-A","brand:wikidata":"Q491516","brand:wikipedia":"en:Chick-fil-A",cuisine:"chicken",name:"Chick-fil-A",takeaway:"yes"}},"amenity/fast_food|Chicken Express":{countryCodes:["gb","us"],tags:{amenity:"fast_food",brand:"Chicken Express","brand:wikidata":"Q5096235","brand:wikipedia":"en:Chicken Express",cuisine:"chicken",name:"Chicken Express",takeaway:"yes"}},"amenity/fast_food|China Wok":{tags:{amenity:"fast_food",brand:"China Wok","brand:wikidata":"Q5766542","brand:wikipedia":"es:China Wok",cuisine:"chinese",name:"China Wok",takeaway:"yes"}},"amenity/fast_food|Chipotle":{tags:{amenity:"fast_food",brand:"Chipotle","brand:wikidata":"Q465751","brand:wikipedia":"en:Chipotle Mexican Grill",cuisine:"mexican",name:"Chipotle",official_name:"Chipotle Mexican Grill",takeaway:"yes"}},"amenity/fast_food|Chopt":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Chopt","brand:wikidata":"Q17509305","brand:wikipedia":"en:Chopt",cuisine:"salad",name:"Chopt",takeaway:"yes"}},"amenity/fast_food|Chowking":{countryCodes:["ph"],tags:{amenity:"fast_food",brand:"Chowking","brand:wikidata":"Q1076816","brand:wikipedia":"en:Chowking",cuisine:"asian",name:"Chowking",takeaway:"yes"}},"amenity/fast_food|Church's Chicken":{tags:{amenity:"fast_food",brand:"Church's Chicken","brand:wikidata":"Q1089932","brand:wikipedia":"en:Church's Chicken",cuisine:"chicken",name:"Church's Chicken",takeaway:"yes"}},"amenity/fast_food|Cinnabon":{matchTags:["shop/confectionery"],tags:{amenity:"fast_food",brand:"Cinnabon","brand:website":"https://www.cinnabon.com/","brand:wikidata":"Q1092539","brand:wikipedia":"en:Cinnabon",cuisine:"dessert",name:"Cinnabon",takeaway:"yes"}},"amenity/fast_food|CoCo壱番屋":{countryCodes:["cn","jp"],tags:{amenity:"fast_food",brand:"CoCo壱番屋","brand:en":"CoCo Ichibanya","brand:ja":"CoCo壱番屋","brand:wikidata":"Q5986105","brand:wikipedia":"en:Ichibanya",cuisine:"japanese",name:"CoCo壱番屋","name:en":"CoCo Ichibanya","name:ja":"CoCo壱番屋",takeaway:"yes"}},"amenity/fast_food|Cook Out":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Cook Out","brand:wikidata":"Q5166992","brand:wikipedia":"en:Cook Out (restaurant)",cuisine:"american",name:"Cook Out",takeaway:"yes"}},"amenity/fast_food|Così":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Così","brand:wikidata":"Q5175243","brand:wikipedia":"en:Così (restaurant)",cuisine:"sandwich",name:"Così",takeaway:"yes"}},"amenity/fast_food|Culver's":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Culver's","brand:wikidata":"Q1143589","brand:wikipedia":"en:Culver's",cuisine:"burger",name:"Culver's",takeaway:"yes"}},"amenity/fast_food|DQ Grill & Chill":{countryCodes:["ca","us"],nomatch:["amenity/fast_food|Dairy Queen"],tags:{amenity:"fast_food",brand:"DQ Grill & Chill","brand:wikidata":"Q1141226","brand:wikipedia":"en:Dairy Queen",cuisine:"ice_cream;burger",name:"DQ Grill & Chill",takeaway:"yes"}},"amenity/fast_food|Dairy Queen":{matchNames:["dq"],nomatch:["amenity/fast_food|DQ Grill & Chill"],tags:{amenity:"fast_food",brand:"Dairy Queen","brand:wikidata":"Q1141226","brand:wikipedia":"en:Dairy Queen",cuisine:"ice_cream;burger",name:"Dairy Queen",takeaway:"yes"}},"amenity/fast_food|Daylight Donuts":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Daylight Donuts","brand:wikidata":"Q48970508","brand:wikipedia":"en:Daylight Donuts",cuisine:"donut",name:"Daylight Donuts",takeaway:"yes"}},"amenity/fast_food|Del Taco":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Del Taco","brand:wikidata":"Q1183818","brand:wikipedia":"en:Del Taco",cuisine:"mexican",name:"Del Taco",takeaway:"yes"}},"amenity/fast_food|Dig Inn":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Dig Inn","brand:wikidata":"Q28226241","brand:wikipedia":"en:Dig Inn",cuisine:"regional",name:"Dig Inn",takeaway:"yes"}},"amenity/fast_food|Domino's Pizza":{tags:{amenity:"fast_food",brand:"Domino's Pizza","brand:wikidata":"Q839466","brand:wikipedia":"en:Domino's Pizza",cuisine:"pizza",name:"Domino's Pizza",short_name:"Domino's",takeaway:"yes"}},"amenity/fast_food|Dunkin' Donuts":{matchNames:["dunkin doughnuts"],tags:{amenity:"fast_food",brand:"Dunkin' Donuts","brand:wikidata":"Q847743","brand:wikipedia":"en:Dunkin' Donuts",cuisine:"donut;coffee",name:"Dunkin' Donuts",takeaway:"yes"}},"amenity/fast_food|Einstein Bros. Bagels":{countryCodes:["us"],matchNames:["einstein bros","einstein brothers"],tags:{alt_name:"Einstein Brothers Bagels",amenity:"fast_food",brand:"Einstein Bros. Bagels","brand:wikidata":"Q5349788","brand:wikipedia":"en:Einstein Bros. Bagels",cuisine:"bagel",name:"Einstein Bros. Bagels",takeaway:"yes"}},"amenity/fast_food|El Pollo Loco":{countryCodes:["mx","us"],tags:{amenity:"fast_food",brand:"El Pollo Loco","brand:wikidata":"Q2353849","brand:wikipedia":"en:El Pollo Loco",cuisine:"mexican",name:"El Pollo Loco",takeaway:"yes"}},"amenity/fast_food|Everest":{countryCodes:["gr"],tags:{amenity:"fast_food",brand:"Everest","brand:wikidata":"Q62273299",cuisine:"burger",name:"Everest",takeaway:"yes"}},"amenity/fast_food|Extreme Pita":{countryCodes:["ca","us"],tags:{amenity:"fast_food",brand:"Extreme Pita","brand:wikidata":"Q5422367","brand:wikipedia":"en:Extreme Pita",cuisine:"pita",name:"Extreme Pita",takeaway:"yes"}},"amenity/fast_food|Fazoli's":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Fazoli's","brand:wikidata":"Q1399195","brand:wikipedia":"en:Fazoli's",cuisine:"italian",name:"Fazoli's",takeaway:"yes"}},"amenity/fast_food|Firehouse Subs":{countryCodes:["ca","us"],tags:{amenity:"fast_food",brand:"Firehouse Subs","brand:wikidata":"Q5451873","brand:wikipedia":"en:Firehouse Subs",cuisine:"sandwich",name:"Firehouse Subs",takeaway:"yes"}},"amenity/fast_food|Five Guys":{tags:{amenity:"fast_food",brand:"Five Guys","brand:wikidata":"Q1131810","brand:wikipedia":"en:Five Guys",cuisine:"burger",name:"Five Guys",official_name:"Five Guys Burgers and Fries",takeaway:"yes"}},"amenity/fast_food|Freddy's":{countryCodes:["us"],matchNames:["freddys frozen custard & steakburgers","freddys frozen custard and steakburgers"],tags:{amenity:"fast_food",brand:"Freddy's","brand:wikidata":"Q5496837","brand:wikipedia":"en:Freddy's Frozen Custard & Steakburgers",cuisine:"ice_cream;burger",name:"Freddy's",takeaway:"yes"}},"amenity/fast_food|Freebirds":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Freebirds","brand:wikidata":"Q5500367","brand:wikipedia":"en:Freebirds World Burrito",cuisine:"mexican",name:"Freebirds",takeaway:"yes"}},"amenity/fast_food|Gabriel Pizza":{countryCodes:["ca"],tags:{amenity:"fast_food",brand:"Gabriel Pizza","brand:wikidata":"Q5515791","brand:wikipedia":"en:Gabriel Pizza",cuisine:"pizza",name:"Gabriel Pizza",takeaway:"yes"}},"amenity/fast_food|Gino's Pizza":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Gino's Pizza","brand:wikidata":"Q5563205","brand:wikipedia":"en:Gino's Pizza and Spaghetti",cuisine:"pizza",name:"Gino's Pizza",takeaway:"yes"}},"amenity/fast_food|Gold Star Chili":{countryCodes:["us"],tags:{alt_name:"Gold Star",amenity:"fast_food",brand:"Gold Star Chili","brand:wikidata":"Q16994254","brand:wikipedia":"en:Gold Star Chili",cuisine:"chili",name:"Gold Star Chili",takeaway:"yes"}},"amenity/fast_food|Golden Krust Caribbean Bakery & Grill":{countryCodes:["ca","us"],tags:{amenity:"fast_food",brand:"Golden Krust Caribbean Bakery & Grill","brand:wikidata":"Q5579615","brand:wikipedia":"en:Golden Krust Caribbean Bakery & Grill",cuisine:"caribbean",name:"Golden Krust",takeaway:"yes"}},"amenity/fast_food|Great American Cookies":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Great American Cookies","brand:wikidata":"Q5598629","brand:wikipedia":"en:Great American Cookies",cuisine:"cookies",name:"Great American Cookies",takeaway:"yes"}},"amenity/fast_food|Greenwich":{countryCodes:["ph"],tags:{amenity:"fast_food",brand:"Greenwich","brand:wikidata":"Q2691308","brand:wikipedia":"en:Greenwich Pizza",cuisine:"pizza",name:"Greenwich",takeaway:"yes"}},"amenity/fast_food|Habib's":{countryCodes:["br","mx"],tags:{amenity:"fast_food",brand:"Habib's","brand:wikidata":"Q2504930","brand:wikipedia":"en:Habib's",cuisine:"middle_eastern",name:"Habib's",takeaway:"yes"}},"amenity/fast_food|Hallo Pizza":{countryCodes:["de"],tags:{amenity:"fast_food",brand:"Hallo Pizza","brand:wikidata":"Q1571798","brand:wikipedia":"de:Hallo Pizza",cuisine:"pizza",name:"Hallo Pizza",takeaway:"yes"}},"amenity/fast_food|Hardee's":{tags:{amenity:"fast_food",brand:"Hardee's","brand:wikidata":"Q1585088","brand:wikipedia":"en:Hardee's",cuisine:"burger",name:"Hardee's",takeaway:"yes"}},"amenity/fast_food|Harvey's":{countryCodes:["ca"],nomatch:["shop/furniture|Harveys"],tags:{amenity:"fast_food",brand:"Harvey's","brand:wikidata":"Q1466184","brand:wikipedia":"en:Harvey's",cuisine:"burger",name:"Harvey's",takeaway:"yes"}},"amenity/fast_food|Hesburger":{tags:{amenity:"fast_food",brand:"Hesburger","brand:wikidata":"Q1276832","brand:wikipedia":"en:Hesburger",cuisine:"burger",name:"Hesburger",takeaway:"yes"}},"amenity/fast_food|Hot Dog on a Stick":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Hot Dog on a Stick","brand:wikidata":"Q5909922","brand:wikipedia":"en:Hot Dog on a Stick",cuisine:"hot_dog",name:"Hot Dog on a Stick",takeaway:"yes"}},"amenity/fast_food|Hot Head Burritos":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Hot Head Burritos","brand:wikidata":"Q5910008","brand:wikipedia":"en:Hot Head Burritos",cuisine:"mexican",name:"Hot Head Burritos",short_name:"Hot Head",takeaway:"yes"}},"amenity/fast_food|Hungry Howie's":{countryCodes:["us"],matchNames:["hungry howies pizza"],tags:{amenity:"fast_food",brand:"Hungry Howie's","brand:wikidata":"Q16985303","brand:wikipedia":"en:Hungry Howie's Pizza",cuisine:"pizza",name:"Hungry Howie's",takeaway:"yes"}},"amenity/fast_food|Hungry Jacks":{countryCodes:["au"],tags:{amenity:"fast_food",brand:"Hungry Jacks","brand:wikidata":"Q3036373","brand:wikipedia":"en:Hungry Jack's",cuisine:"burger",name:"Hungry Jacks",takeaway:"yes"}},"amenity/fast_food|In-N-Out Burger":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"In-N-Out Burger","brand:wikidata":"Q1205312","brand:wikipedia":"en:In-N-Out Burger",cuisine:"burger",name:"In-N-Out Burger",takeaway:"yes"}},"amenity/fast_food|Jack in the Box":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Jack in the Box","brand:wikidata":"Q1538507","brand:wikipedia":"en:Jack in the Box",cuisine:"burger",name:"Jack in the Box",takeaway:"yes"}},"amenity/fast_food|Jamba Juice":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Jamba Juice","brand:wikidata":"Q3088784","brand:wikipedia":"en:Jamba Juice",cuisine:"juice",name:"Jamba Juice",takeaway:"yes"}},"amenity/fast_food|Jersey Mike's Subs":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Jersey Mike's Subs","brand:wikidata":"Q6184897","brand:wikipedia":"en:Jersey Mike's Subs",cuisine:"sandwich",name:"Jersey Mike's Subs",short_name:"Jersey Mike's",takeaway:"yes"}},"amenity/fast_food|Jimmy John's":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Jimmy John's","brand:wikidata":"Q1689380","brand:wikipedia":"en:Jimmy John's",cuisine:"sandwich",name:"Jimmy John's",takeaway:"yes"}},"amenity/fast_food|Jollibee":{tags:{amenity:"fast_food",brand:"Jollibee","brand:wikidata":"Q37614","brand:wikipedia":"en:Jollibee",cuisine:"burger",name:"Jollibee",takeaway:"yes"}},"amenity/fast_food|Just Salad":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Just Salad","brand:wikidata":"Q23091823","brand:wikipedia":"en:Just Salad",cuisine:"salad",name:"Just Salad",takeaway:"yes"}},"amenity/fast_food|KFC":{tags:{alt_name:"Kentucky Fried Chicken",amenity:"fast_food",brand:"KFC","brand:wikidata":"Q524757","brand:wikipedia":"en:KFC",cuisine:"chicken",name:"KFC",takeaway:"yes"}},"amenity/fast_food|Kochlöffel":{countryCodes:["de","tr"],tags:{amenity:"fast_food",brand:"Kochlöffel","brand:wikidata":"Q315539","brand:wikipedia":"en:Kochlöffel",cuisine:"burger",name:"Kochlöffel",takeaway:"yes"}},"amenity/fast_food|Kotipizza":{countryCodes:["fi"],tags:{amenity:"fast_food",brand:"Kotipizza","brand:wikidata":"Q1628625","brand:wikipedia":"en:Kotipizza",cuisine:"pizza",name:"Kotipizza",takeaway:"yes"}},"amenity/fast_food|Krispy Kreme":{matchNames:["krispy kreme doughnuts"],tags:{amenity:"fast_food",brand:"Krispy Kreme","brand:wikidata":"Q1192805","brand:wikipedia":"en:Krispy Kreme",cuisine:"donut",name:"Krispy Kreme",takeaway:"yes"}},"amenity/fast_food|Krystal":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Krystal","brand:wikidata":"Q472195","brand:wikipedia":"en:Krystal (restaurant)",cuisine:"burger",name:"Krystal",takeaway:"yes"}},"amenity/fast_food|L&L Drive-Inn~(Hawaii)":{countryCodes:["us"],matchNames:["l&l","l&l drive-in"],tags:{amenity:"fast_food",brand:"L&L Drive-Inn","brand:wikidata":"Q6455441","brand:wikipedia":"en:L&L Hawaiian Barbecue",cuisine:"hawaiian",name:"L&L Drive-Inn",takeaway:"yes"}},"amenity/fast_food|L&L Hawaiian Barbecue":{countryCodes:["us"],matchNames:["l&l","l&l hawaiian bbq"],tags:{amenity:"fast_food",brand:"L&L Hawaiian Barbecue","brand:wikidata":"Q6455441","brand:wikipedia":"en:L&L Hawaiian Barbecue",cuisine:"hawaiian",name:"L&L Hawaiian Barbecue",takeaway:"yes"}},"amenity/fast_food|Lee's Sandwiches":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Lee's Sandwiches","brand:wikidata":"Q6512823","brand:wikipedia":"en:Lee's Sandwiches",cuisine:"vietnamese;sandwich",name:"Lee's Sandwiches",takeaway:"yes"}},"amenity/fast_food|Little Caesars":{matchNames:["little caesars pizza"],tags:{amenity:"fast_food",brand:"Little Caesars","brand:wikidata":"Q1393809","brand:wikipedia":"en:Little Caesars",cuisine:"pizza",name:"Little Caesars",takeaway:"yes"}},"amenity/fast_food|Long John Silver's":{tags:{amenity:"fast_food",brand:"Long John Silver's","brand:wikidata":"Q1535221","brand:wikipedia":"en:Long John Silver's",cuisine:"seafood",name:"Long John Silver's",takeaway:"yes"}},"amenity/fast_food|Lotteria":{tags:{amenity:"fast_food",brand:"Lotteria","brand:wikidata":"Q249525","brand:wikipedia":"en:Lotteria",cuisine:"burger",name:"Lotteria",takeaway:"yes"}},"amenity/fast_food|MOD Pizza":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"MOD Pizza","brand:wikidata":"Q19903469","brand:wikipedia":"en:MOD Pizza",cuisine:"pizza",name:"MOD Pizza",takeaway:"yes"}},"amenity/fast_food|Manchu Wok":{countryCodes:["ca","us"],tags:{amenity:"fast_food",brand:"Manchu Wok","brand:wikidata":"Q6747622","brand:wikipedia":"en:Manchu Wok",cuisine:"chinese",name:"Manchu Wok",takeaway:"yes"}},"amenity/fast_food|Mang Inasal":{countryCodes:["ph"],tags:{amenity:"fast_food",brand:"Mang Inasal","brand:wikidata":"Q6748573","brand:wikipedia":"en:Mang Inasal",cuisine:"barbecue",name:"Mang Inasal",takeaway:"yes"}},"amenity/fast_food|Manhattan Bagel":{countryCodes:["us"],matchNames:["manhattan bagels"],tags:{amenity:"fast_food",brand:"Manhattan Bagel","brand:wikidata":"Q64517333",cuisine:"bagel",name:"Manhattan Bagel",takeaway:"yes"}},"amenity/fast_food|Marmaris":{countryCodes:["de","fi","fr","gb","nl"],tags:{amenity:"fast_food",brand:"Marmaris",name:"Marmaris",takeaway:"yes"}},"amenity/fast_food|Max":{countryCodes:["se"],tags:{amenity:"fast_food",brand:"Max","brand:wikidata":"Q1912172","brand:wikipedia":"en:Max Hamburgers",cuisine:"burger",name:"Max",takeaway:"yes"}},"amenity/fast_food|McDonald's":{tags:{amenity:"fast_food",brand:"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"en:McDonald's",cuisine:"burger",name:"McDonald's",takeaway:"yes"}},"amenity/fast_food|Mighty Taco":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Mighty Taco","brand:wikidata":"Q6844210","brand:wikipedia":"en:Mighty Taco",cuisine:"mexican",name:"Mighty Taco",takeaway:"yes"}},"amenity/fast_food|Minute Burger":{countryCodes:["ph"],tags:{amenity:"fast_food",brand:"Minute Burger","brand:wikidata":"Q62273503",cuisine:"burger",name:"Minute Burger",takeaway:"yes"}},"amenity/fast_food|Moe's Southwest Grill":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Moe's Southwest Grill","brand:wikidata":"Q6889938","brand:wikipedia":"en:Moe's Southwest Grill",cuisine:"mexican",name:"Moe's Southwest Grill",short_name:"Moe's",takeaway:"yes"}},"amenity/fast_food|Mr. Sub":{tags:{amenity:"fast_food",brand:"Mr. Sub","brand:wikidata":"Q6929225","brand:wikipedia":"en:Mr. Sub",cuisine:"sandwich",name:"Mr. Sub",takeaway:"yes"}},"amenity/fast_food|New York Fries":{countryCodes:["ca"],tags:{amenity:"fast_food",brand:"New York Fries","brand:wikidata":"Q7013558","brand:wikipedia":"en:New York Fries",cuisine:"fries",name:"New York Fries",takeaway:"yes"}},"amenity/fast_food|New York Pizza":{countryCodes:["nl"],tags:{amenity:"fast_food",brand:"New York Pizza","brand:wikidata":"Q2639128","brand:wikipedia":"nl:New York Pizza",cuisine:"pizza",name:"New York Pizza",takeaway:"yes"}},"amenity/fast_food|Noah's Bagels":{countryCodes:["us"],matchNames:["noahs ny bagels"],tags:{amenity:"fast_food",brand:"Noah's Bagels","brand:wikidata":"Q64517373",cuisine:"bagel",name:"Noah's Bagels",official_name:"Noah's New York Bagels",takeaway:"yes"}},"amenity/fast_food|Nordsee":{countryCodes:["at","ch","de"],tags:{amenity:"fast_food",brand:"Nordsee","brand:wikidata":"Q74866","brand:wikipedia":"en:Nordsee",cuisine:"seafood",name:"Nordsee",takeaway:"yes"}},"amenity/fast_food|Num Pang":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Num Pang","brand:wikidata":"Q62079702","brand:wikipedia":"en:Num Pang",cuisine:"cambodian, sandwich",name:"Num Pang",takeaway:"yes"}},"amenity/fast_food|O'Tacos":{countryCodes:["be","fr"],tags:{amenity:"fast_food",brand:"O'Tacos","brand:wikidata":"Q28494040","brand:wikipedia":"en:O'Tacos",cuisine:"mexican",name:"O'Tacos",takeaway:"yes"}},"amenity/fast_food|Oporto":{countryCodes:["au"],tags:{amenity:"fast_food",brand:"Oporto","brand:wikidata":"Q4412342","brand:wikipedia":"en:Oporto (restaurant)",cuisine:"burger;chicken",name:"Oporto",takeaway:"yes"}},"amenity/fast_food|Orange Julius":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Orange Julius","brand:wikidata":"Q3355059","brand:wikipedia":"en:Orange Julius",cuisine:"juice",name:"Orange Julius",takeaway:"yes"}},"amenity/fast_food|Pal's":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Pal's","brand:wikidata":"Q7126094","brand:wikipedia":"en:Pal's",cuisine:"burger",name:"Pal's",official_name:"Pal's Sudden Service",takeaway:"yes"}},"amenity/fast_food|Panago":{countryCodes:["ca"],tags:{amenity:"fast_food",brand:"Panago","brand:wikidata":"Q17111672","brand:wikipedia":"en:Panago",cuisine:"pizza",name:"Panago",takeaway:"yes"}},"amenity/fast_food|Panda Express":{matchNames:["panda"],tags:{amenity:"fast_food",brand:"Panda Express","brand:wikidata":"Q1358690","brand:wikipedia":"en:Panda Express",cuisine:"chinese",name:"Panda Express",takeaway:"yes"}},"amenity/fast_food|Panera Bread":{countryCodes:["ca","us"],tags:{amenity:"fast_food",brand:"Panera Bread","brand:wikidata":"Q7130852","brand:wikipedia":"en:Panera Bread",cuisine:"sandwich",name:"Panera Bread",short_name:"Panera",takeaway:"yes"}},"amenity/fast_food|Papa John's":{matchNames:["papa john","papa john pizza","papa johns pizza"],tags:{amenity:"fast_food",brand:"Papa John's","brand:wikidata":"Q2759586","brand:wikipedia":"en:Papa John's Pizza",cuisine:"pizza",name:"Papa John's",takeaway:"yes"}},"amenity/fast_food|Papa Murphy's":{countryCodes:["ca","us"],matchNames:["papa murphy","papa murphy pizza","papa murphys pizza"],tags:{amenity:"fast_food",brand:"Papa Murphy's","brand:wikidata":"Q7132349","brand:wikipedia":"en:Papa Murphy's",cuisine:"pizza",name:"Papa Murphy's",official_name:"Papa Murphy's Take 'N' Bake Pizza",takeaway:"only"}},"amenity/fast_food|Penn Station":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Penn Station","brand:wikidata":"Q7163311","brand:wikipedia":"en:Penn Station (restaurant)",cuisine:"sandwich",name:"Penn Station",takeaway:"yes"}},"amenity/fast_food|Philly Pretzel Factory":{countryCodes:["us"],matchNames:["philadelphia pretzel factory","philadelphia soft pretzel factory","philly soft pretzel factory"],tags:{amenity:"fast_food",brand:"Philly Pretzel Factory","brand:wikidata":"Q60097339",cuisine:"pretzel",name:"Philly Pretzel Factory",takeaway:"yes"}},"amenity/fast_food|Pinulito":{countryCodes:["gt"],tags:{amenity:"fast_food",brand:"Pinulito","brand:wikidata":"Q62273613",cuisine:"chicken",name:"Pinulito",takeaway:"yes"}},"amenity/fast_food|Pita Pit":{tags:{amenity:"fast_food",brand:"Pita Pit","brand:wikidata":"Q7757289","brand:wikipedia":"en:Pita Pit",cuisine:"pita",name:"Pita Pit",takeaway:"yes"}},"amenity/fast_food|Pizza Hut Delivery":{tags:{amenity:"fast_food",brand:"Pizza Hut","brand:wikidata":"Q191615","brand:wikipedia":"en:Pizza Hut",cuisine:"pizza",name:"Pizza Hut Delivery",takeaway:"yes"}},"amenity/fast_food|Pizza Hut Express":{nomatch:["amenity/restaurant|Pizza Hut"],tags:{amenity:"fast_food",brand:"Pizza Hut","brand:wikidata":"Q191615","brand:wikipedia":"en:Pizza Hut",cuisine:"pizza",name:"Pizza Hut Express",takeaway:"yes"}},"amenity/fast_food|Pizza King":{tags:{amenity:"fast_food",brand:"Pizza King",cuisine:"pizza",name:"Pizza King",takeaway:"yes"}},"amenity/fast_food|Pizza Nova":{tags:{amenity:"fast_food",brand:"Pizza Nova","brand:wikidata":"Q7199971","brand:wikipedia":"en:Pizza Nova",cuisine:"pizza",name:"Pizza Nova",takeaway:"yes"}},"amenity/fast_food|Pizza Pizza":{tags:{amenity:"fast_food",brand:"Pizza Pizza","brand:wikidata":"Q1194143","brand:wikipedia":"en:Pizza Pizza",cuisine:"pizza",name:"Pizza Pizza",takeaway:"yes"}},"amenity/fast_food|Pollo Campero":{tags:{amenity:"fast_food",brand:"Pollo Campero","brand:wikidata":"Q942741","brand:wikipedia":"en:Pollo Campero",cuisine:"chicken",name:"Pollo Campero",takeaway:"yes"}},"amenity/fast_food|Pollo Granjero~(Costa Rica)":{countryCodes:["cr"],tags:{amenity:"fast_food",brand:"Pollo Granjero","brand:wikidata":"Q62273665",cuisine:"chicken",name:"Pollo Granjero",takeaway:"yes"}},"amenity/fast_food|Pollo Granjero~(Guatemala)":{countryCodes:["gt"],tags:{amenity:"fast_food",brand:"Pollo Granjero","brand:wikidata":"Q62273652",cuisine:"chicken",name:"Pollo Granjero",takeaway:"yes"}},"amenity/fast_food|Pollo Tropical":{tags:{amenity:"fast_food",brand:"Pollo Tropical","brand:wikidata":"Q3395356","brand:wikipedia":"en:Pollo Tropical",cuisine:"chicken",name:"Pollo Tropical",takeaway:"yes"}},"amenity/fast_food|Pollolandia":{tags:{amenity:"fast_food",brand:"Pollolandia",cuisine:"chicken",name:"Pollolandia",takeaway:"yes"}},"amenity/fast_food|Popeyes":{tags:{amenity:"fast_food",brand:"Popeyes","brand:wikidata":"Q1330910","brand:wikipedia":"en:Popeyes",cuisine:"chicken",name:"Popeyes",official_name:"Popeyes Louisiana Kitchen",takeaway:"yes"}},"amenity/fast_food|Potbelly":{countryCodes:["us"],matchNames:["potbelly sandwich shop"],tags:{amenity:"fast_food",brand:"Potbelly","brand:wikidata":"Q7234777","brand:wikipedia":"en:Potbelly Sandwich Shop",cuisine:"sandwich",name:"Potbelly",official_name:"Potbelly Sandwich Works",takeaway:"yes"}},"amenity/fast_food|Pret A Manger":{countryCodes:["gb","us"],tags:{amenity:"fast_food",brand:"Pret A Manger","brand:wikidata":"Q2109109","brand:wikipedia":"en:Pret a Manger",cuisine:"sandwich",name:"Pret A Manger",takeaway:"yes"}},"amenity/fast_food|Pretzelmaker":{countryCodes:["us"],matchNames:["pretzel time"],tags:{amenity:"fast_food",brand:"Pretzelmaker","brand:wikidata":"Q7242321","brand:wikipedia":"en:Pretzelmaker",cuisine:"pretzel",name:"Pretzelmaker",takeaway:"yes"}},"amenity/fast_food|Qdoba":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Qdoba","brand:wikidata":"Q1363885","brand:wikipedia":"en:Qdoba",cuisine:"mexican",name:"Qdoba",official_name:"Qdoba Mexican Grill",takeaway:"yes"}},"amenity/fast_food|Quick":{countryCodes:["be","fr","lu"],tags:{amenity:"fast_food",brand:"Quick","brand:wikidata":"Q286494","brand:wikipedia":"en:Quick (restaurant)",cuisine:"burger",name:"Quick",takeaway:"yes"}},"amenity/fast_food|Quiznos":{matchNames:["quiznos sub","quiznos subs"],tags:{amenity:"fast_food",brand:"Quiznos","brand:wikidata":"Q1936229","brand:wikipedia":"en:Quiznos",cuisine:"sandwich",name:"Quiznos",takeaway:"yes"}},"amenity/fast_food|Raising Cane's":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Raising Cane's","brand:wikidata":"Q7285144","brand:wikipedia":"en:Raising Cane's Chicken Fingers",cuisine:"chicken",name:"Raising Cane's",official_name:"Raising Cane's Chicken Fingers",takeaway:"yes"}},"amenity/fast_food|Rally's":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Rally's","brand:wikidata":"Q63919323",cuisine:"burger",name:"Rally's",takeaway:"yes"}},"amenity/fast_food|Red Rooster":{countryCodes:["au"],tags:{amenity:"fast_food",brand:"Red Rooster","brand:wikidata":"Q376466","brand:wikipedia":"en:Red Rooster",cuisine:"chicken",name:"Red Rooster",takeaway:"yes"}},"amenity/fast_food|Roy Rogers":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Roy Rogers","brand:wikidata":"Q7373311","brand:wikipedia":"en:Roy Rogers Restaurants",cuisine:"burger;sandwich;chicken",name:"Roy Rogers",takeaway:"yes"}},"amenity/fast_food|Rubio's":{countryCodes:["us"],matchNames:["rubios fresh mexican grill"],tags:{amenity:"fast_food",brand:"Rubio's","brand:wikidata":"Q7376154","brand:wikipedia":"en:Rubio's Coastal Grill",cuisine:"mexican",name:"Rubio's",official_name:"Rubio's Coastal Grill",takeaway:"yes"}},"amenity/fast_food|SUSU & Sons":{countryCodes:["il"],tags:{alt_name:"SUSU and Sons","alt_name:en":"SUSU and Sons","alt_name:he":"סוסו ובניו",amenity:"fast_food",brand:"SUSU & Sons","brand:en":"SUSU & Sons","brand:he":"סוסו אנד סאנס","brand:wikidata":"Q64760081",cuisine:"burger",name:"SUSU & Sons","name:en":"SUSU & Sons","name:he":"סוסו אנד סאנס",takeaway:"yes"}},"amenity/fast_food|Sarku Japan":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Sarku Japan","brand:wikidata":"Q7424243",cuisine:"japanese",name:"Sarku Japan",takeaway:"yes"}},"amenity/fast_food|Sbarro":{matchNames:["Sbarro Pizzeria"],tags:{amenity:"fast_food",brand:"Sbarro","brand:wikidata":"Q2589409","brand:wikipedia":"en:Sbarro",cuisine:"pizza",name:"Sbarro",takeaway:"yes"}},"amenity/fast_food|Schlotzsky's":{countryCodes:["us"],matchNames:["schlotzskys deli"],tags:{amenity:"fast_food",brand:"Schlotzsky's","brand:wikidata":"Q2244796","brand:wikipedia":"en:Schlotzsky's",cuisine:"sandwich",name:"Schlotzsky's",takeaway:"yes"}},"amenity/fast_food|Shake Shack":{countryCodes:["gb","us"],tags:{amenity:"fast_food",brand:"Shake Shack","brand:wikidata":"Q1058722","brand:wikipedia":"en:Shake Shack",cuisine:"burger",name:"Shake Shack",takeaway:"yes"}},"amenity/fast_food|Sibylla":{countryCodes:["fi","se"],tags:{amenity:"fast_food",brand:"Sibylla","brand:wikidata":"Q488643","brand:wikipedia":"en:Sibylla (fast food)",cuisine:"burger",name:"Sibylla",takeaway:"yes"}},"amenity/fast_food|Smashburger":{countryCodes:["ca","us"],tags:{amenity:"fast_food",brand:"Smashburger","brand:wikidata":"Q17061332","brand:wikipedia":"en:Smashburger",cuisine:"burger",name:"Smashburger",takeaway:"yes"}},"amenity/fast_food|Smoothie King":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Smoothie King","brand:wikidata":"Q5491421","brand:wikipedia":"en:Smoothie King",cuisine:"juice",name:"Smoothie King",takeaway:"yes"}},"amenity/fast_food|Sonic":{matchNames:["sonic drive in"],nomatch:["amenity/fuel|Sonic"],tags:{amenity:"fast_food",brand:"Sonic","brand:wikidata":"Q7561808","brand:wikipedia":"en:Sonic Drive-In",cuisine:"burger",name:"Sonic",takeaway:"yes"}},"amenity/fast_food|Specialty's":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Specialty's","brand:wikidata":"Q64339210",cuisine:"sandwich;bakery",name:"Specialty's",takeaway:"yes"}},"amenity/fast_food|Steak Escape":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Steak Escape","brand:wikidata":"Q7605235","brand:wikipedia":"en:Steak Escape",cuisine:"sandwich",name:"Steak Escape",takeaway:"yes"}},"amenity/fast_food|Steers":{tags:{amenity:"fast_food",brand:"Steers","brand:wikidata":"Q56599145","brand:wikipedia":"en:Steers",cuisine:"burger",name:"Steers",takeaway:"yes"}},"amenity/fast_food|Subway":{matchNames:["subway sandwiches"],tags:{amenity:"fast_food",brand:"Subway","brand:wikidata":"Q244457","brand:wikipedia":"en:Subway (restaurant)",cuisine:"sandwich",name:"Subway",takeaway:"yes"}},"amenity/fast_food|Supermac's":{countryCodes:["gb","ie"],tags:{amenity:"fast_food",brand:"Supermac's","brand:wikidata":"Q7643750","brand:wikipedia":"en:Supermac's",cuisine:"burger",name:"Supermac's",takeaway:"yes"}},"amenity/fast_food|Sushi Shop":{countryCodes:["ca"],tags:{amenity:"fast_food",brand:"Sushi Shop","brand:wikidata":"Q64840990",cuisine:"sushi",name:"Sushi Shop",takeaway:"yes"}},"amenity/fast_food|TCBY":{tags:{amenity:"fast_food",brand:"TCBY","brand:wikidata":"Q7669631","brand:wikipedia":"en:TCBY",cuisine:"frozen_yogurt",name:"TCBY",takeaway:"yes"}},"amenity/fast_food|Taco Bell":{tags:{amenity:"fast_food",brand:"Taco Bell","brand:wikidata":"Q752941","brand:wikipedia":"en:Taco Bell",cuisine:"tex-mex",name:"Taco Bell",takeaway:"yes"}},"amenity/fast_food|Taco Bueno":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Taco Bueno","brand:wikidata":"Q7673958","brand:wikipedia":"en:Taco Bueno",cuisine:"mexican",name:"Taco Bueno",takeaway:"yes"}},"amenity/fast_food|Taco Cabana":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Taco Cabana","brand:wikidata":"Q12070488","brand:wikipedia":"en:Taco Cabana",cuisine:"mexican",name:"Taco Cabana",takeaway:"yes"}},"amenity/fast_food|Taco Del Mar":{countryCodes:["ca","us"],tags:{amenity:"fast_food",brand:"Taco Del Mar","brand:wikidata":"Q7673972","brand:wikipedia":"en:Taco del Mar",cuisine:"mexican",name:"Taco Del Mar",takeaway:"yes"}},"amenity/fast_food|Taco John's":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Taco John's","brand:wikidata":"Q7673962","brand:wikipedia":"en:Taco John's",cuisine:"mexican",name:"Taco John's",takeaway:"yes"}},"amenity/fast_food|Taco Time":{countryCodes:["ca","us"],tags:{amenity:"fast_food",brand:"Taco Time","brand:wikidata":"Q7673969","brand:wikipedia":"en:Taco Time",cuisine:"mexican",name:"Taco Time",takeaway:"yes"}},"amenity/fast_food|Ted's Hot Dogs":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Ted's Hot Dogs","brand:wikidata":"Q7692930","brand:wikipedia":"en:Ted's Hot Dogs",cuisine:"sausage",name:"Ted's Hot Dogs",takeaway:"yes"}},"amenity/fast_food|Telepizza":{tags:{amenity:"fast_food",brand:"Telepizza","brand:wikidata":"Q2699863","brand:wikipedia":"en:Telepizza",cuisine:"pizza",name:"Telepizza",takeaway:"yes"}},"amenity/fast_food|Texas Chicken":{tags:{amenity:"fast_food",brand:"Texas Chicken",cuisine:"chicken",name:"Texas Chicken",takeaway:"yes"}},"amenity/fast_food|Thai Express~(Singapore)":{countryCodes:["sg"],nomatch:["amenity/fast_food|Thaï Express~(North America)"],tags:{amenity:"fast_food",brand:"Thai Express","brand:wikidata":"Q7709119","brand:wikipedia":"en:Thai Express",cuisine:"thai",name:"Thai Express",takeaway:"yes"}},"amenity/fast_food|Thaï Express~(North America)":{countryCodes:["ca","us"],matchNames:["thai express"],nomatch:["amenity/fast_food|Thai Express~(Singapore)"],tags:{amenity:"fast_food",brand:"Thaï Express","brand:wikidata":"Q7711610","brand:wikipedia":"en:Thaï Express",cuisine:"thai",name:"Thaï Express",takeaway:"yes"}},"amenity/fast_food|The Habit Burger Grill":{countryCodes:["us"],matchNames:["the habit burger"],tags:{alt_name:"Habit Burger Grill",amenity:"fast_food",brand:"The Habit Burger Grill","brand:wikidata":"Q18158741","brand:wikipedia":"en:The Habit Burger Grill",cuisine:"burger",name:"The Habit Burger Grill",short_name:"Habit Burger",takeaway:"yes"}},"amenity/fast_food|The Pizza Company":{tags:{alt_name:"Pizza Company",amenity:"fast_food",brand:"The Pizza Company","brand:wikidata":"Q2413520","brand:wikipedia":"en:The Pizza Company",cuisine:"pizza",name:"The Pizza Company",takeaway:"yes"}},"amenity/fast_food|Togo's":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Togo's","brand:wikidata":"Q3530375","brand:wikipedia":"en:Togo's",cuisine:"sandwich",name:"Togo's",takeaway:"yes"}},"amenity/fast_food|Tropical Smoothie Cafe":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Tropical Smoothie Cafe","brand:wikidata":"Q7845817","brand:wikipedia":"en:Tropical Smoothie Cafe",cuisine:"juice",name:"Tropical Smoothie Cafe",takeaway:"yes"}},"amenity/fast_food|Veggie Grill":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Veggie Grill","brand:wikidata":"Q18636427","brand:wikipedia":"en:Veggie Grill",cuisine:"american","diet:vegan":"only",name:"Veggie Grill",takeaway:"yes"}},"amenity/fast_food|Wahoo's Fish Taco":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Wahoo's Fish Taco","brand:wikidata":"Q7959827","brand:wikipedia":"en:Wahoo's Fish Taco",cuisine:"seafood",name:"Wahoo's Fish Taco",short_name:"Wahoo's",takeaway:"yes"}},"amenity/fast_food|Wendy's":{tags:{amenity:"fast_food",brand:"Wendy's","brand:wikidata":"Q550258","brand:wikipedia":"en:Wendy's",cuisine:"burger",name:"Wendy's",takeaway:"yes"}},"amenity/fast_food|Whataburger":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Whataburger","brand:wikidata":"Q376627","brand:wikipedia":"en:Whataburger",cuisine:"burger",name:"Whataburger",takeaway:"yes"}},"amenity/fast_food|Which Wich?":{countryCodes:["ae","gb","gt","mx","om","qa","sa","us"],tags:{amenity:"fast_food",brand:"Which Wich?","brand:wikidata":"Q7993556","brand:wikipedia":"en:Which Wich?",cuisine:"sandwich",name:"Which Wich?",takeaway:"yes"}},"amenity/fast_food|White Castle":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"White Castle","brand:wikidata":"Q1244034","brand:wikipedia":"en:White Castle (restaurant)",cuisine:"burger",name:"White Castle",takeaway:"yes"}},"amenity/fast_food|Wienerschnitzel":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Wienerschnitzel","brand:wikidata":"Q324679","brand:wikipedia":"en:Wienerschnitzel",cuisine:"hot_dog",name:"Wienerschnitzel",takeaway:"yes"}},"amenity/fast_food|Wimpy":{tags:{amenity:"fast_food",brand:"Wimpy","brand:wikidata":"Q2811992","brand:wikipedia":"en:Wimpy (restaurant)",cuisine:"burger",name:"Wimpy",takeaway:"yes"}},"amenity/fast_food|Xi'an Famous Foods":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Xi'an Famous Foods","brand:wikidata":"Q8044020","brand:wikipedia":"en:Xi'an Famous Foods",cuisine:"chinese",name:"Xi'an Famous Foods",takeaway:"yes"}},"amenity/fast_food|Zaxby's":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Zaxby's","brand:wikidata":"Q8067525","brand:wikipedia":"en:Zaxby's",cuisine:"chicken",name:"Zaxby's",official_name:"Zaxby's Chicken Fingers & Buffalo Wings",takeaway:"yes"}},"amenity/fast_food|Zoës Kitchen":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Zoës Kitchen","brand:wikidata":"Q8074747","brand:wikipedia":"en:Zoës Kitchen",cuisine:"mediterranean",name:"Zoës Kitchen",takeaway:"yes"}},"amenity/fast_food|immergrün":{countryCodes:["de"],matchNames:["immergün"],tags:{amenity:"fast_food",brand:"immergrün","brand:wikidata":"Q62589254",cuisine:"sandwich;salad;juice",name:"immergün",takeaway:"yes"}},"amenity/fast_food|Γρηγόρης":{countryCodes:["gr"],tags:{amenity:"fast_food",brand:"Γρηγόρης","brand:el":"Γρηγόρης","brand:en":"Gregorys","brand:wikidata":"Q62273834",cuisine:"sandwich",name:"Γρηγόρης","name:el":"Γρηγόρης","name:en":"Gregorys",takeaway:"yes"}},"amenity/fast_food|Бургер Кинг":{countryCodes:["by","kz","ru"],tags:{amenity:"fast_food",brand:"Бургер Кинг","brand:en":"Burger King","brand:ru":"Бургер Кинг","brand:wikidata":"Q177054","brand:wikipedia":"en:Burger King",cuisine:"burger",name:"Бургер Кинг","name:en":"Burger King","name:ru":"Бургер Кинг",takeaway:"yes"}},"amenity/fast_food|Домино'c Пицца":{tags:{amenity:"fast_food",brand:"Домино'c Пицца","brand:en":"Domino's Pizza","brand:ru":"Домино'c Пицца","brand:wikidata":"Q839466","brand:wikipedia":"ru:Domino’s Pizza",name:"Домино'c Пицца","name:en":"Domino's Pizza","name:ru":"Домино'c Пицца",short_name:"Домино'c","short_name:en":"Domino's","short_name:ru":"Домино'c",takeaway:"yes"}},"amenity/fast_food|Крошка Картошка":{countryCodes:["ru"],tags:{amenity:"fast_food",brand:"Крошка Картошка","brand:en":"Kroshka Kartoshka","brand:ru":"Крошка Картошка","brand:wikidata":"Q4241838","brand:wikipedia":"ru:Крошка Картошка",cuisine:"potato",name:"Крошка Картошка","name:en":"Kroshka Kartoshka","name:ru":"Крошка Картошка",takeaway:"yes"}},"amenity/fast_food|Макдоналдс":{tags:{amenity:"fast_food",brand:"Макдоналдс","brand:en":"McDonald's","brand:ru":"Макдоналдс","brand:wikidata":"Q38076","brand:wikipedia":"en:McDonald's",cuisine:"burger",name:"Макдоналдс","name:en":"McDonald's","name:ru":"Макдоналдс",takeaway:"yes"}},"amenity/fast_food|Папа Джонс":{countryCodes:["by","ru"],tags:{amenity:"fast_food",brand:"Папа Джонс","brand:en":"Papa John's","brand:ru":"Папа Джонс","brand:wikidata":"Q2759586","brand:wikipedia":"ru:Papa John’s",cuisine:"pizza",name:"Папа Джонс","name:en":"Papa John's","name:ru":"Папа Джонс",takeaway:"yes"}},"amenity/fast_food|Робин Сдобин":{countryCodes:["ru"],tags:{amenity:"fast_food",brand:"Робин Сдобин","brand:en":"Robins Dobin","brand:ru":"Робин Сдобин","brand:wikidata":"Q62273880",cuisine:"burger",name:"Робин Сдобин","name:en":"Robins Dobin","name:ru":"Робин Сдобин",takeaway:"yes"}},"amenity/fast_food|Русский Аппетит":{countryCodes:["ru"],tags:{amenity:"fast_food",brand:"Русский Аппетит","brand:en":"Russkiy Appetit","brand:ru":"Русский Аппетит","brand:wikidata":"Q62086063",cuisine:"sandwich;salad;regional",name:"Русский Аппетит","name:en":"Russkiy Appetit","name:ru":"Русский Аппетит",takeaway:"yes"}},"amenity/fast_food|Стардог!s":{countryCodes:["ru"],tags:{amenity:"fast_food",brand:"Стардог!s","brand:en":"Stardog!s","brand:ru":"Стардог!s","brand:wikidata":"Q4439856","brand:wikipedia":"ru:Стардогс",cuisine:"sausage",name:"Стардог!s","name:en":"Stardog!s","name:ru":"Стардог!s",takeaway:"yes"}},"amenity/fast_food|Суши Wok":{countryCodes:["ru","ua"],matchTags:["shop/convenience"],tags:{amenity:"fast_food",brand:"Суши Wok","brand:en":"Sushi Wok","brand:ru":"Суши Wok","brand:wikidata":"Q25444754","brand:wikipedia":"uk:Суши Wok (мережа магазинів)",cuisine:"asian",name:"Суши Wok","name:en":"Sushi Wok","name:ru":"Суши Wok",takeaway:"yes"}},"amenity/fast_food|Теремок":{countryCodes:["ru"],matchTags:["shop/convenience"],tags:{amenity:"fast_food",brand:"Теремок","brand:en":"Teremok","brand:ru":"Теремок","brand:wikidata":"Q4455593","brand:wikipedia":"ru:Теремок (сеть быстрого питания)",cuisine:"crepe;russian",name:"Теремок","name:en":"Teremok","name:ru":"Теремок",takeaway:"yes"}},"amenity/fast_food|אגדיר":{countryCodes:["il"],tags:{amenity:"fast_food",brand:"אגדיר","brand:en":"Agadir","brand:he":"אגדיר","brand:wikidata":"Q64760070",cuisine:"burger",name:"אגדיר","name:en":"Agadir","name:he":"אגדיר",takeaway:"yes"}},"amenity/fast_food|מקדונלד'ס":{countryCodes:["il"],tags:{amenity:"fast_food",brand:"מקדונלד'ס","brand:en":"McDonald's","brand:he":"מקדונלד'ס","brand:wikidata":"Q12061542","brand:wikipedia":"en:McDonald's Israel",cuisine:"burger",name:"מקדונלד'ס","name:en":"McDonald's","name:he":"מקדונלד'ס",takeaway:"yes"}},"amenity/fast_food|עד העצם אקספרס":{countryCodes:["il"],tags:{amenity:"fast_food",brand:"עד העצם אקספרס","brand:en":"Ad Haetzem Express","brand:he":"עד העצם אקספרס","brand:wikidata":"Q64760165",cuisine:"burger",name:"עד העצם אקספרס","name:en":"Ad Haetzem Express","name:he":"עד העצם אקספרס",takeaway:"yes"}},"amenity/fast_food|دجاج كنتاكي":{tags:{amenity:"fast_food",brand:"دجاج كنتاكي","brand:ar":"دجاج كنتاكي","brand:en":"KFC","brand:wikidata":"Q524757","brand:wikipedia":"ar:دجاج كنتاكي",cuisine:"chicken",name:"دجاج كنتاكي","name:ar":"دجاج كنتاكي","name:en":"KFC",takeaway:"yes"}},"amenity/fast_food|ماكدونالدز":{tags:{amenity:"fast_food",brand:"ماكدونالدز","brand:ar":"ماكدونالدز","brand:en":"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"ar:ماكدونالدز",cuisine:"burger",name:"ماكدونالدز","name:ar":"ماكدونالدز","name:en":"McDonald's",takeaway:"yes"}},"amenity/fast_food|かっぱ寿司":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"かっぱ寿司","brand:en":"Kappazushi","brand:ja":"かっぱ寿司","brand:wikidata":"Q11263916","brand:wikipedia":"ja:かっぱ寿司",cuisine:"sushi",name:"かっぱ寿司","name:en":"Kappazushi","name:ja":"かっぱ寿司",takeaway:"yes"}},"amenity/fast_food|かつや":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"かつや","brand:en":"Katsuya","brand:ja":"かつや","brand:wikidata":"Q2855257","brand:wikipedia":"ja:かつや",cuisine:"fried_food",name:"かつや","name:en":"Katsuya","name:ja":"かつや","name:ko":"카쯔야","name:zh":"吉豚屋",takeaway:"yes"}},"amenity/fast_food|くら寿司":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"くら寿司","brand:en":"Kurazushi","brand:ja":"くら寿司","brand:wikidata":"Q6445491","brand:wikipedia":"ja:くら寿司",cuisine:"sushi",name:"くら寿司","name:en":"Kurazushi","name:ja":"くら寿司",takeaway:"yes"}},"amenity/fast_food|すき家":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"すき家","brand:en":"Sukiya","brand:ja":"すき家","brand:wikidata":"Q6137375","brand:wikipedia":"ja:すき家",cuisine:"beef_bowl",name:"すき家","name:en":"Sukiya","name:ja":"すき家",takeaway:"yes"}},"amenity/fast_food|てんや":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"てんや","brand:en":"Tenya","brand:ja":"てんや","brand:wikidata":"Q11319830","brand:wikipedia":"jp:テンコーポレーション",cuisine:"fries",name:"てんや","name:en":"Tenya","name:ja":"てんや",takeaway:"yes"}},"amenity/fast_food|なか卯":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"なか卯","brand:en":"Nakau","brand:ja":"なか卯","brand:wikidata":"Q11274132","brand:wikipedia":"ja:なか卯",cuisine:"udon",name:"なか卯","name:en":"Nakau","name:ja":"なか卯",takeaway:"yes"}},"amenity/fast_food|はま寿司":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"はま寿司","brand:en":"Hamazushi","brand:ja":"はま寿司","brand:wikidata":"Q17220385","brand:wikipedia":"ja:はま寿司",cuisine:"sushi",name:"はま寿司","name:en":"Hamazushi","name:ja":"はま寿司",takeaway:"yes"}},"amenity/fast_food|ほっかほっか亭":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"ほっかほっか亭","brand:en":"Hokka Hokka Tei","brand:ja":"ほっかほっか亭","brand:wikidata":"Q5878035","brand:wikipedia":"ja:ほっかほっか亭",cuisine:"japanese",name:"ほっかほっか亭","name:en":"Hokka Hokka Tei","name:ja":"ほっかほっか亭",takeaway:"yes"}},"amenity/fast_food|ほっともっと":{countryCodes:["jp"],nomatch:["shop/deli|ほっともっと"],tags:{amenity:"fast_food",brand:"ほっともっと","brand:en":"Hotto Motto","brand:ja":"ほっともっと","brand:wikidata":"Q10850949","brand:wikipedia":"ja:ほっともっと",cuisine:"japanese",name:"ほっともっと","name:en":"Hotto Motto","name:ja":"ほっともっと",takeaway:"yes"}},"amenity/fast_food|ゆで太郎":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"ゆで太郎","brand:en":"Yudetaro","brand:ja":"ゆで太郎","brand:wikidata":"Q11280824","brand:wikipedia":"ja:ゆで太郎",cuisine:"noodle",name:"ゆで太郎","name:en":"Yudetaro","name:ja":"ゆで太郎",takeaway:"yes"}},"amenity/fast_food|ウェンディーズ":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"ウェンディーズ","brand:en":"Wendy's","brand:ja":"ウェンディーズ","brand:wikidata":"Q550258","brand:wikipedia":"en:Wendy's",cuisine:"burger",name:"ウェンディーズ","name:en":"Wendy's","name:ja":"ウェンディーズ",takeaway:"yes"}},"amenity/fast_food|オリジン弁当":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"オリジン弁当","brand:en":"Origin Bentō","brand:ja":"オリジン弁当","brand:wikidata":"Q11292632","brand:wikipedia":"ja:オリジン東秀",cuisine:"japanese",name:"オリジン弁当","name:en":"Origin Bentō","name:ja":"オリジン弁当",takeaway:"yes"}},"amenity/fast_food|ケンタッキーフライドチキン":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"ケンタッキーフライドチキン","brand:en":"KFC","brand:ja":"ケンタッキーフライドチキン","brand:wikidata":"Q524757","brand:wikipedia":"ja:KFCコーポレーション",cuisine:"chicken",name:"ケンタッキーフライドチキン","name:en":"KFC","name:ja":"ケンタッキーフライドチキン",takeaway:"yes"}},"amenity/fast_food|サブウェイ":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"サブウェイ","brand:en":"Subway","brand:ja":"サブウェイ","brand:wikidata":"Q244457","brand:wikipedia":"ja:サブウェイ",cuisine:"sandwich",name:"サブウェイ","name:en":"Subway","name:ja":"サブウェイ",takeaway:"yes"}},"amenity/fast_food|スシロー":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"スシロー","brand:en":"Sushiro","brand:ja":"スシロー","brand:wikidata":"Q11257037","brand:wikipedia":"ja:あきんどスシロー",cuisine:"sushi",name:"スシロー","name:en":"Sushiro","name:ja":"スシロー","name:zh":"壽司郎",takeaway:"yes"}},"amenity/fast_food|ドミノ・ピザ":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"ドミノ・ピザ","brand:en":"Domino's Pizza","brand:ja":"ドミノ・ピザ","brand:wikidata":"Q839466","brand:wikipedia":"ja:ドミノ・ピザ",cuisine:"pizza",name:"ドミノ・ピザ","name:en":"Domino's Pizza","name:ja":"ドミノ・ピザ",short_name:"ドミノ","short_name:en":"Domino's","short_name:ja":"ドミノ",takeaway:"yes"}},"amenity/fast_food|バーガーキング":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"バーガーキング","brand:en":"Burger King","brand:ja":"バーガーキング","brand:wikidata":"Q177054","brand:wikipedia":"en:Burger King",cuisine:"burger",name:"バーガーキング","name:en":"Burger King","name:ja":"バーガーキング",takeaway:"yes"}},"amenity/fast_food|ピザハット":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"ピザハット","brand:en":"Pizza Hut","brand:ja":"ピザハット","brand:wikidata":"Q191615","brand:wikipedia":"ja:ピザハット",cuisine:"pizza",name:"ピザハット","name:en":"Pizza Hut","name:ja":"ピザハット",takeaway:"yes"}},"amenity/fast_food|ピザ・カリフォルニア":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"ピザ・カリフォルニア","brand:en":"Pizza California","brand:ja":"ピザ・カリフォルニア","brand:wikidata":"Q75324","brand:wikipedia":"ja:ピザ・カリフォルニア",cuisine:"pizza",name:"ピザ・カリフォルニア","name:en":"Pizza California","name:ja":"ピザ・カリフォルニア",takeaway:"yes"}},"amenity/fast_food|ピザーラ":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"ピザーラ","brand:en":"Pizza-La","brand:ja":"ピザーラ","brand:wikidata":"Q7199948","brand:wikipedia":"ja:ピザーラ",cuisine:"pizza",name:"ピザーラ","name:en":"Pizza-La","name:ja":"ピザーラ",takeaway:"yes"}},"amenity/fast_food|ファーストキッチン":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"ファーストキッチン","brand:en":"First Kitchen","brand:ja":"ファーストキッチン","brand:wikidata":"Q5453133","brand:wikipedia":"ja:ファーストキッチン",cuisine:"pizza",name:"ファーストキッチン","name:en":"First Kitchen","name:ja":"ファーストキッチン",takeaway:"yes"}},"amenity/fast_food|フレッシュネスバーガー":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"フレッシュネスバーガー","brand:en":"Freshness Burger","brand:ja":"フレッシュネスバーガー","brand:wikidata":"Q5503087","brand:wikipedia":"ja:フレッシュネスバーガー",cuisine:"burger",name:"フレッシュネスバーガー","name:en":"Freshness Burger","name:ja":"フレッシュネスバーガー",takeaway:"yes"}},"amenity/fast_food|マクドナルド":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"マクドナルド","brand:en":"McDonald's","brand:ja":"マクドナルド","brand:wikidata":"Q38076","brand:wikipedia":"ja:マクドナルド",cuisine:"burger",name:"マクドナルド","name:en":"McDonald's","name:ja":"マクドナルド",takeaway:"yes"}},"amenity/fast_food|ミスタードーナツ":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"ミスタードーナツ","brand:en":"Mister Donut","brand:ja":"ミスタードーナツ","brand:wikidata":"Q1065819","brand:wikipedia":"en:Mister Donut",cuisine:"donut",name:"ミスタードーナツ","name:en":"Mister Donut","name:ja":"ミスタードーナツ",takeaway:"yes"}},"amenity/fast_food|モスバーガー":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"モスバーガー","brand:en":"MOS Burger","brand:ja":"モスバーガー","brand:wikidata":"Q1204169","brand:wikipedia":"ja:モスバーガー",cuisine:"burger",name:"モスバーガー","name:en":"MOS Burger","name:ja":"モスバーガー",takeaway:"yes"}},"amenity/fast_food|ラーメン二郎":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"ラーメン二郎","brand:en":"Ramen Jiro","brand:ja":"ラーメン二郎","brand:wikidata":"Q11347765","brand:wikipedia":"ja:ラーメン二郎",cuisine:"ramen",name:"ラーメン二郎","name:en":"Ramen Jiro","name:ja":"ラーメン二郎",takeaway:"yes"}},"amenity/fast_food|ロッテリア":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"ロッテリア","brand:en":"Lotteria","brand:ja":"ロッテリア","brand:wikidata":"Q249525","brand:wikipedia":"ja:ロッテリア",cuisine:"burger",name:"ロッテリア","name:en":"Lotteria","name:ja":"ロッテリア",takeaway:"yes"}},"amenity/fast_food|吉野家":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"吉野家","brand:en":"Yoshinoya","brand:ja":"吉野家","brand:wikidata":"Q776272","brand:wikipedia":"ja:吉野家",cuisine:"beef_bowl",name:"吉野家","name:en":"Yoshinoya","name:ja":"吉野家",takeaway:"yes"}},"amenity/fast_food|富士そば":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"富士そば","brand:en":"Fuji Soba","brand:ja":"富士そば","brand:wikidata":"Q11414722","brand:wikipedia":"ja:名代富士そば",cuisine:"soba",name:"富士そば","name:en":"Fuji Soba","name:ja":"富士そば",takeaway:"yes"}},"amenity/fast_food|幸楽苑":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"幸楽苑","brand:en":"Kourakuen","brand:ja":"幸楽苑","brand:wikidata":"Q11484003","brand:wikipedia":"ja:幸楽苑",cuisine:"ramen",name:"幸楽苑","name:en":"Kourakuen","name:ja":"幸楽苑",takeaway:"yes"}},"amenity/fast_food|摩斯漢堡":{countryCodes:["cn","hk","mo","sg","tw"],tags:{amenity:"fast_food",brand:"摩斯漢堡","brand:en":"MOS Burger","brand:wikidata":"Q1204169","brand:wikipedia":"zh:摩斯漢堡","brand:zh":"摩斯漢堡",cuisine:"burger",name:"摩斯漢堡","name:en":"MOS Burger","name:zh":"摩斯漢堡",takeaway:"yes"}},"amenity/fast_food|日高屋":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"日高屋","brand:en":"Hidakaya","brand:wikidata":"Q11326050","brand:wikipedia":"ja:ハイデイ日高",cuisine:"noodle",name:"日高屋","name:en":"Hidakaya",takeaway:"yes"}},"amenity/fast_food|松屋":{countryCodes:["cn","hk","jp","mo","sg","tw"],tags:{amenity:"fast_food",brand:"松屋","brand:en":"Matsuya","brand:ja":"松屋","brand:wikidata":"Q848773","brand:wikipedia":"ja:松屋フーズ",cuisine:"japanese",name:"松屋","name:en":"Matsuya","name:ja":"松屋",official_name:"松屋フーズ","official_name:en":"Matsuya Foods","official_name:ja":"松屋フーズ",takeaway:"yes"}},"amenity/fast_food|箱根そば":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"箱根そば","brand:en":"Hakone Soba","brand:ja":"箱根そば","brand:wikidata":"Q11603345","brand:wikipedia":"ja:箱根そば",cuisine:"soba",name:"箱根そば","name:en":"Hakone Soba","name:ja":"箱根そば",takeaway:"yes"}},"amenity/fast_food|築地銀だこ":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"築地銀だこ","brand:en":"HotLand","brand:ja":"築地銀だこ","brand:wikidata":"Q11603490","brand:wikipedia":"ja:築地銀だこ",cuisine:"japanese",name:"築地銀だこ","name:en":"HotLand","name:ja":"築地銀だこ",takeaway:"yes"}},"amenity/fast_food|肯德基":{countryCodes:["cn","hk","mo","sg","tw"],tags:{amenity:"fast_food",brand:"肯德基","brand:en":"KFC","brand:wikidata":"Q524757","brand:wikipedia":"zh:肯德基",cuisine:"chicken",name:"肯德基","name:en":"KFC",takeaway:"yes"}},"amenity/fast_food|麥當勞":{countryCodes:["hk","mo","tw"],tags:{amenity:"fast_food",brand:"麥當勞","brand:en":"McDonald's","brand:lzh":"麥當勞","brand:wikidata":"Q38076","brand:wikipedia":"zh_classical:麥當勞",cuisine:"burger",name:"麥當勞","name:en":"McDonald's","name:lzh":"麥當勞",takeaway:"yes"}},"amenity/fast_food|麦当劳":{countryCodes:["cn","sg"],tags:{amenity:"fast_food",brand:"麦当劳","brand:en":"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"zh:麦当劳","brand:zh":"麦当劳",cuisine:"burger",name:"麦当劳","name:en":"McDonald's","name:zh":"麦当劳",takeaway:"yes"}},"amenity/fast_food|롯데리아":{countryCodes:["kr"],tags:{amenity:"fast_food",brand:"롯데리아","brand:en":"Lotteria","brand:ko":"롯데리아","brand:wikidata":"Q249525","brand:wikipedia":"ko:롯데리아",cuisine:"burger",name:"롯데리아","name:en":"Lotteria","name:ko":"롯데리아",takeaway:"yes"}},"amenity/fast_food|맘스터치":{countryCodes:["kr"],tags:{amenity:"fast_food",brand:"맘스터치","brand:ko":"맘스터치","brand:wikidata":"Q23044856","brand:wikipedia":"en:Mom's Touch",cuisine:"burger",name:"맘스터치","name:ko":"맘스터치",takeaway:"yes"}},"amenity/fast_food|맥도날드":{countryCodes:["kr"],tags:{amenity:"fast_food",brand:"맥도날드","brand:en":"McDonald's","brand:ko":"맥도날드","brand:wikidata":"Q38076","brand:wikipedia":"ko:맥도날드",cuisine:"burger",name:"맥도날드","name:en":"McDonald's","name:ko":"맥도날드",takeaway:"yes"}},"amenity/fuel|1-2-3":{countryCodes:["dk","pl"],tags:{amenity:"fuel",brand:"1-2-3","brand:wikidata":"Q4545742","brand:wikipedia":"en:1-2-3 (fuel station)",name:"1-2-3"}},"amenity/fuel|7-Eleven":{matchNames:["7-11","seven eleven"],nomatch:["shop/convenience|7-Eleven"],tags:{amenity:"fuel",brand:"7-Eleven","brand:wikidata":"Q259340","brand:wikipedia":"en:7-Eleven",name:"7-Eleven"}},"amenity/fuel|76":{nomatch:["shop/convenience|76"],tags:{amenity:"fuel",brand:"76","brand:wikidata":"Q1658320","brand:wikipedia":"en:76 (gas station)",name:"76"}},"amenity/fuel|ABC":{countryCodes:["fi"],nomatch:["shop/convenience|ABC"],tags:{amenity:"fuel",brand:"ABC","brand:wikidata":"Q10397504","brand:wikipedia":"fi:ABC-ketju",name:"ABC"}},"amenity/fuel|ADNOC":{countryCodes:["ae"],tags:{amenity:"fuel",brand:"ADNOC","brand:wikidata":"Q166729","brand:wikipedia":"en:Abu Dhabi National Oil Company",name:"ADNOC"}},"amenity/fuel|ANP":{countryCodes:["ru","ua"],tags:{amenity:"fuel",brand:"ANP",name:"ANP"}},"amenity/fuel|Aegean":{countryCodes:["gr"],tags:{amenity:"fuel",brand:"Aegean","brand:wikidata":"Q28146598","brand:wikipedia":"el:Aegean Oil",name:"Aegean"}},"amenity/fuel|Afriquia":{tags:{amenity:"fuel",brand:"Afriquia","brand:wikidata":"Q2829178","brand:wikipedia":"en:Akwa Group",name:"Afriquia"}},"amenity/fuel|Agil":{countryCodes:["tn"],tags:{amenity:"fuel",brand:"Agil",name:"Agil"}},"amenity/fuel|Agip":{tags:{amenity:"fuel",brand:"Agip","brand:wikidata":"Q377915","brand:wikipedia":"en:Agip",name:"Agip"}},"amenity/fuel|Agrola":{countryCodes:["ch"],tags:{amenity:"fuel",brand:"Agrola","brand:wikidata":"Q397351","brand:wikipedia":"de:Agrola",name:"Agrola"}},"amenity/fuel|Alon":{countryCodes:["us"],tags:{amenity:"fuel",brand:"Alon","brand:wikidata":"Q62274304",name:"Alon"}},"amenity/fuel|Alpet":{countryCodes:["al","tr"],tags:{amenity:"fuel",brand:"Alpet","brand:wikidata":"Q62131561",name:"Alpet"}},"amenity/fuel|Api":{countryCodes:["it"],tags:{amenity:"fuel",brand:"Api","brand:wikidata":"Q466043","brand:wikipedia":"en:American Petroleum Institute",name:"Api"}},"amenity/fuel|Aral":{countryCodes:["de"],matchNames:["aral tankstelle"],nomatch:["shop/convenience|Aral"],tags:{amenity:"fuel",brand:"Aral","brand:wikidata":"Q565734","brand:wikipedia":"en:Aral AG",name:"Aral"}},"amenity/fuel|Arco":{countryCodes:["mx","us"],tags:{amenity:"fuel",brand:"Arco","brand:wikidata":"Q304769","brand:wikipedia":"en:ARCO",name:"Arco"}},"amenity/fuel|Asda":{countryCodes:["gb"],nomatch:["shop/supermarket|ASDA","shop/supermarket|Asda"],tags:{amenity:"fuel",brand:"Asda","brand:wikidata":"Q297410","brand:wikipedia":"en:Asda",name:"Asda"}},"amenity/fuel|Atem":{countryCodes:["br"],matchNames:["posto atem"],tags:{amenity:"fuel",brand:"Atem","brand:wikidata":"Q62332255",name:"Atem"}},"amenity/fuel|Auchan":{nomatch:["shop/supermarket|Auchan"],tags:{amenity:"fuel",brand:"Auchan","brand:wikidata":"Q758603","brand:wikipedia":"en:Auchan",name:"Auchan"}},"amenity/fuel|Avanti":{countryCodes:["at"],tags:{amenity:"fuel",brand:"Avanti","brand:wikidata":"Q168238","brand:wikipedia":"en:OMV",name:"Avanti"}},"amenity/fuel|Avia":{matchNames:["station avia"],tags:{amenity:"fuel",brand:"Avia","brand:wikidata":"Q300147","brand:wikipedia":"de:Avia International",name:"Avia"}},"amenity/fuel|Avin":{countryCodes:["gr"],tags:{amenity:"fuel",brand:"Avin","brand:wikidata":"Q19903165","brand:wikipedia":"en:Avin International",name:"Avin"}},"amenity/fuel|Axion":{countryCodes:["ar","py","uy"],tags:{amenity:"fuel",brand:"Axion","brand:wikidata":"Q62131749",name:"Axion"}},"amenity/fuel|Aytemiz":{countryCodes:["tr"],tags:{amenity:"fuel",brand:"Aytemiz","brand:wikidata":"Q62274352",name:"Aytemiz"}},"amenity/fuel|BEBECO":{countryCodes:["ch"],tags:{amenity:"fuel",brand:"BEBECO","brand:wikidata":"Q62274373",name:"BEBECO"}},"amenity/fuel|BHPetrol":{countryCodes:["my"],tags:{amenity:"fuel",brand:"BHPetrol","brand:wikidata":"Q62274381",name:"BHPetrol"}},"amenity/fuel|BP":{matchNames:["BP Gas Station"],nomatch:["shop/convenience|BP Shop"],tags:{amenity:"fuel",brand:"BP","brand:wikidata":"Q152057","brand:wikipedia":"en:BP",name:"BP"}},"amenity/fuel|BR":{countryCodes:["br"],matchNames:["br petrobras","petrobras","posto br"],tags:{amenity:"fuel",brand:"BR","brand:wikidata":"Q4836468","brand:wikipedia":"pt:Petrobras Distribuidora",name:"BR"}},"amenity/fuel|Bangchak":{countryCodes:["th"],tags:{amenity:"fuel",brand:"Bangchak","brand:wikidata":"Q6579719","brand:wikipedia":"zh:曼差石油股份",name:"Bangchak"}},"amenity/fuel|Bharat Petroleum":{countryCodes:["in"],tags:{amenity:"fuel",brand:"Bharat Petroleum","brand:wikidata":"Q854826","brand:wikipedia":"en:Bharat Petroleum",name:"Bharat Petroleum"}},"amenity/fuel|Biomax":{countryCodes:["co"],tags:{amenity:"fuel",brand:"Biomax","brand:wikidata":"Q62274413",name:"Biomax"}},"amenity/fuel|Bliska":{countryCodes:["pl"],tags:{amenity:"fuel",brand:"Bliska","brand:wikidata":"Q4016378","brand:wikipedia":"pl:Bliska",name:"Bliska"}},"amenity/fuel|CAMPSA":{countryCodes:["es"],tags:{amenity:"fuel",brand:"CAMPSA","brand:wikidata":"Q1031623","brand:wikipedia":"en:Campsa",name:"CAMPSA"}},"amenity/fuel|CEPSA":{countryCodes:["es","pt"],tags:{amenity:"fuel",brand:"CEPSA","brand:wikidata":"Q608819","brand:wikipedia":"en:Cepsa",name:"CEPSA"}},"amenity/fuel|Caltex":{tags:{amenity:"fuel",brand:"Caltex","brand:wikidata":"Q277470","brand:wikipedia":"en:Caltex",name:"Caltex"}},"amenity/fuel|Canadian Tire Gas+":{matchNames:["canadian tire","canadian tire gas bar"],nomatch:["shop/department_store|Canadian Tire"],tags:{amenity:"fuel",brand:"Canadian Tire","brand:wikidata":"Q1032400","brand:wikipedia":"en:Canadian Tire",name:"Canadian Tire"}},"amenity/fuel|Carrefour":{nomatch:["shop/convenience|Carrefour Express","shop/supermarket|Carrefour"],tags:{brand:"Carrefour","brand:wikidata":"Q217599","brand:wikipedia":"fr:Carrefour (enseigne)",name:"Carrefour"}},"amenity/fuel|Carrefour Market":{nomatch:["shop/supermarket|Carrefour Market"],tags:{amenity:"fuel",brand:"Carrefour Market","brand:wikidata":"Q217599","brand:wikipedia":"en:Carrefour",name:"Carrefour Market"}},"amenity/fuel|Casey's General Store":{matchNames:["caseys"],nomatch:["shop/convenience|Casey's General Store"],tags:{amenity:"fuel",brand:"Casey's General Store","brand:wikidata":"Q2940968","brand:wikipedia":"en:Casey's General Stores",name:"Casey's General Store"}},"amenity/fuel|Casino":{tags:{amenity:"fuel",brand:"Casino",name:"Casino"}},"amenity/fuel|Cenex":{countryCodes:["us"],tags:{amenity:"fuel",brand:"Cenex","brand:wikidata":"Q5011381","brand:wikipedia":"en:CHS Inc.",name:"Cenex"}},"amenity/fuel|Ceypetco":{countryCodes:["lk"],matchNames:["lanka filling station"],tags:{amenity:"fuel",brand:"Ceypetco","brand:wikidata":"Q5065795","brand:wikipedia":"en:Ceylon Petroleum Corporation",name:"Ceypetco"}},"amenity/fuel|Chevron":{nomatch:["shop/convenience|Chevron"],tags:{amenity:"fuel",brand:"Chevron","brand:wikidata":"Q319642","brand:wikipedia":"en:Chevron Corporation",name:"Chevron"}},"amenity/fuel|Circle K":{nomatch:["shop/convenience|Circle K"],tags:{amenity:"fuel",brand:"Circle K","brand:wikidata":"Q3268010","brand:wikipedia":"en:Circle K",name:"Circle K"}},"amenity/fuel|Citgo":{nomatch:["shop/convenience|Citgo"],tags:{amenity:"fuel",brand:"Citgo","brand:wikidata":"Q2974437","brand:wikipedia":"en:Citgo",name:"Citgo"}},"amenity/fuel|Clark":{countryCodes:["us"],tags:{amenity:"fuel",brand:"Clark","brand:wikidata":"Q5127157","brand:wikipedia":"en:Clark Brands",name:"Clark"}},"amenity/fuel|Classic":{countryCodes:["de"],tags:{amenity:"fuel",brand:"Classic",name:"Classic"}},"amenity/fuel|Co-op~(Canada)":{countryCodes:["ca"],matchNames:["coop"],nomatch:["shop/convenience|Co-op~(Canada)","shop/convenience|Coop~(Schweiz)","shop/convenience|The Co-operative Food~(UK)","shop/supermarket|Co-op~(Canada)","shop/supermarket|Coop~(Schweiz)","shop/supermarket|The Co-operative Food~(UK)"],tags:{amenity:"fuel",brand:"Federated Co-operatives","brand:wikidata":"Q5440676","brand:wikipedia":"en:Federated Co-operatives",name:"Co-op"}},"amenity/fuel|Coles Express":{countryCodes:["au"],nomatch:["shop/convenience|Coles Express"],tags:{amenity:"fuel",brand:"Coles Express","brand:wikidata":"Q5144653","brand:wikipedia":"en:Coles Express",name:"Coles Express"}},"amenity/fuel|Conoco":{countryCodes:["us"],tags:{amenity:"fuel",brand:"Conoco","brand:wikidata":"Q1126518","brand:wikipedia":"en:Conoco",name:"Conoco"}},"amenity/fuel|Copec":{countryCodes:["cl"],tags:{amenity:"fuel",brand:"Copec","brand:wikidata":"Q11681461","brand:wikipedia":"en:Empresas Copec",name:"Copec"}},"amenity/fuel|Copetrol":{countryCodes:["py"],tags:{amenity:"fuel",brand:"Copetrol","brand:wikidata":"Q62274431",name:"Copetrol"}},"amenity/fuel|Cosmo":{countryCodes:["jp"],tags:{amenity:"fuel",brand:"Cosmo","brand:wikidata":"Q2498318","brand:wikipedia":"en:Cosmo Oil Company",name:"Cosmo"}},"amenity/fuel|Costco Gasoline":{countryCodes:["au","ca","mx","us"],matchNames:["costco","costco gas","costco wholesale"],nomatch:["amenity/pharmacy|Costco Pharmacy","shop/wholesale|Costco"],tags:{amenity:"fuel",brand:"Costco Gasoline","brand:wikidata":"Q715583","brand:wikipedia":"en:Costco",name:"Costco Gasoline"}},"amenity/fuel|Couche-Tard":{countryCodes:["ca"],nomatch:["shop/convenience|Couche-Tard"],tags:{amenity:"fuel",brand:"Couche-Tard","brand:wikidata":"Q2836957","brand:wikipedia":"en:Alimentation Couche-Tard",name:"Couche-Tard"}},"amenity/fuel|Crevier":{countryCodes:["ca"],tags:{amenity:"fuel",brand:"Crevier","brand:wikidata":"Q61743451",name:"Crevier"}},"amenity/fuel|Crodux":{countryCodes:["hr"],tags:{amenity:"fuel",brand:"Crodux","brand:wikidata":"Q62274622",name:"Crodux"}},"amenity/fuel|Cumberland Farms":{countryCodes:["us"],nomatch:["shop/convenience|Cumberland Farms"],tags:{amenity:"fuel",brand:"Cumberland Farms","brand:wikidata":"Q1143685","brand:wikipedia":"en:Cumberland Farms",name:"Cumberland Farms"}},"amenity/fuel|Delta~(Panama & Costa Rica)":{countryCodes:["cr","us"],tags:{amenity:"fuel",brand:"Delta","brand:wikidata":"Q62274638",name:"Delta"}},"amenity/fuel|Delta~(USA)":{countryCodes:["us"],tags:{amenity:"fuel",brand:"Delta","brand:wikidata":"Q62274661",name:"Delta"}},"amenity/fuel|Depot Tela":{countryCodes:["kh"],tags:{amenity:"fuel",brand:"Depot Tela",name:"Depot Tela"}},"amenity/fuel|Diamond Shamrock":{countryCodes:["us"],tags:{amenity:"fuel",brand:"Diamond Shamrock","brand:wikidata":"Q16973722","brand:wikipedia":"en:Diamond Shamrock",name:"Diamond Shamrock"}},"amenity/fuel|Domo":{countryCodes:["ca"],tags:{amenity:"fuel",brand:"Domo","brand:wikidata":"Q5291326","brand:wikipedia":"en:Domo Gasoline",name:"Domo"}},"amenity/fuel|EKO~(Canada)":{countryCodes:["ca"],nomatch:["amenity/fuel|EKO~(Greece)","shop/supermarket|Eko"],tags:{amenity:"fuel",brand:"EKO","brand:wikidata":"Q3045934","brand:wikipedia":"fr:EKO",name:"EKO"}},"amenity/fuel|EKO~(Greece)":{countryCodes:["bg","cy","gr","me","mk","rs"],matchNames:["εκο"],nomatch:["amenity/fuel|EKO~(Canada)","shop/supermarket|Eko"],tags:{amenity:"fuel",brand:"EKO","brand:wikidata":"Q903198","brand:wikipedia":"el:Ελληνικά Πετρέλαια",name:"EKO"}},"amenity/fuel|ENEOS":{countryCodes:["jp"],tags:{amenity:"fuel",brand:"ENEOS","brand:wikidata":"Q1640290","brand:wikipedia":"en:JXTG Nippon Oil & Energy",name:"ENEOS"}},"amenity/fuel|Elan":{countryCodes:["de","fr","nl"],tags:{amenity:"fuel",brand:"Elan","brand:wikidata":"Q57980752",name:"Elan"}},"amenity/fuel|Engen":{tags:{amenity:"fuel",brand:"Engen","brand:wikidata":"Q3054251","brand:wikipedia":"en:Engen Petroleum",name:"Engen"}},"amenity/fuel|Eni":{countryCodes:["at","ch","fr","it"],tags:{amenity:"fuel",brand:"Eni","brand:wikidata":"Q565594","brand:wikipedia":"en:Eni",name:"Eni"}},"amenity/fuel|Erg":{countryCodes:["it"],tags:{amenity:"fuel",brand:"Erg","brand:wikidata":"Q739503","brand:wikipedia":"it:ERG (azienda)",name:"Erg"}},"amenity/fuel|Esso":{matchNames:["station esso"],nomatch:["amenity/fuel|Esso Express","shop/convenience|Esso"],tags:{amenity:"fuel",brand:"Esso","brand:wikidata":"Q867662","brand:wikipedia":"en:Esso",name:"Esso"}},"amenity/fuel|Esso Express":{nomatch:["amenity/fuel|Esso"],tags:{amenity:"fuel",brand:"Esso Express","brand:wikidata":"Q2350336","brand:wikipedia":"nl:Esso Express",name:"Esso Express"}},"amenity/fuel|Exxon":{countryCodes:["us"],tags:{amenity:"fuel",brand:"Exxon","brand:wikidata":"Q4781944","brand:wikipedia":"en:Exxon",name:"Exxon"}},"amenity/fuel|F24":{countryCodes:["dk"],tags:{amenity:"fuel",brand:"F24","brand:wikidata":"Q12310853","brand:wikipedia":"da:F24",name:"F24"}},"amenity/fuel|Fas Gas":{countryCodes:["ca"],matchNames:["fas gas plus"],tags:{amenity:"fuel",brand:"Fas Gas","brand:wikidata":"Q61743505","brand:wikipedia":"en:Parkland Fuel",name:"Fas Gas"}},"amenity/fuel|Firezone":{countryCodes:["nl"],tags:{amenity:"fuel",brand:"Firezone","brand:wikidata":"Q14628080","brand:wikipedia":"nl:Firezone",name:"Firezone"}},"amenity/fuel|Flying J":{countryCodes:["ca","us"],matchNames:["flying j travel plaza"],tags:{amenity:"fuel",brand:"Flying J","brand:wikidata":"Q64130592",name:"Flying J"}},"amenity/fuel|Flying V":{countryCodes:["ph"],tags:{amenity:"fuel",brand:"Flying V","brand:wikidata":"Q62275048",name:"Flying V"}},"amenity/fuel|Freie Tankstelle":{countryCodes:["de"],tags:{amenity:"fuel",brand:"Freie Tankstelle","brand:wikidata":"Q1009104","brand:wikipedia":"de:Bundesverband freier Tankstellen",name:"Freie Tankstelle"}},"amenity/fuel|GALP":{tags:{amenity:"fuel",brand:"GALP","brand:wikidata":"Q1492739","brand:wikipedia":"en:Galp Energia",name:"GALP"}},"amenity/fuel|Gazel":{countryCodes:["co","mx","pe"],tags:{amenity:"fuel",brand:"Gazel","brand:wikidata":"Q62529885",name:"Gazel"}},"amenity/fuel|Gazprom":{tags:{amenity:"fuel",brand:"Gazprom","brand:wikidata":"Q102673","brand:wikipedia":"en:Gazprom",name:"Gazprom"}},"amenity/fuel|GetGo":{countryCodes:["us"],tags:{amenity:"fuel",brand:"GetGo","brand:wikidata":"Q5553766","brand:wikipedia":"en:GetGo",name:"GetGo"}},"amenity/fuel|Giant":{nomatch:["shop/bicycle|Giant"],tags:{amenity:"fuel",brand:"Giant",name:"Giant"}},"amenity/fuel|Glusco":{countryCodes:["ua"],tags:{amenity:"fuel",brand:"Glusco","brand:wikidata":"Q62284719",name:"Glusco"}},"amenity/fuel|Goil":{countryCodes:["gh"],tags:{amenity:"fuel",brand:"Goil","brand:wikidata":"Q5555383","brand:wikipedia":"en:Ghana Oil Company",name:"Goil"}},"amenity/fuel|Gulf":{tags:{amenity:"fuel",brand:"Gulf","brand:wikidata":"Q1296860","brand:wikipedia":"en:Gulf Oil",name:"Gulf"}},"amenity/fuel|Gull":{countryCodes:["au","nz"],tags:{amenity:"fuel",brand:"Gull","brand:wikidata":"Q5617739","brand:wikipedia":"en:Gull Petroleum",name:"Gull"}},"amenity/fuel|H-E-B Fuel":{countryCodes:["us"],matchNames:["h-e-b gas"],nomatch:["shop/supermarket|H-E-B"],tags:{amenity:"fuel",brand:"H-E-B Fuel","brand:wikidata":"Q830621","brand:wikipedia":"en:H-E-B",name:"H-E-B Fuel"}},"amenity/fuel|HEM":{countryCodes:["de"],tags:{amenity:"fuel",brand:"HEM","brand:wikidata":"Q1563517","brand:wikipedia":"de:Deutsche Tamoil",name:"HEM"}},"amenity/fuel|HP":{countryCodes:["in"],matchNames:["hp petrol pump"],tags:{amenity:"fuel",brand:"Hindustan Petroleum","brand:wikidata":"Q1619375","brand:wikipedia":"en:Hindustan Petroleum",name:"HP",official_name:"Hindustan Petroleum"}},"amenity/fuel|Harnois":{countryCodes:["ca"],tags:{amenity:"fuel",brand:"Harnois","brand:wikidata":"Q61743558",name:"Harnois"}},"amenity/fuel|Hess":{countryCodes:["us"],tags:{amenity:"fuel",brand:"Hess","brand:wikidata":"Q1615684","brand:wikipedia":"en:Hess Corporation",name:"Hess"}},"amenity/fuel|Hofer":{countryCodes:["at","si"],nomatch:["shop/supermarket|Hofer"],tags:{amenity:"fuel",brand:"Hofer","brand:wikidata":"Q15815751","brand:wikipedia":"de:Hofer KG",name:"Hofer"}},"amenity/fuel|Holiday":{countryCodes:["us"],nomatch:["shop/convenience|Holiday"],tags:{amenity:"fuel",brand:"Holiday","brand:wikidata":"Q5880490","brand:wikipedia":"en:Holiday Stationstores",name:"Holiday"}},"amenity/fuel|Husky":{countryCodes:["ca"],nomatch:["amenity/restaurant|Husky House","shop/convenience|Husky"],tags:{amenity:"fuel",brand:"Husky","brand:wikidata":"Q702049","brand:wikipedia":"en:Husky Energy",name:"Husky"}},"amenity/fuel|IES":{countryCodes:["it"],tags:{amenity:"fuel",brand:"IES","brand:wikidata":"Q62287387",name:"IES"}},"amenity/fuel|IP":{tags:{amenity:"fuel",brand:"IP","brand:wikidata":"Q646807","brand:wikipedia":"en:Anonima Petroli Italiana",name:"IP"}},"amenity/fuel|Indian Oil":{tags:{amenity:"fuel",brand:"Indian Oil","brand:wikidata":"Q1289348","brand:wikipedia":"en:Indian Oil Corporation",name:"Indian Oil"}},"amenity/fuel|Indian Oil Petrol Pump":{countryCodes:["in"],tags:{amenity:"fuel",brand:"Indian Oil Petrol Pump",name:"Indian Oil Petrol Pump"}},"amenity/fuel|Ingo":{countryCodes:["dk","se"],tags:{amenity:"fuel",brand:"Ingo","brand:wikidata":"Q17048617","brand:wikipedia":"en:Ingo (brand)",name:"Ingo"}},"amenity/fuel|Intermarché":{matchNames:["intermarché super"],nomatch:["shop/supermarket|Intermarché"],tags:{amenity:"fuel",brand:"Intermarché","brand:wikidata":"Q3153200","brand:wikipedia":"fr:Intermarché",name:"Intermarché"}},"amenity/fuel|Ipiranga":{countryCodes:["br"],matchNames:["posto ipiranga"],tags:{amenity:"fuel",brand:"Ipiranga","brand:wikidata":"Q2081136","brand:wikipedia":"pt:Ipiranga (empresa)",name:"Ipiranga"}},"amenity/fuel|Irving":{nomatch:["shop/convenience|Irving"],tags:{amenity:"fuel",brand:"Irving","brand:wikidata":"Q1673286","brand:wikipedia":"en:Irving Oil",name:"Irving"}},"amenity/fuel|JA-SS":{countryCodes:["jp"],matchNames:["ja"],tags:{amenity:"fuel",brand:"JA-SS","brand:wikidata":"Q11225213","brand:wikipedia":"ja:JA-SS",name:"JA-SS"}},"amenity/fuel|Jet":{nomatch:["shop/clothes|Jet"],tags:{amenity:"fuel",brand:"Jet","brand:wikidata":"Q568940","brand:wikipedia":"en:Jet (brand)",name:"Jet"}},"amenity/fuel|Jetti":{countryCodes:["ph"],tags:{amenity:"fuel",brand:"Jetti","brand:wikidata":"Q62288720",name:"Jetti"}},"amenity/fuel|Kangaroo Express":{countryCodes:["us"],nomatch:["shop/convenience|Kangaroo Express"],tags:{amenity:"fuel",brand:"Kangaroo Express","brand:wikidata":"Q61747408",name:"Kangaroo Express",short_name:"Kangaroo"}},"amenity/fuel|Kobil":{countryCodes:["bi","et","ke","rw","tz","ug","zm"],tags:{amenity:"fuel",brand:"Kobil","brand:wikidata":"Q22906119","brand:wikipedia":"en:KenolKobil",name:"Kobil"}},"amenity/fuel|Kroger":{matchNames:["kroger fuel"],nomatch:["shop/supermarket|Kroger"],tags:{amenity:"fuel",brand:"Kroger","brand:wikidata":"Q153417","brand:wikipedia":"en:Kroger",name:"Kroger"}},"amenity/fuel|Kum & Go":{countryCodes:["us"],nomatch:["shop/convenience|Kum & Go"],tags:{amenity:"fuel",brand:"Kum & Go","brand:wikidata":"Q6443340","brand:wikipedia":"en:Kum & Go",name:"Kum & Go"}},"amenity/fuel|Kwik Fill":{countryCodes:["us"],tags:{amenity:"fuel",brand:"Kwik Fill",name:"Kwik Fill"}},"amenity/fuel|Kwik Trip":{countryCodes:["us"],nomatch:["shop/convenience|Kwik Trip"],tags:{amenity:"fuel",brand:"Kwik Trip","brand:wikidata":"Q6450420","brand:wikipedia":"en:Kwik Trip",name:"Kwik Trip"}},"amenity/fuel|Liberty":{countryCodes:["au","us"],nomatch:["amenity/bank|Liberty Bank"],tags:{amenity:"fuel",brand:"Liberty",name:"Liberty"}},"amenity/fuel|Lotos":{countryCodes:["pl"],nomatch:["amenity/fuel|Lotos Optima"],tags:{amenity:"fuel",brand:"Lotos","brand:wikidata":"Q1256909","brand:wikipedia":"pl:Grupa Lotos",name:"Lotos"}},"amenity/fuel|Lotos Optima":{countryCodes:["pl"],nomatch:["amenity/fuel|Lotos"],tags:{amenity:"fuel",brand:"Lotos Optima","brand:wikidata":"Q1256909","brand:wikipedia":"pl:Grupa Lotos",name:"Lotos Optima"}},"amenity/fuel|Love's":{countryCodes:["us"],tags:{amenity:"fuel",brand:"Love's","brand:wikidata":"Q1872496","brand:wikipedia":"en:Love's Travel Stops & Country Stores",name:"Love's"}},"amenity/fuel|Lukoil":{tags:{amenity:"fuel",brand:"Lukoil","brand:wikidata":"Q329347","brand:wikipedia":"en:Lukoil",name:"Lukoil"}},"amenity/fuel|MEROIL":{countryCodes:["es"],tags:{amenity:"fuel",brand:"MEROIL","brand:wikidata":"Q62292559",name:"MEROIL"}},"amenity/fuel|MOL":{tags:{amenity:"fuel",brand:"MOL","brand:wikidata":"Q549181","brand:wikipedia":"en:MOL (company)",name:"MOL"}},"amenity/fuel|MRS":{countryCodes:["ng"],tags:{amenity:"fuel",brand:"MRS","brand:wikidata":"Q56274919","brand:wikipedia":"en:MRS Oil Nigeria Plc",name:"MRS"}},"amenity/fuel|Mac's":{countryCodes:["ca"],nomatch:["shop/convenience|Mac's"],tags:{amenity:"fuel",brand:"Mac's","brand:wikidata":"Q4043527","brand:wikipedia":"en:Mac's Convenience Stores",name:"Mac's"}},"amenity/fuel|MacEwen":{countryCodes:["ca"],tags:{amenity:"fuel",brand:"MacEwen","brand:wikidata":"Q61740335",name:"MacEwen"}},"amenity/fuel|Marathon":{matchNames:["Marathon Gas"],nomatch:["shop/convenience|Marathon"],tags:{amenity:"fuel",brand:"Marathon","brand:wikidata":"Q458363","brand:wikipedia":"en:Marathon Petroleum",name:"Marathon"}},"amenity/fuel|Maverik":{countryCodes:["us"],nomatch:["shop/convenience|Maverik"],tags:{amenity:"fuel",brand:"Maverik","brand:wikidata":"Q64149010","brand:wikipedia":"en:Maverik, Inc.",name:"Maverik"}},"amenity/fuel|Maxol":{countryCodes:["gb","ie"],tags:{amenity:"fuel",brand:"Maxol","brand:wikidata":"Q3302837","brand:wikipedia":"en:Maxol",name:"Maxol"}},"amenity/fuel|Metano":{countryCodes:["it"],tags:{amenity:"fuel",brand:"Metano","brand:wikidata":"Q62294765",name:"Metano"}},"amenity/fuel|Migrol":{countryCodes:["ch"],tags:{amenity:"fuel",brand:"Migrol","brand:wikidata":"Q1747771","brand:wikipedia":"de:Migrol",name:"Migrol"}},"amenity/fuel|Mobil":{matchNames:["mobile"],nomatch:["shop/convenience|Mobil Mart"],tags:{amenity:"fuel",brand:"Mobil","brand:wikidata":"Q3088656","brand:wikipedia":"en:Mobil",name:"Mobil"}},"amenity/fuel|Moil":{countryCodes:["tr"],tags:{amenity:"fuel",brand:"Moil","brand:wikidata":"Q62296914",name:"Moil"}},"amenity/fuel|Morrisons":{countryCodes:["gb"],nomatch:["shop/supermarket|Morrisons"],tags:{amenity:"fuel",brand:"Morrisons","brand:wikidata":"Q922344","brand:wikipedia":"en:Morrisons",name:"Morrisons"}},"amenity/fuel|Moya":{countryCodes:["pl"],tags:{amenity:"fuel",brand:"Moya","brand:wikidata":"Q62297700",name:"Moya"}},"amenity/fuel|Murphy USA":{countryCodes:["us"],tags:{amenity:"fuel",brand:"Murphy USA","brand:wikidata":"Q19604459","brand:wikipedia":"en:Murphy USA",name:"Murphy USA"}},"amenity/fuel|N1":{countryCodes:["is"],tags:{amenity:"fuel",brand:"N1",name:"N1"}},"amenity/fuel|NP":{countryCodes:["tt"],tags:{amenity:"fuel",brand:"NP","brand:wikidata":"Q7842382","brand:wikipedia":"en:Trinidad & Tobago National Petroleum Marketing Company Limited",name:"NP"}},"amenity/fuel|Neste":{tags:{amenity:"fuel",brand:"Neste","brand:wikidata":"Q616376","brand:wikipedia":"en:Neste",name:"Neste"}},"amenity/fuel|OIL!":{tags:{amenity:"fuel",brand:"OIL!","brand:wikidata":"Q2007561","brand:wikipedia":"de:OIL! Tankstellen",name:"OIL!"}},"amenity/fuel|OK":{countryCodes:["dk"],tags:{amenity:"fuel",brand:"OK","brand:wikidata":"Q12329785","brand:wikipedia":"da:OK a.m.b.a.",name:"OK"}},"amenity/fuel|OKQ8":{countryCodes:["se"],tags:{amenity:"fuel",brand:"OKQ8","brand:wikidata":"Q1634762","brand:wikipedia":"en:Kuwait Petroleum Corporation",name:"OKQ8"}},"amenity/fuel|OMV":{tags:{amenity:"fuel",brand:"OMV","brand:wikidata":"Q168238","brand:wikipedia":"en:OMV",name:"OMV"}},"amenity/fuel|Oilibya":{matchNames:["oilibia","oilibiya","oillibia","oilliby","oillibya","oillybia","oilybia","olibya","olybia"],tags:{amenity:"fuel",brand:"Oilibya","brand:wikidata":"Q7081491","brand:wikipedia":"en:Oilibya",name:"Oilibya","name:ar":"أويليبيا"}},"amenity/fuel|Olerex":{countryCodes:["ee"],tags:{amenity:"fuel",brand:"Olerex",name:"Olerex"}},"amenity/fuel|Opet":{countryCodes:["tr"],tags:{amenity:"fuel",brand:"Opet","brand:wikidata":"Q7072824","brand:wikipedia":"en:Opet",name:"Opet"}},"amenity/fuel|Orlen":{nomatch:["shop/convenience|Orlen"],tags:{amenity:"fuel",brand:"Orlen","brand:wikidata":"Q971649","brand:wikipedia":"en:PKN Orlen",name:"Orlen"}},"amenity/fuel|Oxxo":{nomatch:["shop/convenience|Oxxo"],tags:{amenity:"fuel",brand:"Oxxo","brand:wikidata":"Q1342538","brand:wikipedia":"es:Oxxo",name:"Oxxo"}},"amenity/fuel|PSO":{countryCodes:["pk"],matchNames:["pso petrol pump"],tags:{amenity:"fuel",brand:"PSO","brand:wikidata":"Q2741455","brand:wikipedia":"en:Pakistan State Oil",name:"PSO"}},"amenity/fuel|PT":{countryCodes:["th"],tags:{amenity:"fuel",brand:"PT","brand:wikidata":"Q62298612",name:"PT"}},"amenity/fuel|PTT":{nomatch:["amenity/post_office|PTT"],tags:{amenity:"fuel",brand:"PTT","brand:wikidata":"Q1810389","brand:wikipedia":"en:PTT Public Company Limited",name:"PTT"}},"amenity/fuel|PV Oil":{tags:{amenity:"fuel",brand:"PV Oil","brand:wikidata":"Q2089536","brand:wikipedia":"en:Petrovietnam",name:"PV Oil"}},"amenity/fuel|Pacific Pride":{countryCodes:["us"],tags:{amenity:"fuel",brand:"Pacific Pride","brand:wikidata":"Q7122637","brand:wikipedia":"en:Pacific Pride",name:"Pacific Pride"}},"amenity/fuel|Pecsa":{countryCodes:["pe"],tags:{amenity:"fuel",brand:"Pecsa","brand:wikidata":"Q62299262",name:"Pecsa"}},"amenity/fuel|Pemex":{countryCodes:["mx"],tags:{amenity:"fuel",brand:"Pemex","brand:wikidata":"Q871308","brand:wikipedia":"en:Pemex",name:"Pemex"}},"amenity/fuel|Pertamina":{countryCodes:["id"],tags:{amenity:"fuel",brand:"Pertamina","brand:wikidata":"Q1641044","brand:wikipedia":"en:Pertamina",name:"Pertamina"}},"amenity/fuel|Petro":{countryCodes:["ca","us"],matchNames:["petro stopping center"],tags:{alt_name:"Petro Stopping Centers",amenity:"fuel",brand:"Petro","brand:wikidata":"Q64051305",name:"Petro"}},"amenity/fuel|Petro-Canada":{countryCodes:["ca"],nomatch:["shop/convenience|Petro-Canada"],tags:{amenity:"fuel",brand:"Petro-Canada","brand:wikidata":"Q1208279","brand:wikipedia":"en:Petro-Canada",name:"Petro-Canada"}},"amenity/fuel|Petro-T":{countryCodes:["ca"],tags:{amenity:"fuel",brand:"Petro-T","brand:wikidata":"Q61743540",name:"Petro-T"}},"amenity/fuel|PetroPerú":{countryCodes:["pe"],tags:{amenity:"fuel",brand:"PetroPerú","brand:wikidata":"Q2506390","brand:wikipedia":"es:Petroperú",name:"PetroPerú"}},"amenity/fuel|Petrochina":{countryCodes:["cn"],tags:{amenity:"fuel",brand:"Petrochina","brand:wikidata":"Q503182","brand:wikipedia":"en:PetroChina",name:"Petrochina"}},"amenity/fuel|Petroecuador":{countryCodes:["ec"],tags:{amenity:"fuel",brand:"Petroecuador","brand:wikidata":"Q1812822","brand:wikipedia":"en:Petroecuador",name:"Petroecuador"}},"amenity/fuel|Petrol Ofisi":{tags:{amenity:"fuel",brand:"Petrol Ofisi","brand:wikidata":"Q1278087","brand:wikipedia":"en:Petrol Ofisi",name:"Petrol Ofisi"}},"amenity/fuel|Petrolimex":{tags:{amenity:"fuel",brand:"Petrolimex","brand:wikidata":"Q10831598","brand:wikipedia":"en:Petrolimex",name:"Petrolimex"}},"amenity/fuel|Petrolina":{countryCodes:["cy"],tags:{amenity:"fuel",brand:"Petrolina","brand:wikidata":"Q17013948","brand:wikipedia":"en:Petrolina (company)",name:"Petrolina"}},"amenity/fuel|Petrom":{tags:{amenity:"fuel",brand:"Petrom","brand:wikidata":"Q1755034","brand:wikipedia":"en:Petrom",name:"Petrom"}},"amenity/fuel|Petron":{countryCodes:["ph"],tags:{amenity:"fuel",brand:"Petron","brand:wikidata":"Q7179011","brand:wikipedia":"en:Petron Corporation",name:"Petron"}},"amenity/fuel|Petronas":{tags:{amenity:"fuel",brand:"Petronas","brand:wikidata":"Q221692","brand:wikipedia":"en:Petronas",name:"Petronas"}},"amenity/fuel|Petronor":{countryCodes:["es"],tags:{amenity:"fuel",brand:"Petronor","brand:wikidata":"Q1726547","brand:wikipedia":"es:Petronor",name:"Petronor"}},"amenity/fuel|Phillips 66":{countryCodes:["us"],tags:{amenity:"fuel",brand:"Phillips 66","brand:wikidata":"Q1656230","brand:wikipedia":"en:Phillips 66",name:"Phillips 66"}},"amenity/fuel|Phoenix":{countryCodes:["ph"],tags:{amenity:"fuel",brand:"Phoenix","brand:wikidata":"Q7186949","brand:wikipedia":"en:Phoenix Petroleum",name:"Phoenix"}},"amenity/fuel|Pilot":{countryCodes:["ca","us"],matchNames:["pilot travel centers"],tags:{amenity:"fuel",brand:"Pilot","brand:wikidata":"Q64128179",name:"Pilot"}},"amenity/fuel|Pioneer":{countryCodes:["ca"],tags:{amenity:"fuel",brand:"Pioneer","brand:wikidata":"Q7196684","brand:wikipedia":"en:Pioneer Energy",name:"Pioneer"}},"amenity/fuel|Preem":{countryCodes:["pl","se"],tags:{amenity:"fuel",brand:"Preem","brand:wikidata":"Q598835","brand:wikipedia":"en:Preem",name:"Preem"}},"amenity/fuel|Primax~(Ecuador)":{countryCodes:["ec"],tags:{amenity:"fuel",brand:"Primax","brand:wikidata":"Q62332857",name:"Primax"}},"amenity/fuel|Primax~(Peru)":{countryCodes:["pe"],tags:{amenity:"fuel",brand:"Primax","brand:wikidata":"Q62332638",name:"Primax"}},"amenity/fuel|Prio":{countryCodes:["pt"],tags:{amenity:"fuel",brand:"Prio","brand:wikidata":"Q62530421",name:"Prio"}},"amenity/fuel|Puma":{nomatch:["shop/clothes|Puma"],tags:{amenity:"fuel",brand:"Puma","brand:wikidata":"Q7259769","brand:wikipedia":"en:Puma Energy",name:"Puma"}},"amenity/fuel|Q1":{countryCodes:["de"],tags:{amenity:"fuel",brand:"Q1","brand:wikidata":"Q62086498",name:"Q1"}},"amenity/fuel|Q8":{countryCodes:["be","dk","es","it","lu","nl","pt"],tags:{amenity:"fuel",brand:"Q8","brand:wikidata":"Q1634762","brand:wikipedia":"en:Kuwait Petroleum Corporation",name:"Q8"}},"amenity/fuel|Q8 Easy":{countryCodes:["be","it"],tags:{amenity:"fuel",brand:"Q8 Easy","brand:wikidata":"Q1806948","brand:wikipedia":"nl:Q8 Easy",name:"Q8 Easy"}},"amenity/fuel|Qstar":{countryCodes:["se"],tags:{amenity:"fuel",brand:"Qstar","brand:wikidata":"Q10647961","brand:wikipedia":"sv:Qstar",name:"Qstar"}},"amenity/fuel|QuikTrip":{matchNames:["qt"],nomatch:["shop/convenience|QuikTrip"],tags:{amenity:"fuel",brand:"QuikTrip","brand:wikidata":"Q7271953","brand:wikipedia":"en:QuikTrip",name:"QuikTrip"}},"amenity/fuel|RaceTrac":{nomatch:["shop/convenience|RaceTrac"],tags:{amenity:"fuel",brand:"RaceTrac","brand:wikidata":"Q735942","brand:wikipedia":"en:RaceTrac",name:"RaceTrac"}},"amenity/fuel|Raiffeisen":{countryCodes:["de"],nomatch:["amenity/bank|Raiffeisenbank"],tags:{amenity:"fuel",brand:"Raiffeisen",name:"Raiffeisen"}},"amenity/fuel|Repsol":{tags:{amenity:"fuel",brand:"Repsol","brand:wikidata":"Q174747","brand:wikipedia":"es:Repsol",name:"Repsol"}},"amenity/fuel|Revoil":{countryCodes:["gr"],tags:{amenity:"fuel",brand:"Revoil","brand:wikidata":"Q62530755",name:"Revoil"}},"amenity/fuel|Rompetrol":{tags:{amenity:"fuel",brand:"Rompetrol","brand:wikidata":"Q1788862","brand:wikipedia":"en:Rompetrol",name:"Rompetrol"}},"amenity/fuel|Royal Farms":{countryCodes:["us"],nomatch:["shop/convenience|Royal Farms"],tags:{amenity:"fuel",brand:"Royal Farms","brand:wikidata":"Q7374169","brand:wikipedia":"en:Royal Farms",name:"Royal Farms"}},"amenity/fuel|Rubis":{tags:{amenity:"fuel",brand:"Rubis","brand:wikidata":"Q3446514","brand:wikipedia":"en:Rubis (company)",name:"Rubis"}},"amenity/fuel|SK주유소":{countryCodes:["kr"],tags:{amenity:"fuel",brand:"SK주유소","brand:ko":"SK주유소",name:"SK주유소","name:ko":"SK주유소"}},"amenity/fuel|SP":{tags:{amenity:"fuel",brand:"SP",name:"SP"}},"amenity/fuel|Safeway":{nomatch:["shop/supermarket|Safeway"],tags:{amenity:"fuel",brand:"Safeway","brand:wikidata":"Q1508234","brand:wikipedia":"en:Safeway Inc.",name:"Safeway"}},"amenity/fuel|Sainsbury's":{countryCodes:["gb"],nomatch:["shop/supermarket|Sainsbury's"],tags:{amenity:"fuel",brand:"Sainsbury's","brand:wikidata":"Q152096","brand:wikipedia":"en:Sainsbury's",name:"Sainsbury's"}},"amenity/fuel|Sam's Club":{nomatch:["shop/wholesale|Sam's Club"],tags:{amenity:"fuel",brand:"Sam's Club","brand:wikidata":"Q1972120","brand:wikipedia":"en:Sam's Club",name:"Sam's Club"}},"amenity/fuel|Sasol":{countryCodes:["za"],tags:{amenity:"fuel",brand:"Sasol","brand:wikidata":"Q905998","brand:wikipedia":"en:Sasol",name:"Sasol"}},"amenity/fuel|Sea Oil":{countryCodes:["ph"],tags:{amenity:"fuel",brand:"Sea Oil","brand:wikidata":"Q7389549","brand:wikipedia":"en:Seaoil Philippines",name:"Sea Oil"}},"amenity/fuel|Sheetz":{nomatch:["shop/convenience|Sheetz"],tags:{amenity:"fuel",brand:"Sheetz","brand:wikidata":"Q7492551","brand:wikipedia":"en:Sheetz",name:"Sheetz"}},"amenity/fuel|Shell":{matchNames:["posto shell","shell gas station","shell petrol station","shell station","station shell"],nomatch:["amenity/fuel|Shell Express","shop/convenience|Shell Select"],tags:{amenity:"fuel",brand:"Shell","brand:wikidata":"Q154950","brand:wikipedia":"en:Royal Dutch Shell",name:"Shell"}},"amenity/fuel|Shell Express":{nomatch:["amenity/fuel|Shell","shop/convenience|Shell Select"],tags:{amenity:"fuel",brand:"Shell Express","brand:wikidata":"Q2289188","brand:wikipedia":"nl:Shell Express",name:"Shell Express"}},"amenity/fuel|Sinclair":{countryCodes:["us"],tags:{amenity:"fuel",brand:"Sinclair","brand:wikidata":"Q1290900","brand:wikipedia":"en:Sinclair Oil Corporation",name:"Sinclair"}},"amenity/fuel|Sinopec":{countryCodes:["cn"],matchNames:["sinopec fuel"],tags:{amenity:"fuel",brand:"Sinopec","brand:wikidata":"Q831445","brand:wikipedia":"en:Sinopec","brand:zh":"中国石化",name:"Sinopec","name:zh":"中国石化"}},"amenity/fuel|Slovnaft":{countryCodes:["cz","pl","sk"],tags:{amenity:"fuel",brand:"Slovnaft","brand:wikidata":"Q1587563","brand:wikipedia":"en:Slovnaft",name:"Slovnaft"}},"amenity/fuel|Socar":{tags:{amenity:"fuel",brand:"Socar","brand:wikidata":"Q1622293","brand:wikipedia":"en:SOCAR",name:"Socar"}},"amenity/fuel|Sokimex":{countryCodes:["kh"],tags:{amenity:"fuel",brand:"Sokimex","brand:wikidata":"Q1149575","brand:wikipedia":"en:Sokimex",name:"Sokimex"}},"amenity/fuel|Sonic":{nomatch:["amenity/fast_food|Sonic"],tags:{amenity:"fuel",brand:"Sonic",name:"Sonic"}},"amenity/fuel|Speedway":{nomatch:["shop/convenience|Speedway"],tags:{amenity:"fuel",brand:"Speedway","brand:wikidata":"Q7575683","brand:wikipedia":"en:Speedway LLC",name:"Speedway"}},"amenity/fuel|Sprint":{countryCodes:["de"],nomatch:["shop/mobile_phone|Sprint"],tags:{amenity:"fuel",brand:"Sprint","brand:wikidata":"Q57588452",name:"Sprint"}},"amenity/fuel|St1":{countryCodes:["fi","se"],tags:{amenity:"fuel",brand:"St1","brand:wikidata":"Q7592214","brand:wikipedia":"en:St1",name:"St1"}},"amenity/fuel|Star":{countryCodes:["de"],tags:{amenity:"fuel",brand:"Star","brand:wikidata":"Q2031095","brand:wikipedia":"de:Orlen Deutschland",name:"Star"}},"amenity/fuel|Star Oil":{tags:{amenity:"fuel",brand:"Star Oil",name:"Star Oil"}},"amenity/fuel|Station Service E. Leclerc":{matchNames:["e. leclerc"],tags:{amenity:"fuel",brand:"E.Leclerc","brand:wikidata":"Q1273376","brand:wikipedia":"fr:E.Leclerc",name:"Station Service E. Leclerc"}},"amenity/fuel|Statoil":{countryCodes:["dk","ee","ie","pl","ru","se"],tags:{amenity:"fuel",brand:"Statoil","brand:wikidata":"Q1776022","brand:wikipedia":"en:Equinor",name:"Statoil"}},"amenity/fuel|Stewart's":{countryCodes:["us"],nomatch:["shop/convenience|Stewart's"],tags:{amenity:"fuel",brand:"Stewart's","brand:wikidata":"Q7615690","brand:wikipedia":"en:Stewart's Shops",name:"Stewart's"}},"amenity/fuel|Sunoco":{nomatch:["shop/convenience|Sunoco"],tags:{amenity:"fuel",brand:"Sunoco","brand:wikidata":"Q1423218","brand:wikipedia":"en:Sunoco",name:"Sunoco"}},"amenity/fuel|Super U":{countryCodes:["fr"],nomatch:["shop/convenience|Utile","shop/supermarket|Hyper U","shop/supermarket|Super U","shop/supermarket|U Express"],tags:{amenity:"fuel",brand:"Super U","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Super U"}},"amenity/fuel|Susco":{countryCodes:["th"],tags:{amenity:"fuel",brand:"Susco",name:"Susco"}},"amenity/fuel|TA":{countryCodes:["us"],tags:{amenity:"fuel",brand:"TA","brand:wikidata":"Q7835892","brand:wikipedia":"en:TravelCenters of America",name:"TA"}},"amenity/fuel|Tamoil":{countryCodes:["ch","de","es","fr","it","nl"],tags:{amenity:"fuel",brand:"Tamoil","brand:wikidata":"Q706793","brand:wikipedia":"en:Tamoil",name:"Tamoil"}},"amenity/fuel|Tango":{countryCodes:["nl"],tags:{amenity:"fuel",brand:"Tango","brand:wikidata":"Q2423920","brand:wikipedia":"nl:Tango CV",name:"Tango"}},"amenity/fuel|Tanka":{countryCodes:["se"],tags:{amenity:"fuel",brand:"Tanka","brand:wikidata":"Q10690640","brand:wikipedia":"sv:Tanka (bensinstationskedja)",name:"Tanka"}},"amenity/fuel|Teboil":{countryCodes:["fi"],tags:{amenity:"fuel",brand:"Teboil","brand:wikidata":"Q7692079","brand:wikipedia":"en:Teboil",name:"Teboil"}},"amenity/fuel|Tela":{countryCodes:["kh"],tags:{amenity:"fuel",brand:"Tela","brand:wikidata":"Q62534875",name:"Tela"}},"amenity/fuel|Tempo":{countryCodes:["ca"],tags:{amenity:"fuel",brand:"Tempo","brand:wikidata":"Q62535175",name:"Tempo"}},"amenity/fuel|Terpel":{tags:{amenity:"fuel",brand:"Terpel","brand:wikidata":"Q7703003","brand:wikipedia":"en:Terpel",name:"Terpel"}},"amenity/fuel|Tesco":{nomatch:["shop/convenience|Tesco"],tags:{amenity:"fuel",brand:"Tesco","brand:wikidata":"Q17145596","brand:wikipedia":"en:Tesco Corporation",name:"Tesco"}},"amenity/fuel|Tesoro":{countryCodes:["us"],tags:{amenity:"fuel",brand:"Tesoro",name:"Tesoro"}},"amenity/fuel|Texaco":{nomatch:["shop/convenience|Texaco"],tags:{amenity:"fuel",brand:"Texaco","brand:wikidata":"Q775060","brand:wikipedia":"en:Texaco",name:"Texaco"}},"amenity/fuel|Tinq":{countryCodes:["nl"],tags:{amenity:"fuel",brand:"Tinq","brand:wikidata":"Q2132028","brand:wikipedia":"nl:Tinq",name:"Tinq"}},"amenity/fuel|Topaz":{countryCodes:["ie"],tags:{amenity:"fuel",brand:"Topaz","brand:wikidata":"Q7824764","brand:wikipedia":"en:Topaz Energy",name:"Topaz"}},"amenity/fuel|Total":{matchNames:["station total"],nomatch:["shop/convenience|Total"],tags:{amenity:"fuel",brand:"Total","brand:wikidata":"Q154037","brand:wikipedia":"fr:Total (entreprise)",name:"Total"}},"amenity/fuel|Total Access":{countryCodes:["fr"],tags:{amenity:"fuel",brand:"Total Access","brand:wikidata":"Q154037","brand:wikipedia":"fr:Total (entreprise)",name:"Total Access"}},"amenity/fuel|TotalErg":{countryCodes:["it"],tags:{amenity:"fuel",brand:"TotalErg","brand:wikidata":"Q3995933","brand:wikipedia":"it:TotalErg",name:"TotalErg"}},"amenity/fuel|Turkey Hill":{countryCodes:["us"],nomatch:["shop/convenience|Turkey Hill"],tags:{amenity:"fuel",brand:"Turkey Hill","brand:wikidata":"Q42376970","brand:wikipedia":"en:Turkey Hill Minit Markets",name:"Turkey Hill"}},"amenity/fuel|Turmöl":{countryCodes:["at"],tags:{amenity:"fuel",brand:"Turmöl","brand:wikidata":"Q1473279","brand:wikipedia":"de:Turmöl",name:"Turmöl"}},"amenity/fuel|UDF Fuel":{countryCodes:["us"],matchNames:["udf fuels","united dairy farmers"],nomatch:["shop/convenience|United Dairy Farmers"],tags:{amenity:"fuel",brand:"United Dairy Farmers","brand:wikidata":"Q7887677","brand:wikipedia":"en:United Dairy Farmers",name:"UDF Fuel",short_name:"UDF"}},"amenity/fuel|Ultramar":{nomatch:["shop/convenience|Ultramar"],tags:{amenity:"fuel",brand:"Ultramar","brand:wikidata":"Q3548078","brand:wikipedia":"en:Ultramar",name:"Ultramar"}},"amenity/fuel|United":{matchNames:["united petroleum"],nomatch:["amenity/bank|United Bank"],tags:{amenity:"fuel",brand:"United","brand:wikidata":"Q28224393","brand:wikipedia":"en:United Petroleum",name:"United"}},"amenity/fuel|Uno":{countryCodes:["bz","cr","gt","hn","ni","sv"],tags:{amenity:"fuel",brand:"Uno","brand:wikidata":"Q62535574",name:"Uno"}},"amenity/fuel|Uno-X":{countryCodes:["dk"],tags:{amenity:"fuel",brand:"Uno-X","brand:wikidata":"Q3362746","brand:wikipedia":"en:Uno-X",name:"Uno-X"}},"amenity/fuel|Valero":{nomatch:["shop/convenience|Valero"],tags:{amenity:"fuel",brand:"Valero","brand:wikidata":"Q1283291","brand:wikipedia":"en:Valero Energy",name:"Valero"}},"amenity/fuel|Viada":{countryCodes:["lt","lv"],tags:{amenity:"fuel",brand:"Viada","brand:wikidata":"Q12663942","brand:wikipedia":"en:Lukoil Baltija",name:"Viada"}},"amenity/fuel|Vito":{countryCodes:["fr"],tags:{amenity:"fuel",brand:"Vito","brand:wikidata":"Q62536473",name:"Vito"}},"amenity/fuel|WOG":{countryCodes:["ua"],tags:{amenity:"fuel",brand:"WOG","brand:wikidata":"Q12072939","brand:wikipedia":"en:WOG (gas stations)",name:"WOG"}},"amenity/fuel|Walmart":{nomatch:["shop/department_store|Walmart","shop/supermarket|Walmart Neighborhood Market","shop/supermarket|Walmart Supercenter"],tags:{amenity:"fuel",brand:"Walmart","brand:wikidata":"Q62606411","brand:wikipedia":"en:Walmart",name:"Walmart"}},"amenity/fuel|Wawa":{nomatch:["shop/convenience|Wawa"],tags:{amenity:"fuel",brand:"Wawa","brand:wikidata":"Q5936320","brand:wikipedia":"en:Wawa (company)",name:"Wawa"}},"amenity/fuel|Westfalen":{countryCodes:["de"],tags:{amenity:"fuel",brand:"Westfalen","brand:wikidata":"Q1411209","brand:wikipedia":"en:Westfalen AG",name:"Westfalen"}},"amenity/fuel|Woolworths Petrol":{countryCodes:["au"],nomatch:["shop/convenience|Woolworths Petrol"],tags:{amenity:"fuel",brand:"Caltex","brand:wikidata":"Q5023980","brand:wikipedia":"en:Caltex Woolworths",name:"Woolworths Petrol"}},"amenity/fuel|XTR":{countryCodes:["ca"],tags:{amenity:"fuel",brand:"XTR","brand:wikidata":"Q62537250",name:"XTR"}},"amenity/fuel|YPF":{tags:{amenity:"fuel",brand:"YPF","brand:wikidata":"Q2006989","brand:wikipedia":"en:YPF",name:"YPF"}},"amenity/fuel|Z":{countryCodes:["nz"],nomatch:["shop/clothes|Z"],tags:{amenity:"fuel",brand:"Z","brand:wikidata":"Q8063337","brand:wikipedia":"en:Z Energy",name:"Z"}},"amenity/fuel|bft":{countryCodes:["de"],tags:{amenity:"fuel",brand:"bft","brand:wikidata":"Q1009104","brand:wikipedia":"de:Bundesverband freier Tankstellen",name:"bft"}},"amenity/fuel|din-X":{countryCodes:["se"],tags:{amenity:"fuel",brand:"din-X","brand:wikidata":"Q10472858","brand:wikipedia":"sv:Din-X",name:"din-X"}},"amenity/fuel|Авіас":{countryCodes:["ua"],tags:{amenity:"fuel",brand:"Авіас","brand:wikidata":"Q12122687","brand:wikipedia":"uk:Мережа АЗС Приват",name:"Авіас"}},"amenity/fuel|БРСМ-Нафта":{countryCodes:["ua"],tags:{amenity:"fuel",brand:"БРСМ-Нафта","brand:wikidata":"Q56356523","brand:wikipedia":"uk:БРСМ-Нафта",name:"БРСМ-Нафта"}},"amenity/fuel|Башнефть":{countryCodes:["ru"],tags:{amenity:"fuel",brand:"Башнефть","brand:en":"Bashneft","brand:wikidata":"Q809985","brand:wikipedia":"en:Bashneft",name:"Башнефть","name:en":"Bashneft"}},"amenity/fuel|Белоруснефть":{countryCodes:["by"],tags:{amenity:"fuel",brand:"Белоруснефть","brand:wikidata":"Q4082693","brand:wikipedia":"ru:Белоруснефть",name:"Белоруснефть"}},"amenity/fuel|Газпромнефть":{countryCodes:["by","kg","kz","ru","tj"],matchNames:["газпром"],tags:{amenity:"fuel",brand:"Газпромнефть","brand:wikidata":"Q1461799","brand:wikipedia":"en:Gazprom Neft",name:"Газпромнефть"}},"amenity/fuel|Гелиос":{countryCodes:["kz"],matchNames:["helios"],tags:{amenity:"fuel",brand:"Гелиос","brand:en":"Helios","brand:wikidata":"Q62286471",name:"Гелиос","name:en":"Helios"}},"amenity/fuel|ЕКА":{countryCodes:["ru"],tags:{amenity:"fuel",brand:"ЕКА","brand:wikidata":"Q62543029",name:"ЕКА"}},"amenity/fuel|КЛО":{countryCodes:["ua"],tags:{amenity:"fuel",brand:"КЛО","brand:en":"Klo","brand:wikidata":"Q60966526","brand:wikipedia":"ru:КЛО (сеть АЗС)",name:"КЛО","name:en":"Klo"}},"amenity/fuel|КазМунайГаз":{countryCodes:["kz"],nomatch:["shop/convenience|КазМунайГаз"],tags:{amenity:"fuel",brand:"КазМунайГаз","brand:wikidata":"Q1417227","brand:wikipedia":"en:KazMunayGas",name:"КазМунайГаз"}},"amenity/fuel|Лукойл":{matchNames:["лукоил"],nomatch:["shop/convenience|Лукойл"],tags:{amenity:"fuel",brand:"Лукойл","brand:wikidata":"Q329347","brand:wikipedia":"ru:Лукойл",name:"Лукойл"}},"amenity/fuel|Макпетрол":{countryCodes:["mk"],tags:{amenity:"fuel",brand:"Макпетрол","brand:wikidata":"Q1886438","brand:wikipedia":"en:Makpetrol",name:"Макпетрол"}},"amenity/fuel|НК Альянс":{countryCodes:["ru"],tags:{amenity:"fuel",brand:"НК Альянс","brand:en":"Alliance Oil","brand:ru":"НК Альянс","brand:wikidata":"Q4063700","brand:wikipedia":"ru:Альянс (компания)",name:"НК Альянс","name:en":"Alliance Oil","name:ru":"НК Альянс"}},"amenity/fuel|Нефтьмагистраль":{countryCodes:["ru"],tags:{amenity:"fuel",brand:"Нефтьмагистраль","brand:en":"Neftmagistral","brand:wikidata":"Q62544323",name:"Нефтьмагистраль","name:en":"Neftmagistral"}},"amenity/fuel|ОККО":{countryCodes:["ua"],tags:{amenity:"fuel",brand:"ОККО","brand:en":"OKKO","brand:wikidata":"Q7072617","brand:wikipedia":"en:OKKO",name:"ОККО","name:en":"OKKO"}},"amenity/fuel|ОМВ":{countryCodes:["bg","rs"],tags:{amenity:"fuel",brand:"ОМВ","brand:wikidata":"Q168238","brand:wikipedia":"en:OMV",name:"ОМВ"}},"amenity/fuel|ПТК":{countryCodes:["ru"],tags:{amenity:"fuel",brand:"ПТК","brand:en":"The Petersburg Fuel Company","brand:wikidata":"Q4360193","brand:wikipedia":"en:Petersburg Fuel Company",name:"ПТК","name:en":"The Petersburg Fuel Company"}},"amenity/fuel|Петрол":{countryCodes:["bg"],tags:{amenity:"fuel",brand:"Петрол","brand:en":"Petrol AD","brand:wikidata":"Q24315","brand:wikipedia":"en:Petrol AD",name:"Петрол","name:en":"Petrol AD"}},"amenity/fuel|Роснефть":{tags:{amenity:"fuel",brand:"Роснефть","brand:en":"Rosneft","brand:wikidata":"Q1141123","brand:wikipedia":"en:Rosneft",name:"Роснефть","name:en":"Rosneft"}},"amenity/fuel|Сургутнефтегаз":{countryCodes:["ru"],tags:{amenity:"fuel",brand:"Сургутнефтегаз","brand:en":"Surgutneftegas","brand:wikidata":"Q680776","brand:wikipedia":"en:Surgutneftegas",name:"Сургутнефтегаз","name:en":"Surgutneftegas"}},"amenity/fuel|ТНК":{countryCodes:["ru","ua"],tags:{amenity:"fuel",brand:"ТНК","brand:wikidata":"Q2298901","brand:wikipedia":"en:TNK-BP",name:"ТНК"}},"amenity/fuel|Татнефтепродукт":{countryCodes:["ru"],tags:{amenity:"fuel",brand:"Татнефтепродукт",name:"Татнефтепродукт"}},"amenity/fuel|Татнефть":{countryCodes:["ru","ua"],tags:{amenity:"fuel",brand:"Татнефть","brand:en":"Tatneft","brand:wikidata":"Q1616858","brand:wikipedia":"en:Tatneft",name:"Татнефть","name:en":"Tatneft"}},"amenity/fuel|Укрнафта":{countryCodes:["ua"],tags:{amenity:"fuel",brand:"Укрнафта","brand:en":"Ukrnafta","brand:wikidata":"Q2447961","brand:wikipedia":"en:Ukrnafta",name:"Укрнафта","name:en":"Ukrnafta"}},"amenity/fuel|דור אלון":{countryCodes:["il"],tags:{amenity:"fuel",brand:"דור אלון","brand:en":"Dor Alon","brand:he":"דור אלון","brand:wikidata":"Q16130352","brand:wikipedia":"he:דור אלון אנרגיה בישראל (1988)",name:"דור אלון","name:en":"Dor Alon","name:he":"דור אלון"}},"amenity/fuel|סונול":{countryCodes:["il"],tags:{amenity:"fuel",brand:"סונול","brand:en":"Sonol","brand:he":"סונול","brand:wikidata":"Q3701622","brand:wikipedia":"en:Sonol",name:"סונול","name:en":"Sonol","name:he":"סונול"}},"amenity/fuel|פז":{countryCodes:["il"],tags:{amenity:"fuel",brand:"פז","brand:en":"Paz","brand:he":"פז","brand:wikidata":"Q2211731","brand:wikipedia":"en:Paz Oil Company",name:"פז","name:en":"Paz","name:he":"פז"}},"amenity/fuel|ادنوك":{countryCodes:["ae"],tags:{amenity:"fuel",brand:"ادنوك","brand:ar":"ادنوك","brand:en":"ADNOC","brand:wikidata":"Q166729","brand:wikipedia":"en:Abu Dhabi National Oil Company",name:"ادنوك","name:ar":"ادنوك","name:en":"ADNOC"}},"amenity/fuel|บางจาก":{countryCodes:["th"],tags:{amenity:"fuel",brand:"บางจาก","brand:en":"Bangchak","brand:th":"บางจาก","brand:wikidata":"Q6579719","brand:wikipedia":"th:บางจาก คอร์ปอเรชัน",name:"บางจาก","name:en":"Bangchak","name:th":"บางจาก"}},"amenity/fuel|ป.ต.ท.":{countryCodes:["th"],tags:{amenity:"fuel",brand:"ป.ต.ท.","brand:en":"PTT","brand:th":"ป.ต.ท.","brand:wikidata":"Q1810389","brand:wikipedia":"th:ปตท.",name:"ป.ต.ท.","name:en":"PTT","name:th":"ป.ต.ท."}},"amenity/fuel|เชลล์":{countryCodes:["th"],tags:{amenity:"fuel",brand:"เชลล์","brand:en":"Shell","brand:th":"เชลล์","brand:wikidata":"Q154950","brand:wikipedia":"en:Royal Dutch Shell",name:"เชลล์","name:en":"Shell","name:th":"เชลล์"}},"amenity/fuel|เอสโซ่":{countryCodes:["th"],tags:{amenity:"fuel",brand:"เอสโซ่","brand:en":"Esso","brand:th":"เอสโซ่","brand:wikidata":"Q867662","brand:wikipedia":"en:Esso",name:"เอสโซ่","name:en":"Esso","name:th":"เอสโซ่"}},"amenity/fuel|エッソ":{countryCodes:["jp"],matchNames:["エッソ石油"],tags:{amenity:"fuel",brand:"エッソ","brand:en":"Esso","brand:ja":"エッソ","brand:wikidata":"Q867662","brand:wikipedia":"en:Esso",name:"エッソ","name:en":"Esso","name:ja":"エッソ"}},"amenity/fuel|エネオス":{countryCodes:["jp"],tags:{amenity:"fuel",brand:"エネオス","brand:en":"JXTG Nippon Oil & Energy","brand:ja":"エネオス","brand:wikidata":"Q1640290","brand:wikipedia":"en:JXTG Nippon Oil & Energy",name:"エネオス","name:en":"JXTG Nippon Oil & Energy","name:ja":"エネオス"}},"amenity/fuel|コスモ石油":{countryCodes:["jp"],tags:{amenity:"fuel",brand:"コスモ石油","brand:en":"Cosmo Oil Company","brand:ja":"コスモ石油","brand:wikidata":"Q2498318","brand:wikipedia":"en:Cosmo Oil Company",name:"コスモ石油","name:en":"Cosmo Oil Company","name:ja":"コスモ石油"}},"amenity/fuel|ゼネラル":{countryCodes:["jp"],tags:{amenity:"fuel",brand:"ゼネラル","brand:en":"Tonen General","brand:ja":"ゼネラル","brand:wikidata":"Q11528048","brand:wikipedia":"ja:東燃ゼネラル石油",name:"ゼネラル","name:en":"Tonen General","name:ja":"ゼネラル"}},"amenity/fuel|モービル":{countryCodes:["jp"],tags:{amenity:"fuel",brand:"モービル","brand:ja":"モービル",name:"モービル","name:ja":"モービル"}},"amenity/fuel|中国石化":{countryCodes:["cn"],matchNames:["中国石化 Sinopec"],tags:{amenity:"fuel",brand:"中国石化","brand:en":"Sinopec","brand:wikidata":"Q831445","brand:wikipedia":"en:Sinopec",name:"中国石化","name:en":"Sinopec"}},"amenity/fuel|中国石化加油站":{tags:{amenity:"fuel",brand:"中国石化加油站",name:"中国石化加油站"}},"amenity/fuel|中国石油":{countryCodes:["cn"],tags:{amenity:"fuel",brand:"中国石油","brand:en":"PetroChina","brand:wikidata":"Q503182","brand:wikipedia":"en:PetroChina",name:"中国石油","name:en":"PetroChina"}},"amenity/fuel|全國加油站":{countryCodes:["tw"],tags:{amenity:"fuel",brand:"全國加油站",name:"全國加油站"}},"amenity/fuel|出光":{countryCodes:["jp"],tags:{amenity:"fuel",brand:"出光","brand:en":"Idemitsu Kosan","brand:wikidata":"Q2216770","brand:wikipedia":"en:Idemitsu Kosan",name:"出光","name:en":"Idemitsu Kosan"}},"amenity/fuel|台灣中油":{countryCodes:["tw"],matchNames:["中油"],tags:{amenity:"fuel",brand:"台灣中油","brand:en":"CPC Corporation, Taiwan","brand:wikidata":"Q21527177","brand:wikipedia":"en:CPC Corporation, Taiwan",name:"台灣中油","name:en":"CPC Corporation, Taiwan"}},"amenity/fuel|昭和シェル":{countryCodes:["jp"],matchNames:["昭和シェル石油"],tags:{amenity:"fuel",brand:"昭和シェル","brand:en":"Showa Shell Sekiyu","brand:ja":"昭和シェル","brand:wikidata":"Q277115","brand:wikipedia":"en:Showa Shell Sekiyu",name:"昭和シェル","name:en":"Showa Shell Sekiyu","name:ja":"昭和シェル"}},"amenity/ice_cream|Baskin-Robbins":{tags:{amenity:"ice_cream",brand:"Baskin-Robbins","brand:wikidata":"Q584601","brand:wikipedia":"en:Baskin-Robbins",cuisine:"ice_cream",name:"Baskin-Robbins"}},"amenity/ice_cream|Ben & Jerry's":{matchNames:["ben and jerrys"],tags:{amenity:"ice_cream",brand:"Ben & Jerry's","brand:wikidata":"Q816412","brand:wikipedia":"en:Ben & Jerry's",cuisine:"ice_cream",name:"Ben & Jerry's"}},"amenity/ice_cream|Bruster's Ice Cream":{countryCodes:["us"],matchNames:["brusters"],tags:{amenity:"ice_cream",brand:"Bruster's Ice Cream","brand:wikidata":"Q4979810","brand:wikipedia":"en:Bruster's Ice Cream",cuisine:"ice_cream",name:"Bruster's Ice Cream"}},"amenity/ice_cream|Cold Stone Creamery":{countryCodes:["ng","us"],matchNames:["cold stone"],tags:{amenity:"ice_cream",brand:"Cold Stone Creamery","brand:wikidata":"Q1094923","brand:wikipedia":"en:Cold Stone Creamery",cuisine:"ice_cream",name:"Cold Stone Creamery"}},"amenity/ice_cream|D'Onofrio":{countryCodes:["pe"],tags:{amenity:"ice_cream",brand:"D'Onofrio","brand:wikidata":"Q5203166","brand:wikipedia":"es:D'Onofrio",cuisine:"ice_cream",name:"D'Onofrio"}},"amenity/ice_cream|Freddo":{tags:{amenity:"ice_cream",brand:"Freddo","brand:wikidata":"Q28823999","brand:wikipedia":"es:Freddo",cuisine:"ice_cream",name:"Freddo"}},"amenity/ice_cream|Graeter's":{countryCodes:["us"],matchNames:["greaters"],tags:{amenity:"ice_cream",brand:"Graeter's","brand:wikidata":"Q5592430","brand:wikipedia":"en:Graeter's",cuisine:"ice_cream",name:"Graeter's",takeaway:"yes"}},"amenity/ice_cream|Grido":{countryCodes:["ar"],matchNames:["grido helado"],matchTags:["shop/confectionary"],tags:{amenity:"ice_cream",brand:"Grido","brand:wikidata":"Q5885724","brand:wikipedia":"es:Grido Helado",cuisine:"ice_cream",name:"Grido"}},"amenity/ice_cream|Häagen-Dazs":{tags:{amenity:"ice_cream",brand:"Häagen-Dazs",name:"Häagen-Dazs"}},"amenity/ice_cream|La Michoacana":{countryCodes:["mx"],matchNames:["paleteria la michoacana"],tags:{amenity:"ice_cream",brand:"La Michoacana","brand:wikidata":"Q17118857","brand:wikipedia":"en:Paletería La Michoacana",name:"La Michoacana"}},"amenity/ice_cream|Marble Slab Creamery":{countryCodes:["ca","us"],tags:{amenity:"ice_cream",brand:"Marble Slab Creamery","brand:wikidata":"Q17020087","brand:wikipedia":"en:Marble Slab Creamery",cuisine:"ice_cream",name:"Marble Slab Creamery"}},"amenity/ice_cream|Menchie's":{countryCodes:["ae","bh","bs","ca","cn","gb","in","jp","kw","qa","sa","us"],matchNames:["menchie's frozen yoghurt","menchie's frozen yogurt"],tags:{amenity:"ice_cream",brand:"Menchie's","brand:wikidata":"Q6816528","brand:wikipedia":"en:Menchie's Frozen Yogurt",cuisine:"frozen_yogurt",name:"Menchie's"}},"amenity/ice_cream|Ralph's Italian Ices":{countryCodes:["us"],matchNames:["ralphs famous italian ices & ice cream","ralphs famous italian ices and ice cream","ralphs italian ice","ralphs italian ices & ice cream","ralphs italian ices and ice cream"],tags:{amenity:"ice_cream",brand:"Ralph's Italian Ices","brand:wikidata":"Q62576909",cuisine:"ice_cream",name:"Ralph's Italian Ices",official_name:"Ralph's Famous Italian Ices"}},"amenity/ice_cream|Rita's Italian Ice":{countryCodes:["us"],matchNames:["ritas","ritas water ice"],tags:{amenity:"ice_cream",brand:"Rita's Italian Ice","brand:wikidata":"Q7336456","brand:wikipedia":"en:Rita's Italian Ice",cuisine:"ice_cream",name:"Rita's Italian Ice"}},"amenity/ice_cream|Yogurtland":{countryCodes:["ae","au","sg","th","us","ve"],tags:{amenity:"ice_cream",brand:"Yogurtland","brand:wikidata":"Q8054428","brand:wikipedia":"en:Yogurtland",cuisine:"frozen_yogurt",name:"Yogurtland",takeaway:"yes"}},"amenity/ice_cream|sweetFrog":{countryCodes:["us"],matchNames:["sweetfrog frozen yogurt","sweetfrog premium frozen yogurt"],tags:{amenity:"ice_cream",brand:"sweetFrog","brand:wikidata":"Q16952110","brand:wikipedia":"en:Sweet Frog",cuisine:"frozen_yogurt",name:"sweetFrog"}},"amenity/ice_cream|サーティワンアイスクリーム":{countryCodes:["jp"],tags:{amenity:"ice_cream",brand:"バスキン・ロビンス","brand:en":"Baskin-Robbins","brand:ja":"バスキン・ロビンス","brand:wikidata":"Q584601","brand:wikipedia":"ja:バスキン・ロビンス",cuisine:"ice_cream",name:"サーティワンアイスクリーム","name:en":"Baskin-Robbins","name:ja":"サーティワンアイスクリーム"}},"amenity/kindergarten|Children's Learning Adventure":{countryCodes:["us"],tags:{after_school:"yes",amenity:"kindergarten",brand:"Children's Learning Adventure","brand:wikidata":"Q64821213","brand:wikipedia":"en:Children's Learning Adventure",fee:"yes","isced:level":"0",name:"Children's Learning Adventure",nursery:"yes",preschool:"yes",short_name:"CLA"}},"amenity/kindergarten|Childtime":{countryCodes:["us"],matchNames:["childtime learning center","childtime learning centers"],tags:{amenity:"kindergarten",brand:"Childtime","brand:wikidata":"Q64877793",fee:"yes","isced:level":"0",name:"Childtime",nursery:"yes",preschool:"yes"}},"amenity/kindergarten|KinderCare":{countryCodes:["us"],tags:{after_school:"yes",alt_name:"KinderCare Learning Center",amenity:"kindergarten",brand:"KinderCare","brand:wikidata":"Q6410551","brand:wikipedia":"en:KinderCare Learning Centers",fee:"yes","isced:level":"0",max_age:"12",min_age:"6 weeks",name:"KinderCare",nursery:"yes",preschool:"yes"}},"amenity/kindergarten|La Petite Academy":{countryCodes:["us"],matchNames:["la petite"],tags:{amenity:"kindergarten",brand:"La Petite Academy","brand:wikidata":"Q64877784",fee:"yes","isced:level":"0",name:"La Petite Academy",nursery:"yes",preschool:"yes"}},"amenity/kindergarten|New Horizon Academy":{countryCodes:["us"],tags:{after_school:"yes",amenity:"kindergarten",brand:"New Horizon Academy","brand:wikidata":"Q64821306",fee:"yes","isced:level":"0",name:"New Horizon Academy",nursery:"yes",preschool:"yes"}},"amenity/kindergarten|The Children's Courtyard":{countryCodes:["us"],matchNames:["children's courtyard"],tags:{amenity:"kindergarten",brand:"The Children's Courtyard","brand:wikidata":"Q64877852",fee:"yes","isced:level":"0",name:"The Children's Courtyard",nursery:"yes",preschool:"yes"}},"amenity/kindergarten|Tutor Time":{countryCodes:["us"],matchNames:["tutor time child care","tutor time child care learning center","tutor time learning center","tutor time learning centers"],tags:{amenity:"kindergarten",brand:"Tutor Time","brand:wikidata":"Q64877826",fee:"yes","isced:level":"0",name:"Tutor Time",nursery:"yes",preschool:"yes"}},"amenity/money_transfer|Express Union":{countryCodes:["td"],matchTags:["amenity/bank"],nomatch:["amenity/bank|Banco Unión","amenity/bank|UnionBank"],tags:{amenity:"money_transfer",brand:"Express Union","brand:wikidata":"Q3062276","brand:wikipedia":"fr:Express Union",name:"Express Union"}},"amenity/money_transfer|MoneyGram":{countryCodes:["de","fr","gr"],tags:{amenity:"money_transfer",brand:"MoneyGram","brand:wikidata":"Q1944412","brand:wikipedia":"en:MoneyGram",name:"MoneyGram"}},"amenity/money_transfer|Orange Money":{countryCodes:["ml"],tags:{amenity:"money_transfer",brand:"Orange Money","brand:wikidata":"Q16668220","brand:wikipedia":"en:Orange Money",name:"Orange Money"}},"amenity/money_transfer|Western Union":{matchTags:["amenity/bureau_de_change"],nomatch:["amenity/bank|Western Union"],tags:{amenity:"money_transfer",brand:"Western Union","brand:wikidata":"Q861042","brand:wikipedia":"en:Western Union",name:"Western Union"}},"amenity/parking|SP+":{countryCodes:["ca","us"],matchNames:["central parking","central parking system","standard parking"],nomatch:["amenity/fuel|SP"],tags:{alt_name:"SP Plus",amenity:"parking",brand:"SP+","brand:wikidata":"Q7598289","brand:wikipedia":"en:SP Plus Corporation",fee:"yes",name:"SP+"}},"amenity/payment_centre|Abitab":{countryCodes:["uy"],matchTags:["amenity/bureau_de_change"],tags:{amenity:"payment_centre",brand:"Abitab","brand:wikidata":"Q16488129","brand:wikipedia":"es:Abitab",name:"Abitab"}},"amenity/payment_centre|Rapipago":{countryCodes:["ar"],tags:{amenity:"payment_centre",brand:"Rapipago","brand:wikidata":"Q6100413","brand:wikipedia":"es:Rapipago",name:"Rapipago"}},"amenity/payment_terminal|Qiwi":{countryCodes:["ru"],tags:{amenity:"payment_terminal",brand:"Qiwi","brand:wikidata":"Q4047736","brand:wikipedia":"en:Qiwi",name:"Qiwi"}},"amenity/payment_terminal|ПриватБанк":{countryCodes:["ua"],tags:{amenity:"payment_terminal",brand:"ПриватБанк","brand:wikidata":"Q1515015","brand:wikipedia":"en:PrivatBank",name:"ПриватБанк"}},"amenity/payment_terminal|Сбербанк":{tags:{amenity:"payment_terminal",brand:"Сбербанк",name:"Сбербанк"}},"amenity/payment_terminal|Элекснет":{countryCodes:["ru"],tags:{amenity:"payment_terminal",brand:"Элекснет","brand:wikidata":"Q4530795","brand:wikipedia":"ru:Элекснет",name:"Элекснет"}},"amenity/pharmacy|36,6":{countryCodes:["ru"],matchNames:["аптека 36,6"],tags:{amenity:"pharmacy",brand:"36,6","brand:wikidata":"Q226889","brand:wikipedia":"ru:36,6 (аптечная сеть)",healthcare:"pharmacy",name:"36,6"}},"amenity/pharmacy|Amavita":{countryCodes:["ch"],tags:{amenity:"pharmacy",brand:"Amavita",healthcare:"pharmacy",name:"Amavita"}},"amenity/pharmacy|Amcal":{countryCodes:["au"],matchNames:["amcal pharmacy"],tags:{amenity:"pharmacy",brand:"Amcal","brand:wikidata":"Q63367373",healthcare:"pharmacy",name:"Amcal"}},"amenity/pharmacy|Apollo Pharmacy":{countryCodes:["in"],nomatch:["shop/optician|Apollo-Optik"],tags:{amenity:"pharmacy",brand:"Apollo Pharmacy","brand:wikidata":"Q62562612",healthcare:"pharmacy",name:"Apollo Pharmacy"}},"amenity/pharmacy|Apotek Hjärtat":{countryCodes:["se"],tags:{amenity:"pharmacy",brand:"Apotek Hjärtat","brand:wikidata":"Q10416114","brand:wikipedia":"sv:Apotek Hjärtat",healthcare:"pharmacy",name:"Apotek Hjärtat"}},"amenity/pharmacy|Bartell Drugs":{countryCodes:["us"],tags:{amenity:"pharmacy",brand:"Bartell Drugs","brand:wikidata":"Q4865152","brand:wikipedia":"en:Bartell Drugs",healthcare:"pharmacy",name:"Bartell Drugs"}},"amenity/pharmacy|Benavides":{countryCodes:["mx"],tags:{amenity:"pharmacy",brand:"Benavides","brand:wikidata":"Q5435613","brand:wikipedia":"en:Farmacias Benavides",healthcare:"pharmacy",name:"Benavides"}},"amenity/pharmacy|Benu":{tags:{amenity:"pharmacy",brand:"Benu","brand:wikidata":"Q62562792",healthcare:"pharmacy",name:"Benu"}},"amenity/pharmacy|Blooms The Chemist":{countryCodes:["au"],tags:{amenity:"pharmacy",brand:"Blooms The Chemist","brand:wikidata":"Q63367543",healthcare:"pharmacy",name:"Blooms The Chemist",shop:"chemist"}},"amenity/pharmacy|Boots":{countryCodes:["gb"],matchNames:["boots pharmacy"],nomatch:["shop/chemist|Boots"],tags:{amenity:"pharmacy",brand:"Boots","brand:wikidata":"Q6123139","brand:wikipedia":"en:Boots UK",healthcare:"pharmacy",name:"Boots"}},"amenity/pharmacy|Boticas y Salud":{countryCodes:["pe"],tags:{amenity:"pharmacy",brand:"Boticas y Salud","brand:wikidata":"Q62563126",healthcare:"pharmacy",name:"Boticas y Salud"}},"amenity/pharmacy|Brookshire Brothers Pharmacy":{countryCodes:["us"],tags:{amenity:"pharmacy",brand:"Brookshire Brothers Pharmacy","brand:wikidata":"Q4975084","brand:wikipedia":"en:Brookshire Brothers",healthcare:"pharmacy",name:"Brookshire Brothers Pharmacy"}},"amenity/pharmacy|Brookshire's Pharmacy":{countryCodes:["us"],tags:{amenity:"pharmacy",brand:"Brookshire's Pharmacy",healthcare:"pharmacy",name:"Brookshire's Pharmacy"}},"amenity/pharmacy|CVS":{matchNames:["cvs pharmacy"],nomatch:["shop/chemist|CVS"],tags:{amenity:"pharmacy",brand:"CVS","brand:wikidata":"Q2078880","brand:wikipedia":"en:CVS Pharmacy",healthcare:"pharmacy",name:"CVS"}},"amenity/pharmacy|Camelia":{countryCodes:["lt"],tags:{amenity:"pharmacy",brand:"Camelia","brand:wikidata":"Q15867413","brand:wikipedia":"lt:Nemuno vaistinė",healthcare:"pharmacy",name:"Camelia"}},"amenity/pharmacy|Catena":{countryCodes:["ro"],tags:{amenity:"pharmacy",brand:"Catena","brand:wikidata":"Q24035728","brand:wikipedia":"ro:Farmacia Catena",healthcare:"pharmacy",name:"Catena"}},"amenity/pharmacy|Chemist King Discount Pharmacy":{countryCodes:["au"],matchNames:["chemist king","chemist king discount pharmacies"],tags:{amenity:"pharmacy",brand:"Chemist King Discount Pharmacy","brand:wikidata":"Q63367667",healthcare:"pharmacy",name:"Chemist King Discount Pharmacy"}},"amenity/pharmacy|Chemist Warehouse":{countryCodes:["au","nz"],tags:{amenity:"pharmacy",brand:"Chemist Warehouse","brand:wikidata":"Q48782120","brand:wikipedia":"en:Chemist Warehouse",healthcare:"pharmacy",name:"Chemist Warehouse"}},"amenity/pharmacy|Clicks":{countryCodes:["za"],tags:{amenity:"pharmacy",brand:"Clicks","brand:wikidata":"Q62563622",healthcare:"pharmacy",name:"Clicks"}},"amenity/pharmacy|Costco Pharmacy":{countryCodes:["us"],nomatch:["amenity/fuel|Costco Gasoline","shop/wholesale|Costco"],tags:{amenity:"pharmacy",brand:"Costco Pharmacy","brand:wikidata":"Q715583","brand:wikipedia":"en:Costco",healthcare:"pharmacy",name:"Costco Pharmacy"}},"amenity/pharmacy|Cruz Azul":{countryCodes:["ec"],matchNames:["farmacias cruz azul"],tags:{amenity:"pharmacy",brand:"Cruz Azul","brand:wikidata":"Q62108219",healthcare:"pharmacy",name:"Cruz Azul"}},"amenity/pharmacy|Cruz Verde":{countryCodes:["cl"],matchNames:["farmacias cruz verde"],tags:{amenity:"pharmacy",brand:"Cruz Verde","brand:wikidata":"Q5856071","brand:wikipedia":"es:Farmacias Cruz Verde",healthcare:"pharmacy",name:"Cruz Verde"}},"amenity/pharmacy|Day Lewis Pharmacy":{countryCodes:["gb"],tags:{amenity:"pharmacy",brand:"Day Lewis Pharmacy","brand:wikidata":"Q62563772",healthcare:"pharmacy",name:"Day Lewis Pharmacy"}},"amenity/pharmacy|Dbam o Zdrowie":{countryCodes:["pl"],tags:{amenity:"pharmacy",brand:"Dbam o Zdrowie","brand:wikidata":"Q62563833",healthcare:"pharmacy",name:"Dbam o Zdrowie"}},"amenity/pharmacy|Dr. Max":{countryCodes:["cz","pl","sk"],tags:{amenity:"pharmacy",brand:"Dr. Max","brand:wikidata":"Q56317371","brand:wikipedia":"fr:Dr.Max",healthcare:"pharmacy",name:"Dr. Max"}},"amenity/pharmacy|Droga Raia":{countryCodes:["br"],tags:{amenity:"pharmacy",brand:"Droga Raia","brand:wikidata":"Q10357101","brand:wikipedia":"pt:RaiaDrogasil",healthcare:"pharmacy",name:"Droga Raia"}},"amenity/pharmacy|Drogaria São Paulo":{countryCodes:["br"],tags:{amenity:"pharmacy",brand:"Drogaria São Paulo","brand:wikidata":"Q5308184","brand:wikipedia":"en:Grupo DPSP",healthcare:"pharmacy",name:"Drogaria São Paulo"}},"amenity/pharmacy|Drogasil":{countryCodes:["br"],tags:{amenity:"pharmacy",brand:"Drogasil","brand:wikidata":"Q5308185","brand:wikipedia":"pt:Drogasil",healthcare:"pharmacy",name:"Drogasil",wheelchair:"yes"}},"amenity/pharmacy|Duane Reade":{countryCodes:["us"],tags:{amenity:"pharmacy",brand:"Duane Reade","brand:wikidata":"Q5310380","brand:wikipedia":"en:Duane Reade",healthcare:"pharmacy",name:"Duane Reade"}},"amenity/pharmacy|Eurovaistinė":{countryCodes:["lt"],tags:{amenity:"pharmacy",brand:"Eurovaistinė","brand:wikidata":"Q267205","brand:wikipedia":"en:Euroapotheca",healthcare:"pharmacy",name:"Eurovaistinė"}},"amenity/pharmacy|Extrafarma":{countryCodes:["br"],tags:{amenity:"pharmacy",brand:"Extrafarma","brand:wikidata":"Q20055480","brand:wikipedia":"pt:Extrafarma",healthcare:"pharmacy",name:"Extrafarma"}},"amenity/pharmacy|Familiprix":{countryCodes:["ca"],tags:{amenity:"pharmacy",brand:"Familiprix","brand:wikidata":"Q3064881","brand:wikipedia":"en:Familiprix",healthcare:"pharmacy",name:"Familiprix"}},"amenity/pharmacy|Farmacenter~(Colombia)":{countryCodes:["co"],tags:{amenity:"pharmacy",brand:"Farmacenter","brand:wikidata":"Q62563928",healthcare:"pharmacy",name:"Farmacenter"}},"amenity/pharmacy|Farmacenter~(Paraguay)":{countryCodes:["py"],tags:{amenity:"pharmacy",brand:"Farmacenter","brand:wikidata":"",healthcare:"pharmacy",name:"Farmacenter"}},"amenity/pharmacy|Farmacia Benavides":{countryCodes:["mx"],tags:{amenity:"pharmacy",brand:"Farmacia Benavides","brand:wikidata":"Q5435613","brand:wikipedia":"en:Farmacias Benavides",healthcare:"pharmacy",name:"Farmacia Benavides"}},"amenity/pharmacy|Farmacia Familiei":{countryCodes:["md"],tags:{amenity:"pharmacy",brand:"Farmacia Familiei",healthcare:"pharmacy",name:"Farmacia Familiei"}},"amenity/pharmacy|Farmacia Guadalajara":{countryCodes:["mx"],matchNames:["farmacias guadalajara"],tags:{amenity:"pharmacy",brand:"Farmacia Guadalajara","brand:wikidata":"Q5435609","brand:wikipedia":"en:Farmacias Guadalajara",healthcare:"pharmacy",name:"Farmacia Guadalajara"}},"amenity/pharmacy|Farmacias Ahumada":{tags:{amenity:"pharmacy",brand:"Farmacias Ahumada","brand:wikidata":"Q5856069","brand:wikipedia":"es:Farmacias Ahumada",healthcare:"pharmacy",name:"Farmacias Ahumada"}},"amenity/pharmacy|Farmacias Económicas~(Ecuador)":{countryCodes:["ec"],tags:{amenity:"pharmacy",brand:"Farmacias Económicas","brand:wikidata":"Q62108380",healthcare:"pharmacy",name:"Farmacias Económicas"}},"amenity/pharmacy|Farmacias Económicas~(El Salvador)":{countryCodes:["sv"],tags:{amenity:"pharmacy",brand:"Farmacias Económicas","brand:wikidata":"Q62108397",healthcare:"pharmacy",name:"Farmacias Económicas"}},"amenity/pharmacy|Farmacias Similares":{countryCodes:["cl","gt","mx"],matchNames:["similares"],tags:{amenity:"pharmacy",brand:"Farmacias Similares","brand:wikidata":"Q62564610",healthcare:"pharmacy",name:"Farmacias Similares"}},"amenity/pharmacy|Farmacias del Ahorro":{countryCodes:["mx"],matchNames:["farmacia del ahorro"],tags:{amenity:"pharmacy",brand:"Farmacias del Ahorro","brand:wikidata":"Q62086647",healthcare:"pharmacy",name:"Farmacias del Ahorro"}},"amenity/pharmacy|Farmacias del Dr. Simi":{countryCodes:["cl","gt","mx"],tags:{amenity:"pharmacy",brand:"Farmacias del Dr. Simi","brand:wikidata":"Q62564610",healthcare:"pharmacy",name:"Farmacias del Dr. Simi"}},"amenity/pharmacy|Farmacity":{countryCodes:["ra"],tags:{amenity:"pharmacy",brand:"Farmacity","brand:wikidata":"Q5856076","brand:wikipedia":"es:Farmacity",healthcare:"pharmacy",name:"Farmacity"}},"amenity/pharmacy|Farmacorp":{countryCodes:["bo"],tags:{amenity:"pharmacy",brand:"Farmacorp",healthcare:"pharmacy",name:"Farmacorp"}},"amenity/pharmacy|Farmahorro":{tags:{amenity:"pharmacy",brand:"Farmahorro","brand:wikidata":"Q20015002","brand:wikipedia":"es:Farmahorro",healthcare:"pharmacy",name:"Farmahorro"}},"amenity/pharmacy|Farmatodo":{tags:{amenity:"pharmacy",brand:"Farmatodo","brand:wikidata":"Q5856092","brand:wikipedia":"es:Farmatodo",healthcare:"pharmacy",name:"Farmatodo"}},"amenity/pharmacy|Farmácia São João":{tags:{amenity:"pharmacy",brand:"Farmácia São João",healthcare:"pharmacy",name:"Farmácia São João"}},"amenity/pharmacy|Felicia":{countryCodes:["md"],tags:{amenity:"pharmacy",brand:"Felicia","brand:wikidata":"Q62564805",healthcare:"pharmacy",name:"Felicia"}},"amenity/pharmacy|Fybeca":{countryCodes:["ec"],tags:{amenity:"pharmacy",brand:"Fybeca","brand:wikidata":"Q62564822",healthcare:"pharmacy",name:"Fybeca"}},"amenity/pharmacy|Generika":{countryCodes:["ph"],matchNames:["generika drugstore"],tags:{amenity:"pharmacy",brand:"Generika","brand:wikidata":"Q62564876",healthcare:"pharmacy",name:"Generika"}},"amenity/pharmacy|Gintarinė vaistinė":{countryCodes:["lt"],tags:{amenity:"pharmacy",brand:"Gintarinė vaistinė","brand:wikidata":"Q15857801","brand:wikipedia":"lt:Gintarinė vaistinė",healthcare:"pharmacy",name:"Gintarinė vaistinė"}},"amenity/pharmacy|Guardian~(Asia)":{countryCodes:["bn","id","kh","my","sg","vn"],tags:{amenity:"pharmacy",brand:"Guardian","brand:wikidata":"Q63371124",healthcare:"pharmacy",name:"Guardian"}},"amenity/pharmacy|Guardian~(Australia)":{countryCodes:["au"],matchNames:["guardian pharmacies","guardian pharmacy"],tags:{brand:"Guardian","brand:wikidata":"Q63367814",healthcare:"pharmacy",name:"Guardian"}},"amenity/pharmacy|H-E-B Pharmacy":{countryCodes:["us"],tags:{amenity:"pharmacy",brand:"H-E-B Pharmacy","brand:wikidata":"Q830621","brand:wikipedia":"en:H-E-B",healthcare:"pharmacy",name:"H-E-B Pharmacy"}},"amenity/pharmacy|Health Mart":{countryCodes:["us"],matchNames:["health mart pharmacy"],tags:{amenity:"pharmacy",brand:"Health Mart","brand:wikidata":"Q5690597","brand:wikipedia":"en:Health Mart",healthcare:"pharmacy",name:"Health Mart"}},"amenity/pharmacy|Hy-Vee Pharmacy":{countryCodes:["us"],tags:{amenity:"pharmacy",brand:"Hy-Vee Pharmacy","brand:wikidata":"Q1639719","brand:wikipedia":"en:Hy-Vee",healthcare:"pharmacy",name:"Hy-Vee Pharmacy"}},"amenity/pharmacy|I.D.A.":{tags:{amenity:"pharmacy",brand:"I.D.A.",healthcare:"pharmacy",name:"I.D.A."}},"amenity/pharmacy|Inkafarma":{countryCodes:["pe"],tags:{amenity:"pharmacy",brand:"Inkafarma","brand:wikidata":"Q10997748","brand:wikipedia":"es:Inkafarma",healthcare:"pharmacy",name:"Inkafarma"}},"amenity/pharmacy|Jean Coutu":{countryCodes:["ca"],tags:{amenity:"pharmacy",brand:"Jean Coutu","brand:wikidata":"Q3117457","brand:wikipedia":"en:Jean Coutu Group",healthcare:"pharmacy",name:"Jean Coutu"}},"amenity/pharmacy|Kimia Farma":{countryCodes:["id"],tags:{amenity:"pharmacy",brand:"Kimia Farma","brand:wikidata":"Q11264892","brand:wikipedia":"en:Kimia Farma",healthcare:"pharmacy",name:"Kimia Farma"}},"amenity/pharmacy|Kinney Drugs":{countryCodes:["us"],tags:{amenity:"pharmacy",brand:"Kinney Drugs","brand:wikidata":"Q6414090","brand:wikipedia":"en:Kinney Drugs",healthcare:"pharmacy",name:"Kinney Drugs"}},"amenity/pharmacy|Kroger Pharmacy":{countryCodes:["us"],tags:{amenity:"pharmacy",brand:"Kroger Pharmacy",healthcare:"pharmacy",name:"Kroger Pharmacy"}},"amenity/pharmacy|Kronans Apotek":{countryCodes:["se"],tags:{amenity:"pharmacy",brand:"Kronans Apotek",healthcare:"pharmacy",name:"Kronans Apotek"}},"amenity/pharmacy|Lloyds Pharmacy":{countryCodes:["be","gb","ie","im"],matchNames:["lloyds"],tags:{amenity:"pharmacy",brand:"Lloyds Pharmacy","brand:wikidata":"Q6662870","brand:wikipedia":"en:LloydsPharmacy",healthcare:"pharmacy",name:"Lloyds Pharmacy"}},"amenity/pharmacy|London Drugs":{countryCodes:["ca"],tags:{amenity:"pharmacy",brand:"London Drugs","brand:wikidata":"Q3258955","brand:wikipedia":"en:London Drugs",healthcare:"pharmacy",name:"London Drugs"}},"amenity/pharmacy|Longs Drugs~(Hawaii)":{countryCodes:["us"],tags:{amenity:"pharmacy",brand:"Longs Drugs","brand:wikidata":"Q16931196","brand:wikipedia":"en:Longs Drugs",healthcare:"pharmacy",name:"Longs Drugs",short_name:"Longs"}},"amenity/pharmacy|Mannings":{countryCodes:["cn","hk","mo"],tags:{amenity:"pharmacy",brand:"Mannings","brand:wikidata":"Q13646560","brand:wikipedia":"en:Mannings",healthcare:"pharmacy",name:"Mannings"}},"amenity/pharmacy|Marc's Pharmacy":{countryCodes:["us"],nomatch:["shop/supermarket|Marc's"],tags:{amenity:"pharmacy",brand:"Marc's","brand:wikidata":"Q17080259","brand:wikipedia":"en:Marc's",healthcare:"pharmacy",name:"Marc's Pharmacy"}},"amenity/pharmacy|Mercury Drug":{countryCodes:["ph"],tags:{amenity:"pharmacy",brand:"Mercury Drug","brand:wikidata":"Q6818610","brand:wikipedia":"en:Mercury Drug",healthcare:"pharmacy",name:"Mercury Drug"}},"amenity/pharmacy|Mifarma":{countryCodes:["pe"],tags:{amenity:"pharmacy",brand:"Mifarma","brand:wikidata":"Q62564998",healthcare:"pharmacy",name:"Mifarma"}},"amenity/pharmacy|Multipharma":{countryCodes:["be"],tags:{amenity:"pharmacy",brand:"Multipharma","brand:wikidata":"Q62565018",healthcare:"pharmacy",name:"Multipharma"}},"amenity/pharmacy|Mēness aptieka":{countryCodes:["lv"],tags:{amenity:"pharmacy",brand:"Mēness aptieka","brand:wikidata":"Q57583051",healthcare:"pharmacy",name:"Mēness aptieka"}},"amenity/pharmacy|Pague Menos":{countryCodes:["br"],matchNames:["farmácia pague menos"],tags:{amenity:"pharmacy",brand:"Pague Menos","brand:wikidata":"Q7124466","brand:wikipedia":"pt:Pague Menos",healthcare:"pharmacy",name:"Pague Menos"}},"amenity/pharmacy|Panvel":{countryCodes:["br"],tags:{amenity:"pharmacy",brand:"Panvel","brand:wikipedia":"pt:Panvel","branf:wikidata":"Q10344254",healthcare:"pharmacy",name:"Panvel"}},"amenity/pharmacy|PharmaSave~(Australia)":{countryCodes:["au"],nomatch:["amenity/pharmacy|Pharmasave~(Canada)"],tags:{amenity:"pharmacy",brand:"PharmaSave","brand:wikidata":"Q63367906",healthcare:"pharmacy",name:"PharmaSave"}},"amenity/pharmacy|Pharmacie Principale":{tags:{amenity:"pharmacy",brand:"Pharmacie Principale","brand:wikidata":"Q1547749","brand:wikipedia":"fr:Groupe PP Holding",healthcare:"pharmacy",name:"Pharmacie Principale"}},"amenity/pharmacy|Pharmacy 4 Less":{countryCodes:["au"],tags:{amenity:"pharmacy",brand:"Pharmacy 4 Less","brand:wikidata":"Q63367608",healthcare:"pharmacy",name:"Pharmacy 4 Less"}},"amenity/pharmacy|Pharmaprix":{countryCodes:["ca"],tags:{amenity:"pharmacy",brand:"Pharmaprix","brand:wikidata":"Q1820137","brand:wikipedia":"en:Shoppers Drug Mart",healthcare:"pharmacy",name:"Pharmaprix"}},"amenity/pharmacy|Pharmasave~(Canada)":{countryCodes:["ca"],nomatch:["amenity/pharmacy|Pharmasave~(Australia)"],tags:{amenity:"pharmacy",brand:"Pharmasave","brand:wikidata":"Q17093822","brand:wikipedia":"en:Pharmasave",healthcare:"pharmacy",name:"Pharmasave"}},"amenity/pharmacy|Priceline Pharmacy":{countryCodes:["au"],matchNames:["priceline"],tags:{amenity:"pharmacy",brand:"Priceline Pharmacy","brand:wikidata":"Q7242652","brand:wikipedia":"en:Priceline (Australia)",healthcare:"pharmacy",name:"Priceline Pharmacy"}},"amenity/pharmacy|Punto Farma~(Colombia)":{countryCodes:["co"],tags:{amenity:"pharmacy",brand:"Punto Farma","brand:wikidata":"Q62595271",healthcare:"pharmacy",name:"Punto Farma"}},"amenity/pharmacy|Punto Farma~(Honduras)":{countryCodes:["hn"],tags:{amenity:"pharmacy",brand:"Punto Farma","brand:wikidata":"Q62595229",healthcare:"pharmacy",name:"Punto Farma"}},"amenity/pharmacy|Punto Farma~(Paraguay)":{countryCodes:["py"],tags:{amenity:"pharmacy",brand:"Punto Farma","brand:wikidata":"Q62595220",healthcare:"pharmacy",name:"Punto Farma"}},"amenity/pharmacy|Rexall":{countryCodes:["ca","us"],tags:{amenity:"pharmacy",brand:"Rexall","brand:wikidata":"Q7319360","brand:wikipedia":"en:Rexall",healthcare:"pharmacy",name:"Rexall"}},"amenity/pharmacy|Rite Aid":{countryCodes:["us"],matchNames:["rite aid pharmacy"],nomatch:["shop/chemist|Rite Aid"],tags:{amenity:"pharmacy",brand:"Rite Aid","brand:wikidata":"Q3433273","brand:wikipedia":"en:Rite Aid",healthcare:"pharmacy",name:"Rite Aid"}},"amenity/pharmacy|Rose Pharmacy":{countryCodes:["ph"],tags:{amenity:"pharmacy",brand:"Rose Pharmacy","brand:wikidata":"Q62663208",healthcare:"pharmacy",name:"Rose Pharmacy"}},"amenity/pharmacy|Rowlands Pharmacy":{countryCodes:["gb"],tags:{amenity:"pharmacy",brand:"Rowlands Pharmacy","brand:wikidata":"Q62663235",healthcare:"pharmacy",name:"Rowlands Pharmacy"}},"amenity/pharmacy|SalcoBrand":{countryCodes:["cl"],matchNames:["farmacias salcobrand"],tags:{amenity:"pharmacy",brand:"SalcoBrand","brand:wikidata":"Q2877054","brand:wikipedia":"es:Farmacias Salcobrand",healthcare:"pharmacy",name:"SalcoBrand"}},"amenity/pharmacy|Sana Sana":{countryCodes:["ec"],matchNames:["farmacias sana sana"],tags:{amenity:"pharmacy",brand:"Sana Sana","brand:wikidata":"Q62564499",healthcare:"pharmacy",name:"Sana Sana"}},"amenity/pharmacy|Sensiblu":{countryCodes:["ro"],tags:{amenity:"pharmacy",brand:"Sensiblu","brand:wikidata":"Q12740640","brand:wikipedia":"ro:Sensiblu",healthcare:"pharmacy",name:"Sensiblu"}},"amenity/pharmacy|Shoppers Drug Mart":{countryCodes:["ca"],tags:{amenity:"pharmacy",brand:"Shoppers Drug Mart","brand:wikidata":"Q1820137","brand:wikipedia":"en:Shoppers Drug Mart",healthcare:"pharmacy",name:"Shoppers Drug Mart"}},"amenity/pharmacy|South Star Drug":{countryCodes:["ph"],tags:{amenity:"pharmacy",brand:"South Star Drug","brand:wikidata":"Q7568544","brand:wikipedia":"en:South Star Drug",healthcare:"pharmacy",name:"South Star Drug"}},"amenity/pharmacy|Superdrug":{countryCodes:["gb"],nomatch:["shop/chemist|Superdrug"],tags:{amenity:"pharmacy",brand:"Superdrug","brand:wikidata":"Q7643261","brand:wikipedia":"en:Superdrug",healthcare:"pharmacy",name:"Superdrug"}},"amenity/pharmacy|São João":{countryCodes:["br"],tags:{amenity:"pharmacy",brand:"São João","brand:wikidata":"Q62663306",healthcare:"pharmacy",name:"São João"}},"amenity/pharmacy|Słoneczna":{countryCodes:["pl"],tags:{amenity:"pharmacy",brand:"Słoneczna",healthcare:"pharmacy",name:"Słoneczna"}},"amenity/pharmacy|TGP":{countryCodes:["ph"],tags:{amenity:"pharmacy",brand:"The Generics Pharmacy","brand:wikidata":"Q61948677",healthcare:"pharmacy",name:"TGP",official_name:"The Generics Pharmacy"}},"amenity/pharmacy|TerryWhite Chemmart":{countryCodes:["au"],matchNames:["terrywhite","terrywhite chemist","terrywhite chemists"],tags:{amenity:"pharmacy",brand:"TerryWhite Chemmart","brand:wikidata":"Q24089773","brand:wikipedia":"en:Terry White Chemmart",healthcare:"pharmacy",name:"TerryWhite Chemmart"}},"amenity/pharmacy|UFS":{countryCodes:["au"],matchNames:["ufs dispensaries"],tags:{amenity:"pharmacy",brand:"UFS","brand:wikidata":"Q63367573",healthcare:"pharmacy",name:"UFS"}},"amenity/pharmacy|Unichem Pharmacy":{countryCodes:["nz"],tags:{amenity:"pharmacy",brand:"Unichem Pharmacy","brand:wikidata":"Q62663379",healthcare:"pharmacy",name:"Unichem Pharmacy"}},"amenity/pharmacy|Uniprix":{countryCodes:["ca"],tags:{amenity:"pharmacy",brand:"Uniprix","brand:wikidata":"Q683265","brand:wikipedia":"en:Uniprix",healthcare:"pharmacy",name:"Uniprix"}},"amenity/pharmacy|Walgreens":{countryCodes:["us"],matchNames:["walgreens pharmacy"],nomatch:["shop/chemist|Walgreens"],tags:{amenity:"pharmacy",brand:"Walgreens","brand:wikidata":"Q1591889","brand:wikipedia":"en:Walgreens",healthcare:"pharmacy",name:"Walgreens"}},"amenity/pharmacy|Walmart Pharmacy":{countryCodes:["ca","us"],tags:{amenity:"pharmacy",brand:"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"en:Walmart",healthcare:"pharmacy",name:"Walmart Pharmacy"}},"amenity/pharmacy|Watsons":{nomatch:["shop/chemist|Watsons"],tags:{amenity:"pharmacy",brand:"Watsons","brand:wikidata":"Q7974785","brand:wikipedia":"en:Watsons",healthcare:"pharmacy",name:"Watsons"}},"amenity/pharmacy|Well Pharmacy":{countryCodes:["gb"],matchNames:["well"],tags:{amenity:"pharmacy",brand:"Well Pharmacy","brand:wikidata":"Q7726524","brand:wikipedia":"en:Well Pharmacy",healthcare:"pharmacy",name:"Well Pharmacy"}},"amenity/pharmacy|Ziko Apteka":{countryCodes:["pl"],tags:{amenity:"pharmacy",brand:"Ziko Apteka","brand:wikidata":"Q63432892",healthcare:"pharmacy",name:"Ziko Apteka",short_name:"Ziko"}},"amenity/pharmacy|Φαρμακειο":{countryCodes:["cy","gr"],tags:{amenity:"pharmacy",brand:"Φαρμακειο",healthcare:"pharmacy",name:"Φαρμακειο"}},"amenity/pharmacy|А-мега":{tags:{amenity:"pharmacy",brand:"А-мега",healthcare:"pharmacy",name:"А-мега"}},"amenity/pharmacy|А5":{countryCodes:["ru"],tags:{amenity:"pharmacy",brand:"А5","brand:wikidata":"Q62663476",healthcare:"pharmacy",name:"А5"}},"amenity/pharmacy|Алоэ":{tags:{amenity:"pharmacy",brand:"Алоэ",healthcare:"pharmacy",name:"Алоэ"}},"amenity/pharmacy|Бажаємо здоров'я":{countryCodes:["ua"],tags:{amenity:"pharmacy",brand:"Бажаємо здоров'я",healthcare:"pharmacy",name:"Бажаємо здоров'я"}},"amenity/pharmacy|Бережная аптека":{countryCodes:["ru"],tags:{amenity:"pharmacy",brand:"Бережная аптека","brand:wikidata":"Q62664194",healthcare:"pharmacy",name:"Бережная аптека"}},"amenity/pharmacy|Будь здоров":{countryCodes:["ru","ua"],tags:{amenity:"pharmacy",brand:"Будь здоров",healthcare:"pharmacy",name:"Будь здоров"}},"amenity/pharmacy|Вита":{countryCodes:["ru"],tags:{amenity:"pharmacy",brand:"Вита",healthcare:"pharmacy",name:"Вита"}},"amenity/pharmacy|Горздрав":{countryCodes:["ru"],tags:{amenity:"pharmacy",brand:"Горздрав",healthcare:"pharmacy",name:"Горздрав"}},"amenity/pharmacy|Добрая аптека":{countryCodes:["ru"],tags:{amenity:"pharmacy",brand:"Добрая аптека",healthcare:"pharmacy",name:"Добрая аптека"}},"amenity/pharmacy|Доктор Столетов":{tags:{amenity:"pharmacy",brand:"Доктор Столетов",healthcare:"pharmacy",name:"Доктор Столетов"}},"amenity/pharmacy|Живика":{countryCodes:["ru"],tags:{amenity:"pharmacy",brand:"Живика",healthcare:"pharmacy",name:"Живика"}},"amenity/pharmacy|Здоровье":{countryCodes:["kz","ru","ua"],tags:{amenity:"pharmacy",brand:"Здоровье",healthcare:"pharmacy",name:"Здоровье"}},"amenity/pharmacy|Зеленая аптека":{countryCodes:["by"],tags:{amenity:"pharmacy",brand:"Зеленая аптека",healthcare:"pharmacy",name:"Зеленая аптека"}},"amenity/pharmacy|Имплозия":{countryCodes:["ru"],tags:{amenity:"pharmacy",brand:"Имплозия",healthcare:"pharmacy",name:"Имплозия"}},"amenity/pharmacy|Классика":{countryCodes:["ru"],tags:{amenity:"pharmacy",brand:"Классика",healthcare:"pharmacy",name:"Классика"}},"amenity/pharmacy|Ладушка":{countryCodes:["ru"],tags:{amenity:"pharmacy",brand:"Ладушка",healthcare:"pharmacy",name:"Ладушка"}},"amenity/pharmacy|Максавит":{countryCodes:["ru"],tags:{amenity:"pharmacy",brand:"Максавит",healthcare:"pharmacy",name:"Максавит"}},"amenity/pharmacy|Марешки":{countryCodes:["bg"],tags:{amenity:"pharmacy",brand:"Марешки",healthcare:"pharmacy",name:"Марешки"}},"amenity/pharmacy|Мед-сервіс":{countryCodes:["ua"],tags:{amenity:"pharmacy",brand:"Мед-сервіс",healthcare:"pharmacy",name:"Мед-сервіс"}},"amenity/pharmacy|Мелодия здоровья":{countryCodes:["ru"],tags:{amenity:"pharmacy",brand:"Мелодия здоровья",healthcare:"pharmacy",name:"Мелодия здоровья"}},"amenity/pharmacy|Невис":{countryCodes:["ru"],tags:{amenity:"pharmacy",brand:"Невис",healthcare:"pharmacy",name:"Невис"}},"amenity/pharmacy|Неофарм":{tags:{amenity:"pharmacy",brand:"Неофарм",healthcare:"pharmacy",name:"Неофарм"}},"amenity/pharmacy|Норма":{countryCodes:["ru"],tags:{amenity:"pharmacy",brand:"Норма",healthcare:"pharmacy",name:"Норма"}},"amenity/pharmacy|Озерки":{countryCodes:["ru"],tags:{amenity:"pharmacy",brand:"Озерки",healthcare:"pharmacy",name:"Озерки"}},"amenity/pharmacy|Панацея":{countryCodes:["kz","ru","ua"],tags:{amenity:"pharmacy",brand:"Панацея",healthcare:"pharmacy",name:"Панацея"}},"amenity/pharmacy|Первая помощь":{countryCodes:["ru"],tags:{amenity:"pharmacy",brand:"Первая помощь",healthcare:"pharmacy",name:"Первая помощь"}},"amenity/pharmacy|Планета здоровья":{countryCodes:["by","ru"],tags:{amenity:"pharmacy",brand:"Планета здоровья",healthcare:"pharmacy",name:"Планета здоровья"}},"amenity/pharmacy|Подорожник":{countryCodes:["ua"],tags:{amenity:"pharmacy",brand:"Подорожник",healthcare:"pharmacy",name:"Подорожник"}},"amenity/pharmacy|Радуга":{tags:{amenity:"pharmacy",brand:"Радуга",healthcare:"pharmacy",name:"Радуга"}},"amenity/pharmacy|Ригла":{countryCodes:["ru"],tags:{amenity:"pharmacy",brand:"Ригла","brand:wikidata":"Q4394431","brand:wikipedia":"ru:Ригла",healthcare:"pharmacy",name:"Ригла"}},"amenity/pharmacy|Семейная":{countryCodes:["kz","ru"],tags:{amenity:"pharmacy",brand:"Семейная",healthcare:"pharmacy",name:"Семейная"}},"amenity/pharmacy|Семейная аптека":{countryCodes:["ru","ua"],tags:{amenity:"pharmacy",brand:"Семейная аптека",healthcare:"pharmacy",name:"Семейная аптека"}},"amenity/pharmacy|Социальная аптека":{countryCodes:["ru","ua"],tags:{amenity:"pharmacy",brand:"Социальная аптека",healthcare:"pharmacy",name:"Социальная аптека"}},"amenity/pharmacy|Столички":{countryCodes:["ru"],tags:{amenity:"pharmacy",brand:"Столички",healthcare:"pharmacy",name:"Столички"}},"amenity/pharmacy|Фармакопейка":{countryCodes:["ru"],tags:{amenity:"pharmacy",brand:"Фармакопейка",healthcare:"pharmacy",name:"Фармакопейка"}},"amenity/pharmacy|Фармакор":{countryCodes:["ru"],tags:{amenity:"pharmacy",brand:"Фармакор",healthcare:"pharmacy",name:"Фармакор"}},"amenity/pharmacy|Фармація":{countryCodes:["ua"],tags:{amenity:"pharmacy",brand:"Фармація",healthcare:"pharmacy",name:"Фармація"}},"amenity/pharmacy|Фармленд":{countryCodes:["ru"],tags:{amenity:"pharmacy",brand:"Фармленд",healthcare:"pharmacy",name:"Фармленд"}},"amenity/pharmacy|Центральная аптека":{countryCodes:["by","kz","ru","ua","uz"],tags:{amenity:"pharmacy",brand:"Центральная аптека",healthcare:"pharmacy",name:"Центральная аптека"}},"amenity/pharmacy|סופר-פארם":{countryCodes:["il"],tags:{amenity:"pharmacy",brand:"סופר-פארם","brand:he":"סופר-פארם","brand:wikidata":"Q13220217","brand:wikipedia":"en:Super-Pharm",healthcare:"pharmacy",name:"סופר-פארם","name:he":"סופר-פארם"}},"amenity/pharmacy|くすりの福太郎":{countryCodes:["jp"],tags:{amenity:"pharmacy",brand:"くすりの福太郎","brand:en":"Kusurino FUKUTARO","brand:ja":"くすりの福太郎","brand:wikidata":"Q17214460","brand:wikipedia":"ja:くすりの福太郎",healthcare:"pharmacy",name:"くすりの福太郎","name:en":"Kusurino Fukutaro","name:ja":"くすりの福太郎"}},"amenity/pharmacy|さくら薬局":{countryCodes:["jp"],tags:{amenity:"pharmacy",brand:"さくら薬局","brand:ja":"さくら薬局",healthcare:"pharmacy",name:"さくら薬局","name:ja":"さくら薬局"}},"amenity/pharmacy|ウェルパーク":{countryCodes:["jp"],tags:{amenity:"pharmacy",brand:"ウェルパーク","brand:ja":"ウェルパーク","brand:wikidata":"Q11288610","brand:wikipedia":"ja:ウェルパーク",healthcare:"pharmacy",name:"ウェルパーク","name:en":"Welpark","name:ja":"ウェルパーク"}},"amenity/pharmacy|ウエルシア":{countryCodes:["jp"],tags:{amenity:"pharmacy",brand:"ウエルシア","brand:en":"Welcia","brand:ja":"ウエルシア","brand:wikidata":"Q11288684","brand:wikipedia":"ja:ウエルシアホールディングス",healthcare:"pharmacy",name:"ウエルシア","name:en":"Welcia","name:ja":"ウエルシア"}},"amenity/pharmacy|ウエルシア薬局":{countryCodes:["jp"],tags:{amenity:"pharmacy",brand:"ウエルシア薬局","brand:en":"Welcia Yakkyoku","brand:ja":"ウエルシア薬局","brand:wikidata":"Q11288687","brand:wikipedia":"ja:ウエルシア薬局",healthcare:"pharmacy",name:"ウエルシア薬局","name:en":"Welcia Yakkyoku","name:ja":"ウエルシア薬局"}},"amenity/pharmacy|カワチ薬品":{countryCodes:["jp"],tags:{amenity:"pharmacy",brand:"カワチ薬品","brand:en":"Cawachi","brand:ja":"カワチ薬品","brand:wikidata":"Q11295397","brand:wikipedia":"ja:カワチ薬品",healthcare:"pharmacy",name:"カワチ薬品","name:en":"Cawachi","name:ja":"カワチ薬品"}},"amenity/pharmacy|キリン堂":{countryCodes:["jp"],tags:{amenity:"pharmacy",brand:"キリン堂","brand:en":"Kirindo","brand:ja":"キリン堂","brand:wikidata":"Q11297751","brand:wikipedia":"ja:キリン堂",healthcare:"pharmacy",name:"キリン堂","name:en":"Kirindo","name:ja":"キリン堂"}},"amenity/pharmacy|クスリのアオキ":{countryCodes:["jp"],tags:{amenity:"pharmacy",brand:"クスリのアオキ","brand:ja":"クスリのアオキ",healthcare:"pharmacy",name:"クスリのアオキ","name:ja":"クスリのアオキ"}},"amenity/pharmacy|クリエイト":{countryCodes:["jp"],tags:{amenity:"pharmacy",brand:"クリエイト","brand:en":"Create","brand:ja":"クリエイト","brand:wikidata":"Q11299163","brand:wikipedia":"ja:クリエイトSDホールディングス",healthcare:"pharmacy",name:"クリエイト","name:en":"Create","name:ja":"クリエイト"}},"amenity/pharmacy|クリエイトSD":{countryCodes:["jp"],tags:{amenity:"pharmacy",brand:"クリエイトSD","brand:ja":"クリエイトSD",healthcare:"pharmacy",name:"クリエイトSD","name:ja":"クリエイトSD"}},"amenity/pharmacy|ココカラファイン":{countryCodes:["jp"],tags:{amenity:"pharmacy",brand:"ココカラファイン","brand:ja":"ココカラファイン","brand:wikidata":"Q11301948","brand:wikipedia":"ja:ココカラファイン",healthcare:"pharmacy",name:"ココカラファイン","name:en":"Cocokara Fine","name:ja":"ココカラファイン"}},"amenity/pharmacy|サツドラ":{countryCodes:["jp"],tags:{amenity:"pharmacy",brand:"サツドラ","brand:ja":"サツドラ",healthcare:"pharmacy",name:"サツドラ","name:ja":"サツドラ"}},"amenity/pharmacy|サンドラッグ":{countryCodes:["jp"],tags:{amenity:"pharmacy",brand:"サンドラッグ","brand:ja":"サンドラッグ","brand:wikidata":"Q11305867","brand:wikipedia":"ja:サンドラッグ",healthcare:"pharmacy",name:"サンドラッグ","name:en":"Sundrug","name:ja":"サンドラッグ"}},"amenity/pharmacy|スギ薬局":{countryCodes:["jp"],nomatch:["shop/chemist|スギ薬局"],tags:{amenity:"pharmacy",brand:"スギ薬局","brand:en":"Sugi Pharmacy","brand:ja":"スギ薬局","brand:wikidata":"Q11311460","brand:wikipedia":"ja:スギ薬局",healthcare:"pharmacy",name:"スギ薬局","name:en":"Sugi Pharmacy","name:ja":"スギ薬局"}},"amenity/pharmacy|セイジョー":{countryCodes:["jp"],tags:{amenity:"pharmacy",brand:"セイジョー","brand:en":"Seijo","brand:ja":"セイジョー","brand:wikidata":"Q11314133","brand:wikipedia":"ja:セイジョー",healthcare:"pharmacy",name:"セイジョー","name:en":"Seijo","name:ja":"セイジョー"}},"amenity/pharmacy|ダイコクドラッグ":{countryCodes:["jp"],tags:{amenity:"pharmacy",brand:"ダイコクドラッグ","brand:en":"Daikoku Drug","brand:ja":"ダイコクドラッグ","brand:wikidata":"Q11316754","brand:wikipedia":"ja:ダイコク",healthcare:"pharmacy",name:"ダイコクドラッグ","name:en":"Daikoku Drug","name:ja":"ダイコクドラッグ"}},"amenity/pharmacy|ツルハドラッグ":{countryCodes:["jp"],tags:{amenity:"pharmacy",brand:"ツルハドラッグ","brand:en":"Tsuruha","brand:ja":"ツルハドラッグ","brand:wikidata":"Q11318826","brand:wikipedia":"ja:ツルハ",healthcare:"pharmacy",name:"ツルハドラッグ","name:en":"Tsuruha","name:ja":"ツルハドラッグ"}},"amenity/pharmacy|トモズ":{countryCodes:["jp"],matchNames:["トモズエキスプレス"],tags:{amenity:"pharmacy",brand:"トモズ","brand:en":"Tomod's","brand:ja":"トモズ","brand:wikidata":"Q7820097","brand:wikipedia":"ja:トモズ",healthcare:"pharmacy",name:"トモズ","name:en":"Tomod's","name:ja":"トモズ"}},"amenity/pharmacy|ドラッグセイムス":{countryCodes:["jp"],tags:{amenity:"pharmacy",brand:"ドラッグセイムス","brand:ja":"ドラッグセイムス",healthcare:"pharmacy",name:"ドラッグセイムス","name:ja":"ドラッグセイムス"}},"amenity/pharmacy|マツモトキヨシ":{countryCodes:["jp"],tags:{amenity:"pharmacy",brand:"マツモトキヨシ","brand:en":"Matsukiyo","brand:ja":"マツモトキヨシ","brand:wikidata":"Q8014776","brand:wikipedia":"ja:マツモトキヨシ",healthcare:"pharmacy",name:"マツモトキヨシ","name:en":"Matsukiyo","name:ja":"マツモトキヨシ"}},"amenity/pharmacy|丁丁藥局":{nomatch:["shop/chemist|丁丁藥局"],tags:{amenity:"pharmacy",brand:"丁丁藥局",healthcare:"pharmacy",name:"丁丁藥局"}},"amenity/pharmacy|屈臣氏":{nomatch:["shop/chemist|屈臣氏"],tags:{amenity:"pharmacy",brand:"屈臣氏",healthcare:"pharmacy",name:"屈臣氏"}},"amenity/post_box|Canada Post":{countryCodes:["ca"],nomatch:["amenity/post_office|Canada Post"],tags:{amenity:"post_box",brand:"Canada Post","brand:wikidata":"Q1032001","brand:wikipedia":"en:Canada Post",name:"Canada Post"}},"amenity/post_box|Deutsche Post":{countryCodes:["de"],matchNames:["deutsche post ag"],nomatch:["amenity/post_office|Deutsche Post"],tags:{amenity:"post_box",brand:"Deutsche Post","brand:wikidata":"Q157645","brand:wikipedia":"en:Deutsche Post",name:"Deutsche Post"}},"amenity/post_box|FedEx":{nomatch:["amenity/post_office|FedEx"],tags:{amenity:"post_box",brand:"FedEx","brand:wikidata":"Q459477","brand:wikipedia":"en:FedEx",name:"FedEx"}},"amenity/post_box|UPS":{countryCodes:["ca","us"],nomatch:["amenity/post_office|The UPS Store"],tags:{amenity:"post_box",brand:"UPS","brand:wikidata":"Q155026","brand:wikipedia":"en:United Parcel Service",name:"UPS"}},"amenity/post_box|USPS":{countryCodes:["us"],nomatch:["amenity/post_office|USPS"],tags:{amenity:"post_box",brand:"USPS","brand:wikidata":"Q668687","brand:wikipedia":"en:United States Postal Service",name:"USPS"}},"amenity/post_box|差出箱13号":{countryCodes:["jp"],tags:{amenity:"post_box",brand:"差出箱13号",name:"差出箱13号"}},"amenity/post_office|Australia Post":{countryCodes:["au"],tags:{amenity:"post_office",brand:"Australia Post","brand:wikidata":"Q1142936","brand:wikipedia":"en:Australia Post",name:"Australia Post"}},"amenity/post_office|CTT":{countryCodes:["mo"],tags:{amenity:"post_office",brand:"CTT","brand:wikidata":"Q909429","brand:wikipedia":"en:CTT (Macau)",name:"CTT"}},"amenity/post_office|Canada Post":{countryCodes:["ca"],nomatch:["amenity/post_box|Canada Post"],tags:{amenity:"post_office",brand:"Canada Post","brand:wikidata":"Q1032001","brand:wikipedia":"en:Canada Post",name:"Canada Post"}},"amenity/post_office|Chilexpress":{countryCodes:["cl"],tags:{amenity:"post_office",brand:"Chilexpress",name:"Chilexpress"}},"amenity/post_office|Correios":{countryCodes:["br"],tags:{amenity:"post_office",brand:"Correios","brand:wikidata":"Q3375004","brand:wikipedia":"en:Correios",name:"Correios"}},"amenity/post_office|Correo Argentino":{countryCodes:["ar"],tags:{amenity:"post_office",brand:"Correo Argentino","brand:wikidata":"Q4036566","brand:wikipedia":"en:Correo Argentino",name:"Correo Argentino"}},"amenity/post_office|Correos de Chile":{countryCodes:["cl"],tags:{amenity:"post_office",brand:"Correos de Chile","brand:wikidata":"Q5172893","brand:wikipedia":"en:Correos de Chile",name:"Correos de Chile"}},"amenity/post_office|Correos de Costa Rica":{countryCodes:["cr"],tags:{amenity:"post_office",brand:"Correos de Costa Rica","brand:wikidata":"Q5172894","brand:wikipedia":"en:Correos de Costa Rica",name:"Correos de Costa Rica"}},"amenity/post_office|Correos de México":{countryCodes:["mx"],tags:{amenity:"post_office",brand:"Correos de México","brand:wikidata":"Q5172898","brand:wikipedia":"en:Correos de México",name:"Correos de México"}},"amenity/post_office|DHL":{matchNames:["dhl paketshop"],tags:{amenity:"post_office",brand:"DHL","brand:wikidata":"Q489815","brand:wikipedia":"en:DHL Express",name:"DHL"}},"amenity/post_office|DPD Paketshop":{countryCodes:["at","de","pl"],tags:{amenity:"post_office",brand:"DPD Paketshop","brand:wikidata":"Q541030","brand:wikipedia":"en:DPDgroup",name:"DPD Paketshop"}},"amenity/post_office|Deutsche Post":{countryCodes:["de"],matchNames:["deutsche post ag","deutsche post filiale"],tags:{amenity:"post_office",brand:"Deutsche Post","brand:wikidata":"Q157645","brand:wikipedia":"en:Deutsche Post",name:"Deutsche Post"}},"amenity/post_office|Fancourier":{countryCodes:["ro"],tags:{amenity:"post_office",brand:"Fancourier","brand:wikidata":"Q12727984","brand:wikipedia":"ro:FAN Courier Express",name:"Fancourier"}},"amenity/post_office|FedEx":{nomatch:["amenity/post_box|FedEx"],tags:{amenity:"post_office",brand:"FedEx","brand:wikidata":"Q459477","brand:wikipedia":"en:FedEx",name:"FedEx"}},"amenity/post_office|Hermes Paketshop":{countryCodes:["de"],matchNames:["hermes"],tags:{amenity:"post_office",brand:"Hermes Paketshop","brand:wikidata":"Q1613532","brand:wikipedia":"en:Hermes Group",name:"Hermes Paketshop"}},"amenity/post_office|LBC":{countryCodes:["ph"],matchNames:["lbc express"],tags:{amenity:"post_office",brand:"LBC","brand:wikidata":"Q17075584","brand:wikipedia":"en:LBC Express",name:"LBC"}},"amenity/post_office|La Poste":{tags:{amenity:"post_office",brand:"La Poste","brand:wikidata":"Q373724","brand:wikipedia":"fr:La Poste (entreprise française)",name:"La Poste"}},"amenity/post_office|MRW":{tags:{amenity:"post_office",brand:"MRW","brand:wikidata":"Q23767821","brand:wikipedia":"es:MRW",name:"MRW"}},"amenity/post_office|OCA":{countryCodes:["ar"],tags:{amenity:"post_office",brand:"OCA",name:"OCA"}},"amenity/post_office|Oficina de Correos":{matchNames:["correos"],tags:{amenity:"post_office",brand:"Oficina de Correos","brand:wikidata":"Q776605","brand:wikipedia":"es:Correos (España)",name:"Oficina de Correos"}},"amenity/post_office|PTT":{nomatch:["amenity/fuel|PTT"],tags:{amenity:"post_office",brand:"PTT",name:"PTT"}},"amenity/post_office|Poczta Polska":{countryCodes:["pl"],tags:{amenity:"post_office",brand:"Poczta Polska","brand:wikidata":"Q168833","brand:wikipedia":"pl:Poczta Polska",name:"Poczta Polska"}},"amenity/post_office|PostalAnnex":{countryCodes:["us"],matchTags:["shop/post_office"],tags:{amenity:"post_office",brand:"PostalAnnex","brand:wikidata":"Q61960357",name:"PostalAnnex"}},"amenity/post_office|Poste Italiane":{countryCodes:["it"],tags:{amenity:"post_office",brand:"Poste Italiane","brand:wikidata":"Q495026","brand:wikipedia":"en:Poste italiane",name:"Poste Italiane"}},"amenity/post_office|Serpost":{countryCodes:["pe"],matchNames:["servicios postales del perú"],matchTags:["shop/post_office"],tags:{amenity:"post_office",brand:"Serpost","brand:wikidata":"Q19521863","brand:wikipedia":"es:Servicios Postales del Perú",name:"Serpost"}},"amenity/post_office|Servientrega":{tags:{amenity:"post_office",brand:"Servientrega",name:"Servientrega"}},"amenity/post_office|Slovenská pošta":{countryCodes:["sk"],tags:{amenity:"post_office",brand:"Slovenská pošta","brand:wikidata":"Q1191849","brand:wikipedia":"en:Slovenská pošta",name:"Slovenská pošta"}},"amenity/post_office|The UPS Store":{countryCodes:["ca","us"],matchNames:["ups store"],matchTags:["shop/copyshop"],nomatch:["amenity/post_box|UPS"],tags:{amenity:"post_office",brand:"The UPS Store","brand:wikidata":"Q7771029","brand:wikipedia":"en:The UPS Store",name:"The UPS Store",short_name:"UPS"}},"amenity/post_office|United States Post Office":{countryCodes:["us"],matchNames:["united states postal service","us post office","us postal service","usps"],tags:{amenity:"post_office",brand:"United States Post Office","brand:wikidata":"Q668687","brand:wikipedia":"en:United States Postal Service",name:"United States Post Office"}},"amenity/post_office|ΕΛΤΑ":{countryCodes:["gr"],tags:{amenity:"post_office",brand:"ΕΛΤΑ","brand:wikidata":"Q1275135","brand:wikipedia":"el:Ελληνικά Ταχυδρομεία",name:"ΕΛΤΑ"}},"amenity/post_office|Белпошта":{countryCodes:["by"],matchNames:["белпочта"],tags:{amenity:"post_office",brand:"Белпошта","brand:be":"Белпошта","brand:en":"Belposhta","brand:ru":"Белпочта","brand:wikidata":"Q2662336","brand:wikipedia":"be:Белпошта",name:"Белпошта","name:be":"Белпошта","name:en":"Belposhta","name:ru":"Белпочта"}},"amenity/post_office|Казпочта":{countryCodes:["kz"],tags:{amenity:"post_office",brand:"Казпочта","brand:wikidata":"Q746263","brand:wikipedia":"ru:Казпочта",name:"Казпочта"}},"amenity/post_office|Нова Пошта":{countryCodes:["ua"],matchNames:["Нова Пошта №1","Нова Пошта №2","Нова Пошта №3","Нова Пошта №4"],tags:{amenity:"post_office",brand:"Нова Пошта","brand:wikidata":"Q12133863","brand:wikipedia":"uk:Нова пошта",name:"Нова Пошта"}},"amenity/post_office|Почта России":{countryCodes:["ru"],tags:{amenity:"post_office",brand:"Почта России","brand:wikidata":"Q1502763","brand:wikipedia":"ru:Почта России",name:"Почта России"}},"amenity/post_office|СДЭК":{countryCodes:["ru","ua"],tags:{amenity:"post_office",brand:"СДЭК","brand:wikidata":"Q28665980","brand:wikipedia":"ru:СДЭК",name:"СДЭК"}},"amenity/post_office|Укрпошта":{countryCodes:["ua"],tags:{amenity:"post_office",brand:"Укрпошта","brand:wikidata":"Q2470783","brand:wikipedia":"en:Ukrposhta",name:"Укрпошта"}},"amenity/post_office|中国邮政":{countryCodes:["cn"],tags:{amenity:"post_office",brand:"中国邮政","brand:en":"China Post","brand:wikidata":"Q1066476","brand:wikipedia":"en:China Post",name:"中国邮政","name:en":"China Post"}},"amenity/prep_school|Huntington Learning Center":{countryCodes:["us"],matchNames:["huntington"],tags:{amenity:"prep_school",brand:"Huntington Learning Center","brand:wikidata":"Q5945399","brand:wikipedia":"en:Huntington Learning Center",name:"Huntington Learning Center"}},"amenity/prep_school|KUMON~(Japan)":{countryCodes:["jp"],matchNames:["くもん","公文"],tags:{amenity:"prep_school",brand:"KUMON","brand:wikidata":"Q142054","brand:wikipedia":"ja:日本公文教育研究会",name:"KUMON","name:ja":"公文","name:ja-Hira":"くもん","name:ja-Latn":"KUMON"}},"amenity/prep_school|Kumon~(International)":{countryCodes:[],matchNames:["kumon learning center"],tags:{amenity:"prep_school",brand:"Kumon","brand:wikidata":"Q142054","brand:wikipedia":"en:Kumon",name:"Kumon"}},"amenity/prep_school|Mathnasium":{countryCodes:["us"],matchNames:["mathnasium learning center"],tags:{amenity:"prep_school",brand:"Mathnasium","brand:wikidata":"Q6787302","brand:wikipedia":"en:Mathnasium",name:"Mathnasium"}},"amenity/prep_school|Russian School of Mathematics":{countryCodes:["us"],matchNames:["rsm","russian school of math"],tags:{amenity:"prep_school",brand:"Russian School of Mathematics","brand:wikidata":"Q7382122","brand:wikipedia":"en:Russian School of Mathematics",name:"Russian School of Mathematics"}},"amenity/prep_school|Sylvan":{countryCodes:["us"],matchNames:["sylvan learning"],tags:{alt_name:"Sylvan Learning Center",amenity:"prep_school",brand:"Sylvan","brand:wikidata":"Q7660663","brand:wikipedia":"en:Sylvan Learning",name:"Sylvan"}},"amenity/public_bookcase|Little Free Library":{tags:{amenity:"public_bookcase",brand:"Little Free Library","brand:wikidata":"Q6650101","brand:wikipedia":"en:Little Free Library",name:"Little Free Library"}},"amenity/public_bookcase|Offener Bücherschrank":{countryCodes:["at","ch","de"],tags:{amenity:"public_bookcase",brand:"Offener Bücherschrank",name:"Offener Bücherschrank"}},"amenity/restaurant|100 Montaditos":{countryCodes:["es","it","pt"],tags:{amenity:"restaurant",brand:"100 Montaditos","brand:wikidata":"Q8355805","brand:wikipedia":"en:Cervecería 100 Montaditos",cuisine:"sandwich",name:"100 Montaditos"}},"amenity/restaurant|ASK Italian":{countryCodes:["gb"],tags:{amenity:"restaurant",brand:"ASK Italian","brand:wikidata":"Q4807056","brand:wikipedia":"en:ASK Italian",cuisine:"italian",name:"ASK Italian"}},"amenity/restaurant|Applebee's":{matchNames:["applebees bar & grill","applebees bar and grill","applebees grill & bar","applebees grill and bar","applebees neighborhood bar & grill","applebees neighborhood bar and grill","applebees neighborhood grill and bar"],tags:{amenity:"restaurant",brand:"Applebee's Neighborhood Grill & Bar","brand:wikidata":"Q621532","brand:wikipedia":"en:Applebee's",cuisine:"american",name:"Applebee's",official_name:"Applebee's Neighborhood Grill & Bar"}},"amenity/restaurant|Autogrill":{countryCodes:["at","es","fr","it"],tags:{amenity:"restaurant",brand:"Autogrill","brand:wikidata":"Q786790","brand:wikipedia":"en:Autogrill",name:"Autogrill"}},"amenity/restaurant|BBB":{countryCodes:["il"],tags:{alt_name:"Burgus Burger Bar","alt_name:en":"Burgus Burger Bar",amenity:"restaurant",brand:"Burgus Burger Bar","brand:en":"Burgus Burger Bar","brand:wikidata":"Q64760094",cuisine:"burger",name:"BBB","name:en":"BBB"}},"amenity/restaurant|BJ's":{countryCodes:["us"],matchNames:["bjs restaurant and brewhouse"],tags:{amenity:"restaurant",brand:"BJ's","brand:wikidata":"Q4835755","brand:wikipedia":"en:BJ's Restaurants",cuisine:"american",name:"BJ's",official_name:"BJ's Restaurant & Brewhouse"}},"amenity/restaurant|Bella Italia":{countryCodes:["gb"],tags:{amenity:"restaurant",brand:"Bella Italia","brand:wikidata":"Q4883362","brand:wikipedia":"en:Bella Italia",cuisine:"italian",name:"Bella Italia"}},"amenity/restaurant|Benihana":{countryCodes:["aw","br","ca","pa","sv","us"],matchNames:["benihana of tokyo"],tags:{amenity:"restaurant",brand:"Benihana","brand:wikidata":"Q4887996","brand:wikipedia":"en:Benihana",cuisine:"japanese;teppanyaki;steak",name:"Benihana"}},"amenity/restaurant|Bertucci's":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Bertucci's","brand:wikidata":"Q4895917","brand:wikipedia":"en:Bertucci's",cuisine:"pizza;italian",name:"Bertucci's"}},"amenity/restaurant|Big Boy":{tags:{amenity:"restaurant",brand:"Big Boy","brand:wikidata":"Q4386779","brand:wikipedia":"en:Big Boy Restaurants",cuisine:"burger",name:"Big Boy",official_name:"Big Boy Restaurant & Bakery"}},"amenity/restaurant|Black":{countryCodes:["il"],tags:{amenity:"restaurant",brand:"Black Bar Burger","brand:en":"Black Bar Burger","brand:he":"בלאק בורגר","brand:wikidata":"Q64760158",cuisine:"burger",name:"Black","name:en":"Black","name:he":"בלאק"}},"amenity/restaurant|Black Bear Diner":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Black Bear Diner","brand:wikidata":"Q4920343","brand:wikipedia":"en:Black Bear Diner",cuisine:"american",name:"Black Bear Diner"}},"amenity/restaurant|Blaze Pizza":{countryCodes:["bh","ca","kw","sa","us"],tags:{amenity:"restaurant",brand:"Blaze Pizza","brand:wikidata":"Q23016666","brand:wikipedia":"en:Blaze Pizza",cuisine:"pizza",name:"Blaze Pizza"}},"amenity/restaurant|Bob Evans":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Bob Evans","brand:wikidata":"Q4932386","brand:wikipedia":"en:Bob Evans Restaurants",cuisine:"american",name:"Bob Evans"}},"amenity/restaurant|Bonanza Steakhouse":{countryCodes:["us"],matchNames:["bonanza"],tags:{amenity:"restaurant",brand:"Bonanza Steakhouse","brand:wikidata":"Q64045992",cuisine:"american;steak;buffet",name:"Bonanza Steakhouse"}},"amenity/restaurant|Bonefish Grill":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Bonefish Grill","brand:wikidata":"Q4941599","brand:wikipedia":"en:Bonefish Grill",cuisine:"seafood",name:"Bonefish Grill"}},"amenity/restaurant|Boston Pizza":{countryCodes:["ca","us"],tags:{amenity:"restaurant",brand:"Boston Pizza","brand:wikidata":"Q894578","brand:wikipedia":"en:Boston Pizza",cuisine:"pizza",name:"Boston Pizza"}},"amenity/restaurant|Bravo":{countryCodes:["us"],nomatch:["shop/supermarket|Bravo"],tags:{alt_name:"Bravo Cucina Italiana",amenity:"restaurant",brand:"Bravo","brand:wikidata":"Q64055574",cuisine:"italian",name:"Bravo"}},"amenity/restaurant|Brio":{countryCodes:["us"],tags:{alt_name:"Brio Tuscan Grille",amenity:"restaurant",brand:"Brio","brand:wikidata":"Q64055835",cuisine:"italian",name:"Brio"}},"amenity/restaurant|Buca di Beppo":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Buca di Beppo","brand:wikidata":"Q4982340","brand:wikipedia":"en:Buca di Beppo",cuisine:"italian",name:"Buca di Beppo"}},"amenity/restaurant|Buffalo Grill":{countryCodes:["es","fr"],tags:{amenity:"restaurant",brand:"Buffalo Grill","brand:wikidata":"Q944655","brand:wikipedia":"en:Buffalo Grill",cuisine:"steak_house",name:"Buffalo Grill"}},"amenity/restaurant|Buffalo Wild Wings":{tags:{amenity:"restaurant",brand:"Buffalo Wild Wings","brand:wikidata":"Q509255","brand:wikipedia":"en:Buffalo Wild Wings",cuisine:"wings",name:"Buffalo Wild Wings"}},"amenity/restaurant|Buffalo Wings & Rings":{countryCodes:["us"],matchNames:["buffalo wings and rings"],tags:{amenity:"restaurant",brand:"Buffalo Wings & Rings","brand:wikidata":"Q4985900","brand:wikipedia":"en:Buffalo Wings & Rings",cuisine:"wings",name:"Buffalo Wings & Rings",takeaway:"yes"}},"amenity/restaurant|Cafe Rio":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Cafe Rio","brand:wikidata":"Q5017108","brand:wikipedia":"en:Cafe Rio",cuisine:"mexican",name:"Cafe Rio"}},"amenity/restaurant|California Pizza Kitchen":{tags:{amenity:"restaurant",brand:"California Pizza Kitchen","brand:wikidata":"Q15109854","brand:wikipedia":"en:California Pizza Kitchen",cuisine:"pizza",name:"California Pizza Kitchen"}},"amenity/restaurant|Campanile":{tags:{amenity:"restaurant",brand:"Campanile",name:"Campanile"}},"amenity/restaurant|Carluccio's":{countryCodes:["gb"],tags:{amenity:"restaurant",brand:"Carluccio's","brand:wikidata":"Q25111797","brand:wikipedia":"en:Carluccio's Ltd",cuisine:"italian",name:"Carluccio's"}},"amenity/restaurant|Carrabba's Italian Grill":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Carrabba's Italian Grill","brand:wikidata":"Q5045999","brand:wikipedia":"en:Carrabba's Italian Grill",cuisine:"italian",name:"Carrabba's Italian Grill"}},"amenity/restaurant|Cheddar's":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Cheddar's","brand:wikidata":"Q5089187","brand:wikipedia":"en:Cheddar's Scratch Kitchen",cuisine:"american",name:"Cheddar's",official_name:"Cheddar's Scratch Kitchen"}},"amenity/restaurant|Cheeburger Cheeburger":{countryCodes:["ca","sa","us"],tags:{amenity:"restaurant",brand:"Cheeburger Cheeburger","brand:wikidata":"Q5089247","brand:wikipedia":"en:Cheeburger Cheeburger",cuisine:"burger",name:"Cheeburger Cheeburger"}},"amenity/restaurant|Chevys":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Chevys Fresh Mex","brand:wikidata":"Q5094466","brand:wikipedia":"en:Chevys Fresh Mex",cuisine:"mexican",name:"Chevys",official_name:"Chevys Fresh Mex"}},"amenity/restaurant|Chili's":{matchNames:["chili's grill and bar"],tags:{amenity:"restaurant",brand:"Chili's","brand:wikidata":"Q1072948","brand:wikipedia":"en:Chili's",cuisine:"tex-mex",name:"Chili's",official_name:"Chili's Grill & Bar"}},"amenity/restaurant|Chiquito":{countryCodes:["gb"],tags:{amenity:"restaurant",brand:"Chiquito","brand:wikidata":"Q5101775","brand:wikipedia":"en:Chiquito (restaurant)",cuisine:"tex-mex",name:"Chiquito"}},"amenity/restaurant|Chuck E. Cheese's":{countryCodes:["ca","us"],matchNames:["chuck e cheese"],tags:{amenity:"restaurant",brand:"Chuck E. Cheese's","brand:wikidata":"Q2438391","brand:wikipedia":"en:Chuck E. Cheese's",cuisine:"pizza",name:"Chuck E. Cheese's"}},"amenity/restaurant|Cici's Pizza":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Cici's Pizza","brand:wikidata":"Q2972189","brand:wikipedia":"en:Cicis",cuisine:"pizza;buffet",name:"Cici's Pizza"}},"amenity/restaurant|Claim Jumper":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Claim Jumper","brand:wikidata":"Q5125081","brand:wikipedia":"en:Claim Jumper",cuisine:"american",name:"Claim Jumper"}},"amenity/restaurant|Coast to Coast":{countryCodes:["gb"],tags:{amenity:"restaurant",brand:"Coast to Coast","brand:wikidata":"Q22000729","brand:wikipedia":"en:Coast to Coast (restaurant)",cuisine:"american",name:"Coast to Coast"}},"amenity/restaurant|Cora":{tags:{amenity:"restaurant",brand:"Cora",name:"Cora"}},"amenity/restaurant|Cosmo":{countryCodes:["gb","ie"],tags:{amenity:"restaurant",brand:"Cosmo","brand:wikidata":"Q5174239","brand:wikipedia":"en:Cosmo (restaurant)",name:"Cosmo"}},"amenity/restaurant|Country Pride":{countryCodes:["us"],matchNames:["country pride restaurant"],tags:{amenity:"restaurant",brand:"Country Pride","brand:wikidata":"Q64051992",cuisine:"american",name:"Country Pride"}},"amenity/restaurant|Courtepaille":{countryCodes:["fr"],tags:{amenity:"restaurant",brand:"Courtepaille","brand:wikidata":"Q3116688","brand:wikipedia":"fr:Grill Courtepaille",cuisine:"french",name:"Courtepaille"}},"amenity/restaurant|Cracker Barrel":{countryCodes:["us"],nomatch:["shop/gift|Cracker Barrel"],tags:{amenity:"restaurant",brand:"Cracker Barrel","brand:wikidata":"Q4492609","brand:wikipedia":"en:Cracker Barrel",cuisine:"american",name:"Cracker Barrel",official_name:"Cracker Barrel Old Country Store"}},"amenity/restaurant|Dave & Buster's":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Dave & Buster's","brand:wikidata":"Q5228205","brand:wikipedia":"en:Dave & Buster's",cuisine:"american",name:"Dave & Buster's"}},"amenity/restaurant|Denny's":{tags:{amenity:"restaurant",brand:"Denny's","brand:wikidata":"Q1189695","brand:wikipedia":"en:Denny's",cuisine:"american",name:"Denny's"}},"amenity/restaurant|Dickey's Barbecue Pit":{countryCodes:["us"],matchNames:["dickeys barbecue"],tags:{amenity:"restaurant",brand:"Dickey's Barbecue Pit","brand:wikidata":"Q19880747","brand:wikipedia":"en:Dickey's Barbecue Pit",cuisine:"barbecue",name:"Dickey's Barbecue Pit"}},"amenity/restaurant|Dolce Vita":{tags:{amenity:"restaurant",brand:"Dolce Vita",name:"Dolce Vita"}},"amenity/restaurant|Donatos Pizza":{countryCodes:["us"],matchNames:["donatos"],tags:{amenity:"restaurant",brand:"Donatos Pizza","brand:wikidata":"Q1240741","brand:wikipedia":"en:Donatos Pizza",cuisine:"pizza",name:"Donatos Pizza",takeaway:"yes"}},"amenity/restaurant|East Side Mario's":{countryCodes:["ca"],tags:{amenity:"restaurant",brand:"East Side Mario's","brand:wikidata":"Q5329375","brand:wikipedia":"en:East Side Mario's",cuisine:"italian",name:"East Side Mario's"}},"amenity/restaurant|Eat'n Park":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Eat'n Park","brand:wikidata":"Q5331211","brand:wikipedia":"en:Eat'n Park",cuisine:"american",name:"Eat'n Park"}},"amenity/restaurant|Famous Dave's":{countryCodes:["us"],matchNames:["famous daves bbq"],tags:{amenity:"restaurant",brand:"Famous Dave's","brand:wikidata":"Q5433448","brand:wikipedia":"en:Famous Dave's",cuisine:"barbecue",name:"Famous Dave's"}},"amenity/restaurant|First Watch":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"First Watch","brand:wikidata":"Q5454064","brand:wikipedia":"en:First Watch (restaurant chain)",cuisine:"american;breakfast",name:"First Watch"}},"amenity/restaurant|Flunch":{countryCodes:["fr"],tags:{amenity:"restaurant",brand:"Flunch","brand:wikidata":"Q629326","brand:wikipedia":"en:Flunch",cuisine:"french",name:"Flunch"}},"amenity/restaurant|Foster's Hollywood":{countryCodes:["es"],tags:{amenity:"restaurant",brand:"Foster's Hollywood","brand:wikidata":"Q5864366","brand:wikipedia":"en:Foster's Hollywood",cuisine:"american",name:"Foster's Hollywood"}},"amenity/restaurant|Frankie & Benny's":{countryCodes:["gb"],tags:{amenity:"restaurant",brand:"Frankie & Benny's","brand:wikidata":"Q5490892","brand:wikipedia":"en:Frankie & Benny's",cuisine:"italian",name:"Frankie & Benny's"}},"amenity/restaurant|Freshii":{countryCodes:["ca","us"],tags:{amenity:"restaurant",brand:"Freshii","brand:wikidata":"Q5503051","brand:wikipedia":"en:Freshii",cuisine:"salad",name:"Freshii"}},"amenity/restaurant|Friendly's":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Friendly's","brand:wikidata":"Q1464513","brand:wikipedia":"en:Friendly's",cuisine:"american",name:"Friendly's"}},"amenity/restaurant|Frisch's Big Boy":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Frisch's Big Boy","brand:wikidata":"Q5504660","brand:wikipedia":"en:Frisch's",cuisine:"burger",name:"Frisch's Big Boy",takeaway:"yes"}},"amenity/restaurant|Fuddruckers":{tags:{amenity:"restaurant",brand:"Fuddruckers","brand:wikidata":"Q5507056","brand:wikipedia":"en:Fuddruckers",cuisine:"burger",name:"Fuddruckers"}},"amenity/restaurant|Giordano's Pizzeria":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Giordano's Pizzeria","brand:wikidata":"Q5563393","brand:wikipedia":"en:Giordano's Pizzeria",cuisine:"pizza",name:"Giordano's Pizzeria"}},"amenity/restaurant|Godfather's Pizza":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Godfather's Pizza","brand:wikidata":"Q5576353","brand:wikipedia":"en:Godfather's Pizza",cuisine:"pizza",name:"Godfather's Pizza"}},"amenity/restaurant|Golden Corral":{countryCodes:["us"],matchNames:["golden corral buffet","golden corral buffet & grill","golden corral buffet and grill"],tags:{amenity:"restaurant",brand:"Golden Corral","brand:wikidata":"Q4039560","brand:wikipedia":"en:Golden Corral",cuisine:"american;buffet",name:"Golden Corral"}},"amenity/restaurant|Gourmet Burger Kitchen":{countryCodes:["gb","gr","ie"],tags:{amenity:"restaurant",brand:"Gourmet Burger Kitchen","brand:wikidata":"Q5588445","brand:wikipedia":"en:Gourmet Burger Kitchen",cuisine:"burger",name:"Gourmet Burger Kitchen"}},"amenity/restaurant|Gusto":{tags:{amenity:"restaurant",brand:"Gusto",name:"Gusto"}},"amenity/restaurant|Handmade Burger Co.":{countryCodes:["gb"],matchNames:["Handmade Burger Company"],tags:{amenity:"restaurant",brand:"Handmade Burger Co.","brand:wikidata":"Q56154673",cuisine:"burger",name:"Handmade Burger Co."}},"amenity/restaurant|Hans im Glück":{countryCodes:["at","ch","de","sg"],tags:{amenity:"restaurant",brand:"Hans im Glück","brand:wikidata":"Q22569868","brand:wikipedia":"de:Hans im Glück (Restaurantkette)",cuisine:"burger",name:"Hans im Glück"}},"amenity/restaurant|Happy's Pizza":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Happy's Pizza","brand:wikidata":"Q5652393","brand:wikipedia":"en:Happy's Pizza",cuisine:"pizza",name:"Happy's Pizza"}},"amenity/restaurant|Hard Rock Cafe":{tags:{amenity:"restaurant",brand:"Hard Rock Cafe","brand:wikidata":"Q918151","brand:wikipedia":"en:Hard Rock Cafe",cuisine:"american",name:"Hard Rock Cafe"}},"amenity/restaurant|Harvester":{countryCodes:["gb"],matchTags:["amenity/pub"],tags:{amenity:"restaurant",brand:"Harvester","brand:wikidata":"Q5676915","brand:wikipedia":"en:Harvester (restaurant)",cuisine:"american",name:"Harvester"}},"amenity/restaurant|Hippopotamus":{countryCodes:["fr"],tags:{amenity:"restaurant",brand:"Hippopotamus","brand:wikidata":"Q3136174","brand:wikipedia":"fr:Hippopotamus (restaurant)",cuisine:"steak_house",name:"Hippopotamus"}},"amenity/restaurant|Hooters":{tags:{amenity:"restaurant",brand:"Hooters","brand:wikidata":"Q1025921","brand:wikipedia":"en:Hooters",cuisine:"burger",name:"Hooters"}},"amenity/restaurant|Huddle House":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Huddle House","brand:wikidata":"Q5928324","brand:wikipedia":"en:Huddle House",cuisine:"american",name:"Huddle House"}},"amenity/restaurant|Husky House":{countryCodes:["ca"],nomatch:["amenity/fuel|Husky","shop/convenience|Husky"],tags:{amenity:"restaurant",brand:"Husky","brand:wikidata":"Q702049","brand:wikipedia":"en:Husky Energy",cuisine:"diner",name:"Husky House"}},"amenity/restaurant|IHOP":{matchNames:["international house of pancakes"],tags:{amenity:"restaurant",brand:"IHOP","brand:wikidata":"Q1185675","brand:wikipedia":"en:IHOP",cuisine:"breakfast;pancake",name:"IHOP"}},"amenity/restaurant|IL Патио":{countryCodes:["ru"],tags:{amenity:"restaurant",brand:"IL Патио","brand:wikidata":"Q4397763","brand:wikipedia":"en:Росинтер",cuisine:"american",name:"IL Патио"}},"amenity/restaurant|Il Giardino":{countryCodes:["de","fr","it","nl"],tags:{amenity:"restaurant",brand:"Il Giardino",name:"Il Giardino"}},"amenity/restaurant|Iron Skillet":{countryCodes:["us"],matchNames:["iron skillet restaurant"],tags:{amenity:"restaurant",brand:"Iron Skillet","brand:wikidata":"Q64052855",cuisine:"american;buffet",name:"Iron Skillet"}},"amenity/restaurant|Jason's Deli":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Jason's Deli","brand:wikidata":"Q16997641","brand:wikipedia":"en:Jason's Deli",cuisine:"sandwich",name:"Jason's Deli"}},"amenity/restaurant|Jet's Pizza":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Jet's Pizza","brand:wikidata":"Q16997713","brand:wikipedia":"en:Jet's Pizza",cuisine:"pizza",name:"Jet's Pizza"}},"amenity/restaurant|Joe's Crab Shack":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Joe's Crab Shack","brand:wikidata":"Q6208210","brand:wikipedia":"en:Joe's Crab Shack",cuisine:"seafood",name:"Joe's Crab Shack"}},"amenity/restaurant|Johnny Carino's":{countryCodes:["us"],matchNames:["carinios"],tags:{amenity:"restaurant",brand:"Johnny Carino's","brand:wikidata":"Q5039637","brand:wikipedia":"en:Carino's Italian",cuisine:"italian",name:"Johnny Carino's"}},"amenity/restaurant|Johnny Rockets":{matchNames:["johnny rocket"],tags:{amenity:"restaurant",brand:"Johnny Rockets","brand:wikidata":"Q1051593","brand:wikipedia":"en:Johnny Rockets",cuisine:"burger",name:"Johnny Rockets"}},"amenity/restaurant|Kelsey's":{countryCodes:["ca"],tags:{amenity:"restaurant",brand:"Kelsey's","brand:wikidata":"Q6386459","brand:wikipedia":"en:Kelseys Original Roadhouse",cuisine:"american",name:"Kelsey's"}},"amenity/restaurant|Koliba":{tags:{amenity:"restaurant",brand:"Koliba",name:"Koliba"}},"amenity/restaurant|Kudu":{countryCodes:["sa"],tags:{amenity:"restaurant",brand:"Kudu","brand:wikidata":"Q6441777","brand:wikipedia":"en:Kudu (restaurant)",cuisine:"sandwich",name:"Kudu"}},"amenity/restaurant|La Boucherie":{countryCodes:["fr"],tags:{amenity:"restaurant",brand:"La Boucherie","brand:wikidata":"Q21427479","brand:wikipedia":"fr:La Boucherie (restaurant)",cuisine:"steak_house",name:"La Boucherie"}},"amenity/restaurant|LaRosa's Pizzeria":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"LaRosa's Pizzeria","brand:wikidata":"Q6460833","brand:wikipedia":"en:LaRosa's Pizzeria",cuisine:"pizza",name:"LaRosa's Pizzeria",takeaway:"yes"}},"amenity/restaurant|Le Patio":{tags:{amenity:"restaurant",brand:"Le Patio",name:"Le Patio"}},"amenity/restaurant|Legal Sea Foods":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Legal Sea Foods","brand:wikidata":"Q6517417","brand:wikipedia":"en:Legal Sea Foods",cuisine:"seafood",name:"Legal Sea Foods"}},"amenity/restaurant|Lemongrass":{tags:{amenity:"restaurant",brand:"Lemongrass",name:"Lemongrass"}},"amenity/restaurant|Logan's Roadhouse":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Logan's Roadhouse","brand:wikidata":"Q6666872","brand:wikipedia":"en:Logan's Roadhouse",cuisine:"american",name:"Logan's Roadhouse"}},"amenity/restaurant|LongHorn Steakhouse":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"LongHorn Steakhouse","brand:wikidata":"Q3259007","brand:wikipedia":"en:LongHorn Steakhouse",cuisine:"steak_house",name:"LongHorn Steakhouse"}},"amenity/restaurant|Los Arcos":{tags:{amenity:"restaurant",brand:"Los Arcos",name:"Los Arcos"}},"amenity/restaurant|Lou Malnati's Pizzeria":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Lou Malnati's Pizzeria","brand:wikidata":"Q6685628","brand:wikipedia":"en:Lou Malnati's Pizzeria",cuisine:"pizza",name:"Lou Malnati's Pizzeria"}},"amenity/restaurant|Loving Hut":{tags:{amenity:"restaurant",brand:"Loving Hut","brand:wikidata":"Q3491655","brand:wikipedia":"en:Loving Hut",cuisine:"international","diet:vegan":"only","diet:vegetarian":"only",name:"Loving Hut"}},"amenity/restaurant|Léon de Bruxelles":{countryCodes:["fr"],tags:{amenity:"restaurant",brand:"Léon de Bruxelles","brand:wikidata":"Q21041507","brand:wikipedia":"en:Léon de Bruxelles",cuisine:"friture",name:"Léon de Bruxelles"}},"amenity/restaurant|MK Restaurants":{countryCodes:["th"],tags:{amenity:"restaurant",brand:"MK Restaurants","brand:wikidata":"Q62075359",cuisine:"thai",name:"MK Restaurants"}},"amenity/restaurant|Marco's Pizza":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Marco's Pizza","brand:wikidata":"Q6757382","brand:wikipedia":"en:Marco's Pizza",cuisine:"pizza",name:"Marco's Pizza"}},"amenity/restaurant|Marie Callender's":{countryCodes:["mx","us"],matchNames:["marie calendar","marie calendar's","marie callendar's"],tags:{amenity:"restaurant",brand:"Marie Callender's","brand:wikidata":"Q6762784","brand:wikipedia":"en:Marie Callender's",cuisine:"american",name:"Marie Callender's"}},"amenity/restaurant|Max's Restaurant":{countryCodes:["ph"],matchNames:["Max's"],tags:{amenity:"restaurant",brand:"Max's Restaurant","brand:wikidata":"Q6794477","brand:wikipedia":"en:Max's Restaurant",cuisine:"asian",name:"Max's Restaurant"}},"amenity/restaurant|McAlister's Deli":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"McAlister's Deli","brand:wikidata":"Q17020829","brand:wikipedia":"en:McAlister's Deli",cuisine:"sandwich",name:"McAlister's Deli"}},"amenity/restaurant|McCormick & Schmick's":{countryCodes:["us"],matchNames:["mccormick & schmick","mccormick & schmicks grill","mccormick and schmick","mccormick and schmick's"],tags:{amenity:"restaurant",brand:"McCormick & Schmick's","brand:wikidata":"Q6800562","brand:wikipedia":"en:McCormick & Schmick's",cuisine:"seafood;steak",name:"McCormick & Schmick's"}},"amenity/restaurant|Mellow Mushroom":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Mellow Mushroom","brand:wikidata":"Q17021360","brand:wikipedia":"en:Mellow Mushroom",cuisine:"pizza",name:"Mellow Mushroom"}},"amenity/restaurant|Mimi's Cafe":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Mimi's Cafe","brand:wikidata":"Q17022081","brand:wikipedia":"en:Mimi's Cafe",cuisine:"french",name:"Mimi's Cafe"}},"amenity/restaurant|Montana's":{countryCodes:["ca"],tags:{amenity:"restaurant",brand:"Montana's","brand:wikidata":"Q17022490","brand:wikipedia":"en:Montana's BBQ & Bar",cuisine:"barbecue",name:"Montana's",official_name:"Montana's BBQ & Bar"}},"amenity/restaurant|Morton's The Steakhouse":{countryCodes:["us"],matchNames:["mortons"],tags:{amenity:"restaurant",brand:"Morton's The Steakhouse","brand:wikidata":"Q17022759","brand:wikipedia":"en:Morton's The Steakhouse",cuisine:"steak_house",name:"Morton's The Steakhouse"}},"amenity/restaurant|Moses":{countryCodes:["il"],tags:{amenity:"restaurant",brand:"Moses","brand:en":"Moses","brand:he":"מוזס","brand:wikidata":"Q64760150",cuisine:"burger",name:"Moses","name:en":"Moses","name:he":"מוזס"}},"amenity/restaurant|Mountain Mike's":{countryCodes:["us"],tags:{alt_name:"Mountain Mike's Pizza",amenity:"restaurant",brand:"Mountain Mike's","brand:wikidata":"Q6925120","brand:wikipedia":"en:Mountain Mike's Pizza",cuisine:"pizza",name:"Mountain Mike's",takeaway:"yes"}},"amenity/restaurant|Nando's":{tags:{amenity:"restaurant",brand:"Nando's","brand:wikidata":"Q3472954","brand:wikipedia":"en:Nando's",cuisine:"chicken;portuguese",name:"Nando's"}},"amenity/restaurant|Noodles & Company":{countryCodes:["us"],matchNames:["noodles and company","noodles co"],tags:{amenity:"restaurant",brand:"Noodles & Company","brand:wikidata":"Q7049673","brand:wikipedia":"en:Noodles & Company",cuisine:"pasta",name:"Noodles & Company"}},"amenity/restaurant|Norky's":{countryCodes:["pe"],tags:{amenity:"restaurant",brand:"Norky's",cuisine:"peruvian",name:"Norky's"}},"amenity/restaurant|O'Charley's":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"O'Charley's","brand:wikidata":"Q7071703","brand:wikipedia":"en:O'Charley's",cuisine:"american",name:"O'Charley's"}},"amenity/restaurant|Ocean Basket":{countryCodes:["za"],tags:{amenity:"restaurant",brand:"Ocean Basket","brand:wikidata":"Q62075311",cuisine:"seafood",name:"Ocean Basket"}},"amenity/restaurant|Old Chicago":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Old Chicago","brand:wikidata":"Q64411347",cuisine:"pizza",name:"Old Chicago",official_name:"Old Chicago Pizza & Taproom"}},"amenity/restaurant|Old Wild West":{countryCodes:["it"],tags:{amenity:"restaurant",brand:"Old Wild West","brand:wikidata":"Q25402475","brand:wikipedia":"it:Old Wild West",cuisine:"american",name:"Old Wild West"}},"amenity/restaurant|Olive Garden":{tags:{amenity:"restaurant",brand:"Olive Garden","brand:wikidata":"Q3045312","brand:wikipedia":"en:Olive Garden",cuisine:"italian",name:"Olive Garden"}},"amenity/restaurant|On The Border":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"On The Border","brand:wikidata":"Q7091305","brand:wikipedia":"en:On the Border Mexican Grill & Cantina",cuisine:"tex-mex",name:"On The Border",official_name:"On The Border Mexican Grill & Cantina"}},"amenity/restaurant|Outback Steakhouse":{tags:{amenity:"restaurant",brand:"Outback Steakhouse","brand:wikidata":"Q1064893","brand:wikipedia":"en:Outback Steakhouse",cuisine:"american;steak",name:"Outback Steakhouse"}},"amenity/restaurant|P.F. Chang's":{countryCodes:["mx","us"],matchNames:["pf chang"],tags:{amenity:"restaurant",brand:"P.F. Chang's","brand:wikidata":"Q5360181","brand:wikipedia":"en:P. F. Chang's China Bistro",cuisine:"asian",name:"P.F. Chang's",official_name:"P.F. Chang's China Bistro"}},"amenity/restaurant|Pardos Chicken":{countryCodes:["pe"],tags:{amenity:"restaurant",brand:"Pardos Chicken","brand:wikidata":"Q17624435","brand:wikipedia":"en:Pardos chicken",cuisine:"peruvian",name:"Pardos Chicken"}},"amenity/restaurant|Pei Wei":{countryCodes:["us"],matchNames:["pei wei asian diner"],tags:{amenity:"restaurant",brand:"Pei Wei","brand:wikidata":"Q7160898","brand:wikipedia":"en:Pei Wei Asian Diner",cuisine:"asian",name:"Pei Wei"}},"amenity/restaurant|Perkins":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Perkins","brand:wikidata":"Q7169056","brand:wikipedia":"en:Perkins Restaurant and Bakery",cuisine:"american",name:"Perkins",official_name:"Perkins Restaurant and Bakery"}},"amenity/restaurant|Phở 24":{countryCodes:["vn"],tags:{amenity:"restaurant",brand:"Phở 24","brand:wikidata":"Q63863118",cuisine:"vietnamese;noodle",name:"Phở 24","name:en":"Pho 24","name:vi":"Phở 24"}},"amenity/restaurant|Phở Hòa~(Branded)":{countryCodes:["us"],tags:{alt_name:"Phở Hoà","alt_name:en":"Pho Hoa","alt_name:vi":"Phở Hoà",amenity:"restaurant",brand:"Phở Hòa","brand:wikidata":"Q55629932","brand:wikipedia":"en:Phở Hòa",cuisine:"vietnamese;noodle",name:"Phở Hòa","name:vi":"Phở Hòa"}},"amenity/restaurant|Pieology Pizzeria":{countryCodes:["us"],matchNames:["pieology"],tags:{amenity:"restaurant",brand:"Pieology Pizzeria","brand:wikidata":"Q60746053","brand:wikipedia":"en:Pieology",cuisine:"pizza",name:"Pieology Pizzeria"}},"amenity/restaurant|Pizza Factory":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Pizza Factory","brand:wikidata":"Q39054369","brand:wikipedia":"en:Pizza Factory",cuisine:"pizza",name:"Pizza Factory"}},"amenity/restaurant|Pizza Hut":{nomatch:["amenity/fast_food|Pizza Hut Express"],tags:{amenity:"restaurant",brand:"Pizza Hut","brand:wikidata":"Q191615","brand:wikipedia":"en:Pizza Hut",cuisine:"pizza",name:"Pizza Hut"}},"amenity/restaurant|Pizza Ranch":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Pizza Ranch","brand:wikidata":"Q7199978","brand:wikipedia":"en:Pizza Ranch",cuisine:"pizza",name:"Pizza Ranch"}},"amenity/restaurant|PizzaExpress":{tags:{amenity:"restaurant",brand:"PizzaExpress","brand:wikidata":"Q662845","brand:wikipedia":"en:PizzaExpress",cuisine:"pizza",name:"PizzaExpress"}},"amenity/restaurant|Poivre Rouge":{countryCodes:["fr"],tags:{amenity:"restaurant",brand:"Poivre Rouge","brand:wikidata":"Q7316076","brand:wikipedia":"fr:Poivre Rouge (restauration)",cuisine:"french",name:"Poivre Rouge"}},"amenity/restaurant|Ponderosa Steakhouse":{countryCodes:["ae","eg","qa","tw","us"],matchNames:["ponderosa"],tags:{amenity:"restaurant",brand:"Ponderosa Steakhouse","brand:wikidata":"Q64038204",cuisine:"american;steak;buffet",name:"Ponderosa Steakhouse"}},"amenity/restaurant|Prezzo":{countryCodes:["gb"],tags:{amenity:"restaurant",brand:"Prezzo","brand:wikidata":"Q7242489","brand:wikipedia":"en:Prezzo (restaurant)",cuisine:"italian",name:"Prezzo"}},"amenity/restaurant|Quaker Steak & Lube":{countryCodes:["us"],matchNames:["quaker steak and lube"],tags:{amenity:"restaurant",brand:"Quaker Steak & Lube","brand:wikidata":"Q7268570","brand:wikipedia":"en:Quaker Steak & Lube",cuisine:"wings",name:"Quaker Steak & Lube"}},"amenity/restaurant|Red Lobster":{tags:{amenity:"restaurant",brand:"Red Lobster","brand:wikidata":"Q846301","brand:wikipedia":"en:Red Lobster",cuisine:"seafood",name:"Red Lobster"}},"amenity/restaurant|Red Robin":{countryCodes:["ca","us"],tags:{amenity:"restaurant",brand:"Red Robin","brand:wikidata":"Q7304886","brand:wikipedia":"en:Red Robin",cuisine:"burger",name:"Red Robin",official_name:"Red Robin Gourmet Burgers and Brews"}},"amenity/restaurant|Romano's Macaroni Grill":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Romano's Macaroni Grill","brand:wikidata":"Q7362714","brand:wikipedia":"en:Romano's Macaroni Grill",cuisine:"italian",name:"Romano's Macaroni Grill"}},"amenity/restaurant|Round Table Pizza":{countryCodes:["us"],matchNames:["round table"],tags:{amenity:"restaurant",brand:"Round Table Pizza","brand:wikidata":"Q7371139","brand:wikipedia":"en:Round Table Pizza",cuisine:"pizza",name:"Round Table Pizza"}},"amenity/restaurant|Ruby Tuesday":{tags:{amenity:"restaurant",brand:"Ruby Tuesday","brand:wikidata":"Q7376400","brand:wikipedia":"en:Ruby Tuesday (restaurant)",cuisine:"american",name:"Ruby Tuesday"}},"amenity/restaurant|Ruth's Chris Steak House":{countryCodes:["ca","mx","us"],tags:{amenity:"restaurant",brand:"Ruth's Chris Steak House","brand:wikidata":"Q7382829","brand:wikipedia":"en:Ruth's Chris Steak House",cuisine:"american",name:"Ruth's Chris Steak House"}},"amenity/restaurant|Saltgrass Steak House":{countryCodes:["us"],matchNames:["saltgrass"],tags:{amenity:"restaurant",brand:"Saltgrass Steak House","brand:wikidata":"Q7406113","brand:wikipedia":"en:Saltgrass Steak House",cuisine:"steak_house",name:"Saltgrass Steak House"}},"amenity/restaurant|Shakey's":{tags:{amenity:"restaurant",brand:"Shakey's","brand:wikidata":"Q6134929","brand:wikipedia":"en:Shakey's Pizza",cuisine:"pizza",name:"Shakey's"}},"amenity/restaurant|Shari's":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Shari's","brand:wikidata":"Q7489612","brand:wikipedia":"en:Shari's Cafe & Pies",cuisine:"american",name:"Shari's"}},"amenity/restaurant|Shoney's":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Shoney's","brand:wikidata":"Q7500392","brand:wikipedia":"en:Shoney's",cuisine:"american",name:"Shoney's"}},"amenity/restaurant|Sizzler":{tags:{amenity:"restaurant",brand:"Sizzler","brand:wikidata":"Q1848822","brand:wikipedia":"en:Sizzler",cuisine:"steak_house",name:"Sizzler"}},"amenity/restaurant|Skyline Chili":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Skyline Chili","brand:wikidata":"Q151224","brand:wikipedia":"en:Skyline Chili",cuisine:"chili",name:"Skyline Chili",takeaway:"yes"}},"amenity/restaurant|Smitty's":{countryCodes:["ca","us"],tags:{amenity:"restaurant",brand:"Smitty's","brand:wikidata":"Q7545728","brand:wikipedia":"en:Smitty's",cuisine:"pancake",name:"Smitty's"}},"amenity/restaurant|Snappy Tomato Pizza":{countryCodes:["gb","us"],tags:{amenity:"restaurant",brand:"Snappy Tomato Pizza","brand:wikidata":"Q7547352","brand:wikipedia":"en:Snappy Tomato Pizza",cuisine:"pizza",name:"Snappy Tomato Pizza",takeaway:"yes"}},"amenity/restaurant|Spur":{countryCodes:["za"],matchNames:["spur steak ranches"],tags:{amenity:"restaurant",brand:"Spur","brand:wikidata":"Q7581546","brand:wikipedia":"en:Spur Steak Ranches",cuisine:"steak_house",name:"Spur"}},"amenity/restaurant|Steak 'n Shake":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Steak 'n Shake","brand:wikidata":"Q7605233","brand:wikipedia":"en:Steak 'n Shake",cuisine:"burger",name:"Steak 'n Shake"}},"amenity/restaurant|Sunset Grill":{countryCodes:["ca","us"],tags:{amenity:"restaurant",brand:"Sunset Grill","brand:wikidata":"Q62112489","brand:wikipedia":"en:Sunset Grill (Canadian restaurant chain)",cuisine:"american",name:"Sunset Grill"}},"amenity/restaurant|Swiss Chalet":{countryCodes:["ca"],tags:{amenity:"restaurant",brand:"Swiss Chalet","brand:wikidata":"Q2372909","brand:wikipedia":"en:Swiss Chalet",cuisine:"chicken",name:"Swiss Chalet"}},"amenity/restaurant|TGI Friday's":{tags:{amenity:"restaurant",brand:"TGI Friday's","brand:wikidata":"Q1524184","brand:wikipedia":"en:TGI Fridays",cuisine:"american",name:"TGI Friday's"}},"amenity/restaurant|Texas Roadhouse":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Texas Roadhouse","brand:wikidata":"Q7707945","brand:wikipedia":"en:Texas Roadhouse",cuisine:"steak_house",name:"Texas Roadhouse"}},"amenity/restaurant|The Cheesecake Factory":{countryCodes:["us"],tags:{alt_name:"Cheesecake Factory",amenity:"restaurant",brand:"The Cheesecake Factory","brand:wikidata":"Q1045842","brand:wikipedia":"en:The Cheesecake Factory",cuisine:"american",name:"The Cheesecake Factory"}},"amenity/restaurant|The Keg":{countryCodes:["ca","us"],matchNames:["keg"],tags:{amenity:"restaurant",brand:"The Keg","brand:wikidata":"Q7744066","brand:wikipedia":"en:The Keg",cuisine:"steak_house",name:"The Keg"}},"amenity/restaurant|The Melting Pot":{countryCodes:["us"],tags:{alt_name:"Melting Pot",amenity:"restaurant",brand:"The Melting Pot","brand:wikidata":"Q7750948","brand:wikipedia":"en:The Melting Pot (restaurant)",cuisine:"fondue",name:"The Melting Pot"}},"amenity/restaurant|Toby Carvery":{countryCodes:["gb"],matchTags:["amenity/pub"],tags:{amenity:"restaurant",brand:"Toby Carvery","brand:wikidata":"Q7811777","brand:wikipedia":"en:Toby Carvery",cuisine:"british",name:"Toby Carvery"}},"amenity/restaurant|Toks":{countryCodes:["mx"],tags:{amenity:"restaurant",brand:"Toks","brand:wikidata":"Q48835586","brand:wikipedia":"en:Toks",cuisine:"mexican",name:"Toks"}},"amenity/restaurant|Tony Roma's":{matchNames:["tony roma"],tags:{amenity:"restaurant",brand:"Tony Roma's","brand:wikidata":"Q2213883","brand:wikipedia":"en:Tony Roma's",cuisine:"barbecue",name:"Tony Roma's"}},"amenity/restaurant|Toppers Pizza":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Toppers Pizza","brand:wikidata":"Q7825113","brand:wikipedia":"en:Toppers Pizza",cuisine:"pizza",name:"Toppers Pizza"}},"amenity/restaurant|Vapiano":{tags:{amenity:"restaurant",brand:"Vapiano","brand:wikidata":"Q506252","brand:wikipedia":"en:Vapiano",cuisine:"italian",name:"Vapiano"}},"amenity/restaurant|Village Inn":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Village Inn","brand:wikidata":"Q7930659","brand:wikipedia":"en:Village Inn",cuisine:"american",name:"Village Inn"}},"amenity/restaurant|Vips":{countryCodes:["es","mx"],tags:{amenity:"restaurant",brand:"Vips","brand:wikidata":"Q48783378","brand:wikipedia":"es:Vips",name:"Vips"}},"amenity/restaurant|Waffle House":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Waffle House","brand:wikidata":"Q1701206","brand:wikipedia":"en:Waffle House",cuisine:"american",name:"Waffle House",opening_hours:"24/7"}},"amenity/restaurant|Wagamama":{tags:{amenity:"restaurant",brand:"Wagamama","brand:wikidata":"Q503715","brand:wikipedia":"en:Wagamama",cuisine:"asian",name:"Wagamama"}},"amenity/restaurant|Wasabi":{tags:{amenity:"restaurant",brand:"Wasabi","brand:wikidata":"Q23891278","brand:wikipedia":"en:Wasabi (restaurant)",cuisine:"japanese",name:"Wasabi"}},"amenity/restaurant|Western Sizzlin'":{countryCodes:["us"],matchNames:["western sizzling"],tags:{amenity:"restaurant",brand:"Western Sizzlin'","brand:wikidata":"Q7988295","brand:wikipedia":"en:Western Sizzlin'",cuisine:"american;steak",name:"Western Sizzlin'"}},"amenity/restaurant|White Spot":{countryCodes:["ca"],tags:{amenity:"restaurant",brand:"White Spot","brand:wikidata":"Q7995414","brand:wikipedia":"en:White Spot",cuisine:"burger",name:"White Spot"}},"amenity/restaurant|Wingstop":{countryCodes:["mx","us"],tags:{amenity:"restaurant",brand:"Wingstop","brand:wikidata":"Q8025339","brand:wikipedia":"en:Wingstop",cuisine:"wings",name:"Wingstop"}},"amenity/restaurant|YO! Sushi":{countryCodes:["gb"],tags:{amenity:"restaurant",brand:"YO! Sushi","brand:wikidata":"Q3105441","brand:wikipedia":"en:YO! Sushi",cuisine:"sushi",name:"YO! Sushi"}},"amenity/restaurant|Zizzi":{countryCodes:["gb"],tags:{amenity:"restaurant",brand:"Zizzi","brand:wikidata":"Q8072944","brand:wikipedia":"en:Zizzi",cuisine:"italian",name:"Zizzi"}},"amenity/restaurant|Евразия":{countryCodes:["ru","ua"],tags:{amenity:"restaurant",brand:"Евразия",name:"Евразия"}},"amenity/restaurant|Планета Суши":{countryCodes:["ru"],tags:{amenity:"restaurant",brand:"Планета Суши","brand:wikidata":"Q62739250",cuisine:"sushi",name:"Планета Суши","name:en":"Planet Sushi"}},"amenity/restaurant|Тануки":{countryCodes:["kz","ru","ua"],tags:{amenity:"restaurant",brand:"Тануки","brand:wikidata":"Q62758690",cuisine:"japanese",name:"Тануки","name:en":"Tanuki","name:ru":"Тануки"}},"amenity/restaurant|Якитория":{countryCodes:["ru"],tags:{amenity:"restaurant",brand:"Якитория",name:"Якитория"}},"amenity/restaurant|בורגר סאלון":{countryCodes:["il"],tags:{amenity:"restaurant",brand:"בורגר סאלון","brand:en":"Burger Saloon","brand:he":"בורגר סאלון","brand:wikidata":"Q64760057",cuisine:"burger",name:"בורגר סאלון","name:en":"Burger Saloon","name:he":"בורגר סאלון"}},"amenity/restaurant|いきなり!ステーキ":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"いきなり!ステーキ","brand:en":"Ikinari Steak","brand:ja":"いきなり!ステーキ","brand:wikidata":"Q21652405","brand:wikipedia":"ja:いきなり!ステーキ",cuisine:"steak_house",name:"いきなり!ステーキ","name:en":"Ikinari Steak","name:ja":"いきなり!ステーキ"}},"amenity/restaurant|はなまるうどん":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"はなまるうどん","brand:en":"Hanamarūdon","brand:ja":"はなまるうどん","brand:wikidata":"Q11275674","brand:wikipedia":"ja:はなまるうどん",cuisine:"japanese;udon",name:"はなまるうどん","name:en":"Hanamarūdon","name:ja":"はなまるうどん"}},"amenity/restaurant|びっくりドンキー":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"びっくりドンキー","brand:en":"Bikkuri Donkey","brand:ja":"びっくりドンキー","brand:wikidata":"Q11276815","brand:wikipedia":"ja:びっくりドンキー",cuisine:"burger",name:"びっくりドンキー","name:en":"Bikkuri Donkey","name:ja":"びっくりドンキー"}},"amenity/restaurant|やよい軒":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"やよい軒","brand:en":"Yayoiken","brand:ja":"やよい軒","brand:wikidata":"Q11280577","brand:wikipedia":"ja:やよい軒",cuisine:"japanese",name:"やよい軒","name:en":"Yayoiken","name:ja":"やよい軒"}},"amenity/restaurant|カプリチョーザ":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"カプリチョーザ","brand:en":"Capricciosa","brand:ja":"カプリチョーザ","brand:wikidata":"Q11294660","brand:wikipedia":"ja:カプリチョーザ",cuisine:"italian",name:"カプリチョーザ","name:en":"Capricciosa","name:ja":"カプリチョーザ"}},"amenity/restaurant|ガスト":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"ガスト","brand:en":"Gusto","brand:ja":"ガスト",cuisine:"western;japanese",name:"ガスト","name:en":"Gusto","name:ja":"ガスト"}},"amenity/restaurant|ココス":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"ココス","brand:en":"Coco's","brand:ja":"ココス","brand:wikidata":"Q11301951","brand:wikipedia":"ja:ココスジャパン",cuisine:"western;japanese",name:"ココス","name:en":"Coco's","name:ja":"ココス"}},"amenity/restaurant|サイゼリヤ":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"サイゼリヤ","brand:en":"Saizeriya","brand:ja":"サイゼリヤ","brand:wikidata":"Q886564","brand:wikipedia":"en:Saizeriya",cuisine:"italian",name:"サイゼリヤ","name:en":"Saizeriya","name:ja":"サイゼリヤ"}},"amenity/restaurant|ジョイフル":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"ジョイフル","brand:en":"Joyfull","brand:ja":"ジョイフル","brand:wikidata":"Q11310517","brand:wikipedia":"ja:ジョイフル",cuisine:"western",name:"ジョイフル","name:en":"Joyfull","name:ja":"ジョイフル"}},"amenity/restaurant|ジョナサン":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"ジョナサン","brand:en":"Jonathan's","brand:ja":"ジョナサン","brand:wikidata":"Q11310628","brand:wikipedia":"ja:ジョナサン (ファミリーレストラン)",cuisine:"italian;japanese",name:"ジョナサン","name:en":"Jonathan's","name:ja":"ジョナサン"}},"amenity/restaurant|ジョリーパスタ":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"ジョリーパスタ","brand:en":"Jolly-Pasta","brand:ja":"ジョリーパスタ","brand:wikidata":"Q10852718","brand:wikipedia":"ja:ジョリーパスタ",cuisine:"pasta",name:"ジョリーパスタ","name:en":"Jolly-Pasta","name:ja":"ジョリーパスタ"}},"amenity/restaurant|ステーキガスト":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"ステーキガスト","brand:en":"Skylark","brand:ja":"ステーキガスト","brand:wikidata":"Q11253593","brand:wikipedia":"ja:すかいらーく",cuisine:"steak",name:"ステーキガスト","name:en":"Skylark","name:ja":"ステーキガスト"}},"amenity/restaurant|デニーズ":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"デニーズ","brand:en":"Denny's","brand:ja":"デニーズ","brand:wikidata":"Q11320661","brand:wikipedia":"ja:デニーズ (日本)",cuisine:"western;japanese",name:"デニーズ","name:en":"Denny's","name:ja":"デニーズ"}},"amenity/restaurant|バーミヤン":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"バーミヤン","brand:en":"Bamiyan","brand:ja":"バーミヤン","brand:wikidata":"Q11328598","brand:wikipedia":"ja:バーミヤン (レストランチェーン)",cuisine:"chinese",name:"バーミヤン","name:en":"Bamiyan","name:ja":"バーミヤン"}},"amenity/restaurant|ビッグボーイ":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"ビッグボーイ","brand:en":"Big Boy Restaurants","brand:ja":"ビッグボーイ","brand:wikidata":"Q4386779","brand:wikipedia":"en:Big Boy Restaurants",cuisine:"burger",name:"ビッグボーイ","name:en":"Big Boy Restaurants","name:ja":"ビッグボーイ"}},"amenity/restaurant|リンガーハット":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"リンガーハット","brand:en":"Ringer Hut","brand:ja":"リンガーハット","brand:wikidata":"Q7334856","brand:wikipedia":"en:Ringer Hut",cuisine:"japanese",name:"リンガーハット","name:en":"Ringer Hut","name:ja":"リンガーハット"}},"amenity/restaurant|ロイヤルホスト":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"ロイヤルホスト","brand:en":"Royal Host","brand:ja":"ロイヤルホスト","brand:wikidata":"Q11120884","brand:wikipedia":"ja:ロイヤルホスト",cuisine:"japanese;italian;french",name:"ロイヤルホスト","name:en":"Royal Host","name:ja":"ロイヤルホスト"}},"amenity/restaurant|丸亀製麺":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"丸亀製麺","brand:en":"Marugame Seimen","brand:ja":"丸亀製麺","brand:wikidata":"Q10877253","brand:wikipedia":"ja:丸亀製麺",cuisine:"noodle",name:"丸亀製麺","name:en":"Marugame Seimen","name:ja":"丸亀製麺"}},"amenity/restaurant|八方雲集":{countryCodes:["cn","tw"],tags:{amenity:"restaurant",brand:"八方雲集","brand:en":"Eight Way","brand:wikidata":"Q28417381","brand:wikipedia":"zh:八方雲集","brand:zh":"八方雲集",name:"八方雲集","name:en":"Eight Way","name:zh":"八方雲集"}},"amenity/restaurant|和食さと":{countryCodes:["jp"],matchNames:["さと"],tags:{amenity:"restaurant",brand:"和食さと","brand:en":"Washoku Sato","brand:ja":"和食さと","brand:wikidata":"Q11304897","brand:wikipedia":"ja:SRSホールディングス",cuisine:"japanese",name:"和食さと","name:en":"Washoku Sato","name:ja":"和食さと"}},"amenity/restaurant|夢庵":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"夢庵","brand:en":"Yumean","brand:ja":"夢庵","brand:wikidata":"Q11253593","brand:wikipedia":"ja:すかいらーく",cuisine:"japanese",name:"夢庵","name:en":"Yumean","name:ja":"夢庵"}},"amenity/restaurant|大戸屋":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"大戸屋","brand:en":"Ootoya","brand:ja":"大戸屋","brand:wikidata":"Q11435522","brand:wikipedia":"ja:大戸屋ホールディングス",cuisine:"japanese",name:"大戸屋","name:en":"Ootoya","name:ja":"大戸屋"}},"amenity/restaurant|大阪王将":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"大阪王将","brand:en":"Osaka Ohsho","brand:ja":"大阪王将","brand:wikidata":"Q48743717","brand:wikipedia":"ja:大阪王将",cuisine:"japanese;chinese",name:"大阪王将","name:en":"Osaka Ohsho","name:ja":"大阪王将"}},"amenity/restaurant|天下一品":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"天下一品","brand:en":"Tenkaippin","brand:wikidata":"Q11442172","brand:wikipedia":"en:Tenkaippin",cuisine:"ramen",name:"天下一品","name:en":"Tenkaippin"}},"amenity/restaurant|安楽亭":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"安楽亭","brand:en":"Anrakutei","brand:wikidata":"Q11450866","brand:wikipedia":"ja:安楽亭",cuisine:"barbecue",name:"安楽亭","name:en":"Anrakutei"}},"amenity/restaurant|木曽路":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"木曽路","brand:en":"Kisoji","brand:jp":"木曽路","brand:wikidata":"Q11518589","brand:wikipedia":"ja:木曽路 (企業)",cuisine:"japanese",name:"木曽路","name:en":"Kisoji","name:jp":"木曽路"}},"amenity/restaurant|永和豆漿":{countryCodes:["tw"],tags:{amenity:"restaurant",brand:"永和豆漿","brand:en":"Yonghe Soy Milk","brand:wikidata":"Q11131335","brand:wikipedia":"zh:永和豆漿",cuisine:"chinese;breakfast",name:"永和豆漿","name:en":"Yonghe Soy Milk"}},"amenity/restaurant|海底捞火锅":{tags:{amenity:"restaurant",brand:"海底捞火锅",name:"海底捞火锅"}},"amenity/restaurant|牛角":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"牛角","brand:en":"Gyū-Kaku","brand:wikidata":"Q11349387","brand:wikipedia":"en:Gyu-Kaku",cuisine:"barbecue",name:"牛角","name:en":"Gyū-Kaku"}},"amenity/restaurant|華屋与兵衛":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"華屋与兵衛","brand:en":"Hanaya Yohei","brand:ja":"華屋与兵衛","brand:wikidata":"Q11620063","brand:wikipedia":"ja:華屋与兵衛 (レストラン)",cuisine:"japanese",name:"華屋与兵衛","name:en":"Hanaya Yohei","name:ja":"華屋与兵衛"}},"amenity/restaurant|餃子の王将":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"餃子の王将","brand:en":"Gyoza no Ohsho","brand:ja":"餃子の王将","brand:wikidata":"Q11666805","brand:wikipedia":"en:Gyoza no Ohsho",cuisine:"chinese;gyoza",name:"餃子の王将","name:en":"Gyoza no Ohsho","name:ja":"餃子の王将"}},"amenity/restaurant|바다횟집":{countryCodes:["kr"],tags:{amenity:"restaurant",brand:"바다횟집","brand:ko":"바다횟집",name:"바다횟집","name:ko":"바다횟집"}},"amenity/restaurant|빕스":{countryCodes:["kr"],tags:{amenity:"restaurant",brand:"빕스","brand:en":"VIPS","brand:ko":"빕스","brand:wikidata":"Q12599540","brand:wikipedia":"en:VIPS (restaurant)",name:"빕스","name:en":"VIPS","name:ko":"빕스"}},"amenity/social_centre|American Legion Hall":{countryCodes:["us"],matchNames:["american legion"],tags:{amenity:"social_centre",brand:"American Legion","brand:wikidata":"Q468865","brand:wikipedia":"en:American Legion",name:"American Legion Hall","social_centre:for":"veterans"}},"amenity/social_centre|Eagles Lodge":{countryCodes:["us"],matchNames:["aeries","eagles","foe"],tags:{alt_name:"Aeries Lodge",amenity:"social_centre",brand:"Fraternal Order of Eagles","brand:wikidata":"Q5493810","brand:wikipedia":"en:Fraternal Order of Eagles",name:"Eagles Lodge",official_name:"Fraternal Order of Eagles"}},"amenity/social_centre|Elks Lodge":{countryCodes:["us"],matchNames:["bpoe","elks"],tags:{amenity:"social_centre",brand:"Benevolent and Protective Order of Elks","brand:wikidata":"Q2895789","brand:wikipedia":"en:Benevolent and Protective Order of Elks",name:"Elks Lodge",official_name:"Benevolent and Protective Order of Elks"}},"amenity/social_centre|Moose Lodge":{countryCodes:["bm","ca","us"],matchNames:["moose"],tags:{amenity:"social_centre",brand:"Loyal Order of Moose","brand:wikidata":"Q6908585","brand:wikipedia":"en:Loyal Order of Moose",name:"Moose Lodge",official_name:"Loyal Order of Moose"}},"amenity/social_centre|Odd Fellows Hall":{matchNames:["ioof","odd fellow","odd fellows"],tags:{amenity:"social_centre",brand:"Independent Order of Odd Fellows","brand:wikidata":"Q1425508","brand:wikipedia":"en:Independent Order of Odd Fellows",name:"Odd Fellows Hall",official_name:"Independent Order of Odd Fellows"}},"amenity/vehicle_inspection|Autosur":{countryCodes:["fr"],tags:{amenity:"vehicle_inspection",brand:"Autosur","brand:wikidata":"Q64224807",name:"Autosur"}},"amenity/vehicle_inspection|Autovision":{countryCodes:["fr"],tags:{amenity:"vehicle_inspection",brand:"Autovision","brand:wikidata":"Q64224842",name:"Autovision"}},"amenity/vehicle_inspection|Dekra":{countryCodes:["de","fr"],tags:{amenity:"vehicle_inspection",brand:"Dekra","brand:wikidata":"Q383711","brand:wikipedia":"en:Dekra",name:"Dekra",official_name:"Dekra Automotive"}},"amenity/vehicle_inspection|Sécuritest":{countryCodes:["fr"],tags:{amenity:"vehicle_inspection",brand:"Sécuritest","brand:wikidata":"Q64224992",name:"Sécuritest"}},"amenity/vending_machine|Amazon Locker":{countryCodes:["de","us"],tags:{amenity:"vending_machine",brand:"Amazon Locker","brand:wikidata":"Q16974764","brand:wikipedia":"en:Amazon Locker",name:"Amazon Locker",vending:"parcel_pickup"}},"amenity/vending_machine|Automat ŚKUP":{countryCodes:["pl"],tags:{amenity:"vending_machine",brand:"Automat ŚKUP","brand:wikidata":"Q24945427","brand:wikipedia":"pl:Śląska Karta Usług Publicznych",name:"Automat ŚKUP",vending:"public_transport_tickets"}},"amenity/vending_machine|BKK-automata":{countryCodes:["hu"],tags:{amenity:"vending_machine",brand:"BKK-automata","brand:wikidata":"Q608917","brand:wikipedia":"hu:Budapesti Közlekedési Központ",name:"BKK-automata",vending:"public_transport_tickets"}},"amenity/vending_machine|DHL Packstation":{countryCodes:["de"],matchTags:["amenity/post_box"],tags:{amenity:"vending_machine",brand:"Packstation","brand:wikidata":"Q1766703","brand:wikipedia":"en:Packstation",name:"DHL Packstation",vending:"parcel_pickup;parcel_mail_in"}},"amenity/vending_machine|DHL Paketbox":{countryCodes:["de"],tags:{amenity:"vending_machine",brand:"Paketbox","brand:wikidata":"Q2046604","brand:wikipedia":"de:Paketbox",name:"DHL Paketbox",vending:"parcel_mail_in"}},"amenity/vending_machine|Dog-Station":{countryCodes:["at","de","dk"],tags:{amenity:"vending_machine",brand:"Dog-Station","brand:wikidata":"Q63720061",name:"Dog-Station",vending:"excrement_bags"}},"amenity/vending_machine|KKM":{countryCodes:["pl"],tags:{amenity:"vending_machine",brand:"KKM","brand:wikidata":"Q57515549",name:"KKM",vending:"public_transport_tickets"}},"amenity/vending_machine|Paczkomat InPost":{countryCodes:["pl"],tags:{amenity:"vending_machine",brand:"InPost","brand:wikidata":"Q3182097","brand:wikipedia":"pl:InPost",name:"Paczkomat InPost",vending:"parcel_pickup;parcel_mail_in"}},"amenity/vending_machine|ParkPlus~(Calgary)":{countryCodes:["ca"],tags:{amenity:"vending_machine",brand:"ParkPlus","brand:wikidata":"Q63719595",name:"ParkPlus",vending:"parking_tickets"}},"amenity/vending_machine|Redbox":{countryCodes:["us"],tags:{amenity:"vending_machine",brand:"Redbox","brand:wikidata":"Q7305489","brand:wikipedia":"en:Redbox",name:"Redbox",vending:"dvd"}},"amenity/vending_machine|Robidog":{countryCodes:["ch"],tags:{amenity:"vending_machine",brand:"Robidog","brand:wikidata":"Q2159689","brand:wikipedia":"de:Robidog",name:"Robidog",vending:"excrement_bags"}},"amenity/vending_machine|Schlauchomat":{countryCodes:["at","de","it"],tags:{amenity:"vending_machine",brand:"Schlauchomat",name:"Schlauchomat",vending:"bicycle_tube"}},"amenity/vending_machine|Smartpost":{countryCodes:["fi"],matchTags:["amenity/post_box"],tags:{amenity:"vending_machine",brand:"Smartpost","brand:wikidata":"Q7543889","brand:wikipedia":"fi:SmartPOST",name:"Smartpost",vending:"parcel_pickup;parcel_mail_in"}},"amenity/vending_machine|Tobaccoland":{countryCodes:["de"],tags:{amenity:"vending_machine",brand:"Tobaccoland","brand:wikidata":"Q1439872","brand:wikipedia":"de:Tobaccoland Automatengesellschaft",name:"Tobaccoland",vending:"cigarettes"}},"amenity/vending_machine|VVO Fahrausweise":{countryCodes:["de"],tags:{amenity:"vending_machine",brand:"VVO Fahrausweise",name:"VVO Fahrausweise",vending:"public_transport_tickets"}},"amenity/vending_machine|Ключ здоровья":{countryCodes:["ru"],matchTags:["shop/water"],tags:{amenity:"vending_machine",brand:"Ключ здоровья",name:"Ключ здоровья",vending:"water"}},"amenity/vending_machine|コカ・コーラ":{countryCodes:["jp"],tags:{amenity:"vending_machine",brand:"コカ・コーラ","brand:en":"Coca-Cola","brand:ja":"コカ・コーラ","brand:wikidata":"Q2813","brand:wikipedia":"ja:コカ・コーラ",drink:"cola",name:"コカ・コーラ","name:en":"Coca-Cola","name:ja":"コカ・コーラ",vending:"drinks"}},"amenity/vending_machine|ポッカサッポロ":{countryCodes:["jp"],matchNames:["pokka sapporo"],tags:{amenity:"vending_machine",brand:"ポッカサッポロ","brand:en":"Pokka Sapporo","brand:ja":"ポッカサッポロ","brand:wikidata":"Q7208665","brand:wikipedia":"ja:ポッカサッポロフード&ビバレッジ",name:"ポッカサッポロ","name:en":"Pokka Sapporo","name:ja":"ポッカサッポロ",vending:"water;food"}},"amenity/veterinary|Banfield Pet Hospital":{countryCodes:["us"],tags:{amenity:"veterinary",brand:"Banfield Pet Hospital","brand:wikidata":"Q2882416","brand:wikipedia":"en:Banfield Pet Hospital",name:"Banfield Pet Hospital"}},"amenity/veterinary|VCA Animal Hospital":{countryCodes:["ca","us"],tags:{amenity:"veterinary",brand:"VCA Animal Hospital","brand:wikidata":"Q7906620","brand:wikipedia":"en:VCA Animal Hospitals",name:"VCA Animal Hospital"}},"craft/signmaker|Fastsigns":{countryCodes:["ae","ca","cl","gb","ky","mx","sa","us"],matchTags:["shop/sign"],tags:{brand:"Fastsigns","brand:wikidata":"Q5437127","brand:wikipedia":"en:Fastsigns",craft:"signmaker",name:"Fastsigns"}},"healthcare/blood_donation|Australian Red Cross Blood Service":{countryCodes:["au"],tags:{brand:"Australian Red Cross","brand:wikidata":"Q4824610","brand:wikipedia":"en:Australian Red Cross","donation:compensation":"no",healthcare:"blood_donation",name:"Australian Red Cross Blood Service",short_name:"Blood Service"}},"healthcare/clinic|ZoomCare":{countryCodes:["us"],tags:{amenity:"clinic",brand:"ZoomCare","brand:wikidata":"Q64120374","brand:wikipedia":"en:ZoomCare",healthcare:"clinic",name:"ZoomCare",urgent_care:"yes"}},"healthcare/counselling|Jenny Craig":{countryCodes:["au","ca","nz","us"],matchTags:["amenity/doctors","amenity/weight_clinic","leisure/fitness_centre","office/therapist","shop/beauty","shop/diet","shop/food","shop/health_food","shop/herbalist","shop/nutrition","shop/nutrition_supplements","shop/weight_loss"],tags:{brand:"Jenny Craig","brand:wikidata":"Q6179221","brand:wikipedia":"en:Jenny Craig, Inc.",healthcare:"counselling","healthcare:counselling":"dietitian","healthcare:speciality":"weight_loss",name:"Jenny Craig"}},"healthcare/counselling|WW Studio":{matchNames:["ww"],matchTags:["amenity/doctors","amenity/weight_clinic","leisure/fitness_centre","office/therapist","shop/beauty","shop/diet","shop/food","shop/health_food","shop/herbalist","shop/nutrition","shop/nutrition_supplements","shop/weight_loss"],tags:{alt_name:"Weight Watchers",brand:"WW Studio","brand:wikidata":"Q1929466","brand:wikipedia":"en:WW International",healthcare:"counselling","healthcare:counselling":"dietitian","healthcare:speciality":"weight_loss",name:"WW Studio"}},"landuse/residential|Avalon":{countryCodes:["us"],tags:{brand:"Avalon","brand:wikidata":"Q64665938",landuse:"residential",name:"Avalon",residential:"apartments"}},"leisure/escape_game|Escapology":{countryCodes:["us"],matchTags:["tourism/attraction"],tags:{brand:"Escapology","brand:wikidata":"Q64137163",leisure:"escape_game",name:"Escapology"}},"leisure/fitness_centre|24 Hour Fitness":{countryCodes:["us"],tags:{brand:"24 Hour Fitness","brand:wikidata":"Q4631849","brand:wikipedia":"en:24 Hour Fitness",leisure:"fitness_centre",name:"24 Hour Fitness"}},"leisure/fitness_centre|Anytime Fitness":{tags:{brand:"Anytime Fitness","brand:wikidata":"Q4778364","brand:wikipedia":"en:Anytime Fitness",leisure:"fitness_centre",name:"Anytime Fitness"}},"leisure/fitness_centre|Basic-Fit":{countryCodes:["be","es","fr","lu","nl"],tags:{brand:"Basic-Fit","brand:wikidata":"Q40165577","brand:wikipedia":"nl:Basic-Fit",leisure:"fitness_centre",name:"Basic-Fit"}},"leisure/fitness_centre|Clever fit":{countryCodes:["at","ch","de"],tags:{brand:"Clever fit","brand:wikidata":"Q27909675","brand:wikipedia":"de:Clever fit",leisure:"fitness_centre",name:"Clever fit"}},"leisure/fitness_centre|CorePower Yoga":{countryCodes:["us"],matchNames:["corepower"],matchTags:["club/sport","leisure/sports_centre"],tags:{brand:"CorePower Yoga","brand:wikidata":"Q21015663","brand:wikipedia":"en:CorePower Yoga",leisure:"fitness_centre",name:"CorePower Yoga",sport:"yoga"}},"leisure/fitness_centre|Crunch Fitness":{countryCodes:["au","ca","us"],tags:{brand:"Crunch Fitness","brand:wikidata":"Q5190093","brand:wikipedia":"en:Crunch Fitness",leisure:"fitness_centre",name:"Crunch Fitness"}},"leisure/fitness_centre|Curves":{tags:{brand:"Curves","brand:wikidata":"Q5196080","brand:wikipedia":"en:Curves International",leisure:"fitness_centre",name:"Curves"}},"leisure/fitness_centre|F45 Training":{tags:{brand:"F45 Training","brand:wikidata":"Q64390973",leisure:"fitness_centre",name:"F45 Training"}},"leisure/fitness_centre|Fit4Less ~(Canada)":{countryCodes:["ca"],tags:{brand:"Fit4Less","brand:wikidata":"Q64821050",leisure:"fitness_centre",name:"Fit4Less"}},"leisure/fitness_centre|Fit4less ~(UK)":{countryCodes:["uk"],tags:{brand:"Fit4less","brand:wikidata":"Q64821053",leisure:"fitness_centre",name:"Fit4less"}},"leisure/fitness_centre|Fitness First":{countryCodes:["ae","au","de","gb","ph","th"],tags:{brand:"Fitness First","brand:wikidata":"Q127120","brand:wikipedia":"en:Fitness First",leisure:"fitness_centre",name:"Fitness First"}},"leisure/fitness_centre|Fitness24Seven":{countryCodes:["fi","se"],tags:{brand:"Fitness24Seven","brand:wikidata":"Q61112447","brand:wikipedia":"sv:Fitness24Seven",leisure:"fitness_centre",name:"Fitness24Seven"}},"leisure/fitness_centre|Gold's Gym":{countryCodes:["ae","in","ph","us"],tags:{brand:"Gold's Gym","brand:wikidata":"Q1536234","brand:wikipedia":"en:Gold's Gym",leisure:"fitness_centre",name:"Gold's Gym"}},"leisure/fitness_centre|GoodLife Fitness":{countryCodes:["ca"],tags:{brand:"GoodLife Fitness","brand:wikidata":"Q3110654","brand:wikipedia":"en:GoodLife Fitness",leisure:"fitness_centre",name:"GoodLife Fitness"}},"leisure/fitness_centre|Jazzercise":{countryCodes:["us"],matchTags:["leisure/dance"],tags:{brand:"Jazzercise","brand:wikidata":"Q6168434","brand:wikipedia":"en:Jazzercise",leisure:"fitness_centre",name:"Jazzercise"}},"leisure/fitness_centre|LA Fitness":{countryCodes:["ca","gb","us"],tags:{brand:"LA Fitness","brand:wikidata":"Q6457180","brand:wikipedia":"en:LA Fitness",leisure:"fitness_centre",name:"LA Fitness"}},"leisure/fitness_centre|Life Time":{countryCodes:["ca","us"],matchNames:["life time athletic","life time fitness"],tags:{brand:"Life Time","brand:wikidata":"Q6545004","brand:wikipedia":"en:Life Time Fitness",leisure:"fitness_centre",name:"Life Time"}},"leisure/fitness_centre|McFit":{countryCodes:["at","de","es","it","pl"],tags:{brand:"McFit","brand:wikidata":"Q871302","brand:wikipedia":"en:McFit",leisure:"fitness_centre",name:"McFit"}},"leisure/fitness_centre|Orangetheory Fitness":{countryCodes:["ca","es","us"],matchNames:["orangetheory"],tags:{brand:"Orangetheory Fitness","brand:wikidata":"Q25005163","brand:wikipedia":"en:Orangetheory Fitness",leisure:"fitness_centre",name:"Orangetheory Fitness"}},"leisure/fitness_centre|Planet Fitness":{countryCodes:["ca","us"],tags:{brand:"Planet Fitness","brand:wikidata":"Q7201095","brand:wikipedia":"en:Planet Fitness",leisure:"fitness_centre",name:"Planet Fitness"}},"leisure/fitness_centre|PureGym":{countryCodes:["gb"],tags:{brand:"PureGym","brand:wikidata":"Q18345898","brand:wikipedia":"en:PureGym",leisure:"fitness_centre",name:"PureGym"}},"leisure/fitness_centre|Retro Fitness":{countryCodes:["us"],tags:{brand:"Retro Fitness","brand:wikidata":"Q61994955",leisure:"fitness_centre",name:"Retro Fitness"}},"leisure/fitness_centre|Snap Fitness":{tags:{brand:"Snap Fitness","brand:wikidata":"Q7547254","brand:wikipedia":"en:Snap Fitness",leisure:"fitness_centre",name:"Snap Fitness"}},"leisure/playground|McDonald's PlayPlace":{matchNames:["mcdonald's"],tags:{access:"customers",brand:"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"en:McDonald's",leisure:"playground",name:"McDonald's PlayPlace"}},"leisure/sports_centre|YMCA":{tags:{brand:"YMCA","brand:wikidata":"Q157169","brand:wikipedia":"en:YMCA",leisure:"sports_centre",name:"YMCA"}},"leisure/sports_centre|iFLY":{tags:{brand:"iFLY","brand:wikidata":"Q64767105",leisure:"sports_centre",name:"iFLY",sport:"indoor_skydiving"}},"leisure/tanning_salon|Palm Beach Tan":{countryCodes:["us"],matchTags:["shop/beauty","shop/solarium"],tags:{beauty:"tanning",brand:"Palm Beach Tan","brand:wikidata":"Q64027086","brand:wikipedia":"en:Palm Beach Tan",leisure:"tanning_salon",name:"Palm Beach Tan",shop:"beauty"}},"office/bail_bond_agent|Aladdin Bail Bonds":{countryCodes:["us"],matchNames:["aladdin","aladin bail bonds","alladin bail bonds"],matchTags:["amenity/bail_bond","amenity/bail_bonds","office/bail_bond","office/bail_bonds","shop/bail_bond","shop/bail_bonds","shop/money_lender"],tags:{brand:"Aladdin Bail Bonds","brand:wikidata":"Q64166257","brand:wikipedia":"en:Aladdin Bail Bonds",name:"Aladdin Bail Bonds",office:"bail_bond_agent",opening_hours:"24/7"}},"office/employment_agency|Adecco":{tags:{brand:"Adecco","brand:wikidata":"Q353494","brand:wikipedia":"en:The Adecco Group",name:"Adecco",office:"employment_agency"}},"office/employment_agency|Agentur für Arbeit":{countryCodes:["de"],tags:{brand:"Agentur für Arbeit",name:"Agentur für Arbeit",office:"employment_agency"}},"office/employment_agency|Appel Médical":{countryCodes:["fr"],tags:{brand:"Appel Médical",name:"Appel Médical",office:"employment_agency"}},"office/employment_agency|Job Centre Plus":{countryCodes:["gb"],tags:{brand:"Job Centre Plus",name:"Job Centre Plus",office:"employment_agency"}},"office/employment_agency|Manpower":{tags:{brand:"Manpower","brand:wikidata":"Q1472539","brand:wikipedia":"en:ManpowerGroup",name:"Manpower",office:"employment_agency"}},"office/employment_agency|Pôle Emploi":{countryCodes:["fr"],tags:{brand:"Pôle Emploi","brand:wikidata":"Q8901192","brand:wikipedia":"en:Pôle emploi",name:"Pôle Emploi",office:"employment_agency"}},"office/employment_agency|Randstad":{tags:{brand:"Randstad","brand:wikidata":"Q267840","brand:wikipedia":"en:Randstad Holding",name:"Randstad",office:"employment_agency"}},"office/estate_agent|Bairstow Eves":{countryCodes:["gb"],tags:{brand:"Bairstow Eves",name:"Bairstow Eves",office:"estate_agent"}},"office/estate_agent|Century 21":{matchNames:["century 21 real estate"],nomatch:["shop/department_store|Century 21"],tags:{brand:"Century 21","brand:wikidata":"Q1054480","brand:wikipedia":"en:Century 21 (real estate)",name:"Century 21",office:"estate_agent"}},"office/estate_agent|Coldwell Banker":{matchNames:["coldwell banker real estate"],tags:{brand:"Coldwell Banker","brand:wikidata":"Q738853","brand:wikipedia":"en:Coldwell Banker",name:"Coldwell Banker",office:"estate_agent"}},"office/estate_agent|Connells":{countryCodes:["gb"],tags:{brand:"Connells",name:"Connells",office:"estate_agent"}},"office/estate_agent|Engel & Völkers":{tags:{brand:"Engel & Völkers","brand:wikidata":"Q1341765","brand:wikipedia":"en:Engel & Völkers",name:"Engel & Völkers",office:"estate_agent"}},"office/estate_agent|Foncia":{countryCodes:["fr"],tags:{brand:"Foncia","brand:wikidata":"Q1435638","brand:wikipedia":"fr:Foncia",name:"Foncia",office:"estate_agent"}},"office/estate_agent|Guy Hoquet":{countryCodes:["fr"],tags:{brand:"Guy Hoquet","brand:wikidata":"Q25383970","brand:wikipedia":"fr:Guy Hoquet l'immobilier",name:"Guy Hoquet",office:"estate_agent"}},"office/estate_agent|Hamptons International Lettings":{countryCodes:["gb"],tags:{brand:"Hamptons International Lettings",name:"Hamptons International Lettings",office:"estate_agent"}},"office/estate_agent|Hamptons International Sales":{countryCodes:["gb"],tags:{brand:"Hamptons International Sales",name:"Hamptons International Sales",office:"estate_agent"}},"office/estate_agent|Laforêt":{countryCodes:["fr"],tags:{brand:"Laforêt",name:"Laforêt",office:"estate_agent"}},"office/estate_agent|Orpi":{countryCodes:["fr"],tags:{brand:"Orpi","brand:wikidata":"Q3356080","brand:wikipedia":"fr:Organisation régionale des professionnels de l'immobilier",name:"Orpi",office:"estate_agent"}},"office/estate_agent|RE/MAX":{tags:{brand:"RE/MAX","brand:wikidata":"Q965845","brand:wikipedia":"en:RE/MAX",name:"RE/MAX",office:"estate_agent"}},"office/estate_agent|Ray White":{countryCodes:["au","nz"],tags:{brand:"Ray White",name:"Ray White",office:"estate_agent"}},"office/estate_agent|Royal LePage":{countryCodes:["ca"],tags:{brand:"Royal LePage","brand:wikidata":"Q7374385","brand:wikipedia":"en:Royal LePage",name:"Royal LePage",office:"estate_agent"}},"office/estate_agent|Square Habitat":{countryCodes:["fr"],tags:{brand:"Square Habitat","brand:wikidata":"Q64027038","brand:wikipedia":"fr:Square Habitat",name:"Square Habitat",office:"estate_agent"}},"office/estate_agent|Tecnocasa":{countryCodes:["es","it","pl"],tags:{brand:"Tecnocasa",name:"Tecnocasa",office:"estate_agent"}},"office/estate_agent|Your Move":{countryCodes:["gb"],tags:{brand:"Your Move",name:"Your Move",office:"estate_agent"}},"office/estate_agent|アパマンショップ":{countryCodes:["jp"],tags:{brand:"アパマンショップ","brand:ja":"アパマンショップ",name:"アパマンショップ","name:ja":"アパマンショップ",office:"estate_agent"}},"office/estate_agent|エイブル":{countryCodes:["jp"],tags:{brand:"エイブル","brand:ja":"エイブル",name:"エイブル","name:ja":"エイブル",office:"estate_agent"}},"office/estate_agent|ピタットハウス":{countryCodes:["jp"],tags:{brand:"ピタットハウス","brand:ja":"ピタットハウス",name:"ピタットハウス","name:ja":"ピタットハウス",office:"estate_agent"}},"office/estate_agent|信義房屋":{countryCodes:["tw"],tags:{brand:"信義房屋",name:"信義房屋",office:"estate_agent"}},"office/estate_agent|永慶房屋":{countryCodes:["tw"],tags:{brand:"永慶房屋",name:"永慶房屋",office:"estate_agent"}},"office/financial_advisor|Edward Jones":{countryCodes:["ca","us"],tags:{alt_name:"Edward Jones Investments",brand:"Edward Jones","brand:wikidata":"Q5343830","brand:wikipedia":"en:Edward Jones Investments",name:"Edward Jones",office:"financial_advisor"}},"office/insurance|AAA Insurance":{countryCodes:["us"],matchNames:["american automobile association"],nomatch:["office/travel_agency|American Automobile Association"],tags:{brand:"American Automobile Association","brand:wikidata":"Q463436","brand:wikipedia":"en:American Automobile Association",name:"AAA Insurance",office:"insurance",short_name:"AAA"}},"office/insurance|AOK":{countryCodes:["de"],tags:{brand:"AOK","brand:wikidata":"Q835141","brand:wikipedia":"de:Allgemeine Ortskrankenkasse",name:"AOK",office:"insurance"}},"office/insurance|AXA":{nomatch:["amenity/bank|AXA"],tags:{brand:"AXA","brand:wikidata":"Q160054","brand:wikipedia":"en:AXA",name:"AXA",office:"insurance"}},"office/insurance|Allianz":{tags:{brand:"Allianz","brand:wikidata":"Q487292","brand:wikipedia":"en:Allianz",name:"Allianz",office:"insurance"}},"office/insurance|Allstate":{countryCodes:["us"],matchNames:["allstate insurance"],tags:{brand:"Allstate","brand:wikidata":"Q2645636","brand:wikipedia":"en:Allstate",name:"Allstate",office:"insurance"}},"office/insurance|American Family Insurance":{countryCodes:["us"],matchNames:["american family","amfam"],tags:{brand:"American Family Insurance","brand:wikidata":"Q4743730","brand:wikipedia":"en:American Family Insurance",name:"American Family Insurance",office:"insurance"}},"office/insurance|Assu 2000":{countryCodes:["fr"],tags:{brand:"Assu 2000",name:"Assu 2000",office:"insurance"}},"office/insurance|Aviva":{countryCodes:["fr","ie","pl"],tags:{brand:"Aviva","brand:wikidata":"Q791179","brand:wikipedia":"en:Aviva",name:"Aviva",office:"insurance"}},"office/insurance|CUK Ubezpieczenia":{countryCodes:["pl"],tags:{brand:"CUK Ubezpieczenia",name:"CUK Ubezpieczenia",office:"insurance"}},"office/insurance|DEVK":{countryCodes:["de"],tags:{brand:"DEVK","brand:wikidata":"Q1153049","brand:wikipedia":"de:DEVK",name:"DEVK",office:"insurance"}},"office/insurance|Debeka":{countryCodes:["de"],tags:{brand:"Debeka","brand:wikidata":"Q1181452","brand:wikipedia":"de:Debeka",name:"Debeka",office:"insurance"}},"office/insurance|Erie Insurance":{countryCodes:["us"],matchNames:["erie"],tags:{brand:"Erie Insurance","brand:wikidata":"Q5388314","brand:wikipedia":"en:Erie Insurance Group",name:"Erie Insurance",office:"insurance"}},"office/insurance|Farmers Insurance":{countryCodes:["us"],matchNames:["farmers"],tags:{brand:"Farmers Insurance","brand:wikidata":"Q1396863","brand:wikipedia":"en:Farmers Insurance Group",name:"Farmers Insurance",office:"insurance"}},"office/insurance|GEICO":{countryCodes:["us"],tags:{brand:"GEICO","brand:wikidata":"Q1498689","brand:wikipedia":"en:GEICO",name:"GEICO",office:"insurance"}},"office/insurance|GMF":{countryCodes:["fr"],tags:{brand:"GMF",name:"GMF",office:"insurance"}},"office/insurance|Generali":{tags:{brand:"Generali","brand:wikidata":"Q670482","brand:wikipedia":"it:Assicurazioni Generali",name:"Generali",office:"insurance"}},"office/insurance|Grange Insurance":{countryCodes:["us"],matchNames:["grange"],tags:{brand:"Grange Insurance","brand:wikidata":"Q17183481","brand:wikipedia":"en:Grange Insurance",name:"Grange Insurance",office:"insurance"}},"office/insurance|Groupama":{matchTags:["amenity/bank|Groupama"],tags:{brand:"Groupama","brand:wikidata":"Q3083531","brand:wikipedia":"fr:Groupama",name:"Groupama",office:"insurance",official_name:"Groupe des Assurances Mutuelles Agricoles"}},"office/insurance|HUK-Coburg":{countryCodes:["de"],tags:{brand:"HUK-Coburg",name:"HUK-Coburg",office:"insurance"}},"office/insurance|Knappschaft":{countryCodes:["de"],tags:{brand:"Knappschaft","brand:wikidata":"Q1313465","brand:wikipedia":"de:Knappschaft (Krankenkasse)",name:"Knappschaft",office:"insurance"}},"office/insurance|MAAF":{countryCodes:["fr"],tags:{brand:"MAAF","brand:wikidata":"Q3331028","brand:wikipedia":"fr:Mutuelle d'assurance des artisans de France",name:"MAAF",office:"insurance"}},"office/insurance|MMA":{countryCodes:["fr"],tags:{brand:"MMA","brand:wikidata":"Q3331046","brand:wikipedia":"fr:MMA (assurance)",name:"MMA",office:"insurance",official_name:"Mutuelles du Mans Assurances"}},"office/insurance|Macif":{countryCodes:["fr"],tags:{brand:"Macif","brand:wikidata":"Q3331021","brand:wikipedia":"fr:Mutuelle assurance des commerçants et industriels de France et des cadres et des salariés de l'industrie et du commerce",name:"Macif",office:"insurance"}},"office/insurance|Maif":{countryCodes:["fr"],tags:{brand:"Maif","brand:wikidata":"Q3331029","brand:wikipedia":"fr:Maif",name:"Maif",office:"insurance",official_name:"Mutuelle d'assurance des instituteurs de France"}},"office/insurance|Mapfre":{tags:{brand:"Mapfre","brand:wikidata":"Q544532","brand:wikipedia":"en:Mapfre",name:"Mapfre",office:"insurance"}},"office/insurance|Matmut":{countryCodes:["fr"],tags:{brand:"Matmut","brand:wikidata":"Q3299185","brand:wikipedia":"fr:Matmut",name:"Matmut",office:"insurance"}},"office/insurance|Nationwide":{countryCodes:["us"],matchNames:["nationwide insurance"],nomatch:["amenity/bank|Nationwide"],tags:{brand:"Nationwide","brand:wikidata":"Q6979886","brand:wikipedia":"en:Nationwide Mutual Insurance Company",name:"Nationwide",office:"insurance"}},"office/insurance|PZU":{countryCodes:["pl"],tags:{brand:"PZU","brand:wikidata":"Q1807170","brand:wikipedia":"pl:Powszechny Zakład Ubezpieczeń",name:"PZU",office:"insurance"}},"office/insurance|Progressive":{countryCodes:["us"],matchNames:["progressive insurance"],tags:{brand:"Progressive","brand:wikidata":"Q7248721","brand:wikipedia":"en:Progressive Corporation",name:"Progressive",office:"insurance"}},"office/insurance|Provinzial":{countryCodes:["de"],tags:{brand:"Provinzial",name:"Provinzial",office:"insurance"}},"office/insurance|State Farm":{countryCodes:["us"],matchNames:["state farm insurance"],tags:{brand:"State Farm","brand:wikidata":"Q2007336","brand:wikipedia":"en:State Farm",name:"State Farm",office:"insurance"}},"office/insurance|Techniker Krankenkasse":{countryCodes:["de"],tags:{brand:"Techniker Krankenkasse","brand:wikidata":"Q607531","brand:wikipedia":"de:Techniker Krankenkasse",name:"Techniker Krankenkasse",office:"insurance"}},"office/insurance|The Co-operators":{countryCodes:["ca"],tags:{brand:"The Co-operators","brand:wikidata":"Q3520320","brand:wikipedia":"en:The Co-operators",name:"The Co-operators",office:"insurance"}},"office/insurance|Wüstenrot":{countryCodes:["at","cz","de","sk"],tags:{brand:"Wüstenrot",name:"Wüstenrot",office:"insurance"}},"office/insurance|Zurich":{tags:{brand:"Zurich",name:"Zurich",office:"insurance"}},"office/insurance|Белгосстрах":{countryCodes:["by"],tags:{brand:"Белгосстрах",name:"Белгосстрах",office:"insurance"}},"office/insurance|Ингосстрах":{countryCodes:["ru"],tags:{brand:"Ингосстрах",name:"Ингосстрах",office:"insurance"}},"office/insurance|РЕСО-Гарантия":{countryCodes:["ru"],tags:{brand:"РЕСО-Гарантия",name:"РЕСО-Гарантия",office:"insurance"}},"office/insurance|Росгосстрах":{countryCodes:["ru"],tags:{brand:"Росгосстрах","brand:wikidata":"Q4397745","brand:wikipedia":"en:Rosgosstrakh",name:"Росгосстрах",office:"insurance"}},"office/insurance|Согласие":{countryCodes:["ru"],tags:{brand:"Согласие",name:"Согласие",office:"insurance"}},"office/insurance|بیمه ایران":{countryCodes:["ir"],tags:{brand:"بیمه ایران",name:"بیمه ایران",office:"insurance"}},"office/tax_advisor|Block Advisors":{countryCodes:["us"],tags:{brand:"Block Advisors","brand:wikidata":"Q64166231",name:"Block Advisors",office:"tax_advisor"}},"office/tax_advisor|H&R Block":{countryCodes:["au","ca","in","us"],tags:{brand:"H&R Block","brand:wikidata":"Q5627799","brand:wikipedia":"en:H&R Block",name:"H&R Block",office:"tax_advisor"}},"office/tax_advisor|Jackson Hewitt":{countryCodes:["us"],tags:{brand:"Jackson Hewitt","brand:wikidata":"Q6117132","brand:wikipedia":"en:Jackson Hewitt",name:"Jackson Hewitt",office:"tax_advisor",official_name:"Jackson Hewitt Tax Service"}},"office/tax_advisor|Liberty Tax":{countryCodes:["us"],tags:{alt_name:"Liberty Tax Service",brand:"Liberty Tax","brand:wikidata":"Q6541978","brand:wikipedia":"en:Liberty Tax Service",name:"Liberty Tax",office:"tax_advisor"}},"office/telecommunication|Ooredoo":{tags:{brand:"Ooredoo","brand:wikidata":"Q919935","brand:wikipedia":"en:Ooredoo",name:"Ooredoo",office:"telecommunication"}},"office/telecommunication|Velcom":{countryCodes:["by"],tags:{brand:"Velcom","brand:wikidata":"Q1888809","brand:wikipedia":"en:Velcom",name:"Velcom",office:"telecommunication"}},"office/telecommunication|Магазин lifecell":{tags:{brand:"Магазин lifecell",name:"Магазин lifecell",office:"telecommunication"}},"office/telecommunication|Ростелеком":{countryCodes:["ru"],tags:{brand:"Ростелеком","brand:wikidata":"Q1477012","brand:wikipedia":"en:Rostelecom",name:"Ростелеком",office:"telecommunication"}},"office/telecommunication|Укртелеком":{countryCodes:["ua"],tags:{brand:"Укртелеком","brand:wikidata":"Q1505321","brand:wikipedia":"en:Ukrtelecom",name:"Укртелеком",office:"telecommunication"}},"office/telecommunication|中華電信":{countryCodes:["tw"],tags:{brand:"中華電信",name:"中華電信",office:"telecommunication"}},"office/telecommunication|台灣大哥大":{countryCodes:["tw"],tags:{brand:"台灣大哥大",name:"台灣大哥大",office:"telecommunication"}},"office/telecommunication|遠傳電信":{countryCodes:["tw"],tags:{brand:"遠傳電信",name:"遠傳電信",office:"telecommunication"}},"shop/agrarian|Granngården":{countryCodes:["se"],tags:{brand:"Granngården","brand:wikidata":"Q10508136","brand:wikipedia":"sv:Granngården AB",name:"Granngården",shop:"agrarian"}},"shop/alcohol|Alko":{countryCodes:["fi"],tags:{brand:"Alko","brand:wikidata":"Q1849187","brand:wikipedia":"en:Alko",name:"Alko",shop:"alcohol"}},"shop/alcohol|BC Liquor Store":{countryCodes:["ca"],tags:{brand:"BC Liquor Store","brand:wikidata":"Q43079557","brand:wikipedia":"en:BC Liquor Stores",name:"BC Liquor Store",shop:"alcohol"}},"shop/alcohol|BWS":{countryCodes:["au"],tags:{brand:"BWS","brand:wikidata":"Q4836848","brand:wikipedia":"en:BWS (liquor retailer)",name:"BWS",shop:"alcohol"}},"shop/alcohol|Bargain Booze":{countryCodes:["gb"],tags:{brand:"Bargain Booze","brand:wikidata":"Q16971315","brand:wikipedia":"en:Bargain Booze",name:"Bargain Booze",shop:"alcohol"}},"shop/alcohol|BevMo!":{countryCodes:["us"],tags:{brand:"BevMo!","brand:wikidata":"Q4899308","brand:wikipedia":"en:BevMo!",name:"BevMo!",shop:"alcohol"}},"shop/alcohol|Cellarbrations":{countryCodes:["au"],tags:{brand:"Cellarbrations",name:"Cellarbrations",shop:"alcohol"}},"shop/alcohol|Dan Murphy's":{countryCodes:["au"],tags:{brand:"Dan Murphy's","brand:wikidata":"Q5214075","brand:wikipedia":"en:Dan Murphy's",name:"Dan Murphy's",shop:"alcohol"}},"shop/alcohol|Fine Wine & Good Spirits":{countryCodes:["us"],tags:{brand:"Fine Wine & Good Spirits","brand:wikidata":"Q64514776",name:"Fine Wine & Good Spirits",shop:"alcohol"}},"shop/alcohol|Gall & Gall":{countryCodes:["nl"],tags:{brand:"Gall & Gall","brand:wikidata":"Q13639185","brand:wikipedia":"nl:Gall & Gall",name:"Gall & Gall",shop:"alcohol"}},"shop/alcohol|LCBO":{countryCodes:["ca"],tags:{brand:"LCBO","brand:wikidata":"Q845263","brand:wikipedia":"en:Liquor Control Board of Ontario",name:"LCBO",shop:"alcohol"}},"shop/alcohol|Liquor Depot":{countryCodes:["ca"],tags:{brand:"Liquor Depot",name:"Liquor Depot",shop:"alcohol"}},"shop/alcohol|Liquorland":{countryCodes:["au"],tags:{brand:"Liquorland","brand:wikidata":"Q2283837","brand:wikipedia":"en:Liquorland",name:"Liquorland",shop:"alcohol"}},"shop/alcohol|Mitra":{countryCodes:["nl"],tags:{brand:"Mitra",name:"Mitra",shop:"alcohol"}},"shop/alcohol|Nicolas":{countryCodes:["be","fr","gb"],tags:{brand:"Nicolas","brand:wikidata":"Q3340012","brand:wikipedia":"en:Nicolas (wine retailer)",name:"Nicolas",shop:"alcohol"}},"shop/alcohol|SAQ":{countryCodes:["ca"],tags:{brand:"SAQ","brand:wikidata":"Q3488077","brand:wikipedia":"en:Société des alcools du Québec",name:"SAQ",shop:"alcohol"}},"shop/alcohol|Spec's":{countryCodes:["us"],tags:{brand:"Spec's","brand:wikidata":"Q7574415","brand:wikipedia":"en:Spec's Wine, Spirits & Finer Foods",name:"Spec's",shop:"alcohol"}},"shop/alcohol|Super Liquor":{countryCodes:["nz"],tags:{brand:"Super Liquor",name:"Super Liquor",shop:"alcohol"}},"shop/alcohol|Systembolaget":{countryCodes:["se"],tags:{brand:"Systembolaget","brand:wikidata":"Q1476113","brand:wikipedia":"en:Systembolaget",name:"Systembolaget",shop:"alcohol"}},"shop/alcohol|The Beer Store":{countryCodes:["ca"],tags:{brand:"The Beer Store","brand:wikidata":"Q16243674","brand:wikipedia":"en:The Beer Store",name:"The Beer Store",shop:"alcohol"}},"shop/alcohol|Thirsty Camel":{countryCodes:["au"],tags:{brand:"Thirsty Camel",name:"Thirsty Camel",shop:"alcohol"}},"shop/alcohol|Total Wine":{countryCodes:["us"],tags:{brand:"Total Wine","brand:wikidata":"Q7828084","brand:wikipedia":"en:Total Wine & More",name:"Total Wine",official_name:"Total Wine & More",shop:"alcohol"}},"shop/alcohol|Virginia ABC":{countryCodes:["us"],tags:{brand:"Virginia ABC","brand:wikidata":"Q7934236","brand:wikipedia":"en:Virginia Alcoholic Beverage Control Authority",name:"Virginia ABC",shop:"alcohol"}},"shop/alcohol|Алкомаркет":{countryCodes:["kz"],tags:{brand:"Алкомаркет",name:"Алкомаркет",shop:"alcohol"}},"shop/alcohol|Ароматный мир":{countryCodes:["ru"],tags:{brand:"Ароматный мир",name:"Ароматный мир",shop:"alcohol"}},"shop/alcohol|Бристоль":{countryCodes:["ru"],matchTags:["shop/convenience"],tags:{brand:"Бристоль","brand:wikidata":"Q59155583","brand:wikipedia":"ru:Бристоль (сеть магазинов)",name:"Бристоль",shop:"alcohol"}},"shop/alcohol|Винлаб":{countryCodes:["ru"],tags:{brand:"Винлаб",name:"Винлаб",shop:"alcohol"}},"shop/alcohol|Горилка":{countryCodes:["kz","ru"],tags:{brand:"Горилка",name:"Горилка",shop:"alcohol"}},"shop/alcohol|Градус":{countryCodes:["ru","ua"],tags:{brand:"Градус",name:"Градус",shop:"alcohol"}},"shop/alcohol|Градусы":{countryCodes:["ru"],tags:{brand:"Градусы",name:"Градусы",shop:"alcohol"}},"shop/alcohol|Красное & Белое":{countryCodes:["ru"],matchNames:["красное и белое"],tags:{brand:"Красное & Белое","brand:en":"Red&White","brand:wikidata":"Q24933790","brand:wikipedia":"en:Krasnoe & Beloe",name:"Красное & Белое","name:en":"Red&White",shop:"alcohol"}},"shop/alcohol|Кристалл":{countryCodes:["by","ru"],matchTags:["shop/convenience"],tags:{brand:"Кристалл",name:"Кристалл",shop:"alcohol"}},"shop/alcohol|Лион":{countryCodes:["ru"],tags:{brand:"Лион",name:"Лион",shop:"alcohol"}},"shop/alcohol|Норман":{countryCodes:["ru"],tags:{brand:"Норман",name:"Норман",shop:"alcohol"}},"shop/alcohol|Отдохни":{countryCodes:["ru"],tags:{brand:"Отдохни",name:"Отдохни",shop:"alcohol"}},"shop/alcohol|Чарка до свята":{tags:{brand:"Чарка до свята",name:"Чарка до свята",shop:"alcohol"}},"shop/alcohol|カクヤス":{countryCodes:["jp"],tags:{brand:"カクヤス","brand:en":"Kakuyasu","brand:ja":"カクヤス","brand:wikidata":"Q11293990","brand:wikipedia":"ja:カクヤス",name:"カクヤス","name:en":"Kakuyasu","name:ja":"カクヤス",shop:"alcohol"}},"shop/art|YellowKorner":{tags:{brand:"YellowKorner","brand:wikidata":"Q3572115","brand:wikipedia":"fr:YellowKorner",name:"YellowKorner",shop:"art"}},"shop/baby_goods|Aubert":{countryCodes:["fr"],tags:{brand:"Aubert","brand:wikidata":"Q62964657",name:"Aubert",shop:"baby_goods"}},"shop/baby_goods|Babies R Us":{countryCodes:["ca","us"],tags:{brand:"Babies R Us","brand:wikidata":"Q17232036",name:"Babies R Us",shop:"baby_goods"}},"shop/baby_goods|BabyOne":{countryCodes:["de"],tags:{brand:"BabyOne","brand:wikidata":"Q57540408",name:"BabyOne",shop:"baby_goods"}},"shop/baby_goods|Buy Buy Baby":{countryCodes:["ca","us"],tags:{brand:"Buy Buy Baby","brand:wikidata":"Q5003352","brand:wikipedia":"en:Buy Buy Baby",name:"Buy Buy Baby",shop:"baby_goods"}},"shop/baby_goods|Mothercare":{tags:{brand:"Mothercare","brand:wikidata":"Q136738","brand:wikipedia":"en:Mothercare",name:"Mothercare",shop:"baby_goods"}},"shop/baby_goods|西松屋":{countryCodes:["jp"],matchTags:["shop/clothes"],tags:{brand:"西松屋","brand:en":"Nishimatsuya Chain","brand:ja":"西松屋","brand:wikidata":"Q11628761","brand:wikipedia":"ja:西松屋",name:"西松屋","name:en":"Nishimatsuya Chain","name:ja":"西松屋",shop:"baby_goods"}},"shop/bag|Carpisa":{countryCodes:["it"],tags:{brand:"Carpisa","brand:wikidata":"Q28035409","brand:wikipedia":"en:Carpisa",name:"Carpisa",shop:"bag"}},"shop/bag|Coach":{countryCodes:["ca","us"],matchNames:["coach new york","coach ny"],tags:{brand:"Coach","brand:wikidata":"Q727697","brand:wikipedia":"en:Coach New York",name:"Coach",shop:"bag"}},"shop/bag|Kipling":{countryCodes:["be","gb"],tags:{brand:"Kipling","brand:wikidata":"Q6414641","brand:wikipedia":"en:Kipling (brand)",name:"Kipling",shop:"bag"}},"shop/bag|Samsonite":{tags:{brand:"Samsonite","brand:wikidata":"Q1203426","brand:wikipedia":"en:Samsonite",name:"Samsonite",shop:"bag"}},"shop/bag|Tumi":{tags:{brand:"Tumi","brand:wikidata":"Q4465402","brand:wikipedia":"en:Tumi Inc.",name:"Tumi",shop:"bag"}},"shop/bag|Vera Bradley":{countryCodes:["us"],tags:{brand:"Vera Bradley","brand:wikidata":"Q7920749","brand:wikipedia":"en:Vera Bradley",name:"Vera Bradley",shop:"bag"}},"shop/bakery|AILI":{countryCodes:["cn"],tags:{brand:"AILI",name:"AILI",shop:"bakery"}},"shop/bakery|Anker":{countryCodes:["at","sk"],tags:{brand:"Anker","brand:wikidata":"Q557116","brand:wikipedia":"de:Ankerbrot",name:"Anker",shop:"bakery"}},"shop/bakery|Awiteks":{countryCodes:["pl"],tags:{brand:"Awiteks","brand:wikidata":"Q62054190",name:"Awiteks",shop:"bakery"}},"shop/bakery|Backwerk":{countryCodes:["at","ch","de","gb","nl"],tags:{brand:"BackWerk","brand:wikidata":"Q798298","brand:wikipedia":"de:BackWerk",name:"Backwerk",shop:"bakery"}},"shop/bakery|Bakers Delight":{countryCodes:["au","ca","nz","us"],tags:{brand:"Bakers Delight","brand:wikidata":"Q4849261","brand:wikipedia":"en:Bakers Delight",name:"Bakers Delight",shop:"bakery"}},"shop/bakery|Bakker Bart":{countryCodes:["be","nl"],tags:{brand:"Bakker Bart","brand:wikidata":"Q2177445","brand:wikipedia":"nl:Bakker Bart",name:"Bakker Bart",shop:"bakery"}},"shop/bakery|Banette":{tags:{brand:"Banette","brand:wikidata":"Q2882405","brand:wikipedia":"fr:Banette (entreprise)",name:"Banette",shop:"bakery"}},"shop/bakery|Birds":{countryCodes:["gb"],tags:{brand:"Birds","brand:wikidata":"Q63001935","brand:wikipedia":"en:Birds Bakery",name:"Birds",official_name:"Birds Bakery",shop:"bakery"}},"shop/bakery|Breadtop":{countryCodes:["au"],tags:{brand:"Breadtop","brand:wikidata":"Q4959217","brand:wikipedia":"en:Breadtop",cuisine:"chinese",name:"Breadtop",shop:"bakery"}},"shop/bakery|Bäckerei Fuchs":{countryCodes:["de"],tags:{brand:"Bäckerei Fuchs","brand:wikidata":"Q42825993","brand:wikipedia":"de:Harald Fuchs Bäckerei – Konditorei",name:"Bäckerei Fuchs",shop:"bakery"}},"shop/bakery|Bäckerei Schmidt":{countryCodes:["de"],tags:{brand:"Bäckerei Schmidt",name:"Bäckerei Schmidt",shop:"bakery"}},"shop/bakery|Bäckerei Schneider":{countryCodes:["de"],tags:{brand:"Bäckerei Schneider",name:"Bäckerei Schneider",shop:"bakery"}},"shop/bakery|Büsch":{countryCodes:["de"],tags:{brand:"Büsch",name:"Büsch",shop:"bakery"}},"shop/bakery|Cadera":{countryCodes:["de"],tags:{brand:"Cadera","brand:wikidata":"Q62086410",name:"Cadera",shop:"bakery"}},"shop/bakery|Cooplands":{countryCodes:["gb"],tags:{brand:"Cooplands","brand:wikidata":"Q5167971","brand:wikipedia":"en:Cooplands",name:"Cooplands",shop:"bakery"}},"shop/bakery|Dat Backhus":{countryCodes:["de"],tags:{brand:"Dat Backhus","brand:wikidata":"Q62093175",name:"Dat Backhus",shop:"bakery"}},"shop/bakery|Der Beck":{countryCodes:["de"],tags:{brand:"Der Beck","brand:wikidata":"Q1192443","brand:wikipedia":"en:Der Beck",name:"Der Beck",shop:"bakery"}},"shop/bakery|Der Mann":{countryCodes:["at"],tags:{brand:"Der Mann",name:"Der Mann",shop:"bakery"}},"shop/bakery|Ditsch":{countryCodes:["de"],tags:{brand:"Ditsch","brand:wikidata":"Q911573","brand:wikipedia":"en:Ditsch",name:"Ditsch",shop:"bakery"}},"shop/bakery|Fischer":{countryCodes:["be","fr"],tags:{brand:"Fischer",name:"Fischer",shop:"bakery"}},"shop/bakery|Fornetti":{tags:{brand:"Fornetti","brand:wikidata":"Q1003020","brand:wikipedia":"en:Fornetti",name:"Fornetti",shop:"bakery"}},"shop/bakery|Goeken backen":{countryCodes:["de"],tags:{brand:"Goeken backen",name:"Goeken backen",shop:"bakery"}},"shop/bakery|Goldilocks":{countryCodes:["ca","ph","th","us"],tags:{brand:"Goldilocks","brand:wikidata":"Q5580198","brand:wikipedia":"en:Goldilocks Bakeshop",name:"Goldilocks",shop:"bakery"}},"shop/bakery|Granier":{countryCodes:["es"],tags:{brand:"Granier",name:"Granier",shop:"bakery"}},"shop/bakery|Greggs":{countryCodes:["gb"],tags:{brand:"Greggs","brand:wikidata":"Q3403981","brand:wikipedia":"en:Greggs",name:"Greggs",shop:"bakery"}},"shop/bakery|Hert":{countryCodes:["pl"],tags:{brand:"Hert",name:"Hert",shop:"bakery"}},"shop/bakery|Hinnerbäcker":{countryCodes:["de"],tags:{brand:"Hinnerbäcker",name:"Hinnerbäcker",shop:"bakery"}},"shop/bakery|Hofpfisterei":{countryCodes:["de"],tags:{brand:"Hofpfisterei","brand:wikidata":"Q1623217","brand:wikipedia":"en:Hofpfisterei",name:"Hofpfisterei",shop:"bakery"}},"shop/bakery|Ihle":{countryCodes:["de"],matchNames:["landbäckerei ihle"],tags:{brand:"Ihle","brand:wikidata":"Q1626371","brand:wikipedia":"de:Landbäckerei Ihle",name:"Ihle",shop:"bakery"}},"shop/bakery|Julie's Bakeshop":{countryCodes:["ph"],tags:{brand:"Julie's Bakeshop",name:"Julie's Bakeshop",shop:"bakery"}},"shop/bakery|K&U Bäckerei":{countryCodes:["de"],matchNames:["k&u"],tags:{brand:"K&U Bäckerei","brand:wikidata":"Q1719433","brand:wikipedia":"de:K & U Bäckerei",name:"K&U Bäckerei",shop:"bakery"}},"shop/bakery|Kamps":{countryCodes:["de"],tags:{brand:"Kamps","brand:wikidata":"Q1723381","brand:wikipedia":"de:Kamps (Unternehmen)",name:"Kamps",shop:"bakery"}},"shop/bakery|La Mie Câline":{countryCodes:["fr"],tags:{brand:"La Mie Câline","brand:wikidata":"Q3210704","brand:wikipedia":"fr:La Mie câline",name:"La Mie Câline",shop:"bakery"}},"shop/bakery|Le Crobag":{countryCodes:["at","de","pl","ru"],tags:{brand:"Le Crobag","brand:wikidata":"Q1558025","brand:wikipedia":"de:Le Crobag",name:"Le Crobag",shop:"bakery"}},"shop/bakery|Le Fournil":{countryCodes:["fr"],tags:{brand:"Le Fournil",name:"Le Fournil",shop:"bakery"}},"shop/bakery|Lila Bäcker":{countryCodes:["de"],tags:{brand:"Lila Bäcker","brand:wikidata":"Q57516591",name:"Lila Bäcker",shop:"bakery"}},"shop/bakery|Lipóti Pékség":{countryCodes:["hu"],tags:{brand:"Lipóti Pékség",name:"Lipóti Pékség",shop:"bakery"}},"shop/bakery|Löwenbäcker Schaper":{countryCodes:["de"],matchNames:["schaper"],tags:{brand:"Löwenbäcker Schaper","brand:wikidata":"Q62075965",name:"Löwenbäcker Schaper",shop:"bakery"}},"shop/bakery|Marie Blachère":{countryCodes:["fr"],tags:{brand:"Marie Blachère","brand:wikidata":"Q62082410",name:"Marie Blachère",shop:"bakery"}},"shop/bakery|Mlinar":{countryCodes:["ba","hr","sl"],tags:{brand:"Mlinar","brand:wikidata":"Q62082464",name:"Mlinar",shop:"bakery"}},"shop/bakery|Musmanni":{countryCodes:["cr"],tags:{brand:"Musmanni","brand:wikidata":"Q19382082","brand:wikipedia":"no:Musmanni",name:"Musmanni",shop:"bakery"}},"shop/bakery|Nothing Bundt Cakes":{countryCodes:["ca","us"],tags:{brand:"Nothing Bundt Cakes","brand:wikidata":"Q62082526",name:"Nothing Bundt Cakes",shop:"bakery"}},"shop/bakery|Nur Hier":{countryCodes:["de"],tags:{brand:"Nur Hier",name:"Nur Hier",shop:"bakery"}},"shop/bakery|Oebel":{countryCodes:["de"],tags:{brand:"Oebel",name:"Oebel",shop:"bakery"}},"shop/bakery|Pan de Manila":{countryCodes:["ph"],tags:{brand:"Pan de Manila",name:"Pan de Manila",shop:"bakery"}},"shop/bakery|Paris Baguette~(worldwide)":{countryCodes:["sg","us","vn"],matchNames:["paris baguette cafe"],nomatch:["shop/bakery|巴黎贝甜","shop/bakery|파리바게뜨"],tags:{brand:"Paris Baguette","brand:wikidata":"Q62605260",name:"Paris Baguette",shop:"bakery"}},"shop/bakery|Paul":{tags:{brand:"Paul","brand:wikidata":"Q3370417","brand:wikipedia":"en:Paul (bakery)",name:"Paul",shop:"bakery"}},"shop/bakery|Red Ribbon":{countryCodes:["ph","us"],tags:{brand:"Red Ribbon","brand:wikidata":"Q7304789","brand:wikipedia":"en:Red Ribbon Bakeshop",name:"Red Ribbon",shop:"bakery"}},"shop/bakery|Ronde des Pains":{countryCodes:["be","fr"],tags:{brand:"Ronde des Pains","brand:wikidata":"Q3441707","brand:wikipedia":"fr:Ronde des Pains",name:"Ronde des Pains",shop:"bakery"}},"shop/bakery|Schäfer's":{countryCodes:["de"],matchNames:["schäfer"],tags:{brand:"Schäfer's","brand:wikidata":"Q1464562","brand:wikipedia":"de:Schäfers Brot",name:"Schäfer's",shop:"bakery"}},"shop/bakery|Sehne":{countryCodes:["de"],tags:{brand:"Sehne","brand:wikidata":"Q1314761","brand:wikipedia":"de:Sehne Backwaren",name:"Sehne",shop:"bakery"}},"shop/bakery|Steinecke":{countryCodes:["de"],tags:{brand:"Steinecke","brand:wikidata":"Q57516278","brand:wikipedia":"de:Meisterbäckerei Steinecke",name:"Steinecke",shop:"bakery"}},"shop/bakery|Sternenbäck":{countryCodes:["de"],tags:{brand:"Sternenbäck","brand:wikidata":"Q62595021",name:"Sternenbäck",shop:"bakery"}},"shop/bakery|Ströck":{countryCodes:["at"],tags:{brand:"Ströck","brand:wikidata":"Q2357607","brand:wikipedia":"de:Ströck-Brot",name:"Ströck",shop:"bakery"}},"shop/bakery|Wiener Feinbäcker":{countryCodes:["de"],tags:{brand:"Wiener Feinbäcker","brand:wikidata":"Q15854357","brand:wikipedia":"de:Wiener Feinbäckerei Heberer",name:"Wiener Feinbäcker",shop:"bakery"}},"shop/bakery|Woops!":{countryCodes:["us"],tags:{brand:"Woops!",name:"Woops!",shop:"bakery"}},"shop/bakery|von Allwörden":{countryCodes:["de"],tags:{brand:"von Allwörden","brand:wikidata":"Q60411349","brand:wikipedia":"nds:Heinrich von Allwörden GmbH",name:"von Allwörden",shop:"bakery"}},"shop/bakery|Булочная Ф. Вольчека":{countryCodes:["ru"],tags:{brand:"Булочная Ф. Вольчека",name:"Булочная Ф. Вольчека",shop:"bakery"}},"shop/bakery|Кулинария":{tags:{brand:"Кулинария",name:"Кулинария",shop:"bakery"}},"shop/bakery|Кулиничи":{countryCodes:["ua"],tags:{brand:"Кулиничи",name:"Кулиничи",shop:"bakery"}},"shop/bakery|Кулиничі":{countryCodes:["ua"],tags:{brand:"Кулиничі",name:"Кулиничі",shop:"bakery"}},"shop/bakery|サンジェルマン":{countryCodes:["jp"],tags:{brand:"サンジェルマン","brand:en":"Saint-Germain","brand:ja":"サンジェルマン","brand:wikidata":"Q11305612","brand:wikipedia":"ja:サンジェルマン (製パン)",name:"サンジェルマン","name:en":"Saint-Germain","name:ja":"サンジェルマン",shop:"bakery"}},"shop/bakery|ヴィ・ド・フランス":{countryCodes:["jp"],tags:{brand:"ヴィ・ド・フランス","brand:en":"Vie de France","brand:ja":"ヴィ・ド・フランス","brand:wikidata":"Q7928249","brand:wikipedia":"ja:ヴィ・ド・フランス",name:"ヴィ・ド・フランス","name:en":"Vie de France","name:ja":"ヴィ・ド・フランス",shop:"bakery"}},"shop/bakery|巴黎贝甜~(China)":{countryCodes:["cn"],matchNames:["paris baguette","paris baguette cafe","巴黎貝甜"],nomatch:["shop/bakery|Paris Baguette","shop/bakery|파리바게뜨"],tags:{brand:"巴黎贝甜","brand:en":"Paris Baguette","brand:wikidata":"Q62605260","brand:zh":"巴黎贝甜",name:"巴黎贝甜","name:en":"Paris Baguette","name:zh":"巴黎贝甜",shop:"bakery"}},"shop/bakery|뚜레쥬르":{countryCodes:["kr"],matchNames:["뚜레주르"],tags:{brand:"뚜레쥬르","brand:en":"Tous Les Jours","brand:ko":"뚜레쥬르","brand:wikidata":"Q3535609","brand:wikipedia":"ko:뚜레쥬르",name:"뚜레쥬르","name:en":"Tous Les Jours","name:ko":"뚜레쥬르",shop:"bakery"}},"shop/bakery|파리바게뜨~(South Korea)":{countryCodes:["kr"],matchNames:["paris baguette","paris baguette cafe","파리바게트"],nomatch:["shop/bakery|Paris Baguette","shop/bakery|巴黎贝甜"],tags:{"alt_name:ko":"파리바게트",brand:"파리바게뜨","brand:en":"Paris Baguette","brand:ko":"파리바게뜨","brand:wikidata":"Q62605260",name:"파리바게뜨","name:en":"Paris Baguette","name:ko":"파리바게뜨",shop:"bakery"}},"shop/beauty|Benefit Brow Bar":{countryCodes:["us"],matchNames:["benefit","ulta brow bar"],tags:{beauty:"eyebrow;eyelash;waxing",brand:"Benefit","brand:wikidata":"Q2895769","brand:wikipedia":"en:Benefit Cosmetics",name:"Benefit Brow Bar",shop:"beauty"}},"shop/beauty|European Wax Center":{countryCodes:["us"],tags:{beauty:"waxing",brand:"European Wax Center","brand:wikidata":"Q5413426","brand:wikipedia":"en:European Wax Center",name:"European Wax Center",shop:"beauty"}},"shop/beauty|Hollywood Nails":{countryCodes:["de","gb","us"],tags:{beauty:"nails",brand:"Hollywood Nails",name:"Hollywood Nails",shop:"beauty"}},"shop/beauty|Indigo Sun":{countryCodes:["gb"],tags:{beauty:"tanning",brand:"Indigo Sun","brand:wikidata":"Q63436906",name:"Indigo Sun",shop:"beauty"}},"shop/beauty|Sola Salons":{countryCodes:["us"],matchNames:["sola","sola salon studios"],tags:{beauty:"hair;nails;skin_care;massage",brand:"Sola Salons","brand:wikidata":"Q64337426",name:"Sola Salons",shop:"beauty"}},"shop/beauty|Star Nails":{tags:{brand:"Star Nails",name:"Star Nails",shop:"beauty"}},"shop/beauty|The Skin Bar at Ulta Beauty":{countryCodes:["us"],tags:{alt_name:"Ulta Skin Bar",beauty:"skin_care",brand:"Ulta Beauty","brand:wikidata":"Q7880076","brand:wikipedia":"en:Ulta Beauty",name:"The Skin Bar at Ulta Beauty",shop:"beauty"}},"shop/beauty|Yves Rocher":{matchTags:["shop/chemist","shop/cosmetics"],tags:{beauty:"cosmetics",brand:"Yves Rocher","brand:wikidata":"Q28496595","brand:wikipedia":"en:Yves Rocher (company)",name:"Yves Rocher",shop:"beauty"}},"shop/bed|Casper":{tags:{brand:"Casper","brand:wikidata":"Q20539294","brand:wikipedia":"en:Casper Sleep",name:"Casper",shop:"bed"}},"shop/bed|Dreams":{countryCodes:["gb"],tags:{brand:"Dreams","brand:wikidata":"Q5306688","brand:wikipedia":"en:Dreams (bed retailer)",name:"Dreams",shop:"bed"}},"shop/bed|Matratzen Concord":{countryCodes:["at","ch","de"],tags:{brand:"Matratzen Concord","brand:wikidata":"Q18629057","brand:wikipedia":"de:Matratzen Concord",name:"Matratzen Concord",shop:"bed"}},"shop/bed|Mattress Firm":{countryCodes:["us"],matchNames:["sleepys"],tags:{brand:"Mattress Firm","brand:wikidata":"Q6791878","brand:wikipedia":"en:Mattress Firm",name:"Mattress Firm",shop:"bed"}},"shop/bed|Mattress Warehouse":{countryCodes:["us"],tags:{brand:"Mattress Warehouse","brand:wikidata":"Q61995079",name:"Mattress Warehouse",shop:"bed"}},"shop/bed|Sleep Country":{countryCodes:["ca"],matchNames:["Sleep Country Canada"],tags:{brand:"Sleep Country","brand:wikidata":"Q7539684","brand:wikipedia":"en:Sleep Country Canada",name:"Sleep Country",shop:"bed"}},"shop/bed|Sleep Number":{countryCodes:["us"],tags:{brand:"Sleep Number","brand:wikidata":"Q7447640","brand:wikipedia":"en:Sleep Number",name:"Sleep Number",shop:"bed"}},"shop/beverages|50嵐":{countryCodes:["cn","tw"],tags:{brand:"50嵐",name:"50嵐",shop:"beverages"}},"shop/beverages|Dursty":{countryCodes:["de"],tags:{brand:"Dursty","brand:wikidata":"Q1267518","brand:wikipedia":"de:Dursty Getränkemärkte",name:"Dursty",shop:"beverages"}},"shop/beverages|Edeka Getränkemarkt":{countryCodes:["de"],tags:{brand:"Edeka Getränkemarkt","brand:wikidata":"Q57450576",name:"Edeka Getränkemarkt",shop:"beverages"}},"shop/beverages|Fristo":{countryCodes:["at","de"],matchNames:["fristo getränkemarkt"],tags:{brand:"Fristo","brand:wikidata":"Q1465151","brand:wikipedia":"de:Fristo",name:"Fristo",shop:"beverages"}},"shop/beverages|Getränke Hoffmann":{countryCodes:["de"],tags:{brand:"Getränke Hoffmann","brand:wikidata":"Q19284021","brand:wikipedia":"de:Getränke Hoffmann",name:"Getränke Hoffmann",shop:"beverages"}},"shop/beverages|Getränkeland":{countryCodes:["de"],tags:{brand:"Getränkeland","brand:wikidata":"Q62594849",name:"Getränkeland",shop:"beverages"}},"shop/beverages|Hol'ab":{countryCodes:["de"],tags:{brand:"Hol'ab","brand:wikidata":"Q57557270",name:"Hol'ab",shop:"beverages"}},"shop/beverages|Orterer Getränkemarkt":{countryCodes:["de"],tags:{brand:"Orterer Getränkemarkt","brand:wikidata":"Q23787118","brand:wikipedia":"de:Orterer Gruppe",name:"Orterer Getränkemarkt",shop:"beverages"}},"shop/beverages|Rewe Getränkemarkt":{countryCodes:["de"],tags:{brand:"Rewe Getränkemarkt","brand:wikidata":"Q57519344",name:"Rewe Getränkemarkt",shop:"beverages"}},"shop/beverages|Trinkgut":{countryCodes:["de"],tags:{brand:"Trinkgut","brand:wikidata":"Q2453627","brand:wikipedia":"de:Trinkgut",name:"Trinkgut",shop:"beverages"}},"shop/beverages|清心福全":{countryCodes:["tw"],tags:{brand:"清心福全","brand:wikidata":"Q10391229","brand:wikipedia":"zh:清心福全冷飲站",name:"清心福全",shop:"beverages"}},"shop/beverages|茶湯會":{countryCodes:["tw"],tags:{brand:"茶湯會",name:"茶湯會",shop:"beverages"}},"shop/bicycle|Evans Cycles":{countryCodes:["gb"],tags:{brand:"Evans Cycles","brand:wikidata":"Q5415901","brand:wikipedia":"en:Evans Cycles",name:"Evans Cycles",shop:"bicycle"}},"shop/bicycle|Fri BikeShop":{countryCodes:["dk"],tags:{brand:"Fri BikeShop","brand:wikidata":"Q26721030",name:"Fri BikeShop",shop:"bicycle"}},"shop/bicycle|Giant":{nomatch:["amenity/fuel|Giant","shop/supermarket|Giant"],tags:{brand:"Giant","brand:wikidata":"Q703557","brand:wikipedia":"en:Giant Bicycles",name:"Giant",shop:"bicycle"}},"shop/bicycle|Trek":{matchNames:["treck","trek bicycle"],tags:{alt_name:"Trek Bicycle Store",brand:"Trek","brand:wikidata":"Q1067617","brand:wikipedia":"en:Trek Bicycle Corporation",name:"Trek",shop:"bicycle"}},"shop/bicycle|サイクルベースあさひ":{countryCodes:["jp"],tags:{brand:"サイクルベースあさひ","brand:en":"Cycle Base Asahi","brand:ja":"サイクルベースあさひ","brand:wikidata":"Q11257202","brand:wikipedia":"ja:あさひ (企業)",name:"サイクルベースあさひ","name:en":"Cycle Base Asahi","name:ja":"サイクルベースあさひ",shop:"bicycle"}},"shop/bookmaker|Betfred":{countryCodes:["gb"],tags:{brand:"Betfred","brand:wikidata":"Q4897425","brand:wikipedia":"en:Betfred",name:"Betfred",shop:"bookmaker"}},"shop/bookmaker|Coral":{countryCodes:["gb"],tags:{brand:"Coral","brand:wikidata":"Q54621344","brand:wikipedia":"en:Coral (bookmaker)",name:"Coral",shop:"bookmaker"}},"shop/bookmaker|Fortuna":{countryCodes:["cz","hr","pl","ro","sk"],tags:{brand:"Fortuna","brand:wikidata":"Q25857973","brand:wikipedia":"en:Fortuna Entertainment Group",name:"Fortuna",shop:"bookmaker"}},"shop/bookmaker|Ladbrokes":{countryCodes:["gb"],tags:{brand:"Ladbrokes","brand:wikidata":"Q1799875","brand:wikipedia":"en:Ladbrokes Coral",name:"Ladbrokes",shop:"bookmaker"}},"shop/bookmaker|Paddy Power":{countryCodes:["gb","ie"],tags:{brand:"Paddy Power","brand:wikidata":"Q3888718","brand:wikipedia":"en:Paddy Power",name:"Paddy Power",shop:"bookmaker"}},"shop/bookmaker|Tipico":{countryCodes:["at","co","de","gi","hr","mt"],tags:{brand:"Tipico","brand:wikidata":"Q15851003","brand:wikipedia":"en:Tipico",name:"Tipico",shop:"bookmaker"}},"shop/bookmaker|William Hill":{countryCodes:["gb"],tags:{brand:"William Hill","brand:wikidata":"Q4053147","brand:wikipedia":"en:William Hill (bookmaker)",name:"William Hill",shop:"bookmaker"}},"shop/bookmaker|ΟΠΑΠ":{countryCodes:["gr"],tags:{brand:"ΟΠΑΠ","brand:el":"ΟΠΑΠ","brand:en":"OPAP","brand:wikidata":"Q2007823","brand:wikipedia":"en:OPAP",name:"ΟΠΑΠ","name:el":"ΟΠΑΠ","name:en":"OPAP",shop:"bookmaker"}},"shop/bookmaker|Лига ставок":{countryCodes:["ru"],tags:{brand:"Лига ставок","brand:en":"Liga Stavok","brand:ru":"Лига ставок","brand:wikidata":"Q6545804","brand:wikipedia":"ru:Лига Ставок",name:"Лига ставок","name:en":"Liga Stavok","name:ru":"Лига ставок",shop:"bookmaker"}},"shop/bookmaker|Фонбет":{countryCodes:["ru"],tags:{brand:"Фонбет","brand:en":"Fonbet","brand:ru":"Фонбет","brand:wikidata":"Q49137910","brand:wikipedia":"ru:Фонбет",name:"Фонбет","name:en":"Fonbet","name:ru":"Фонбет",shop:"bookmaker"}},"shop/books|Akademibokhandeln":{countryCodes:["se"],tags:{brand:"Akademibokhandeln","brand:wikidata":"Q10403918","brand:wikipedia":"sv:Akademibokhandeln",name:"Akademibokhandeln",shop:"books"}},"shop/books|Akateeminen Kirjakauppa":{countryCodes:["fi"],tags:{brand:"Akateeminen Kirjakauppa","brand:wikidata":"Q10403942","brand:wikipedia":"fi:Akateeminen Kirjakauppa",name:"Akateeminen Kirjakauppa",shop:"books"}},"shop/books|Barnes & Noble":{countryCodes:["us"],tags:{brand:"Barnes & Noble","brand:wikidata":"Q795454","brand:wikipedia":"en:Barnes & Noble",name:"Barnes & Noble",shop:"books"}},"shop/books|Books-A-Million":{countryCodes:["us"],tags:{brand:"Books-A-Million","brand:wikidata":"Q4943266","brand:wikipedia":"en:Books-A-Million",name:"Books-A-Million",shop:"books"}},"shop/books|Bruna":{countryCodes:["nl"],tags:{brand:"Bruna","brand:wikidata":"Q3317555","brand:wikipedia":"en:Bruna (company)",name:"Bruna",shop:"books"}},"shop/books|Chapters":{countryCodes:["ca","us"],tags:{brand:"Chapters","brand:wikidata":"Q5073540","brand:wikipedia":"en:Chapters (bookstore)",name:"Chapters",shop:"books"}},"shop/books|Cultura":{countryCodes:["fr"],tags:{brand:"Cultura","brand:wikidata":"Q3007154","brand:wikipedia":"fr:Cultura",name:"Cultura",shop:"books"}},"shop/books|Empik":{countryCodes:["pl"],tags:{brand:"Empik","brand:wikidata":"Q3045978","brand:wikipedia":"pl:Empik",name:"Empik",shop:"books"}},"shop/books|Fnac":{countryCodes:["be","ch","es","fr","nl","pt"],tags:{brand:"Fnac","brand:wikidata":"Q676585","brand:wikipedia":"en:Fnac",name:"Fnac",shop:"books"}},"shop/books|Half Price Books":{countryCodes:["us"],tags:{brand:"Half Price Books","brand:wikidata":"Q5641744","brand:wikipedia":"en:Half Price Books",name:"Half Price Books",shop:"books"}},"shop/books|Hugendubel":{countryCodes:["de"],tags:{brand:"Hugendubel","brand:wikidata":"Q1634142","brand:wikipedia":"en:Hugendubel",name:"Hugendubel",shop:"books"}},"shop/books|Indigo":{countryCodes:["ca","us"],tags:{alt_name:"!ndigo",brand:"Indigo","brand:wikidata":"Q2477358","brand:wikipedia":"en:Indigo Books and Music",name:"Indigo",shop:"books"}},"shop/books|Mondadori":{countryCodes:["it"],tags:{brand:"Mondadori","brand:wikidata":"Q85355","brand:wikipedia":"en:Arnoldo Mondadori Editore",name:"Mondadori",shop:"books"}},"shop/books|National Book Store":{countryCodes:["ph"],tags:{brand:"National Book Store","brand:wikidata":"Q6971094","brand:wikipedia":"en:National Book Store",name:"National Book Store",shop:"books"}},"shop/books|Standaard Boekhandel":{countryCodes:["be"],tags:{brand:"Standaard Boekhandel","brand:wikidata":"Q3496554","brand:wikipedia":"nl:Standaard Boekhandel",name:"Standaard Boekhandel",shop:"books"}},"shop/books|Suomalainen Kirjakauppa":{countryCodes:["fi"],tags:{brand:"Suomalainen Kirjakauppa","brand:wikidata":"Q7641808","brand:wikipedia":"fi:Suomalainen Kirjakauppa",name:"Suomalainen Kirjakauppa",shop:"books"}},"shop/books|TSUTAYA":{countryCodes:["jp"],nomatch:["shop/music|TSUTAYA","shop/video|TSUTAYA"],tags:{brand:"TSUTAYA","brand:wikidata":"Q5193457","brand:wikipedia":"ja:カルチュア・コンビニエンス・クラブ",name:"TSUTAYA",shop:"books"}},"shop/books|Thalia":{countryCodes:["at","ch","de"],tags:{brand:"Thalia","brand:wikidata":"Q2408854","brand:wikipedia":"de:Thalia Bücher",name:"Thalia",shop:"books"}},"shop/books|The Works":{countryCodes:["gb","ie"],tags:{brand:"The Works","brand:wikidata":"Q7775853","brand:wikipedia":"en:The Works (retailer)",name:"The Works",shop:"books"}},"shop/books|Waterstones":{countryCodes:["be","gb","ie","je","nl"],tags:{brand:"Waterstones","brand:wikidata":"Q151779","brand:wikipedia":"en:Waterstones",name:"Waterstones",shop:"books"}},"shop/books|Weltbild":{countryCodes:["de"],tags:{brand:"Weltbild","brand:wikidata":"Q883522","brand:wikipedia":"en:Weltbild Publishing Group",name:"Weltbild",shop:"books"}},"shop/books|Буквоед":{countryCodes:["ru"],tags:{brand:"Буквоед","brand:wikidata":"Q4098549","brand:wikipedia":"ru:Буквоед",name:"Буквоед",shop:"books"}},"shop/books|Дом книги":{countryCodes:["ru"],tags:{brand:"Дом книги","brand:wikidata":"Q48950742","brand:wikipedia":"ru:Московский дом книги",name:"Дом книги",shop:"books"}},"shop/books|Читай-город":{countryCodes:["ru"],tags:{brand:"Читай-город","brand:wikidata":"Q4516645","brand:wikipedia":"ru:Читай-город",name:"Читай-город",shop:"books"}},"shop/books|סטימצקי":{countryCodes:["il"],tags:{brand:"סטימצקי","brand:en":"Steimatzky","brand:he":"סטימצקי","brand:wikidata":"Q2903995","brand:wikipedia":"he:סטימצקי",name:"סטימצקי","name:en":"Steimatzky","name:he":"סטימצקי",shop:"books"}},"shop/books|צומת ספרים":{countryCodes:["il"],matchNames:["Zomet Sfarim"],tags:{brand:"צומת ספרים","brand:en":"Tzomet Sfarim","brand:he":"צומת ספרים","brand:wikidata":"Q6743833","brand:wikipedia":"he:צומת ספרים",name:"צומת ספרים","name:en":"Tzomet Sfarm","name:he":"צומת ספרים",shop:"books"}},"shop/books|あおい書店":{countryCodes:["jp"],tags:{brand:"あおい書店","brand:en":"AOI","brand:ja":"あおい書店","brand:wikidata":"Q11256783","brand:wikipedia":"ja:あおい書店",name:"あおい書店","name:en":"AOI","name:ja":"あおい書店",shop:"books"}},"shop/books|ブックオフ":{countryCodes:["jp"],tags:{brand:"ブックオフ","brand:en":"Book Off","brand:ja":"ブックオフ","brand:wikidata":"Q893011","brand:wikipedia":"en:Book Off",name:"ブックオフ","name:en":"Book Off","name:ja":"ブックオフ",shop:"books"}},"shop/books|メロンブックス":{countryCodes:["jp"],tags:{brand:"メロンブックス","brand:en":"Melonbooks","brand:ja":"メロンブックス","brand:wikidata":"Q10851653","brand:wikipedia":"ja:メロンブックス",name:"メロンブックス","name:en":"Melonbooks","name:ja":"メロンブックス",shop:"books"}},"shop/books|リブロ":{countryCodes:["jp"],tags:{brand:"リブロ","brand:en":"LIBRO","brand:ja":"リブロ","brand:wikidata":"Q6542768","brand:wikipedia":"ja:リブロ",name:"リブロ","name:en":"Libro","name:ja":"リブロ",shop:"books"}},"shop/books|三省堂書店":{countryCodes:["jp"],tags:{brand:"三省堂書店","brand:en":"Books Sanseido","brand:ja":"三省堂書店","brand:wikidata":"Q10866539","brand:wikipedia":"ja:三省堂書店",name:"三省堂書店","name:en":"Books Sanseido","name:ja":"三省堂書店",shop:"books"}},"shop/books|文教堂":{countryCodes:["jp"],tags:{brand:"文教堂","brand:en":"Bunkyodo","brand:ja":"文教堂","brand:wikidata":"Q11499974","brand:wikipedia":"ja:文教堂",name:"文教堂","name:en":"Bunkyodo","name:ja":"文教堂",shop:"books"}},"shop/books|新华书店":{countryCodes:["cn"],tags:{brand:"新华书店","brand:en":"Xinhua Bookstore","brand:wikidata":"Q6124193","brand:wikipedia":"en:Xinhua Bookstore","brand:zh":"新华书店",name:"新华书店","name:en":"Xinhua Bookstore","name:zh":"新华书店",shop:"books"}},"shop/books|未来屋書店":{countryCodes:["jp"],tags:{brand:"未来屋書店","brand:en":"Miraiya Shoten","brand:ja":"未来屋書店","brand:wikidata":"Q11519563","brand:wikipedia":"ja:未来屋書店",name:"未来屋書店","name:en":"Miraiya Shoten","name:ja":"未来屋書店",shop:"books"}},"shop/butcher|Coqivoire":{countryCodes:["ci"],tags:{brand:"Coqivoire","brand:wikidata":"Q60183284",butcher:"poultry",name:"Coqivoire",shop:"butcher"}},"shop/butcher|Fleischerei Richter":{countryCodes:["de"],tags:{brand:"Fleischerei Richter",name:"Fleischerei Richter",shop:"butcher"}},"shop/butcher|Foani":{countryCodes:["ci"],tags:{brand:"Foani","brand:wikidata":"Q60183335",butcher:"poultry",name:"Foani",shop:"butcher"}},"shop/butcher|Gzella":{countryCodes:["pl"],tags:{brand:"Gzella",name:"Gzella",shop:"butcher"}},"shop/butcher|M&M Food Market":{tags:{brand:"M&M Food Market",name:"M&M Food Market",shop:"butcher"}},"shop/butcher|Vinzenzmurr":{countryCodes:["de"],tags:{brand:"Vinzenzmurr","brand:wikidata":"Q2527361","brand:wikipedia":"de:Vinzenzmurr",name:"Vinzenzmurr",shop:"butcher"}},"shop/butcher|Ариант":{countryCodes:["ru"],tags:{brand:"Ариант",name:"Ариант",shop:"butcher"}},"shop/butcher|Великолукский мясокомбинат":{countryCodes:["ru"],tags:{brand:"Великолукский мясокомбинат","brand:wikidata":"Q18401767","brand:wikipedia":"ru:Великолукский мясокомбинат",name:"Великолукский мясокомбинат",shop:"butcher"}},"shop/butcher|Мясницкий ряд":{countryCodes:["ru"],tags:{brand:"Мясницкий ряд",name:"Мясницкий ряд",shop:"butcher"}},"shop/butcher|Наша Ряба":{countryCodes:["ua"],tags:{brand:"Наша Ряба",name:"Наша Ряба",shop:"butcher"}},"shop/butcher|Родинна ковбаска":{countryCodes:["ua"],tags:{brand:"Родинна ковбаска","brand:en":"Rodynna-kovbaska","brand:wikidata":"Q30969660","brand:wikipedia":"uk:ТзОВ «Барком»",name:"Родинна ковбаска","name:en":"Rodynna-kovbaska",shop:"butcher"}},"shop/butcher|肉のハナマサ":{countryCodes:["jp"],matchNames:["ハナマサ"],tags:{brand:"ハナマサ","brand:en":"Hanamasa","brand:ja":"ハナマサ","brand:wikidata":"Q11326564","brand:wikipedia":"ja:ハナマサ",butcher:"beef",name:"肉のハナマサ","name:en":"Hanamasa Meat","name:ja":"肉のハナマサ",shop:"butcher"}},"shop/candles|Yankee Candle":{countryCodes:["ca","gb","us"],tags:{brand:"Yankee Candle","brand:wikidata":"Q8048733","brand:wikipedia":"en:Yankee Candle",name:"Yankee Candle",shop:"candles"}},"shop/car_parts|Advance Auto Parts":{countryCodes:["ca","us","vi"],tags:{brand:"Advance Auto Parts","brand:wikidata":"Q4686051","brand:wikipedia":"en:Advance Auto Parts",name:"Advance Auto Parts",shop:"car_parts"}},"shop/car_parts|AutoZone":{countryCodes:["br","mx","us"],tags:{brand:"AutoZone","brand:wikidata":"Q4826087","brand:wikipedia":"en:AutoZone",name:"AutoZone",shop:"car_parts"}},"shop/car_parts|Brezan":{countryCodes:["be","nl"],tags:{brand:"Brezan",name:"Brezan",shop:"car_parts"}},"shop/car_parts|Halfords":{countryCodes:["gb","ie"],matchTags:["shop/bicycle"],nomatch:["shop/car_repair|Halfords Autocentre"],tags:{brand:"Halfords","brand:wikidata":"Q3398786","brand:wikipedia":"en:Halfords",name:"Halfords","service:bicycle:retail":"yes",shop:"car_parts"}},"shop/car_parts|Lubrificantes":{countryCodes:["ao"],tags:{brand:"Lubrificantes",name:"Lubrificantes",shop:"car_parts"}},"shop/car_parts|NAPA Auto Parts":{countryCodes:["ca","mx","us"],matchNames:["napa"],tags:{brand:"NAPA Auto Parts","brand:wikidata":"Q6970842","brand:wikipedia":"en:National Automotive Parts Association",name:"NAPA Auto Parts",shop:"car_parts"}},"shop/car_parts|Norauto":{tags:{brand:"Norauto",name:"Norauto",shop:"car_parts"}},"shop/car_parts|O'Reilly Auto Parts":{countryCodes:["us"],tags:{brand:"O'Reilly Auto Parts","brand:wikidata":"Q7071951","brand:wikipedia":"en:O'Reilly Auto Parts",name:"O'Reilly Auto Parts",shop:"car_parts"}},"shop/car_parts|Repco":{countryCodes:["au","nz"],tags:{brand:"Repco","brand:wikidata":"Q173425","brand:wikipedia":"en:Repco",name:"Repco",shop:"car_parts"}},"shop/car_parts|Supercheap Auto":{countryCodes:["au","nz"],tags:{brand:"Supercheap Auto","brand:wikidata":"Q7643119","brand:wikipedia":"en:Supercheap Auto",name:"Supercheap Auto",shop:"car_parts"}},"shop/car_parts|Tokić":{countryCodes:["ba","hr"],tags:{brand:"Tokić",name:"Tokić",shop:"car_parts"}},"shop/car_parts|Автомир":{countryCodes:["ru"],tags:{brand:"Автомир","brand:wikidata":"Q4056321","brand:wikipedia":"ru:Автомир (автодилер)",name:"Автомир",shop:"car_parts"}},"shop/car_parts|Армтек":{countryCodes:["ru"],tags:{brand:"Армтек",name:"Армтек",shop:"car_parts"}},"shop/car_parts|イエローハット":{countryCodes:["jp"],tags:{brand:"イエローハット","brand:en":"Yellow Hat","brand:ja":"イエローハット","brand:wikidata":"Q11285915","brand:wikipedia":"ja:イエローハット",name:"イエローハット","name:en":"Yellow Hat","name:ja":"イエローハット",shop:"car_parts"}},"shop/car_parts|オートバックス":{countryCodes:["jp"],tags:{brand:"オートバックス","brand:en":"Autobacs","brand:ja":"オートバックス","brand:wikidata":"Q7886426","brand:wikipedia":"ja:オートバックスセブン",name:"オートバックス","name:en":"Autobacs","name:ja":"オートバックス",shop:"car_parts"}},"shop/car_parts|タイヤ館":{countryCodes:["jp"],tags:{brand:"タイヤ館","brand:en":"Taiyakan","brand:ja":"タイヤ館","brand:wikidata":"Q11315808","brand:wikipedia":"ja:タイヤ館",name:"タイヤ館","name:en":"Taiyakan","name:ja":"タイヤ館",shop:"car_parts"}},"shop/car_repair|A.T.U":{countryCodes:["at","de"],matchNames:["auto-teile-unger"],tags:{brand:"A.T.U","brand:wikidata":"Q784721","brand:wikipedia":"de:Auto-Teile-Unger",name:"A.T.U",shop:"car_repair"}},"shop/car_repair|AAMCO":{countryCodes:["ca","us"],matchNames:["aamco transmissions","aamco transmissions and total car care"],tags:{brand:"AAMCO","brand:wikidata":"Q4649902","brand:wikipedia":"en:AAMCO Transmissions",name:"AAMCO","service:vehicle:transmission":"yes",shop:"car_repair"}},"shop/car_repair|ATS Euromaster":{countryCodes:["gb"],tags:{brand:"ATS Euromaster","brand:wikidata":"Q4654920","brand:wikipedia":"en:ATS Euromaster",name:"ATS Euromaster",shop:"car_repair"}},"shop/car_repair|BestDrive":{countryCodes:["cz","fr","sk"],tags:{brand:"BestDrive","brand:wikidata":"Q63057183",name:"BestDrive",shop:"car_repair"}},"shop/car_repair|Bosch Car Service":{matchNames:["bosch service"],tags:{brand:"Bosch Car Service","brand:wikidata":"Q234021","brand:wikipedia":"en:Robert Bosch GmbH",name:"Bosch Car Service",shop:"car_repair"}},"shop/car_repair|Brakes Plus":{countryCodes:["us"],tags:{brand:"Brakes Plus","brand:wikidata":"Q62075246",name:"Brakes Plus",shop:"car_repair"}},"shop/car_repair|Car-X":{countryCodes:["us"],tags:{brand:"Car-X","brand:wikidata":"Q63859189",name:"Car-X",shop:"car_repair"}},"shop/car_repair|Carglass":{tags:{brand:"Carglass","brand:wikidata":"Q1035997","brand:wikipedia":"de:Carglass",name:"Carglass",shop:"car_repair"}},"shop/car_repair|Carstar":{countryCodes:["ca","us"],matchNames:["carstar auto body repair experts"],tags:{brand:"Carstar","brand:wikidata":"Q64187891",name:"Carstar","service:vehicle:body_repair":"yes",shop:"car_repair"}},"shop/car_repair|Citroën":{nomatch:["shop/car|Citroën"],tags:{brand:"Citroën","brand:wikidata":"Q6746","brand:wikipedia":"fr:Citroën",name:"Citroën",shop:"car_repair"}},"shop/car_repair|Euromaster":{countryCodes:["ch","de","es","fi","fr","nl","pt"],tags:{brand:"Euromaster","brand:wikidata":"Q3060668","brand:wikipedia":"de:Euromaster",name:"Euromaster",shop:"car_repair"}},"shop/car_repair|Feu Vert":{countryCodes:["fr"],tags:{brand:"Feu Vert","brand:wikidata":"Q3070922","brand:wikipedia":"fr:Feu vert (entreprise)",name:"Feu Vert",shop:"car_repair"}},"shop/car_repair|Firestone":{countryCodes:["ca","cl","us"],tags:{brand:"Firestone","brand:wikidata":"Q420837","brand:wikipedia":"en:Firestone Tire and Rubber Company",name:"Firestone",official_name:"Firestone Complete Auto Care",shop:"car_repair"}},"shop/car_repair|Ford":{nomatch:["shop/car|Ford"],tags:{brand:"Ford","brand:wikidata":"Q44294","brand:wikipedia":"en:Ford Motor Company",name:"Ford",shop:"car_repair"}},"shop/car_repair|Goodyear":{countryCodes:["au","ca","cl","pe","us"],tags:{brand:"Goodyear","brand:wikidata":"Q620875","brand:wikipedia":"en:Goodyear Tire and Rubber Company",name:"Goodyear",shop:"car_repair"}},"shop/car_repair|Grease Monkey":{countryCodes:["cn","us"],tags:{brand:"Grease Monkey","brand:wikidata":"Q5598563","brand:wikipedia":"en:Grease Monkey (business)",name:"Grease Monkey",shop:"car_repair"}},"shop/car_repair|Halfords Autocentre":{countryCodes:["gb"],matchNames:["halfords"],nomatch:["shop/car_parts|Halfords"],tags:{brand:"Halfords Auocentre","brand:wikidata":"Q5641894","brand:wikipedia":"en:Halfords Autocentre",name:"Halfords Autocentre",shop:"car_repair"}},"shop/car_repair|Jiffy Lube":{countryCodes:["ca","us"],tags:{brand:"Jiffy Lube","brand:wikidata":"Q6192247","brand:wikipedia":"en:Jiffy Lube",name:"Jiffy Lube",shop:"car_repair"}},"shop/car_repair|Kwik Fit":{countryCodes:["gb","ie"],tags:{brand:"Kwik Fit","brand:wikidata":"Q958053","brand:wikipedia":"en:Kwik Fit",name:"Kwik Fit",shop:"car_repair"}},"shop/car_repair|MAACO":{countryCodes:["ca","us"],matchNames:["maaco collision repair & auto painting"],tags:{brand:"MAACO","brand:wikidata":"Q6714015","brand:wikipedia":"en:MAACO",name:"MAACO","service:vehicle:body_repair":"yes","service:vehicle:painting":"yes",shop:"car_repair"}},"shop/car_repair|Meineke":{countryCodes:["us"],tags:{brand:"Meineke","brand:wikidata":"Q6810159","brand:wikipedia":"en:Meineke Car Care Centers",name:"Meineke",official_name:"Meineke Car Care Center",shop:"car_repair"}},"shop/car_repair|Mekonomen":{countryCodes:["dk","no","se"],tags:{brand:"Mekonomen","brand:wikidata":"Q10580079","brand:wikipedia":"sv:Mekonomen",name:"Mekonomen",shop:"car_repair"}},"shop/car_repair|Midas":{tags:{brand:"Midas","brand:wikidata":"Q3312613","brand:wikipedia":"en:Midas (automotive service)",name:"Midas",shop:"car_repair"}},"shop/car_repair|Monro Muffler Brake":{countryCodes:["us"],matchNames:["monro"],tags:{brand:"Monro Muffler Brake","brand:wikidata":"Q6902090","brand:wikipedia":"en:Monro Muffler Brake",name:"Monro Muffler Brake",shop:"car_repair"}},"shop/car_repair|Mr. Lube":{countryCodes:["ca"],tags:{brand:"Mr. Lube","brand:wikidata":"Q17104067","brand:wikipedia":"en:Mr. Lube",name:"Mr. Lube",shop:"car_repair"}},"shop/car_repair|Norauto":{countryCodes:["ar","es","fr","hu","it","pl","pt","ro"],tags:{brand:"Norauto","brand:wikidata":"Q3317698","brand:wikipedia":"en:Mobivia Groupe",name:"Norauto",shop:"car_repair"}},"shop/car_repair|Pep Boys":{countryCodes:["us"],tags:{brand:"Pep Boys","brand:wikidata":"Q3375007","brand:wikipedia":"en:Pep Boys",name:"Pep Boys",shop:"car_repair"}},"shop/car_repair|Peugeot":{nomatch:["shop/car|Peugeot"],tags:{brand:"Peugeot","brand:wikidata":"Q6742","brand:wikipedia":"en:Peugeot",name:"Peugeot",shop:"car_repair"}},"shop/car_repair|Pit Stop":{tags:{brand:"Pit Stop",name:"Pit Stop",shop:"car_repair"}},"shop/car_repair|Point S":{tags:{brand:"Point S","brand:wikidata":"Q3393358","brand:wikipedia":"fr:Point S",name:"Point S",shop:"car_repair"}},"shop/car_repair|Renault":{matchNames:["garage renault"],nomatch:["shop/car|Renault"],tags:{brand:"Renault","brand:wikidata":"Q6686","brand:wikipedia":"en:Renault",name:"Renault",shop:"car_repair"}},"shop/car_repair|Roady":{countryCodes:["fr"],tags:{brand:"Roady","brand:wikidata":"Q3434112","brand:wikipedia":"en:Roady (Mousquetaires)",name:"Roady",shop:"car_repair"}},"shop/car_repair|Safelite AutoGlass":{countryCodes:["us"],tags:{brand:"Safelite AutoGlass","brand:wikidata":"Q28797369","brand:wikipedia":"en:Safelite",name:"Safelite AutoGlass",shop:"car_repair"}},"shop/car_repair|Sears Auto Center":{countryCodes:["mx","us"],tags:{brand:"Sears Auto Center",name:"Sears Auto Center",shop:"car_repair"}},"shop/car_repair|Speedy":{countryCodes:["fr"],nomatch:["shop/car_repair|Speedy Auto Service"],tags:{brand:"Speedy","brand:wikidata":"Q3492969","brand:wikipedia":"fr:Speedy (entreprise)",name:"Speedy",shop:"car_repair"}},"shop/car_repair|Speedy Auto Service":{countryCodes:["ca"],nomatch:["shop/car_repair|Speedy"],tags:{brand:"Speedy Auto Service","brand:wikidata":"Q22318193",name:"Speedy Auto Service",shop:"car_repair"}},"shop/car_repair|Taller Mecanico":{tags:{brand:"Taller Mecanico",name:"Taller Mecanico",shop:"car_repair"}},"shop/car_repair|Toyota":{nomatch:["shop/car|Toyota"],tags:{brand:"Toyota","brand:wikidata":"Q53268","brand:wikipedia":"en:Toyota",name:"Toyota",shop:"car_repair"}},"shop/car_repair|Tuffy":{countryCodes:["us"],matchNames:["tuffy auto service","tuffy auto service center","tuffy auto service centers","tuffy service","tuffy service center","tuffy service centers","tuffy tire & auto service","tuffy tire & auto service center","tuffy tire & auto service centers","tuffy tire and auto service","tuffy tire and auto service center","tuffy tire and auto service centers"],tags:{brand:"Tuffy","brand:wikidata":"Q17125314","brand:wikipedia":"en:Tuffy Auto Service Centers",name:"Tuffy",shop:"car_repair"}},"shop/car_repair|Valvoline":{countryCodes:["us"],tags:{brand:"Valvoline","brand:wikidata":"Q7912852","brand:wikipedia":"en:Valvoline Instant Oil Change",name:"Valvoline",official_name:"Valvoline Instant Oil Change",shop:"car_repair"}},"shop/car_repair|ÖAMTC":{countryCodes:["at"],tags:{brand:"ÖAMTC","brand:wikidata":"Q306057","brand:wikipedia":"de:Österreichischer Automobil-, Motorrad- und Touring Club",name:"ÖAMTC",shop:"car_repair"}},"shop/car_repair|СТО":{tags:{brand:"СТО",name:"СТО",shop:"car_repair"}},"shop/car|Audi":{tags:{brand:"Audi","brand:wikidata":"Q23317","brand:wikipedia":"en:Audi",name:"Audi",shop:"car"}},"shop/car|BMW":{tags:{brand:"BMW","brand:wikidata":"Q26678","brand:wikipedia":"en:BMW",name:"BMW",shop:"car"}},"shop/car|Chevrolet":{tags:{brand:"Chevrolet","brand:wikidata":"Q29570","brand:wikipedia":"en:Chevrolet",name:"Chevrolet",shop:"car"}},"shop/car|Citroën":{nomatch:["shop/car_repair|Citroën"],tags:{brand:"Citroën","brand:wikidata":"Q6746","brand:wikipedia":"fr:Citroën",name:"Citroën",shop:"car"}},"shop/car|Dacia":{tags:{brand:"Dacia","brand:wikidata":"Q27460","brand:wikipedia":"en:Automobile Dacia",name:"Dacia",shop:"car"}},"shop/car|Fiat":{tags:{brand:"Fiat","brand:wikidata":"Q27597","brand:wikipedia":"en:Fiat Automobiles",name:"Fiat",shop:"car"}},"shop/car|Ford":{nomatch:["shop/car_repair|Ford"],tags:{brand:"Ford","brand:wikidata":"Q44294","brand:wikipedia":"en:Ford Motor Company",name:"Ford",shop:"car"}},"shop/car|Honda":{matchNames:["honda cars"],nomatch:["shop/motorcycle|Honda"],tags:{brand:"Honda","brand:wikidata":"Q9584","brand:wikipedia":"en:Honda",name:"Honda",shop:"car"}},"shop/car|Hyundai":{tags:{brand:"Hyundai","brand:wikidata":"Q55931","brand:wikipedia":"en:Hyundai Motor Company",name:"Hyundai",shop:"car"}},"shop/car|Isuzu":{tags:{brand:"Isuzu","brand:wikidata":"Q29803","brand:wikipedia":"en:Isuzu Motors",name:"Isuzu",shop:"car"}},"shop/car|Kia":{matchNames:["kia motors"],tags:{brand:"Kia","brand:wikidata":"Q35349","brand:wikipedia":"en:Kia Motors",name:"Kia",shop:"car"}},"shop/car|Land Rover":{tags:{brand:"Land Rover","brand:wikidata":"Q35907","brand:wikipedia":"en:Land Rover",name:"Land Rover",shop:"car"}},"shop/car|Lexus":{tags:{brand:"Lexus","brand:wikidata":"Q35919","brand:wikipedia":"en:Lexus",name:"Lexus",shop:"car"}},"shop/car|Mazda":{tags:{brand:"Mazda","brand:wikidata":"Q35996","brand:wikipedia":"en:Mazda",name:"Mazda",shop:"car"}},"shop/car|Mercedes-Benz":{matchNames:["mercedes"],tags:{brand:"Mercedes-Benz","brand:wikidata":"Q36008","brand:wikipedia":"en:Mercedes-Benz",name:"Mercedes-Benz",shop:"car"}},"shop/car|Mitsubishi":{matchNames:["mitsubishi motors"],tags:{brand:"Mitsubishi","brand:wikidata":"Q36033","brand:wikipedia":"en:Mitsubishi Motors",name:"Mitsubishi",shop:"car"}},"shop/car|Netz":{countryCodes:["jp"],tags:{brand:"Netz","brand:wikidata":"Q11325416","brand:wikipedia":"ja:ネッツ店",name:"Netz",shop:"car"}},"shop/car|Nissan":{tags:{brand:"Nissan","brand:wikidata":"Q20165","brand:wikipedia":"ja:日産自動車",name:"Nissan",shop:"car"}},"shop/car|Opel":{tags:{brand:"Opel","brand:wikidata":"Q40966","brand:wikipedia":"en:Opel",name:"Opel",shop:"car"}},"shop/car|Peugeot":{nomatch:["shop/car_repair|Peugeot"],tags:{brand:"Peugeot","brand:wikidata":"Q6742","brand:wikipedia":"en:Peugeot",name:"Peugeot",shop:"car"}},"shop/car|Porsche":{tags:{brand:"Porsche","brand:wikidata":"Q40993","brand:wikipedia":"en:Porsche",name:"Porsche",shop:"car"}},"shop/car|Renault":{nomatch:["shop/car_repair|Renault"],tags:{brand:"Renault","brand:wikidata":"Q6686","brand:wikipedia":"en:Renault",name:"Renault",shop:"car"}},"shop/car|Seat":{tags:{brand:"Seat","brand:wikidata":"Q188217","brand:wikipedia":"en:SEAT",name:"Seat",shop:"car"}},"shop/car|Skoda":{tags:{brand:"Skoda","brand:wikidata":"Q29637","brand:wikipedia":"en:Škoda Auto",name:"Skoda",shop:"car"}},"shop/car|Subaru":{tags:{brand:"Subaru","brand:wikidata":"Q172741","brand:wikipedia":"en:Subaru",name:"Subaru",shop:"car"}},"shop/car|Suzuki":{nomatch:["shop/motorcycle|Suzuki"],tags:{brand:"Suzuki","brand:wikidata":"Q181642","brand:wikipedia":"en:Suzuki",name:"Suzuki",shop:"car"}},"shop/car|Tesla":{matchNames:["tesla motors"],tags:{brand:"Tesla","brand:wikidata":"Q478214","brand:wikipedia":"en:Tesla, Inc.",name:"Tesla",shop:"car"}},"shop/car|Toyota":{nomatch:["shop/car_repair|Toyota"],tags:{brand:"Toyota","brand:wikidata":"Q53268","brand:wikipedia":"en:Toyota",name:"Toyota",shop:"car"}},"shop/car|Volkswagen":{matchNames:["vw"],tags:{brand:"Volkswagen","brand:wikidata":"Q246","brand:wikipedia":"en:Volkswagen",name:"Volkswagen",shop:"car"}},"shop/car|Volvo":{tags:{brand:"Volvo","brand:wikidata":"Q215293","brand:wikipedia":"en:Volvo Cars",name:"Volvo",shop:"car"}},"shop/car|ダイハツ":{countryCodes:["jp"],tags:{brand:"ダイハツ","brand:ja":"ダイハツ",name:"ダイハツ","name:ja":"ダイハツ",shop:"car"}},"shop/car|ホンダ":{countryCodes:["jp"],tags:{brand:"ホンダ","brand:en":"Honda","brand:ja":"ホンダ","brand:wikidata":"Q9584","brand:wikipedia":"ja:本田技研工業",name:"ホンダ","name:en":"Honda","name:ja":"ホンダ",shop:"car"}},"shop/carpet|Carpetright":{countryCodes:["be","gb","ie","nl"],matchTags:["shop/furniture"],tags:{brand:"Carpetright","brand:wikidata":"Q5045782","brand:wikipedia":"en:Carpetright",name:"Carpetright",shop:"carpet"}},"shop/catalogue|Argos":{countryCodes:["gb","ie"],matchTags:["shop/department_store"],tags:{brand:"Argos","brand:wikidata":"Q4789707","brand:wikipedia":"en:Argos (retailer)",name:"Argos",shop:"catalogue"}},"shop/charity|Age UK":{countryCodes:["gb"],tags:{brand:"Age UK","brand:wikidata":"Q4691850","brand:wikipedia":"en:Age UK",name:"Age UK",shop:"charity"}},"shop/charity|Barnardo's":{countryCodes:["gb","ie"],tags:{brand:"Barnardo's","brand:wikidata":"Q2884670","brand:wikipedia":"en:Barnardo's",name:"Barnardo's",shop:"charity"}},"shop/charity|British Heart Foundation":{countryCodes:["gb"],tags:{brand:"British Heart Foundation","brand:wikidata":"Q4970039","brand:wikipedia":"en:British Heart Foundation",name:"British Heart Foundation",shop:"charity"}},"shop/charity|British Red Cross":{countryCodes:["gb","gg","im"],tags:{brand:"British Red Cross","brand:wikidata":"Q4970966","brand:wikipedia":"en:British Red Cross",name:"British Red Cross",shop:"charity"}},"shop/charity|Cancer Research UK":{countryCodes:["gb","gg"],tags:{brand:"Cancer Research UK","brand:wikidata":"Q326079","brand:wikipedia":"en:Cancer Research UK",name:"Cancer Research UK",shop:"charity"}},"shop/charity|Goodwill":{countryCodes:["ca","us"],matchTags:["shop/clothes","shop/second_hand"],tags:{brand:"Goodwill","brand:wikidata":"Q5583655","brand:wikipedia":"en:Goodwill Industries",name:"Goodwill",shop:"charity"}},"shop/charity|Mind":{countryCodes:["gb"],tags:{brand:"Mind","brand:wikidata":"Q3314763","brand:wikipedia":"en:Mind (charity)",name:"Mind",shop:"charity"}},"shop/charity|Myrorna":{countryCodes:["se"],matchTags:["shop/clothes","shop/second_hand"],tags:{brand:"Myrorna","brand:wikidata":"Q10592609","brand:wikipedia":"sv:Myrorna",name:"Myrorna",shop:"charity"}},"shop/charity|Oxfam":{countryCodes:["be","de","gb","ie","im"],tags:{brand:"Oxfam","brand:wikidata":"Q267941","brand:wikipedia":"en:Oxfam",name:"Oxfam",shop:"charity"}},"shop/charity|RSPCA":{countryCodes:["au","gb"],tags:{brand:"RSPCA","brand:wikidata":"Q584819","brand:wikipedia":"en:Royal Society for the Prevention of Cruelty to Animals",name:"RSPCA",shop:"charity"}},"shop/charity|Scope":{countryCodes:["gb"],tags:{brand:"Scope","brand:wikidata":"Q7434435","brand:wikipedia":"en:Scope (charity)",name:"Scope",shop:"charity"}},"shop/charity|Sue Ryder":{countryCodes:["gb","ie"],tags:{brand:"Sue Ryder","brand:wikidata":"Q7634271","brand:wikipedia":"en:Sue Ryder (charity)",name:"Sue Ryder",shop:"charity"}},"shop/charity|The Salvation Army":{countryCodes:["au","ca","gb","us"],matchNames:["salvation army"],tags:{brand:"The Salvation Army","brand:wikidata":"Q188307","brand:wikipedia":"en:The Salvation Army",name:"The Salvation Army",shop:"charity"}},"shop/charity|Vinnies":{tags:{brand:"Vinnies",name:"Vinnies",shop:"charity"}},"shop/chemist|101 Drogerie":{countryCodes:["sk"],tags:{brand:"101 Drogerie",name:"101 Drogerie",shop:"chemist"}},"shop/chemist|7 Дней":{countryCodes:["ru"],tags:{brand:"7 Дней",name:"7 Дней",shop:"chemist"}},"shop/chemist|Acqua & Sapone":{countryCodes:["it"],tags:{brand:"Acqua & Sapone",name:"Acqua & Sapone",shop:"chemist"}},"shop/chemist|Bipa":{countryCodes:["at","hr"],tags:{brand:"Bipa","brand:wikidata":"Q864933","brand:wikipedia":"de:Bipa",name:"Bipa",shop:"chemist"}},"shop/chemist|Boots":{nomatch:["amenity/pharmacy|Boots"],tags:{brand:"Boots",name:"Boots",shop:"chemist"}},"shop/chemist|Budnikowsky":{countryCodes:["de"],tags:{brand:"Budnikowsky","brand:wikidata":"Q1001516","brand:wikipedia":"de:Budnikowsky",name:"Budnikowsky",shop:"chemist"}},"shop/chemist|CVS":{nomatch:["amenity/pharmacy|CVS"],tags:{brand:"CVS",name:"CVS",shop:"chemist"}},"shop/chemist|Clarel":{tags:{brand:"Clarel",name:"Clarel",shop:"chemist"}},"shop/chemist|Drogeria Natura":{countryCodes:["pl"],tags:{brand:"Drogeria Natura","brand:wikidata":"Q9212032","brand:wikipedia":"pl:Drogerie Natura",name:"Drogeria Natura",shop:"chemist"}},"shop/chemist|Etos":{countryCodes:["nl"],tags:{brand:"Etos","brand:wikidata":"Q2609459","brand:wikipedia":"en:Etos",name:"Etos",shop:"chemist"}},"shop/chemist|Hebe":{countryCodes:["pl"],tags:{brand:"Hebe",name:"Hebe",shop:"chemist"}},"shop/chemist|Kruidvat":{countryCodes:["be","fr","nl"],tags:{brand:"Kruidvat","brand:wikidata":"Q2226366","brand:wikipedia":"en:Kruidvat",name:"Kruidvat",shop:"chemist"}},"shop/chemist|Matas":{countryCodes:["dk"],tags:{brand:"Matas","brand:wikidata":"Q6786143","brand:wikipedia":"en:Matas (drug store)",name:"Matas",shop:"chemist"}},"shop/chemist|Müller":{countryCodes:["at","ch","de","es","hr","hu"],tags:{brand:"Müller","brand:wikidata":"Q1958759","brand:wikipedia":"en:Müller (German trade company)",name:"Müller",shop:"chemist"}},"shop/chemist|Rite Aid":{nomatch:["amenity/pharmacy|Rite Aid"],tags:{brand:"Rite Aid",name:"Rite Aid",shop:"chemist"}},"shop/chemist|Rossmann":{countryCodes:["cz","de","hu","pl"],tags:{brand:"Rossmann","brand:wikidata":"Q316004","brand:wikipedia":"de:Dirk Rossmann GmbH",name:"Rossmann",shop:"chemist"}},"shop/chemist|Savers":{countryCodes:["gb"],tags:{brand:"Savers",name:"Savers",shop:"chemist"}},"shop/chemist|Superdrug":{nomatch:["amenity/pharmacy|Superdrug"],tags:{brand:"Superdrug",name:"Superdrug",shop:"chemist"}},"shop/chemist|Teta":{countryCodes:["cz","sk"],tags:{brand:"Teta","brand:wikidata":"Q20860823","brand:wikipedia":"cs:Teta drogerie",name:"Teta",shop:"chemist"}},"shop/chemist|Tigotà":{countryCodes:["it"],tags:{brand:"Tigotà",name:"Tigotà",shop:"chemist"}},"shop/chemist|Trekpleister":{countryCodes:["nl"],tags:{brand:"Trekpleister","brand:wikidata":"Q2551576","brand:wikipedia":"nl:Trekpleister (drogisterij)",name:"Trekpleister",shop:"chemist"}},"shop/chemist|Walgreens":{countryCodes:["us"],matchNames:["walgreens pharmacy"],tags:{brand:"Walgreens","brand:wikidata":"Q1591889","brand:wikipedia":"en:Walgreens",name:"Walgreens",shop:"chemist"}},"shop/chemist|Watsons":{matchTags:["shop/cosmetics"],nomatch:["amenity/pharmacy|Watsons"],tags:{brand:"Watsons","brand:wikidata":"Q7974785","brand:wikipedia":"en:Watsons",name:"Watsons",shop:"chemist"}},"shop/chemist|dm":{countryCodes:["at","ba","bg","cz","de","hr","hu","it","mk","ro","rs","si","sk"],matchNames:["dm drogerie markt"],tags:{brand:"dm","brand:wikidata":"Q266572","brand:wikipedia":"en:Dm-drogerie markt",name:"dm",shop:"chemist"}},"shop/chemist|Бытовая химия":{countryCodes:["by","ru","ua"],tags:{brand:"Бытовая химия",name:"Бытовая химия",shop:"chemist"}},"shop/chemist|Мила":{countryCodes:["by"],tags:{brand:"Мила",name:"Мила",shop:"chemist"}},"shop/chemist|Новэкс":{countryCodes:["ru"],tags:{brand:"Новэкс",name:"Новэкс",shop:"chemist"}},"shop/chemist|Остров чистоты":{countryCodes:["by"],tags:{brand:"Остров чистоты",name:"Остров чистоты",shop:"chemist"}},"shop/chemist|Рубль Бум":{countryCodes:["ru"],tags:{brand:"Рубль Бум",name:"Рубль Бум",shop:"chemist"}},"shop/chemist|Улыбка радуги":{countryCodes:["ru"],tags:{brand:"Улыбка радуги",name:"Улыбка радуги",shop:"chemist"}},"shop/chemist|スギ薬局":{countryCodes:["jp"],nomatch:["amenity/pharmacy|スギ薬局"],tags:{brand:"スギ薬局","brand:ja":"スギ薬局",name:"スギ薬局","name:ja":"スギ薬局",shop:"chemist"}},"shop/chemist|丁丁藥局":{nomatch:["amenity/pharmacy|丁丁藥局"],tags:{brand:"丁丁藥局",name:"丁丁藥局",shop:"chemist"}},"shop/chemist|屈臣氏":{countryCodes:["cn","hk","tw"],nomatch:["amenity/pharmacy|屈臣氏"],tags:{brand:"屈臣氏","brand:wikidata":"Q7974785","brand:wikipedia":"zh:屈臣氏",name:"屈臣氏",shop:"chemist"}},"shop/chemist|康是美":{countryCodes:["tw"],tags:{brand:"康是美","brand:wikidata":"Q11063876","brand:wikipedia":"zh:康是美藥妝店",name:"康是美",shop:"chemist"}},"shop/chocolate|Cacau Show":{countryCodes:["br"],tags:{brand:"Cacau Show","brand:wikidata":"Q9671713","brand:wikipedia":"en:Cacau Show",name:"Cacau Show",shop:"chocolate"}},"shop/chocolate|Godiva Chocolatier":{countryCodes:["us"],matchNames:["godiva"],tags:{brand:"Godiva Chocolatier","brand:wikidata":"Q931084","brand:wikipedia":"en:Godiva Chocolatier",name:"Godiva Chocolatier",shop:"chocolate"}},"shop/chocolate|Jeff de Bruges":{countryCodes:["ca","cz","fr","gb"],tags:{brand:"Jeff de Bruges","brand:wikidata":"Q3176626","brand:wikipedia":"fr:Jeff de Bruges",name:"Jeff de Bruges",shop:"chocolate"}},"shop/chocolate|Laura Secord":{countryCodes:["ca"],tags:{brand:"Laura Secord","brand:wikidata":"Q6499418","brand:wikipedia":"en:Laura Secord Chocolates",name:"Laura Secord",shop:"chocolate"}},"shop/chocolate|Leonidas":{countryCodes:["be","cz","fr","gb","gr","nl"],tags:{brand:"Leonidas","brand:wikidata":"Q80335","brand:wikipedia":"en:Leonidas (chocolate maker)",name:"Leonidas",shop:"chocolate"}},"shop/chocolate|Lindt":{tags:{brand:"Lindt","brand:wikidata":"Q152822","brand:wikipedia":"en:Lindt & Sprüngli",name:"Lindt",shop:"chocolate"}},"shop/chocolate|Purdys Chocolatier":{countryCodes:["ca"],tags:{brand:"Purdys Chocolatier","brand:wikidata":"Q7261007","brand:wikipedia":"en:Purdy's Chocolates",name:"Purdys Chocolatier",shop:"chocolate"}},"shop/clothes|AOKI":{countryCodes:["jp"],tags:{brand:"AOKI","brand:wikidata":"Q11189480","brand:wikipedia":"ja:AOKIホールディングス",clothes:"men",name:"AOKI","name:ja":"アオキ",shop:"clothes"}},"shop/clothes|AWG":{countryCodes:["bg","de"],tags:{brand:"AWG",name:"AWG",shop:"clothes"}},"shop/clothes|Abercrombie & Fitch":{countryCodes:["de","us"],tags:{brand:"Abercrombie & Fitch","brand:wikidata":"Q319344","brand:wikipedia":"en:Abercrombie & Fitch",clothes:"men;women",name:"Abercrombie & Fitch",shop:"clothes"}},"shop/clothes|Accessorize":{countryCodes:["gb","it","ru"],tags:{brand:"Accessorize","brand:wikidata":"Q3069980","brand:wikipedia":"en:Monsoon Accessorize",name:"Accessorize",shop:"clothes"}},"shop/clothes|Ackermans":{tags:{brand:"Ackermans","brand:wikidata":"Q4674255","brand:wikipedia":"en:Ackermans",name:"Ackermans",shop:"clothes"}},"shop/clothes|Adler":{countryCodes:["at","de","lu"],tags:{brand:"Adler",name:"Adler",shop:"clothes"}},"shop/clothes|Aeropostale":{tags:{brand:"Aeropostale","brand:wikidata":"Q794565","brand:wikipedia":"en:Aéropostale (clothing)",clothes:"men;women",name:"Aeropostale",shop:"clothes"}},"shop/clothes|AllSaints":{countryCodes:["gb"],tags:{brand:"AllSaints","brand:wikidata":"Q4728473","brand:wikipedia":"en:AllSaints",name:"AllSaints",shop:"clothes"}},"shop/clothes|American Eagle Outfitters":{countryCodes:["ca","us"],tags:{brand:"American Eagle Outfitters","brand:wikidata":"Q2842931","brand:wikipedia":"en:American Eagle Outfitters",clothes:"men;women",name:"American Eagle Outfitters",shop:"clothes",short_name:"American Eagle"}},"shop/clothes|Ann Taylor":{countryCodes:["ca","us"],tags:{brand:"Ann Taylor","brand:wikidata":"Q4766699","brand:wikipedia":"en:Ann Inc.",clothes:"women",name:"Ann Taylor",shop:"clothes"}},"shop/clothes|Anthropologie":{countryCodes:["ca","gb","us"],tags:{brand:"Anthropologie","brand:wikidata":"Q4773903","brand:wikipedia":"en:Anthropologie",clothes:"women",name:"Anthropologie",shop:"clothes"}},"shop/clothes|Arc'teryx":{tags:{brand:"Arc'teryx","brand:wikidata":"Q3271455","brand:wikipedia":"en:Arc'teryx",clothes:"men;women",name:"Arc'teryx",shop:"clothes"}},"shop/clothes|Ardene":{countryCodes:["ca","sn"],tags:{brand:"Ardene","brand:wikidata":"Q2860764","brand:wikipedia":"en:Ardene",name:"Ardene",shop:"clothes"}},"shop/clothes|Aritzia":{countryCodes:["ca","us"],tags:{brand:"Aritzia","brand:wikidata":"Q4791147","brand:wikipedia":"en:Aritzia",clothes:"women",name:"Aritzia",shop:"clothes"}},"shop/clothes|Armand Thiery":{countryCodes:["be","fr"],tags:{brand:"Armand Thiery","brand:wikidata":"Q2861975","brand:wikipedia":"fr:Armand Thiery",name:"Armand Thiery",shop:"clothes"}},"shop/clothes|Armani Exchange":{countryCodes:["us"],tags:{brand:"Armani Exchange","brand:wikidata":"Q56045740",clothes:"men;women",name:"Armani Exchange",shop:"clothes"}},"shop/clothes|Baby Gap":{countryCodes:["us"],tags:{brand:"Gap","brand:wikidata":"Q420822","brand:wikipedia":"en:Gap Inc.",name:"Baby Gap",shop:"clothes"}},"shop/clothes|Banana Republic":{countryCodes:["ca","gb","us"],tags:{brand:"Banana Republic","brand:wikidata":"Q806085","brand:wikipedia":"en:Banana Republic",clothes:"men;women",name:"Banana Republic",shop:"clothes"}},"shop/clothes|Bench":{tags:{brand:"Bench",name:"Bench",shop:"clothes"}},"shop/clothes|Bershka":{tags:{brand:"Bershka","brand:wikidata":"Q827258","brand:wikipedia":"en:Bershka",name:"Bershka",shop:"clothes"}},"shop/clothes|Betty Barclay":{tags:{brand:"Betty Barclay","brand:wikidata":"Q850250","brand:wikipedia":"de:Betty Barclay",name:"Betty Barclay",shop:"clothes"}},"shop/clothes|Big Star":{countryCodes:["by","pl"],tags:{brand:"Big Star","brand:wikidata":"Q9171569","brand:wikipedia":"pl:Big Star Limited",name:"Big Star",shop:"clothes"}},"shop/clothes|Billabong":{tags:{brand:"Billabong","brand:wikidata":"Q862718","brand:wikipedia":"en:Billabong (clothing)",clothes:"men;women",name:"Billabong",shop:"clothes"}},"shop/clothes|Bonita":{countryCodes:["at","ch","de","nl"],tags:{brand:"Bonita","brand:wikidata":"Q892598","brand:wikipedia":"de:Bonita (Unternehmen)",name:"Bonita",shop:"clothes"}},"shop/clothes|Bonobo":{countryCodes:["fr"],nomatch:["shop/clothes|Bonobos"],tags:{brand:"Bonobo","brand:wikidata":"Q63682093",clothes:"men;women",name:"Bonobo",shop:"clothes"}},"shop/clothes|Bonobos":{countryCodes:["us"],nomatch:["shop/clothes|Bonobo"],tags:{brand:"Bonobos","brand:wikidata":"Q4942546","brand:wikipedia":"en:Bonobos (apparel)",clothes:"men",name:"Bonobos",shop:"clothes"}},"shop/clothes|Brice":{countryCodes:["be","fr"],tags:{brand:"Brice","brand:wikidata":"Q2925067","brand:wikipedia":"fr:Brice (enseigne)",name:"Brice",shop:"clothes"}},"shop/clothes|Bristol":{countryCodes:["nl"],tags:{brand:"Bristol",name:"Bristol",shop:"clothes"}},"shop/clothes|Brooks Brothers":{tags:{brand:"Brooks Brothers","brand:wikidata":"Q929722","brand:wikipedia":"en:Brooks Brothers",name:"Brooks Brothers",shop:"clothes"}},"shop/clothes|Brunello Cucinelli":{tags:{brand:"Brunello Cucinelli","brand:wikidata":"Q3645582","brand:wikipedia":"en:Brunello Cucinelli",name:"Brunello Cucinelli",shop:"clothes"}},"shop/clothes|Buckle":{countryCodes:["us"],tags:{brand:"Buckle","brand:wikidata":"Q4983306","brand:wikipedia":"en:Buckle (clothing retailer)",clothes:"men;women",name:"Buckle",shop:"clothes"}},"shop/clothes|Buffalo Exchange":{countryCodes:["us"],matchTags:["shop/second_hand"],tags:{brand:"Buffalo Exchange","brand:wikidata":"Q4985721","brand:wikipedia":"en:Buffalo Exchange",name:"Buffalo Exchange",second_hand:"only",shop:"clothes"}},"shop/clothes|Burberry":{tags:{brand:"Burberry","brand:wikidata":"Q390107","brand:wikipedia":"en:Burberry",clothes:"men;women",name:"Burberry",shop:"clothes"}},"shop/clothes|Burlington Coat Factory":{countryCodes:["us"],tags:{brand:"Burlington Coat Factory","brand:wikidata":"Q4999220","brand:wikipedia":"en:Burlington (department store)",name:"Burlington Coat Factory",shop:"clothes"}},"shop/clothes|Burton":{countryCodes:["fr","gb"],tags:{brand:"Burton","brand:wikidata":"Q5000795","brand:wikipedia":"en:Burton (retailer)",name:"Burton",shop:"clothes"}},"shop/clothes|C&A":{tags:{brand:"C&A","brand:wikidata":"Q701338","brand:wikipedia":"en:C&A",name:"C&A",shop:"clothes"}},"shop/clothes|COS":{tags:{brand:"COS","brand:wikidata":"Q60772401","brand:wikipedia":"en:COS (clothing)",name:"COS",shop:"clothes"}},"shop/clothes|Cache Cache":{countryCodes:["fr","it","lu"],tags:{brand:"Cache Cache","brand:wikidata":"Q63064086",name:"Cache Cache",shop:"clothes"}},"shop/clothes|Calvin Klein":{tags:{brand:"Calvin Klein","brand:wikidata":"Q1068628","brand:wikipedia":"en:Calvin Klein (company)",name:"Calvin Klein",shop:"clothes"}},"shop/clothes|Calzedonia":{tags:{brand:"Calzedonia","brand:wikidata":"Q1027874","brand:wikipedia":"en:Calzedonia",name:"Calzedonia",shop:"clothes"}},"shop/clothes|Camaïeu":{countryCodes:["be","cz","fr","it","pl"],tags:{brand:"Camaïeu","brand:wikidata":"Q2934647","brand:wikipedia":"en:Camaïeu (company)",name:"Camaïeu",shop:"clothes"}},"shop/clothes|Camp David":{countryCodes:["at","de","ee","sk"],tags:{brand:"Camp David","brand:wikidata":"Q50540636","brand:wikipedia":"en:Camp David (fashion)",name:"Camp David",shop:"clothes"}},"shop/clothes|Canada Goose":{tags:{brand:"Canada Goose","brand:wikidata":"Q2988422","brand:wikipedia":"en:Canada Goose",name:"Canada Goose",shop:"clothes"}},"shop/clothes|Carhartt":{countryCodes:["gb","us"],tags:{brand:"Carhartt","brand:wikidata":"Q527877","brand:wikipedia":"en:Carhartt",clothes:"workwear",name:"Carhartt",shop:"clothes"}},"shop/clothes|Carlings":{countryCodes:["fi","no","se"],tags:{brand:"Carlings",name:"Carlings",shop:"clothes"}},"shop/clothes|Caroll":{countryCodes:["ch","fr"],tags:{brand:"Caroll","brand:wikidata":"Q63063871",name:"Caroll",shop:"clothes"}},"shop/clothes|Carter's":{matchNames:["carters babies and kids"],tags:{brand:"Carter's","brand:wikidata":"Q5047083","brand:wikipedia":"en:Carter's",clothes:"children",name:"Carter's",shop:"clothes"}},"shop/clothes|Catherines":{countryCodes:["us"],tags:{brand:"Catherines","brand:wikidata":"Q64026208",clothes:"oversize;women",name:"Catherines",shop:"clothes"}},"shop/clothes|Cato":{countryCodes:["us"],tags:{brand:"Cato","brand:wikidata":"Q16956136","brand:wikipedia":"en:Cato Corporation",clothes:"women",name:"Cato",official_name:"Cato Fashions",shop:"clothes"}},"shop/clothes|Cecil":{countryCodes:["at","de","nl"],tags:{brand:"Cecil",name:"Cecil",shop:"clothes"}},"shop/clothes|Celio":{tags:{brand:"Celio","brand:wikidata":"Q2672003","brand:wikipedia":"en:Celio (retailer)",name:"Celio",shop:"clothes"}},"shop/clothes|Chanel":{tags:{brand:"Chanel","brand:wikidata":"Q218115","brand:wikipedia":"en:Chanel",name:"Chanel",shop:"clothes"}},"shop/clothes|Charles Vögele":{countryCodes:["at","be","ch","de","hu","nl"],tags:{brand:"Charles Vögele","brand:wikidata":"Q1066326","brand:wikipedia":"de:Charles Vögele Holding",name:"Charles Vögele",shop:"clothes",short_name:"Vögele"}},"shop/clothes|Charlotte Russe":{countryCodes:["us"],tags:{brand:"Charlotte Russe","brand:wikidata":"Q5086126","brand:wikipedia":"en:Charlotte Russe (clothing retailer)",name:"Charlotte Russe",shop:"clothes"}},"shop/clothes|Charming Charlie":{countryCodes:["us"],tags:{brand:"Charming Charlie","brand:wikidata":"Q16829286","brand:wikipedia":"en:Charming Charlie",clothes:"women",name:"Charming Charlie",shop:"clothes"}},"shop/clothes|Chico's":{countryCodes:["ar","us"],tags:{brand:"Chico's","brand:wikidata":"Q5096393","brand:wikipedia":"en:Chico's (clothing retailer)",name:"Chico's",shop:"clothes"}},"shop/clothes|Christopher & Banks":{countryCodes:["us"],tags:{brand:"Christopher & Banks","brand:wikidata":"Q5111816","brand:wikipedia":"en:Christopher & Banks",name:"Christopher & Banks",shop:"clothes"}},"shop/clothes|Club Monaco":{countryCodes:["ca","gb","us"],tags:{brand:"Club Monaco","brand:wikidata":"Q2979949","brand:wikipedia":"en:Club Monaco",name:"Club Monaco",shop:"clothes"}},"shop/clothes|Colin's":{tags:{brand:"Colin's","brand:wikidata":"Q28729658",name:"Colin's",shop:"clothes"}},"shop/clothes|Colloseum":{countryCodes:["at","de"],tags:{brand:"Colloseum",name:"Colloseum",shop:"clothes"}},"shop/clothes|Columbia":{nomatch:["amenity/bank|Columbia Bank"],tags:{brand:"Columbia","brand:wikidata":"Q1112588","brand:wikipedia":"en:Columbia Sportswear",name:"Columbia",official_name:"Columbia Sportswear",shop:"clothes"}},"shop/clothes|Cropp":{countryCodes:["cs","hu","pl","ro","ru","sk","ua"],tags:{brand:"Cropp","brand:wikidata":"Q9196793","brand:wikipedia":"pl:Cropp",name:"Cropp",shop:"clothes"}},"shop/clothes|Cubus":{countryCodes:["de","fi","lv","no","pl","se"],tags:{brand:"Cubus","brand:wikidata":"Q3439593","brand:wikipedia":"no:Cubus",name:"Cubus",shop:"clothes"}},"shop/clothes|DTLR":{countryCodes:["us"],tags:{brand:"DTLR",name:"DTLR",shop:"clothes"}},"shop/clothes|DXL Men's Apparel":{countryCodes:["us"],tags:{brand:"DXL Men's Apparel","brand:wikidata":"Q61981830",clothes:"oversize;men",name:"DXL Men's Apparel",shop:"clothes",short_name:"DXL"}},"shop/clothes|Damart":{countryCodes:["be","fr","lu"],tags:{brand:"Damart","brand:wikidata":"Q3012602","brand:wikipedia":"en:Damart",name:"Damart",shop:"clothes"}},"shop/clothes|David's Bridal":{countryCodes:["ca","us"],tags:{brand:"David's Bridal","brand:wikidata":"Q5230388","brand:wikipedia":"en:David's Bridal",clothes:"wedding",name:"David's Bridal",shop:"clothes"}},"shop/clothes|Desigual":{tags:{brand:"Desigual","brand:wikidata":"Q83750","brand:wikipedia":"en:Desigual",name:"Desigual",shop:"clothes"}},"shop/clothes|Devred":{countryCodes:["be","fr","ma"],tags:{brand:"Devred","brand:wikidata":"Q3025542","brand:wikipedia":"fr:Devred 1902",name:"Devred",shop:"clothes"}},"shop/clothes|Didi":{countryCodes:["be","nl"],tags:{brand:"Didi",name:"Didi",shop:"clothes"}},"shop/clothes|Diesel":{tags:{brand:"Diesel","brand:wikidata":"Q158285","brand:wikipedia":"en:Diesel (brand)",name:"Diesel",shop:"clothes"}},"shop/clothes|Dior":{tags:{brand:"Dior","brand:wikidata":"Q542767","brand:wikipedia":"en:Christian Dior (fashion house)",name:"Dior",shop:"clothes"}},"shop/clothes|Diverse":{countryCodes:["pl"],tags:{brand:"Diverse","brand:wikidata":"Q11694298","brand:wikipedia":"pl:Diverse",name:"Diverse",shop:"clothes"}},"shop/clothes|Dolce & Gabbana":{matchNames:["d&g","dolce & gabana","dolce & gabanna","dolce & gabbanna","dolce and gabana","dolce and gabanna","dolce and gabbana","dolce and gabbanna","dolce y gabana","dolce y gabanna","dolce y gabbana","dolce y gabbanna"],tags:{brand:"Dolce & Gabbana","brand:wikidata":"Q214480","brand:wikipedia":"en:Dolce & Gabbana",name:"Dolce & Gabbana",shop:"clothes"}},"shop/clothes|Dorothy Perkins":{countryCodes:["gb","gg","ie","im"],tags:{brand:"Dorothy Perkins","brand:wikidata":"Q5298588","brand:wikipedia":"en:Dorothy Perkins",name:"Dorothy Perkins",shop:"clothes"}},"shop/clothes|Dress Barn":{tags:{brand:"Dress Barn","brand:wikidata":"Q5307031","brand:wikipedia":"en:Ascena Retail Group",name:"Dress Barn",shop:"clothes"}},"shop/clothes|Dressmann":{countryCodes:["at","fi","no","se"],tags:{brand:"Dressmann","brand:wikidata":"Q3357081","brand:wikipedia":"en:Dressmann",name:"Dressmann",shop:"clothes"}},"shop/clothes|Dynamite":{countryCodes:["ca","jo","ku","sa","us"],tags:{brand:"Dynamite","brand:wikidata":"Q3117385","brand:wikipedia":"en:Groupe Dynamite",clothes:"women",name:"Dynamite",shop:"clothes"}},"shop/clothes|Eddie Bauer":{countryCodes:["ca","jp","us"],tags:{brand:"Eddie Bauer","brand:wikidata":"Q842174","brand:wikipedia":"en:Eddie Bauer",name:"Eddie Bauer",shop:"clothes"}},"shop/clothes|Edgars":{tags:{brand:"Edgars",name:"Edgars",shop:"clothes"}},"shop/clothes|Engbers":{countryCodes:["at","de"],tags:{brand:"Engbers","brand:wikidata":"Q1290088","brand:wikipedia":"de:Engbers",name:"Engbers",shop:"clothes"}},"shop/clothes|Ermenegildo Zegna":{countryCodes:["ch","it"],tags:{brand:"Ermenegildo Zegna","brand:wikidata":"Q1355904","brand:wikipedia":"en:Ermenegildo Zegna",clothes:"men",name:"Ermenegildo Zegna",shop:"clothes",short_name:"Zegna"}},"shop/clothes|Ernsting's family":{countryCodes:["at","de"],tags:{brand:"Ernsting's family","brand:wikidata":"Q1361016","brand:wikipedia":"de:Ernsting’s family",name:"Ernsting's family",shop:"clothes"}},"shop/clothes|Esprit":{tags:{brand:"Esprit","brand:wikidata":"Q532746","brand:wikipedia":"en:Esprit Holdings",name:"Esprit",shop:"clothes"}},"shop/clothes|Etam":{tags:{brand:"Etam","brand:wikidata":"Q3059202","brand:wikipedia":"en:Etam Développement",name:"Etam",shop:"clothes"}},"shop/clothes|Everything But Water":{countryCodes:["us"],tags:{brand:"Everything But Water",clothes:"swimwear",name:"Everything But Water",shop:"clothes"}},"shop/clothes|Express":{nomatch:["shop/convenience|Express"],tags:{brand:"Express","brand:wikidata":"Q1384784","brand:wikipedia":"en:Express, Inc.",name:"Express",shop:"clothes"}},"shop/clothes|Fairweather":{countryCodes:["ca"],tags:{brand:"Fairweather","brand:wikidata":"Q64861806",clothes:"women",name:"Fairweather",shop:"clothes"}},"shop/clothes|Fat Face":{countryCodes:["gb","gg","ie"],tags:{brand:"Fat Face","brand:wikidata":"Q5437186","brand:wikipedia":"en:Fat Face",name:"Fat Face",shop:"clothes"}},"shop/clothes|Fendi":{countryCodes:["fr","it"],tags:{brand:"Fendi","brand:wikidata":"Q926575","brand:wikipedia":"en:Fendi",name:"Fendi",shop:"clothes"}},"shop/clothes|Forever 21":{tags:{brand:"Forever 21","brand:wikidata":"Q1060537","brand:wikipedia":"en:Forever 21",name:"Forever 21",shop:"clothes"}},"shop/clothes|Free People":{countryCodes:["ca","us"],tags:{brand:"Free People","brand:wikidata":"Q5499945","brand:wikipedia":"en:Free People",name:"Free People",shop:"clothes"}},"shop/clothes|Fussl":{countryCodes:["at","de"],tags:{brand:"Fussl",name:"Fussl",shop:"clothes"}},"shop/clothes|GU":{countryCodes:["cl","jp","tw"],tags:{brand:"GU","brand:wikidata":"Q5512642","brand:wikipedia":"en:GU (retailer)",name:"GU",shop:"clothes"}},"shop/clothes|Gant":{tags:{brand:"Gant","brand:wikidata":"Q1493667","brand:wikipedia":"en:Gant (retailer)",name:"Gant",shop:"clothes"}},"shop/clothes|Gap":{tags:{brand:"Gap","brand:wikidata":"Q420822","brand:wikipedia":"en:Gap Inc.",name:"Gap",shop:"clothes"}},"shop/clothes|Gap Kids":{tags:{brand:"Gap","brand:wikidata":"Q420822","brand:wikipedia":"en:Gap Inc.",name:"Gap Kids",shop:"clothes"}},"shop/clothes|Garage":{countryCodes:["am","ca","jo","om","qa","sa","us"],tags:{brand:"Garage","brand:wikidata":"Q5521860","brand:wikipedia":"en:Garage (clothing retailer)",clothes:"women",name:"Garage",shop:"clothes"}},"shop/clothes|Gerry Weber":{tags:{brand:"Gerry Weber","brand:wikidata":"Q873447","brand:wikipedia":"en:Gerry Weber",name:"Gerry Weber",shop:"clothes"}},"shop/clothes|Gina Laura":{countryCodes:["at","de"],tags:{brand:"Gina Laura","brand:wikidata":"Q2700576","brand:wikipedia":"de:Gina Laura",name:"Gina Laura",shop:"clothes"}},"shop/clothes|Gloria Jeans":{countryCodes:["ru","ua"],tags:{brand:"Gloria Jeans","brand:wikidata":"Q4139985","brand:wikipedia":"ru:Глория Джинс",name:"Gloria Jeans",shop:"clothes"}},"shop/clothes|Gucci":{tags:{brand:"Gucci","brand:wikidata":"Q178516","brand:wikipedia":"en:Gucci",name:"Gucci",shop:"clothes"}},"shop/clothes|Guess":{tags:{brand:"Guess","brand:wikidata":"Q2470307","brand:wikipedia":"en:Guess (clothing)",name:"Guess",shop:"clothes"}},"shop/clothes|Gymboree":{countryCodes:["ca","us"],tags:{brand:"Gymboree","brand:wikidata":"Q4039771","brand:wikipedia":"en:Gymboree",name:"Gymboree",shop:"clothes"}},"shop/clothes|Gémo":{countryCodes:["be","ch","fr"],tags:{brand:"Gémo","brand:wikidata":"Q3122954","brand:wikipedia":"fr:Gémo",name:"Gémo",shop:"clothes"}},"shop/clothes|H&M":{tags:{brand:"H&M","brand:wikidata":"Q188326","brand:wikipedia":"en:H&M",name:"H&M",shop:"clothes"}},"shop/clothes|Haggar":{countryCodes:["us"],matchNames:["haggar clothing"],tags:{alt_name:"Haggar Clothing Co.",brand:"Haggar","brand:wikidata":"Q5638669","brand:wikipedia":"en:Haggar Clothing",name:"Haggar",shop:"clothes"}},"shop/clothes|Hallhuber":{countryCodes:["at","ch","de","lu","nl"],tags:{brand:"Hallhuber","brand:wikidata":"Q1571714","brand:wikipedia":"de:Hallhuber (Bekleidungshaus)",name:"Hallhuber",shop:"clothes"}},"shop/clothes|Hanna Andersson":{countryCodes:["us"],matchNames:["hanna anderssen"],tags:{brand:"Hanna Andersson","brand:wikidata":"Q17460802","brand:wikipedia":"en:Hanna Andersson",clothes:"baby;children;women",name:"Hanna Andersson",shop:"clothes"}},"shop/clothes|Hermès":{countryCodes:["ch","fr"],nomatch:["amenity/post_office|Hermes Paketshop"],tags:{brand:"Hermès","brand:wikidata":"Q843887","brand:wikipedia":"en:Hermès",name:"Hermès",shop:"clothes"}},"shop/clothes|Hollister":{tags:{brand:"Hollister","brand:wikidata":"Q1257477","brand:wikipedia":"en:Hollister Co.",name:"Hollister",official_name:"Hollister Co.",shop:"clothes"}},"shop/clothes|Hot Topic":{countryCodes:["ca","us"],tags:{brand:"Hot Topic","brand:wikidata":"Q9294032","brand:wikipedia":"en:Hot Topic",name:"Hot Topic",shop:"clothes"}},"shop/clothes|House":{tags:{brand:"House",name:"House",shop:"clothes"}},"shop/clothes|Hugo Boss":{tags:{brand:"Hugo Boss","brand:wikidata":"Q491627","brand:wikipedia":"en:Hugo Boss",name:"Hugo Boss",shop:"clothes",short_name:"Boss"}},"shop/clothes|Humana":{tags:{brand:"Humana",name:"Humana",shop:"clothes"}},"shop/clothes|Hunkemöller":{countryCodes:["at","be","de","dk","es","lu","nl"],tags:{brand:"Hunkemöller","brand:wikidata":"Q2604175","brand:wikipedia":"en:Hunkemöller",name:"Hunkemöller",shop:"clothes"}},"shop/clothes|Indochino":{countryCodes:["ca","us"],tags:{brand:"Indochino","brand:wikidata":"Q64448127","brand:wikipedia":"en:Indochino",clothes:"suits",name:"Indochino",shop:"clothes"}},"shop/clothes|Intimissimi":{tags:{brand:"Intimissimi","brand:wikidata":"Q305404","brand:wikipedia":"en:Intimissimi",clothes:"underwear",name:"Intimissimi",shop:"clothes"}},"shop/clothes|J.Crew":{countryCodes:["ca","gb","us"],tags:{brand:"J.Crew","brand:wikidata":"Q5370765","brand:wikipedia":"en:J.Crew",clothes:"men;women;children",name:"J.Crew",shop:"clothes"}},"shop/clothes|J.Jill":{countryCodes:["us"],tags:{brand:"J.Jill","brand:wikidata":"Q64448268","brand:wikipedia":"en:J.Jill",clothes:"women",name:"J.Jill",shop:"clothes"}},"shop/clothes|JBC":{countryCodes:["be","lu"],tags:{brand:"JBC","brand:wikidata":"Q2671470","brand:wikipedia":"nl:JBC",name:"JBC",shop:"clothes"}},"shop/clothes|Jack & Jones":{tags:{brand:"Jack & Jones","brand:wikidata":"Q6077665","brand:wikipedia":"en:Jack & Jones",name:"Jack & Jones",shop:"clothes"}},"shop/clothes|Jack Wills":{countryCodes:["ae","gb","hk","ie","kw","lb","mo","sg","us"],tags:{brand:"Jack Wills","brand:wikidata":"Q6115814","brand:wikipedia":"en:Jack Wills",name:"Jack Wills",shop:"clothes"}},"shop/clothes|Janie & Jack":{countryCodes:["ca","us"],matchNames:["janie and jack"],tags:{brand:"Janie & Jack","brand:wikidata":"Q64449634","brand:wikipedia":"en:Janie & Jack",clothes:"children",name:"Janie & Jack",shop:"clothes"}},"shop/clothes|Jeans Centre":{countryCodes:["nl"],tags:{brand:"Jeans Centre",name:"Jeans Centre",shop:"clothes"}},"shop/clothes|Jeans Fritz":{countryCodes:["de"],tags:{brand:"Jeans Fritz","brand:wikidata":"Q1686071","brand:wikipedia":"de:Jeans Fritz",name:"Jeans Fritz",shop:"clothes"}},"shop/clothes|Jennyfer":{countryCodes:["fr","it","lu"],tags:{brand:"Jennyfer","brand:wikidata":"Q3177174","brand:wikipedia":"fr:Jennyfer",name:"Jennyfer",shop:"clothes"}},"shop/clothes|Jet":{countryCodes:["za"],nomatch:["amenity/fuel|Jet"],tags:{brand:"Jet","brand:wikidata":"Q61995123",name:"Jet",shop:"clothes"}},"shop/clothes|Jigsaw":{countryCodes:["au","gb","us"],tags:{brand:"Jigsaw","brand:wikidata":"Q6192383","brand:wikipedia":"en:Jigsaw (clothing retailer)",name:"Jigsaw",shop:"clothes"}},"shop/clothes|JoS. A. Bank":{countryCodes:["us"],matchNames:["joseph a bank"],tags:{brand:"JoS. A. Bank","brand:wikidata":"Q6204078","brand:wikipedia":"en:JoS. A. Bank Clothiers",name:"JoS. A. Bank",official_name:"Jos. A. Bank Clothiers",shop:"clothes"}},"shop/clothes|Johnny Was":{countryCodes:["us"],tags:{brand:"Johnny Was",clothes:"women",name:"Johnny Was",shop:"clothes"}},"shop/clothes|Joules":{countryCodes:["gb","gg","ie"],tags:{brand:"Joules","brand:wikidata":"Q25351738","brand:wikipedia":"en:Joules (clothing)",name:"Joules",shop:"clothes"}},"shop/clothes|Jules":{countryCodes:["be","fr","it"],tags:{brand:"Jules","brand:wikidata":"Q3188386","brand:wikipedia":"fr:Jules (enseigne)",clothes:"men",name:"Jules",shop:"clothes"}},"shop/clothes|Justice":{countryCodes:["ca","us"],tags:{brand:"Justice","brand:wikidata":"Q7857512","brand:wikipedia":"en:Tween Brands",name:"Justice",shop:"clothes"}},"shop/clothes|KappAhl":{countryCodes:["fi","no","pl","se"],tags:{brand:"KappAhl","brand:wikidata":"Q4349016","brand:wikipedia":"sv:Kappahl",name:"KappAhl",shop:"clothes"}},"shop/clothes|Kate Spade New York":{countryCodes:["ca","us"],matchNames:["kate spade ny"],tags:{brand:"Kate Spade New York","brand:wikidata":"Q6375797","brand:wikipedia":"en:Kate Spade New York",name:"Kate Spade New York",shop:"clothes",short_name:"Kate Spade"}},"shop/clothes|Kendra Scott":{tags:{brand:"Kendra Scott",name:"Kendra Scott",shop:"clothes"}},"shop/clothes|KiK":{tags:{brand:"KiK","brand:wikidata":"Q883965","brand:wikipedia":"en:KiK",name:"KiK",shop:"clothes"}},"shop/clothes|Kiabi":{tags:{brand:"Kiabi","brand:wikidata":"Q3196299","brand:wikipedia":"fr:Kiabi",name:"Kiabi",shop:"clothes"}},"shop/clothes|Koton":{tags:{brand:"Koton",name:"Koton",shop:"clothes"}},"shop/clothes|LC Waikiki":{tags:{brand:"LC Waikiki","brand:wikidata":"Q3205965","brand:wikipedia":"fr:LC Waikiki",name:"LC Waikiki",shop:"clothes"}},"shop/clothes|La Halle":{countryCodes:["ch","fr"],tags:{brand:"La Halle",name:"La Halle",shop:"clothes"}},"shop/clothes|La Senza":{countryCodes:["ca","gb"],tags:{brand:"La Senza","brand:wikidata":"Q3212802","brand:wikipedia":"en:La Senza",name:"La Senza",shop:"clothes"}},"shop/clothes|Lacoste":{tags:{brand:"Lacoste","brand:wikidata":"Q309031","brand:wikipedia":"en:Lacoste",name:"Lacoste",shop:"clothes"}},"shop/clothes|Lane Bryant":{countryCodes:["us"],tags:{brand:"Lane Bryant","brand:wikidata":"Q6485350","brand:wikipedia":"en:Lane Bryant",clothes:"oversize;women",name:"Lane Bryant",shop:"clothes"}},"shop/clothes|Laura":{countryCodes:["ca"],tags:{brand:"Laura","brand:wikidata":"Q6498590","brand:wikipedia":"en:Laura (clothing retailer)",clothes:"women",name:"Laura",shop:"clothes"}},"shop/clothes|Levi's":{tags:{brand:"Levi's","brand:wikidata":"Q127962","brand:wikipedia":"en:Levi Strauss & Co.",clothes:"denim;men;women",name:"Levi's",shop:"clothes"}},"shop/clothes|Lids":{countryCodes:["ca","us"],tags:{brand:"Lids","brand:wikidata":"Q19841609","brand:wikipedia":"en:Lids (store)",clothes:"hats",name:"Lids",shop:"clothes"}},"shop/clothes|Lindex":{countryCodes:["cz","ee","fi","no","se","sk"],tags:{brand:"Lindex","brand:wikidata":"Q1786717","brand:wikipedia":"en:Lindex",name:"Lindex",shop:"clothes"}},"shop/clothes|Loft":{matchNames:["ann taylor loft"],tags:{brand:"Loft","brand:wikidata":"Q62075137",clothes:"women",name:"Loft",shop:"clothes"}},"shop/clothes|Loro Piana":{countryCodes:["fr","it"],tags:{brand:"Loro Piana","brand:wikidata":"Q1686544","brand:wikipedia":"en:Loro Piana",name:"Loro Piana",shop:"clothes"}},"shop/clothes|Louis Vuitton":{tags:{brand:"Louis Vuitton","brand:wikidata":"Q191485","brand:wikipedia":"en:Louis Vuitton",name:"Louis Vuitton",shop:"clothes"}},"shop/clothes|Lowes":{countryCodes:["au"],nomatch:["shop/doityourself|Lowe's","shop/supermarket|Lowe's Market","shop/supermarket|Lowes Foods"],tags:{brand:"Lowes","brand:wikidata":"Q6693996","brand:wikipedia":"en:Lowes Menswear",name:"Lowes",shop:"clothes"}},"shop/clothes|Lucky Brand":{countryCodes:["ca","us"],matchNames:["lucky brand jeans"],tags:{brand:"Lucky Brand","brand:wikidata":"Q6697865","brand:wikipedia":"en:Lucky Brand Jeans",name:"Lucky Brand",shop:"clothes"}},"shop/clothes|Lululemon":{countryCodes:["au","ca","us"],tags:{brand:"Lululemon","brand:wikidata":"Q6702957","brand:wikipedia":"en:Lululemon Athletica",clothes:"men;women",name:"Lululemon",official_name:"Lululemon Athletica",shop:"clothes"}},"shop/clothes|M&Co":{countryCodes:["gb"],tags:{brand:"M&Co","brand:wikidata":"Q6711808","brand:wikipedia":"en:M&Co.",name:"M&Co",shop:"clothes"}},"shop/clothes|MS Mode":{countryCodes:["be","de","fr","lu","nl"],tags:{brand:"MS Mode",name:"MS Mode",shop:"clothes"}},"shop/clothes|Mackage":{tags:{brand:"Mackage",name:"Mackage",shop:"clothes"}},"shop/clothes|Madewell":{countryCodes:["us"],tags:{brand:"Madewell","brand:wikidata":"Q64026213",clothes:"men;women",name:"Madewell",shop:"clothes"}},"shop/clothes|Mango":{tags:{brand:"Mango","brand:wikidata":"Q136503","brand:wikipedia":"en:Mango (retailer)",name:"Mango",shop:"clothes"}},"shop/clothes|Marc O'Polo":{countryCodes:["at","be","ch","de","nl","pl"],tags:{brand:"Marc O'Polo","brand:wikidata":"Q1892752","brand:wikipedia":"en:Marc O'Polo",name:"Marc O'Polo",shop:"clothes"}},"shop/clothes|Marimekko":{countryCodes:["fi"],tags:{brand:"Marimekko","brand:wikidata":"Q534903","brand:wikipedia":"fi:Marimekko",name:"Marimekko",shop:"clothes"}},"shop/clothes|Marisa":{tags:{brand:"Marisa",name:"Marisa",shop:"clothes"}},"shop/clothes|Mark Formelle":{countryCodes:["by","kz","ru"],tags:{brand:"Mark Formelle",name:"Mark Formelle",shop:"clothes"}},"shop/clothes|Mark's":{countryCodes:["ca"],tags:{brand:"Mark's","brand:wikidata":"Q6766373","brand:wikipedia":"en:Mark's",name:"Mark's",shop:"clothes"}},"shop/clothes|Massimo Dutti":{tags:{brand:"Massimo Dutti","brand:wikidata":"Q788231","brand:wikipedia":"en:Massimo Dutti",name:"Massimo Dutti",shop:"clothes"}},"shop/clothes|Matalan":{countryCodes:["ae","gb"],tags:{brand:"Matalan","brand:wikidata":"Q12061509","brand:wikipedia":"en:Matalan",name:"Matalan",shop:"clothes"}},"shop/clothes|Maurices":{countryCodes:["ca","fr","us"],tags:{brand:"Maurices","brand:wikidata":"Q6793571","brand:wikipedia":"en:Maurices",name:"Maurices",shop:"clothes"}},"shop/clothes|Max Mara":{tags:{brand:"Max Mara","brand:wikidata":"Q1151774","brand:wikipedia":"en:Max Mara",name:"Max Mara",shop:"clothes"}},"shop/clothes|Melanie Lyne":{countryCodes:["ca"],tags:{brand:"Melanie Lyne","brand:wikidata":"Q64861470",clothes:"women",name:"Melanie Lyne",shop:"clothes"}},"shop/clothes|Men's Wearhouse":{countryCodes:["us"],matchNames:["mens warehouse"],tags:{brand:"Men's Wearhouse","brand:wikidata":"Q57405513","brand:wikipedia":"en:Men's Wearhouse",clothes:"suits",name:"Men's Wearhouse",shop:"clothes"}},"shop/clothes|Mexx":{tags:{brand:"Mexx","brand:wikidata":"Q1837290","brand:wikipedia":"en:Mexx",name:"Mexx",shop:"clothes"}},"shop/clothes|Michael Kors":{tags:{brand:"Michael Kors","brand:wikidata":"Q19572998","brand:wikipedia":"en:Capri Holdings",name:"Michael Kors",shop:"clothes"}},"shop/clothes|Miller & Monroe":{countryCodes:["at","de","nl"],tags:{brand:"Miller & Monroe",name:"Miller & Monroe",shop:"clothes"}},"shop/clothes|Mim":{countryCodes:["fr","it"],tags:{brand:"Mim",name:"Mim",shop:"clothes"}},"shop/clothes|Miss Etam":{countryCodes:["nl"],tags:{brand:"Miss Etam",name:"Miss Etam",shop:"clothes"}},"shop/clothes|Mohito":{tags:{brand:"Mohito",name:"Mohito",shop:"clothes"}},"shop/clothes|Monsoon":{countryCodes:["gb","gg","ie"],tags:{brand:"Monsoon","brand:wikidata":"Q3069980","brand:wikipedia":"en:Monsoon Accessorize",name:"Monsoon",shop:"clothes"}},"shop/clothes|Moores":{countryCodes:["ca"],tags:{brand:"Moores","brand:wikidata":"Q6908309","brand:wikipedia":"en:Moores",clothes:"men",name:"Moores",shop:"clothes"}},"shop/clothes|Motherhood Maternity":{countryCodes:["ca","us"],tags:{brand:"Motherhood Maternity",clothes:"maternity",name:"Motherhood Maternity",shop:"clothes"}},"shop/clothes|Motivi":{tags:{brand:"Motivi",name:"Motivi",shop:"clothes"}},"shop/clothes|Mr Price":{tags:{brand:"Mr Price","brand:wikidata":"Q6929120","brand:wikipedia":"en:Mr. Price",name:"Mr Price",shop:"clothes"}},"shop/clothes|NKD":{countryCodes:["at","de","it","si"],tags:{brand:"NKD","brand:wikidata":"Q927272","brand:wikipedia":"de:NKD",name:"NKD",shop:"clothes"}},"shop/clothes|Naf Naf":{countryCodes:["ch","fr"],tags:{brand:"Naf Naf","brand:wikidata":"Q3334188","brand:wikipedia":"fr:Naf Naf",name:"Naf Naf",shop:"clothes"}},"shop/clothes|Napapijri":{tags:{brand:"Napapijri",name:"Napapijri",shop:"clothes"}},"shop/clothes|Nautica":{tags:{brand:"Nautica","brand:wikidata":"Q6981479","brand:wikipedia":"en:Nautica (clothing company)",name:"Nautica",shop:"clothes"}},"shop/clothes|New Look":{countryCodes:["be","de","fr","gb","ie","pl"],tags:{brand:"New Look","brand:wikidata":"Q12063852","brand:wikipedia":"en:New Look (company)",name:"New Look",shop:"clothes"}},"shop/clothes|New York & Company":{countryCodes:["us"],tags:{brand:"New York & Company","brand:wikidata":"Q7012977","brand:wikipedia":"en:New York & Company",name:"New York & Company",shop:"clothes"}},"shop/clothes|New Yorker":{tags:{brand:"New Yorker","brand:wikidata":"Q706421","brand:wikipedia":"en:New Yorker (clothing)",name:"New Yorker",shop:"clothes"}},"shop/clothes|Next":{tags:{brand:"Next","brand:wikidata":"Q246655","brand:wikipedia":"en:Next plc",name:"Next",shop:"clothes"}},"shop/clothes|Nike":{tags:{brand:"Nike","brand:wikidata":"Q483915","brand:wikipedia":"en:Nike, Inc.",name:"Nike",shop:"clothes"}},"shop/clothes|Nordstrom Rack":{countryCodes:["ca","us"],tags:{brand:"Nordstrom Rack","brand:wikidata":"Q21463374","brand:wikipedia":"en:Nordstrom Rack",name:"Nordstrom Rack",shop:"clothes"}},"shop/clothes|OVS":{countryCodes:["at","ch","fr","it","si"],tags:{brand:"OVS","brand:wikidata":"Q2042514","brand:wikipedia":"en:OVS (company)",name:"OVS",shop:"clothes"}},"shop/clothes|Oasis":{countryCodes:["es","gb","ie"],tags:{brand:"Oasis","brand:wikidata":"Q64532852",name:"Oasis",shop:"clothes"}},"shop/clothes|Okaïdi":{countryCodes:["be","ch","es","fr","it","pl"],tags:{brand:"Okaïdi","brand:wikidata":"Q3350027","brand:wikipedia":"fr:Okaïdi",name:"Okaïdi",shop:"clothes"}},"shop/clothes|Old Navy":{tags:{brand:"Old Navy","brand:wikidata":"Q2735242","brand:wikipedia":"en:Old Navy",name:"Old Navy",shop:"clothes"}},"shop/clothes|Only":{tags:{brand:"Only","brand:wikidata":"Q61799370",name:"Only",shop:"clothes"}},"shop/clothes|Orchestra":{tags:{brand:"Orchestra","brand:wikidata":"Q28042940","brand:wikipedia":"fr:Orchestra Prémaman",name:"Orchestra",shop:"clothes"}},"shop/clothes|Original Marines":{countryCodes:["it"],tags:{brand:"Original Marines",name:"Original Marines",shop:"clothes"}},"shop/clothes|Orsay":{tags:{brand:"Orsay","brand:wikidata":"Q883245","brand:wikipedia":"de:Orsay (Modeunternehmen)",name:"Orsay",shop:"clothes"}},"shop/clothes|Outfit":{countryCodes:["de","gb"],tags:{brand:"Outfit","brand:wikidata":"Q7112061","brand:wikipedia":"en:Outfit (retailer)",name:"Outfit",shop:"clothes"}},"shop/clothes|Oysho":{tags:{brand:"Oysho","brand:wikidata":"Q3327046","brand:wikipedia":"en:Oysho",name:"Oysho",shop:"clothes"}},"shop/clothes|PacSun":{countryCodes:["us"],tags:{brand:"PacSun","brand:wikidata":"Q7121857","brand:wikipedia":"en:PacSun",name:"PacSun",shop:"clothes"}},"shop/clothes|Palmers":{countryCodes:["at","de"],tags:{brand:"Palmers","brand:wikidata":"Q1509985","brand:wikipedia":"de:Palmers",name:"Palmers",shop:"clothes"}},"shop/clothes|Peacocks":{countryCodes:["cy","gb"],tags:{brand:"Peacocks","brand:wikidata":"Q7157762","brand:wikipedia":"en:Peacocks (clothing)",name:"Peacocks",shop:"clothes"}},"shop/clothes|Peek & Cloppenburg":{countryCodes:["at","be","de","nl","pl"],tags:{brand:"Peek & Cloppenburg","brand:wikidata":"Q2066959","brand:wikipedia":"en:Peek & Cloppenburg",name:"Peek & Cloppenburg",shop:"clothes"}},"shop/clothes|Pep":{tags:{brand:"Pep","brand:wikidata":"Q7166182","brand:wikipedia":"en:Pep (store)",name:"Pep",shop:"clothes"}},"shop/clothes|Pepco":{countryCodes:["cz","hu","pl","ro","sk"],matchTags:["shop/variety_store"],tags:{brand:"Pepco","brand:wikidata":"Q11815580","brand:wikipedia":"pl:Pepco",name:"Pepco",shop:"clothes"}},"shop/clothes|Petit Bateau":{countryCodes:["be","de","fr","gb","it","lu"],tags:{brand:"Petit Bateau","brand:wikidata":"Q3377090","brand:wikipedia":"en:Petit Bateau",name:"Petit Bateau",shop:"clothes"}},"shop/clothes|Phase Eight":{countryCodes:["ch","de","gb"],tags:{brand:"Phase Eight","brand:wikidata":"Q17020730","brand:wikipedia":"en:Phase Eight",name:"Phase Eight",shop:"clothes"}},"shop/clothes|Piazza Italia":{countryCodes:["it"],tags:{brand:"Piazza Italia",name:"Piazza Italia",shop:"clothes"}},"shop/clothes|Pierre Cardin":{tags:{brand:"Pierre Cardin","brand:wikidata":"Q22921009",name:"Pierre Cardin",shop:"clothes"}},"shop/clothes|Pimkie":{countryCodes:["at","be","de","es","fr","it"],tags:{brand:"Pimkie","brand:wikidata":"Q1758066","brand:wikipedia":"en:Pimkie",name:"Pimkie",shop:"clothes"}},"shop/clothes|Pink":{tags:{brand:"Pink","brand:wikidata":"Q20716793","brand:wikipedia":"en:Pink (Victoria's Secret)",clothes:"underwear;women",name:"Pink",shop:"clothes"}},"shop/clothes|Plato's Closet":{countryCodes:["ca","us"],tags:{brand:"Plato's Closet","brand:wikidata":"Q61779112",name:"Plato's Closet",second_hand:"only",shop:"clothes"}},"shop/clothes|Polo Ralph Lauren":{tags:{brand:"Polo Ralph Lauren","brand:wikidata":"Q1641437","brand:wikipedia":"en:Ralph Lauren Corporation",name:"Polo Ralph Lauren",shop:"clothes"}},"shop/clothes|Primark":{tags:{brand:"Primark","brand:wikidata":"Q137023","brand:wikipedia":"en:Primark",name:"Primark",shop:"clothes"}},"shop/clothes|Promod":{tags:{brand:"Promod","brand:wikidata":"Q3407429","brand:wikipedia":"en:Promod",name:"Promod",shop:"clothes"}},"shop/clothes|Pull & Bear":{tags:{brand:"Pull & Bear","brand:wikidata":"Q691029","brand:wikipedia":"en:Pull&Bear",name:"Pull & Bear",shop:"clothes"}},"shop/clothes|Puma":{nomatch:["amenity/fuel|Puma"],tags:{brand:"Puma","brand:wikidata":"Q157064","brand:wikipedia":"en:Puma (brand)",name:"Puma",shop:"clothes"}},"shop/clothes|Quicksilver":{tags:{brand:"Quicksilver",name:"Quicksilver",shop:"clothes"}},"shop/clothes|Rainbow":{countryCodes:["de","us"],tags:{brand:"Rainbow","brand:wikidata":"Q7284708","brand:wikipedia":"en:Rainbow Shops",name:"Rainbow",shop:"clothes"}},"shop/clothes|Reebok":{tags:{brand:"Reebok","brand:wikidata":"Q466183","brand:wikipedia":"en:Reebok",name:"Reebok",shop:"clothes"}},"shop/clothes|Reitmans":{countryCodes:["ca"],tags:{brand:"Reitmans","brand:wikidata":"Q7310506","brand:wikipedia":"en:Reitmans",name:"Reitmans",shop:"clothes"}},"shop/clothes|Reserved":{tags:{brand:"Reserved","brand:wikidata":"Q21809354","brand:wikipedia":"en:Reserved",name:"Reserved",shop:"clothes"}},"shop/clothes|River Island":{countryCodes:["gb","ie","im","nl","pl"],tags:{brand:"River Island","brand:wikidata":"Q2670328","brand:wikipedia":"en:River Island",name:"River Island",shop:"clothes"}},"shop/clothes|Robert Graham":{countryCodes:["us"],tags:{brand:"Robert Graham","brand:wikidata":"Q18390679","brand:wikipedia":"en:Robert Graham (fashion brand)",clothes:"men",name:"Robert Graham",shop:"clothes"}},"shop/clothes|Roots":{tags:{brand:"Roots",name:"Roots",shop:"clothes"}},"shop/clothes|Ross":{countryCodes:["us"],tags:{brand:"Ross","brand:wikidata":"Q3442791","brand:wikipedia":"en:Ross Stores",name:"Ross",official_name:"Ross Dress for Less",shop:"clothes"}},"shop/clothes|Saint Laurent":{tags:{alt_name:"Yves Saint Laurent",brand:"Saint Laurent","brand:wikidata":"Q2282172","brand:wikipedia":"en:Yves Saint Laurent (brand)",name:"Saint Laurent",shop:"clothes",short_name:"YSL"}},"shop/clothes|Sandro":{tags:{brand:"Sandro",name:"Sandro",shop:"clothes"}},"shop/clothes|Scotch & Soda":{tags:{brand:"Scotch & Soda",name:"Scotch & Soda",shop:"clothes"}},"shop/clothes|Sela":{countryCodes:["kg","ru"],tags:{brand:"Sela","brand:wikidata":"Q62075111",name:"Sela",shop:"clothes"}},"shop/clothes|Select":{nomatch:["shop/convenience|Select"],tags:{brand:"Select",name:"Select",shop:"clothes"}},"shop/clothes|Sergent Major":{countryCodes:["be","de","es","fr","gb","it"],tags:{brand:"Sergent Major","brand:wikidata":"Q62521738","brand:wikipedia":"fr:Sergent Major (entreprise)",clothes:"babies;children",name:"Sergent Major",shop:"clothes"}},"shop/clothes|Shoeby":{countryCodes:["nl"],tags:{brand:"Shoeby",name:"Shoeby",shop:"clothes"}},"shop/clothes|Sinsay":{countryCodes:["pl"],tags:{brand:"Sinsay",name:"Sinsay",shop:"clothes"}},"shop/clothes|Sisley":{countryCodes:["at","ch","de","hr","it","ru"],tags:{brand:"Sisley","brand:wikidata":"Q12054325","brand:wikipedia":"cs:Sisley",name:"Sisley",shop:"clothes"}},"shop/clothes|Slaters":{countryCodes:["gb"],tags:{brand:"Slaters","brand:wikidata":"Q7538912",clothes:"suits",name:"Slaters",shop:"clothes"}},"shop/clothes|Spanx":{countryCodes:["us"],tags:{brand:"Spanx","brand:wikidata":"Q1932886","brand:wikipedia":"en:Spanx",clothes:"underwear",name:"Spanx",shop:"clothes"}},"shop/clothes|Springfield":{tags:{brand:"Springfield","brand:wikidata":"Q958209","brand:wikipedia":"es:Springfield (cadena de tiendas)",name:"Springfield",shop:"clothes"}},"shop/clothes|Stefanel":{countryCodes:["at","de","fr","it"],tags:{brand:"Stefanel","brand:wikidata":"Q2338087","brand:wikipedia":"ro:Stefanel (companie)",name:"Stefanel",shop:"clothes"}},"shop/clothes|Steps":{countryCodes:["nl"],tags:{brand:"Steps",name:"Steps",shop:"clothes"}},"shop/clothes|Stradivarius":{tags:{brand:"Stradivarius","brand:wikidata":"Q3322945","brand:wikipedia":"en:Stradivarius (clothing brand)",name:"Stradivarius",shop:"clothes"}},"shop/clothes|Street One":{countryCodes:["at","be","bg","ch","cz","de","dk","es","fi","fr","hr","hu","ie","it","lt","lu","lv","nl","no","pl","ro","se","si","sk"],tags:{brand:"Street One","brand:wikidata":"Q61997265",name:"Street One",shop:"clothes"}},"shop/clothes|Suburbia":{countryCodes:["mx"],tags:{brand:"Suburbia","brand:wikidata":"Q6134992","brand:wikipedia":"en:Suburbia (department store)",name:"Suburbia",shop:"clothes"}},"shop/clothes|Superdry":{tags:{brand:"Superdry","brand:wikidata":"Q1684445","brand:wikipedia":"en:Superdry",name:"Superdry",shop:"clothes"}},"shop/clothes|TJ Maxx":{countryCodes:["us"],tags:{brand:"TJ Maxx","brand:wikidata":"Q10860683","brand:wikipedia":"en:TJ Maxx",name:"TJ Maxx",shop:"clothes"}},"shop/clothes|TK Maxx":{tags:{brand:"TK Maxx","brand:wikidata":"Q23823668","brand:wikipedia":"en:TK Maxx",name:"TK Maxx",shop:"clothes"}},"shop/clothes|Takko":{countryCodes:["at","cz","de","hu","nl"],matchNames:["takko fashion"],tags:{brand:"Takko","brand:wikidata":"Q1371302","brand:wikipedia":"de:Takko",name:"Takko",shop:"clothes"}},"shop/clothes|Talbots":{countryCodes:["ca","us"],tags:{brand:"Talbots","brand:wikidata":"Q7679064","brand:wikipedia":"en:Talbots",name:"Talbots",shop:"clothes"}},"shop/clothes|Tally Weijl":{tags:{brand:"Tally Weijl","brand:wikidata":"Q689695","brand:wikipedia":"en:Tally Weijl",name:"Tally Weijl",shop:"clothes"}},"shop/clothes|Tati":{countryCodes:["dz","fr"],tags:{brand:"Tati","brand:wikidata":"Q3516026","brand:wikipedia":"fr:Tati (entreprise)",name:"Tati",shop:"clothes"}},"shop/clothes|Terranova":{tags:{brand:"Terranova",name:"Terranova",shop:"clothes"}},"shop/clothes|Tezenis":{tags:{brand:"Tezenis","brand:wikidata":"Q28056374",name:"Tezenis",shop:"clothes"}},"shop/clothes|The Children's Place":{countryCodes:["ca","us"],tags:{alt_name:"Children's Place",brand:"The Children's Place","brand:wikidata":"Q3520257","brand:wikipedia":"en:The Children's Place",name:"The Children's Place",shop:"clothes"}},"shop/clothes|The North Face":{tags:{alt_name:"North Face",brand:"The North Face","brand:wikidata":"Q152784","brand:wikipedia":"en:The North Face",name:"The North Face",shop:"clothes"}},"shop/clothes|The Sting":{countryCodes:["be","de","gb","nl"],tags:{brand:"The Sting","brand:wikidata":"Q2518794","brand:wikipedia":"nl:The Sting Companies",name:"The Sting",shop:"clothes"}},"shop/clothes|The Walking Company":{tags:{alt_name:"Walking Company",brand:"The Walking Company","brand:wikidata":"Q30716262","brand:wikipedia":"en:The Walking Company",name:"The Walking Company",shop:"clothes"}},"shop/clothes|Tillys":{countryCodes:["tr"],tags:{brand:"Tillys","brand:wikidata":"Q7802889","brand:wikipedia":"en:Tillys",clothes:"children;men;women",name:"Tillys",shop:"clothes"}},"shop/clothes|Timberland":{tags:{brand:"Timberland","brand:wikidata":"Q1539185","brand:wikipedia":"en:The Timberland Company",name:"Timberland",shop:"clothes"}},"shop/clothes|Tip Top Tailors":{countryCodes:["ca"],tags:{brand:"Tip Top Tailors","brand:wikidata":"Q7808781","brand:wikipedia":"en:Tip Top Tailors",clothes:"men",name:"Tip Top Tailors",shop:"clothes"}},"shop/clothes|Tom Tailor":{tags:{brand:"Tom Tailor","brand:wikidata":"Q571206","brand:wikipedia":"en:Tom Tailor",name:"Tom Tailor",shop:"clothes"}},"shop/clothes|Tommy Bahama":{countryCodes:["ca","us"],tags:{brand:"Tommy Bahama","brand:wikidata":"Q3531299","brand:wikipedia":"en:Tommy Bahama",name:"Tommy Bahama",shop:"clothes"}},"shop/clothes|Tommy Hilfiger":{tags:{brand:"Tommy Hilfiger","brand:wikidata":"Q634881","brand:wikipedia":"en:Tommy Hilfiger (company)",name:"Tommy Hilfiger",shop:"clothes"}},"shop/clothes|Top Secret":{countryCodes:["fr","pl","ru"],tags:{brand:"Top Secret",name:"Top Secret",shop:"clothes"}},"shop/clothes|Topshop":{tags:{brand:"Topshop","brand:wikidata":"Q1893576","brand:wikipedia":"en:Topshop",name:"Topshop",shop:"clothes"}},"shop/clothes|Torrid":{countryCodes:["us"],tags:{brand:"Torrid","brand:wikidata":"Q7827120","brand:wikipedia":"en:Torrid (clothing retailer)",name:"Torrid",shop:"clothes"}},"shop/clothes|Tory Burch":{countryCodes:["us"],tags:{brand:"Tory Burch","brand:wikidata":"Q19988222","brand:wikipedia":"en:Tory Burch (company)",name:"Tory Burch",shop:"clothes"}},"shop/clothes|Triumph":{tags:{brand:"Triumph","brand:wikidata":"Q671216","brand:wikipedia":"en:Triumph International",name:"Triumph",shop:"clothes"}},"shop/clothes|Truworths":{countryCodes:["za"],tags:{brand:"Truworths","brand:wikidata":"Q24233998","brand:wikipedia":"en:Truworths",name:"Truworths",shop:"clothes"}},"shop/clothes|UNTUCKit":{countryCodes:["ca","us"],tags:{brand:"UNTUCKit","brand:wikidata":"Q28207006","brand:wikipedia":"en:Untuckit",name:"UNTUCKit",shop:"clothes"}},"shop/clothes|USC":{countryCodes:["gb","ie"],tags:{brand:"USC","brand:wikidata":"Q7866331","brand:wikipedia":"en:USC (clothing retailer)",name:"USC",shop:"clothes"}},"shop/clothes|Ulla Popken":{countryCodes:["at","be","ch","de","fr","nl"],tags:{brand:"Ulla Popken","brand:wikidata":"Q2475146","brand:wikipedia":"en:Ulla Popken",name:"Ulla Popken",shop:"clothes"}},"shop/clothes|Under Armour":{tags:{brand:"Under Armour","brand:wikidata":"Q2031485","brand:wikipedia":"en:Under Armour",clothes:"men;women",name:"Under Armour",shop:"clothes"}},"shop/clothes|Uniqlo":{tags:{brand:"Uniqlo","brand:wikidata":"Q26070","brand:wikipedia":"en:Uniqlo",name:"Uniqlo",shop:"clothes"}},"shop/clothes|United Colors of Benetton":{tags:{brand:"United Colors of Benetton","brand:wikidata":"Q817139","brand:wikipedia":"en:Benetton Group",name:"United Colors of Benetton",shop:"clothes",short_name:"Benetton"}},"shop/clothes|Urban Outfitters":{tags:{brand:"Urban Outfitters","brand:wikidata":"Q3552193","brand:wikipedia":"en:Urban Outfitters",name:"Urban Outfitters",shop:"clothes"}},"shop/clothes|Vero Moda":{tags:{brand:"Vero Moda","brand:wikidata":"Q594721","brand:wikipedia":"en:Bestseller (company)",name:"Vero Moda",shop:"clothes"}},"shop/clothes|Victoria's Secret":{tags:{brand:"Victoria's Secret","brand:wikidata":"Q332477","brand:wikipedia":"en:Victoria's Secret",clothes:"underwear;women",name:"Victoria's Secret",shop:"clothes"}},"shop/clothes|Vilebrequin":{countryCodes:["fr","it"],tags:{brand:"Vilebrequin","brand:wikidata":"Q3558391","brand:wikipedia":"en:Vilebrequin",clothes:"swimwear",name:"Vilebrequin",shop:"clothes"}},"shop/clothes|Vineyard Vines":{countryCodes:["us"],tags:{brand:"Vineyard Vines","brand:wikidata":"Q7932495","brand:wikipedia":"en:Vineyard Vines",name:"Vineyard Vines",shop:"clothes"}},"shop/clothes|Volcom":{tags:{brand:"Volcom","brand:wikidata":"Q2021416","brand:wikipedia":"en:Volcom",name:"Volcom",shop:"clothes"}},"shop/clothes|WE":{countryCodes:["be","ch","de","nl"],tags:{brand:"WE","brand:wikidata":"Q1987861","brand:wikipedia":"en:WE (clothing)",name:"WE",shop:"clothes"}},"shop/clothes|Wacoal":{tags:{brand:"Wacoal","brand:wikidata":"Q909522","brand:wikipedia":"en:Wacoal",clothes:"underwear",name:"Wacoal",shop:"clothes"}},"shop/clothes|White House Black Market":{countryCodes:["ca","us"],tags:{brand:"White House Black Market","brand:wikidata":"Q7994858","brand:wikipedia":"en:White House Black Market",name:"White House Black Market",shop:"clothes"}},"shop/clothes|White Stuff":{countryCodes:["de","dk","gb","gg"],tags:{brand:"White Stuff","brand:wikidata":"Q7995442","brand:wikipedia":"en:White Stuff Clothing",name:"White Stuff",shop:"clothes"}},"shop/clothes|Wibra":{countryCodes:["be","nl"],tags:{brand:"Wibra","brand:wikidata":"Q943405","brand:wikipedia":"en:Wibra",name:"Wibra",shop:"clothes"}},"shop/clothes|Wilsons Leather":{countryCodes:["ca","us"],tags:{brand:"Wilsons Leather","brand:wikidata":"Q8023296","brand:wikipedia":"en:Wilsons Leather",clothes:"men;women",name:"Wilsons Leather",shop:"clothes"}},"shop/clothes|Winners":{countryCodes:["ca","es"],tags:{brand:"Winners","brand:wikidata":"Q845257","brand:wikipedia":"en:Winners",name:"Winners",shop:"clothes"}},"shop/clothes|Wolford":{countryCodes:["at","de","fr","gb","it","nl"],tags:{brand:"Wolford","brand:wikidata":"Q431607","brand:wikipedia":"en:Wolford",name:"Wolford",shop:"clothes"}},"shop/clothes|Woolworths":{countryCodes:["za"],nomatch:["shop/supermarket|Woolworths"],tags:{brand:"Woolworths","brand:wikidata":"Q8033997","brand:wikipedia":"en:Woolworths Holdings Limited",name:"Woolworths",shop:"clothes"}},"shop/clothes|XXI Forever":{countryCodes:["us"],tags:{brand:"Forever 21","brand:wikidata":"Q1060537","brand:wikipedia":"en:Forever 21",name:"XXI Forever",shop:"clothes"}},"shop/clothes|Yamamay":{countryCodes:["es","it"],tags:{brand:"Yamamay","brand:wikidata":"Q2599214","brand:wikipedia":"it:Yamamay",name:"Yamamay",shop:"clothes"}},"shop/clothes|Z":{nomatch:["amenity/fuel|Z"],tags:{brand:"Z",clothes:"babies;children",name:"Z",shop:"clothes"}},"shop/clothes|Zara":{tags:{brand:"Zara","brand:wikidata":"Q147662","brand:wikipedia":"en:Zara (retailer)",name:"Zara",shop:"clothes"}},"shop/clothes|Zeeman":{countryCodes:["be","de","fr","lu","nl"],tags:{brand:"Zeeman","brand:wikidata":"Q184399","brand:wikipedia":"en:Zeeman (store)",name:"Zeeman",shop:"clothes"}},"shop/clothes|Zumiez":{countryCodes:["ca","us"],tags:{brand:"Zumiez","brand:wikidata":"Q8075252","brand:wikipedia":"en:Zumiez",name:"Zumiez",shop:"clothes"}},"shop/clothes|mister*lady":{countryCodes:["at","de"],tags:{brand:"mister*lady","brand:wikidata":"Q18640136","brand:wikipedia":"de:Mister*lady",name:"mister*lady",shop:"clothes"}},"shop/clothes|rue21":{countryCodes:["us"],tags:{brand:"rue21","brand:wikidata":"Q7377762","brand:wikipedia":"en:Rue21",name:"rue21",shop:"clothes"}},"shop/clothes|s.Oliver":{countryCodes:["at","be","de","fr","hr"],tags:{brand:"s.Oliver","brand:wikidata":"Q265056","brand:wikipedia":"en:S.Oliver",name:"s.Oliver",shop:"clothes"}},"shop/clothes|Липненски":{countryCodes:["bg"],tags:{brand:"Липненски",name:"Липненски",shop:"clothes"}},"shop/clothes|Московская ярмарка":{countryCodes:["ru","ua"],tags:{brand:"Московская ярмарка",name:"Московская ярмарка",shop:"clothes"}},"shop/clothes|Смешные цены":{countryCodes:["kz","ru"],tags:{brand:"Смешные цены",name:"Смешные цены",shop:"clothes"}},"shop/clothes|しまむら":{countryCodes:["jp"],tags:{brand:"しまむら","brand:en":"Shimamura","brand:ja":"しまむら","brand:wikidata":"Q7758173","brand:wikipedia":"ja:しまむら",name:"しまむら","name:en":"Shimamura","name:ja":"しまむら",shop:"clothes"}},"shop/clothes|はるやま":{countryCodes:["jp"],tags:{brand:"はるやま","brand:en":"Haruyama","brand:ja":"はるやま","brand:wikidata":"Q11275918","brand:wikipedia":"ja:はるやま商事",name:"はるやま","name:en":"Haruyama","name:ja":"はるやま",shop:"clothes"}},"shop/clothes|コナカ":{countryCodes:["jp"],tags:{brand:"コナカ","brand:ja":"コナカ",name:"コナカ","name:ja":"コナカ",shop:"clothes"}},"shop/clothes|ユニクロ":{countryCodes:["jp"],tags:{brand:"ユニクロ","brand:en":"UNIQLO","brand:ja":"ユニクロ","brand:wikidata":"Q26070","brand:wikipedia":"en:Uniqlo",name:"ユニクロ","name:en":"UNIQLO","name:ja":"ユニクロ",shop:"clothes"}},"shop/clothes|ライトオン":{countryCodes:["jp"],tags:{brand:"ライトオン","brand:en":"Right-on","brand:ja":"ライトオン","brand:wikidata":"Q11346416","brand:wikipedia":"ja:ライトオン",name:"ライトオン","name:en":"Right-on","name:ja":"ライトオン",shop:"clothes"}},"shop/clothes|ワークマン":{countryCodes:["jp"],tags:{brand:"ワークマン","brand:en":"Workman","brand:ja":"ワークマン","brand:wikidata":"Q11351660","brand:wikipedia":"ja:ワークマン",name:"ワークマン","name:en":"Workman","name:ja":"ワークマン",shop:"clothes"}},"shop/clothes|洋服の青山":{countryCodes:["jp"],tags:{brand:"洋服の青山","brand:en":"Aoyama Tailor","brand:ja":"洋服の青山","brand:wikidata":"Q11661241","brand:wikipedia":"ja:青山商事",name:"洋服の青山","name:en":"Aoyama Tailor","name:ja":"洋服の青山",shop:"clothes"}},"shop/coffee|Nespresso":{tags:{brand:"Nespresso","brand:wikidata":"Q301301","brand:wikipedia":"en:Nespresso",name:"Nespresso",shop:"coffee"}},"shop/coffee|Tchibo":{countryCodes:["at","ch","cz","de","pl","sk"],matchTags:["shop/convenience"],tags:{brand:"Tchibo","brand:wikidata":"Q564213","brand:wikipedia":"de:Tchibo",name:"Tchibo",shop:"coffee"}},"shop/computer|DNS":{countryCodes:["ru","ua"],tags:{alt_name:"ДНС",brand:"DNS","brand:en":"DNS","brand:ru":"ДНС","brand:wikidata":"Q4036922","brand:wikipedia":"ru:DNS (компания)",name:"DNS","name:en":"DNS","name:ru":"ДНС",shop:"computer"}},"shop/computer|PC World":{countryCodes:["gb"],tags:{brand:"PC World","brand:wikidata":"Q7118727","brand:wikipedia":"en:PC World (retailer)",name:"PC World",shop:"computer"}},"shop/confectionery|Adyar Ananda Bhavan":{countryCodes:["in"],matchTags:["amenity/restaurant"],tags:{brand:"Adyar Ananda Bhavan","brand:wikidata":"Q15178238","brand:wikipedia":"en:Adyar Ananda Bhavan",name:"Adyar Ananda Bhavan",shop:"confectionery"}},"shop/confectionery|Hemmakvall":{countryCodes:["se"],tags:{brand:"Hemmakväll","brand:wikidata":"Q10521791","brand:wikipedia":"sv:Hemmakväll",name:"Hemmakväll",shop:"confectionery"}},"shop/confectionery|Hussel":{countryCodes:["at","de"],tags:{brand:"Hussel","brand:wikidata":"Q17123688","brand:wikipedia":"de:Hussel",name:"Hussel",shop:"confectionery"}},"shop/confectionery|Jamin":{countryCodes:["nl"],tags:{brand:"Jamin","brand:wikidata":"Q2291848","brand:wikipedia":"nl:Jamin",name:"Jamin",shop:"confectionery"}},"shop/confectionery|Kilwins":{countryCodes:["us"],matchTags:["amenity/ice_cream"],tags:{brand:"Kilwins","brand:wikidata":"Q38250832","brand:wikipedia":"en:Kilwins",cuisine:"chocolate;ice_cream;popcorn",name:"Kilwins",shop:"confectionery"}},"shop/confectionery|Rocky Mountain Chocolate Factory":{countryCodes:["ca","us"],tags:{brand:"Rocky Mountain Chocolate Factory","brand:wikidata":"Q7355878","brand:wikipedia":"en:Rocky Mountain Chocolate Factory",name:"Rocky Mountain Chocolate Factory",shop:"confectionery"}},"shop/confectionery|See's Candies":{countryCodes:["us"],matchNames:["sees candy"],tags:{brand:"See's Candies","brand:wikidata":"Q2103510","brand:wikipedia":"en:See's Candies",name:"See's Candies",shop:"confectionery"}},"shop/confectionery|T. SN":{countryCodes:["ec"],tags:{brand:"T. SN",name:"T. SN",shop:"confectionery"}},"shop/confectionery|Thorntons":{countryCodes:["gb"],tags:{brand:"Thorntons","brand:wikidata":"Q683102","brand:wikipedia":"en:Thorntons",name:"Thorntons",shop:"confectionery"}},"shop/confectionery|Вацак":{countryCodes:["ua"],tags:{brand:"Вацак","brand:wikidata":"Q30966576","brand:wikipedia":"uk:Кондитерський Дім «Вацак»",name:"Вацак",shop:"confectionery"}},"shop/confectionery|シャトレーゼ":{countryCodes:["jp"],tags:{brand:"シャトレーゼ","brand:en":"Chateraise","brand:ja":"シャトレーゼ","brand:wikidata":"Q11307696","brand:wikipedia":"ja:シャトレーゼ",name:"シャトレーゼ","name:en":"Chateraise","name:ja":"シャトレーゼ",shop:"confectionery"}},"shop/confectionery|不二家":{countryCodes:["jp"],tags:{brand:"不二家",name:"不二家",shop:"confectionery"}},"shop/convenience|24 часа":{countryCodes:["by","kz","ru","ua"],tags:{brand:"24 часа",name:"24 часа",shop:"convenience"}},"shop/convenience|7-Eleven":{matchNames:["7-11","seven eleven"],matchTags:["shop/supermarket"],nomatch:["amenity/fuel|7-Eleven"],tags:{brand:"7-Eleven","brand:wikidata":"Q259340","brand:wikipedia":"en:7-Eleven",name:"7-Eleven",shop:"convenience"}},"shop/convenience|76":{nomatch:["amenity/fuel|76"],tags:{brand:"76","brand:wikidata":"Q1658320","brand:wikipedia":"en:76 (gas station)",name:"76",shop:"convenience"}},"shop/convenience|8 à Huit":{countryCodes:["fr"],nomatch:["shop/supermarket|8 à Huit"],tags:{brand:"8 à Huit","brand:wikidata":"Q2818601","brand:wikipedia":"fr:8 à Huit",name:"8 à Huit",shop:"convenience"}},"shop/convenience|99 Speedmart":{countryCodes:["br","my","us"],tags:{brand:"99 Speedmart","brand:wikidata":"Q62075061",name:"99 Speedmart",shop:"convenience"}},"shop/convenience|ABC~(Hawaii)":{countryCodes:["us"],matchNames:["abc stores"],nomatch:["amenity/fuel|ABC"],tags:{brand:"ABC","brand:wikidata":"Q4650251","brand:wikipedia":"en:ABC Stores (Hawaii)",name:"ABC",shop:"convenience"}},"shop/convenience|Aibė":{countryCodes:["lt"],tags:{brand:"Aibė","brand:wikidata":"Q1022952","brand:wikipedia":"de:Aibė",name:"Aibė",shop:"convenience"}},"shop/convenience|Albert Heijn to go":{countryCodes:["nl"],tags:{brand:"Albert Heijn to go","brand:wikidata":"Q1653985","brand:wikipedia":"en:Albert Heijn",name:"Albert Heijn to go",shop:"convenience"}},"shop/convenience|Alepa":{countryCodes:["fi"],tags:{brand:"Alepa","brand:wikidata":"Q4716167","brand:wikipedia":"fi:Alepa",name:"Alepa",shop:"convenience"}},"shop/convenience|Alfamart":{countryCodes:["id"],tags:{brand:"Alfamart","brand:wikidata":"Q23745600","brand:wikipedia":"id:Alfamart",name:"Alfamart",shop:"convenience"}},"shop/convenience|Alfamidi":{countryCodes:["id"],tags:{brand:"Alfamidi","brand:wikidata":"Q12471462","brand:wikipedia":"id:Alfamidi",name:"Alfamidi",shop:"convenience"}},"shop/convenience|Almacén":{countryCodes:["ar","bo","cl","pe","uy"],tags:{brand:"Almacén",name:"Almacén",shop:"convenience"}},"shop/convenience|Aral":{countryCodes:["de"],matchNames:["aral tankstelle"],matchTags:["shop/kiosk"],nomatch:["amenity/fuel|Aral"],tags:{brand:"Aral","brand:wikidata":"Q565734","brand:wikipedia":"en:Aral AG",name:"Aral",shop:"convenience"}},"shop/convenience|BP Shop":{countryCodes:["au","ch","fr","gb","us"],nomatch:["amenity/fuel|BP"],tags:{brand:"BP Shop","brand:wikidata":"Q152057","brand:wikipedia":"en:BP",name:"BP Shop",shop:"convenience"}},"shop/convenience|Best-one":{countryCodes:["gb"],tags:{brand:"Best-one","brand:wikidata":"Q4896532","brand:wikipedia":"en:Best-one",name:"Best-one",shop:"convenience"}},"shop/convenience|Bonjour":{tags:{brand:"Bonjour",name:"Bonjour",shop:"convenience"}},"shop/convenience|Buc-ee's":{countryCodes:["us"],tags:{brand:"Buc-ee's","brand:wikidata":"Q4982335","brand:wikipedia":"en:Buc-ee's",name:"Buc-ee's",shop:"convenience"}},"shop/convenience|Budgens":{nomatch:["shop/supermarket|Budgens"],tags:{brand:"Budgens","brand:wikidata":"Q4985016","brand:wikipedia":"en:Budgens",name:"Budgens",shop:"convenience"}},"shop/convenience|CBA":{tags:{brand:"CBA","brand:wikidata":"Q779845","brand:wikipedia":"en:CBA (food retail)",name:"CBA",shop:"convenience"}},"shop/convenience|COOP Jednota":{countryCodes:["cz","sk"],matchNames:["jednota"],nomatch:["shop/supermarket|COOP Jednota"],tags:{brand:"COOP Jednota","brand:wikidata":"Q41629254","brand:wikipedia":"sk:COOP Jednota Slovensko",name:"COOP Jednota",shop:"convenience"}},"shop/convenience|CU":{countryCodes:["kr"],tags:{brand:"CU",name:"CU",shop:"convenience"}},"shop/convenience|Carrefour Express":{matchTags:["shop/supermarket"],nomatch:["amenity/fuel|Carrefour","shop/supermarket|Carrefour"],tags:{brand:"Carrefour Express","brand:wikidata":"Q2940190","brand:wikipedia":"fr:Carrefour Express",name:"Carrefour Express",shop:"convenience"}},"shop/convenience|Casey's General Store":{nomatch:["amenity/fuel|Casey's General Store"],tags:{brand:"Casey's General Store","brand:wikidata":"Q2940968","brand:wikipedia":"en:Casey's General Stores",name:"Casey's General Store",shop:"convenience"}},"shop/convenience|Casino":{tags:{brand:"Casino",name:"Casino",shop:"convenience"}},"shop/convenience|Casino Shop":{countryCodes:["fr"],tags:{brand:"Casino Shop",name:"Casino Shop",shop:"convenience"}},"shop/convenience|Centra":{countryCodes:["gb","ie"],tags:{brand:"Centra","brand:wikidata":"Q747678","brand:wikipedia":"en:Centra",name:"Centra",shop:"convenience"}},"shop/convenience|Central Convenience Store":{tags:{brand:"Central Convenience Store",name:"Central Convenience Store",shop:"convenience"}},"shop/convenience|Chata Polska":{nomatch:["shop/supermarket|Chata Polska"],tags:{brand:"Chata Polska","brand:wikidata":"Q61994406",name:"Chata Polska",shop:"convenience"}},"shop/convenience|Cheers":{countryCodes:["sg","vn"],tags:{brand:"Cheers","brand:wikidata":"Q64154066",name:"Cheers",opening_hours:"24/7",shop:"convenience"}},"shop/convenience|Chevron":{nomatch:["amenity/fuel|Chevron"],tags:{brand:"Chevron","brand:wikidata":"Q319642","brand:wikipedia":"en:Chevron Corporation",name:"Chevron",shop:"convenience"}},"shop/convenience|Circle K":{matchNames:["ok","ok-mart"],nomatch:["amenity/fuel|Circle K"],tags:{brand:"Circle K","brand:wikidata":"Q3268010","brand:wikipedia":"en:Circle K",name:"Circle K",shop:"convenience"}},"shop/convenience|Citgo":{nomatch:["amenity/fuel|Citgo"],tags:{brand:"Citgo","brand:wikidata":"Q2974437","brand:wikipedia":"en:Citgo",name:"Citgo",shop:"convenience"}},"shop/convenience|Co-op~(Canada)":{countryCodes:["ca"],nomatch:["amenity/fuel|Co-op~(Canada)","shop/convenience|Coop~(Schweiz)","shop/convenience|The Co-operative Food~(UK)","shop/supermarket|Co-op~(Canada)","shop/supermarket|Coop~(Schweiz)","shop/supermarket|The Co-operative Food~(UK)"],tags:{brand:"Federated Co-operatives","brand:wikidata":"Q5440676","brand:wikipedia":"en:Federated Co-operatives",name:"Co-op",shop:"convenience"}},"shop/convenience|CocciMarket":{countryCodes:["fr"],tags:{brand:"CocciMarket",name:"CocciMarket",shop:"convenience"}},"shop/convenience|Coles Express":{nomatch:["amenity/fuel|Coles Express"],tags:{brand:"Coles Express","brand:wikidata":"Q5144653","brand:wikipedia":"en:Coles Express",name:"Coles Express",shop:"convenience"}},"shop/convenience|Coop Pronto":{countryCodes:["ch","li"],nomatch:["amenity/cafe|Pronto"],tags:{brand:"Coop Pronto","brand:wikidata":"Q1129777","brand:wikipedia":"de:Coop Mineraloel",name:"Coop Pronto",shop:"convenience"}},"shop/convenience|Coop~(Schweiz)":{countryCodes:["ch"],nomatch:["amenity/fuel|Co-op~(Canada)","shop/convenience|Co-op~(Canada)","shop/convenience|The Co-operative Food~(UK)","shop/supermarket|Co-op~(Canada)","shop/supermarket|Coop~(Schweiz)","shop/supermarket|The Co-operative Food~(UK)"],tags:{brand:"Coop","brand:wikidata":"Q432564","brand:wikipedia":"de:Coop (Schweiz)",name:"Coop",shop:"convenience"}},"shop/convenience|Costcutter":{nomatch:["shop/supermarket|Costcutter"],tags:{brand:"Costcutter","brand:wikidata":"Q5175072","brand:wikipedia":"en:Costcutter",name:"Costcutter",shop:"convenience"}},"shop/convenience|Couche-Tard":{nomatch:["amenity/fuel|Couche-Tard"],tags:{brand:"Couche-Tard","brand:wikidata":"Q2836957","brand:wikipedia":"en:Alimentation Couche-Tard",name:"Couche-Tard",shop:"convenience"}},"shop/convenience|Cumberland Farms":{nomatch:["amenity/fuel|Cumberland Farms"],tags:{brand:"Cumberland Farms","brand:wikidata":"Q1143685","brand:wikipedia":"en:Cumberland Farms",name:"Cumberland Farms",shop:"convenience"}},"shop/convenience|Daisy Mart":{countryCodes:["ca"],tags:{brand:"Daisy Mart","brand:wikidata":"Q61994934",name:"Daisy Mart",shop:"convenience"}},"shop/convenience|Delikatesy Centrum":{countryCodes:["pl"],nomatch:["shop/supermarket|Delikatesy Centrum"],tags:{brand:"Delikatesy Centrum","brand:wikidata":"Q11693824","brand:wikipedia":"pl:Delikatesy Centrum",name:"Delikatesy Centrum",shop:"convenience"}},"shop/convenience|Express":{nomatch:["shop/clothes|Express"],tags:{brand:"Express",name:"Express",shop:"convenience"}},"shop/convenience|ExtraMile":{countryCodes:["us"],tags:{brand:"ExtraMile","brand:wikidata":"Q64224605",name:"ExtraMile",shop:"convenience"}},"shop/convenience|FamilyMart":{tags:{brand:"FamilyMart","brand:wikidata":"Q1191685","brand:wikipedia":"en:FamilyMart",name:"FamilyMart",shop:"convenience"}},"shop/convenience|Food Mart":{tags:{brand:"Food Mart",name:"Food Mart",shop:"convenience"}},"shop/convenience|Four Square":{countryCodes:["nz"],tags:{brand:"Four Square","brand:wikidata":"Q5475558","brand:wikipedia":"en:Four Square (supermarket)",name:"Four Square",shop:"convenience"}},"shop/convenience|Franprix":{countryCodes:["fr"],matchTags:["shop/supermarket"],tags:{brand:"Franprix","brand:wikidata":"Q2420096","brand:wikipedia":"fr:Franprix",name:"Franprix",shop:"convenience"}},"shop/convenience|Fresh":{tags:{brand:"Fresh",name:"Fresh",shop:"convenience"}},"shop/convenience|Freshmarket":{countryCodes:["pl"],tags:{brand:"Freshmarket","brand:wikidata":"Q16546326","brand:wikipedia":"pl:Freshmarket",name:"Freshmarket",shop:"convenience"}},"shop/convenience|GS25":{countryCodes:["kr"],matchTags:["shop/supermarket"],tags:{brand:"GS25","brand:wikidata":"Q624041","brand:wikipedia":"ko:GS25",name:"GS25",shop:"convenience"}},"shop/convenience|Groszek":{countryCodes:["pl"],nomatch:["shop/supermarket|Groszek"],tags:{brand:"Groszek","brand:wikidata":"Q9280965","brand:wikipedia":"pl:Groszek (sieć sklepów)",name:"Groszek",shop:"convenience"}},"shop/convenience|Hasty Market":{countryCodes:["ca"],tags:{brand:"Hasty Market","brand:wikidata":"Q58022603",name:"Hasty Market",shop:"convenience"}},"shop/convenience|Holiday":{nomatch:["amenity/fuel|Holiday"],tags:{brand:"Holiday",name:"Holiday",shop:"convenience"}},"shop/convenience|Hruška":{nomatch:["shop/supermarket|Hruška"],tags:{brand:"Hruška",name:"Hruška",shop:"convenience"}},"shop/convenience|Hudson":{nomatch:["shop/newsagent|Hudson News"],tags:{brand:"Hudson","brand:wikidata":"Q5928787","brand:wikipedia":"en:Hudson Group",name:"Hudson",shop:"convenience"}},"shop/convenience|Husky":{countryCodes:["ca"],nomatch:["amenity/fuel|Husky","amenity/restaurant|Husky House"],tags:{brand:"Husky","brand:wikidata":"Q702049","brand:wikipedia":"en:Husky Energy",name:"Husky",shop:"convenience"}},"shop/convenience|Indomaret":{countryCodes:["id"],matchTags:["shop/supermarket"],tags:{brand:"Indomaret","brand:wikidata":"Q4262825","brand:wikipedia":"en:Indomaret",name:"Indomaret",shop:"convenience"}},"shop/convenience|Indomart":{countryCodes:["id"],tags:{brand:"Indomart",name:"Indomart",shop:"convenience"}},"shop/convenience|Intermarché Contact":{countryCodes:["fr"],matchTags:["shop/supermarket"],tags:{brand:"Intermarché Contact","brand:wikidata":"Q3153200","brand:wikipedia":"fr:Intermarché",name:"Intermarché Contact",shop:"convenience"}},"shop/convenience|Irving":{nomatch:["amenity/fuel|Irving"],tags:{brand:"Irving",name:"Irving",shop:"convenience"}},"shop/convenience|Jacksons":{countryCodes:["us"],tags:{brand:"Jacksons","brand:wikidata":"Q64617393",name:"Jacksons",shop:"convenience"}},"shop/convenience|Jiffy":{tags:{brand:"Jiffy",name:"Jiffy",shop:"convenience"}},"shop/convenience|Joker":{countryCodes:["no"],matchTags:["shop/supermarket"],tags:{brand:"Joker","brand:wikidata":"Q716328","brand:wikipedia":"en:Joker (store)",name:"Joker",shop:"convenience"}},"shop/convenience|K-Market":{countryCodes:["fi"],matchTags:["shop/supermarket"],tags:{brand:"K-Market","brand:wikidata":"Q11868562","brand:wikipedia":"fi:K-Market",name:"K-Market",shop:"convenience"}},"shop/convenience|Kangaroo Express":{countryCodes:["us"],nomatch:["amenity/fuel|Kangaroo Express"],tags:{brand:"Kangaroo Express","brand:wikidata":"Q61747408",name:"Kangaroo Express",shop:"convenience",short_name:"Kangaroo"}},"shop/convenience|Konzum~(Balkans)":{countryCodes:["ba","hr","rs"],nomatch:["shop/convenience|Konzum~(Czechia)","shop/supermarket|Konzum~(Balkans)","shop/supermarket|Konzum~(Czechia)"],tags:{brand:"Konzum","brand:wikidata":"Q518563","brand:wikipedia":"hr:Konzum",name:"Konzum",shop:"convenience"}},"shop/convenience|Konzum~(Czechia)":{countryCodes:["cz","sk"],nomatch:["shop/convenience|Konzum~(Balkans)","shop/supermarket|Konzum~(Balkans)","shop/supermarket|Konzum~(Czechia)"],tags:{brand:"Konzum",name:"Konzum",shop:"convenience"}},"shop/convenience|Kum & Go":{nomatch:["amenity/fuel|Kum & Go"],tags:{brand:"Kum & Go","brand:wikidata":"Q6443340","brand:wikipedia":"en:Kum & Go",name:"Kum & Go",shop:"convenience"}},"shop/convenience|Kwik Shop":{countryCodes:["us"],tags:{brand:"Kwik Shop","brand:wikidata":"Q6450417","brand:wikipedia":"en:Kwik Shop",name:"Kwik Shop",shop:"convenience"}},"shop/convenience|Kwik Trip":{countryCodes:["us"],nomatch:["amenity/fuel|Kwik Trip"],tags:{brand:"Kwik Trip","brand:wikidata":"Q6450420","brand:wikipedia":"en:Kwik Trip",name:"Kwik Trip",shop:"convenience"}},"shop/convenience|Lawson":{tags:{brand:"Lawson","brand:wikidata":"Q1557223","brand:wikipedia":"en:Lawson (store)",name:"Lawson",shop:"convenience"}},"shop/convenience|Lewiatan":{countryCodes:["pl"],nomatch:["shop/supermarket|Lewiatan"],tags:{brand:"Lewiatan","brand:wikidata":"Q11755396","brand:wikipedia":"pl:Lewiatan (sieć handlowa)",name:"Lewiatan",shop:"convenience"}},"shop/convenience|Lifestyle Express":{countryCodes:["gb"],tags:{brand:"Lifestyle Express","brand:wikidata":"Q61994869",name:"Lifestyle Express",shop:"convenience"}},"shop/convenience|Loaf 'N Jug":{countryCodes:["us"],tags:{brand:"Loaf 'N Jug","brand:wikidata":"Q6663398","brand:wikipedia":"en:Loaf 'N Jug",name:"Loaf 'N Jug",shop:"convenience"}},"shop/convenience|Londis":{tags:{brand:"Londis",name:"Londis",shop:"convenience"}},"shop/convenience|M&S Simply Food":{nomatch:["shop/supermarket|M&S Simply Food"],tags:{brand:"M&S Simply Food",name:"M&S Simply Food",shop:"convenience"}},"shop/convenience|Mac's":{nomatch:["amenity/fuel|Mac's"],tags:{brand:"Mac's",name:"Mac's",shop:"convenience"}},"shop/convenience|Mace":{countryCodes:["gb","ie"],tags:{brand:"Mace","brand:wikidata":"Q17089386","brand:wikipedia":"en:Mace (shop)",name:"Mace",shop:"convenience"}},"shop/convenience|Marathon":{nomatch:["amenity/fuel|Marathon"],tags:{brand:"Marathon","brand:wikidata":"Q458363","brand:wikipedia":"en:Marathon Petroleum",name:"Marathon",shop:"convenience"}},"shop/convenience|Maverik":{nomatch:["amenity/fuel|Maverik"],tags:{brand:"Maverik",name:"Maverik",shop:"convenience"}},"shop/convenience|Maxikiosco":{countryCodes:["ar","uy"],tags:{brand:"Maxikiosco",name:"Maxikiosco",shop:"convenience"}},"shop/convenience|Małpka Express":{countryCodes:["pl"],tags:{brand:"Małpka Express","brand:wikidata":"Q18431946","brand:wikipedia":"pl:Małpka Express",name:"Małpka Express",shop:"convenience"}},"shop/convenience|McColl's":{countryCodes:["gb"],matchTags:["shop/newsagent"],tags:{brand:"McColl's","brand:wikidata":"Q16997477","brand:wikipedia":"en:McColl's",name:"McColl's",shop:"convenience"}},"shop/convenience|Mercator":{tags:{brand:"Mercator",name:"Mercator",shop:"convenience"}},"shop/convenience|Migrolino":{countryCodes:["ch"],tags:{brand:"Migrolino","brand:wikidata":"Q56745088","brand:wikipedia":"de:Migrolino",name:"Migrolino",shop:"convenience"}},"shop/convenience|Ministop":{tags:{brand:"Ministop","brand:wikidata":"Q1038929","brand:wikipedia":"en:Ministop",name:"Ministop",shop:"convenience"}},"shop/convenience|Minit Mart":{countryCodes:["us"],tags:{brand:"Minit Mart","brand:wikidata":"Q18154470","brand:wikipedia":"en:Minit Mart Foods Inc.",name:"Minit Mart",shop:"convenience"}},"shop/convenience|Mlin i pekare":{countryCodes:["hr"],tags:{brand:"Mlin i pekare",name:"Mlin i pekare",shop:"convenience"}},"shop/convenience|Mobil Mart":{nomatch:["amenity/fuel|Mobil"],tags:{brand:"Mobil Mart","brand:wikidata":"Q3088656","brand:wikipedia":"en:Mobil",name:"Mobil Mart",shop:"convenience"}},"shop/convenience|Nasz Sklep":{countryCodes:["pl"],tags:{brand:"Nasz Sklep","brand:wikidata":"Q62070369",name:"Nasz Sklep",shop:"convenience"}},"shop/convenience|Neste K":{countryCodes:["fi"],tags:{brand:"Neste K","brand:wikidata":"Q42901270","brand:wikipedia":"fi:Neste K",name:"Neste K",shop:"convenience"}},"shop/convenience|NewDays":{countryCodes:["jp"],matchNames:["newdays ミニ"],tags:{alt_name:"ニューデイズ",brand:"NewDays","brand:wikidata":"Q11234763","brand:wikipedia":"ja:NewDays",name:"NewDays",shop:"convenience"}},"shop/convenience|Nisa":{countryCodes:["gb"],tags:{brand:"Nisa","brand:wikidata":"Q16999069","brand:wikipedia":"en:Nisa (retailer)",name:"Nisa",shop:"convenience"}},"shop/convenience|Nisa Local":{countryCodes:["gb"],tags:{brand:"Nisa Local","brand:wikidata":"Q16999069","brand:wikipedia":"en:Nisa (retailer)",name:"Nisa Local",shop:"convenience"}},"shop/convenience|OK Market":{countryCodes:["cl"],tags:{brand:"OK Market",name:"OK Market",shop:"convenience"}},"shop/convenience|OK便利商店":{countryCodes:["cn","tw"],matchNames:["ok便利店 circle k"],tags:{brand:"OK便利商店","brand:en":"Circle K","brand:wikidata":"Q3268010","brand:wikipedia":"zh:OK便利店",name:"OK便利商店","name:en":"Circle K",shop:"convenience"}},"shop/convenience|Odido":{countryCodes:["pl"],tags:{brand:"Odido",name:"Odido",shop:"convenience"}},"shop/convenience|On the Run":{tags:{brand:"On the Run","brand:wikidata":"Q16931259","brand:wikipedia":"en:On the Run (convenience store)",name:"On the Run",shop:"convenience"}},"shop/convenience|One Stop":{countryCodes:["gb","us"],tags:{brand:"One Stop",name:"One Stop",shop:"convenience"}},"shop/convenience|Orlen":{nomatch:["amenity/fuel|Orlen"],tags:{brand:"Orlen",name:"Orlen",shop:"convenience"}},"shop/convenience|Oxxo":{matchTags:["shop/supermarket"],nomatch:["amenity/fuel|Oxxo"],tags:{brand:"Oxxo","brand:wikidata":"Q1342538","brand:wikipedia":"es:Oxxo",name:"Oxxo",shop:"convenience"}},"shop/convenience|Petit Casino":{countryCodes:["fr"],matchTags:["shop/supermarket"],tags:{brand:"Petit Casino",name:"Petit Casino",shop:"convenience"}},"shop/convenience|Petro-Canada":{nomatch:["amenity/fuel|Petro-Canada"],tags:{brand:"Petro-Canada","brand:wikidata":"Q1208279","brand:wikipedia":"en:Petro-Canada",name:"Petro-Canada",shop:"convenience"}},"shop/convenience|Plaid Pantry":{countryCodes:["us"],tags:{brand:"Plaid Pantry","brand:wikidata":"Q7200591","brand:wikipedia":"en:Plaid Pantry",name:"Plaid Pantry",shop:"convenience"}},"shop/convenience|Premier":{countryCodes:["gb"],tags:{brand:"Premier","brand:wikidata":"Q7240340","brand:wikipedia":"en:Premier Stores",name:"Premier",shop:"convenience"}},"shop/convenience|Proxi":{countryCodes:["ch","fr"],matchTags:["shop/supermarket"],tags:{brand:"Proxi","brand:wikidata":"Q3408522","brand:wikipedia":"fr:Proxi",name:"Proxi",shop:"convenience"}},"shop/convenience|Proxy":{countryCodes:["fr"],tags:{brand:"Proxy",name:"Proxy",shop:"convenience"}},"shop/convenience|Quick Stop":{tags:{brand:"Quick Stop",name:"Quick Stop",shop:"convenience"}},"shop/convenience|QuickChek":{countryCodes:["us"],tags:{brand:"QuickChek",name:"QuickChek",shop:"convenience"}},"shop/convenience|QuikTrip":{nomatch:["amenity/fuel|QuikTrip"],tags:{brand:"QuikTrip",name:"QuikTrip",shop:"convenience"}},"shop/convenience|RaceTrac":{countryCodes:["us"],nomatch:["amenity/fuel|RaceTrac"],tags:{brand:"RaceTrac","brand:wikidata":"Q735942","brand:wikipedia":"en:RaceTrac",name:"RaceTrac",shop:"convenience"}},"shop/convenience|Royal Farms":{nomatch:["amenity/fuel|Royal Farms"],tags:{brand:"Royal Farms",name:"Royal Farms",shop:"convenience"}},"shop/convenience|Sainsbury's Local":{countryCodes:["gb"],matchTags:["shop/supermarket"],tags:{brand:"Sainsbury's Local","brand:wikidata":"Q13218434","brand:wikipedia":"en:Sainsbury's Local",name:"Sainsbury's Local",shop:"convenience"}},"shop/convenience|Sale":{countryCodes:["fi"],tags:{brand:"Sale","brand:wikidata":"Q11892046","brand:wikipedia":"fi:Sale",name:"Sale",shop:"convenience"}},"shop/convenience|Select":{nomatch:["shop/clothes|Select"],tags:{brand:"Select",name:"Select",shop:"convenience"}},"shop/convenience|Sheetz":{nomatch:["amenity/fuel|Sheetz"],tags:{brand:"Sheetz","brand:wikidata":"Q7492551","brand:wikipedia":"en:Sheetz",name:"Sheetz",shop:"convenience"}},"shop/convenience|Shell":{nomatch:["amenity/fuel|Shell","amenity/fuel|Shell Express"],tags:{brand:"Shell","brand:wikidata":"Q154950","brand:wikipedia":"en:Royal Dutch Shell",name:"Shell",shop:"convenience"}},"shop/convenience|Shell Select":{nomatch:["amenity/fuel|Shell","amenity/fuel|Shell Express"],tags:{brand:"Shell Select","brand:wikidata":"Q154950","brand:wikipedia":"en:Royal Dutch Shell",name:"Shell Select",shop:"convenience"}},"shop/convenience|Shop & Go":{tags:{brand:"Shop & Go",name:"Shop & Go",shop:"convenience"}},"shop/convenience|Siwa":{countryCodes:["fi"],tags:{brand:"Siwa","brand:wikidata":"Q11893827","brand:wikipedia":"fi:Siwa",name:"Siwa",shop:"convenience"}},"shop/convenience|Spar":{nomatch:["shop/convenience|Spar Express","shop/supermarket|Spar"],tags:{brand:"Spar","brand:wikidata":"Q610492","brand:wikipedia":"en:Spar (retailer)",name:"Spar",shop:"convenience"}},"shop/convenience|Spar Express":{matchTags:["shop/supermarket"],nomatch:["shop/convenience|Spar","shop/supermarket|Spar"],tags:{brand:"Spar","brand:wikidata":"Q610492","brand:wikipedia":"en:Spar (retailer)",name:"Spar Express",shop:"convenience"}},"shop/convenience|Speedway":{nomatch:["amenity/fuel|Speedway"],tags:{brand:"Speedway","brand:wikidata":"Q7575683","brand:wikipedia":"en:Speedway LLC",name:"Speedway",shop:"convenience"}},"shop/convenience|Społem":{nomatch:["shop/supermarket|Społem"],tags:{brand:"Społem","brand:wikidata":"Q11826043","brand:wikipedia":"pl:Powszechna Spółdzielnia Spożywców „Społem”",name:"Społem",shop:"convenience"}},"shop/convenience|Star Mart":{tags:{brand:"Star Mart","brand:wikidata":"Q61994857",name:"Star Mart",shop:"convenience"}},"shop/convenience|Stewart's":{nomatch:["amenity/fuel|Stewart's"],tags:{brand:"Stewart's",name:"Stewart's",shop:"convenience"}},"shop/convenience|Stripes":{countryCodes:["cl","us"],tags:{brand:"Stripes","brand:wikidata":"Q7624135","brand:wikipedia":"en:Stripes Convenience Stores",name:"Stripes",shop:"convenience"}},"shop/convenience|Studenac":{tags:{brand:"Studenac",name:"Studenac",shop:"convenience"}},"shop/convenience|Sunoco":{nomatch:["amenity/fuel|Sunoco"],tags:{brand:"Sunoco",name:"Sunoco",shop:"convenience"}},"shop/convenience|Supérette":{tags:{brand:"Supérette",name:"Supérette",shop:"convenience"}},"shop/convenience|Słoneczko":{countryCodes:["pl"],tags:{brand:"Słoneczko",name:"Słoneczko",shop:"convenience"}},"shop/convenience|Tesco":{nomatch:["amenity/fuel|Tesco","shop/convenience|Tesco Express"],tags:{brand:"Tesco","brand:wikidata":"Q487494","brand:wikipedia":"en:Tesco",name:"Tesco",shop:"convenience"}},"shop/convenience|Tesco Express":{nomatch:["amenity/fuel|Tesco"],tags:{brand:"Tesco Express","brand:wikidata":"Q487494","brand:wikipedia":"en:Tesco",name:"Tesco Express",shop:"convenience"}},"shop/convenience|Tesco Lotus Express":{countryCodes:["th"],tags:{brand:"Tesco Lotus Express",name:"Tesco Lotus Express",shop:"convenience"}},"shop/convenience|Texaco":{nomatch:["amenity/fuel|Texaco"],tags:{brand:"Texaco",name:"Texaco",shop:"convenience"}},"shop/convenience|The Co-operative Food~(UK)":{countryCodes:["gb"],matchNames:["coop","coop food","cooperative food","the cooperative"],nomatch:["amenity/fuel|Co-op~(Canada)","shop/convenience|Co-op~(Canada)","shop/convenience|Coop~(Schweiz)","shop/supermarket|Co-op~(Canada)","shop/supermarket|Coop~(Schweiz)","shop/supermarket|The Co-operative Food~(UK)"],tags:{brand:"The Co-operative Food","brand:wikidata":"Q3277439","brand:wikipedia":"en:Co-op Food",name:"The Co-operative Food",shop:"convenience"}},"shop/convenience|Tiendita":{countryCodes:["mx"],tags:{brand:"Tiendita",name:"Tiendita",shop:"convenience"}},"shop/convenience|Tiger Mart":{tags:{brand:"Tiger Mart","brand:wikidata":"Q57643977",name:"Tiger Mart",shop:"convenience"}},"shop/convenience|Total":{nomatch:["amenity/fuel|Total"],tags:{brand:"Total",name:"Total",shop:"convenience"}},"shop/convenience|Turkey Hill":{nomatch:["amenity/fuel|Turkey Hill"],tags:{brand:"Turkey Hill",name:"Turkey Hill",shop:"convenience"}},"shop/convenience|Ultramar":{nomatch:["amenity/fuel|Ultramar"],tags:{brand:"Ultramar",name:"Ultramar",shop:"convenience"}},"shop/convenience|United Dairy Farmers":{countryCodes:["us"],matchTags:["amenity/ice_cream","shop/ice_cream"],nomatch:["amenity/fuel|United Dairy Farmers"],tags:{amenity:"ice_cream",brand:"United Dairy Farmers","brand:wikidata":"Q7887677","brand:wikipedia":"en:United Dairy Farmers",name:"United Dairy Farmers",shop:"convenience",short_name:"UDF"}},"shop/convenience|Utile":{countryCodes:["fr"],matchTags:["shop/supermarket"],nomatch:["amenity/fuel|Super U","shop/supermarket|Hyper U","shop/supermarket|Super U","shop/supermarket|U Express"],tags:{brand:"Utile","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Utile",shop:"convenience"}},"shop/convenience|Valero":{nomatch:["amenity/fuel|Valero"],tags:{brand:"Valero",name:"Valero",shop:"convenience"}},"shop/convenience|VinMart+":{countryCodes:["vn"],nomatch:["shop/supermarket|VinMart"],tags:{brand:"VinMart","brand:wikidata":"Q60245505","brand:wikipedia":"vi:VinMart",name:"VinMart+",shop:"convenience"}},"shop/convenience|Vival":{countryCodes:["fr","pe"],matchTags:["shop/supermarket"],tags:{brand:"Vival","brand:wikidata":"Q7937525","brand:wikipedia":"en:Vival (shop)",name:"Vival",shop:"convenience"}},"shop/convenience|Volg":{tags:{brand:"Volg",name:"Volg",shop:"convenience"}},"shop/convenience|Wawa":{nomatch:["amenity/fuel|Wawa"],tags:{brand:"Wawa","brand:wikidata":"Q5936320","brand:wikipedia":"en:Wawa (company)",name:"Wawa",shop:"convenience"}},"shop/convenience|Weltladen":{countryCodes:["at","ch","de"],tags:{brand:"Weltladen","brand:wikidata":"Q1640782","brand:wikipedia":"de:Weltladen",name:"Weltladen",shop:"convenience"}},"shop/convenience|Woolworths Petrol":{countryCodes:["au"],nomatch:["amenity/fuel|Woolworths Petrol"],tags:{brand:"Caltex","brand:wikidata":"Q5023980","brand:wikipedia":"en:Caltex Woolworths",name:"Woolworths Petrol",shop:"convenience"}},"shop/convenience|abc~(Poland)":{countryCodes:["pl"],matchTags:["shop/supermarket"],nomatch:["amenity/fuel|ABC"],tags:{brand:"abc","brand:wikidata":"Q11683985","brand:wikipedia":"pl:Abc (sieć handlowa)",name:"abc",shop:"convenience"}},"shop/convenience|ampm":{tags:{brand:"ampm","brand:wikidata":"Q306960","brand:wikipedia":"en:Ampm",name:"ampm",shop:"convenience"}},"shop/convenience|miniピアゴ":{countryCodes:["jp"],matchNames:["ミニピアゴ"],tags:{brand:"miniピアゴ","brand:en":"mini Piago","brand:ja":"miniピアゴ","brand:wikidata":"Q11188499","brand:wikipedia":"ja:Miniピアゴ",name:"miniピアゴ","name:en":"mini Piago","name:ja":"miniピアゴ",shop:"convenience"}},"shop/convenience|Żabka":{countryCodes:["pl"],tags:{brand:"Żabka","brand:wikidata":"Q2589061","brand:wikipedia":"pl:Żabka (sieć sklepów)",name:"Żabka",shop:"convenience"}},"shop/convenience|АВ Daily":{countryCodes:["ru"],tags:{brand:"АВ Daily",name:"АВ Daily",shop:"convenience"}},"shop/convenience|АТБ":{tags:{brand:"АТБ",name:"АТБ",shop:"convenience"}},"shop/convenience|Абсолют":{tags:{brand:"Абсолют",name:"Абсолют",shop:"convenience"}},"shop/convenience|Авоська":{tags:{brand:"Авоська",name:"Авоська",shop:"convenience"}},"shop/convenience|Агрокомплекс":{countryCodes:["ru"],tags:{brand:"Агрокомплекс",name:"Агрокомплекс",shop:"convenience"}},"shop/convenience|Альянс":{countryCodes:["by","kg","ru","ua"],tags:{brand:"Альянс",name:"Альянс",shop:"convenience"}},"shop/convenience|Апельсин":{countryCodes:["by","kg","kz","ru","ua"],tags:{brand:"Апельсин",name:"Апельсин",shop:"convenience"}},"shop/convenience|Ассорти":{countryCodes:["by","kg","kz","ru","ua"],tags:{brand:"Ассорти",name:"Ассорти",shop:"convenience"}},"shop/convenience|Березка":{countryCodes:["by","kz","ru","ua"],tags:{brand:"Березка",name:"Березка",shop:"convenience"}},"shop/convenience|Береке":{countryCodes:["kg","kz"],tags:{brand:"Береке",name:"Береке",shop:"convenience"}},"shop/convenience|Берёзка":{tags:{brand:"Берёзка",name:"Берёзка",shop:"convenience"}},"shop/convenience|Бриз":{countryCodes:["by","kz","ru","ua"],tags:{brand:"Бриз",name:"Бриз",shop:"convenience"}},"shop/convenience|Валентина":{countryCodes:["by","kz","ru","ua"],tags:{brand:"Валентина",name:"Валентина",shop:"convenience"}},"shop/convenience|Везунчик":{countryCodes:["ru","ua"],tags:{brand:"Везунчик",name:"Везунчик",shop:"convenience"}},"shop/convenience|Верный":{tags:{brand:"Верный",name:"Верный",shop:"convenience"}},"shop/convenience|ВкусВилл":{countryCodes:["ru"],tags:{brand:"ВкусВилл","brand:wikidata":"Q57271676","brand:wikipedia":"ru:Вкусвилл",name:"ВкусВилл",shop:"convenience"}},"shop/convenience|Гастроном":{tags:{brand:"Гастроном",name:"Гастроном",shop:"convenience"}},"shop/convenience|Гермес":{tags:{brand:"Гермес",name:"Гермес",shop:"convenience"}},"shop/convenience|Гроздь":{nomatch:["shop/supermarketk|Гроздь"],tags:{brand:"Гроздь","brand:wikidata":"Q21638412","brand:wikipedia":"ru:Гроздь (сеть магазинов)",name:"Гроздь",shop:"convenience"}},"shop/convenience|Гурман":{tags:{brand:"Гурман",name:"Гурман",shop:"convenience"}},"shop/convenience|Доброном":{countryCodes:["by","ru"],tags:{brand:"Доброном","brand:wikidata":"Q2565040","brand:wikipedia":"be:Eurotorg",name:"Доброном",shop:"convenience"}},"shop/convenience|Добрый":{countryCodes:["by","ru"],tags:{brand:"Добрый",name:"Добрый",shop:"convenience"}},"shop/convenience|Дружба":{countryCodes:["by","ru","ua"],tags:{brand:"Дружба",name:"Дружба",shop:"convenience"}},"shop/convenience|Елена":{tags:{brand:"Елена",name:"Елена",shop:"convenience"}},"shop/convenience|Ермолино":{countryCodes:["ru","ua"],tags:{brand:"Ермолино",name:"Ермолино",shop:"convenience"}},"shop/convenience|КазМунайГаз":{nomatch:["amenity/fuel|КазМунайГаз"],tags:{brand:"КазМунайГаз",name:"КазМунайГаз",shop:"convenience"}},"shop/convenience|Каштан":{countryCodes:["by","ru","ua"],tags:{brand:"Каштан",name:"Каштан",shop:"convenience"}},"shop/convenience|Квартал":{tags:{brand:"Квартал",name:"Квартал",shop:"convenience"}},"shop/convenience|Кооператор":{countryCodes:["by","kz","ru","ua"],tags:{brand:"Кооператор",name:"Кооператор",shop:"convenience"}},"shop/convenience|Копеечка":{countryCodes:["by","ru","ua"],tags:{brand:"Копеечка",name:"Копеечка",shop:"convenience"}},"shop/convenience|Копейка":{countryCodes:["by","ru","ua"],tags:{brand:"Копейка","brand:en":"Kopeyka","brand:wikidata":"Q1783878","brand:wikipedia":"en:Kopeyka (supermarket)",name:"Копейка","name:en":"Kopeyka",shop:"convenience"}},"shop/convenience|Корзинка":{countryCodes:["by","kz","ru","ua"],tags:{brand:"Корзинка",name:"Корзинка",shop:"convenience"}},"shop/convenience|Кулинария":{countryCodes:["by","kz","ru","ua"],tags:{brand:"Кулинария",name:"Кулинария",shop:"convenience"}},"shop/convenience|Лакомка":{tags:{brand:"Лакомка",name:"Лакомка",shop:"convenience"}},"shop/convenience|Лукойл":{nomatch:["amenity/fuel|Лукойл"],tags:{brand:"Лукойл",name:"Лукойл",shop:"convenience"}},"shop/convenience|Луч":{countryCodes:["by","kz","ru","ua"],tags:{brand:"Луч",name:"Луч",shop:"convenience"}},"shop/convenience|Любава":{countryCodes:["by","kz","ru","ua"],tags:{brand:"Любава",name:"Любава",shop:"convenience"}},"shop/convenience|Магазин":{tags:{brand:"Магазин",name:"Магазин",shop:"convenience"}},"shop/convenience|Магнит":{matchNames:["магнит у дома"],nomatch:["shop/cosmetics|Магнит Косметик","shop/supermarket|Магнит"],tags:{brand:"Магнит","brand:en":"Magnit","brand:wikidata":"Q940518","brand:wikipedia":"ru:Магнит (сеть магазинов)",name:"Магнит","name:en":"Magnit",shop:"convenience"}},"shop/convenience|Мария-Ра":{countryCodes:["ru"],nomatch:["shop/supermarket|Мария-Ра"],tags:{brand:"Мария-Ра","brand:wikidata":"Q4281631","brand:wikipedia":"ru:Мария-Ра",name:"Мария-Ра",shop:"convenience"}},"shop/convenience|Маяк":{countryCodes:["kz","ru","ua"],tags:{brand:"Маяк",name:"Маяк",shop:"convenience"}},"shop/convenience|Меркурий":{tags:{brand:"Меркурий",name:"Меркурий",shop:"convenience"}},"shop/convenience|Мини маркет":{tags:{brand:"Мини маркет",name:"Мини маркет",shop:"convenience"}},"shop/convenience|Монетка":{tags:{brand:"Монетка",name:"Монетка",shop:"convenience"}},"shop/convenience|Мрія":{countryCodes:["ua"],tags:{brand:"Мрія",name:"Мрія",shop:"convenience"}},"shop/convenience|Ника":{countryCodes:["by","kz","ru","ua"],tags:{brand:"Ника",name:"Ника",shop:"convenience"}},"shop/convenience|Оазис":{tags:{brand:"Оазис",name:"Оазис",shop:"convenience"}},"shop/convenience|Околица":{countryCodes:["by","kz","ru","ua"],tags:{brand:"Околица",name:"Околица",shop:"convenience"}},"shop/convenience|Парус":{countryCodes:["by","kz","ru","ua"],tags:{brand:"Парус",name:"Парус",shop:"convenience"}},"shop/convenience|Пеликан":{countryCodes:["by","ru"],tags:{brand:"Пеликан",name:"Пеликан",shop:"convenience"}},"shop/convenience|Радуга":{tags:{brand:"Радуга",name:"Радуга",shop:"convenience"}},"shop/convenience|Русь":{countryCodes:["kz","ru","ua"],tags:{brand:"Русь",name:"Русь",shop:"convenience"}},"shop/convenience|Сельпо":{countryCodes:["kz","ru"],tags:{brand:"Сельпо","brand:wikidata":"Q4419434","brand:wikipedia":"ru:Сильпо",name:"Сельпо",shop:"convenience"}},"shop/convenience|Сказка":{tags:{brand:"Сказка",name:"Сказка",shop:"convenience"}},"shop/convenience|Солнышко":{countryCodes:["kz","ru","ua"],tags:{brand:"Солнышко",name:"Солнышко",shop:"convenience"}},"shop/convenience|Тройка":{countryCodes:["kz","ru","ua"],tags:{brand:"Тройка",name:"Тройка",shop:"convenience"}},"shop/convenience|У Палыча":{countryCodes:["ru"],tags:{brand:"У Палыча",name:"У Палыча",shop:"convenience"}},"shop/convenience|Удача":{tags:{brand:"Удача",name:"Удача",shop:"convenience"}},"shop/convenience|Фасоль":{countryCodes:["ru","ua"],tags:{brand:"Фасоль",name:"Фасоль",shop:"convenience"}},"shop/convenience|Фортуна":{tags:{brand:"Фортуна",name:"Фортуна",shop:"convenience"}},"shop/convenience|Хуторок":{tags:{brand:"Хуторок",name:"Хуторок",shop:"convenience"}},"shop/convenience|Эдем":{countryCodes:["by","ru","ua"],tags:{brand:"Эдем",name:"Эдем",shop:"convenience"}},"shop/convenience|Юбилейный":{countryCodes:["by","kz","ru"],tags:{brand:"Юбилейный",name:"Юбилейный",shop:"convenience"}},"shop/convenience|Ярче":{countryCodes:["ru"],tags:{brand:"Ярче",name:"Ярче",shop:"convenience"}},"shop/convenience|アンスリー":{countryCodes:["jp"],tags:{brand:"アンスリー","brand:en":"Ansuri","brand:ja":"アンスリー","brand:wikidata":"Q17192555","brand:wikipedia":"ja:アンスリー",name:"アンスリー","name:en":"Ansuri","name:ja":"アンスリー",shop:"convenience"}},"shop/convenience|サンクス":{countryCodes:["jp"],tags:{brand:"サンクス","brand:en":"Sunkus","brand:ja":"サンクス","brand:wikidata":"Q16141064","brand:wikipedia":"ja:サークルKサンクス",name:"サンクス","name:en":"Sunkus","name:ja":"サンクス",shop:"convenience"}},"shop/convenience|サークルK":{countryCodes:["jp"],tags:{brand:"サークルK","brand:en":"Circle K","brand:ja":"サークルK","brand:wikidata":"Q3268010","brand:wikipedia":"en:Circle K",name:"サークルK","name:en":"Circle K","name:ja":"サークルK",shop:"convenience"}},"shop/convenience|スリーエフ":{countryCodes:["jp"],tags:{brand:"スリーエフ","brand:en":"Three F","brand:ja":"スリーエフ","brand:wikidata":"Q11313419","brand:wikipedia":"ja:スリーエフ",name:"スリーエフ","name:en":"Three F","name:ja":"スリーエフ",shop:"convenience"}},"shop/convenience|セイコーマート":{countryCodes:["jp"],tags:{brand:"セイコーマート","brand:en":"Seicomart","brand:ja":"セイコーマート","brand:wikidata":"Q11314123","brand:wikipedia":"ja:セイコーマート",name:"セイコーマート","name:en":"Seicomart","name:ja":"セイコーマート",shop:"convenience"}},"shop/convenience|セブン-イレブン":{countryCodes:["jp"],matchNames:["セブンイレブン(7-11)","セブンイレブン(seven-eleven)"],tags:{brand:"セブン-イレブン","brand:en":"7-Eleven","brand:ja":"セブン-イレブン","brand:wikidata":"Q259340","brand:wikipedia":"en:7-Eleven",name:"セブン-イレブン","name:en":"7-Eleven","name:ja":"セブン-イレブン","official_name:en":"Seven-Eleven",shop:"convenience"}},"shop/convenience|セーブオン":{countryCodes:["jp"],tags:{brand:"セーブオン","brand:en":"Save On","brand:ja":"セーブオン","brand:wikidata":"Q11314868","brand:wikipedia":"ja:セーブオン",name:"セーブオン","name:en":"Save On","name:ja":"セーブオン",shop:"convenience"}},"shop/convenience|デイリーヤマザキ":{countryCodes:["jp"],tags:{brand:"デイリーヤマザキ","brand:en":"Daily Yamazaki","brand:ja":"デイリーヤマザキ","brand:wikidata":"Q5209392","brand:wikipedia":"en:Daily Yamazaki",name:"デイリーヤマザキ","name:en":"Daily Yamazaki","name:ja":"デイリーヤマザキ",shop:"convenience"}},"shop/convenience|ナチュラルローソン":{countryCodes:["jp"],tags:{brand:"ナチュラルローソン","brand:en":"NATURAL LAWSON","brand:ja":"ナチュラルローソン","brand:wikidata":"Q11323850","brand:wikipedia":"ja:ナチュラルローソン",name:"ナチュラルローソン","name:en":"Natural Lawson","name:ja":"ナチュラルローソン",shop:"convenience"}},"shop/convenience|ファミリーマート":{countryCodes:["jp"],tags:{brand:"ファミリーマート","brand:en":"FamilyMart","brand:ja":"ファミリーマート","brand:wikidata":"Q1191685","brand:wikipedia":"en:FamilyMart",name:"ファミリーマート","name:en":"FamilyMart","name:ja":"ファミリーマート",shop:"convenience"}},"shop/convenience|ポプラ":{countryCodes:["jp"],tags:{brand:"ポプラ","brand:en":"Poplar","brand:ja":"ポプラ","brand:wikidata":"Q7229380","brand:wikipedia":"ja:ポプラ (コンビニエンスストア)",name:"ポプラ","name:en":"Poplar","name:ja":"ポプラ",shop:"convenience"}},"shop/convenience|ミニストップ":{countryCodes:["jp"],tags:{brand:"ミニストップ","brand:en":"Ministop","brand:ja":"ミニストップ","brand:wikidata":"Q1038929","brand:wikipedia":"ja:ミニストップ",name:"ミニストップ","name:en":"Ministop","name:ja":"ミニストップ",shop:"convenience"}},"shop/convenience|ヤマザキショップ":{countryCodes:["jp"],tags:{brand:"ヤマザキショップ","brand:ja":"ヤマザキショップ","brand:wikidata":"Q11345131","brand:wikipedia":"ja:ヤマザキショップ",name:"ヤマザキショップ","name:en":"Yamazaki Shop","name:ja":"ヤマザキショップ",shop:"convenience"}},"shop/convenience|ローソン":{countryCodes:["jp"],matchNames:["ローソン"],tags:{brand:"ローソン","brand:en":"LAWSON","brand:ja":"ローソン","brand:wikidata":"Q1557223","brand:wikipedia":"ja:ローソン",name:"ローソン","name:en":"Lawson","name:ja":"ローソン",shop:"convenience"}},"shop/convenience|ローソンストア100":{countryCodes:["jp"],tags:{brand:"ローソンストア100","brand:en":"LAWSON STORE 100","brand:ja":"ローソンストア100","brand:wikidata":"Q11350960","brand:wikipedia":"ja:ローソンストア100",name:"ローソンストア100","name:en":"Lawson Store 100","name:ja":"ローソンストア100",shop:"convenience"}},"shop/convenience|ローソン・スリーエフ":{countryCodes:["jp"],matchNames:["lawson+スリーエフ","ローソン・スリーエフ"],tags:{brand:"ローソン・スリーエフ","brand:en":"LAWSON・Three F","brand:ja":"ローソン・スリーエフ","brand:wikidata":"Q24866804","brand:wikipedia":"ja:ローソン・スリーエフ",name:"ローソン・スリーエフ","name:en":"Lawson・Three F","name:ja":"ローソン・スリーエフ",shop:"convenience"}},"shop/convenience|全家":{countryCodes:["cn","tw"],tags:{brand:"全家","brand:en":"FamilyMart","brand:wikidata":"Q1191685","brand:wikipedia":"en:FamilyMart",name:"全家","name:en":"FamilyMart",shop:"convenience"}},"shop/convenience|全家便利商店":{countryCodes:["tw"],tags:{brand:"全家便利商店","brand:wikidata":"Q10891564","brand:wikipedia":"zh:全家便利商店",name:"全家便利商店",shop:"convenience"}},"shop/convenience|萊爾富":{countryCodes:["tw"],tags:{brand:"萊爾富","brand:wikidata":"Q11326216","brand:wikipedia":"zh:萊爾富",name:"萊爾富",shop:"convenience"}},"shop/convenience|미니스톱":{countryCodes:["kr"],tags:{brand:"미니스톱","brand:ko":"미니스톱",name:"미니스톱","name:ko":"미니스톱",shop:"convenience"}},"shop/convenience|세븐일레븐":{countryCodes:["kr"],tags:{brand:"세븐일레븐","brand:en":"7-Eleven","brand:ko":"세븐일레븐","brand:wikidata":"Q259340","brand:wikipedia":"en:7-Eleven",name:"세븐일레븐","name:en":"7-Eleven","name:ko":"세븐일레븐",shop:"convenience"}},"shop/copyshop|Epicier":{countryCodes:["ma"],tags:{brand:"Epicier",name:"Epicier",shop:"copyshop"}},"shop/copyshop|FedEx Office":{countryCodes:["us"],matchNames:["fedex office print and ship center"],matchTags:["amenity/post_office"],tags:{brand:"FedEx Office","brand:wikidata":"Q474379","brand:wikipedia":"en:FedEx Office",name:"FedEx Office",shop:"copyshop"}},"shop/copyshop|Minuteman Press":{tags:{brand:"Minuteman Press","brand:wikidata":"Q64866081",name:"Minuteman Press",shop:"copyshop"}},"shop/copyshop|Photocopie":{tags:{brand:"Photocopie",name:"Photocopie",shop:"copyshop"}},"shop/copyshop|Sir Speedy":{countryCodes:["us"],matchTags:["amenity/post_office"],tags:{brand:"Sir Speedy","brand:wikidata":"Q17088225","brand:wikipedia":"en:Sir Speedy",name:"Sir Speedy",shop:"copyshop"}},"shop/cosmetics|Aveda":{countryCodes:["us"],tags:{brand:"Aveda","brand:wikidata":"Q4827965","brand:wikipedia":"en:Aveda",name:"Aveda",shop:"cosmetics"}},"shop/cosmetics|Bath & Body Works":{tags:{brand:"Bath & Body Works","brand:wikidata":"Q810773","brand:wikipedia":"en:Bath & Body Works",name:"Bath & Body Works",shop:"cosmetics"}},"shop/cosmetics|Eva":{countryCodes:["ru","ua"],tags:{brand:"Eva",name:"Eva",shop:"cosmetics"}},"shop/cosmetics|KIKO Milano":{countryCodes:["be","fr","gb","nl"],matchNames:["kiko"],tags:{brand:"KIKO Milano","brand:wikidata":"Q3812045","brand:wikipedia":"it:KIKO",name:"KIKO Milano",shop:"cosmetics"}},"shop/cosmetics|Kiehl's":{countryCodes:["ca","us"],matchNames:["kiehl's since 1851"],tags:{brand:"Kiehl's","brand:wikidata":"Q3196447","brand:wikipedia":"en:Kiehl's",name:"Kiehl's",shop:"cosmetics"}},"shop/cosmetics|L'Occitane":{matchNames:["l'occitane en provence"],tags:{brand:"L'Occitane","brand:wikidata":"Q1880676","brand:wikipedia":"en:L'Occitane en Provence",name:"L'Occitane",shop:"cosmetics"}},"shop/cosmetics|Lush":{tags:{brand:"Lush","brand:wikidata":"Q1585448","brand:wikipedia":"en:Lush (company)",name:"Lush",shop:"cosmetics"}},"shop/cosmetics|MAC Cosmetics":{countryCodes:["ca","de","us"],tags:{brand:"MAC Cosmetics","brand:wikidata":"Q2624442","brand:wikipedia":"en:MAC Cosmetics",name:"MAC Cosmetics",shop:"cosmetics",short_name:"M·A·C"}},"shop/cosmetics|Mixit":{countryCodes:["by","kz","ru"],tags:{brand:"Mixit",name:"Mixit",shop:"cosmetics"}},"shop/cosmetics|Nocibé":{countryCodes:["fr"],tags:{brand:"Nocibé","brand:wikidata":"Q3342592","brand:wikipedia":"fr:Nocibé",name:"Nocibé",shop:"cosmetics"}},"shop/cosmetics|Origins":{countryCodes:["us"],tags:{brand:"Origins","brand:wikidata":"Q6643229","brand:wikipedia":"en:Origins (cosmetics)",name:"Origins",shop:"cosmetics"}},"shop/cosmetics|Rituals":{countryCodes:["be","ch","de","es","gb","nl","se"],tags:{brand:"Rituals",name:"Rituals",shop:"cosmetics"}},"shop/cosmetics|Saje":{countryCodes:["ca","us"],tags:{brand:"Saje","brand:wikidata":"Q44631749","brand:wikipedia":"en:Saje Natural Wellness",name:"Saje",shop:"cosmetics"}},"shop/cosmetics|Sephora":{matchTags:["shop/perfumery"],tags:{brand:"Sephora","brand:wikidata":"Q2408041","brand:wikipedia":"en:Sephora",name:"Sephora",shop:"cosmetics"}},"shop/cosmetics|The Body Shop":{matchTags:["shop/chemist"],tags:{brand:"The Body Shop","brand:wikidata":"Q837851","brand:wikipedia":"en:The Body Shop",name:"The Body Shop",shop:"cosmetics"}},"shop/cosmetics|Ulta Beauty":{countryCodes:["us"],matchNames:["ulta"],tags:{brand:"Ulta Beauty","brand:wikidata":"Q7880076","brand:wikipedia":"en:Ulta Beauty",name:"Ulta Beauty",shop:"cosmetics"}},"shop/cosmetics|Vente de Cosmétique":{countryCodes:["ci"],tags:{brand:"Vente de Cosmétique",name:"Vente de Cosmétique",shop:"cosmetics"}},"shop/cosmetics|bareMinerals":{countryCodes:["us"],tags:{brand:"bareMinerals",name:"bareMinerals",shop:"cosmetics"}},"shop/cosmetics|Л'Этуаль":{countryCodes:["ru"],tags:{brand:"Л'Этуаль","brand:wikidata":"Q18400706","brand:wikipedia":"ru:Л’Этуаль",name:"Л'Этуаль",shop:"cosmetics"}},"shop/cosmetics|Магнит Косметик":{countryCodes:["ru"],matchTags:["shop/chemist"],nomatch:["shop/convenience|Магнит","shop/supermarket|Магнит"],tags:{brand:"Магнит Косметик","brand:en":"Magnit Cosmetics","brand:wikidata":"Q940518","brand:wikipedia":"ru:Магнит (сеть магазинов)",name:"Магнит Косметик","name:en":"Magnit Cosmetics",shop:"cosmetics"}},"shop/cosmetics|Подружка":{countryCodes:["ru","ua"],tags:{brand:"Подружка",name:"Подружка",shop:"cosmetics"}},"shop/cosmetics|Чистый дом":{countryCodes:["ru","ua"],tags:{brand:"Чистый дом",name:"Чистый дом",shop:"cosmetics"}},"shop/country_store|Atwoods":{countryCodes:["us"],tags:{brand:"Atwoods","brand:wikidata":"Q4818874","brand:wikipedia":"en:Atwoods",name:"Atwoods",shop:"country_store"}},"shop/country_store|Blain's Farm & Fleet":{countryCodes:["us"],matchTags:["shop/department_store"],tags:{brand:"Blain's Farm & Fleet","brand:wikidata":"Q4923906","brand:wikipedia":"en:Blain's Farm & Fleet",name:"Blain's Farm & Fleet",shop:"country_store"}},"shop/country_store|Bomgaars":{countryCodes:["us"],tags:{brand:"Bomgaars","brand:wikidata":"Q22059070","brand:wikipedia":"en:Bomgaars",name:"Bomgaars",shop:"country_store"}},"shop/country_store|Fleet Farm":{countryCodes:["us"],matchNames:["mills fleet farm"],tags:{brand:"Fleet Farm","brand:wikidata":"Q6859973","brand:wikipedia":"en:Fleet Farm",name:"Fleet Farm",shop:"country_store"}},"shop/country_store|Grange Co-op":{countryCodes:["us"],tags:{brand:"Grange Co-op","brand:wikidata":"Q5595639","brand:wikipedia":"en:Grange Cooperative",name:"Grange Co-op",shop:"country_store"}},"shop/country_store|Home of Economy":{countryCodes:["us"],tags:{brand:"Home of Economy","brand:wikidata":"Q5889100","brand:wikipedia":"en:Home of Economy",name:"Home of Economy",shop:"country_store"}},"shop/country_store|Norbys Farm Fleet":{countryCodes:["us"],tags:{brand:"Norbys Farm Fleet","brand:wikidata":"Q7050461","brand:wikipedia":"en:Norby's Farm Fleet",name:"Norbys Farm Fleet",shop:"country_store"}},"shop/country_store|Orscheln Farm & Home":{countryCodes:["us"],tags:{brand:"Orscheln Farm & Home","brand:wikidata":"Q22060331","brand:wikipedia":"en:Orscheln Farm & Home",name:"Orscheln Farm & Home",shop:"country_store"}},"shop/country_store|Peavey Mart":{countryCodes:["ca"],tags:{brand:"Peavey Mart","brand:wikidata":"Q7158483","brand:wikipedia":"en:Peavey Mart",name:"Peavey Mart",shop:"country_store"}},"shop/country_store|Rural King":{countryCodes:["us"],tags:{brand:"Rural King","brand:wikidata":"Q7380525","brand:wikipedia":"en:Rural King",name:"Rural King",shop:"country_store"}},"shop/country_store|TSC Stores":{countryCodes:["ca"],tags:{brand:"TSC Stores","brand:wikidata":"Q62720230",name:"TSC Stores",shop:"country_store"}},"shop/country_store|Theisen's":{countryCodes:["us"],tags:{brand:"Theisen's","brand:wikidata":"Q7777850","brand:wikipedia":"en:Theisen's",name:"Theisen's",shop:"country_store"}},"shop/country_store|Tractor Supply Company":{countryCodes:["us"],tags:{brand:"Tractor Supply Company","brand:wikidata":"Q15109925","brand:wikipedia":"en:Tractor Supply Company",name:"Tractor Supply Company",shop:"country_store"}},"shop/country_store|Wynnstay":{countryCodes:["gb"],tags:{brand:"Wynnstay","brand:wikidata":"Q63016351",name:"Wynnstay",shop:"country_store"}},"shop/craft|A.C. Moore":{countryCodes:["us"],tags:{brand:"A.C. Moore","brand:wikidata":"Q4647066","brand:wikipedia":"en:A.C. Moore",name:"A.C. Moore",shop:"craft"}},"shop/craft|Hobby Lobby":{countryCodes:["in","us"],tags:{brand:"Hobby Lobby","brand:wikidata":"Q5874938","brand:wikipedia":"en:Hobby Lobby",name:"Hobby Lobby",shop:"craft"}},"shop/craft|Hobbycraft":{countryCodes:["gb"],matchTags:["shop/art"],tags:{brand:"Hobbycraft","brand:wikidata":"Q16984508","brand:wikipedia":"en:Hobbycraft",name:"Hobbycraft",shop:"craft"}},"shop/craft|Jo-Ann":{countryCodes:["us"],tags:{brand:"Jo-Ann","brand:wikidata":"Q6203968","brand:wikipedia":"en:Jo-Ann Stores",name:"Jo-Ann",shop:"craft"}},"shop/craft|Michaels":{countryCodes:["ca","us"],tags:{brand:"Michaels","brand:wikidata":"Q6835667","brand:wikipedia":"en:Michaels",name:"Michaels",shop:"craft"}},"shop/deli|ほっともっと":{countryCodes:["jp"],nomatch:["amenity/fast_food|ほっともっと"],tags:{brand:"ほっともっと","brand:en":"Hotto Motto","brand:ja":"ほっともっと","brand:wikidata":"Q10850949","brand:wikipedia":"ja:ほっともっと",name:"ほっともっと","name:en":"Hotto Motto","name:ja":"ほっともっと",shop:"deli"}},"shop/deli|京樽":{countryCodes:["jp"],matchTags:["amenity/fast_food"],tags:{brand:"京樽","brand:en":"Kyotaru","brand:ja":"京樽","brand:wikidata":"Q11374503","brand:wikipedia":"ja:京樽",name:"京樽","name:en":"Kyotaru","name:ja":"京樽",shop:"deli"}},"shop/department_store|Barneys New York":{countryCodes:["us"],matchNames:["barneys"],tags:{brand:"Barneys New York","brand:wikidata":"Q59465","brand:wikipedia":"en:Barneys New York",name:"Barneys New York",shop:"department_store"}},"shop/department_store|Belk":{countryCodes:["us"],tags:{brand:"Belk","brand:wikidata":"Q127428","brand:wikipedia":"en:Belk",name:"Belk",shop:"department_store"}},"shop/department_store|Bi-Mart":{countryCodes:["us"],tags:{brand:"Bi-Mart","brand:wikidata":"Q4902331","brand:wikipedia":"en:Bi-Mart",name:"Bi-Mart",shop:"department_store"}},"shop/department_store|Big Lots":{countryCodes:["us"],matchTags:["shop/variety_store"],tags:{brand:"Big Lots","brand:wikidata":"Q4905973","brand:wikipedia":"en:Big Lots",name:"Big Lots",shop:"department_store"}},"shop/department_store|Big W":{countryCodes:["au"],tags:{brand:"Big W","brand:wikidata":"Q4906646","brand:wikipedia":"en:Big W",name:"Big W",shop:"department_store"}},"shop/department_store|Bloomingdale's":{countryCodes:["us"],tags:{brand:"Bloomingdale's","brand:wikidata":"Q283383","brand:wikipedia":"en:Bloomingdale's",name:"Bloomingdale's",shop:"department_store"}},"shop/department_store|Canadian Tire":{countryCodes:["ca"],matchTags:["shop/doityourself"],nomatch:["amenity/fuel|Canadian Tire"],tags:{brand:"Canadian Tire","brand:wikidata":"Q1032400","brand:wikipedia":"en:Canadian Tire",name:"Canadian Tire",shop:"department_store"}},"shop/department_store|Casas Bahia":{countryCodes:["br"],tags:{brand:"Casas Bahia","brand:wikidata":"Q5048048","brand:wikipedia":"en:Casas Bahia",name:"Casas Bahia",shop:"department_store"}},"shop/department_store|Century 21":{countryCodes:["us"],matchNames:["c21"],nomatch:["office/estate_agent|Century 21"],tags:{brand:"Century 21","brand:wikidata":"Q5063125","brand:wikipedia":"en:Century 21 (department store)",name:"Century 21",shop:"department_store"}},"shop/department_store|Coppel":{tags:{brand:"Coppel","brand:wikidata":"Q2497795","brand:wikipedia":"en:Coppel",name:"Coppel",shop:"department_store"}},"shop/department_store|David Jones":{countryCodes:["au"],tags:{brand:"David Jones","brand:wikidata":"Q5235753","brand:wikipedia":"en:David Jones Limited",name:"David Jones",shop:"department_store"}},"shop/department_store|Debenhams":{countryCodes:["gb","ie"],tags:{brand:"Debenhams","brand:wikidata":"Q1181484","brand:wikipedia":"en:Debenhams",name:"Debenhams",shop:"department_store"}},"shop/department_store|Dillard's":{countryCodes:["us"],tags:{brand:"Dillard's","brand:wikidata":"Q844805","brand:wikipedia":"en:Dillard's",name:"Dillard's",shop:"department_store"}},"shop/department_store|El Corte Inglés":{countryCodes:["es"],tags:{brand:"El Corte Inglés","brand:wikidata":"Q623133","brand:wikipedia":"en:El Corte Inglés",name:"El Corte Inglés",shop:"department_store"}},"shop/department_store|Falabella":{matchNames:["saga falabella"],nomatch:["amenity/bank|Banco Falabella"],tags:{brand:"Falabella","brand:wikidata":"Q5135229","brand:wikipedia":"en:Falabella (retail store)",name:"Falabella",shop:"department_store"}},"shop/department_store|Galeria Kaufhof":{countryCodes:["de"],tags:{brand:"Galeria Kaufhof","brand:wikidata":"Q322598","brand:wikipedia":"en:Galeria Kaufhof",name:"Galeria Kaufhof",shop:"department_store"}},"shop/department_store|Giant Tiger":{countryCodes:["ca"],tags:{brand:"Giant Tiger","brand:wikidata":"Q5558429","brand:wikipedia":"en:Giant Tiger",name:"Giant Tiger",shop:"department_store"}},"shop/department_store|Gordmans":{countryCodes:["us"],tags:{brand:"Gordmans","brand:wikidata":"Q5584725","brand:wikipedia":"en:Gordmans",name:"Gordmans",shop:"department_store"}},"shop/department_store|HEMA":{countryCodes:["be","de","nl"],tags:{brand:"HEMA","brand:wikidata":"Q903805","brand:wikipedia":"en:HEMA (store)",name:"HEMA",shop:"department_store"}},"shop/department_store|Harvey Norman":{countryCodes:["au","nz"],tags:{brand:"Harvey Norman","brand:wikidata":"Q4040441","brand:wikipedia":"en:Harvey Norman",name:"Harvey Norman",shop:"department_store"}},"shop/department_store|Havan":{countryCodes:["br"],tags:{brand:"Havan","brand:wikidata":"Q61968827",name:"Havan",shop:"department_store"}},"shop/department_store|Hudson's Bay":{countryCodes:["ca","nl"],tags:{alt_name:"The Bay",brand:"Hudson's Bay","brand:wikidata":"Q641129","brand:wikipedia":"en:Hudson's Bay (retailer)",name:"Hudson's Bay",shop:"department_store"}},"shop/department_store|JCPenney":{countryCodes:["us"],tags:{brand:"JCPenney","brand:wikidata":"Q920037","brand:wikipedia":"en:J. C. Penney",name:"JCPenney",shop:"department_store"}},"shop/department_store|John Lewis":{countryCodes:["gb"],tags:{brand:"John Lewis","brand:wikidata":"Q1918981","brand:wikipedia":"en:John Lewis & Partners",name:"John Lewis",shop:"department_store"}},"shop/department_store|Karstadt":{countryCodes:["de"],tags:{brand:"Karstadt","brand:wikidata":"Q182910","brand:wikipedia":"en:Karstadt",name:"Karstadt",shop:"department_store"}},"shop/department_store|Kmart~(Australia)":{countryCodes:["au"],matchTags:["shop/supermarket"],nomatch:["shop/department_store|Kmart~(USA)"],tags:{brand:"Kmart","brand:wikidata":"Q6421682","brand:wikipedia":"en:Kmart Australia",name:"Kmart",shop:"department_store"}},"shop/department_store|Kmart~(USA)":{countryCodes:["us"],matchTags:["shop/supermarket"],nomatch:["shop/department_store|Kmart~(Australia)"],tags:{brand:"Kmart","brand:wikidata":"Q1753080","brand:wikipedia":"en:Kmart",name:"Kmart",shop:"department_store"}},"shop/department_store|Kohl's":{countryCodes:["us"],tags:{brand:"Kohl's","brand:wikidata":"Q967265","brand:wikipedia":"en:Kohl's",name:"Kohl's",shop:"department_store"}},"shop/department_store|Lojas Americanas":{countryCodes:["br"],tags:{brand:"Lojas Americanas","brand:wikidata":"Q3064093","brand:wikipedia":"en:Lojas Americanas",name:"Lojas Americanas",shop:"department_store"}},"shop/department_store|Lord & Taylor":{countryCodes:["us"],matchNames:["lord and taylor"],tags:{brand:"Lord & Taylor","brand:wikidata":"Q2749082","brand:wikipedia":"en:Lord & Taylor",name:"Lord & Taylor",shop:"department_store"}},"shop/department_store|Lotte Department Store":{matchNames:["lotte"],tags:{brand:"Lotte Department Store","brand:wikidata":"Q489905","brand:wikipedia":"en:Lotte Department Store",name:"Lotte Department Store",shop:"department_store"}},"shop/department_store|Macy's":{countryCodes:["us"],tags:{brand:"Macy's","brand:wikidata":"Q629269","brand:wikipedia":"en:Macy's",name:"Macy's",shop:"department_store"}},"shop/department_store|Marks & Spencer":{countryCodes:["gb","gr","ie"],matchNames:["M & S","marks and spencer"],tags:{brand:"Marks & Spencer","brand:wikidata":"Q714491","brand:wikipedia":"en:Marks & Spencer",name:"Marks & Spencer",shop:"department_store"}},"shop/department_store|Marshalls":{countryCodes:["ca","us"],tags:{brand:"Marshalls","brand:wikidata":"Q15903261","brand:wikipedia":"en:Marshalls",name:"Marshalls",shop:"department_store"}},"shop/department_store|Muji":{countryCodes:["it"],tags:{brand:"Muji","brand:en":"Muji","brand:ja":"無印良品","brand:wikidata":"Q708789","brand:wikipedia":"en:Muji",name:"Muji","name:en":"Muji","name:ja":"無印良品",shop:"department_store"}},"shop/department_store|Myer":{countryCodes:["au"],tags:{brand:"Myer","brand:wikidata":"Q1110323","brand:wikipedia":"en:Myer",name:"Myer",shop:"department_store"}},"shop/department_store|Neiman Marcus":{countryCodes:["us"],tags:{brand:"Neiman Marcus","brand:wikidata":"Q743497","brand:wikipedia":"en:Neiman Marcus",name:"Neiman Marcus",shop:"department_store"}},"shop/department_store|Nordstrom":{countryCodes:["ca","us"],tags:{brand:"Nordstrom","brand:wikidata":"Q174310","brand:wikipedia":"en:Nordstrom",name:"Nordstrom",shop:"department_store"}},"shop/department_store|Oechsle":{countryCodes:["pe"],tags:{brand:"Oechsle","brand:wikidata":"Q6049096","brand:wikipedia":"es:Oechsle",name:"Oechsle",shop:"department_store"}},"shop/department_store|París":{countryCodes:["cl","pe"],tags:{brand:"París","brand:wikidata":"Q20812805","brand:wikipedia":"en:París (retail store)",name:"París",shop:"department_store"}},"shop/department_store|Printemps":{countryCodes:["ad","cn","fr","jp","sa"],tags:{brand:"Printemps","brand:wikidata":"Q1535260","brand:wikipedia":"fr:Printemps (grands magasins)",name:"Printemps",shop:"department_store"}},"shop/department_store|Ripley":{countryCodes:["cl","pe"],tags:{brand:"Ripley","brand:wikidata":"Q3433040","brand:wikipedia":"en:Ripley S.A.",name:"Ripley",shop:"department_store"}},"shop/department_store|Saks Fifth Avenue":{countryCodes:["ca","us"],tags:{brand:"Saks Fifth Avenue","brand:wikidata":"Q2723882","brand:wikipedia":"en:Saks Fifth Avenue",name:"Saks Fifth Avenue",shop:"department_store"}},"shop/department_store|Saks Off 5th":{countryCodes:["ca","us"],tags:{brand:"Saks Off 5th","brand:wikidata":"Q2723882","brand:wikipedia":"en:Saks Fifth Avenue",name:"Saks Off 5th",shop:"department_store"}},"shop/department_store|Sears":{countryCodes:["mx","us"],tags:{brand:"Sears","brand:wikidata":"Q6499202","brand:wikipedia":"en:Sears",name:"Sears",shop:"department_store"}},"shop/department_store|Shopko":{countryCodes:["us"],tags:{brand:"Shopko","brand:wikidata":"Q7501155","brand:wikipedia":"en:Shopko",name:"Shopko",shop:"department_store"}},"shop/department_store|Stein Mart":{countryCodes:["us"],tags:{brand:"Stein Mart","brand:wikidata":"Q7606770","brand:wikipedia":"en:Stein Mart",name:"Stein Mart",shop:"department_store"}},"shop/department_store|Stockmann":{countryCodes:["fi"],tags:{brand:"Stockmann","brand:wikidata":"Q1543093","brand:wikipedia":"fi:Stockmann",name:"Stockmann",shop:"department_store"}},"shop/department_store|Target~(Australia)":{countryCodes:["au"],matchTags:["shop/supermarket"],nomatch:["shop/department_store|Target~(USA)"],tags:{brand:"Target","brand:wikidata":"Q7685854","brand:wikipedia":"en:Target Australia",name:"Target",shop:"department_store"}},"shop/department_store|Target~(USA)":{countryCodes:["us"],matchNames:["Super Target"],matchTags:["shop/supermarket"],nomatch:["shop/department_store|Target~(Australia)"],tags:{brand:"Target","brand:wikidata":"Q1046951","brand:wikipedia":"en:Target Corporation",name:"Target",shop:"department_store"}},"shop/department_store|The Warehouse":{countryCodes:["nz"],tags:{brand:"The Warehouse","brand:wikidata":"Q3566291","brand:wikipedia":"en:The Warehouse Group",name:"The Warehouse",shop:"department_store"}},"shop/department_store|Walmart":{matchTags:["shop/supermarket"],tags:{brand:"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"en:Walmart",name:"Walmart",shop:"department_store"}},"shop/department_store|Woolworth":{countryCodes:["de"],tags:{brand:"Woolworth","brand:wikidata":"Q183538","brand:wikipedia":"de:Woolworth Deutschland",name:"Woolworth",shop:"department_store"}},"shop/department_store|Åhléns":{countryCodes:["se"],tags:{brand:"Åhléns","brand:wikidata":"Q270851","brand:wikipedia":"sv:Åhléns",name:"Åhléns",shop:"department_store"}},"shop/department_store|Épicerie":{countryCodes:["ma"],tags:{brand:"Épicerie",name:"Épicerie",shop:"department_store"}},"shop/department_store|Евроопт Market":{tags:{brand:"Евроопт Market",name:"Евроопт Market",shop:"department_store"}},"shop/department_store|Евроопт Минимаркет":{tags:{brand:"Евроопт Минимаркет",name:"Евроопт Минимаркет",shop:"department_store"}},"shop/department_store|東急ハンズ":{countryCodes:["jp"],tags:{brand:"東急ハンズ","brand:en":"Tokyu Hands","brand:ja":"東急ハンズ","brand:wikidata":"Q859212","brand:wikipedia":"ja:東急ハンズ",name:"東急ハンズ","name:en":"Tokyu Hands","name:ja":"東急ハンズ",shop:"department_store"}},"shop/department_store|無印良品":{countryCodes:["jp","tw"],tags:{brand:"無印良品","brand:en":"Muji","brand:ja":"無印良品","brand:wikidata":"Q708789","brand:wikipedia":"ja:無印良品",name:"無印良品","name:en":"Muji","name:ja":"無印良品",shop:"department_store"}},"shop/department_store|롯데백화점":{countryCodes:["kr"],tags:{brand:"롯데백화점","brand:ko":"롯데백화점","brand:wikidata":"Q489905","brand:wikipedia":"ko:롯데백화점",name:"롯데백화점","name:en":"Lotte Department Store","name:ko":"롯데백화점",shop:"department_store"}},"shop/doityourself|Ace Hardware":{tags:{brand:"Ace Hardware","brand:wikidata":"Q4672981","brand:wikipedia":"en:Ace Hardware",name:"Ace Hardware",shop:"doityourself"}},"shop/doityourself|B&Q":{tags:{brand:"B&Q","brand:wikidata":"Q707602","brand:wikipedia":"en:B&Q",name:"B&Q",shop:"doityourself"}},"shop/doityourself|Bauhaus":{tags:{brand:"Bauhaus","brand:wikidata":"Q672043","brand:wikipedia":"en:Bauhaus (company)",name:"Bauhaus",shop:"doityourself"}},"shop/doityourself|Biltema":{countryCodes:["dk","fi","no","se"],tags:{brand:"Biltema","brand:wikidata":"Q3355552","brand:wikipedia":"en:Biltema",name:"Biltema",shop:"doityourself"}},"shop/doityourself|Brico":{countryCodes:["be","fr","it"],tags:{brand:"Brico","brand:wikidata":"Q2510786","brand:wikipedia":"en:Brico",name:"Brico",shop:"doityourself"}},"shop/doityourself|Brico Dépôt":{countryCodes:["fr","ro"],tags:{brand:"Brico Dépôt","brand:wikidata":"Q2889702","brand:wikipedia":"en:Brico Dépôt",name:"Brico Dépôt",shop:"doityourself"}},"shop/doityourself|Bricoman":{countryCodes:["fr","it","pl"],tags:{brand:"Bricoman","brand:wikidata":"Q2925142","brand:wikipedia":"it:Bricoman",name:"Bricoman",shop:"doityourself"}},"shop/doityourself|Bricomarché":{countryCodes:["fr","pl","pt"],tags:{brand:"Bricomarché","brand:wikidata":"Q2925147","brand:wikipedia":"en:Bricomarché",name:"Bricomarché",shop:"doityourself"}},"shop/doityourself|Bricorama":{countryCodes:["es","fr"],tags:{brand:"Bricorama","brand:wikidata":"Q2925146","brand:wikipedia":"en:Bricorama",name:"Bricorama",shop:"doityourself"}},"shop/doityourself|Bunnings Warehouse":{countryCodes:["au","nz"],tags:{brand:"Bunnings Warehouse","brand:wikidata":"Q4997829","brand:wikipedia":"en:Bunnings Warehouse",name:"Bunnings Warehouse",shop:"doityourself"}},"shop/doityourself|Castorama":{tags:{brand:"Castorama","brand:wikidata":"Q966971","brand:wikipedia":"en:Castorama",name:"Castorama",shop:"doityourself"}},"shop/doityourself|Chausson Matériaux":{countryCodes:["fr"],tags:{brand:"Chausson Matériaux",name:"Chausson Matériaux",shop:"doityourself"}},"shop/doityourself|Clas Ohlson":{countryCodes:["fi","no","se"],tags:{brand:"Clas Ohlson","brand:wikidata":"Q3356220","brand:wikipedia":"en:Clas Ohlson",name:"Clas Ohlson",shop:"doityourself"}},"shop/doityourself|Easy":{tags:{brand:"Easy","brand:wikidata":"Q5331091","brand:wikipedia":"en:Easy (store)",name:"Easy",shop:"doityourself"}},"shop/doityourself|Gamma":{countryCodes:["be","nl"],tags:{brand:"Gamma","brand:wikidata":"Q2294120","brand:wikipedia":"en:Gamma (store)",name:"Gamma",shop:"doityourself"}},"shop/doityourself|Gedimat":{countryCodes:["fr"],tags:{brand:"Gedimat",name:"Gedimat",shop:"doityourself"}},"shop/doityourself|Globus Baumarkt":{countryCodes:["de","lu"],tags:{brand:"Globus Baumarkt","brand:wikidata":"Q457503","brand:wikipedia":"de:Globus Holding",name:"Globus Baumarkt",shop:"doityourself"}},"shop/doityourself|Hagebaumarkt":{countryCodes:["at","be","ch","de","es","fr","lu","nl"],matchNames:["hagebau"],tags:{brand:"Hagebaumarkt","brand:wikidata":"Q1568279","brand:wikipedia":"de:Hagebau",name:"Hagebaumarkt",shop:"doityourself"}},"shop/doityourself|Hammer":{countryCodes:["de"],tags:{brand:"Hammer","brand:wikidata":"Q52159668","brand:wikipedia":"de:Hammer (Fachmarktkette)",name:"Hammer",shop:"doityourself"}},"shop/doityourself|Hellweg":{countryCodes:["at","de"],tags:{brand:"Hellweg","brand:wikidata":"Q1603084","brand:wikipedia":"de:Hellweg (Baumarkt)",name:"Hellweg",shop:"doityourself"}},"shop/doityourself|Home Building Centre~(Canada)":{countryCodes:["ca"],nomatch:["shop/hardware|Home Hardware Building Centre"],tags:{brand:"Home Hardware","brand:wikidata":"Q3139611","brand:wikipedia":"en:Home Hardware",name:"Home Building Centre",shop:"doityourself"}},"shop/doityourself|Home Hardware Building Centre~(Canada)":{countryCodes:["ca"],matchNames:["home hardware"],nomatch:["shop/hardware|Home Hardware"],tags:{brand:"Home Hardware","brand:wikidata":"Q3139611","brand:wikipedia":"en:Home Hardware",name:"Home Hardware Building Centre",shop:"doityourself"}},"shop/doityourself|Home Timber & Hardware~(Australia)":{countryCodes:["au"],tags:{alt_name:"Home Hardware",brand:"Home Timber & Hardware","brand:wikidata":"Q17006984","brand:wikipedia":"en:Home Timber & Hardware",name:"Home Timber & Hardware",shop:"doityourself",short_name:"Home"}},"shop/doityourself|Homebase":{countryCodes:["gb","ie"],tags:{brand:"Homebase","brand:wikidata":"Q9293447","brand:wikipedia":"en:Homebase",name:"Homebase",shop:"doityourself"}},"shop/doityourself|Hornbach":{tags:{brand:"Hornbach","brand:wikidata":"Q685926","brand:wikipedia":"en:Hornbach (retailer)",name:"Hornbach",shop:"doityourself"}},"shop/doityourself|Hubo":{countryCodes:["be","nl"],tags:{brand:"Hubo","brand:wikidata":"Q3142153","brand:wikipedia":"en:Hubo Belgium",name:"Hubo",shop:"doityourself"}},"shop/doityourself|Jewson":{countryCodes:["gb"],tags:{brand:"Jewson","brand:wikidata":"Q6190226","brand:wikipedia":"en:Jewson",name:"Jewson",shop:"doityourself"}},"shop/doityourself|Karwei":{countryCodes:["nl"],tags:{brand:"Karwei","brand:wikidata":"Q2097480","brand:wikipedia":"en:Karwei",name:"Karwei",shop:"doityourself"}},"shop/doityourself|Leroy Merlin":{tags:{brand:"Leroy Merlin","brand:wikidata":"Q889624","brand:wikipedia":"en:Leroy Merlin",name:"Leroy Merlin",shop:"doityourself"}},"shop/doityourself|Lowe's":{countryCodes:["ca","mx","us"],matchNames:["lowes home improvement"],nomatch:["shop/clothes|Lowes","shop/supermarket|Lowe's Market","shop/supermarket|Lowes Foods"],tags:{brand:"Lowe's","brand:wikidata":"Q1373493","brand:wikipedia":"en:Lowe's",name:"Lowe's",shop:"doityourself"}},"shop/doityourself|Menards":{countryCodes:["us"],tags:{brand:"Menards","brand:wikidata":"Q1639897","brand:wikipedia":"en:Menards",name:"Menards",shop:"doityourself"}},"shop/doityourself|Mitre 10":{countryCodes:["au"],tags:{brand:"Mitre 10","brand:wikidata":"Q6882393","brand:wikipedia":"en:Mitre 10",name:"Mitre 10",shop:"doityourself"}},"shop/doityourself|Mr.Bricolage":{countryCodes:["be","fr"],tags:{brand:"Mr.Bricolage","brand:wikidata":"Q3141657","brand:wikipedia":"fr:Mr Bricolage",name:"Mr.Bricolage",shop:"doityourself"}},"shop/doityourself|OBI":{tags:{brand:"OBI","brand:wikidata":"Q300518","brand:wikipedia":"en:Obi (store)",name:"OBI",shop:"doityourself"}},"shop/doityourself|Point P":{countryCodes:["fr"],tags:{brand:"Point P",name:"Point P",shop:"doityourself"}},"shop/doityourself|Praktiker":{countryCodes:["bg","gr","hu","ro"],tags:{brand:"Praktiker","brand:wikidata":"Q680214","brand:wikipedia":"en:Praktiker",name:"Praktiker",shop:"doityourself"}},"shop/doityourself|Praxis":{countryCodes:["nl"],tags:{brand:"Praxis","brand:wikidata":"Q2741995","brand:wikipedia":"nl:Praxis (winkel)",name:"Praxis",shop:"doityourself"}},"shop/doityourself|Promart":{countryCodes:["pe"],tags:{brand:"Promart","brand:wikidata":"Q17626095","brand:wikipedia":"en:Promart",name:"Promart",shop:"doityourself"}},"shop/doityourself|Rona":{countryCodes:["ca"],tags:{brand:"Rona","brand:wikidata":"Q3415283","brand:wikipedia":"en:Rona, Inc.",name:"Rona",shop:"doityourself"}},"shop/doityourself|Screwfix":{countryCodes:["de","gb"],tags:{brand:"Screwfix","brand:wikidata":"Q7439115","brand:wikipedia":"en:Screwfix",name:"Screwfix",shop:"doityourself"}},"shop/doityourself|Sodimac":{matchNames:["sodimac constructor"],tags:{brand:"Sodimac","brand:wikidata":"Q7553274","brand:wikipedia":"es:Sodimac",name:"Sodimac",shop:"doityourself"}},"shop/doityourself|Sonderpreis Baumarkt":{countryCodes:["de"],tags:{brand:"Sonderpreis Baumarkt",name:"Sonderpreis Baumarkt",shop:"doityourself"}},"shop/doityourself|Tekzen":{countryCodes:["tr"],tags:{brand:"Tekzen","brand:wikidata":"Q25475379","brand:wikipedia":"tr:Tekzen",name:"Tekzen",shop:"doityourself"}},"shop/doityourself|The Home Depot":{countryCodes:["ca","mx","us"],tags:{alt_name:"Home Depot",brand:"The Home Depot","brand:wikidata":"Q864407","brand:wikipedia":"en:The Home Depot",name:"The Home Depot",shop:"doityourself"}},"shop/doityourself|Toom Baumarkt":{countryCodes:["de"],matchNames:["toom"],tags:{brand:"Toom Baumarkt","brand:wikidata":"Q2442970","brand:wikipedia":"de:Toom Baumarkt",name:"Toom Baumarkt",shop:"doityourself"}},"shop/doityourself|Travis Perkins":{countryCodes:["gb"],tags:{brand:"Travis Perkins","brand:wikidata":"Q2450664","brand:wikipedia":"en:Travis Perkins",name:"Travis Perkins",shop:"doityourself"}},"shop/doityourself|Weldom":{countryCodes:["fr"],tags:{brand:"Weldom","brand:wikidata":"Q16683226","brand:wikipedia":"fr:Weldom",name:"Weldom",shop:"doityourself"}},"shop/doityourself|Wickes":{countryCodes:["gb"],tags:{brand:"Wickes","brand:wikidata":"Q7998350","brand:wikipedia":"en:Wickes",name:"Wickes",shop:"doityourself"}},"shop/doityourself|jem & fix":{countryCodes:["dk"],tags:{brand:"jem & fix","brand:wikidata":"Q12319200","brand:wikipedia":"da:Jem & fix",name:"jem & fix",shop:"doityourself"}},"shop/doityourself|Леруа Мерлен":{countryCodes:["ru","ua"],tags:{brand:"Леруа Мерлен","brand:en":"Leroy Merlin","brand:wikidata":"Q889624","brand:wikipedia":"en:Leroy Merlin",name:"Леруа Мерлен","name:en":"Leroy Merlin",shop:"doityourself"}},"shop/doityourself|Мастер":{countryCodes:["by","kz","ru","ua"],tags:{brand:"Мастер",name:"Мастер",shop:"doityourself"}},"shop/doityourself|カインズホーム":{countryCodes:["jp"],tags:{brand:"カインズホーム","brand:en":"Cainz Home","brand:ja":"カインズホーム","brand:wikidata":"Q11293852","brand:wikipedia":"ja:カインズ",name:"カインズホーム","name:en":"Cainz Home","name:ja":"カインズホーム",shop:"doityourself"}},"shop/doityourself|コメリ":{countryCodes:["jp"],tags:{brand:"コメリ","brand:ja":"コメリ","brand:wikidata":"Q11302690","brand:wikipedia":"ja:コメリ",name:"コメリ","name:en":"Komeri","name:ja":"コメリ",shop:"doityourself"}},"shop/doityourself|コーナン":{countryCodes:["jp"],tags:{brand:"コーナン","brand:ja":"コーナン","brand:wikidata":"Q11303403","brand:wikipedia":"ja:コーナン",name:"コーナン","name:en":"Kohnan","name:ja":"コーナン",shop:"doityourself"}},"shop/doityourself|ナフコ":{countryCodes:["jp"],tags:{brand:"ナフコ","brand:ja":"ナフコ",name:"ナフコ","name:ja":"ナフコ",shop:"doityourself"}},"shop/doors|Юркас":{countryCodes:["by"],tags:{brand:"Юркас",name:"Юркас",shop:"doors"}},"shop/dry_cleaning|5àsec":{tags:{brand:"5àsec","brand:wikidata":"Q2817899","brand:wikipedia":"fr:5àsec",name:"5àsec",shop:"dry_cleaning"}},"shop/dry_cleaning|Martinizing Dry Cleaning":{tags:{brand:"Martinizing Dry Cleaning","brand:wikidata":"Q6777169","brand:wikipedia":"en:Martinizing Dry Cleaning",name:"Martinizing Dry Cleaning",shop:"dry_cleaning"}},"shop/dry_cleaning|Диана":{countryCodes:["ru"],tags:{brand:"Диана","brand:wikidata":"Q62105088",name:"Диана",shop:"dry_cleaning"}},"shop/dry_cleaning|タカケンサンシャイン":{countryCodes:["jp"],matchNames:["タカケンクリーング"],tags:{brand:"タカケンサンシャイン","brand:en":"Takaken Sunshine","brand:ja":"タカケンサンシャイン","brand:wikidata":"Q11315914","brand:wikipedia":"ja:タカケンサンシャイン",name:"タカケンサンシャイン","name:en":"Takaken Sunshine","name:ja":"タカケンサンシャイン",shop:"dry_cleaning"}},"shop/dry_cleaning|ホワイト急便":{countryCodes:["jp"],tags:{brand:"ホワイト急便","brand:en":"White Kyuubin","brand:ja":"ホワイト急便","brand:wikidata":"Q11505557","brand:wikipedia":"ja:日本さわやかグループ",name:"ホワイト急便","name:en":"White Kyuubin","name:ja":"ホワイト急便",shop:"dry_cleaning"}},"shop/dry_cleaning|白洋舎":{countryCodes:["jp"],tags:{brand:"白洋舎","brand:en":"Hakuyosha","brand:wikidata":"Q11579995","brand:wikipedia":"ja:白洋舎",name:"白洋舎","name:en":"Hakuyosha",shop:"dry_cleaning"}},"shop/electronics|Apple Store":{nomatch:["amenity/bank|Apple Bank"],tags:{brand:"Apple Store","brand:wikidata":"Q421253","brand:wikipedia":"en:Apple Store",name:"Apple Store",shop:"electronics"}},"shop/electronics|BCC":{countryCodes:["nl"],nomatch:["amenity/bank|Bcc"],tags:{brand:"BCC",name:"BCC",shop:"electronics"}},"shop/electronics|Batteries Plus Bulbs":{countryCodes:["us"],matchNames:["batteries plus"],tags:{brand:"Batteries Plus Bulbs","brand:wikidata":"Q17005157","brand:wikipedia":"en:Batteries Plus Bulbs",name:"Batteries Plus Bulbs",shop:"electronics"}},"shop/electronics|Best Buy":{tags:{brand:"Best Buy","brand:wikidata":"Q533415","brand:wikipedia":"en:Best Buy",name:"Best Buy",shop:"electronics"}},"shop/electronics|Boulanger":{countryCodes:["fr"],tags:{brand:"Boulanger","brand:wikidata":"Q2921695","brand:wikipedia":"fr:Boulanger (entreprise)",name:"Boulanger",shop:"electronics"}},"shop/electronics|CeX":{countryCodes:["au","es","gb","ie","in","it","mx","nl","pl","pt"],tags:{brand:"CeX","brand:wikidata":"Q5055676","brand:wikipedia":"en:CeX (company)",name:"CeX",shop:"electronics"}},"shop/electronics|Currys":{countryCodes:["gb","ie"],tags:{brand:"Currys","brand:wikidata":"Q3246464","brand:wikipedia":"en:Currys",name:"Currys",shop:"electronics"}},"shop/electronics|Currys PC World":{countryCodes:["gb","ie"],tags:{brand:"Currys PC World","brand:wikidata":"Q7118727","brand:wikipedia":"en:PC World (retailer)",name:"Currys PC World",shop:"electronics"}},"shop/electronics|Darty":{countryCodes:["fr"],tags:{brand:"Darty","brand:wikidata":"Q3117381","brand:wikipedia":"en:Groupe Fnac Darty",name:"Darty",shop:"electronics"}},"shop/electronics|Elektra":{countryCodes:["gt","hn","pa","pe","sv"],tags:{brand:"Elektra","brand:wikidata":"Q1142753","brand:wikipedia":"es:Grupo Elektra",name:"Elektra",shop:"electronics"}},"shop/electronics|Elgiganten":{countryCodes:["dk","se"],tags:{brand:"Elgiganten","brand:wikidata":"Q17050121","brand:wikipedia":"en:Elgiganten",name:"Elgiganten",shop:"electronics"}},"shop/electronics|Euronics":{tags:{brand:"Euronics","brand:wikidata":"Q184860","brand:wikipedia":"en:Euronics",name:"Euronics",shop:"electronics"}},"shop/electronics|Expert":{tags:{brand:"Expert","brand:wikidata":"Q680990","brand:wikipedia":"en:Expert (company)",name:"Expert",shop:"electronics"}},"shop/electronics|Gigantti":{countryCodes:["fi"],tags:{brand:"Gigantti","brand:wikidata":"Q42512186","brand:wikipedia":"fi:Gigantti (tavarataloketju)",name:"Gigantti",shop:"electronics"}},"shop/electronics|Hartlauer":{countryCodes:["at"],tags:{brand:"Hartlauer","brand:wikidata":"Q1587223","brand:wikipedia":"de:Hartlauer",name:"Hartlauer",shop:"electronics"}},"shop/electronics|Interdiscount":{countryCodes:["ch"],tags:{brand:"Interdiscount","brand:wikidata":"Q1665980","brand:wikipedia":"de:Interdiscount",name:"Interdiscount",shop:"electronics"}},"shop/electronics|JB Hi-Fi":{countryCodes:["au","nz"],tags:{brand:"JB Hi-Fi","brand:wikidata":"Q3310113","brand:wikipedia":"en:JB Hi-Fi",name:"JB Hi-Fi",shop:"electronics"}},"shop/electronics|Jaycar":{countryCodes:["au","nz"],tags:{brand:"Jaycar","brand:wikidata":"Q6167713","brand:wikipedia":"en:Jaycar",name:"Jaycar",shop:"electronics"}},"shop/electronics|Kjell & Company":{countryCodes:["no","se"],matchNames:["kjell och company"],tags:{brand:"Kjell & Company","brand:wikidata":"Q6419332","brand:wikipedia":"en:Kjell & Company",name:"Kjell & Company",shop:"electronics"}},"shop/electronics|Komputronik":{countryCodes:["pl"],tags:{brand:"Komputronik","brand:wikidata":"Q11742085","brand:wikipedia":"pl:Komputronik",name:"Komputronik",shop:"electronics"}},"shop/electronics|La Curacao":{tags:{brand:"La Curacao","brand:wikidata":"Q5194599","brand:wikipedia":"en:Curacao (retail store)",name:"La Curacao",shop:"electronics"}},"shop/electronics|Maplin":{countryCodes:["gb"],tags:{brand:"Maplin","brand:wikidata":"Q6754124","brand:wikipedia":"en:Maplin (retailer)",name:"Maplin",shop:"electronics"}},"shop/electronics|Media Expert":{countryCodes:["pl"],tags:{brand:"Media Expert","brand:wikidata":"Q11776794","brand:wikipedia":"pl:Media Expert",name:"Media Expert",shop:"electronics"}},"shop/electronics|Media Markt":{tags:{brand:"Media Markt","brand:wikidata":"Q2381223","brand:wikipedia":"en:Media Markt",name:"Media Markt",shop:"electronics"}},"shop/electronics|Medimax":{countryCodes:["de"],tags:{brand:"Medimax","brand:wikidata":"Q62872450",name:"Medimax",shop:"electronics"}},"shop/electronics|Musimundo":{countryCodes:["ar"],tags:{brand:"Musimundo","brand:wikidata":"Q6034719","brand:wikipedia":"es:Musimundo",name:"Musimundo",shop:"electronics"}},"shop/electronics|Neonet":{countryCodes:["pl"],tags:{brand:"Neonet","brand:wikidata":"Q11790622","brand:wikipedia":"pl:Neonet",name:"Neonet",shop:"electronics"}},"shop/electronics|Power":{countryCodes:["dk","fi","no"],tags:{brand:"Power",name:"Power",shop:"electronics"}},"shop/electronics|RTV Euro AGD":{countryCodes:["pl"],tags:{brand:"RTV Euro AGD","brand:wikidata":"Q7277895","brand:wikipedia":"pl:RTV Euro AGD",name:"RTV Euro AGD",shop:"electronics"}},"shop/electronics|RadioShack":{tags:{brand:"RadioShack","brand:wikidata":"Q1195490","brand:wikipedia":"en:RadioShack",name:"RadioShack",shop:"electronics"}},"shop/electronics|Samsung":{tags:{brand:"Samsung","brand:wikidata":"Q20718","brand:wikipedia":"en:Samsung Electronics",name:"Samsung",shop:"electronics"}},"shop/electronics|Saturn":{countryCodes:["at","de","lu","pl"],tags:{brand:"Saturn","brand:wikidata":"Q2543504","brand:wikipedia":"en:Saturn (retailer)",name:"Saturn",shop:"electronics"}},"shop/electronics|Sony":{tags:{brand:"Sony","brand:wikidata":"Q41187","brand:wikipedia":"en:Sony",name:"Sony",shop:"electronics"}},"shop/electronics|Teknikmagasinet":{countryCodes:["fi","no","se"],tags:{brand:"Teknikmagasinet","brand:wikidata":"Q3357520","brand:wikipedia":"en:Teknikmagasinet",name:"Teknikmagasinet",shop:"electronics"}},"shop/electronics|The Good Guys":{countryCodes:["au"],tags:{brand:"The Good Guys","brand:wikidata":"Q7737217","brand:wikipedia":"en:The Good Guys (Australian company)",name:"The Good Guys",shop:"electronics"}},"shop/electronics|The Source":{countryCodes:["ca"],tags:{brand:"The Source","brand:wikidata":"Q3212934","brand:wikipedia":"en:The Source (retailer)",name:"The Source",shop:"electronics"}},"shop/electronics|Trony":{countryCodes:["it"],tags:{brand:"Trony",name:"Trony",shop:"electronics"}},"shop/electronics|Unieuro":{countryCodes:["it"],tags:{brand:"Unieuro","brand:wikidata":"Q4004687","brand:wikipedia":"en:Unieuro",name:"Unieuro",shop:"electronics"}},"shop/electronics|Worten":{countryCodes:["es","pt"],tags:{brand:"Worten","brand:wikidata":"Q10394039","brand:wikipedia":"pt:Worten",name:"Worten",shop:"electronics"}},"shop/electronics|b8ta":{countryCodes:["us"],tags:{brand:"b8ta","brand:wikidata":"Q55604609","brand:wikipedia":"en:B8ta",name:"b8ta",shop:"electronics"}},"shop/electronics|М.Видео":{countryCodes:["ru"],tags:{brand:"М.Видео","brand:en":"M.video","brand:wikidata":"Q6558800","brand:wikipedia":"en:M.video",name:"М.Видео","name:en":"M.video",shop:"electronics"}},"shop/electronics|Фокстрот":{countryCodes:["ua"],tags:{brand:"Фокстрот","brand:wikidata":"Q16721578","brand:wikipedia":"uk:Фокстрот (торгова мережа)",name:"Фокстрот",shop:"electronics"}},"shop/electronics|Эксперт":{countryCodes:["ru"],tags:{brand:"Эксперт",name:"Эксперт",shop:"electronics"}},"shop/electronics|Эльдорадо":{countryCodes:["ru","ua"],tags:{brand:"Эльдорадо","brand:wikidata":"Q4531492","brand:wikipedia":"ru:Эльдорадо (сеть магазинов)",name:"Эльдорадо",shop:"electronics"}},"shop/electronics|エディオン":{countryCodes:["jp"],tags:{brand:"エディオン","brand:en":"EDION","brand:ja":"エディオン","brand:wikidata":"Q11290252","brand:wikipedia":"ja:エディオン",name:"エディオン","name:en":"EDION","name:ja":"エディオン",shop:"electronics"}},"shop/electronics|ケーズデンキ":{countryCodes:["jp"],matchTags:["shop/appliance"],tags:{brand:"ケーズデンキ","brand:en":"K's Denki","brand:ja":"ケーズデンキ","brand:wikidata":"Q6322472","brand:wikipedia":"ja:ケーズホールディングス",name:"ケーズデンキ","name:en":"K's Denki","name:ja":"ケーズデンキ",shop:"electronics"}},"shop/electronics|コジマ":{countryCodes:["jp"],tags:{brand:"コジマ","brand:en":"Kojima","brand:ja":"コジマ","brand:wikidata":"Q11302052","brand:wikipedia":"ja:コジマ",name:"コジマ","name:en":"Kojima","name:ja":"コジマ",shop:"electronics"}},"shop/electronics|ソフマップ":{countryCodes:["jp"],tags:{brand:"ソフマップ","brand:en":"Sofmap","brand:ja":"ソフマップ","brand:wikidata":"Q7553789","brand:wikipedia":"ja:ソフマップ",name:"ソフマップ","name:en":"Sofmap","name:ja":"ソフマップ",shop:"electronics"}},"shop/electronics|ビックカメラ":{countryCodes:["jp"],tags:{brand:"ビックカメラ","brand:en":"Bic Camera","brand:ja":"ビックカメラ","brand:wikidata":"Q4903531","brand:wikipedia":"ja:ビックカメラ",name:"ビックカメラ","name:en":"Bic Camera","name:ja":"ビックカメラ",shop:"electronics"}},"shop/electronics|ヤマダ電機":{countryCodes:["jp"],tags:{brand:"ヤマダ電機","brand:en":"Yamada Denki","brand:ja":"ヤマダ電機","brand:wikidata":"Q1096390","brand:wikipedia":"en:Yamada Denki",name:"ヤマダ電機","name:en":"Yamada Denki","name:ja":"ヤマダ電機",shop:"electronics"}},"shop/electronics|ヨドバシカメラ":{countryCodes:["jp"],tags:{brand:"ヨドバシカメラ","brand:en":"Yodobashi Camera","brand:ja":"ヨドバシカメラ","brand:wikidata":"Q168467","brand:wikipedia":"ja:ヨドバシカメラ",name:"ヨドバシカメラ","name:en":"Yodobashi Camera","name:ja":"ヨドバシカメラ",shop:"electronics"}},"shop/electronics|全國電子":{countryCodes:["tw"],tags:{brand:"全國電子","brand:en":"E-life Mall","brand:wikidata":"Q10891540","brand:wikipedia":"zh:全國電子",name:"全國電子","name:en":"E-life Mall",shop:"electronics"}},"shop/electronics|燦坤3C":{countryCodes:["tw"],tags:{brand:"燦坤3C","brand:en":"Tsannkuen 3C","brand:wikidata":"Q11569285","brand:wikipedia":"zh:燦坤",name:"燦坤3C","name:en":"Tsannkuen 3C",shop:"electronics"}},"shop/erotic|Ann Summers":{countryCodes:["gb","ie"],tags:{brand:"Ann Summers","brand:wikidata":"Q579524","brand:wikipedia":"en:Ann Summers",name:"Ann Summers",shop:"erotic"}},"shop/erotic|Orion":{countryCodes:["at","de"],tags:{brand:"Orion","brand:wikidata":"Q1609577","brand:wikipedia":"de:Orion (Erotik)",name:"Orion",shop:"erotic"}},"shop/fabric|Mondial Tissus":{countryCodes:["fr"],matchTags:["shop/curtain","shop/department_store"],tags:{brand:"Mondial Tissus","brand:wikidata":"Q17635288","brand:wikipedia":"fr:Mondial Tissus",name:"Mondial Tissus",shop:"fabric"}},"shop/fashion_accessories|Brighton Collectibles":{countryCodes:["us"],matchNames:["brighton"],tags:{brand:"Brighton Collectibles","brand:wikidata":"Q4967623","brand:wikipedia":"en:Brighton Collectibles",name:"Brighton Collectibles",shop:"fashion_accessories"}},"shop/fashion_accessories|Bvlgari":{matchNames:["bulgari"],tags:{brand:"Bulgari","brand:wikidata":"Q752515","brand:wikipedia":"en:Bulgari",name:"Bvlgari",shop:"fashion_accessories"}},"shop/fashion_accessories|Claire's":{matchTags:["shop/jewelry"],tags:{brand:"Claire's","brand:wikidata":"Q2974996","brand:wikipedia":"en:Claire's",name:"Claire's",shop:"fashion_accessories"}},"shop/fashion_accessories|Jimmy Choo":{tags:{brand:"Jimmy Choo","brand:wikidata":"Q5213855","brand:wikipedia":"en:Jimmy Choo Ltd",name:"Jimmy Choo",shop:"fashion_accessories"}},"shop/fashion_accessories|Prada":{tags:{brand:"Prada","brand:wikidata":"Q193136","brand:wikipedia":"en:Prada",name:"Prada",shop:"fashion_accessories"}},"shop/fashion_accessories|Salvatore Ferragamo":{tags:{brand:"Salvatore Ferragamo","brand:wikidata":"Q3946053","brand:wikipedia":"en:Salvatore Ferragamo S.p.A.",name:"Salvatore Ferragamo",shop:"fashion_accessories"}},"shop/fashion_accessories|Van Cleef & Arpels":{matchNames:["van cleef & arples","van cleef and arpels","van cleef and arples"],tags:{brand:"Van Cleef & Arpels","brand:wikidata":"Q2708181","brand:wikipedia":"en:Van Cleef & Arpels",name:"Van Cleef & Arpels",shop:"fashion_accessories"}},"shop/florist|Blume 2000":{countryCodes:["de"],tags:{brand:"Blume 2000","brand:wikidata":"Q886166","brand:wikipedia":"de:Blume 2000",name:"Blume 2000",shop:"florist"}},"shop/florist|Blumen Risse":{countryCodes:["de"],tags:{brand:"Blumen Risse","brand:wikidata":"Q886177","brand:wikipedia":"de:Blumen Risse",name:"Blumen Risse",shop:"florist"}},"shop/florist|Interflora":{countryCodes:["fr","gb","no","se"],tags:{brand:"Interflora","brand:wikidata":"Q692179","brand:wikipedia":"en:Interflora",name:"Interflora",shop:"florist"}},"shop/florist|Monceau Fleurs":{countryCodes:["be","fr"],tags:{brand:"Monceau Fleurs","brand:wikidata":"Q17629431","brand:wikipedia":"fr:Emova Group",name:"Monceau Fleurs",shop:"florist"}},"shop/florist|Азалия":{tags:{brand:"Азалия",name:"Азалия",shop:"florist"}},"shop/florist|Мосцветторг":{countryCodes:["ru"],tags:{brand:"Мосцветторг",name:"Мосцветторг",shop:"florist"}},"shop/frozen_food|Picard":{countryCodes:["fr"],tags:{brand:"Picard","brand:wikidata":"Q3382454","brand:wikipedia":"en:Picard Surgelés",name:"Picard",shop:"frozen_food"}},"shop/funeral_directors|PFG":{countryCodes:["fr"],tags:{brand:"PFG","brand:wikidata":"Q3396087","brand:wikipedia":"fr:Pompes funèbres générales",name:"PFG",official_name:"Pompes Funèbres Générales",shop:"funeral_directors"}},"shop/funeral_directors|Roblot":{countryCodes:["fr"],tags:{brand:"Roblot","brand:wikidata":"Q63247414",name:"Roblot",shop:"funeral_directors"}},"shop/funeral_directors|Roc-Eclerc":{countryCodes:["fr"],tags:{brand:"Roc-Eclerc","brand:wikidata":"Q62558102",name:"Roc-Eclerc",shop:"funeral_directors"}},"shop/funeral_directors|The Co-operative Funeralcare":{countryCodes:["gb"],tags:{brand:"The Co-operative Funeralcare","brand:wikidata":"Q7726521","brand:wikipedia":"en:Co-op Funeralcare",name:"The Co-operative Funeralcare",shop:"funeral_directors"}},"shop/furniture|Aaron's":{countryCodes:["ca","us"],tags:{brand:"Aaron's","brand:wikidata":"Q10397787","brand:wikipedia":"en:Aaron's, Inc.",name:"Aaron's",shop:"furniture"}},"shop/furniture|American Signature Furniture":{countryCodes:["us"],tags:{brand:"American Signature Furniture","brand:wikidata":"Q63859411",name:"American Signature Furniture",shop:"furniture"}},"shop/furniture|Arhaus":{countryCodes:["us"],tags:{brand:"Arhaus","brand:wikidata":"Q35689887","brand:wikipedia":"en:Arhaus",name:"Arhaus",shop:"furniture"}},"shop/furniture|Ashley HomeStore":{countryCodes:["ca","us"],matchNames:["ashley furniture homestore"],tags:{alt_name:"Ashley Furniture",brand:"Ashley HomeStore","brand:wikidata":"Q4805437","brand:wikipedia":"en:Ashley HomeStore",name:"Ashley HomeStore",shop:"furniture"}},"shop/furniture|Asko":{countryCodes:["fi"],tags:{brand:"Asko","brand:wikidata":"Q11853132","brand:wikipedia":"fi:Asko",name:"Asko",shop:"furniture"}},"shop/furniture|Askona":{countryCodes:["ru"],tags:{brand:"Askona","brand:wikidata":"Q4071319","brand:wikipedia":"ru:Аскона (компания)",name:"Askona",shop:"furniture"}},"shop/furniture|Black Red White":{tags:{brand:"Black Red White","brand:wikidata":"Q4921546","brand:wikipedia":"en:Black Red White",name:"Black Red White",shop:"furniture"}},"shop/furniture|BoConcept":{tags:{brand:"BoConcept","brand:wikidata":"Q11338915","brand:wikipedia":"en:BoConcept",name:"BoConcept",shop:"furniture"}},"shop/furniture|Bob's Discount Furniture":{countryCodes:["us"],tags:{brand:"Bob's Discount Furniture","brand:wikidata":"Q4931582","brand:wikipedia":"en:Bob's Discount Furniture",name:"Bob's Discount Furniture",shop:"furniture"}},"shop/furniture|Bodzio":{countryCodes:["pl"],tags:{brand:"Bodzio","brand:wikidata":"Q20034845","brand:wikipedia":"pl:Fabryka Mebli Bodzio",name:"Bodzio",shop:"furniture"}},"shop/furniture|But":{countryCodes:["fr"],tags:{brand:"But","brand:wikidata":"Q18720442","brand:wikipedia":"en:BUT (retailer)",name:"But",shop:"furniture"}},"shop/furniture|Cabinets To Go":{countryCodes:["us"],tags:{brand:"Cabinets To Go","brand:wikidata":"Q25245346","brand:wikipedia":"en:Cabinets To Go",name:"Cabinets To Go",shop:"furniture"}},"shop/furniture|Casa":{countryCodes:["be","ch","es","fr","it","pt"],matchTags:["shop/interior_decoration"],tags:{brand:"Casa",name:"Casa",shop:"furniture"}},"shop/furniture|Conforama":{countryCodes:["ch","es","fr","it"],tags:{brand:"Conforama","brand:wikidata":"Q541134","brand:wikipedia":"en:Conforama",name:"Conforama",shop:"furniture"}},"shop/furniture|Crate & Barrel":{countryCodes:["us"],matchNames:["crate and barrel"],tags:{brand:"Crate & Barrel","brand:wikidata":"Q5182604","brand:wikipedia":"en:Crate & Barrel",name:"Crate & Barrel",shop:"furniture"}},"shop/furniture|DFS":{countryCodes:["gb"],tags:{brand:"DFS","brand:wikidata":"Q5204927","brand:wikipedia":"en:DFS Furniture",name:"DFS",shop:"furniture"}},"shop/furniture|Dänisches Bettenlager":{countryCodes:["at","de"],matchTags:["shop/bed"],tags:{brand:"Dänisches Bettenlager","brand:wikidata":"Q138913","brand:wikipedia":"en:Jysk (store)",name:"Dänisches Bettenlager",shop:"furniture"}},"shop/furniture|Ethan Allen":{countryCodes:["ca","us"],tags:{brand:"Ethan Allen","brand:wikidata":"Q5402870","brand:wikipedia":"en:Ethan Allen (furniture company)",name:"Ethan Allen",shop:"furniture"}},"shop/furniture|Fly":{countryCodes:["fr"],tags:{brand:"Fly","brand:wikidata":"Q1389184","brand:wikipedia":"fr:Fly (entreprise)",name:"Fly",shop:"furniture"}},"shop/furniture|Freedom":{countryCodes:["au"],matchNames:["freedom furniture"],tags:{brand:"Freedom","brand:wikidata":"Q5500546","brand:wikipedia":"en:Freedom Furniture",name:"Freedom",shop:"furniture"}},"shop/furniture|HSL":{countryCodes:["gb"],tags:{brand:"HSL","brand:wikidata":"Q64284324",name:"HSL",official_name:"High Seat Limited",shop:"furniture"}},"shop/furniture|Harveys":{countryCodes:["gb"],nomatch:["amenity/fast_food|Harvey's"],tags:{brand:"Harveys","brand:wikidata":"Q5677754","brand:wikipedia":"en:Harveys Furniture",name:"Harveys",shop:"furniture"}},"shop/furniture|Havertys":{countryCodes:["us"],tags:{brand:"Havertys","brand:wikidata":"Q5683881","brand:wikipedia":"en:Havertys",name:"Havertys",shop:"furniture"}},"shop/furniture|IKEA":{tags:{brand:"IKEA","brand:wikidata":"Q54078","brand:wikipedia":"en:IKEA",name:"IKEA",shop:"furniture"}},"shop/furniture|Isku":{countryCodes:["fi"],tags:{brand:"Isku","brand:wikidata":"Q11865127","brand:wikipedia":"fi:Isku (yritys)",name:"Isku",shop:"furniture"}},"shop/furniture|JYSK":{tags:{brand:"JYSK","brand:wikidata":"Q138913","brand:wikipedia":"en:Jysk (store)",name:"JYSK",shop:"furniture"}},"shop/furniture|Kwantum":{countryCodes:["nl"],tags:{brand:"Kwantum","brand:wikidata":"Q2262591","brand:wikipedia":"nl:Kwantum (winkelketen)",name:"Kwantum",shop:"furniture"}},"shop/furniture|La-Z-Boy":{countryCodes:["ca","us"],tags:{brand:"La-Z-Boy","brand:wikidata":"Q6391583","brand:wikipedia":"en:La-Z-Boy",name:"La-Z-Boy",shop:"furniture"}},"shop/furniture|Leen Bakker":{countryCodes:["nl"],tags:{brand:"Leen Bakker","brand:wikidata":"Q3333662","brand:wikipedia":"nl:Leen Bakker",name:"Leen Bakker",shop:"furniture"}},"shop/furniture|LoveSac":{countryCodes:["us"],tags:{brand:"LoveSac","brand:wikidata":"Q6690181","brand:wikipedia":"en:LoveSac",name:"LoveSac",shop:"furniture"}},"shop/furniture|Maisons du Monde":{countryCodes:["be","ch","de","es","fr","gb","it","lu"],tags:{brand:"Maisons du Monde","brand:wikidata":"Q3280364","brand:wikipedia":"fr:Maisons du Monde",name:"Maisons du Monde",shop:"furniture"}},"shop/furniture|Möbelix":{countryCodes:["at","cz","hu","sk"],tags:{brand:"Möbelix","brand:wikidata":"Q877547","brand:wikipedia":"hu:Möbelix",name:"Möbelix",shop:"furniture"}},"shop/furniture|Pottery Barn":{countryCodes:["au","ca","mx","ph","us"],tags:{brand:"Pottery Barn","brand:wikidata":"Q3400126","brand:wikipedia":"en:Pottery Barn",name:"Pottery Barn",shop:"furniture"}},"shop/furniture|Raymour & Flanigan":{countryCodes:["us"],tags:{brand:"Raymour & Flanigan","brand:wikidata":"Q7299290","brand:wikipedia":"en:Raymour & Flanigan",name:"Raymour & Flanigan",shop:"furniture"}},"shop/furniture|Rent-A-Center":{countryCodes:["mx","us"],tags:{brand:"Rent-A-Center","brand:wikidata":"Q7313497","brand:wikipedia":"en:Rent-A-Center",name:"Rent-A-Center",shop:"furniture"}},"shop/furniture|Restoration Hardware":{countryCodes:["ca","us"],tags:{brand:"Restoration Hardware","brand:wikidata":"Q7316207","brand:wikipedia":"en:Restoration Hardware",name:"Restoration Hardware",shop:"furniture"}},"shop/furniture|Roche Bobois":{tags:{brand:"Roche Bobois",name:"Roche Bobois",shop:"furniture"}},"shop/furniture|Roller":{countryCodes:["de"],tags:{brand:"Roller","brand:wikidata":"Q1621286","brand:wikipedia":"de:Roller (Möbelhaus)",name:"Roller",shop:"furniture"}},"shop/furniture|Rooms To Go":{countryCodes:["us"],tags:{brand:"Rooms To Go","brand:wikidata":"Q7366329","brand:wikipedia":"en:Rooms To Go",name:"Rooms To Go",shop:"furniture"}},"shop/furniture|ScS":{countryCodes:["gb"],tags:{brand:"ScS","brand:wikidata":"Q19654399","brand:wikipedia":"en:ScS",name:"ScS",shop:"furniture"}},"shop/furniture|The Brick":{countryCodes:["ca"],tags:{brand:"The Brick","brand:wikidata":"Q7720000","brand:wikipedia":"en:The Brick",name:"The Brick",shop:"furniture"}},"shop/furniture|Urban Barn":{countryCodes:["ca"],tags:{brand:"Urban Barn","brand:wikidata":"Q62515207",name:"Urban Barn",shop:"furniture"}},"shop/furniture|Value City Furniture":{countryCodes:["us"],tags:{brand:"Value City Furniture","brand:wikidata":"Q63859417",name:"Value City Furniture",shop:"furniture"}},"shop/furniture|XXXLutz":{tags:{brand:"XXXLutz",name:"XXXLutz",shop:"furniture"}},"shop/furniture|İstikbal":{countryCodes:["tr"],tags:{brand:"İstikbal","brand:wikidata":"Q6031999","brand:wikipedia":"tr:İstikbal",name:"İstikbal",shop:"furniture"}},"shop/furniture|Много мебели":{countryCodes:["ru"],tags:{brand:"Много мебели",name:"Много мебели",shop:"furniture"}},"shop/furniture|ニトリ":{countryCodes:["jp"],tags:{brand:"ニトリ","brand:en":"Nitori","brand:ja":"ニトリ","brand:wikidata":"Q10801453","brand:wikipedia":"en:Nitori",name:"ニトリ","name:en":"Nitori","name:ja":"ニトリ",shop:"furniture"}},"shop/games|Games Workshop":{countryCodes:["de","fr","gb","nl","us"],tags:{brand:"Games Workshop","brand:wikidata":"Q587270","brand:wikipedia":"en:Games Workshop",name:"Games Workshop",shop:"games"}},"shop/garden_centre|Dehner":{countryCodes:["at","de"],tags:{brand:"Dehner","brand:wikidata":"Q1183029","brand:wikipedia":"de:Dehner",name:"Dehner",shop:"garden_centre"}},"shop/garden_centre|Gamm Vert":{countryCodes:["fr"],tags:{brand:"Gamm Vert","brand:wikidata":"Q3095006","brand:wikipedia":"fr:Gamm Vert",name:"Gamm Vert",shop:"garden_centre"}},"shop/garden_centre|Jardiland":{countryCodes:["fr"],tags:{brand:"Jardiland","brand:wikidata":"Q3162276","brand:wikipedia":"fr:Jardiland",name:"Jardiland",shop:"garden_centre"}},"shop/garden_centre|Point Vert":{countryCodes:["fr"],tags:{brand:"Point Vert","brand:wikidata":"Q16661975","brand:wikipedia":"fr:Magasin vert",name:"Point Vert",shop:"garden_centre"}},"shop/garden_centre|Truffaut":{countryCodes:["fr"],tags:{brand:"Truffaut","brand:wikidata":"Q3162640","brand:wikipedia":"fr:Jardineries Truffaut",name:"Truffaut",shop:"garden_centre"}},"shop/garden_centre|Welkoop":{countryCodes:["nl"],tags:{brand:"Welkoop",name:"Welkoop",shop:"garden_centre"}},"shop/gas|Airgas":{countryCodes:["us"],matchTags:["amenity/fuel","shop/fuel","shop/trade"],tags:{brand:"Airgas","brand:wikidata":"Q80635","brand:wikipedia":"en:Airgas",name:"Airgas",shop:"gas"}},"shop/gift|American Greetings":{countryCodes:["us"],tags:{brand:"American Greetings","brand:wikidata":"Q464767","brand:wikipedia":"en:American Greetings",name:"American Greetings",shop:"gift"}},"shop/gift|Card Factory":{countryCodes:["gb","im"],tags:{brand:"Card Factory","brand:wikidata":"Q5038192","brand:wikipedia":"en:Card Factory",name:"Card Factory",shop:"gift"}},"shop/gift|Carlton Cards":{countryCodes:["ca"],matchNames:["carlton"],tags:{brand:"Carlton Cards","brand:wikidata":"Q5042968","brand:wikipedia":"en:Carlton Cards",name:"Carlton Cards",shop:"gift"}},"shop/gift|Clintons":{countryCodes:["gb"],tags:{brand:"Clintons","brand:wikidata":"Q5134299","brand:wikipedia":"en:Clintons",name:"Clintons",shop:"gift"}},"shop/gift|Cracker Barrel":{countryCodes:["us"],tags:{brand:"Cracker Barrel","brand:wikidata":"Q4492609","brand:wikipedia":"en:Cracker Barrel",name:"Cracker Barrel",official_name:"Cracker Barrel Old Country Store",shop:"gift"}},"shop/gift|Disney Store":{countryCodes:["ca","fr","us"],matchNames:["the disney store"],matchTags:["shop/toys"],tags:{brand:"Disney Store","brand:wikidata":"Q1047009","brand:wikipedia":"en:Disney Store",name:"Disney Store",shop:"gift"}},"shop/gift|Edible Arrangements":{countryCodes:["ca","us"],tags:{brand:"Edible Arrangements","brand:wikidata":"Q5337996","brand:wikipedia":"en:Edible Arrangements",name:"Edible Arrangements",shop:"gift"}},"shop/gift|Hallmark":{countryCodes:["ca","gb","us"],matchNames:["hallmark gold crown"],tags:{brand:"Hallmark","brand:wikidata":"Q1521910","brand:wikipedia":"en:Hallmark Cards",name:"Hallmark",shop:"gift"}},"shop/gift|Nanu-Nana":{countryCodes:["at","de"],tags:{brand:"Nanu-Nana","brand:wikidata":"Q1720245","brand:wikipedia":"de:Nanu-Nana",name:"Nanu-Nana",shop:"gift"}},"shop/gift|Papyrus":{countryCodes:["us"],tags:{brand:"Papyrus","brand:wikidata":"Q28222692","brand:wikipedia":"en:Papyrus (company)",name:"Papyrus",shop:"gift"}},"shop/gift|Spencer's":{countryCodes:["ca","us"],tags:{brand:"Spencer Gifts","brand:wikidata":"Q7576055","brand:wikipedia":"en:Spencer Gifts",name:"Spencer's",official_name:"Spencer Gifts",shop:"gift"}},"shop/gift|Things Remembered":{countryCodes:["ca","us"],tags:{brand:"Things Remembered","brand:wikidata":"Q54958287","brand:wikipedia":"en:Things Remembered",name:"Things Remembered",shop:"gift"}},"shop/gift|Wereldwinkel":{countryCodes:["be","nl"],tags:{brand:"Wereldwinkel",name:"Wereldwinkel",shop:"gift"}},"shop/greengrocer|Produce Junction":{countryCodes:["us"],tags:{brand:"Produce Junction","brand:wikidata":"Q60583541",name:"Produce Junction",shop:"greengrocer"}},"shop/hairdresser_supply|Sally Beauty Supply":{countryCodes:["ca","mx","us"],tags:{brand:"Sally Beauty Supply","brand:wikidata":"Q7405065","brand:wikipedia":"en:Sally Beauty Holdings",name:"Sally Beauty Supply",shop:"hairdresser_supply"}},"shop/hairdresser|Camille Albane":{countryCodes:["fr"],tags:{brand:"Camille Albane","brand:wikidata":"Q62965183",name:"Camille Albane",shop:"hairdresser"}},"shop/hairdresser|Coiff&Co":{countryCodes:["fr"],tags:{brand:"Coiff&Co",name:"Coiff&Co",shop:"hairdresser"}},"shop/hairdresser|Cost Cutters":{countryCodes:["us"],tags:{brand:"Cost Cutters","brand:wikidata":"Q62029366",name:"Cost Cutters",shop:"hairdresser"}},"shop/hairdresser|Dessange":{tags:{brand:"Dessange","brand:wikidata":"Q62979914",name:"Dessange",shop:"hairdresser"}},"shop/hairdresser|Fantastic Sams":{countryCodes:["us"],tags:{brand:"Fantastic Sams","brand:wikidata":"Q5434222","brand:wikipedia":"en:Fantastic Sams",name:"Fantastic Sams",shop:"hairdresser"}},"shop/hairdresser|First Choice Haircutters":{countryCodes:["ca"],tags:{brand:"First Choice Haircutters","brand:wikidata":"Q5452622","brand:wikipedia":"en:First Choice Haircutters",name:"First Choice Haircutters",shop:"hairdresser"}},"shop/hairdresser|Franck Provost":{countryCodes:["be","fr","pl"],tags:{brand:"Franck Provost","brand:wikidata":"Q62805922","brand:wikipedia":"fr:Franck Provost (Salons de coiffure)",name:"Franck Provost",shop:"hairdresser"}},"shop/hairdresser|Great Clips":{countryCodes:["ca","us"],tags:{brand:"Great Clips","brand:wikidata":"Q5598967","brand:wikipedia":"en:Great Clips",name:"Great Clips",shop:"hairdresser"}},"shop/hairdresser|Hair Cuttery":{countryCodes:["us"],tags:{brand:"Hair Cuttery","brand:wikidata":"Q5639484","brand:wikipedia":"en:Hair Cuttery",name:"Hair Cuttery",shop:"hairdresser"}},"shop/hairdresser|Hair Express":{countryCodes:["de","us"],tags:{brand:"Hair Express","brand:wikidata":"Q57550814",name:"Hair Express",shop:"hairdresser"}},"shop/hairdresser|Hair Studio":{tags:{brand:"Hair Studio",name:"Hair Studio",shop:"hairdresser"}},"shop/hairdresser|Hairkiller":{countryCodes:["at","de","lu"],tags:{brand:"Hairkiller","brand:wikidata":"Q58305998",name:"Hairkiller",shop:"hairdresser"}},"shop/hairdresser|Jean Louis David":{countryCodes:["es","fr","it","pl"],tags:{brand:"Jean Louis David","brand:wikidata":"Q64445174",name:"Jean Louis David",shop:"hairdresser"}},"shop/hairdresser|Kirpykla":{countryCodes:["lt"],tags:{brand:"Kirpykla",name:"Kirpykla",shop:"hairdresser"}},"shop/hairdresser|Klier":{countryCodes:["at","cz","de","sk"],tags:{brand:"Klier","brand:wikidata":"Q1465159","brand:wikipedia":"de:Frisör Klier",name:"Klier",shop:"hairdresser"}},"shop/hairdresser|Klipp":{countryCodes:["at"],tags:{brand:"Klipp","brand:wikidata":"Q1737304","brand:wikipedia":"de:Klipp Frisör",name:"Klipp",shop:"hairdresser"}},"shop/hairdresser|Marco Aldany":{tags:{brand:"Marco Aldany",name:"Marco Aldany",shop:"hairdresser"}},"shop/hairdresser|Mastercuts":{countryCodes:["ca","us"],tags:{brand:"Mastercuts","brand:wikidata":"Q64026258",name:"Mastercuts",shop:"hairdresser"}},"shop/hairdresser|Saint Algue":{tags:{brand:"Saint Algue","brand:wikidata":"Q62973210",name:"Saint Algue",shop:"hairdresser"}},"shop/hairdresser|Sport Clips":{countryCodes:["ca","us"],matchNames:["sport clips haircuts"],tags:{brand:"Sport Clips","brand:wikidata":"Q7579310",name:"Sport Clips",shop:"hairdresser"}},"shop/hairdresser|Super Cut":{tags:{brand:"Super Cut","brand:wikidata":"Q64139077",name:"Super Cut",shop:"hairdresser"}},"shop/hairdresser|Supercuts":{countryCodes:["ca","gb","us"],tags:{brand:"Supercuts","brand:wikidata":"Q7643239","brand:wikipedia":"en:Supercuts",name:"Supercuts",shop:"hairdresser"}},"shop/hairdresser|Tchip":{countryCodes:["fr"],tags:{brand:"Tchip","brand:wikidata":"Q62871250",name:"Tchip",shop:"hairdresser"}},"shop/hairdresser|The Salon at Ulta Beauty":{countryCodes:["us"],tags:{alt_name:"Ulta Salon",brand:"Ulta Beauty","brand:wikidata":"Q7880076","brand:wikipedia":"en:Ulta Beauty",name:"The Salon at Ulta Beauty",shop:"hairdresser"}},"shop/hairdresser|Toni & Guy":{tags:{brand:"Toni & Guy","brand:wikidata":"Q324784","brand:wikipedia":"en:Toni & Guy",name:"Toni & Guy",shop:"hairdresser"}},"shop/hairdresser|Top Hair":{countryCodes:["de"],tags:{brand:"Top Hair","brand:wikidata":"Q62523343",name:"Top Hair",shop:"hairdresser"}},"shop/hairdresser|Виктория":{tags:{brand:"Виктория",name:"Виктория",shop:"hairdresser"}},"shop/hairdresser|Елена":{tags:{brand:"Елена",name:"Елена",shop:"hairdresser"}},"shop/hairdresser|Каприз":{countryCodes:["ru","ua"],tags:{brand:"Каприз",name:"Каприз",shop:"hairdresser"}},"shop/hairdresser|Фея":{countryCodes:["ru","ua"],tags:{brand:"Фея",name:"Фея",shop:"hairdresser"}},"shop/hairdresser|Чио Чио":{tags:{brand:"Чио Чио",name:"Чио Чио",shop:"hairdresser"}},"shop/hardware|220 вольт":{countryCodes:["by","ru","ua"],tags:{brand:"220 вольт",name:"220 вольт",shop:"hardware"}},"shop/hardware|Harbor Freight Tools":{countryCodes:["us"],tags:{brand:"Harbor Freight Tools","brand:wikidata":"Q5654601","brand:wikipedia":"en:Harbor Freight Tools",name:"Harbor Freight Tools",shop:"hardware"}},"shop/hardware|Home Hardware":{countryCodes:["ca"],nomatch:["shop/doityourself|Home Hardware Building Centre"],tags:{brand:"Home Hardware","brand:wikidata":"Q3139611","brand:wikipedia":"en:Home Hardware",name:"Home Hardware",shop:"hardware"}},"shop/hardware|K-Rauta":{countryCodes:["fi"],tags:{brand:"K-Rauta","brand:wikidata":"Q4206187","brand:wikipedia":"fi:K-Rauta",name:"K-Rauta",shop:"hardware"}},"shop/hardware|Kodin Terra":{countryCodes:["fi"],tags:{brand:"Kodin Terra","brand:wikidata":"Q11872038","brand:wikipedia":"fi:Kodin Terra",name:"Kodin Terra",shop:"hardware"}},"shop/hardware|True Value":{countryCodes:["us"],tags:{brand:"True Value","brand:wikidata":"Q7847545","brand:wikipedia":"en:True Value",name:"True Value",shop:"hardware"}},"shop/hardware|Würth":{countryCodes:["be","de","fi","fr","it","no"],tags:{brand:"Würth","brand:wikidata":"Q679750","brand:wikipedia":"de:Würth-Gruppe",name:"Würth",shop:"hardware"}},"shop/hardware|Мосхозторг":{countryCodes:["ru"],tags:{brand:"Мосхозторг","brand:wikidata":"Q62499092",name:"Мосхозторг",shop:"hardware"}},"shop/hardware|Хозяин":{countryCodes:["by","ru","ua"],tags:{brand:"Хозяин",name:"Хозяин",shop:"hardware"}},"shop/health_food|Holland & Barrett":{countryCodes:["gb","ie","nl"],matchNames:["holland and barrett"],matchTags:["shop/chemist","shop/health","shop/herbalist","shop/supermarket"],tags:{brand:"Holland & Barrett","brand:wikidata":"Q5880870","brand:wikipedia":"en:Holland & Barrett",name:"Holland & Barrett",shop:"health_food"}},"shop/hearing_aids|Amplifon":{tags:{brand:"Amplifon","brand:wikidata":"Q477222","brand:wikipedia":"en:Amplifon",name:"Amplifon",shop:"hearing_aids"}},"shop/hearing_aids|Audika":{countryCodes:["ch","fr"],tags:{brand:"Audika","brand:wikidata":"Q2870745","brand:wikipedia":"fr:Audika",name:"Audika",shop:"hearing_aids"}},"shop/hearing_aids|Beter Horen":{countryCodes:["nl"],tags:{brand:"Beter Horen",name:"Beter Horen",shop:"hearing_aids"}},"shop/hearing_aids|Geers":{countryCodes:["de","pl"],tags:{brand:"Geers","brand:wikidata":"Q1497707","brand:wikipedia":"de:Geers Hörakustik",name:"Geers",shop:"hearing_aids"}},"shop/hearing_aids|Kind Hörgeräte":{countryCodes:["de"],matchNames:["kind"],tags:{brand:"Kind Hörgeräte","brand:wikidata":"Q43598590","brand:wikipedia":"de:Kind Hörgeräte",name:"Kind Hörgeräte",shop:"hearing_aids"}},"shop/hearing_aids|Miracle-Ear":{countryCodes:["ca","us"],tags:{brand:"Miracle-Ear","brand:wikidata":"Q17108572","brand:wikipedia":"en:Miracle-Ear",name:"Miracle-Ear",shop:"hearing_aids"}},"shop/hearing_aids|Neuroth":{countryCodes:["at","de"],tags:{brand:"Neuroth","brand:wikidata":"Q15836645","brand:wikipedia":"de:Neuroth AG",name:"Neuroth",shop:"hearing_aids"}},"shop/hifi|Bang & Olufsen":{tags:{brand:"Bang & Olufsen","brand:wikidata":"Q790020","brand:wikipedia":"en:Bang & Olufsen",name:"Bang & Olufsen",shop:"hifi"}},"shop/hifi|Bose":{tags:{brand:"Bose","brand:wikidata":"Q328568","brand:wikipedia":"en:Bose Corporation",name:"Bose",shop:"hifi"}},"shop/hobby|アニメイト":{countryCodes:["jp"],tags:{brand:"アニメイト","brand:en":"Animate","brand:ja":"アニメイト","brand:wikidata":"Q1041890","brand:wikipedia":"ja:アニメイト",name:"アニメイト","name:en":"Animate","name:ja":"アニメイト",shop:"hobby"}},"shop/houseware|At Home":{countryCodes:["us"],matchNames:["garden ridge"],tags:{brand:"At Home (store)","brand:wikidata":"Q5522290",name:"At Home",shop:"houseware"}},"shop/houseware|Bed Bath & Beyond":{countryCodes:["ca","mx","nz","us"],matchNames:["bed bath and beyond"],matchTags:["shop/department_store"],tags:{brand:"Bed Bath & Beyond","brand:wikidata":"Q813782","brand:wikipedia":"en:Bed Bath & Beyond",name:"Bed Bath & Beyond",shop:"houseware"}},"shop/houseware|Blokker":{countryCodes:["be","nl"],tags:{brand:"Blokker","brand:wikidata":"Q884934","brand:wikipedia":"en:Blokker Holding",name:"Blokker",shop:"houseware"}},"shop/houseware|Cervera":{countryCodes:["se"],tags:{brand:"Cervera","brand:wikidata":"Q10447179","brand:wikipedia":"sv:Cervera (företag)",name:"Cervera",shop:"houseware"}},"shop/houseware|HomeGoods":{countryCodes:["us"],tags:{brand:"HomeGoods","brand:wikidata":"Q5887941","brand:wikipedia":"en:HomeGoods",name:"HomeGoods",shop:"houseware"}},"shop/houseware|Kitchen Collection":{countryCodes:["us"],tags:{brand:"Kitchen Collection","brand:wikidata":"Q64149036",name:"Kitchen Collection",shop:"houseware"}},"shop/houseware|Lagerhaus":{matchTags:["shop/doityourself"],tags:{brand:"Lagerhaus","brand:wikidata":"Q10553211","brand:wikipedia":"sv:Lagerhaus",name:"Lagerhaus",shop:"houseware"}},"shop/houseware|Le Creuset":{matchTags:["shop/kitchen"],tags:{brand:"Le Creuset","brand:wikidata":"Q555861","brand:wikipedia":"en:Le Creuset",name:"Le Creuset",shop:"houseware"}},"shop/houseware|Marskramer":{countryCodes:["nl"],tags:{brand:"Marskramer","brand:wikidata":"Q2305917","brand:wikipedia":"nl:Marskramer (warenhuis)",name:"Marskramer",shop:"houseware"}},"shop/houseware|Old Time Pottery":{countryCodes:["us"],tags:{brand:"Old Time Pottery","brand:website":"http://www.oldtimepottery.com","brand:wikidata":"Q7085222","brand:wikipedia":"en:Old Time Pottery",name:"Old Time Pottery",shop:"houseware"}},"shop/houseware|Sur La Table":{countryCodes:["us"],tags:{brand:"Sur La Table","brand:wikidata":"Q7645220","brand:wikipedia":"en:Sur La Table",name:"Sur La Table",shop:"houseware"}},"shop/houseware|The Container Store":{countryCodes:["us"],tags:{brand:"The Container Store","brand:wikidata":"Q7727445","brand:wikipedia":"en:The Container Store",name:"The Container Store",shop:"houseware"}},"shop/houseware|Tuesday Morning":{countryCodes:["us"],matchTags:["shop/convenience","shop/department_store","shop/gift","shop/variety_store"],tags:{brand:"Tuesday Morning","brand:wikidata":"Q7851426","brand:wikipedia":"en:Tuesday Morning",name:"Tuesday Morning",shop:"houseware"}},"shop/houseware|WMF":{countryCodes:["at","de"],tags:{brand:"WMF","brand:wikidata":"Q451423","brand:wikipedia":"en:WMF Group",name:"WMF",shop:"houseware"}},"shop/houseware|Williams-Sonoma":{countryCodes:["ca","us"],matchNames:["william sonoma"],matchTags:["shop/furniture"],tags:{brand:"Williams-Sonoma","brand:wikidata":"Q2581220","brand:wikipedia":"en:Williams-Sonoma",name:"Williams-Sonoma",shop:"houseware"}},"shop/houseware|World Market":{countryCodes:["us"],matchNames:["cost plus"],matchTags:["shop/department_store","shop/furniture","shop/interior_decoration","shop/supermarket"],tags:{brand:"World Market","brand:wikidata":"Q5174750","brand:wikipedia":"en:Cost Plus World Market",name:"World Market",official_name:"Cost Plus World Market",shop:"interior_decoration"}},"shop/houseware|Xenos":{countryCodes:["de","nl"],tags:{brand:"Xenos","brand:wikidata":"Q16547960","brand:wikipedia":"nl:Xenos",name:"Xenos",shop:"houseware"}},"shop/houseware|Еврочехол":{countryCodes:["ru"],tags:{brand:"Еврочехол",name:"Еврочехол",shop:"houseware"}},"shop/interior_decoration|Centrakor":{countryCodes:["fr"],matchTags:["shop/variety_store"],tags:{brand:"Centrakor","brand:wikidata":"Q64079345",name:"Centrakor",shop:"interior_decoration"}},"shop/interior_decoration|Depot":{countryCodes:["at","ch","de"],tags:{brand:"Depot","brand:wikidata":"Q1191740","brand:wikipedia":"de:Gries Deco Holding",name:"Depot",shop:"interior_decoration"}},"shop/interior_decoration|Fired Earth":{countryCodes:["gb"],matchTags:["shop/bathroom_furnishing","shop/tiles"],tags:{brand:"Fired Earth","brand:wikidata":"Q20594569",name:"Fired Earth",shop:"interior_decoration"}},"shop/interior_decoration|Hemtex":{countryCodes:["ee","fi","se"],tags:{brand:"Hemtex","brand:wikidata":"Q10521868","brand:wikipedia":"sv:Hemtex",name:"Hemtex",shop:"interior_decoration"}},"shop/interior_decoration|HomeSense":{countryCodes:["ca"],matchTags:["shop/department_store","shop/furniture","shop/houseware"],tags:{brand:"HomeSense","brand:wikidata":"Q16844433","brand:wikipedia":"en:HomeSense",name:"HomeSense",shop:"interior_decoration"}},"shop/interior_decoration|Kirkland's":{countryCodes:["us"],matchTags:["shop/department_store"],tags:{brand:"Kirkland's","brand:wikidata":"Q6415714","brand:wikipedia":"en:Kirkland's",name:"Kirkland's",shop:"interior_decoration"}},"shop/interior_decoration|Pier 1 Imports":{countryCodes:["ca","us"],matchTags:["shop/furniture"],tags:{brand:"Pier 1 Imports","brand:wikidata":"Q7191691","brand:wikipedia":"en:Pier 1 Imports",name:"Pier 1 Imports",shop:"interior_decoration"}},"shop/interior_decoration|Ten Thousand Villages":{countryCodes:["ca","us"],matchNames:["10 thousand villages","10,000 villages"],matchTags:["shop/boutique","shop/gift"],tags:{brand:"Ten Thousand Villages","brand:wikidata":"Q2403252","brand:wikipedia":"en:Ten Thousand Villages",fair_trade:"only",name:"Ten Thousand Villages",shop:"interior_decoration"}},"shop/jewelry|Alex and Ani":{countryCodes:["us"],tags:{brand:"Alex and Ani","brand:wikidata":"Q16198810","brand:wikipedia":"en:Alex and Ani",name:"Alex and Ani",shop:"jewelry"}},"shop/jewelry|Apart":{countryCodes:["pl"],tags:{brand:"Apart","brand:wikidata":"Q11686561","brand:wikipedia":"pl:Apart",name:"Apart",shop:"jewelry"}},"shop/jewelry|Bijou Brigitte":{tags:{brand:"Bijou Brigitte","brand:wikidata":"Q599545","brand:wikipedia":"de:Bijou Brigitte",name:"Bijou Brigitte",shop:"jewelry"}},"shop/jewelry|Cartier":{tags:{brand:"Cartier","brand:wikidata":"Q538587","brand:wikipedia":"en:Cartier (jeweler)",name:"Cartier",shop:"jewelry"}},"shop/jewelry|Christ":{countryCodes:["ch","de","nl"],tags:{brand:"Christ","brand:wikidata":"Q1077957","brand:wikipedia":"de:Christ (Juwelier)",name:"Christ",shop:"jewelry"}},"shop/jewelry|David Yurman":{countryCodes:["us"],tags:{brand:"David Yurman","brand:wikidata":"Q5241390","brand:wikipedia":"en:David Yurman",name:"David Yurman",shop:"jewelry"}},"shop/jewelry|Ernest Jones":{countryCodes:["gb"],tags:{brand:"Ernest Jones","brand:wikidata":"Q5393358","brand:wikipedia":"en:Ernest Jones (retailer)",name:"Ernest Jones",shop:"jewelry"}},"shop/jewelry|Guldfynd":{countryCodes:["se"],tags:{brand:"Guldfynd","brand:wikidata":"Q49099223","brand:wikipedia":"sv:Guldfynd",name:"Guldfynd",shop:"jewelry"}},"shop/jewelry|H.Samuel":{countryCodes:["gb"],tags:{brand:"H.Samuel","brand:wikidata":"Q5628558","brand:wikipedia":"en:H. Samuel",name:"H.Samuel",shop:"jewelry"}},"shop/jewelry|Histoire d'Or":{countryCodes:["be","fr","it","nl"],tags:{brand:"Histoire d'Or","brand:wikidata":"Q62529245",name:"Histoire d'Or",shop:"jewelry"}},"shop/jewelry|Icing":{countryCodes:["ca","us"],tags:{brand:"Icing",name:"Icing",shop:"jewelry"}},"shop/jewelry|James Avery Jewelry":{countryCodes:["us"],tags:{brand:"James Avery Jewelry","brand:wikidata":"Q6129024","brand:wikipedia":"en:James Avery Artisan Jewelry",name:"James Avery Jewelry",shop:"jewelry"}},"shop/jewelry|Jared":{countryCodes:["us"],tags:{brand:"Jared","brand:wikidata":"Q62029282",name:"Jared",shop:"jewelry"}},"shop/jewelry|Julien d'Orcel":{countryCodes:["fr"],tags:{brand:"Julien d'Orcel","brand:wikidata":"Q62497463",name:"Julien d'Orcel",shop:"jewelry"}},"shop/jewelry|Kay Jewelers":{countryCodes:["us"],tags:{brand:"Kay Jewelers","brand:wikidata":"Q62029290",name:"Kay Jewelers",shop:"jewelry"}},"shop/jewelry|PNJ":{countryCodes:["vn"],tags:{brand:"PNJ","brand:wikidata":"Q61129183","brand:wikipedia":"vi:PNJ",name:"PNJ",shop:"jewelry"}},"shop/jewelry|Pandora":{tags:{brand:"Pandora","brand:wikidata":"Q2241604","brand:wikipedia":"en:Pandora (jewelry)",name:"Pandora",shop:"jewelry"}},"shop/jewelry|Piercing Pagoda":{countryCodes:["us"],tags:{brand:"Piercing Pagoda",name:"Piercing Pagoda",shop:"jewelry"}},"shop/jewelry|Swarovski":{tags:{brand:"Swarovski","brand:wikidata":"Q611115","brand:wikipedia":"en:Swarovski",name:"Swarovski",shop:"jewelry"}},"shop/jewelry|Tiffany & Company":{countryCodes:["us"],matchNames:["tiffany","tiffany and company","tiffany's"],tags:{brand:"Tiffany & Company","brand:wikidata":"Q1066858","brand:wikipedia":"en:Tiffany & Co.",name:"Tiffany & Company",official_name:"Tiffany & Co.",shop:"jewelry"}},"shop/jewelry|Tous":{tags:{brand:"Tous",name:"Tous",shop:"jewelry"}},"shop/jewelry|Warren James":{countryCodes:["gb"],tags:{brand:"Warren James","brand:wikidata":"Q19604616","brand:wikipedia":"en:Warren James Jewellers",name:"Warren James",shop:"jewelry"}},"shop/jewelry|Zales":{countryCodes:["us"],tags:{brand:"Zales","brand:wikidata":"Q8065305","brand:wikipedia":"en:Zale Corporation",name:"Zales",shop:"jewelry"}},"shop/jewelry|Адамас":{countryCodes:["ru"],tags:{brand:"Адамас","brand:en":"Adamas","brand:ru":"Адамас","brand:wikidata":"Q62393709",name:"Адамас","name:en":"Adamas","name:ru":"Адамас",shop:"jewelry"}},"shop/jewelry|Золотая мечта":{countryCodes:["by"],tags:{brand:"Золотая мечта","brand:en":"Gold Dream","brand:ru":"Золотая мечта",name:"Золотая мечта","name:en":"Gold Dream","name:ru":"Золотая мечта",shop:"jewelry"}},"shop/kiosk|Lietuvos spauda":{countryCodes:["lt"],tags:{brand:"Lietuvos spauda","brand:wikidata":"Q6514414","brand:wikipedia":"lt:Lietuvos spauda",name:"Lietuvos spauda",shop:"kiosk"}},"shop/kiosk|Narvesen":{countryCodes:["lt","lv","no"],tags:{brand:"Narvesen","brand:wikidata":"Q6514414","brand:wikipedia":"en:Narvesen",name:"Narvesen",shop:"kiosk"}},"shop/kiosk|Pressbyrån":{countryCodes:["se"],tags:{brand:"Pressbyrån","brand:wikidata":"Q2489072","brand:wikipedia":"en:Pressbyrån",name:"Pressbyrån",shop:"kiosk"}},"shop/kiosk|R-Kioski":{countryCodes:["fi"],tags:{brand:"R-Kioski","brand:wikidata":"Q1571400","brand:wikipedia":"en:R-kioski",name:"R-Kioski",shop:"kiosk"}},"shop/kiosk|Ruch":{countryCodes:["pl"],tags:{brand:"Ruch","brand:wikidata":"Q1260314","brand:wikipedia":"pl:Ruch (przedsiębiorstwo)",name:"Ruch",shop:"kiosk"}},"shop/kiosk|Tisak":{countryCodes:["hr"],tags:{brand:"Tisak","brand:wikidata":"Q12643627","brand:wikipedia":"hr:Tisak (tvrtka)",name:"Tisak",shop:"kiosk"}},"shop/kiosk|k kiosk":{countryCodes:["ch"],nomatch:["shop/newsagent|k kiosk"],tags:{brand:"k kiosk","brand:wikidata":"Q60381703","brand:wikipedia":"it:K Kiosk",name:"k kiosk",shop:"kiosk"}},"shop/kiosk|Роспечать":{tags:{brand:"Роспечать",name:"Роспечать",shop:"kiosk"}},"shop/kiosk|キヨスク":{countryCodes:["jp"],tags:{brand:"キヨスク","brand:en":"KIOSK","brand:ja":"キヨスク","brand:wikidata":"Q1334796","brand:wikipedia":"ja:キヨスク",name:"キヨスク","name:en":"KIOSK","name:ja":"キヨスク",shop:"kiosk"}},"shop/kitchen|Cuisinella":{countryCodes:["fr","tn"],tags:{brand:"Cuisinella","brand:wikidata":"Q3007012","brand:wikipedia":"fr:Cuisinella",name:"Cuisinella",shop:"kitchen"}},"shop/kitchen|Ixina":{countryCodes:["be","fr"],tags:{brand:"Ixina",name:"Ixina",shop:"kitchen"}},"shop/kitchen|Magnet":{countryCodes:["gb"],matchNames:["magnet kitchens"],tags:{brand:"Magnet","brand:wikidata":"Q6731427",name:"Magnet",shop:"kitchen"}},"shop/kitchen|Mobalpa":{countryCodes:["be","fr","gb"],tags:{brand:"Mobalpa","brand:wikidata":"Q3317571","brand:wikipedia":"fr:Mobalpa",name:"Mobalpa",shop:"kitchen"}},"shop/kitchen|Schmidt":{countryCodes:["be","es","fr","gb"],tags:{brand:"Schmidt","brand:wikidata":"Q3487620","brand:wikipedia":"de:Schmidt Groupe",name:"Schmidt",shop:"kitchen"}},"shop/kitchen|SoCoo'c":{countryCodes:["fr"],tags:{brand:"SoCoo'c","brand:wikidata":"Q62783840","brand:wikipedia":"fr:SoCoo'c",name:"SoCoo'c",shop:"kitchen"}},"shop/massage|Massage Envy":{countryCodes:["us"],matchNames:["massage envy spa"],tags:{brand:"Massage Envy","brand:wikidata":"Q22922899","brand:wikipedia":"en:Massage Envy",name:"Massage Envy",shop:"massage"}},"shop/massage|Massage Heights":{countryCodes:["ca","us"],tags:{brand:"Massage Heights","brand:wikidata":"Q64573956",name:"Massage Heights",shop:"massage"}},"shop/medical_supply|Pofam-Poznań":{countryCodes:["pl"],tags:{brand:"Pofam-Poznań","brand:wikidata":"Q62057457",name:"Pofam-Poznań",shop:"medical_supply"}},"shop/medical_supply|Ортека":{countryCodes:["ru"],tags:{brand:"Ортека","brand:wikidata":"Q62393660",name:"Ортека",shop:"medical_supply"}},"shop/mobile_phone|3 Store":{countryCodes:["gb","it"],matchNames:["3","three","three store"],tags:{brand:"3 Store","brand:wikidata":"Q407009","brand:wikipedia":"en:3 (telecommunications)",name:"3 Store",shop:"mobile_phone"}},"shop/mobile_phone|AT&T":{countryCodes:["mx","us"],matchNames:["att mobile","att mobility","att wireless"],tags:{brand:"AT&T","brand:wikidata":"Q298594","brand:wikipedia":"en:AT&T Mobility",name:"AT&T",shop:"mobile_phone"}},"shop/mobile_phone|Bell":{countryCodes:["ca"],matchNames:["bell mobile","bell mobility","bell wireless"],tags:{brand:"Bell","brand:wikidata":"Q2894594","brand:wikipedia":"en:Bell Mobility",name:"Bell",shop:"mobile_phone"}},"shop/mobile_phone|Best Buy Mobile":{countryCodes:["ca"],tags:{brand:"Best Buy Mobile","brand:wikidata":"Q533415","brand:wikipedia":"en:Best Buy",name:"Best Buy Mobile",shop:"mobile_phone"}},"shop/mobile_phone|Bitė":{countryCodes:["lt"],tags:{brand:"Bitė","brand:wikidata":"Q796010","brand:wikipedia":"lt:Bitės grupė",name:"Bitė",shop:"mobile_phone"}},"shop/mobile_phone|Boost Mobile":{countryCodes:["us"],tags:{brand:"Boost Mobile","brand:wikidata":"Q4943790","brand:wikipedia":"en:Boost Mobile",name:"Boost Mobile",shop:"mobile_phone"}},"shop/mobile_phone|Bouygues Telecom":{countryCodes:["fr"],tags:{brand:"Bouygues Telecom",name:"Bouygues Telecom",shop:"mobile_phone"}},"shop/mobile_phone|Carphone Warehouse":{countryCodes:["by","gb","ie"],matchNames:["the carphone warehouse"],tags:{brand:"Carphone Warehouse","brand:wikidata":"Q118046","brand:wikipedia":"en:Carphone Warehouse",name:"Carphone Warehouse",shop:"mobile_phone"}},"shop/mobile_phone|Chatr":{countryCodes:["ca"],matchNames:["Chatr Mobile"],tags:{brand:"Chatr","brand:wikidata":"Q5087766","brand:wikipedia":"en:Chatr",name:"Chatr",shop:"mobile_phone"}},"shop/mobile_phone|Claro":{tags:{brand:"Claro","brand:wikidata":"Q1770208","brand:wikipedia":"en:Claro (company)",name:"Claro",shop:"mobile_phone"}},"shop/mobile_phone|Cricket Wireless":{countryCodes:["us"],matchNames:["cricket"],tags:{brand:"Cricket Wireless","brand:wikidata":"Q5184987","brand:wikipedia":"en:Cricket Wireless",name:"Cricket Wireless",shop:"mobile_phone"}},"shop/mobile_phone|Digicel":{tags:{brand:"Digicel","brand:wikidata":"Q2117506","brand:wikipedia":"en:Digicel",name:"Digicel",shop:"mobile_phone"}},"shop/mobile_phone|EE":{countryCodes:["gb"],tags:{brand:"EE","brand:wikidata":"Q5322942","brand:wikipedia":"en:EE Limited",name:"EE",shop:"mobile_phone"}},"shop/mobile_phone|Entel":{countryCodes:["cl","pe"],tags:{brand:"Entel","brand:wikidata":"Q450420","brand:wikipedia":"en:Entel (Chile)",name:"Entel",shop:"mobile_phone"}},"shop/mobile_phone|Fido":{countryCodes:["ca"],tags:{brand:"Fido","brand:wikidata":"Q3071471","brand:wikipedia":"en:Fido Solutions",name:"Fido",shop:"mobile_phone"}},"shop/mobile_phone|Freedom Mobile":{countryCodes:["ca"],matchNames:["freedom","wind mobile"],tags:{brand:"Freedom Mobile","brand:wikidata":"Q8023931","brand:wikipedia":"en:Freedom Mobile",name:"Freedom Mobile",shop:"mobile_phone"}},"shop/mobile_phone|Koodo":{countryCodes:["ca"],tags:{brand:"Koodo","brand:wikidata":"Q6430529","brand:wikipedia":"en:Koodo Mobile",name:"Koodo",shop:"mobile_phone"}},"shop/mobile_phone|MTN":{matchNames:["agence mtn"],matchTags:["office/telecommunication"],tags:{brand:"MTN","brand:wikidata":"Q1813361","brand:wikipedia":"en:MTN Group",name:"MTN",shop:"mobile_phone"}},"shop/mobile_phone|MetroPCS":{countryCodes:["us"],tags:{brand:"MetroPCS","brand:wikidata":"Q1925685","brand:wikipedia":"en:Metro by T-Mobile",name:"MetroPCS",shop:"mobile_phone"}},"shop/mobile_phone|Mobilcom Debitel":{countryCodes:["de","ir"],matchNames:["debitel"],tags:{brand:"Mobilcom Debitel","brand:wikidata":"Q344744","brand:wikipedia":"en:Debitel",name:"Mobilcom Debitel",shop:"mobile_phone"}},"shop/mobile_phone|Moov":{countryCodes:["ci","tg"],matchNames:["agence moov"],matchTags:["office/telecommunication"],tags:{brand:"Moov","brand:wikidata":"Q3323637","brand:wikipedia":"fr:Moov Côte d'Ivoire",name:"Moov",shop:"mobile_phone"}},"shop/mobile_phone|Movistar":{tags:{brand:"Movistar","brand:wikidata":"Q967735","brand:wikipedia":"en:Movistar",name:"Movistar",shop:"mobile_phone"}},"shop/mobile_phone|O2":{countryCodes:["cz","de","gb","ie","sk"],tags:{brand:"O2","brand:wikidata":"Q1759255","brand:wikipedia":"en:Telefónica Europe",name:"O2",shop:"mobile_phone"}},"shop/mobile_phone|Optie1":{countryCodes:["nl"],tags:{brand:"Optie1","brand:wikidata":"Q62393564",name:"Optie1",shop:"mobile_phone"}},"shop/mobile_phone|Orange":{matchNames:["agence orange"],matchTags:["office/telecommunication"],tags:{brand:"Orange","brand:wikidata":"Q1431486","brand:wikipedia":"fr:Orange (entreprise)",name:"Orange",shop:"mobile_phone"}},"shop/mobile_phone|Personal":{countryCodes:["ar","py"],tags:{brand:"Personal","brand:wikidata":"Q10933021","brand:wikipedia":"es:Personal (Argentina)",name:"Personal",shop:"mobile_phone"}},"shop/mobile_phone|Phone House":{countryCodes:["de","es","fr","nl","pt"],matchNames:["the phone house"],tags:{brand:"Phone House","brand:wikidata":"Q118046","brand:wikipedia":"en:Carphone Warehouse",name:"Phone House",shop:"mobile_phone"}},"shop/mobile_phone|Play":{countryCodes:["pl"],tags:{brand:"Play","brand:wikidata":"Q7202998","brand:wikipedia":"pl:Play (sieć telefonii komórkowej)",name:"Play",shop:"mobile_phone"}},"shop/mobile_phone|Plus":{countryCodes:["pl"],nomatch:["shop/supermarket|PLUS"],tags:{brand:"Plus","brand:wikidata":"Q7205598","brand:wikipedia":"pl:Plus (sieć telefonii komórkowej)",name:"Plus",shop:"mobile_phone"}},"shop/mobile_phone|Rogers":{countryCodes:["ca"],tags:{brand:"Rogers","brand:wikidata":"Q3439663","brand:wikipedia":"en:Rogers Wireless",name:"Rogers",shop:"mobile_phone"}},"shop/mobile_phone|SFR":{countryCodes:["fr","lu"],matchNames:["espace sfr"],tags:{brand:"SFR","brand:wikidata":"Q218765","brand:wikipedia":"en:SFR",name:"SFR",shop:"mobile_phone"}},"shop/mobile_phone|Sprint":{nomatch:["amenity/fuel|Sprint"],tags:{brand:"Sprint","brand:wikidata":"Q301965","brand:wikipedia":"en:Sprint Corporation",name:"Sprint",shop:"mobile_phone"}},"shop/mobile_phone|T-Mobile":{tags:{brand:"T-Mobile","brand:wikidata":"Q327634","brand:wikipedia":"en:T-Mobile",name:"T-Mobile",shop:"mobile_phone"}},"shop/mobile_phone|TIM":{countryCodes:["br","it"],tags:{brand:"TIM","brand:wikidata":"Q144617","brand:wikipedia":"en:Telecom Italia",name:"TIM",shop:"mobile_phone"}},"shop/mobile_phone|Tbooth Wireless":{countryCodes:["ca"],tags:{brand:"Tbooth Wireless","brand:wikidata":"Q7690597",name:"Tbooth Wireless",shop:"mobile_phone"}},"shop/mobile_phone|Telcel":{countryCodes:["cu","mx"],tags:{brand:"Telcel","brand:wikidata":"Q3517255","brand:wikipedia":"en:Telcel",name:"Telcel",shop:"mobile_phone"}},"shop/mobile_phone|Tele2":{tags:{brand:"Tele2","brand:wikidata":"Q309865","brand:wikipedia":"en:Tele2",name:"Tele2",shop:"mobile_phone"}},"shop/mobile_phone|Telekom":{countryCodes:["de","hu","ro","si","sk"],matchNames:["telekom shop"],tags:{brand:"Telekom","brand:wikidata":"Q9396","brand:wikipedia":"en:Deutsche Telekom",name:"Telekom",shop:"mobile_phone"}},"shop/mobile_phone|Telenor":{tags:{brand:"Telenor","brand:wikidata":"Q845632","brand:wikipedia":"en:Telenor",name:"Telenor",shop:"mobile_phone"}},"shop/mobile_phone|Telia":{countryCodes:["dk","fi","lt","no","se"],tags:{brand:"Telia",name:"Telia",shop:"mobile_phone"}},"shop/mobile_phone|Telstra":{countryCodes:["au"],tags:{brand:"Telstra","brand:wikidata":"Q721162","brand:wikipedia":"en:Telstra",name:"Telstra",shop:"mobile_phone"}},"shop/mobile_phone|Telus":{countryCodes:["ca"],tags:{brand:"Telus","brand:wikidata":"Q165858","brand:wikipedia":"en:Telus",name:"Telus",shop:"mobile_phone"}},"shop/mobile_phone|Turkcell":{countryCodes:["cy","tr"],tags:{brand:"Turkcell","brand:wikidata":"Q283852","brand:wikipedia":"en:Turkcell",name:"Turkcell",shop:"mobile_phone"}},"shop/mobile_phone|U.S. Cellular":{countryCodes:["us"],tags:{brand:"U.S. Cellular","brand:wikidata":"Q2466256","brand:wikipedia":"en:U.S. Cellular",name:"U.S. Cellular",shop:"mobile_phone"}},"shop/mobile_phone|Verizon Wireless":{countryCodes:["us"],matchNames:["verizon"],tags:{brand:"Verizon Wireless","brand:wikidata":"Q919641","brand:wikipedia":"en:Verizon Wireless",name:"Verizon Wireless",shop:"mobile_phone"}},"shop/mobile_phone|Virgin Mobile~(Canada)":{countryCodes:["ca"],tags:{brand:"Virgin Mobile","brand:wikidata":"Q3560641","brand:wikipedia":"en:Virgin Mobile Canada",name:"Virgin Mobile",shop:"mobile_phone"}},"shop/mobile_phone|Vivo":{tags:{brand:"Vivo",name:"Vivo",shop:"mobile_phone"}},"shop/mobile_phone|Vodafone":{matchNames:["vodafone shop"],tags:{brand:"Vodafone","brand:wikidata":"Q122141","brand:wikipedia":"en:Vodafone",name:"Vodafone",shop:"mobile_phone"}},"shop/mobile_phone|WIFI_ETECSA":{countryCodes:["cu"],tags:{brand:"WIFI_ETECSA","brand:wikidata":"Q490323","brand:wikipedia":"es:Empresa de Telecomunicaciones de Cuba",name:"WIFI_ETECSA",shop:"mobile_phone"}},"shop/mobile_phone|WOW! Mobile Boutique":{countryCodes:["ca"],tags:{brand:"WOW! Mobile Boutique","brand:wikidata":"Q64847598",name:"WOW! Mobile Boutique",shop:"mobile_phone"}},"shop/mobile_phone|Wind":{countryCodes:["it"],tags:{brand:"Wind","brand:wikidata":"Q650467","brand:wikipedia":"en:WIND (Italy)",name:"Wind",shop:"mobile_phone"}},"shop/mobile_phone|WirelessWave":{countryCodes:["ca"],tags:{brand:"WirelessWave","brand:wikidata":"Q8026815",name:"WirelessWave",shop:"mobile_phone"}},"shop/mobile_phone|Yoigo":{countryCodes:["es"],tags:{brand:"Yoigo","brand:wikidata":"Q2630989","brand:wikipedia":"en:Yoigo",name:"Yoigo",shop:"mobile_phone"}},"shop/mobile_phone|auショップ":{countryCodes:["jp"],matchNames:["au"],tags:{brand:"au","brand:ja":"au","brand:wikidata":"Q307110","brand:wikipedia":"ja:Au (携帯電話)",name:"auショップ","name:en":"au","name:ja":"auショップ",shop:"mobile_phone"}},"shop/mobile_phone|Алло":{countryCodes:["md","ua"],tags:{brand:"Алло","brand:wikidata":"Q18683057","brand:wikipedia":"uk:Алло (торгова мережа)",name:"Алло",shop:"mobile_phone"}},"shop/mobile_phone|Билайн":{countryCodes:["kg","kz","ru"],tags:{brand:"Билайн","brand:en":"Beeline","brand:wikidata":"Q402880","brand:wikipedia":"en:Beeline (brand)",name:"Билайн","name:en":"Beeline",shop:"mobile_phone"}},"shop/mobile_phone|Евросеть":{countryCodes:["by","kz","ru","ua"],tags:{brand:"Евросеть","brand:en":"Euroset","brand:wikidata":"Q65310","brand:wikipedia":"en:Euroset",name:"Евросеть","name:en":"Euroset",shop:"mobile_phone"}},"shop/mobile_phone|Київстар":{countryCodes:["ua"],tags:{brand:"Київстар","brand:en":"Kyivstar","brand:wikidata":"Q2288463","brand:wikipedia":"en:Kyivstar",name:"Київстар","name:en":"Kyivstar",shop:"mobile_phone"}},"shop/mobile_phone|МТС":{countryCodes:["by","ru","ua"],tags:{brand:"МТС","brand:en":"MTS","brand:wikidata":"Q1368919","brand:wikipedia":"en:MTS (network provider)",name:"МТС","name:en":"MTS",shop:"mobile_phone"}},"shop/mobile_phone|Мегафон":{countryCodes:["ru","tj"],tags:{brand:"Мегафон","brand:en":"MegaFon","brand:wikidata":"Q1720713","brand:wikipedia":"en:MegaFon",name:"Мегафон","name:en":"MegaFon",shop:"mobile_phone"}},"shop/mobile_phone|НА'СВЯЗИ":{countryCodes:["by"],tags:{brand:"НА'СВЯЗИ",name:"НА'СВЯЗИ",shop:"mobile_phone"}},"shop/mobile_phone|Связной":{countryCodes:["by","ru","uz"],tags:{brand:"Связной","brand:en":"Svyaznoy","brand:wikidata":"Q65371","brand:wikipedia":"en:Svyaznoy",name:"Связной","name:en":"Svyaznoy",shop:"mobile_phone"}},"shop/mobile_phone|Теле2":{countryCodes:["ru"],tags:{brand:"Теле2","brand:en":"Tele2","brand:wikidata":"Q309865","brand:wikipedia":"en:Tele2",name:"Теле2","name:en":"Tele2",shop:"mobile_phone"}},"shop/mobile_phone|ソフトバンク":{countryCodes:["jp"],tags:{brand:"ソフトバンク","brand:en":"SoftBank Telecom","brand:ja":"ソフトバンク","brand:wikidata":"Q7553832","brand:wikipedia":"en:SoftBank Telecom",name:"ソフトバンク","name:en":"SoftBank Telecom","name:ja":"ソフトバンク",shop:"mobile_phone"}},"shop/mobile_phone|ソフトバンクショップ":{countryCodes:["jp"],tags:{brand:"ソフトバンクショップ","brand:en":"SoftBankShop","brand:ja":"ソフトバンクショップ","brand:wikidata":"Q11315281","brand:wikipedia":"ja:ソフトバンクショップ",name:"ソフトバンクショップ","name:en":"SoftBankShop","name:ja":"ソフトバンクショップ",shop:"mobile_phone"}},"shop/mobile_phone|ドコモショップ":{countryCodes:["jp"],tags:{brand:"ドコモショップ","brand:en":"DoCoMo Shop","brand:ja":"ドコモショップ","brand:wikidata":"Q853958","brand:wikipedia":"ja:NTTドコモ",name:"ドコモショップ","name:en":"DoCoMo Shop","name:ja":"ドコモショップ",shop:"mobile_phone"}},"shop/mobile_phone|ワイモバイル":{countryCodes:["jp"],tags:{brand:"ワイモバイル","brand:ja":"ワイモバイル",name:"ワイモバイル","name:ja":"ワイモバイル",shop:"mobile_phone"}},"shop/money_lender|ACE Cash Express":{countryCodes:["us"],matchNames:["ace"],tags:{brand:"ACE Cash Express","brand:wikidata":"Q24260962",name:"ACE Cash Express",shop:"money_lender"}},"shop/money_lender|Advance America":{countryCodes:["us"],tags:{brand:"Advance America","brand:wikidata":"Q4686044",name:"Advance America",shop:"money_lender"}},"shop/money_lender|California Check Cashing Stores":{countryCodes:["us"],matchNames:["california check cashing"],tags:{brand:"California Check Cashing Stores","brand:wikidata":"Q64390932",name:"California Check Cashing Stores",shop:"money_lender"}},"shop/money_lender|Cash Store":{countryCodes:["us"],tags:{brand:"Cash Store","brand:wikidata":"Q61943411",name:"Cash Store",shop:"money_lender"}},"shop/money_lender|Check Into Cash":{countryCodes:["us"],tags:{brand:"Check Into Cash","brand:wikidata":"Q16961246","brand:wikipedia":"en:Check Into Cash",name:"Check Into Cash",shop:"money_lender"}},"shop/money_lender|Money Mart":{countryCodes:["ca","us"],tags:{brand:"Money Mart","brand:wikidata":"Q6899166","brand:wikipedia":"en:Money Mart",name:"Money Mart",shop:"money_lender"}},"shop/motorcycle|Harley-Davidson":{tags:{brand:"Harley-Davidson","brand:wikidata":"Q192814","brand:wikipedia":"en:Harley-Davidson",name:"Harley-Davidson",shop:"motorcycle"}},"shop/motorcycle|Honda":{nomatch:["shop/car|Honda"],tags:{brand:"Honda","brand:wikidata":"Q9584","brand:wikipedia":"en:Honda",name:"Honda",shop:"motorcycle"}},"shop/motorcycle|Kawasaki":{tags:{brand:"Kawasaki","brand:wikidata":"Q6379855","brand:wikipedia":"en:Kawasaki motorcycles",name:"Kawasaki",shop:"motorcycle"}},"shop/motorcycle|Motortrade":{countryCodes:["ph"],tags:{brand:"Motortrade","brand:wikidata":"Q48803162","brand:wikipedia":"en:Motortrade",name:"Motortrade",shop:"motorcycle"}},"shop/motorcycle|Suzuki":{nomatch:["shop/car|Suzuki"],tags:{brand:"Suzuki","brand:wikidata":"Q181642","brand:wikipedia":"en:Suzuki",name:"Suzuki",shop:"motorcycle"}},"shop/motorcycle|Yamaha":{tags:{brand:"Yamaha","brand:wikidata":"Q158888","brand:wikipedia":"en:Yamaha Motor Company",name:"Yamaha",shop:"motorcycle"}},"shop/motorcycle|レッドバロン":{countryCodes:["jp"],tags:{brand:"レッドバロン","brand:ja":"レッドバロン",name:"レッドバロン","name:ja":"レッドバロン",shop:"motorcycle"}},"shop/music|FYE":{countryCodes:["us"],tags:{brand:"FYE","brand:wikidata":"Q5424141","brand:wikipedia":"en:FYE (retailer)",name:"FYE",shop:"music"}},"shop/music|HMV":{countryCodes:["ca","gb"],tags:{brand:"HMV","brand:wikidata":"Q10854572","brand:wikipedia":"en:HMV",name:"HMV",shop:"music"}},"shop/music|TSUTAYA":{nomatch:["shop/books|TSUTAYA","shop/video|TSUTAYA"],tags:{brand:"TSUTAYA","brand:wikidata":"Q5193457","brand:wikipedia":"ja:カルチュア・コンビニエンス・クラブ",name:"TSUTAYA",shop:"music"}},"shop/musical_instrument|Guitar Center":{countryCodes:["us"],tags:{brand:"Guitar Center","brand:wikidata":"Q3622794","brand:wikipedia":"en:Guitar Center",name:"Guitar Center",shop:"musical_instrument"}},"shop/newsagent|Cigo":{countryCodes:["de","nl"],tags:{brand:"Cigo","brand:wikidata":"Q62391977",name:"Cigo",shop:"newsagent"}},"shop/newsagent|Hudson News":{tags:{brand:"Hudson News",name:"Hudson News",shop:"newsagent"}},"shop/newsagent|Inmedio":{countryCodes:["hu","pl","ro"],tags:{brand:"Inmedio",name:"Inmedio",shop:"newsagent"}},"shop/newsagent|Kolporter":{countryCodes:["pl"],matchTags:["shop/kiosk"],tags:{brand:"Kolporter","brand:wikidata":"Q6427874","brand:wikipedia":"pl:Kolporter (przedsiębiorstwo)",name:"Kolporter",shop:"kiosk"}},"shop/newsagent|Maison de la Presse":{countryCodes:["fr"],matchTags:["shop/books"],tags:{brand:"Maison de la Presse","brand:wikidata":"Q62085960",name:"Maison de la Presse",shop:"newsagent"}},"shop/newsagent|Martin's":{countryCodes:["gb"],matchTags:["shop/convenience"],tags:{brand:"Martin's","brand:wikidata":"Q16997477","brand:wikipedia":"en:McColl's",name:"Martin's",shop:"newsagent"}},"shop/newsagent|Primera":{countryCodes:["nl"],tags:{brand:"Primera","brand:wikidata":"Q2176149","brand:wikipedia":"nl:Primera (winkelketen)",name:"Primera",shop:"newsagent"}},"shop/newsagent|Relay":{matchTags:["shop/kiosk"],tags:{brand:"Relay","brand:wikidata":"Q3424298","brand:wikipedia":"en:Relay (shop)",name:"Relay",shop:"newsagent"}},"shop/newsagent|WHSmith":{countryCodes:["gb"],matchTags:["shop/books","shop/convenience","shop/kiosk","shop/stationery"],tags:{brand:"WHSmith","brand:wikidata":"Q1548712","brand:wikipedia":"en:WHSmith",name:"WHSmith",shop:"newsagent"}},"shop/newsagent|k kiosk":{countryCodes:["ch"],nomatch:["shop/kiosk|k kiosk"],tags:{brand:"k kiosk","brand:wikidata":"Q60381703","brand:wikipedia":"it:K Kiosk",name:"k kiosk",shop:"newsagent"}},"shop/newsagent|Белсоюзпечать":{countryCodes:["by"],matchTags:["shop/kiosk"],nomatch:["shop/newsagent|Витебскоблсоюзпечать","shop/newsagent|Союзпечать"],tags:{brand:"Белсоюзпечать","brand:wikidata":"Q4430611","brand:wikipedia":"ru:Союзпечать",name:"Белсоюзпечать",shop:"newsagent"}},"shop/newsagent|Витебскоблсоюзпечать":{countryCodes:["by"],matchTags:["shop/kiosk"],nomatch:["shop/newsagent|Белсоюзпечать","shop/newsagent|Союзпечать"],tags:{brand:"Витебскоблсоюзпечать","brand:wikidata":"Q4430611","brand:wikipedia":"ru:Союзпечать",name:"Витебскоблсоюзпечать",shop:"newsagent"}},"shop/newsagent|Первая полоса":{countryCodes:["ru"],tags:{brand:"Первая полоса","brand:wikidata":"Q62736412",name:"Первая полоса",shop:"newsagent"}},"shop/newsagent|Роспечать":{tags:{brand:"Роспечать",name:"Роспечать",shop:"newsagent"}},"shop/newsagent|Союзпечать":{countryCodes:["by","kz","ru","ua"],matchTags:["shop/kiosk"],nomatch:["shop/newsagent|Белсоюзпечать","shop/newsagent|Витебскоблсоюзпечать"],tags:{brand:"Союзпечать","brand:wikidata":"Q4430611","brand:wikipedia":"ru:Союзпечать",name:"Союзпечать",shop:"newsagent"}},"shop/newsagent|読売新聞":{countryCodes:["jp"],tags:{brand:"読売新聞","brand:en":"Yomiuri Shimbun","brand:wikidata":"Q645218","brand:wikipedia":"en:Yomiuri Shimbun",name:"読売新聞","name:en":"Yomiuri Shimbun",shop:"newsagent"}},"shop/nutrition_supplements|GNC":{matchNames:["gnc live well"],tags:{brand:"GNC","brand:wikidata":"Q4808595","brand:wikipedia":"en:GNC (store)",name:"GNC",shop:"nutrition_supplements"}},"shop/nutrition_supplements|The Vitamin Shoppe":{countryCodes:["us"],matchTags:["shop/chemist"],tags:{brand:"The Vitamin Shoppe","brand:wikidata":"Q7772938","brand:wikipedia":"en:The Vitamin Shoppe",name:"The Vitamin Shoppe",shop:"nutrition_supplements"}},"shop/nutrition_supplements|Vitamin World":{countryCodes:["us"],tags:{brand:"Vitamin World","brand:wikidata":"Q7936979","brand:wikipedia":"en:Vitamin World",name:"Vitamin World",shop:"nutrition_supplements"}},"shop/optician|Alain Afflelou":{countryCodes:["be","ch","es","fr","pt"],tags:{brand:"Alain Afflelou","brand:wikidata":"Q2829511","brand:wikipedia":"fr:Alain Afflelou (entreprise)",name:"Alain Afflelou",shop:"optician"}},"shop/optician|America's Best Contacts & Eyeglasses":{countryCodes:["us"],tags:{brand:"America's Best Contacts & Eyeglasses","brand:wikidata":"Q4742504","brand:wikipedia":"en:America's Best Contacts & Eyeglasses",name:"America's Best Contacts & Eyeglasses",shop:"optician",short_name:"America's Best"}},"shop/optician|Apollo-Optik":{countryCodes:["de"],nomatch:["amenity/pharmacy|Apollo Pharmacy"],tags:{brand:"Apollo-Optik","brand:wikidata":"Q618940","brand:wikipedia":"de:Apollo-Optik",name:"Apollo-Optik",shop:"optician",short_name:"Apollo"}},"shop/optician|Atol":{countryCodes:["fr"],tags:{brand:"Atol","brand:wikidata":"Q2869542","brand:wikipedia":"fr:Atol (opticien)",name:"Atol",shop:"optician"}},"shop/optician|Boots Opticians":{countryCodes:["gb"],tags:{brand:"Boots Opticians","brand:wikidata":"Q4944037","brand:wikipedia":"en:Boots Opticians",name:"Boots Opticians",shop:"optician",short_name:"Boots"}},"shop/optician|Clarkson Eyecare":{countryCodes:["us"],tags:{brand:"Clarkson Eyecare","brand:wikidata":"Q64027001",healthcare:"optometrist",name:"Clarkson Eyecare",shop:"optician",short_name:"Clarkson"}},"shop/optician|Cohen's Fashion Optical":{countryCodes:["us"],matchNames:["cohen's optical"],tags:{brand:"Cohen's Fashion Optical","brand:wikidata":"Q5141313","brand:wikipedia":"en:Cohen's Fashion Optical",healthcare:"optometrist",name:"Cohen's Fashion Optical",shop:"optician",short_name:"Cohen's"}},"shop/optician|Die Brille":{countryCodes:["de"],tags:{brand:"Die Brille",name:"Die Brille",shop:"optician"}},"shop/optician|Eye Wish":{countryCodes:["nl"],tags:{brand:"Eye Wish","brand:wikidata":"Q62391641",name:"Eye Wish",shop:"optician"}},"shop/optician|Fielmann":{tags:{brand:"Fielmann","brand:wikidata":"Q457822","brand:wikipedia":"en:Fielmann",name:"Fielmann",shop:"optician"}},"shop/optician|GMO":{countryCodes:["cl","co","ec","pe"],tags:{brand:"GMO",name:"GMO",shop:"optician"}},"shop/optician|General Óptica":{countryCodes:["es"],tags:{brand:"General Óptica","brand:wikidata":"Q62391672",name:"General Óptica",shop:"optician"}},"shop/optician|Grand Optical":{countryCodes:["fr"],tags:{brand:"Grand Optical","brand:wikidata":"Q3113677","brand:wikipedia":"fr:Grand Optical",name:"Grand Optical",shop:"optician"}},"shop/optician|Générale d'Optique":{countryCodes:["fr"],tags:{brand:"Générale d'Optique","brand:wikidata":"Q62391701",name:"Générale d'Optique",shop:"optician"}},"shop/optician|Hakim Optical":{countryCodes:["ca"],tags:{brand:"Hakim Optical","brand:wikidata":"Q28232761","brand:wikipedia":"en:Hakim Optical",name:"Hakim Optical",shop:"optician"}},"shop/optician|Hans Anders":{countryCodes:["be","fr","nl"],tags:{brand:"Hans Anders","brand:wikidata":"Q1884976","brand:wikipedia":"nl:Hans Anders",name:"Hans Anders",shop:"optician"}},"shop/optician|Instrumentarium":{countryCodes:["fi"],tags:{brand:"Instrumentarium","brand:wikidata":"Q11864937","brand:wikipedia":"fi:Instrumentarium",name:"Instrumentarium",shop:"optician"}},"shop/optician|Krys":{countryCodes:["fr"],tags:{brand:"Krys","brand:wikidata":"Q3119538","brand:wikipedia":"fr:Krys Group",name:"Krys",shop:"optician"}},"shop/optician|LensCrafters":{countryCodes:["ca","us"],tags:{brand:"LensCrafters","brand:wikidata":"Q6523209","brand:wikipedia":"en:LensCrafters",name:"LensCrafters",shop:"optician"}},"shop/optician|Les Opticiens Mutualistes":{countryCodes:["fr"],tags:{brand:"Les Opticiens Mutualistes","brand:wikidata":"Q18414551","brand:wikipedia":"fr:Les Opticiens Mutualistes",name:"Les Opticiens Mutualistes",shop:"optician"}},"shop/optician|Lissac":{countryCodes:["fr"],tags:{brand:"Lissac","brand:wikidata":"Q63102559",name:"Lissac",shop:"optician"}},"shop/optician|Multiópticas~(Portugal)":{countryCodes:["pt"],tags:{brand:"Multiópticas","brand:wikidata":"Q62391722",name:"Multiópticas",shop:"optician"}},"shop/optician|Multiópticas~(Spain)":{countryCodes:["es"],tags:{brand:"Multiópticas","brand:wikidata":"Q62391719",name:"Multiópticas",shop:"optician"}},"shop/optician|Nissen":{countryCodes:["fi"],tags:{brand:"Nissen",name:"Nissen",shop:"optician"}},"shop/optician|Oakley":{countryCodes:["us"],matchTags:["shop/clothes","shop/sports"],tags:{brand:"Oakley","brand:wikidata":"Q161906","brand:wikipedia":"en:Oakley, Inc.",name:"Oakley",shop:"optician"}},"shop/optician|Oliver Peoples":{tags:{brand:"Oliver Peoples","brand:wikidata":"Q7087746","brand:wikipedia":"en:Oliver Peoples",name:"Oliver Peoples",shop:"optician"}},"shop/optician|Optic 2000":{countryCodes:["ch","fr"],tags:{brand:"Optic 2000","brand:wikidata":"Q3354445","brand:wikipedia":"fr:Optic 2000",name:"Optic 2000",shop:"optician"}},"shop/optician|Optical Center":{tags:{brand:"Optical Center","brand:wikidata":"Q3354448","brand:wikipedia":"fr:Optical Center",name:"Optical Center",shop:"optician"}},"shop/optician|Opticalia":{tags:{brand:"Opticalia","brand:wikidata":"Q62082114",name:"Opticalia",shop:"optician"}},"shop/optician|Pearle Vision":{countryCodes:["ca","us"],tags:{brand:"Pearle Vision","brand:wikidata":"Q2231148","brand:wikipedia":"en:Pearle Vision",name:"Pearle Vision",shop:"optician",short_name:"Pearle"}},"shop/optician|Silmäasema":{countryCodes:["fi"],tags:{brand:"Silmäasema","brand:wikidata":"Q15994200","brand:wikipedia":"fi:Silmäasema",name:"Silmäasema",shop:"optician"}},"shop/optician|Solstice Sunglasses":{tags:{brand:"Solstice Sunglasses",name:"Solstice Sunglasses",shop:"optician",short_name:"Solstice"}},"shop/optician|Specsavers":{tags:{brand:"Specsavers","brand:wikidata":"Q2000610","brand:wikipedia":"en:Specsavers",name:"Specsavers",shop:"optician"}},"shop/optician|Sunglass Hut":{matchTags:["shop/sunglasses"],tags:{brand:"Sunglass Hut","brand:wikidata":"Q136311","brand:wikipedia":"en:Sunglass Hut",name:"Sunglass Hut",shop:"optician"}},"shop/optician|Synoptik":{countryCodes:["se"],tags:{brand:"Synoptik","brand:wikidata":"Q10687541","brand:wikipedia":"sv:Synoptik",name:"Synoptik",shop:"optician"}},"shop/optician|Synsam":{countryCodes:["fi","no","se"],tags:{brand:"Synsam","brand:wikidata":"Q12004589","brand:wikipedia":"sv:Synsam",name:"Synsam",shop:"optician"}},"shop/optician|Target Optical":{countryCodes:["us"],tags:{brand:"Target Optical","brand:wikidata":"Q19903688","brand:wikipedia":"en:Target Optical",name:"Target Optical",shop:"optician"}},"shop/optician|Vision Express":{tags:{brand:"Vision Express","brand:wikidata":"Q7936150","brand:wikipedia":"en:Vision Express",name:"Vision Express",shop:"optician"}},"shop/optician|Visionworks":{countryCodes:["us"],tags:{brand:"Visionworks","brand:wikidata":"Q5422607","brand:wikipedia":"en:Visionworks",name:"Visionworks",shop:"optician"}},"shop/optician|Warby Parker":{countryCodes:["ca","us"],tags:{brand:"Warby Parker","brand:wikidata":"Q7968882","brand:wikipedia":"en:Warby Parker",name:"Warby Parker",shop:"optician"}},"shop/optician|Оптимист Оптика":{countryCodes:["ru"],tags:{brand:"Оптимист Оптика",name:"Оптимист Оптика",shop:"optician"}},"shop/optician|แว่นท็อปเจริญ":{countryCodes:["th"],tags:{brand:"แว่นท็อปเจริญ","brand:th":"แว่นท็อปเจริญ","brand:wikidata":"Q62391732",name:"แว่นท็อปเจริญ","name:th":"แว่นท็อปเจริญ",shop:"optician"}},"shop/optician|メガネストアー":{countryCodes:["jp"],tags:{brand:"メガネストアー","brand:ja":"メガネストアー",name:"メガネストアー","name:ja":"メガネストアー",shop:"optician"}},"shop/optician|メガネスーパー":{countryCodes:["jp"],tags:{brand:"メガネスーパー","brand:ja":"メガネスーパー","brand:wikidata":"Q11343504","brand:wikipedia":"ja:メガネスーパー",name:"メガネスーパー","name:en":"Meganesuper","name:ja":"メガネスーパー",shop:"optician"}},"shop/optician|寶島眼鏡":{countryCodes:["zh"],tags:{brand:"寶島眼鏡","brand:wikidata":"Q62391741",name:"寶島眼鏡",shop:"optician"}},"shop/optician|眼鏡市場":{countryCodes:["jp"],tags:{brand:"眼鏡市場","brand:en":"Megane Ichiba","brand:wikidata":"Q11343506","brand:wikipedia":"ja:メガネトップ",name:"眼鏡市場","name:en":"Megane Ichiba",shop:"optician"}},"shop/outdoor|Bass Pro Shops":{countryCodes:["ca","us"],tags:{brand:"Bass Pro Shops","brand:wikidata":"Q4867953","brand:wikipedia":"en:Bass Pro Shops",name:"Bass Pro Shops",shop:"outdoor"}},"shop/outdoor|Blacks":{countryCodes:["gb"],tags:{brand:"Blacks","brand:wikidata":"Q64822933",name:"Blacks",shop:"outdoor"}},"shop/outdoor|Cabela's":{countryCodes:["ca","us"],tags:{brand:"Cabela's","brand:wikidata":"Q2793714","brand:wikipedia":"en:Cabela's",name:"Cabela's",shop:"outdoor"}},"shop/outdoor|Gander Outdoors":{countryCodes:["us"],matchNames:["gander mountain"],tags:{brand:"Gander Outdoors","brand:wikidata":"Q64357426","brand:wikipedia":"en:Gander Outdoors",name:"Gander Outdoors",shop:"outdoor"}},"shop/outdoor|Jack Wolfskin":{countryCodes:["ch","de","fr"],matchTags:["shop/clothes"],tags:{brand:"Jack Wolfskin","brand:wikidata":"Q536133","brand:wikipedia":"en:Jack Wolfskin",name:"Jack Wolfskin",shop:"outdoor"}},"shop/outdoor|Kathmandu":{countryCodes:["au","nz"],tags:{brand:"Kathmandu","brand:wikidata":"Q1736294","brand:wikipedia":"en:Kathmandu (company)",name:"Kathmandu",shop:"outdoor"}},"shop/outdoor|Millets":{countryCodes:["gb"],tags:{brand:"Millets","brand:wikidata":"Q64822903",name:"Millets",shop:"outdoor"}},"shop/outdoor|Mountain Warehouse":{countryCodes:["gb","pl"],tags:{brand:"Mountain Warehouse","brand:wikidata":"Q6925414","brand:wikipedia":"en:Mountain Warehouse",name:"Mountain Warehouse",shop:"outdoor"}},"shop/outdoor|REI":{countryCodes:["id","us"],tags:{brand:"REI","brand:wikidata":"Q3414933","brand:wikipedia":"en:Recreational Equipment, Inc.",name:"REI",shop:"outdoor"}},"shop/outdoor|Sportsman's Warehouse":{countryCodes:["us"],tags:{brand:"Sportsman's Warehouse","brand:wikidata":"Q7579979","brand:wikipedia":"en:Sportsman's Warehouse",name:"Sportsman's Warehouse",shop:"outdoor"}},"shop/outdoor|Trespass":{countryCodes:["fr","gb","ie"],tags:{brand:"Trespass","brand:wikidata":"Q17035733","brand:wikipedia":"en:Trespass (clothing)",name:"Trespass",shop:"outdoor"}},"shop/outpost|Wildberries":{countryCodes:["by","ru"],matchTags:["shop/clothes"],tags:{brand:"Wildberries","brand:wikidata":"Q24933714","brand:wikipedia":"ru:Wildberries",name:"Wildberries",shop:"outpost"}},"shop/paint|Benjamin Moore":{countryCodes:["ca","us"],tags:{brand:"Benjamin Moore","brand:wikidata":"Q4889038","brand:wikipedia":"en:Benjamin Moore & Co.",name:"Benjamin Moore",shop:"paint"}},"shop/paint|Comex":{tags:{brand:"Comex","brand:wikidata":"Q5151654","brand:wikipedia":"en:Comex Group",name:"Comex",shop:"paint"}},"shop/paint|Jotun":{tags:{brand:"Jotun","brand:wikidata":"Q1778870","brand:wikipedia":"en:Jotun (company)",name:"Jotun",shop:"paint"}},"shop/paint|National Paints":{countryCodes:["ae","qa"],tags:{brand:"National Paints","brand:wikidata":"Q62073521",name:"National Paints",shop:"paint"}},"shop/paint|Sherwin-Williams":{matchNames:["sherwin williams paint store","sherwin williams paints"],tags:{brand:"Sherwin-Williams","brand:wikidata":"Q48881","brand:wikipedia":"en:Sherwin-Williams",name:"Sherwin-Williams",shop:"paint"}},"shop/party|Party City":{countryCodes:["ca","us"],tags:{brand:"Party City","brand:wikidata":"Q7140896","brand:wikipedia":"en:Party City",name:"Party City",shop:"party"}},"shop/pastry|Smallcakes":{countryCodes:["us"],tags:{brand:"Smallcakes","brand:wikidata":"Q62384749",name:"Smallcakes",shop:"pastry"}},"shop/pawnbroker|Cash Converters":{tags:{brand:"Cash Converters","brand:wikidata":"Q5048645","brand:wikipedia":"en:Cash Converters",name:"Cash Converters",shop:"pawnbroker"}},"shop/pawnbroker|Cebuana Lhuillier":{countryCodes:["ph"],tags:{brand:"Cebuana Lhuillier","brand:wikidata":"Q17064661","brand:wikipedia":"en:Cebuana Lhuillier",name:"Cebuana Lhuillier",shop:"pawnbroker"}},"shop/pawnbroker|Loombard":{countryCodes:["pl"],tags:{brand:"Loombard",name:"Loombard",shop:"pawnbroker"}},"shop/pawnbroker|M Lhuillier":{countryCodes:["ph"],tags:{brand:"M Lhuillier",name:"M Lhuillier",shop:"pawnbroker"}},"shop/pawnbroker|Palawan Pawnshop":{countryCodes:["ph"],tags:{brand:"Palawan Pawnshop","brand:wikidata":"Q62391488",name:"Palawan Pawnshop",shop:"pawnbroker"}},"shop/pawnbroker|RD Pawnshop":{countryCodes:["ph"],tags:{brand:"RD Pawnshop",name:"RD Pawnshop",shop:"pawnbroker"}},"shop/pawnbroker|Villarica Pawnshop":{countryCodes:["ph"],tags:{brand:"Villarica Pawnshop","brand:wikidata":"Q62391438",name:"Villarica Pawnshop",shop:"pawnbroker"}},"shop/pawnbroker|Скарбниця":{countryCodes:["ua"],tags:{brand:"Скарбниця",name:"Скарбниця",shop:"pawnbroker"}},"shop/perfumery|Douglas":{countryCodes:["at","ch","de","es","it","nl","pl"],matchTags:["shop/beauty","shop/chemist","shop/cosmetics"],tags:{brand:"Douglas","brand:wikidata":"Q2052213","brand:wikipedia":"de:Parfümerie Douglas",name:"Douglas",shop:"perfumery"}},"shop/perfumery|FAnn":{countryCodes:["cz","sk"],tags:{brand:"FAnn","brand:wikidata":"Q62391353",name:"FAnn",shop:"perfumery"}},"shop/perfumery|ICI PARIS XL":{countryCodes:["be","lu","nl"],tags:{brand:"ICI PARIS XL","brand:wikidata":"Q769749","brand:wikipedia":"en:ICI Paris XL",name:"ICI PARIS XL",shop:"perfumery"}},"shop/perfumery|Marionnaud":{countryCodes:["at","ch","es","fr","it","sk"],matchTags:["shop/beauty","shop/cosmetics"],tags:{brand:"Marionnaud","brand:wikidata":"Q1129073","brand:wikipedia":"fr:Marionnaud",name:"Marionnaud",shop:"perfumery"}},"shop/perfumery|O Boticário":{countryCodes:["br"],tags:{brand:"O Boticário","brand:wikidata":"Q7073219","brand:wikipedia":"en:O Boticário",name:"O Boticário",shop:"perfumery"}},"shop/pet|Das Futterhaus":{countryCodes:["at","de"],tags:{brand:"Das Futterhaus","brand:wikidata":"Q1167914","brand:wikipedia":"de:Das Futterhaus",name:"Das Futterhaus",shop:"pet"}},"shop/pet|Faunatar":{countryCodes:["fi"],tags:{brand:"Faunatar","brand:wikidata":"Q11859415","brand:wikipedia":"fi:Faunatar",name:"Faunatar",shop:"pet"}},"shop/pet|Fressnapf":{countryCodes:["at","ch","de","hu","lu"],tags:{brand:"Fressnapf","brand:wikidata":"Q875796","brand:wikipedia":"en:Fressnapf",name:"Fressnapf",shop:"pet"}},"shop/pet|Global Pet Foods":{countryCodes:["ca"],tags:{brand:"Global Pet Foods","brand:wikidata":"Q57985699",name:"Global Pet Foods",shop:"pet"}},"shop/pet|Maxi Zoo":{countryCodes:["be","ch","dk","fr","ie","it","pl"],tags:{brand:"Maxi Zoo","brand:wikidata":"Q875796","brand:wikipedia":"en:Fressnapf",name:"Maxi Zoo",shop:"pet"}},"shop/pet|Mud Bay":{countryCodes:["us"],tags:{brand:"Mud Bay","brand:wikidata":"Q30324179","brand:wikipedia":"en:Mud Bay pet store",name:"Mud Bay",shop:"pet"}},"shop/pet|Musti ja Mirri":{countryCodes:["fi"],tags:{brand:"Musti ja Mirri","brand:wikidata":"Q11883558","brand:wikipedia":"fi:Musti ja Mirri",name:"Musti ja Mirri",shop:"pet"}},"shop/pet|Pet Food Express":{countryCodes:["us"],tags:{brand:"Pet Food Express","brand:wikidata":"Q7171541","brand:wikipedia":"en:Pet Food Express",name:"Pet Food Express",shop:"pet"}},"shop/pet|Pet Supermarket":{countryCodes:["us"],tags:{brand:"Pet Supermarket","brand:wikidata":"Q61968363",name:"Pet Supermarket",shop:"pet"}},"shop/pet|Pet Supplies Plus":{countryCodes:["us"],tags:{brand:"Pet Supplies Plus","brand:wikidata":"Q7171563","brand:wikipedia":"en:Pet Supplies Plus",name:"Pet Supplies Plus",shop:"pet"}},"shop/pet|Pet Valu":{countryCodes:["ca","us"],tags:{brand:"Pet Valu","brand:wikidata":"Q58009635",name:"Pet Valu",shop:"pet"}},"shop/pet|PetSmart":{countryCodes:["ca","us"],tags:{brand:"PetSmart","brand:wikidata":"Q3307147","brand:wikipedia":"en:PetSmart",name:"PetSmart",shop:"pet"}},"shop/pet|Petco":{countryCodes:["us"],tags:{brand:"Petco","brand:wikidata":"Q7171798","brand:wikipedia":"en:Petco",name:"Petco",shop:"pet"}},"shop/pet|Petland":{countryCodes:["us"],tags:{brand:"Petland","brand:wikidata":"Q17111474","brand:wikipedia":"en:Petland",name:"Petland",shop:"pet"}},"shop/pet|Petland Discounts":{countryCodes:["us"],tags:{brand:"Petland Discounts","brand:wikidata":"Q7178463","brand:wikipedia":"en:Petland Discounts",name:"Petland Discounts",shop:"pet"}},"shop/pet|Pets at Home":{countryCodes:["gb"],tags:{brand:"Pets at Home","brand:wikidata":"Q7179258","brand:wikipedia":"en:Pets at Home",name:"Pets at Home",shop:"pet"}},"shop/pet|Unleashed":{countryCodes:["us"],tags:{alt_name:"Unleashed by Petco",brand:"Unleashed","brand:wikidata":"Q62122874",name:"Unleashed",shop:"pet"}},"shop/pet|Wild Birds Unlimited":{countryCodes:["us"],tags:{brand:"Wild Birds Unlimited","brand:wikidata":"Q8000542","brand:wikipedia":"en:Wild Birds Unlimited",name:"Wild Birds Unlimited",shop:"pet"}},"shop/pet|Бетховен":{countryCodes:["ru"],tags:{brand:"Бетховен","brand:wikidata":"Q62390798",name:"Бетховен",shop:"pet"}},"shop/pet|Четыре лапы":{countryCodes:["kz","ru"],tags:{brand:"Четыре лапы","brand:wikidata":"Q62390783",name:"Четыре лапы",shop:"pet"}},"shop/photo|Kodak Express":{matchNames:["kodak"],tags:{brand:"Kodak Express","brand:wikidata":"Q6425126","brand:wikipedia":"en:Kodak Express",name:"Kodak Express",shop:"photo"}},"shop/photo|Max Spielmann":{countryCodes:["gb"],tags:{brand:"Max Spielmann",name:"Max Spielmann",shop:"photo"}},"shop/photo|カメラのキタムラ":{countryCodes:["jp"],tags:{brand:"カメラのキタムラ","brand:ja":"カメラのキタムラ",name:"カメラのキタムラ","name:ja":"カメラのキタムラ",shop:"photo"}},"shop/second_hand|Value Village":{countryCodes:["ca","us"],tags:{brand:"Value Village","brand:wikidata":"Q7428188","brand:wikipedia":"en:Savers",name:"Value Village",shop:"second_hand"}},"shop/shoes|ABCマート":{countryCodes:["jp"],tags:{brand:"ABCマート","brand:ja":"ABCマート","brand:wikidata":"Q11188787","brand:wikipedia":"en:ABC-Mart",name:"ABCマート","name:ja":"ABCマート",shop:"shoes"}},"shop/shoes|Aldo":{tags:{brand:"Aldo","brand:wikidata":"Q2832297","brand:wikipedia":"en:Aldo Group",name:"Aldo",shop:"shoes"}},"shop/shoes|Allen Edmonds":{countryCodes:["us"],tags:{brand:"Allen Edmonds","brand:wikidata":"Q4731627","brand:wikipedia":"en:Allen Edmonds",name:"Allen Edmonds",shop:"shoes"}},"shop/shoes|André":{countryCodes:["fr"],tags:{brand:"André","brand:wikidata":"Q2847114","brand:wikipedia":"fr:André (chaussure)",name:"André",shop:"shoes"}},"shop/shoes|Bata":{tags:{brand:"Bata","brand:wikidata":"Q688082","brand:wikipedia":"en:Bata (company)",name:"Bata",shop:"shoes"}},"shop/shoes|Belwest":{countryCodes:["by","ru"],tags:{brand:"Belwest",name:"Belwest",shop:"shoes"}},"shop/shoes|Besson Chaussures":{countryCodes:["fr"],tags:{brand:"Besson Chaussures","brand:wikidata":"Q2899930","brand:wikipedia":"fr:Besson Chaussures",name:"Besson Chaussures",shop:"shoes"}},"shop/shoes|Birkenstock":{tags:{brand:"Birkenstock","brand:wikidata":"Q648458","brand:wikipedia":"en:Birkenstock",name:"Birkenstock",shop:"shoes"}},"shop/shoes|Brantano":{countryCodes:["be","gb","lu"],tags:{brand:"Brantano","brand:wikidata":"Q4957616","brand:wikipedia":"en:Brantano Footwear",name:"Brantano",shop:"shoes"}},"shop/shoes|CCC":{tags:{brand:"CCC","brand:wikidata":"Q11788344","brand:wikipedia":"de:CCC (Unternehmen)",name:"CCC",shop:"shoes"}},"shop/shoes|Camper":{tags:{brand:"Camper","brand:wikidata":"Q1030922","brand:wikipedia":"en:Camper (company)",name:"Camper",shop:"shoes"}},"shop/shoes|Chaussea":{countryCodes:["be","es","fr","lu"],tags:{brand:"Chaussea","brand:wikidata":"Q62082044",name:"Chaussea",shop:"shoes"}},"shop/shoes|Christian Louboutin":{countryCodes:["gb"],tags:{brand:"Christian Louboutin",name:"Christian Louboutin",shop:"shoes"}},"shop/shoes|Clarks":{tags:{brand:"Clarks","brand:wikidata":"Q1095857","brand:wikipedia":"en:C. & J. Clark",name:"Clarks",shop:"shoes"}},"shop/shoes|Cole Haan":{countryCodes:["us"],tags:{brand:"Cole Haan","brand:wikidata":"Q4356504","brand:wikipedia":"en:Cole Haan",name:"Cole Haan",shop:"shoes"}},"shop/shoes|Converse":{tags:{brand:"Converse","brand:wikidata":"Q319515","brand:wikipedia":"en:Converse (shoe company)",name:"Converse",shop:"shoes"}},"shop/shoes|Crocs":{tags:{brand:"Crocs","brand:wikidata":"Q926699","brand:wikipedia":"en:Crocs",name:"Crocs",shop:"shoes"}},"shop/shoes|DSW":{countryCodes:["ca","us"],matchNames:["designer shoe warehouse","dsw shoes"],tags:{brand:"DSW","brand:wikidata":"Q5206207","brand:wikipedia":"en:Designer Brands",name:"DSW",shop:"shoes"}},"shop/shoes|Deichmann":{tags:{brand:"Deichmann","brand:wikidata":"Q664543","brand:wikipedia":"en:Deichmann SE",name:"Deichmann",shop:"shoes"}},"shop/shoes|Din sko":{countryCodes:["no","se"],tags:{brand:"Din sko","brand:wikidata":"Q10472869","brand:wikipedia":"sv:Din sko",name:"Din sko",shop:"shoes"}},"shop/shoes|Dosenbach":{countryCodes:["ch"],tags:{brand:"Dosenbach","brand:wikidata":"Q2677329","brand:wikipedia":"de:Dosenbach-Ochsner",name:"Dosenbach",shop:"shoes"}},"shop/shoes|Ecco":{tags:{brand:"Ecco","brand:wikidata":"Q1280255","brand:wikipedia":"en:ECCO",name:"Ecco",shop:"shoes"}},"shop/shoes|FLO":{countryCodes:["al","tr"],tags:{brand:"FLO","brand:wikidata":"Q61994802",name:"FLO",shop:"shoes"}},"shop/shoes|Famous Footwear":{countryCodes:["us"],tags:{brand:"Famous Footwear","brand:wikidata":"Q5433457","brand:wikipedia":"en:Famous Footwear",name:"Famous Footwear",shop:"shoes"}},"shop/shoes|Foot Locker":{tags:{brand:"Foot Locker","brand:wikidata":"Q63335","brand:wikipedia":"en:Foot Locker",name:"Foot Locker",shop:"shoes"}},"shop/shoes|G.H. Bass & Co.":{countryCodes:["gb","us"],tags:{brand:"G.H. Bass & Co.","brand:wikidata":"Q16993893","brand:wikipedia":"en:G.H. Bass & Co.",name:"G.H. Bass & Co.",shop:"shoes"}},"shop/shoes|Gabor":{countryCodes:["de","it"],tags:{brand:"Gabor","brand:wikidata":"Q1488760","brand:wikipedia":"de:Gabor Shoes",name:"Gabor",shop:"shoes"}},"shop/shoes|Geox":{tags:{brand:"Geox","brand:wikidata":"Q588001","brand:wikipedia":"en:Geox",name:"Geox",shop:"shoes"}},"shop/shoes|Görtz":{countryCodes:["de"],tags:{brand:"Görtz","brand:wikidata":"Q1559593","brand:wikipedia":"de:Ludwig Görtz",name:"Görtz",shop:"shoes"}},"shop/shoes|Humanic":{countryCodes:["at","cz","de","hu","ro","sk"],tags:{brand:"Humanic","brand:wikidata":"Q1636668","brand:wikipedia":"en:Humanic",name:"Humanic",shop:"shoes"}},"shop/shoes|Hush Puppies":{tags:{brand:"Hush Puppies","brand:wikidata":"Q1828588","brand:wikipedia":"en:Hush Puppies",name:"Hush Puppies",shop:"shoes"}},"shop/shoes|Johnston & Murphy":{countryCodes:["ca","us"],matchNames:["johnston and murphy"],tags:{brand:"Johnston & Murphy","brand:wikidata":"Q6268615","brand:wikipedia":"en:Johnston & Murphy",name:"Johnston & Murphy",shop:"shoes"}},"shop/shoes|Journeys":{countryCodes:["ca","us"],tags:{brand:"Journeys","brand:wikidata":"Q61994838",name:"Journeys",shop:"shoes"}},"shop/shoes|Kari":{tags:{brand:"Kari","brand:wikidata":"Q47155680","brand:wikipedia":"ru:Kari (компания)",name:"Kari",shop:"shoes"}},"shop/shoes|Kids Foot Locker":{countryCodes:["us"],tags:{brand:"Foot Locker","brand:wikidata":"Q63335","brand:wikipedia":"en:Foot Locker",name:"Kids Foot Locker",shop:"shoes"}},"shop/shoes|La Halle aux Chaussures":{countryCodes:["fr"],tags:{brand:"La Halle aux Chaussures","brand:wikidata":"Q62390731",name:"La Halle aux Chaussures",shop:"shoes"}},"shop/shoes|Lady Foot Locker":{countryCodes:["us"],tags:{brand:"Foot Locker","brand:wikidata":"Q63335","brand:wikipedia":"en:Foot Locker",name:"Lady Foot Locker",shop:"shoes"}},"shop/shoes|Mephisto":{tags:{brand:"Mephisto","brand:wikidata":"Q822975","brand:wikipedia":"fr:Mephisto (chaussure)",name:"Mephisto",shop:"shoes"}},"shop/shoes|Merrell":{countryCodes:["us"],tags:{brand:"Merrell","brand:wikidata":"Q1921997","brand:wikipedia":"en:Merrell (company)",name:"Merrell",shop:"shoes"}},"shop/shoes|Minelli":{tags:{brand:"Minelli","brand:wikidata":"Q61994831",name:"Minelli",shop:"shoes"}},"shop/shoes|New Balance":{tags:{brand:"New Balance","brand:wikidata":"Q742988","brand:wikipedia":"en:New Balance",name:"New Balance",shop:"shoes"}},"shop/shoes|Office":{countryCodes:["de","gb","ie","ro"],tags:{brand:"Office","brand:wikidata":"Q7079121","brand:wikipedia":"en:Office Holdings",name:"Office",shop:"shoes"}},"shop/shoes|Payless ShoeSource":{matchNames:["payless"],tags:{brand:"Payless ShoeSource","brand:wikidata":"Q7156755","brand:wikipedia":"en:Payless ShoeSource",name:"Payless ShoeSource",shop:"shoes"}},"shop/shoes|Quick Schuh":{countryCodes:["at","de"],tags:{brand:"Quick Schuh","brand:wikidata":"Q2123069","brand:wikipedia":"de:Quick Schuh",name:"Quick Schuh",shop:"shoes"}},"shop/shoes|Rack Room Shoes":{countryCodes:["us"],tags:{brand:"Rack Room Shoes","brand:wikidata":"Q17109937","brand:wikipedia":"en:Rack Room Shoes",name:"Rack Room Shoes",shop:"shoes"}},"shop/shoes|Ralf Ringer":{countryCodes:["ru"],tags:{brand:"Ralf Ringer",name:"Ralf Ringer",shop:"shoes"}},"shop/shoes|Red Wing":{countryCodes:["de","gb","nl","us"],matchNames:["red wing shoes"],tags:{brand:"Red Wing","brand:wikidata":"Q934096","brand:wikipedia":"en:Red Wing Shoes",name:"Red Wing",shop:"shoes"}},"shop/shoes|Reno":{countryCodes:["at","ch","de","hu","sk"],tags:{brand:"Reno","brand:wikidata":"Q2144204","brand:wikipedia":"de:Reno (Schuhhandel)",name:"Reno",shop:"shoes"}},"shop/shoes|Respect":{countryCodes:["by","ru","ua"],tags:{brand:"Respect",name:"Respect",shop:"shoes"}},"shop/shoes|Rieker":{tags:{brand:"Rieker","brand:wikidata":"Q2152193","brand:wikipedia":"en:Rieker Shoes",name:"Rieker",shop:"shoes"}},"shop/shoes|Rockport":{tags:{brand:"Rockport","brand:wikidata":"Q4048384","brand:wikipedia":"en:Rockport (company)",name:"Rockport",shop:"shoes"}},"shop/shoes|Salamander":{tags:{brand:"Salamander","brand:wikidata":"Q878354","brand:wikipedia":"de:Salamander (Schuhe)",name:"Salamander",shop:"shoes"}},"shop/shoes|San Marina":{countryCodes:["fr"],tags:{brand:"San Marina","brand:wikidata":"Q3471558","brand:wikipedia":"fr:San Marina",name:"San Marina",shop:"shoes"}},"shop/shoes|Scapino":{countryCodes:["nl"],tags:{brand:"Scapino","brand:wikidata":"Q2298792","brand:wikipedia":"nl:Scapino (winkelketen)",name:"Scapino",shop:"shoes"}},"shop/shoes|Schuh":{countryCodes:["de","gb","gg","ie"],tags:{brand:"Schuh","brand:wikidata":"Q7432952","brand:wikipedia":"en:Schuh",name:"Schuh",shop:"shoes"}},"shop/shoes|Shoe Carnival":{countryCodes:["us"],tags:{brand:"Shoe Carnival","brand:wikidata":"Q7500007","brand:wikipedia":"en:Shoe Carnival",name:"Shoe Carnival",shop:"shoes"}},"shop/shoes|Shoe Zone":{countryCodes:["gb","ie"],tags:{brand:"Shoe Zone","brand:wikidata":"Q7500016","brand:wikipedia":"en:Shoe Zone",name:"Shoe Zone",shop:"shoes"}},"shop/shoes|Siemes Schuhcenter":{countryCodes:["de"],tags:{brand:"Siemes Schuhcenter","brand:wikidata":"Q2800720","brand:wikipedia":"de:Siemes (Unternehmen)",name:"Siemes Schuhcenter",shop:"shoes"}},"shop/shoes|Skechers":{matchNames:["sketchers"],tags:{brand:"Skechers","brand:wikidata":"Q2945643","brand:wikipedia":"en:Skechers",name:"Skechers",shop:"shoes"}},"shop/shoes|Snipes":{countryCodes:["at","ch","de","nl"],tags:{brand:"Snipes",name:"Snipes",shop:"shoes"}},"shop/shoes|Sperry":{countryCodes:["us"],matchNames:["sperry top sider"],tags:{brand:"Sperry","brand:wikidata":"Q7576421","brand:wikipedia":"en:Sperry Top-Sider",name:"Sperry",shop:"shoes"}},"shop/shoes|Steve Madden":{countryCodes:["ca","us"],tags:{brand:"Steve Madden","brand:wikidata":"Q25352034","brand:wikipedia":"en:Steve Madden (company)",name:"Steve Madden",shop:"shoes"}},"shop/shoes|Stride Rite":{countryCodes:["us"],tags:{brand:"Stride Rite","brand:wikidata":"Q2356171","brand:wikipedia":"en:Stride Rite Corporation",name:"Stride Rite",shop:"shoes"}},"shop/shoes|Stuart Weitzman":{countryCodes:["ca","us"],tags:{brand:"Stuart Weitzman",name:"Stuart Weitzman",shop:"shoes"}},"shop/shoes|Tamaris":{countryCodes:["at","be","de","fr","nl"],tags:{brand:"Tamaris","brand:wikidata":"Q61994827",name:"Tamaris",shop:"shoes"}},"shop/shoes|The Shoe Company":{countryCodes:["ca"],tags:{brand:"The Shoe Company","brand:wikidata":"Q7763892","brand:wikipedia":"en:The Shoe Company",name:"The Shoe Company",shop:"shoes"}},"shop/shoes|UGG":{countryCodes:["au","us"],tags:{brand:"UGG","brand:wikidata":"Q1138480","brand:wikipedia":"en:UGG (brand)",name:"UGG",shop:"shoes"}},"shop/shoes|Vans":{tags:{brand:"Vans","brand:wikidata":"Q1135366","brand:wikipedia":"en:Vans",name:"Vans",shop:"shoes"}},"shop/shoes|vanHaren":{countryCodes:["be","nl"],tags:{brand:"vanHaren","brand:wikidata":"Q62390668",name:"vanHaren",shop:"shoes"}},"shop/shoes|Éram":{countryCodes:["be","fr"],tags:{brand:"Éram","brand:wikidata":"Q16684192","brand:wikipedia":"fr:Éram",name:"Éram",shop:"shoes"}},"shop/shoes|Марко":{tags:{brand:"Марко",name:"Марко",shop:"shoes"}},"shop/shoes|ЦентрОбувь":{countryCodes:["by","ru","ua"],tags:{brand:"ЦентрОбувь","brand:wikidata":"Q4504072","brand:wikipedia":"ru:ЦентрОбувь",name:"ЦентрОбувь",shop:"shoes"}},"shop/shoes|Юничел":{countryCodes:["kz","ru"],tags:{brand:"Юничел","brand:wikidata":"Q62390569",name:"Юничел",shop:"shoes"}},"shop/shoes|つるや":{countryCodes:["jp"],tags:{brand:"つるや","brand:en":"Tsuruya","brand:ja":"つるや","brand:wikidata":"Q11272578","brand:wikipedia":"ja:つるや (靴屋)",name:"つるや","name:en":"Tsuruya","name:ja":"つるや",shop:"shoes"}},"shop/shoes|東京靴流通センター":{countryCodes:["jp"],tags:{brand:"東京靴流通センター","brand:en":"Tokyo Shoes Retailing Center","brand:ja":"東京靴流通センター","brand:wikidata":"Q11318515","brand:wikipedia":"ja:チヨダ",name:"東京靴流通センター","name:en":"Tokyo Shoes Retailing Center","name:ja":"東京靴流通センター",shop:"shoes"}},"shop/sports|Academy Sports + Outdoors":{countryCodes:["us"],matchNames:["academy","academy sports and outdoors"],matchTags:["shop/outdoor"],tags:{brand:"Academy Sports + Outdoors","brand:wikidata":"Q4671380","brand:wikipedia":"en:Academy Sports + Outdoors",name:"Academy Sports + Outdoors",shop:"sports"}},"shop/sports|Adidas":{tags:{brand:"Adidas","brand:wikidata":"Q3895","brand:wikipedia":"en:Adidas",name:"Adidas",shop:"sports"}},"shop/sports|Aktiesport":{countryCodes:["nl"],tags:{brand:"Aktiesport","brand:wikidata":"Q57546889",name:"Aktiesport",shop:"sports"}},"shop/sports|American Golf":{countryCodes:["gb","ie"],matchTags:["shop/golf"],tags:{brand:"American Golf","brand:wikidata":"Q62657494",name:"American Golf",shop:"sports",sport:"golf"}},"shop/sports|Big 5 Sporting Goods":{countryCodes:["us"],matchNames:["big 5"],tags:{brand:"Big 5 Sporting Goods","brand:wikidata":"Q4904902","brand:wikipedia":"en:Big 5 Sporting Goods",name:"Big 5 Sporting Goods",shop:"sports"}},"shop/sports|Centauro":{countryCodes:["br"],tags:{brand:"Centauro","brand:wikidata":"Q28679561","brand:wikipedia":"pt:Lojas Centauro",name:"Centauro",shop:"sports"}},"shop/sports|Decathlon":{tags:{brand:"Decathlon","brand:wikidata":"Q509349","brand:wikipedia":"en:Decathlon Group",name:"Decathlon",shop:"sports"}},"shop/sports|Dick's Sporting Goods":{countryCodes:["us"],matchNames:["dicks"],tags:{brand:"Dick's Sporting Goods","brand:wikidata":"Q5272601","brand:wikipedia":"en:Dick's Sporting Goods",name:"Dick's Sporting Goods",shop:"sports"}},"shop/sports|Finish Line":{countryCodes:["us"],tags:{brand:"Finish Line","brand:wikidata":"Q5450341","brand:wikipedia":"en:Finish Line, Inc.",name:"Finish Line",shop:"sports"}},"shop/sports|Hervis":{countryCodes:["at","cz","de","hr","hu","ro","si"],matchNames:["hervis sport","hervis sports"],tags:{brand:"Hervis","brand:wikidata":"Q1614816","brand:wikipedia":"de:Hervis",name:"Hervis",shop:"sports"}},"shop/sports|Hibbett Sports":{countryCodes:["us"],tags:{brand:"Hibbett Sports","brand:wikidata":"Q5750671","brand:wikipedia":"en:Hibbett Sports",name:"Hibbett Sports",shop:"sports"}},"shop/sports|Intersport":{tags:{brand:"Intersport","brand:wikidata":"Q666888","brand:wikipedia":"en:Intersport",name:"Intersport",shop:"sports"}},"shop/sports|JD Sports":{countryCodes:["de","es","fr","gb","ie","nl"],matchNames:["JD"],tags:{brand:"JD Sports","brand:wikidata":"Q6108019","brand:wikipedia":"en:JD Sports",name:"JD Sports",shop:"sports"}},"shop/sports|Marathon Sports":{countryCodes:["bo","ec","pe"],tags:{brand:"Marathon Sports","brand:wikidata":"Q3027516","brand:wikipedia":"es:Marathon Sports",name:"Marathon Sports",shop:"sports"}},"shop/sports|Martes Sport":{countryCodes:["pl"],tags:{brand:"Martes Sport","brand:wikidata":"Q62073490",name:"Martes Sport",shop:"sports"}},"shop/sports|Modell's Sporting Goods":{countryCodes:["us"],matchNames:["modells"],tags:{brand:"Modell's Sporting Goods","brand:wikidata":"Q3317844","brand:wikipedia":"en:Modell's Sporting Goods",name:"Modell's Sporting Goods",shop:"sports"}},"shop/sports|Peloton":{countryCodes:["ca","gb","us"],tags:{brand:"Peloton","brand:wikidata":"Q56276186","brand:wikipedia":"en:Peloton (company)",name:"Peloton",shop:"sports"}},"shop/sports|Play It Again Sports":{countryCodes:["ca","us"],tags:{brand:"Play It Again Sports","brand:wikidata":"Q7203029","brand:wikipedia":"en:Play It Again Sports",name:"Play It Again Sports",shop:"sports"}},"shop/sports|Rebel":{countryCodes:["au","nz"],tags:{brand:"Rebel","brand:wikidata":"Q18636397","brand:wikipedia":"en:Rebel (company)",name:"Rebel",shop:"sports"}},"shop/sports|Sport 2000":{countryCodes:["at","de","fr","nl"],tags:{brand:"Sport 2000","brand:wikidata":"Q262394","brand:wikipedia":"de:Sport 2000",name:"Sport 2000",shop:"sports"}},"shop/sports|Sport Chek":{countryCodes:["ca"],tags:{brand:"Sport Chek","brand:wikidata":"Q3494037","brand:wikipedia":"en:Sport Chek",name:"Sport Chek",shop:"sports"}},"shop/sports|Sporting Life":{countryCodes:["ca"],tags:{brand:"Sporting Life","brand:wikidata":"Q7579583","brand:wikipedia":"en:Sporting Life (retailer)",name:"Sporting Life",shop:"sports"}},"shop/sports|Sportisimo":{countryCodes:["cz","sk"],tags:{brand:"Sportisimo","brand:wikidata":"Q54974273",name:"Sportisimo",shop:"sports"}},"shop/sports|Sports Authority":{tags:{brand:"Sports Authority","brand:wikidata":"Q7579688","brand:wikipedia":"en:Sports Authority",name:"Sports Authority",shop:"sports"}},"shop/sports|Sports Direct":{matchNames:["SportsDirect.com"],tags:{brand:"Sports Direct","brand:wikidata":"Q2913554","brand:wikipedia":"en:Sports Direct",name:"Sports Direct",shop:"sports"}},"shop/sports|Stadium":{countryCodes:["de","dk","fi","se"],tags:{brand:"Stadium","brand:wikidata":"Q4993863","brand:wikipedia":"sv:Stadium (detaljhandelskedja)",name:"Stadium",shop:"sports"}},"shop/sports|XXL":{countryCodes:["fi","no","se"],tags:{brand:"XXL","brand:wikidata":"Q12010840","brand:wikipedia":"no:XXL",name:"XXL",shop:"sports"}},"shop/sports|Спортмастер":{countryCodes:["by","kz","ru","ua"],matchNames:["спортмастер гипер"],tags:{brand:"Спортмастер","brand:en":"Sportmaster","brand:ru":"Спортмастер","brand:wikidata":"Q4438176","brand:wikipedia":"ru:Спортмастер",name:"Спортмастер","name:en":"Sportmaster","name:ru":"Спортмастер",shop:"sports"}},"shop/stationery|Buffetti":{countryCodes:["it"],tags:{brand:"Buffetti",name:"Buffetti",shop:"stationery"}},"shop/stationery|Bureau Vallée":{countryCodes:["fr"],tags:{brand:"Bureau Vallée","brand:wikidata":"Q18385014","brand:wikipedia":"fr:Bureau Vallée",name:"Bureau Vallée",shop:"stationery"}},"shop/stationery|McPaper":{countryCodes:["ch","de"],tags:{brand:"McPaper","brand:wikidata":"Q1915329","brand:wikipedia":"de:McPaper",name:"McPaper",shop:"stationery"}},"shop/stationery|Office Depot":{matchTags:["shop/office_supplies"],tags:{brand:"Office Depot","brand:wikidata":"Q1337797","brand:wikipedia":"en:Office Depot",name:"Office Depot",shop:"stationery"}},"shop/stationery|OfficeMax":{countryCodes:["mx","nz","us"],tags:{brand:"OfficeMax","brand:wikidata":"Q7079111","brand:wikipedia":"en:OfficeMax",name:"OfficeMax",shop:"stationery"}},"shop/stationery|Officeworks":{countryCodes:["au"],tags:{brand:"Officeworks","brand:wikidata":"Q7079486","brand:wikipedia":"en:Officeworks",name:"Officeworks",shop:"stationery"}},"shop/stationery|Pagro":{countryCodes:["at"],tags:{brand:"Pagro","brand:wikidata":"Q57550022",name:"Pagro",shop:"stationery"}},"shop/stationery|Paper Source":{countryCodes:["us"],tags:{brand:"Paper Source","brand:wikidata":"Q25000269","brand:wikipedia":"en:Paper Source",name:"Paper Source",shop:"stationery"}},"shop/stationery|Paperchase":{countryCodes:["gb"],tags:{brand:"Paperchase","brand:wikidata":"Q7132739","brand:wikipedia":"en:Paperchase",name:"Paperchase",shop:"stationery"}},"shop/stationery|Ryman":{countryCodes:["gb"],tags:{brand:"Ryman","brand:wikidata":"Q7385188","brand:wikipedia":"en:Ryman",name:"Ryman",shop:"stationery"}},"shop/stationery|Staples":{matchTags:["shop/office_supplies"],tags:{brand:"Staples","brand:wikidata":"Q785943","brand:wikipedia":"en:Staples Inc.",name:"Staples",shop:"stationery"}},"shop/stationery|Комус":{countryCodes:["ru"],tags:{brand:"Комус","brand:en":"Komus","brand:wikidata":"Q4230314","brand:wikipedia":"en:Komus (company)",name:"Комус","name:en":"Komus",shop:"stationery"}},"shop/storage_rental|Extra Space Storage":{countryCodes:["us"],tags:{brand:"Extra Space Storage","brand:wikidata":"Q5422162","brand:wikipedia":"en:Extra Space Storage",name:"Extra Space Storage",shop:"storage_rental"}},"shop/storage_rental|Public Storage":{countryCodes:["ca","us"],matchTags:["shop/storage_units"],tags:{brand:"Public Storage","brand:wikidata":"Q1156045","brand:wikipedia":"en:Public Storage",name:"Public Storage",shop:"storage_rental"}},"shop/supermarket|8 à Huit":{nomatch:["shop/convenience|8 à Huit"],tags:{brand:"8 à Huit","brand:wikidata":"Q2818601","brand:wikipedia":"fr:8 à Huit",name:"8 à Huit",shop:"supermarket"}},"shop/supermarket|99 Ranch Market":{countryCodes:["us"],matchNames:["99 ranch","ranch 99"],tags:{brand:"99 Ranch Market","brand:wikidata":"Q4646307","brand:wikipedia":"en:99 Ranch Market",cuisine:"asian",name:"99 Ranch Market","name:en":"99 Ranch Market","name:zh-Hans":"大华超级市场","name:zh-Hant":"大華超級市場",shop:"supermarket"}},"shop/supermarket|A&O":{countryCodes:["it"],tags:{brand:"A&O","brand:wikidata":"Q3600279","brand:wikipedia":"it:A&O",name:"A&O",shop:"supermarket"}},"shop/supermarket|A101":{countryCodes:["tr"],tags:{brand:"A101","brand:wikidata":"Q6034496","brand:wikipedia":"tr:A101",name:"A101",shop:"supermarket"}},"shop/supermarket|AD Delhaize":{countryCodes:["be","lu"],tags:{brand:"AD Delhaize","brand:wikidata":"Q1184173","brand:wikipedia":"fr:Delhaize",name:"AD Delhaize",shop:"supermarket"}},"shop/supermarket|ADEG":{countryCodes:["at"],tags:{brand:"ADEG","brand:wikidata":"Q290211","brand:wikipedia":"de:ADEG Österreich",name:"ADEG",shop:"supermarket"}},"shop/supermarket|Acme":{countryCodes:["us"],tags:{brand:"Acme","brand:wikidata":"Q341975","brand:wikipedia":"en:Acme Markets",name:"Acme",shop:"supermarket"}},"shop/supermarket|Ahorramás":{countryCodes:["es"],tags:{brand:"Ahorramás","brand:wikidata":"Q58221883",name:"Ahorramás",shop:"supermarket"}},"shop/supermarket|Albert":{countryCodes:["cz"],tags:{brand:"Albert","brand:wikidata":"Q9144241","brand:wikipedia":"cs:Albert (obchodní řetězec)",name:"Albert",shop:"supermarket"}},"shop/supermarket|Albert Heijn":{countryCodes:["be","nl"],tags:{brand:"Albert Heijn","brand:wikidata":"Q1653985","brand:wikipedia":"nl:Albert Heijn (supermarkt)",name:"Albert Heijn",shop:"supermarket"}},"shop/supermarket|Albertsons":{countryCodes:["us"],matchNames:["albertsons supermarket"],tags:{brand:"Albertsons","brand:wikidata":"Q4712282","brand:wikipedia":"en:Albertsons",name:"Albertsons",shop:"supermarket"}},"shop/supermarket|Alcampo":{countryCodes:["es"],tags:{brand:"Alcampo",name:"Alcampo",shop:"supermarket"}},"shop/supermarket|Aldi":{tags:{brand:"Aldi","brand:wikidata":"Q125054","brand:wikipedia":"en:Aldi",name:"Aldi",shop:"supermarket"}},"shop/supermarket|Aldi Nord":{countryCodes:["de"],tags:{brand:"Aldi Nord","brand:wikidata":"Q41171373","brand:wikipedia":"en:Aldi",name:"Aldi Nord",shop:"supermarket"}},"shop/supermarket|Aldi Süd":{countryCodes:["de"],tags:{brand:"Aldi Süd","brand:wikidata":"Q41171672","brand:wikipedia":"en:Aldi",name:"Aldi Süd",shop:"supermarket"}},"shop/supermarket|Alfamart":{tags:{brand:"Alfamart","brand:wikidata":"Q23745600","brand:wikipedia":"en:Alfamart",name:"Alfamart",shop:"supermarket"}},"shop/supermarket|Alimerka":{countryCodes:["es"],tags:{brand:"Alimerka","brand:wikidata":"Q16482738","brand:wikipedia":"es:Alimerka",name:"Alimerka",shop:"supermarket"}},"shop/supermarket|Alnatura":{countryCodes:["ch","de"],tags:{brand:"Alnatura","brand:wikidata":"Q876811","brand:wikipedia":"en:Alnatura",name:"Alnatura",organic:"only",shop:"supermarket"}},"shop/supermarket|Ara":{countryCodes:["co"],tags:{brand:"Ara",name:"Ara",shop:"supermarket"}},"shop/supermarket|Asda":{countryCodes:["gb"],nomatch:["amenity/fuel|Asda"],tags:{brand:"Asda","brand:wikidata":"Q297410","brand:wikipedia":"en:Asda",name:"Asda",shop:"supermarket"}},"shop/supermarket|Atacadão":{countryCodes:["br"],tags:{brand:"Atacadão","brand:wikidata":"Q2868739","brand:wikipedia":"en:Atacadão",name:"Atacadão",shop:"supermarket"}},"shop/supermarket|Auchan":{nomatch:["amenity/fuel|Auchan"],tags:{brand:"Auchan","brand:wikidata":"Q758603","brand:wikipedia":"en:Auchan",name:"Auchan",shop:"supermarket"}},"shop/supermarket|Auchan Drive":{countryCodes:["fr","lu"],tags:{brand:"Auchan Drive",name:"Auchan Drive",shop:"supermarket"}},"shop/supermarket|BI-LO":{countryCodes:["us"],tags:{brand:"BI-LO","brand:wikidata":"Q4835620","brand:wikipedia":"en:BI-LO (United States)",name:"BI-LO",shop:"supermarket"}},"shop/supermarket|BM":{countryCodes:["es"],tags:{brand:"BM","brand:wikidata":"Q62073462",name:"BM",shop:"supermarket"}},"shop/supermarket|Biedronka":{countryCodes:["pl"],tags:{brand:"Biedronka","brand:wikidata":"Q857182","brand:wikipedia":"pl:Biedronka (sieć handlowa)",name:"Biedronka",shop:"supermarket"}},"shop/supermarket|Big Bazaar":{countryCodes:["in"],tags:{brand:"Big Bazaar","brand:wikidata":"Q3631008","brand:wikipedia":"en:Big Bazaar",name:"Big Bazaar",shop:"supermarket"}},"shop/supermarket|Big C":{countryCodes:["th","vn"],tags:{brand:"Big C","brand:wikidata":"Q858665","brand:wikipedia":"en:Big C",name:"Big C",shop:"supermarket"}},"shop/supermarket|Billa":{tags:{brand:"Billa","brand:wikidata":"Q537781","brand:wikipedia":"en:Billa (supermarket)",name:"Billa",shop:"supermarket"}},"shop/supermarket|Bim":{countryCodes:["ma","tr"],tags:{brand:"Bim","brand:wikidata":"Q1022075","brand:wikipedia":"en:Bim (company)",name:"Bim",shop:"supermarket"}},"shop/supermarket|Bingo":{countryCodes:["ba"],tags:{brand:"Bingo","brand:wikidata":"Q16842066","brand:wikipedia":"bs:Bingo (kompanija)",name:"Bingo",shop:"supermarket"}},"shop/supermarket|Bio C' Bon":{countryCodes:["es","fr"],tags:{brand:"Bio C' Bon",name:"Bio C' Bon",shop:"supermarket"}},"shop/supermarket|Bio Company":{countryCodes:["de"],tags:{brand:"Bio Company","brand:wikidata":"Q864179","brand:wikipedia":"de:Bio Company",name:"Bio Company",organic:"only",shop:"supermarket"}},"shop/supermarket|Biocoop":{countryCodes:["fr"],tags:{brand:"Biocoop","brand:wikidata":"Q2904039","brand:wikipedia":"fr:Biocoop",name:"Biocoop",shop:"supermarket"}},"shop/supermarket|Bodega Aurrera":{tags:{brand:"Bodega Aurrera","brand:wikidata":"Q3365858","brand:wikipedia":"en:Bodega Aurrerá",name:"Bodega Aurrera",shop:"supermarket"}},"shop/supermarket|Bodega Aurrera Express":{countryCodes:["mx"],tags:{brand:"Bodega Aurrera Express",name:"Bodega Aurrera Express",shop:"supermarket"}},"shop/supermarket|Bonpreu":{countryCodes:["es"],tags:{brand:"Bonpreu",name:"Bonpreu",shop:"supermarket"}},"shop/supermarket|Bravo":{countryCodes:["us"],tags:{brand:"Bravo","brand:wikidata":"Q16985159","brand:wikipedia":"en:Bravo (supermarket)",name:"Bravo",shop:"supermarket"}},"shop/supermarket|Brookshire Brothers":{countryCodes:["us"],tags:{brand:"Brookshire Brothers","brand:wikidata":"Q4975084","brand:wikipedia":"en:Brookshire Brothers",name:"Brookshire Brothers",shop:"supermarket"}},"shop/supermarket|Brookshire's":{countryCodes:["us"],tags:{brand:"Brookshire's","brand:wikidata":"Q4975085","brand:wikipedia":"en:Brookshire Grocery Company",name:"Brookshire's",shop:"supermarket"}},"shop/supermarket|Budgens":{countryCodes:["gb"],nomatch:["shop/convenience|Budgens"],tags:{brand:"Budgens","brand:wikidata":"Q4985016","brand:wikipedia":"en:Budgens",name:"Budgens",shop:"supermarket"}},"shop/supermarket|Bulk Barn":{countryCodes:["ca"],tags:{brand:"Bulk Barn","brand:wikidata":"Q4996466",name:"Bulk Barn",shop:"supermarket"}},"shop/supermarket|Bunnpris":{countryCodes:["no"],tags:{brand:"Bunnpris","brand:wikidata":"Q1774634","brand:wikipedia":"en:Bunnpris",name:"Bunnpris",shop:"supermarket"}},"shop/supermarket|C-Town Supermarkets":{countryCodes:["us"],tags:{brand:"C-Town Supermarkets","brand:wikidata":"Q5005929","brand:wikipedia":"en:C-Town Supermarkets",name:"C-Town",shop:"supermarket"}},"shop/supermarket|CBA":{tags:{brand:"CBA","brand:wikidata":"Q779845","brand:wikipedia":"en:CBA (food retail)",name:"CBA",shop:"supermarket"}},"shop/supermarket|COOP Jednota":{countryCodes:["cz","sk"],matchNames:["jednota"],nomatch:["shop/convenience|COOP Jednota"],tags:{brand:"COOP Jednota","brand:wikidata":"Q41629254","brand:wikipedia":"sk:COOP Jednota Slovensko",name:"COOP Jednota",shop:"supermarket"}},"shop/supermarket|Caprabo":{countryCodes:["ad","es"],tags:{brand:"Caprabo","brand:wikidata":"Q1980781","brand:wikipedia":"en:Caprabo",name:"Caprabo",shop:"supermarket"}},"shop/supermarket|Cardenas":{countryCodes:["us"],matchNames:["mi pueblo","mi pueblo food center"],tags:{brand:"Cardenas","brand:wikidata":"Q64149543","brand:wikipedia":"en:Cardenas (supermarket)",cuisine:"latin_american",name:"Cardenas",shop:"supermarket"}},"shop/supermarket|Cargills Food City~(Sri Lanka)":{countryCodes:["lk"],nomatch:["shop/supermarket|Food City~(USA)"],tags:{brand:"Cargills Food City","brand:wikidata":"Q58353955",name:"Cargills Food City",shop:"supermarket"}},"shop/supermarket|Carrefour":{nomatch:["amenity/fuel|Carrefour","shop/convenience|Carrefour Express"],tags:{brand:"Carrefour","brand:wikidata":"Q217599","brand:wikipedia":"fr:Carrefour (enseigne)",name:"Carrefour",shop:"supermarket"}},"shop/supermarket|Carrefour City":{countryCodes:["be","fr"],matchTags:["shop/convenience"],tags:{brand:"Carrefour City","brand:wikidata":"Q2940187","brand:wikipedia":"fr:Carrefour City",name:"Carrefour City",shop:"supermarket"}},"shop/supermarket|Carrefour Contact":{countryCodes:["fr"],tags:{brand:"Carrefour Contact","brand:wikidata":"Q2940188","brand:wikipedia":"fr:Carrefour Contact",name:"Carrefour Contact",shop:"supermarket"}},"shop/supermarket|Carrefour Market":{nomatch:["amenity/fuel|Carrefour Market"],tags:{brand:"Carrefour Market","brand:wikidata":"Q2689639","brand:wikipedia":"fr:Carrefour Market",name:"Carrefour Market",shop:"supermarket"}},"shop/supermarket|Carulla":{countryCodes:["co"],tags:{brand:"Carulla","brand:wikidata":"Q5047480","brand:wikipedia":"en:Carulla",name:"Carulla",shop:"supermarket"}},"shop/supermarket|Casino":{tags:{brand:"Casino",name:"Casino",shop:"supermarket"}},"shop/supermarket|Centra":{tags:{brand:"Centra",name:"Centra",shop:"supermarket"}},"shop/supermarket|Centre Commercial E. Leclerc":{countryCodes:["fr","pl"],tags:{brand:"Centre Commercial E. Leclerc","brand:wikidata":"Q1273376","brand:wikipedia":"fr:E.Leclerc",name:"Centre Commercial E. Leclerc",shop:"supermarket"}},"shop/supermarket|Chata Polska":{countryCodes:["pl"],nomatch:["shop/convenience|Chata Polska"],tags:{brand:"Chata Polska","brand:wikidata":"Q61994406",name:"Chata Polska",shop:"supermarket"}},"shop/supermarket|Checkers":{countryCodes:["bw","na","za"],nomatch:["amenity/fast_food|Checkers"],tags:{brand:"Checkers","brand:wikidata":"Q5089126","brand:wikipedia":"en:Checkers (supermarket chain)",name:"Checkers",shop:"supermarket"}},"shop/supermarket|Chedraui":{countryCodes:["mx"],tags:{brand:"Chedraui","brand:wikidata":"Q2961952","brand:wikipedia":"en:Chedraui",name:"Chedraui",shop:"supermarket"}},"shop/supermarket|City Market":{tags:{brand:"City Market","brand:wikidata":"Q5123299","brand:wikipedia":"en:City Market (US grocery store chain)",name:"City Market",shop:"supermarket"}},"shop/supermarket|Co-op~(Canada)":{countryCodes:["ca"],nomatch:["amenity/fuel|Co-op~(Canada)","shop/convenience|Co-op~(Canada)","shop/convenience|Coop~(Schweiz)","shop/convenience|The Co-operative Food~(UK)","shop/supermarket|Coop~(Schweiz)","shop/supermarket|The Co-operative Food~(UK)"],tags:{brand:"Federated Co-operatives","brand:wikidata":"Q5440676","brand:wikipedia":"en:Federated Co-operatives",name:"Co-op",shop:"supermarket"}},"shop/supermarket|Coles":{countryCodes:["au","gb"],tags:{brand:"Coles","brand:wikidata":"Q1108172","brand:wikipedia":"en:Coles Supermarkets",name:"Coles",shop:"supermarket"}},"shop/supermarket|Colruyt":{countryCodes:["be","fr","lu"],tags:{brand:"Colruyt","brand:wikidata":"Q2363991","brand:wikipedia":"en:Colruyt (supermarket)",name:"Colruyt",shop:"supermarket"}},"shop/supermarket|Combi":{countryCodes:["de"],tags:{brand:"Combi","brand:wikidata":"Q1113618","brand:wikipedia":"de:Combi (Einkaufsmarkt)",name:"Combi",shop:"supermarket"}},"shop/supermarket|Comercial Mexicana":{countryCodes:["mx"],tags:{brand:"Comercial Mexicana","brand:wikidata":"Q2985173","brand:wikipedia":"es:Comercial Mexicana",name:"Comercial Mexicana",shop:"supermarket"}},"shop/supermarket|Conad":{countryCodes:["al","it"],tags:{brand:"Conad","brand:wikidata":"Q639075","brand:wikipedia":"it:Conad",name:"Conad",shop:"supermarket"}},"shop/supermarket|Conad City":{countryCodes:["it"],tags:{brand:"Conad City","brand:wikidata":"Q57543102",name:"Conad City",shop:"supermarket"}},"shop/supermarket|Condis":{countryCodes:["es"],tags:{brand:"Condis","brand:wikidata":"Q57417581",name:"Condis",shop:"supermarket"}},"shop/supermarket|Consum":{countryCodes:["es"],tags:{brand:"Consum","brand:wikidata":"Q8350308","brand:wikipedia":"es:Consum",name:"Consum",shop:"supermarket"}},"shop/supermarket|Continente":{countryCodes:["pt"],tags:{brand:"Continente","brand:wikidata":"Q2995683","brand:wikipedia":"en:Continente (Supermarket)",name:"Continente",shop:"supermarket"}},"shop/supermarket|Coop Konsum":{countryCodes:["se"],tags:{brand:"Coop Konsum",name:"Coop Konsum",shop:"supermarket"}},"shop/supermarket|Coop Prix":{countryCodes:["no"],tags:{brand:"Coop Prix","brand:wikidata":"Q5167705","brand:wikipedia":"no:Coop Prix",name:"Coop Prix",shop:"supermarket"}},"shop/supermarket|Coop~(Schweiz)":{countryCodes:["ch"],nomatch:["amenity/fuel|Co-op~(Canada)","shop/convenience|Co-op~(Canada)","shop/convenience|Coop~(Schweiz)","shop/convenience|The Co-operative Food~(UK)","shop/supermarket|Co-op~(Canada)","shop/supermarket|The Co-operative Food~(UK)"],tags:{brand:"Coop","brand:wikidata":"Q432564","brand:wikipedia":"de:Coop (Schweiz)",name:"Coop",shop:"supermarket"}},"shop/supermarket|Cora":{countryCodes:["be","fr","lu","ro"],tags:{brand:"Cora","brand:wikidata":"Q686643","brand:wikipedia":"en:Cora (hypermarket)",name:"Cora",shop:"supermarket"}},"shop/supermarket|Costcutter":{nomatch:["shop/convenience|Costcutter"],tags:{brand:"Costcutter","brand:wikidata":"Q5175072","brand:wikipedia":"en:Costcutter",name:"Costcutter",shop:"supermarket"}},"shop/supermarket|Coto":{countryCodes:["ar"],tags:{brand:"Coto","brand:wikidata":"Q5175411","brand:wikipedia":"es:Coto (supermercado)",name:"Coto",shop:"supermarket"}},"shop/supermarket|Countdown":{countryCodes:["nz"],tags:{brand:"Countdown","brand:wikidata":"Q5176845","brand:wikipedia":"en:Countdown (supermarket)",name:"Countdown",shop:"supermarket"}},"shop/supermarket|Covirán":{countryCodes:["es","pt"],tags:{brand:"Covirán",name:"Covirán",shop:"supermarket"}},"shop/supermarket|Crai":{countryCodes:["ch","it"],tags:{brand:"Crai",name:"Crai",shop:"supermarket"}},"shop/supermarket|Cub Foods":{countryCodes:["us"],tags:{brand:"Cub Foods","brand:wikidata":"Q5191916","brand:wikipedia":"en:Cub Foods",name:"Cub Foods",shop:"supermarket"}},"shop/supermarket|D'Agostino":{countryCodes:["us"],tags:{brand:"D'Agostino","brand:wikidata":"Q20656844","brand:wikipedia":"en:D'Agostino Supermarkets",name:"D'Agostino",shop:"supermarket"}},"shop/supermarket|D1":{countryCodes:["co"],tags:{brand:"D1","brand:wikidata":"Q43403418","brand:wikipedia":"es:Tiendas D1",name:"D1",shop:"supermarket"}},"shop/supermarket|Dagli'Brugsen":{countryCodes:["dk"],tags:{brand:"Dagli'Brugsen","brand:wikidata":"Q12307017","brand:wikipedia":"en:Dagli'Brugsen",name:"Dagli'Brugsen",shop:"supermarket"}},"shop/supermarket|Decò":{countryCodes:["it"],tags:{brand:"Decò",name:"Decò",shop:"supermarket"}},"shop/supermarket|Deen":{countryCodes:["nl"],tags:{brand:"Deen","brand:wikidata":"Q13571727","brand:wikipedia":"nl:Deen (supermarkt)",name:"Deen",shop:"supermarket"}},"shop/supermarket|Delhaize":{countryCodes:["be","lu"],tags:{brand:"Delhaize","brand:wikidata":"Q1184173","brand:wikipedia":"fr:Delhaize",name:"Delhaize",shop:"supermarket"}},"shop/supermarket|Delikatesy Centrum":{countryCodes:["pl"],nomatch:["shop/convenience|Delikatesy Centrum"],tags:{brand:"Delikatesy Centrum","brand:wikidata":"Q11693824","brand:wikipedia":"pl:Delikatesy Centrum",name:"Delikatesy Centrum",shop:"supermarket"}},"shop/supermarket|Denner":{countryCodes:["ch","li"],tags:{brand:"Denner","brand:wikidata":"Q379911","brand:wikipedia":"en:Denner (supermarket)",name:"Denner",shop:"supermarket"}},"shop/supermarket|Despar":{countryCodes:["it"],tags:{brand:"Spar","brand:wikidata":"Q610492","brand:wikipedia":"en:Spar (retailer)",name:"Despar",shop:"supermarket"}},"shop/supermarket|Despensa Familiar":{countryCodes:["gt","hn","sv"],tags:{brand:"Despensa Familiar","brand:wikidata":"Q61994849",name:"Despensa Familiar",shop:"supermarket"}},"shop/supermarket|Dia":{matchNames:["supermercado dia"],tags:{brand:"Dia","brand:wikidata":"Q925132","brand:wikipedia":"es:Supermercados DIA",name:"Dia",shop:"supermarket"}},"shop/supermarket|Dia Market":{tags:{brand:"Dia Market","brand:wikidata":"Q925132","brand:wikipedia":"es:Supermercados DIA",name:"Dia Market",shop:"supermarket"}},"shop/supermarket|Dino":{countryCodes:["pl"],tags:{brand:"Dino","brand:wikidata":"Q11694239","brand:wikipedia":"pl:Dino Polska",name:"Dino",shop:"supermarket"}},"shop/supermarket|Dirk van den Broek":{countryCodes:["nl"],tags:{brand:"Dirk van den Broek","brand:wikidata":"Q17502722","brand:wikipedia":"en:Dirk (supermarket)",name:"Dirk van den Broek",shop:"supermarket"}},"shop/supermarket|Disco~(Argentina)":{countryCodes:["ar"],tags:{brand:"Disco","brand:wikidata":"Q6135978","brand:wikipedia":"es:Disco (supermercado de Argentina)",name:"Disco",shop:"supermarket"}},"shop/supermarket|Disco~(Uruguay)":{countryCodes:["uy"],tags:{brand:"Disco","brand:wikidata":"Q16636819","brand:wikipedia":"es:Disco (supermercado de Uruguay)",name:"Disco",shop:"supermarket"}},"shop/supermarket|Diska":{countryCodes:["de"],tags:{brand:"Diska","brand:wikidata":"Q62390177",name:"Diska",shop:"supermarket"}},"shop/supermarket|Dunnes Stores":{countryCodes:["gb","ie"],tags:{brand:"Dunnes Stores","brand:wikidata":"Q1266203","brand:wikipedia":"en:Dunnes Stores",name:"Dunnes Stores",shop:"supermarket"}},"shop/supermarket|E-Center":{countryCodes:["de"],tags:{brand:"E-Center","brand:wikidata":"Q701755","brand:wikipedia":"en:Edeka",name:"E-Center",shop:"supermarket"}},"shop/supermarket|E. Leclerc":{countryCodes:["es","fr","pl","pt"],tags:{brand:"E. Leclerc","brand:wikidata":"Q1273376","brand:wikipedia":"en:E.Leclerc",name:"E. Leclerc",shop:"supermarket"}},"shop/supermarket|E. Leclerc Drive":{countryCodes:["fr"],tags:{brand:"E. Leclerc Drive","brand:wikidata":"Q1273376","brand:wikipedia":"fr:E.Leclerc",name:"E. Leclerc Drive",shop:"supermarket"}},"shop/supermarket|EMTÉ":{countryCodes:["nl"],tags:{brand:"EMTÉ","brand:wikidata":"Q3119122","brand:wikipedia":"en:EMTÉ",name:"EMTÉ",shop:"supermarket"}},"shop/supermarket|Edeka":{countryCodes:["de"],matchNames:["edeka neukauf"],tags:{brand:"Edeka","brand:wikidata":"Q701755","brand:wikipedia":"en:Edeka",name:"Edeka",shop:"supermarket"}},"shop/supermarket|Eko":{countryCodes:["pl"],nomatch:["amenity/fuel|EKO~(Canada)","amenity/fuel|EKO~(Greece)"],tags:{brand:"Eko","brand:wikidata":"Q9251859","brand:wikipedia":"pl:Eko Holding",name:"Eko",shop:"supermarket"}},"shop/supermarket|Ekom":{countryCodes:["it"],tags:{brand:"Ekom","brand:wikidata":"Q62073442",name:"Ekom",shop:"supermarket"}},"shop/supermarket|Ekono":{countryCodes:["cl"],tags:{brand:"Ekono","brand:wikidata":"Q2842729","brand:wikipedia":"es:Ekono",name:"Ekono",shop:"supermarket"}},"shop/supermarket|Eroski":{countryCodes:["es","gi"],matchNames:["charter","eroski center"],tags:{brand:"Eroski","brand:wikidata":"Q1361349","brand:wikipedia":"en:Eroski",name:"Eroski",shop:"supermarket"}},"shop/supermarket|Eroski City":{countryCodes:["es"],tags:{brand:"Eroski City",name:"Eroski City",shop:"supermarket"}},"shop/supermarket|Esselunga":{countryCodes:["it"],tags:{brand:"Esselunga","brand:wikidata":"Q1059636","brand:wikipedia":"en:Esselunga",name:"Esselunga",shop:"supermarket"}},"shop/supermarket|EuroSpin":{countryCodes:["it","si"],tags:{brand:"EuroSpin","brand:wikidata":"Q1374674","brand:wikipedia":"it:Eurospin",name:"EuroSpin",shop:"supermarket"}},"shop/supermarket|Eurospar":{tags:{brand:"Eurospar","brand:wikidata":"Q12309283","brand:wikipedia":"da:Eurospar",name:"Eurospar",shop:"supermarket"}},"shop/supermarket|Extra":{matchNames:["coop extra"],matchTags:["shop/convenience"],tags:{brand:"Extra","brand:wikidata":"Q11964085","brand:wikipedia":"no:Extra (Coop)",name:"Extra",shop:"supermarket"}},"shop/supermarket|Famila":{countryCodes:["de","it"],tags:{brand:"Famila","brand:wikidata":"Q1395108","brand:wikipedia":"de:Famila",name:"Famila",shop:"supermarket"}},"shop/supermarket|Fareway":{countryCodes:["us"],tags:{brand:"Fareway","brand:wikidata":"Q5434998","brand:wikipedia":"en:Fareway",name:"Fareway",shop:"supermarket"}},"shop/supermarket|Farm Boy":{countryCodes:["ca"],matchTags:["shop/greengrocer"],tags:{brand:"Farm Boy","brand:wikidata":"Q5435469","brand:wikipedia":"en:Farm Boy",name:"Farm Boy",shop:"supermarket"}},"shop/supermarket|Farmfoods":{countryCodes:["gb","sk"],tags:{brand:"Farmfoods","brand:wikidata":"Q5435841","brand:wikipedia":"en:Farmfoods",name:"Farmfoods",shop:"supermarket"}},"shop/supermarket|Feneberg":{countryCodes:["at","de"],tags:{brand:"Feneberg","brand:wikidata":"Q5345378","brand:wikipedia":"de:Feneberg Lebensmittel",name:"Feneberg",shop:"supermarket"}},"shop/supermarket|Food 4 Less":{countryCodes:["us"],tags:{brand:"Food 4 Less","brand:wikidata":"Q5465282","brand:wikipedia":"en:Food 4 Less",name:"Food 4 Less",shop:"supermarket"}},"shop/supermarket|Food Basics":{tags:{brand:"Food Basics","brand:wikidata":"Q5465300","brand:wikipedia":"en:Food Basics",name:"Food Basics",shop:"supermarket"}},"shop/supermarket|Food City~(USA)":{countryCodes:["us"],nomatch:["shop/supermarket|Cargills Food City~(Sri Lanka)"],tags:{brand:"Food City","brand:wikidata":"Q16981107","brand:wikipedia":"en:Food City (K-VA-T)",name:"Food City",shop:"supermarket"}},"shop/supermarket|Food Lion":{countryCodes:["es","us"],tags:{brand:"Food Lion","brand:wikidata":"Q1435950","brand:wikipedia":"en:Food Lion",name:"Food Lion",shop:"supermarket"}},"shop/supermarket|FoodLand~(USA)":{countryCodes:["us"],nomatch:["shop/supermarket|Foodland~(Australia)","shop/supermarket|Foodland~(Canada)","shop/supermarket|Foodland~(Hawaii)"],tags:{brand:"FoodLand","brand:wikidata":"Q5465271","brand:wikipedia":"en:FoodLand",name:"FoodLand",shop:"supermarket"}},"shop/supermarket|FoodMaxx":{countryCodes:["us"],tags:{brand:"FoodMaxx","brand:wikidata":"Q61894844",name:"FoodMaxx",shop:"supermarket"}},"shop/supermarket|Foodland~(Australia)":{countryCodes:["au"],nomatch:["shop/supermarket|Foodland~(Canada)","shop/supermarket|Foodland~(Hawaii)","shop/supermarket|Foodland~(USA)"],tags:{brand:"Foodland","brand:wikidata":"Q5465555","brand:wikipedia":"en:Foodland (South Australia)",name:"Foodland",shop:"supermarket"}},"shop/supermarket|Foodland~(Canada)":{countryCodes:["ca"],nomatch:["shop/supermarket|Foodland~(Australia)","shop/supermarket|Foodland~(Hawaii)","shop/supermarket|Foodland~(USA)"],tags:{brand:"Foodland","brand:wikidata":"Q5465554","brand:wikipedia":"en:Foodland (Canada)",name:"Foodland",shop:"supermarket"}},"shop/supermarket|Foodland~(Hawaii)":{countryCodes:["us"],nomatch:["shop/supermarket|Foodland~(Australia)","shop/supermarket|Foodland~(Canada)","shop/supermarket|Foodland~(USA)"],tags:{brand:"Foodland","brand:wikidata":"Q5465560","brand:wikipedia":"en:Foodland Hawaii",name:"Foodland",shop:"supermarket"}},"shop/supermarket|Foodworks":{countryCodes:["au"],tags:{brand:"Foodworks","brand:wikidata":"Q5465579","brand:wikipedia":"en:Foodworks",name:"Foodworks",shop:"supermarket"}},"shop/supermarket|Four Square":{tags:{brand:"Four Square",name:"Four Square",shop:"supermarket"}},"shop/supermarket|Fred Meyer":{countryCodes:["us"],matchTags:["shop/department_store"],tags:{brand:"Fred Meyer","brand:wikidata":"Q5495932","brand:wikipedia":"en:Fred Meyer",name:"Fred Meyer",shop:"supermarket"}},"shop/supermarket|Fresh":{tags:{brand:"Fresh","brand:wikidata":"Q50737403","brand:wikipedia":"sk:Fresh",name:"Fresh",shop:"supermarket"}},"shop/supermarket|Fresh Thyme":{countryCodes:["us"],matchNames:["fresh thyme farmers market"],tags:{brand:"Fresh Thyme","brand:wikidata":"Q64132791",name:"Fresh Thyme",shop:"supermarket"}},"shop/supermarket|FreshCo":{countryCodes:["ca"],tags:{brand:"FreshCo","brand:wikidata":"Q5502915","brand:wikipedia":"en:FreshCo",name:"FreshCo",shop:"supermarket"}},"shop/supermarket|Froiz":{countryCodes:["es","pt"],tags:{brand:"Froiz","brand:wikidata":"Q17070775","brand:wikipedia":"en:Froiz",name:"Froiz",shop:"supermarket"}},"shop/supermarket|Føtex":{countryCodes:["dk"],tags:{brand:"Føtex","brand:wikidata":"Q1480395","brand:wikipedia":"en:Føtex",name:"Føtex",shop:"supermarket"}},"shop/supermarket|G20":{countryCodes:["fr"],tags:{brand:"G20","brand:wikidata":"Q3504731","brand:wikipedia":"fr:Supermarchés G20",name:"G20",shop:"supermarket"}},"shop/supermarket|GBarbosa":{countryCodes:["br"],tags:{brand:"GBarbosa","brand:wikidata":"Q10287817","brand:wikipedia":"pt:GBarbosa",name:"GBarbosa",shop:"supermarket"}},"shop/supermarket|Gadis":{countryCodes:["es"],tags:{brand:"Gadis","brand:wikidata":"Q12389151","brand:wikipedia":"gl:Gadisa",name:"Gadis",shop:"supermarket"}},"shop/supermarket|Giant Eagle":{countryCodes:["us"],tags:{brand:"Giant Eagle","brand:wikidata":"Q1522721","brand:wikipedia":"en:Giant Eagle",name:"Giant Eagle",shop:"supermarket"}},"shop/supermarket|Giant~(Carlisle)":{countryCodes:["us"],nomatch:["shop/bicycle|Giant"],tags:{brand:"Giant","brand:wikidata":"Q5558332","brand:wikipedia":"en:Giant Food Stores",name:"Giant",shop:"supermarket"}},"shop/supermarket|Giant~(Landover)":{countryCodes:["us"],nomatch:["shop/bicycle|Giant"],tags:{brand:"Giant","brand:wikidata":"Q5558336","brand:wikipedia":"en:Giant Food (Landover)",name:"Giant",shop:"supermarket"}},"shop/supermarket|Globus":{tags:{brand:"Globus","brand:wikidata":"Q457503","brand:wikipedia":"en:Globus (hypermarket)",name:"Globus",shop:"supermarket"}},"shop/supermarket|Gordon Food Service":{countryCodes:["ca","us"],tags:{brand:"Gordon Food Service","brand:wikidata":"Q1538006","brand:wikipedia":"en:Gordon Food Service",name:"Gordon Food Service",shop:"supermarket"}},"shop/supermarket|Grand Frais":{countryCodes:["fr"],tags:{brand:"Grand Frais","brand:wikidata":"Q3114675","brand:wikipedia":"fr:Grand Frais",name:"Grand Frais",shop:"supermarket"}},"shop/supermarket|Grocery Outlet":{tags:{brand:"Grocery Outlet","brand:wikidata":"Q5609934","brand:wikipedia":"en:Grocery Outlet",name:"Grocery Outlet",official_name:"Grocery Outlet Bargain Market",shop:"supermarket"}},"shop/supermarket|Groszek":{countryCodes:["pl"],nomatch:["shop/convenience|Groszek"],tags:{brand:"Groszek","brand:wikidata":"Q9280965","brand:wikipedia":"pl:Groszek (sieć sklepów)",name:"Groszek",shop:"supermarket"}},"shop/supermarket|Géant Casino":{countryCodes:["cg","fr"],tags:{brand:"Géant Casino","brand:wikidata":"Q1380537","brand:wikipedia":"en:Géant Casino",name:"Géant Casino",shop:"supermarket"}},"shop/supermarket|H Mart":{countryCodes:["ca","gb","us"],tags:{"alt_name:ko":"H 마트",brand:"H Mart","brand:wikidata":"Q5636306","brand:wikipedia":"en:H Mart",cuisine:"asian",name:"H Mart","name:en":"H Mart","name:ko":"한아름","name:zh-Hans":"韩亚龙","name:zh-Hant":"韓亞龍",shop:"supermarket"}},"shop/supermarket|H-E-B":{countryCodes:["mx","us"],tags:{brand:"H-E-B","brand:wikidata":"Q830621","brand:wikipedia":"en:H-E-B",name:"H-E-B",shop:"supermarket"}},"shop/supermarket|HIT":{countryCodes:["de"],tags:{brand:"HIT","brand:wikidata":"Q1548713","brand:wikipedia":"de:HIT Handelsgruppe",name:"HIT",shop:"supermarket"}},"shop/supermarket|HalpaHalli":{countryCodes:["ee","fi","ru"],tags:{brand:"HalpaHalli","brand:wikidata":"Q11861256","brand:wikipedia":"fi:HalpaHalli",name:"HalpaHalli",shop:"supermarket"}},"shop/supermarket|Hannaford":{countryCodes:["us"],tags:{brand:"Hannaford","brand:wikidata":"Q5648760","brand:wikipedia":"en:Hannaford Brothers Company",name:"Hannaford",shop:"supermarket"}},"shop/supermarket|Harris Teeter":{countryCodes:["us"],tags:{brand:"Harris Teeter","brand:wikidata":"Q5665067","brand:wikipedia":"en:Harris Teeter",name:"Harris Teeter",shop:"supermarket"}},"shop/supermarket|Hemköp":{countryCodes:["se"],tags:{brand:"Hemköp","brand:wikidata":"Q10521746","brand:wikipedia":"sv:Hemköp",name:"Hemköp",shop:"supermarket"}},"shop/supermarket|Heron Foods":{countryCodes:["gb"],tags:{brand:"Heron Foods","brand:wikidata":"Q5743472","brand:wikipedia":"en:Heron Foods",name:"Heron Foods",shop:"supermarket"}},"shop/supermarket|Hofer":{countryCodes:["at","si"],nomatch:["amenity/fuel|Hofer"],tags:{brand:"Hofer","brand:wikidata":"Q15815751","brand:wikipedia":"de:Hofer KG",name:"Hofer",shop:"supermarket"}},"shop/supermarket|Hoogvliet":{countryCodes:["nl"],tags:{brand:"Hoogvliet","brand:wikidata":"Q2770647","brand:wikipedia":"nl:Hoogvliet (supermarkt)",name:"Hoogvliet",shop:"supermarket"}},"shop/supermarket|Hruška":{nomatch:["shop/convenience|Hruška"],tags:{brand:"Hruška",name:"Hruška",shop:"supermarket"}},"shop/supermarket|Hy-Vee":{countryCodes:["us"],tags:{brand:"Hy-Vee","brand:wikidata":"Q1639719","brand:wikipedia":"en:Hy-Vee",name:"Hy-Vee",shop:"supermarket"}},"shop/supermarket|Hyper U":{countryCodes:["fr"],nomatch:["amenity/fuel|Super U","shop/convenience|Utile","shop/supermarket|Super U","shop/supermarket|U Express"],tags:{brand:"Hyper U","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Hyper U",shop:"supermarket"}},"shop/supermarket|ICA":{countryCodes:["no","se"],matchNames:["ica supermarket"],nomatch:["shop/supermarket|ICA Kvantum","shop/supermarket|ICA Maxi"],tags:{brand:"ICA","brand:wikidata":"Q1663776","brand:wikipedia":"sv:Ica",name:"ICA",shop:"supermarket"}},"shop/supermarket|ICA Kvantum":{countryCodes:["se"],nomatch:["shop/supermarket|ICA","shop/supermarket|ICA Maxi"],tags:{brand:"ICA Kvantum","brand:wikidata":"Q1663776","brand:wikipedia":"sv:Ica",name:"ICA Kvantum",shop:"supermarket"}},"shop/supermarket|ICA Maxi":{countryCodes:["no","se"],matchNames:["maxi"],nomatch:["shop/supermarket|ICA","shop/supermarket|ICA Kvantum"],tags:{brand:"ICA Maxi","brand:wikidata":"Q1663776","brand:wikipedia":"sv:Ica",name:"ICA Maxi",shop:"supermarket"}},"shop/supermarket|IDEA":{countryCodes:["rs"],tags:{brand:"IDEA","brand:wikidata":"Q23461622","brand:wikipedia":"en:Idea (supermarkets)",name:"IDEA",shop:"supermarket"}},"shop/supermarket|IGA":{countryCodes:["au","ca","us"],tags:{brand:"IGA","brand:wikidata":"Q3146662","brand:wikipedia":"en:IGA (supermarkets)",name:"IGA",shop:"supermarket"}},"shop/supermarket|Iceland":{tags:{brand:"Iceland","brand:wikidata":"Q721810","brand:wikipedia":"en:Iceland (supermarket)",name:"Iceland",shop:"supermarket"}},"shop/supermarket|Ingles":{countryCodes:["us"],tags:{brand:"Ingles","brand:wikidata":"Q6032595","brand:wikipedia":"en:Ingles",name:"Ingles",shop:"supermarket"}},"shop/supermarket|Intermarché":{tags:{brand:"Intermarché","brand:wikidata":"Q3153200","brand:wikipedia":"fr:Intermarché",name:"Intermarché",shop:"supermarket"}},"shop/supermarket|Intermarché Super":{countryCodes:["be","fr","pl","pt"],tags:{brand:"Intermarché Super","brand:wikidata":"Q3153200","brand:wikipedia":"fr:Intermarché",name:"Intermarché Super",shop:"supermarket"}},"shop/supermarket|Interspar":{countryCodes:["at"],tags:{brand:"Interspar","brand:wikidata":"Q15820339","brand:wikipedia":"de:Interspar (Österreich)",name:"Interspar",shop:"supermarket"}},"shop/supermarket|Irma":{countryCodes:["dk"],tags:{brand:"Irma","brand:wikidata":"Q797150","brand:wikipedia":"en:Irma (supermarket)",name:"Irma",shop:"supermarket"}},"shop/supermarket|Jan Linders":{countryCodes:["nl"],tags:{brand:"Jan Linders","brand:wikidata":"Q2200982","brand:wikipedia":"nl:Jan Linders Supermarkten",name:"Jan Linders",shop:"supermarket"}},"shop/supermarket|Jewel-Osco":{countryCodes:["us"],tags:{brand:"Jewel-Osco","brand:wikidata":"Q3178470","brand:wikipedia":"en:Jewel (supermarket)",name:"Jewel-Osco",shop:"supermarket"}},"shop/supermarket|Jumbo":{tags:{brand:"Jumbo","brand:wikidata":"Q2262314","brand:wikipedia":"en:Jumbo (supermarket)",name:"Jumbo",shop:"supermarket"}},"shop/supermarket|K+K":{countryCodes:["de"],tags:{brand:"K+K","brand:wikidata":"Q1718009","brand:wikipedia":"de:K+K Klaas & Kock",name:"K+K",shop:"supermarket"}},"shop/supermarket|K-Citymarket":{countryCodes:["fi"],tags:{brand:"K-Citymarket","brand:wikidata":"Q11868561","brand:wikipedia":"fi:K-Citymarket",name:"K-Citymarket",shop:"supermarket"}},"shop/supermarket|K-Supermarket":{countryCodes:["fi"],tags:{brand:"K-Supermarket","brand:wikidata":"Q5408668","brand:wikipedia":"fi:K-Supermarket",name:"K-Supermarket",shop:"supermarket"}},"shop/supermarket|Kaufland":{countryCodes:["bg","cz","de","hr","pl","ro","sk"],tags:{brand:"Kaufland","brand:wikidata":"Q685967","brand:wikipedia":"en:Kaufland",name:"Kaufland",shop:"supermarket"}},"shop/supermarket|King Soopers":{countryCodes:["us"],tags:{brand:"King Soopers","brand:wikidata":"Q6412065","brand:wikipedia":"en:King Soopers",name:"King Soopers",shop:"supermarket"}},"shop/supermarket|Kings":{countryCodes:["us"],tags:{brand:"Kings","brand:wikidata":"Q6412914","brand:wikipedia":"en:Kings Food Markets",name:"Kings",shop:"supermarket"}},"shop/supermarket|Kiwi":{countryCodes:["dk","no"],tags:{brand:"Kiwi","brand:wikidata":"Q1613639","brand:wikipedia":"en:Kiwi (store)",name:"Kiwi",shop:"supermarket"}},"shop/supermarket|Konsum":{countryCodes:["de","ee","se"],tags:{brand:"Konsum",name:"Konsum",shop:"supermarket"}},"shop/supermarket|Konzum~(Balkans)":{countryCodes:["ba","hr","rs"],nomatch:["shop/convenience|Konzum~(Balkans)","shop/convenience|Konzum~(Czechia)","shop/supermarket|Konzum~(Czechia)"],tags:{brand:"Konzum","brand:wikidata":"Q518563","brand:wikipedia":"hr:Konzum",name:"Konzum",shop:"supermarket"}},"shop/supermarket|Konzum~(Czechia)":{countryCodes:["cz","sk"],nomatch:["shop/convenience|Konzum~(Balkans)","shop/convenience|Konzum~(Czechia)","shop/supermarket|Konzum~(Balkans)"],tags:{brand:"Konzum",name:"Konzum",shop:"supermarket"}},"shop/supermarket|Kroger":{matchNames:["krogers"],nomatch:["amenity/fuel|Kroger"],tags:{brand:"Kroger","brand:wikidata":"Q153417","brand:wikipedia":"en:Kroger",name:"Kroger",shop:"supermarket"}},"shop/supermarket|Kvickly":{countryCodes:["dk"],tags:{brand:"Kvickly","brand:wikidata":"Q7061148","brand:wikipedia":"en:Kvickly",name:"Kvickly",shop:"supermarket"}},"shop/supermarket|La Anónima":{countryCodes:["ar"],tags:{brand:"La Anónima","brand:wikidata":"Q6135985","brand:wikipedia":"es:La Anónima",name:"La Anónima",shop:"supermarket"}},"shop/supermarket|La Comer":{countryCodes:["mx"],tags:{brand:"La Comer","brand:wikidata":"Q26765126","brand:wikipedia":"es:La Comer",name:"La Comer",shop:"supermarket"}},"shop/supermarket|La Michoacana Meat Market":{countryCodes:["us"],matchNames:["la michoacana"],tags:{brand:"La Michoacana Meat Market","brand:en":"La Michoacana Meat Market","brand:es":"La Michoacana","brand:wikidata":"Q6463872","brand:wikipedia":"en:La Michoacana Meat Market",cuisine:"latin_american",name:"La Michoacana Meat Market","name:en":"La Michoacana Meat Market","name:es":"La Michoacana",shop:"supermarket"}},"shop/supermarket|La Plaza de DIA":{countryCodes:["es"],tags:{brand:"La Plaza de DIA","brand:wikidata":"Q58904673",name:"La Plaza de DIA",shop:"supermarket"}},"shop/supermarket|La Vie Claire":{countryCodes:["fr"],tags:{brand:"La Vie Claire","brand:wikidata":"Q3213589","brand:wikipedia":"en:La Vie Claire (company)",name:"La Vie Claire",shop:"supermarket"}},"shop/supermarket|Landi":{countryCodes:["ch"],tags:{brand:"Landi","brand:wikidata":"Q1803010","brand:wikipedia":"en:Landi (Unternehmen)",name:"Landi",shop:"supermarket"}},"shop/supermarket|Leader Price":{tags:{brand:"Leader Price","brand:wikidata":"Q2181426","brand:wikipedia":"en:Leader Price",name:"Leader Price",shop:"supermarket"}},"shop/supermarket|Leclerc Drive":{countryCodes:["fr"],tags:{brand:"Leclerc Drive",name:"Leclerc Drive",shop:"supermarket"}},"shop/supermarket|Lewiatan":{countryCodes:["pl"],nomatch:["shop/convenience|Lewiatan"],tags:{brand:"Lewiatan","brand:wikidata":"Q11755396","brand:wikipedia":"pl:Lewiatan (sieć handlowa)",name:"Lewiatan",shop:"supermarket"}},"shop/supermarket|Lider":{countryCodes:["cl"],nomatch:["shop/supermarket|Lider Express"],tags:{brand:"Lider","brand:wikidata":"Q6711261","brand:wikipedia":"es:Líder (supermercado)",name:"Lider",shop:"supermarket"}},"shop/supermarket|Lider Express":{countryCodes:["cl"],nomatch:["shop/supermarket|Lider"],tags:{brand:"Lider","brand:wikidata":"Q6711261","brand:wikipedia":"es:Líder (supermercado)",name:"Lider Express",shop:"supermarket"}},"shop/supermarket|Lidl":{tags:{brand:"Lidl","brand:wikidata":"Q151954","brand:wikipedia":"en:Lidl",name:"Lidl",shop:"supermarket"}},"shop/supermarket|Lincolnshire Co-op":{countryCodes:["gb"],tags:{brand:"Lincolnshire Co-op","brand:wikidata":"Q6551231","brand:wikipedia":"en:Lincolnshire Co-operative",name:"Lincolnshire Co-op",shop:"supermarket"}},"shop/supermarket|Linella":{countryCodes:["md"],tags:{brand:"Linella","brand:wikidata":"Q61085990","brand:wikipedia":"ro:Linella",name:"Linella",shop:"supermarket"}},"shop/supermarket|Loblaws":{countryCodes:["ca"],matchNames:["loblaws great food"],tags:{brand:"Loblaws","brand:wikidata":"Q3257626","brand:wikipedia":"en:Loblaws",name:"Loblaws",shop:"supermarket"}},"shop/supermarket|Londis":{tags:{brand:"Londis",name:"Londis",shop:"supermarket"}},"shop/supermarket|Lotte Mart":{countryCodes:["id","kr"],tags:{brand:"Lotte Mart","brand:wikidata":"Q326715","brand:wikipedia":"en:Lotte Mart",name:"Lotte Mart",shop:"supermarket"}},"shop/supermarket|Lowe's Market":{countryCodes:["us"],nomatch:["shop/clothes|Lowes","shop/doityourself|Lowe's","shop/supermarket|Lowes Foods"],tags:{brand:"Lowe's Market","brand:wikidata":"Q6693107","brand:wikipedia":"en:Lowe's Market",name:"Lowe's Market",shop:"supermarket"}},"shop/supermarket|Lowes Foods":{countryCodes:["us"],nomatch:["shop/clothes|Lowes","shop/doityourself|Lowe's","shop/supermarket|Lowe's Market"],tags:{brand:"Lowes Foods","brand:wikidata":"Q6693991","brand:wikipedia":"en:Lowes Foods",name:"Lowes Foods",shop:"supermarket"}},"shop/supermarket|Lucky":{countryCodes:["us"],matchNames:["luckys"],tags:{brand:"Lucky","brand:wikidata":"Q6698032","brand:wikipedia":"en:Lucky Stores",name:"Lucky",shop:"supermarket"}},"shop/supermarket|Lupa":{countryCodes:["es"],tags:{brand:"Lupa","brand:wikidata":"Q58044048",name:"Lupa",shop:"supermarket"}},"shop/supermarket|M&S Simply Food":{nomatch:["shop/convenience|M&S Simply Food"],tags:{brand:"M&S Simply Food",name:"M&S Simply Food",shop:"supermarket"}},"shop/supermarket|MD":{countryCodes:["it"],matchNames:["md discount"],tags:{brand:"MD","brand:wikidata":"Q3841263","brand:wikipedia":"en:MD Discount",name:"MD",shop:"supermarket"}},"shop/supermarket|MPREIS":{countryCodes:["at","it"],tags:{brand:"MPREIS","brand:wikidata":"Q873491","brand:wikipedia":"de:MPreis",name:"MPREIS",shop:"supermarket"}},"shop/supermarket|Marc's":{countryCodes:["us"],nomatch:["amenity/pharmacy|Marc's"],tags:{brand:"Marc's","brand:wikidata":"Q17080259","brand:wikipedia":"en:Marc's",name:"Marc's",shop:"supermarket"}},"shop/supermarket|Markant":{countryCodes:["de"],tags:{brand:"Markant","brand:wikidata":"Q57523365",name:"Markant",shop:"supermarket"}},"shop/supermarket|Market Basket":{tags:{brand:"Market Basket","brand:wikidata":"Q2079198","brand:wikipedia":"en:Market Basket (New England)",name:"Market Basket",shop:"supermarket"}},"shop/supermarket|Marktkauf":{countryCodes:["de"],tags:{brand:"Marktkauf","brand:wikidata":"Q1533254","brand:wikipedia":"de:Marktkauf Holding",name:"Marktkauf",shop:"supermarket"}},"shop/supermarket|Martin's Super Markets":{countryCodes:["us"],tags:{brand:"Martin's Super Markets","brand:wikidata":"Q6774803","brand:wikipedia":"en:Martin's Super Markets",name:"Martin's Super Markets",shop:"supermarket"}},"shop/supermarket|Match":{countryCodes:["be","fr","hu","lu"],tags:{brand:"Match","brand:wikidata":"Q513977","brand:wikipedia":"en:Match (supermarket)",name:"Match",shop:"supermarket"}},"shop/supermarket|Maxi Dia":{countryCodes:["es"],tags:{brand:"Maxi Dia","brand:wikidata":"Q925132","brand:wikipedia":"es:Supermercados DIA",name:"Maxi Dia",shop:"supermarket"}},"shop/supermarket|Maxima X":{countryCodes:["bg","ee","lt","lv"],nomatch:["shop/supermarket|Maxima XX","shop/supermarket|Maxima XXX"],tags:{brand:"Maxima X","brand:wikidata":"Q1881222","brand:wikipedia":"en:Maxima Group",name:"Maxima X",shop:"supermarket"}},"shop/supermarket|Maxima XX":{countryCodes:["bg","ee","lt","lv","pl"],nomatch:["shop/supermarket|Maxima X","shop/supermarket|Maxima XXX"],tags:{brand:"Maxima XX","brand:wikidata":"Q1881222","brand:wikipedia":"en:Maxima Group",name:"Maxima XX",shop:"supermarket"}},"shop/supermarket|Maxima XXX":{countryCodes:["bg","ee","lt","lv","pl"],matchNames:["maxima"],nomatch:["shop/supermarket|Maxima X","shop/supermarket|Maxima XX"],tags:{brand:"Maxima XXX","brand:wikidata":"Q1881222","brand:wikipedia":"en:Maxima Group",name:"Maxima XXX",shop:"supermarket"}},"shop/supermarket|Maxi~(Canada)":{countryCodes:["ca"],nomatch:["shop/supermarket|Maxi~(Serbia)"],tags:{brand:"Maxi","brand:wikidata":"Q3302441","brand:wikipedia":"en:Maxi (Canadian supermarket)",name:"Maxi",shop:"supermarket"}},"shop/supermarket|Maxi~(Serbia)":{countryCodes:["rs"],nomatch:["shop/supermarket|Maxi~(Canada)"],tags:{brand:"Maxi","brand:wikidata":"Q6795490","brand:wikipedia":"en:Maxi (Serbian supermarket)",name:"Maxi",shop:"supermarket"}},"shop/supermarket|Mega Image":{countryCodes:["ro"],tags:{brand:"Mega Image","brand:wikidata":"Q6808085","brand:wikipedia":"en:Mega Image",name:"Mega Image",shop:"supermarket"}},"shop/supermarket|Mego":{countryCodes:["lv"],tags:{brand:"Mego","brand:wikidata":"Q16363314","brand:wikipedia":"lv:Mego",name:"Mego",shop:"supermarket"}},"shop/supermarket|Meijer":{countryCodes:["us"],tags:{brand:"Meijer","brand:wikidata":"Q1917753","brand:wikipedia":"en:Meijer",name:"Meijer",shop:"supermarket"}},"shop/supermarket|Meny":{countryCodes:["dk","no"],tags:{brand:"Meny","brand:wikidata":"Q10581720","brand:wikipedia":"en:Meny",name:"Meny",shop:"supermarket"}},"shop/supermarket|Mercadona":{tags:{brand:"Mercadona","brand:wikidata":"Q377705","brand:wikipedia":"en:Mercadona",name:"Mercadona",shop:"supermarket"}},"shop/supermarket|Mercator":{tags:{brand:"Mercator",name:"Mercator",shop:"supermarket"}},"shop/supermarket|Merkur":{countryCodes:["at"],tags:{brand:"Merkur","brand:wikidata":"Q1921857","brand:wikipedia":"de:Merkur (Österreich)",name:"Merkur",shop:"supermarket"}},"shop/supermarket|Metro~(Canada)":{countryCodes:["ca"],nomatch:["shop/wholesale|Metro"],tags:{brand:"Metro","brand:wikidata":"Q1145669","brand:wikipedia":"en:Metro Inc.",name:"Metro",shop:"supermarket"}},"shop/supermarket|Metro~(Peru)":{countryCodes:["pe"],nomatch:["shop/wholesale|Metro"],tags:{brand:"Metro","brand:wikidata":"Q16640217","brand:wikipedia":"en:Tiendas Metro",name:"Metro",shop:"supermarket"}},"shop/supermarket|Migros":{tags:{brand:"Migros","brand:wikidata":"Q680727","brand:wikipedia":"en:Migros",name:"Migros",shop:"supermarket"}},"shop/supermarket|Mila":{countryCodes:["pl"],tags:{brand:"Mila","brand:wikidata":"Q48844636","brand:wikipedia":"pl:Mila (sieć sklepów)",name:"Mila",shop:"supermarket"}},"shop/supermarket|Minipreço":{tags:{brand:"Minipreço","brand:wikidata":"Q3042224","brand:wikipedia":"en:Minipreço",name:"Minipreço",shop:"supermarket"}},"shop/supermarket|Mix Markt":{countryCodes:["de"],tags:{brand:"Mix Markt","brand:wikidata":"Q327854","brand:wikipedia":"de:Mix Markt",name:"Mix Markt",shop:"supermarket"}},"shop/supermarket|Monoprix":{tags:{brand:"Monoprix","brand:wikidata":"Q3321241","brand:wikipedia":"en:Monoprix",name:"Monoprix",shop:"supermarket"}},"shop/supermarket|More":{countryCodes:["in"],tags:{brand:"More","brand:wikidata":"Q6910891","brand:wikipedia":"en:More (store)",name:"More",shop:"supermarket"}},"shop/supermarket|Morrisons":{countryCodes:["gb"],nomatch:["amenity/fuel|Morrisons"],tags:{brand:"Morrisons","brand:wikidata":"Q922344","brand:wikipedia":"en:Morrisons",name:"Morrisons",shop:"supermarket"}},"shop/supermarket|NP":{matchNames:["np-markt"],nomatch:["amenity/fuel|NP"],tags:{brand:"NP",name:"NP",shop:"supermarket"}},"shop/supermarket|Nah & Frisch":{countryCodes:["at","de"],matchNames:["nah und frisch"],tags:{brand:"Nah & Frisch","brand:wikidata":"Q1963643","brand:wikipedia":"de:Nah & Frisch",name:"Nah & Frisch",shop:"supermarket"}},"shop/supermarket|Nahkauf":{countryCodes:["de"],tags:{brand:"Nahkauf","brand:wikidata":"Q57515238",name:"Nahkauf",shop:"supermarket"}},"shop/supermarket|Natural Grocers":{countryCodes:["us"],tags:{brand:"Natural Grocers",name:"Natural Grocers",shop:"supermarket"}},"shop/supermarket|Naturalia":{countryCodes:["fr"],tags:{brand:"Naturalia","brand:wikidata":"Q3337081","brand:wikipedia":"fr:Naturalia",name:"Naturalia",shop:"supermarket"}},"shop/supermarket|Netto":{tags:{brand:"Netto","brand:wikidata":"Q552652","brand:wikipedia":"en:Netto (store)",name:"Netto",shop:"supermarket"}},"shop/supermarket|Netto Marken-Discount":{countryCodes:["de"],tags:{brand:"Netto Marken-Discount","brand:wikidata":"Q879858","brand:wikipedia":"en:Netto Marken-Discount",name:"Netto Marken-Discount",shop:"supermarket"}},"shop/supermarket|New World":{countryCodes:["nz"],tags:{brand:"New World","brand:wikidata":"Q7012488","brand:wikipedia":"en:New World (supermarket)",name:"New World",shop:"supermarket"}},"shop/supermarket|No Frills":{countryCodes:["ca"],tags:{brand:"No Frills","brand:wikidata":"Q3342407","brand:wikipedia":"en:No Frills (grocery store)",name:"No Frills",shop:"supermarket"}},"shop/supermarket|Norfa XL":{countryCodes:["lt"],tags:{brand:"Norfa XL","brand:wikidata":"Q1998983","brand:wikipedia":"lt:Norfa",name:"Norfa XL",shop:"supermarket"}},"shop/supermarket|Norma":{countryCodes:["at","cz","de","fr"],tags:{brand:"Norma","brand:wikidata":"Q450180","brand:wikipedia":"de:Norma (Handelskette)",name:"Norma",shop:"supermarket"}},"shop/supermarket|Okay":{countryCodes:["be"],tags:{brand:"Okay","brand:wikidata":"Q2159701","brand:wikipedia":"fr:OKay",name:"Okay",shop:"supermarket"}},"shop/supermarket|Olímpica":{countryCodes:["co"],tags:{brand:"Olímpica","brand:wikidata":"Q24749847","brand:wikipedia":"es:Grupo Empresarial Olímpica",name:"Olímpica",shop:"supermarket"}},"shop/supermarket|PLUS":{countryCodes:["nl"],nomatch:["shop/mobile_phone|Plus"],tags:{brand:"PLUS","brand:wikidata":"Q1978981","brand:wikipedia":"nl:PLUS (Nederlandse supermarkt)",name:"PLUS",shop:"supermarket"}},"shop/supermarket|POLOmarket":{countryCodes:["pl"],tags:{brand:"POLOmarket","brand:wikidata":"Q11821937","brand:wikipedia":"pl:Polomarket",name:"POLOmarket",shop:"supermarket"}},"shop/supermarket|Palí":{countryCodes:["cr","ni"],tags:{brand:"Palí","brand:wikidata":"Q1064887","brand:wikipedia":"es:Walmart de México y Centroamérica",name:"Palí",shop:"supermarket"}},"shop/supermarket|Pam":{countryCodes:["ch","it"],tags:{brand:"Pam","brand:wikidata":"Q3777398","brand:wikipedia":"it:Gruppo PAM",name:"Pam",shop:"supermarket"}},"shop/supermarket|Pavilions":{countryCodes:["us"],tags:{brand:"Pavilions","brand:wikidata":"Q7155886","brand:wikipedia":"en:Pavilions (supermarket)",name:"Pavilions",shop:"supermarket"}},"shop/supermarket|Penny":{countryCodes:["at","cz","de","hu","it","ro"],matchNames:["penny market","penny markt"],tags:{brand:"Penny","brand:wikidata":"Q284688","brand:wikipedia":"en:Penny (supermarket)",name:"Penny",shop:"supermarket"}},"shop/supermarket|Pick 'n Save":{countryCodes:["us","za"],tags:{brand:"Pick 'n Save","brand:wikidata":"Q7371288","brand:wikipedia":"en:Roundy's",name:"Pick 'n Save",shop:"supermarket"}},"shop/supermarket|Pick n Pay":{tags:{brand:"Pick n Pay","brand:wikidata":"Q7190735","brand:wikipedia":"en:Pick n Pay Stores",name:"Pick n Pay",shop:"supermarket"}},"shop/supermarket|Piggly Wiggly":{countryCodes:["gb","us"],tags:{brand:"Piggly Wiggly","brand:wikidata":"Q3388303","brand:wikipedia":"en:Piggly Wiggly",name:"Piggly Wiggly",shop:"supermarket"}},"shop/supermarket|Pingo Doce":{countryCodes:["pt"],tags:{brand:"Pingo Doce","brand:wikidata":"Q1575057","brand:wikipedia":"en:Pingo Doce",name:"Pingo Doce",shop:"supermarket"}},"shop/supermarket|Piotr i Paweł":{countryCodes:["pl"],tags:{brand:"Piotr i Paweł","brand:wikidata":"Q2096356","brand:wikipedia":"pl:Piotr i Paweł",name:"Piotr i Paweł",shop:"supermarket"}},"shop/supermarket|Plaza Vea":{tags:{brand:"Plaza Vea","brand:wikidata":"Q7203672","brand:wikipedia":"en:Plaza Vea",name:"Plaza Vea",shop:"supermarket"}},"shop/supermarket|Plodine":{countryCodes:["hr"],tags:{brand:"Plodine","brand:wikidata":"Q58040098",name:"Plodine",shop:"supermarket"}},"shop/supermarket|Poiesz":{countryCodes:["nl"],tags:{brand:"Poiesz","brand:wikidata":"Q2521700","brand:wikipedia":"nl:Poiesz Supermarkten",name:"Poiesz",shop:"supermarket"}},"shop/supermarket|Price Chopper~(Kansas City)":{countryCodes:["us"],nomatch:["shop/supermarket|Price Chopper~(New York)"],tags:{brand:"Price Chopper","brand:wikidata":"Q7242572","brand:wikipedia":"en:Price Chopper (supermarket)",name:"Price Chopper",shop:"supermarket"}},"shop/supermarket|Price Chopper~(New York)":{countryCodes:["us"],nomatch:["shop/supermarket|Price Chopper~(Kansas City)"],tags:{brand:"Price Chopper","brand:wikidata":"Q7242574","brand:wikipedia":"en:Price Chopper Supermarkets",name:"Price Chopper",shop:"supermarket"}},"shop/supermarket|Prisma":{countryCodes:["ee","fi","ru"],tags:{brand:"Prisma","brand:wikidata":"Q12047031","brand:wikipedia":"fi:Prisma (kauppaketju)",name:"Prisma",shop:"supermarket"}},"shop/supermarket|Prix":{countryCodes:["it"],matchNames:["prix quality"],tags:{brand:"Prix","brand:wikidata":"Q61994819",name:"Prix",shop:"supermarket"}},"shop/supermarket|Profi":{countryCodes:["be","hu","ro"],tags:{brand:"Profi","brand:wikidata":"Q956664","brand:wikipedia":"en:Profi",name:"Profi",shop:"supermarket"}},"shop/supermarket|Profi City":{countryCodes:["ro"],tags:{brand:"Profi City",name:"Profi City",shop:"supermarket"}},"shop/supermarket|Provigo":{countryCodes:["ca"],tags:{brand:"Provigo","brand:wikidata":"Q3408306","brand:wikipedia":"en:Provigo",name:"Provigo",shop:"supermarket"}},"shop/supermarket|Proxy Delhaize":{countryCodes:["be","lu"],tags:{brand:"Proxy Delhaize","brand:wikidata":"Q14903417","brand:wikipedia":"en:Delhaize Group",name:"Proxy Delhaize",shop:"supermarket"}},"shop/supermarket|Publix":{countryCodes:["br","us"],tags:{brand:"Publix","brand:wikidata":"Q672170","brand:wikipedia":"en:Publix",name:"Publix",shop:"supermarket"}},"shop/supermarket|Punto Simply":{countryCodes:["it"],tags:{brand:"Punto Simply","brand:wikidata":"Q3484790","brand:wikipedia":"it:Simply Market",name:"Punto Simply",shop:"supermarket"}},"shop/supermarket|Puregold":{countryCodes:["ph"],tags:{brand:"Puregold","brand:wikidata":"Q7261170","brand:wikipedia":"en:Puregold",name:"Puregold",shop:"supermarket"}},"shop/supermarket|Pão de Açúcar":{countryCodes:["br","pt"],tags:{brand:"Pão de Açúcar","brand:wikidata":"Q3411543","brand:wikipedia":"pt:Pão de Açúcar (supermercado brasileiro)",name:"Pão de Açúcar",shop:"supermarket"}},"shop/supermarket|QFC":{countryCodes:["us"],tags:{brand:"QFC","brand:wikidata":"Q7265425","brand:wikipedia":"en:QFC",name:"QFC",shop:"supermarket"}},"shop/supermarket|Raley's":{countryCodes:["us"],tags:{brand:"Raley's","brand:wikidata":"Q7286970","brand:wikipedia":"en:Raley's Supermarkets",name:"Raley's",shop:"supermarket"}},"shop/supermarket|Ralphs":{countryCodes:["us"],tags:{brand:"Ralphs","brand:wikidata":"Q3929820","brand:wikipedia":"en:Ralphs",name:"Ralphs",shop:"supermarket"}},"shop/supermarket|Real":{tags:{brand:"Real","brand:wikidata":"Q698473","brand:wikipedia":"en:Real (hypermarket)",name:"Real",shop:"supermarket"}},"shop/supermarket|Real Canadian Superstore":{countryCodes:["ca"],tags:{brand:"Real Canadian Superstore","brand:wikidata":"Q7300856","brand:wikipedia":"en:Real Canadian Superstore",name:"Real Canadian Superstore",shop:"supermarket"}},"shop/supermarket|Redner's":{countryCodes:["us"],matchNames:["redners warehouse market"],tags:{brand:"Redner's","brand:wikidata":"Q7306166","brand:wikipedia":"en:Redner's Markets",name:"Redner's",shop:"supermarket"}},"shop/supermarket|Reliance Fresh":{countryCodes:["in"],tags:{brand:"Reliance Fresh","brand:wikidata":"Q7311014","brand:wikipedia":"en:Reliance Fresh",name:"Reliance Fresh",shop:"supermarket"}},"shop/supermarket|Rema 1000":{countryCodes:["dk","no"],tags:{brand:"Rema 1000","brand:wikidata":"Q28459","brand:wikipedia":"en:REMA 1000",name:"Rema 1000",shop:"supermarket"}},"shop/supermarket|Rewe":{countryCodes:["de"],nomatch:["shop/supermarket|Rewe City"],tags:{brand:"Rewe","brand:wikidata":"Q16968817","brand:wikipedia":"en:REWE",name:"Rewe",shop:"supermarket"}},"shop/supermarket|Rewe City":{countryCodes:["de"],nomatch:["shop/supermarket|Rewe"],tags:{brand:"Rewe City","brand:wikidata":"Q16968817","brand:wikipedia":"en:REWE",name:"Rewe City",shop:"supermarket"}},"shop/supermarket|Rimi":{countryCodes:["ee","lt","lv"],tags:{brand:"Rimi","brand:wikidata":"Q7334456","brand:wikipedia":"en:Rimi (Norway)",name:"Rimi",shop:"supermarket"}},"shop/supermarket|S-market":{countryCodes:["fi"],tags:{brand:"S-market","brand:wikidata":"Q11891613","brand:wikipedia":"fi:S-market",name:"S-market",shop:"supermarket"}},"shop/supermarket|Safeway":{nomatch:["amenity/fuel|Safeway"],tags:{brand:"Safeway","brand:wikidata":"Q1508234","brand:wikipedia":"en:Safeway Inc.",name:"Safeway",shop:"supermarket"}},"shop/supermarket|Sainsbury's":{countryCodes:["gb"],nomatch:["amenity/fuel|Sainsbury's"],tags:{brand:"Sainsbury's","brand:wikidata":"Q152096","brand:wikipedia":"en:Sainsbury's",name:"Sainsbury's",shop:"supermarket"}},"shop/supermarket|Santa Isabel":{countryCodes:["cl"],tags:{brand:"Santa Isabel","brand:wikidata":"Q7419620","brand:wikipedia":"es:Santa Isabel (supermercado)",name:"Santa Isabel",shop:"supermarket"}},"shop/supermarket|Save-A-Lot":{countryCodes:["us"],tags:{brand:"Save-A-Lot","brand:wikidata":"Q7427972","brand:wikipedia":"en:Save-A-Lot",name:"Save-A-Lot",shop:"supermarket"}},"shop/supermarket|Save-On-Foods":{countryCodes:["ca"],tags:{brand:"Save-On-Foods","brand:wikidata":"Q7427974","brand:wikipedia":"en:Save-On-Foods",name:"Save-On-Foods",shop:"supermarket"}},"shop/supermarket|Schnucks":{countryCodes:["us"],tags:{brand:"Schnucks","brand:wikidata":"Q7431920","brand:wikipedia":"en:Schnucks",name:"Schnucks",shop:"supermarket"}},"shop/supermarket|Shaw's":{countryCodes:["us"],tags:{brand:"Shaw's","brand:wikidata":"Q578387","brand:wikipedia":"en:Shaw's and Star Market",name:"Shaw's",shop:"supermarket"}},"shop/supermarket|ShopRite~(USA)":{countryCodes:["us"],nomatch:["shop/supermarket|Shoprite~(Africa)","shop/supermarket|Shoprite~(Isle of Man)"],tags:{brand:"ShopRite","brand:wikidata":"Q7501097","brand:wikipedia":"en:ShopRite (United States)",name:"ShopRite",shop:"supermarket"}},"shop/supermarket|Shoprite~(Africa)":{countryCodes:["ao","bw","cd","gh","ls","mg","mu","mw","mz","na","ng","sz","ug","za","zm"],nomatch:["shop/supermarket|ShopRite~(USA)","shop/supermarket|Shoprite~(Isle of Man)"],tags:{brand:"Shoprite","brand:wikidata":"Q1857639","brand:wikipedia":"en:Shoprite (South Africa)",name:"Shoprite",shop:"supermarket"}},"shop/supermarket|Shoprite~(Isle of Man)":{countryCodes:["im"],nomatch:["shop/supermarket|ShopRite~(USA)","shop/supermarket|Shoprite~(Africa)"],tags:{brand:"Shoprite","brand:wikidata":"Q7501242","brand:wikipedia":"en:Shoprite (Isle of Man)",name:"Shoprite",shop:"supermarket"}},"shop/supermarket|Sigma":{countryCodes:["it"],tags:{brand:"Sigma","brand:wikidata":"Q3977979","brand:wikipedia":"it:Supermercati Sigma",name:"Sigma",shop:"supermarket"}},"shop/supermarket|Simply Market":{matchNames:["simply"],tags:{brand:"Simply Market","brand:wikidata":"Q3484790","brand:wikipedia":"en:Simply Market",name:"Simply Market",shop:"supermarket"}},"shop/supermarket|Sky":{countryCodes:["de","lv","nl"],tags:{brand:"Sky","brand:wikidata":"Q1129779","brand:wikipedia":"de:Coop eG",name:"Sky",shop:"supermarket"}},"shop/supermarket|Smart & Final":{countryCodes:["mx","us"],tags:{brand:"Smart & Final",name:"Smart & Final",shop:"supermarket"}},"shop/supermarket|Smith's":{countryCodes:["ca","us"],nomatch:["amenity/fuel|Smith's"],tags:{brand:"Smith's","brand:wikidata":"Q7544856","brand:wikipedia":"en:Smith's Food and Drug",name:"Smith's",shop:"supermarket"}},"shop/supermarket|Sobeys":{countryCodes:["ca"],tags:{brand:"Sobeys","brand:wikidata":"Q1143340","brand:wikipedia":"en:Sobeys",name:"Sobeys",shop:"supermarket"}},"shop/supermarket|Soriana":{countryCodes:["mx"],tags:{brand:"Soriana","brand:wikidata":"Q735562","brand:wikipedia":"en:Soriana",name:"Soriana",shop:"supermarket"}},"shop/supermarket|Spar":{nomatch:["shop/convenience|Spar","shop/convenience|Spar Express"],tags:{brand:"Spar","brand:wikidata":"Q610492","brand:wikipedia":"en:Spar (retailer)",name:"Spar",shop:"supermarket"}},"shop/supermarket|Społem":{nomatch:["shop/convenience|Społem"],tags:{brand:"Społem","brand:wikidata":"Q11826043","brand:wikipedia":"pl:Powszechna Spółdzielnia Spożywców „Społem”",name:"Społem",shop:"supermarket"}},"shop/supermarket|Sprouts Farmers Market":{countryCodes:["us"],tags:{brand:"Sprouts Farmers Market","brand:wikidata":"Q7581369","brand:wikipedia":"en:Sprouts Farmers Market",name:"Sprouts Farmers Market",shop:"supermarket"}},"shop/supermarket|Stater Bros.":{countryCodes:["us"],tags:{brand:"Stater Bros.","brand:wikidata":"Q7604016","brand:wikipedia":"en:Stater Bros.",name:"Stater Bros.",shop:"supermarket"}},"shop/supermarket|Stokrotka":{countryCodes:["pl"],tags:{brand:"Stokrotka","brand:wikidata":"Q9345945","brand:wikipedia":"pl:Stokrotka (sieć handlowa)",name:"Stokrotka",shop:"supermarket"}},"shop/supermarket|Stop & Shop":{countryCodes:["us"],matchNames:["stop and shop"],tags:{brand:"Stop & Shop","brand:wikidata":"Q3658429","brand:wikipedia":"en:Stop & Shop",name:"Stop & Shop",shop:"supermarket"}},"shop/supermarket|Studenac":{tags:{brand:"Studenac",name:"Studenac",shop:"supermarket"}},"shop/supermarket|Suma":{countryCodes:["es"],tags:{brand:"Suma","brand:wikidata":"Q58012362",name:"Suma",shop:"supermarket"}},"shop/supermarket|Super 1 Foods":{countryCodes:["us"],tags:{brand:"Super 1 Foods",name:"Super 1 Foods",shop:"supermarket"}},"shop/supermarket|Super C":{tags:{brand:"Super C","brand:wikidata":"Q3504127","brand:wikipedia":"en:Super C (supermarket)",name:"Super C",shop:"supermarket"}},"shop/supermarket|Super H Mart":{countryCodes:["us"],tags:{brand:"H Mart","brand:wikidata":"Q5636306","brand:wikipedia":"en:H Mart",cuisine:"asian",name:"Super H Mart",shop:"supermarket"}},"shop/supermarket|Super One Foods":{countryCodes:["us"],tags:{brand:"Super One Foods","brand:wikidata":"Q17108733","brand:wikipedia":"en:Super One Foods",name:"Super One Foods",shop:"supermarket"}},"shop/supermarket|Super U":{countryCodes:["fr"],nomatch:["amenity/fuel|Super U","shop/convenience|Utile","shop/supermarket|Hyper U","shop/supermarket|U Express"],tags:{brand:"Super U","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Super U",shop:"supermarket"}},"shop/supermarket|SuperBrugsen":{countryCodes:["dk"],tags:{brand:"SuperBrugsen","brand:wikidata":"Q12337746","brand:wikipedia":"en:SuperBrugsen",name:"SuperBrugsen",shop:"supermarket"}},"shop/supermarket|SuperValu":{tags:{brand:"SuperValu","brand:wikidata":"Q7642081","brand:wikipedia":"en:SuperValu (Ireland)",name:"SuperValu",shop:"supermarket"}},"shop/supermarket|Superama":{countryCodes:["mx"],tags:{brand:"Superama","brand:wikidata":"Q6135762","brand:wikipedia":"es:Superama",name:"Superama",shop:"supermarket"}},"shop/supermarket|Supercor":{countryCodes:["es","pt"],tags:{brand:"Supercor","brand:wikidata":"Q6135841","brand:wikipedia":"es:Supercor",name:"Supercor",shop:"supermarket"}},"shop/supermarket|Supersol":{countryCodes:["ar","es","ma","uy"],tags:{brand:"Supersol","brand:wikidata":"Q62073427",name:"Supersol",shop:"supermarket"}},"shop/supermarket|Superspar":{countryCodes:["es","za"],tags:{brand:"Superspar","brand:wikidata":"Q610492","brand:wikipedia":"en:Spar (retailer)",name:"Superspar",shop:"supermarket"}},"shop/supermarket|Tegut":{countryCodes:["de"],tags:{brand:"Tegut","brand:wikidata":"Q1547993","brand:wikipedia":"en:Tegut",name:"Tegut",shop:"supermarket"}},"shop/supermarket|Tesco":{nomatch:["shop/convenience|Tesco Express","shop/supermarket|Tesco Express"],tags:{brand:"Tesco","brand:wikidata":"Q487494","brand:wikipedia":"en:Tesco",name:"Tesco",shop:"supermarket"}},"shop/supermarket|Tesco Express":{tags:{brand:"Tesco Express","brand:wikidata":"Q487494","brand:wikipedia":"en:Tesco",name:"Tesco Express",shop:"supermarket"}},"shop/supermarket|Tesco Extra":{tags:{brand:"Tesco Extra","brand:wikidata":"Q25172225","brand:wikipedia":"en:Tesco Extra",name:"Tesco Extra",shop:"supermarket"}},"shop/supermarket|Tesco Lotus":{countryCodes:["th"],nomatch:["shop/convenience|Tesco Lotus Express"],tags:{brand:"Tesco Lotus",name:"Tesco Lotus",shop:"supermarket"}},"shop/supermarket|Tesco Metro":{countryCodes:["gb"],tags:{brand:"Tesco Metro","brand:wikidata":"Q57551648",name:"Tesco Metro",shop:"supermarket"}},"shop/supermarket|The Co-operative Food~(UK)":{countryCodes:["gb"],matchNames:["coop","coop food","cooperative food","the cooperative"],nomatch:["amenity/fuel|Co-op~(Canada)","shop/convenience|Co-op~(Canada)","shop/convenience|Coop~(Schweiz)","shop/convenience|The Co-operative Food~(UK)","shop/supermarket|Co-op~(Canada)","shop/supermarket|Coop~(Schweiz)"],tags:{brand:"The Co-operative Food","brand:wikidata":"Q3277439","brand:wikipedia":"en:Co-op Food",name:"The Co-operative Food",shop:"supermarket"}},"shop/supermarket|The Fresh Market":{countryCodes:["us"],matchNames:["fresh market"],tags:{brand:"The Fresh Market","brand:wikidata":"Q7735265","brand:wikipedia":"en:The Fresh Market",name:"The Fresh Market",shop:"supermarket"}},"shop/supermarket|Todis":{countryCodes:["it"],tags:{brand:"Todis","brand:wikidata":"Q3992174","brand:wikipedia":"it:Todis",name:"Todis",shop:"supermarket"}},"shop/supermarket|Tommy":{countryCodes:["hr"],tags:{brand:"Tommy","brand:wikidata":"Q12643718","brand:wikipedia":"hr:Tommy",name:"Tommy",shop:"supermarket"}},"shop/supermarket|Top Market":{countryCodes:["pl"],tags:{brand:"Top Market","brand:wikidata":"Q9360044","brand:wikipedia":"pl:Top Market",name:"Top Market",shop:"supermarket"}},"shop/supermarket|Tops":{countryCodes:["us"],tags:{brand:"Tops","brand:wikidata":"Q7825137","brand:wikipedia":"en:Tops Friendly Markets",name:"Tops",official_name:"Tops Friendly Markets",shop:"supermarket"}},"shop/supermarket|Tottus":{countryCodes:["cl","pe"],tags:{brand:"Tottus","brand:wikidata":"Q7828510","brand:wikipedia":"en:Tottus",name:"Tottus",shop:"supermarket"}},"shop/supermarket|Trader Joe's":{countryCodes:["us"],tags:{brand:"Trader Joe's","brand:wikidata":"Q688825","brand:wikipedia":"en:Trader Joe's",name:"Trader Joe's",shop:"supermarket"}},"shop/supermarket|Treff 3000":{countryCodes:["de"],tags:{brand:"Treff 3000","brand:wikidata":"Q701755","brand:wikipedia":"de:Edeka",name:"Treff 3000",shop:"supermarket"}},"shop/supermarket|Tuodì":{countryCodes:["it"],tags:{brand:"Tuodì","brand:wikidata":"Q3706995","brand:wikipedia":"it:Tuodì",name:"Tuodì",shop:"supermarket"}},"shop/supermarket|U Express":{countryCodes:["fr"],nomatch:["amenity/fuel|Super U","shop/convenience|Utile","shop/supermarket|Hyper U","shop/supermarket|Super U"],tags:{brand:"U Express","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"U Express",shop:"supermarket"}},"shop/supermarket|Unimarc":{countryCodes:["cl"],tags:{brand:"Unimarc","brand:wikidata":"Q6156244","brand:wikipedia":"es:Unimarc",name:"Unimarc",shop:"supermarket"}},"shop/supermarket|Unimarkt":{countryCodes:["at"],tags:{brand:"Unimarkt","brand:wikidata":"Q1169599","brand:wikipedia":"de:Unimarkt",name:"Unimarkt",shop:"supermarket"}},"shop/supermarket|Vea":{countryCodes:["ar"],tags:{brand:"Vea","brand:wikidata":"Q5858167","brand:wikipedia":"es:Vea (supermercado)",name:"Vea",shop:"supermarket"}},"shop/supermarket|VinMart":{countryCodes:["vn"],matchTags:["shop/department_store"],nomatch:["shop/convenience|VinMart+"],tags:{brand:"VinMart","brand:wikidata":"Q60245505","brand:wikipedia":"vi:VinMart",name:"VinMart",shop:"supermarket"}},"shop/supermarket|Volg":{countryCodes:["ch","li"],tags:{brand:"Volg","brand:wikidata":"Q2530746","brand:wikipedia":"de:Volg",name:"Volg",shop:"supermarket"}},"shop/supermarket|Vomar":{countryCodes:["nl"],tags:{brand:"Vomar","brand:wikidata":"Q3202837","brand:wikipedia":"nl:Vomar",name:"Vomar",shop:"supermarket"}},"shop/supermarket|Vons":{countryCodes:["us"],tags:{brand:"Vons","brand:wikidata":"Q7941609","brand:wikipedia":"en:Vons",name:"Vons",shop:"supermarket"}},"shop/supermarket|Waitrose":{countryCodes:["gb","je"],tags:{brand:"Waitrose","brand:wikidata":"Q771734","brand:wikipedia":"en:Waitrose & Partners",name:"Waitrose",shop:"supermarket"}},"shop/supermarket|Walmart Neighborhood Market":{countryCodes:["ca","mx","us"],tags:{brand:"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"en:Walmart",name:"Walmart Neighborhood Market",shop:"supermarket"}},"shop/supermarket|Walmart Supercenter":{matchNames:["walmart supercentre"],matchTags:["shop/department_store"],tags:{brand:"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"en:Walmart",name:"Walmart Supercenter",shop:"supermarket"}},"shop/supermarket|Wasgau":{countryCodes:["de"],tags:{brand:"Wasgau","brand:wikidata":"Q2536857","brand:wikipedia":"de:Wasgau (Unternehmen)",name:"Wasgau",shop:"supermarket"}},"shop/supermarket|Wegmans":{countryCodes:["us"],tags:{brand:"Wegmans","brand:wikidata":"Q11288478","brand:wikipedia":"en:Wegmans",name:"Wegmans",shop:"supermarket"}},"shop/supermarket|Weis":{countryCodes:["us"],tags:{brand:"Weis","brand:wikidata":"Q7980370","brand:wikipedia":"en:Weis Markets",name:"Weis",shop:"supermarket"}},"shop/supermarket|Whole Foods Market":{countryCodes:["ca","gb","us"],matchNames:["whole foods"],tags:{brand:"Whole Foods Market","brand:wikidata":"Q1809448","brand:wikipedia":"en:Whole Foods Market",name:"Whole Foods Market",shop:"supermarket"}},"shop/supermarket|Willys":{countryCodes:["se"],tags:{brand:"Willys","brand:wikidata":"Q10720214","brand:wikipedia":"sv:Willys",name:"Willys",shop:"supermarket"}},"shop/supermarket|WinCo Foods":{countryCodes:["us"],tags:{brand:"WinCo Foods","brand:wikidata":"Q8023592","brand:wikipedia":"en:WinCo Foods",name:"WinCo Foods",shop:"supermarket"}},"shop/supermarket|Winn-Dixie":{countryCodes:["us"],tags:{brand:"Winn-Dixie","brand:wikidata":"Q1264366","brand:wikipedia":"en:Winn-Dixie",name:"Winn-Dixie",shop:"supermarket"}},"shop/supermarket|Woolworths":{countryCodes:["au"],nomatch:["shop/clothes|Woolworths"],tags:{brand:"Woolworths","brand:wikidata":"Q3249145","brand:wikipedia":"en:Woolworths Supermarkets",name:"Woolworths",shop:"supermarket"}},"shop/supermarket|Your Independent Grocer":{countryCodes:["ca"],matchNames:["independent"],tags:{brand:"Your Independent Grocer","brand:wikidata":"Q8058833","brand:wikipedia":"en:Your Independent Grocer",name:"Your Independent Grocer",shop:"supermarket"}},"shop/supermarket|basic":{countryCodes:["de"],tags:{brand:"basic","brand:wikidata":"Q809994","brand:wikipedia":"de:Basic AG",name:"basic",organic:"only",shop:"supermarket"}},"shop/supermarket|denn's Biomarkt":{countryCodes:["at","de"],tags:{brand:"denn's Biomarkt","brand:wikidata":"Q48883773","brand:wikipedia":"de:Dennree",name:"denn's Biomarkt",organic:"only",shop:"supermarket"}},"shop/supermarket|fakta":{countryCodes:["dk"],tags:{brand:"fakta","brand:wikidata":"Q3172238","brand:wikipedia":"en:Fakta",name:"fakta",shop:"supermarket"}},"shop/supermarket|Şok":{countryCodes:["tr"],tags:{brand:"Şok","brand:wikidata":"Q19613992","brand:wikipedia":"tr:Şok (market)",name:"Şok",shop:"supermarket"}},"shop/supermarket|ΑΒ Βασιλόπουλος":{countryCodes:["gr"],tags:{brand:"ΑΒ Βασιλόπουλος","brand:el":"ΑΒ Βασιλόπουλος","brand:en":"AB Vassilopoulos","brand:wikidata":"Q4721807","brand:wikipedia":"el:Άλφα Βήτα Βασιλόπουλος",name:"ΑΒ Βασιλόπουλος","name:el":"ΑΒ Βασιλόπουλος","name:en":"AB Vassilopoulos",shop:"supermarket"}},"shop/supermarket|Γαλαξίας":{countryCodes:["gr"],tags:{brand:"Γαλαξίας","brand:el":"Γαλαξίας","brand:en":"Galaxias","brand:wikidata":"Q5518063","brand:wikipedia":"el:Γαλαξίας (σούπερ μάρκετ)",name:"Γαλαξίας","name:el":"Γαλαξίας","name:en":"Galaxias",shop:"supermarket"}},"shop/supermarket|Μασούτης":{countryCodes:["gr"],tags:{brand:"Μασούτης","brand:el":"Μασούτης","brand:en":"Masoutis","brand:wikidata":"Q6783887","brand:wikipedia":"en:Masoutis",name:"Μασούτης","name:el":"Μασούτης","name:en":"Masoutis",shop:"supermarket"}},"shop/supermarket|Σκλαβενίτης":{countryCodes:["gr"],tags:{brand:"Σκλαβενίτης","brand:el":"Σκλαβενίτης","brand:en":"Sklavenitis","brand:wikidata":"Q7536037","brand:wikipedia":"el:Σκλαβενίτης",name:"Σκλαβενίτης","name:el":"Σκλαβενίτης","name:en":"Sklavenitis",shop:"supermarket"}},"shop/supermarket|АТБ":{tags:{brand:"АТБ",name:"АТБ",shop:"supermarket"}},"shop/supermarket|Абсолют~(Russia)":{countryCodes:["ru"],tags:{brand:"Абсолют","brand:wikidata":"Q62389597",name:"Абсолют",shop:"supermarket"}},"shop/supermarket|Абсолют~(Ukraine)":{countryCodes:["ua"],tags:{brand:"Абсолют","brand:wikidata":"Q62389546",name:"Абсолют",shop:"supermarket"}},"shop/supermarket|Авоська":{tags:{brand:"Авоська",name:"Авоська",shop:"supermarket"}},"shop/supermarket|Азбука Вкуса":{countryCodes:["ru"],tags:{brand:"Азбука Вкуса","brand:en":"Azbuka Vkusa","brand:wikidata":"Q4058209","brand:wikipedia":"en:Azbuka Vkusa",name:"Азбука Вкуса","name:en":"Azbuka Vkusa",shop:"supermarket"}},"shop/supermarket|Атак":{countryCodes:["ru"],tags:{brand:"Атак","brand:en":"Atac","brand:wikidata":"Q2868738","brand:wikipedia":"ru:Atac",name:"Атак","name:en":"Atac",shop:"supermarket"}},"shop/supermarket|Ашан":{countryCodes:["ru","ua"],tags:{brand:"Ашан","brand:en":"Auchan","brand:wikidata":"Q758603","brand:wikipedia":"ru:Auchan",name:"Ашан","name:en":"Auchan",shop:"supermarket"}},"shop/supermarket|Байрам":{countryCodes:["ru"],tags:{brand:"Байрам",name:"Байрам",shop:"supermarket"}},"shop/supermarket|Брусничка":{countryCodes:["ua"],tags:{brand:"Брусничка","brand:en":"Brusnichka","brand:wikidata":"Q21656645","brand:wikipedia":"uk:Брусничка (торгова мережа)",name:"Брусничка","name:en":"Brusnichka",shop:"supermarket"}},"shop/supermarket|Верный":{tags:{brand:"Верный",name:"Верный",shop:"supermarket"}},"shop/supermarket|Виктория":{countryCodes:["ru"],matchTags:["shop/convenience"],nomatch:["amenity/cafe|Виктория","shop/hairdresser|Виктория"],tags:{brand:"Виктория","brand:wikidata":"Q4111046","brand:wikipedia":"ru:Виктория (сеть магазинов)",name:"Виктория",shop:"supermarket"}},"shop/supermarket|Виталюр":{countryCodes:["by"],tags:{brand:"Виталюр","brand:wikidata":"Q55663075","brand:wikipedia":"ru:Виталюр",name:"Виталюр",shop:"supermarket"}},"shop/supermarket|Вопак":{countryCodes:["ua"],tags:{brand:"Вопак","brand:en":"Vopak","brand:wikidata":"Q30966107","brand:wikipedia":"uk:Вопак",name:"Вопак","name:en":"Vopak",shop:"supermarket"}},"shop/supermarket|Гастроном":{tags:{brand:"Гастроном",name:"Гастроном",shop:"supermarket"}},"shop/supermarket|Гроздь":{nomatch:["shop/convenience|Гроздь"],tags:{brand:"Гроздь","brand:wikidata":"Q21638412","brand:wikipedia":"ru:Гроздь (сеть магазинов)",name:"Гроздь",shop:"supermarket"}},"shop/supermarket|Гулливер":{countryCodes:["ru"],tags:{brand:"Гулливер","brand:wikidata":"Q58003470",name:"Гулливер",shop:"supermarket"}},"shop/supermarket|Десяточка":{countryCodes:["ru"],tags:{brand:"Десяточка","brand:en":"Desyatochka","brand:wikidata":"Q61876182",name:"Десяточка",shop:"supermarket"}},"shop/supermarket|Дикси":{countryCodes:["ru"],matchTags:["shop/convenience"],tags:{brand:"Дикси","brand:en":"Dixy","brand:wikidata":"Q4161561","brand:wikipedia":"ru:Дикси (сеть магазинов)",name:"Дикси",shop:"supermarket"}},"shop/supermarket|Евроопт":{countryCodes:["by"],matchNames:["евроопт market"],matchTags:["shop/convenience"],tags:{brand:"Евроопт","brand:en":"Euroopt","brand:ru":"Евроопт","brand:wikidata":"Q2565040","brand:wikipedia":"be:Еўрагандаль",name:"Евроопт","name:en":"Euroopt","name:ru":"Евроопт",shop:"supermarket"}},"shop/supermarket|Евроопт Super":{countryCodes:["by"],tags:{brand:"Евроопт Super",name:"Евроопт Super",shop:"supermarket"}},"shop/supermarket|Караван":{countryCodes:["ru","ua"],tags:{brand:"Караван",name:"Караван",shop:"supermarket"}},"shop/supermarket|Карусель":{countryCodes:["ru"],tags:{brand:"Карусель","brand:en":"Karusel","brand:wikidata":"Q4216307","brand:wikipedia":"ru:Карусель (сеть магазинов)",name:"Карусель","name:en":"Karusel",shop:"supermarket"}},"shop/supermarket|Квартал":{tags:{brand:"Квартал",name:"Квартал",shop:"supermarket"}},"shop/supermarket|Кировский":{countryCodes:["ru"],matchTags:["shop/convenience"],tags:{brand:"Кировский","brand:wikidata":"Q63301903",name:"Кировский",shop:"supermarket"}},"shop/supermarket|Командор":{countryCodes:["ru"],tags:{brand:"Командор","brand:en":"Komandor","brand:wikidata":"Q61876152",name:"Командор",shop:"supermarket"}},"shop/supermarket|Красный Яр":{countryCodes:["ru"],tags:{brand:"Красный Яр","brand:en":"Krasnyj Jar","brand:wikidata":"Q1786753","brand:wikipedia":"ru:Красный Яр",name:"Красный Яр",shop:"supermarket"}},"shop/supermarket|Лента":{countryCodes:["ru"],tags:{brand:"Лента","brand:en":"Lenta","brand:wikidata":"Q4258608","brand:wikipedia":"ru:Лента (сеть магазинов)",name:"Лента","name:en":"Lenta",shop:"supermarket"}},"shop/supermarket|Магазин":{tags:{brand:"Магазин",name:"Магазин",shop:"supermarket"}},"shop/supermarket|Магнит":{matchTags:["shop/department_store"],nomatch:["shop/convenience|Магнит","shop/cosmetics|Магнит Косметик"],tags:{brand:"Магнит","brand:en":"Magnit","brand:wikidata":"Q940518","brand:wikipedia":"ru:Магнит (сеть магазинов)",name:"Магнит","name:en":"Magnit",shop:"supermarket"}},"shop/supermarket|Магнит у дома":{countryCodes:["ru"],tags:{brand:"Магнит у дома",name:"Магнит у дома",shop:"supermarket"}},"shop/supermarket|Магнолия":{countryCodes:["ru"],matchTags:["shop/convenience"],tags:{brand:"Магнолия","brand:wikipedia":"ru:Магнолия (сеть магазинов)",name:"Магнолия",shop:"supermarket"}},"shop/supermarket|Мария-Ра":{countryCodes:["ru"],nomatch:["shop/convenience|Мария-Ра"],tags:{brand:"Мария-Ра","brand:en":"Maria-ra","brand:wikidata":"Q4281631","brand:wikipedia":"ru:Мария-Ра",name:"Мария-Ра","name:en":"Maria-ra",shop:"supermarket"}},"shop/supermarket|Мираторг":{countryCodes:["ru"],tags:{brand:"Мираторг",name:"Мираторг",shop:"supermarket"}},"shop/supermarket|Монетка":{countryCodes:["ru"],tags:{brand:"Монетка","brand:en":"Monetka","brand:wikidata":"Q4301704","brand:wikipedia":"ru:Монетка (сеть магазинов)",name:"Монетка","name:en":"Monetka",shop:"supermarket"}},"shop/supermarket|Народная 7Я семьЯ":{countryCodes:["ru"],matchNames:["семья"],tags:{brand:"Народная 7Я семьЯ","brand:en":"People's 7th Family","brand:wikidata":"Q4032436","brand:wikipedia":"ru:Народная 7Я семья",name:"Народная 7Я семьЯ","name:en":"People's 7th Family",shop:"supermarket"}},"shop/supermarket|Перекрёсток":{countryCodes:["ru"],matchNames:["перекресток"],matchTags:["shop/convenience"],tags:{brand:"Перекрёсток","brand:en":"Perekryostok","brand:wikidata":"Q1684639","brand:wikipedia":"en:Perekrestok (supermarket chain)",name:"Перекрёсток",shop:"supermarket"}},"shop/supermarket|Покупочка":{countryCodes:["ru"],tags:{brand:"Покупочка","brand:wikidata":"Q58003270",name:"Покупочка",shop:"supermarket"}},"shop/supermarket|Полушка":{countryCodes:["ru"],tags:{brand:"Полушка","brand:en":"Polushka","brand:wikidata":"Q4371080","brand:wikipedia":"ru:Полушка (сеть магазинов)",name:"Полушка","name:en":"Polushka",shop:"supermarket"}},"shop/supermarket|Пятёрочка":{countryCodes:["ru"],matchNames:["пятерочка"],matchTags:["shop/convenience"],tags:{brand:"Пятёрочка","brand:en":"Pyaterochka","brand:wikidata":"Q1768969","brand:wikipedia":"ru:Пятёрочка",name:"Пятёрочка","name:en":"Pyaterochka",shop:"supermarket"}},"shop/supermarket|Радеж":{countryCodes:["ru"],tags:{brand:"Радеж","brand:en":"Radezh","brand:wikidata":"Q4387165","brand:wikipedia":"ru:Радеж (торговая сеть)",name:"Радеж","name:en":"Radezh",shop:"supermarket"}},"shop/supermarket|Рублёвский":{countryCodes:["by"],tags:{brand:"Рублёвский",name:"Рублёвский",shop:"supermarket"}},"shop/supermarket|Рукавичка":{countryCodes:["ua"],tags:{brand:"Рукавичка","brand:en":"Rukavychka","brand:wikidata":"Q20092568","brand:wikipedia":"uk:Рукавичка (торгова мережа)",name:"Рукавичка","name:en":"Rukavychka",shop:"supermarket"}},"shop/supermarket|Светофор":{countryCodes:["ru"],tags:{brand:"Светофор","brand:en":"Svetofor","brand:wikidata":"Q61875920",name:"Светофор",shop:"supermarket"}},"shop/supermarket|Семишагофф":{countryCodes:["ru"],tags:{brand:"Семишагофф","brand:wikidata":"Q58003374",name:"Семишагофф",shop:"supermarket"}},"shop/supermarket|Сільпо":{countryCodes:["ua"],tags:{brand:"Сільпо","brand:en":"Silpo","brand:wikidata":"Q4419434","brand:wikipedia":"en:Silpo",name:"Сільпо","name:en":"Silpo",shop:"supermarket"}},"shop/supermarket|Таврия В":{countryCodes:["ua"],tags:{brand:"Таврия В","brand:wikidata":"Q61823146","brand:wikipedia":"uk:Таврія В",name:"Таврия В",shop:"supermarket"}},"shop/supermarket|Фора":{countryCodes:["ua"],tags:{brand:"Фора","brand:en":"Fora","brand:wikidata":"Q12165977","brand:wikipedia":"uk:Фора (мережа магазинів)",name:"Фора","name:en":"Fora",shop:"supermarket"}},"shop/supermarket|Фуршет":{countryCodes:["ua"],tags:{brand:"Фуршет","brand:en":"Furshet","brand:wikidata":"Q4493564","brand:wikipedia":"uk:Фуршет (мережа супермаркетів)",name:"Фуршет","name:en":"Furshet",shop:"supermarket"}},"shop/supermarket|Эдельвейс":{countryCodes:["ru"],tags:{brand:"Эдельвейс","brand:en":"Edelveis","brand:wikidata":"Q57979368",name:"Эдельвейс","name:en":"Edelveis",shop:"supermarket"}},"shop/supermarket|Ярче":{tags:{brand:"Ярче",name:"Ярче",shop:"supermarket"}},"shop/supermarket|سوبر ماركت":{tags:{brand:"سوبر ماركت",name:"سوبر ماركت",shop:"supermarket"}},"shop/supermarket|いなげや":{countryCodes:["jp"],tags:{brand:"いなげや","brand:en":"Inageya","brand:ja":"いなげや","brand:wikidata":"Q17193392","brand:wikipedia":"ja:いなげや",name:"いなげや","name:en":"Inageya","name:ja":"いなげや",shop:"supermarket"}},"shop/supermarket|まいばすけっと":{countryCodes:["jp"],tags:{brand:"まいばすけっと","brand:en":"My Basket","brand:ja":"まいばすけっと","brand:wikidata":"Q11278154","brand:wikipedia":"ja:まいばすけっと",name:"まいばすけっと","name:en":"My Basket","name:ja":"まいばすけっと",shop:"supermarket"}},"shop/supermarket|アコレ":{countryCodes:["jp"],tags:{brand:"アコレ","brand:ja":"アコレ",name:"アコレ","name:ja":"アコレ",shop:"supermarket"}},"shop/supermarket|イオン":{countryCodes:["jp"],tags:{brand:"イオン","brand:en":"AEON","brand:ja":"イオン","brand:wikidata":"Q11285951","brand:wikipedia":"ja:イオン (店舗ブランド)",name:"イオン","name:en":"AEON","name:ja":"イオン",shop:"supermarket"}},"shop/supermarket|イトーヨーカドー":{countryCodes:["jp"],matchNames:["イトーヨーカ堂"],tags:{brand:"イトーヨーカドー","brand:en":"Ito-Yokado","brand:ja":"イトーヨーカドー","brand:wikidata":"Q3088746","brand:wikipedia":"en:Ito-Yokado",name:"イトーヨーカドー","name:en":"Ito-Yokado","name:ja":"イトーヨーカドー",shop:"supermarket"}},"shop/supermarket|カスミ":{countryCodes:["jp"],tags:{brand:"カスミ","brand:en":"Kasumi","brand:ja":"カスミ","brand:wikidata":"Q11294160","brand:wikipedia":"ja:カスミ",name:"カスミ","name:en":"Kasumi","name:ja":"カスミ",shop:"supermarket"}},"shop/supermarket|コープ":{countryCodes:["jp"],tags:{brand:"コープ","brand:ja":"コープ",name:"コープ","name:ja":"コープ",shop:"supermarket"}},"shop/supermarket|サミット":{countryCodes:["jp"],tags:{brand:"サミット","brand:ja":"サミット",name:"サミット","name:ja":"サミット",shop:"supermarket"}},"shop/supermarket|バロー":{countryCodes:["jp"],tags:{brand:"バロー","brand:en":"Valor","brand:ja":"バロー","brand:wikidata":"Q11328346","brand:wikipedia":"ja:バロー (チェーンストア)",name:"バロー","name:en":"Valor","name:ja":"バロー",shop:"supermarket"}},"shop/supermarket|マックスバリュ":{countryCodes:["jp"],tags:{brand:"マックスバリュ","brand:en":"Maxvalu Tokai","brand:ja":"マックスバリュ","brand:wikidata":"Q1960109","brand:wikipedia":"en:MaxValu",name:"マックスバリュ","name:en":"Maxvalu Tokai","name:ja":"マックスバリュ",shop:"supermarket"}},"shop/supermarket|マルエツ":{countryCodes:["jp"],tags:{brand:"マルエツ","brand:en":"Maruetsu","brand:ja":"マルエツ","brand:wikidata":"Q11341197","brand:wikipedia":"ja:マルエツ",name:"マルエツ","name:en":"Maruetsu","name:ja":"マルエツ",shop:"supermarket"}},"shop/supermarket|ヤオコー":{countryCodes:["jp"],tags:{brand:"ヤオコー","brand:en":"Yaoko","brand:ja":"ヤオコー","brand:wikidata":"Q11344967","brand:wikipedia":"ja:ヤオコー",name:"ヤオコー","name:en":"Yaoko","name:ja":"ヤオコー",shop:"supermarket"}},"shop/supermarket|ヨークベニマル":{countryCodes:["jp"],tags:{brand:"ヨークベニマル","brand:en":"York Benimaru","brand:ja":"ヨークベニマル","brand:wikidata":"Q11346199","brand:wikipedia":"ja:ヨークベニマル",name:"ヨークベニマル","name:en":"York Benimaru","name:ja":"ヨークベニマル",shop:"supermarket"}},"shop/supermarket|ヨークマート":{countryCodes:["jp"],tags:{brand:"ヨークマート","brand:en":"YorkMart","brand:ja":"ヨークマート","brand:wikidata":"Q11346201","brand:wikipedia":"ja:ヨークマート",name:"ヨークマート","name:en":"YorkMart","name:ja":"ヨークマート",shop:"supermarket"}},"shop/supermarket|ライフ":{countryCodes:["jp"],tags:{brand:"ライフ","brand:en":"Life","brand:ja":"ライフ","brand:wikidata":"Q11346476","brand:wikipedia":"ja:ライフコーポレーション",name:"ライフ","name:en":"Life","name:ja":"ライフ",shop:"supermarket"}},"shop/supermarket|全聯":{countryCodes:["tw"],tags:{brand:"全聯","brand:en":"Pxmart","brand:wikidata":"Q7262792","brand:wikipedia":"en:PX Mart",name:"全聯","name:en":"Pxmart",shop:"supermarket"}},"shop/supermarket|全聯福利中心":{countryCodes:["tw"],tags:{brand:"全聯福利中心","brand:en":"Pxmart","brand:wikidata":"Q7262792","brand:wikipedia":"en:PX Mart",name:"全聯福利中心","name:en":"Pxmart",shop:"supermarket"}},"shop/supermarket|家乐福":{countryCodes:["cn"],tags:{brand:"家乐福","brand:wikidata":"Q217599","brand:wikipedia":"wuu:家乐福",name:"家乐福",shop:"supermarket"}},"shop/supermarket|惠康 Wellcome":{countryCodes:["hk"],tags:{brand:"惠康 Wellcome","brand:en":"Wellcome","brand:wikidata":"Q706247","brand:wikipedia":"zh:惠康",name:"惠康 Wellcome","name:en":"Wellcome",shop:"supermarket"}},"shop/supermarket|業務スーパー":{countryCodes:["jp"],tags:{brand:"業務スーパー","brand:en":"Gyōmu sūpā","brand:ja":"業務スーパー","brand:wikidata":"Q11590183","brand:wikipedia":"ja:神戸物産",name:"業務スーパー","name:en":"Gyōmu sūpā","name:ja":"業務スーパー",shop:"supermarket"}},"shop/supermarket|沃尔玛":{countryCodes:["cn"],tags:{brand:"沃尔玛","brand:en":"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"wuu:沃尔玛",name:"沃尔玛","name:en":"Walmart",shop:"supermarket"}},"shop/supermarket|美廉社":{countryCodes:["tw"],tags:{brand:"美廉社","brand:en":"Simple Mart","brand:wikidata":"Q15914017","brand:wikipedia":"zh:美廉社",name:"美廉社","name:en":"Simple Mart",shop:"supermarket"}},"shop/supermarket|西友":{countryCodes:["jp"],tags:{brand:"西友","brand:en":"Seiyu Group","brand:wikidata":"Q3108542","brand:wikipedia":"en:Seiyu Group",name:"西友","name:en":"Seiyu Group",shop:"supermarket"}},"shop/supermarket|頂好":{countryCodes:["tw"],tags:{brand:"頂好","brand:en":"Wellcome","brand:wikidata":"Q706247","brand:wikipedia":"en:Wellcome",name:"頂好","name:en":"Wellcome",shop:"supermarket"}},"shop/supermarket|頂好超市":{countryCodes:["tw"],tags:{brand:"頂好超市","brand:en":"Wellcome","brand:wikidata":"Q706247","brand:wikipedia":"en:Wellcome",name:"頂好超市","name:en":"Wellcome",shop:"supermarket"}},"shop/supermarket|롯데마트":{countryCodes:["kr"],tags:{brand:"롯데마트","brand:ko":"롯데마트","brand:wikidata":"Q326715","brand:wikipedia":"ko:롯데마트",name:"롯데마트","name:en":"Lotte Mart","name:ko":"롯데마트",shop:"supermarket"}},"shop/supermarket|우리마트":{countryCodes:["kr"],tags:{brand:"우리마트","brand:ko":"우리마트",name:"우리마트","name:ko":"우리마트",shop:"supermarket"}},"shop/supermarket|하나로마트":{countryCodes:["kr"],tags:{brand:"하나로마트","brand:en":"Hanaro Mart","brand:ko":"하나로마트","brand:wikidata":"Q12590611","brand:wikipedia":"ko:농협유통",name:"하나로마트","name:ko":"하나로마트",shop:"supermarket"}},"shop/tea|DavidsTea":{countryCodes:["ca","us"],tags:{brand:"DavidsTea","brand:wikidata":"Q3019129","brand:wikipedia":"en:DavidsTea",name:"DavidsTea",shop:"tea"}},"shop/tea|T2":{countryCodes:["au"],tags:{brand:"T2","brand:wikidata":"Q48802134","brand:wikipedia":"en:T2 (Australian company)",name:"T2",shop:"tea"}},"shop/tea|TeeGschwendner":{countryCodes:["de"],tags:{brand:"TeeGschwendner","brand:wikidata":"Q2399969","brand:wikipedia":"de:TeeGschwendner",name:"TeeGschwendner",shop:"tea"}},"shop/ticket|Boutique Grandes Lignes":{countryCodes:["fr"],tags:{brand:"Boutique Grandes Lignes","brand:wikidata":"Q13646","brand:wikipedia":"fr:Société nationale des chemins de fer français",name:"Boutique Grandes Lignes",shop:"ticket"}},"shop/ticket|DB Reisezentrum":{countryCodes:["de"],matchNames:["reisezentrum"],tags:{brand:"DB Reisezentrum","brand:wikidata":"Q15842100","brand:wikipedia":"de:Reisezentrum",name:"DB Reisezentrum",shop:"ticket"}},"shop/ticket|Guichet Transilien":{countryCodes:["fr"],tags:{brand:"Guichet Transilien","brand:wikidata":"Q389554","brand:wikipedia":"fr:Transilien",name:"Guichet Transilien",shop:"ticket"}},"shop/tobacco|Nemzeti Dohánybolt":{countryCodes:["hu"],matchNames:["dohánybolt"],matchTags:["shop/kiosk"],tags:{brand:"Nemzeti Dohánybolt","brand:wikidata":"Q20639040","brand:wikipedia":"en:Dohánybolt",name:"Nemzeti Dohánybolt",shop:"tobacco"}},"shop/toys|Build-A-Bear Workshop":{countryCodes:["ca","gb","us"],matchNames:["build a bear"],matchTags:["shop/gift"],tags:{brand:"Build-A-Bear Workshop","brand:wikidata":"Q1002992","brand:wikipedia":"en:Build-A-Bear Workshop",name:"Build-A-Bear Workshop",shop:"toys"}},"shop/toys|Dráčik":{countryCodes:["cz","sk"],tags:{brand:"Dráčik","brand:wikidata":"Q57653669",name:"Dráčik",shop:"toys"}},"shop/toys|Intertoys":{countryCodes:["be","de","nl"],tags:{brand:"Intertoys","brand:wikidata":"Q1891407","brand:wikipedia":"nl:Intertoys",name:"Intertoys",shop:"toys"}},"shop/toys|JouéClub":{countryCodes:["ad","fr","it","lb","ma","qa"],tags:{brand:"JouéClub","brand:wikidata":"Q3187152","brand:wikipedia":"fr:JouéClub",name:"JouéClub",shop:"toys"}},"shop/toys|King Jouet":{countryCodes:["fr"],tags:{brand:"King Jouet","brand:en":"King Toy","brand:wikidata":"Q3197009","brand:wikipedia":"fr:King Jouet",name:"King Jouet","name:en":"King Toy",shop:"toys"}},"shop/toys|La Grande Récré":{countryCodes:["be","ci","es","fr","ma"],tags:{brand:"La Grande Récré","brand:wikidata":"Q3209556","brand:wikipedia":"fr:La Grande Récré (magasin)",name:"La Grande Récré",shop:"toys"}},"shop/toys|Lego":{matchNames:["lego store"],tags:{brand:"Lego","brand:wikidata":"Q1063455","brand:wikipedia":"en:The Lego Group",name:"Lego",shop:"toys"}},"shop/toys|Lekia":{countryCodes:["no","se"],tags:{brand:"Lekia","brand:wikidata":"Q56303274","brand:wikipedia":"sv:Lekia",name:"Lekia",shop:"toys"}},"shop/toys|Maxi Toys":{countryCodes:["be","de","fr","it"],tags:{brand:"Maxi Toys","brand:wikidata":"Q16663879","brand:wikipedia":"fr:Maxi Toys",name:"Maxi Toys",shop:"toys"}},"shop/toys|Smyths":{countryCodes:["at","ch","de","gb","ie"],tags:{brand:"Smyths","brand:wikidata":"Q7546779","brand:wikipedia":"en:Smyths",name:"Smyths",shop:"toys"}},"shop/toys|The Entertainer":{countryCodes:["gb","je"],tags:{brand:"The Entertainer","brand:wikidata":"Q7732289","brand:wikipedia":"en:The Entertainer (retailer)",name:"The Entertainer",shop:"toys"}},"shop/toys|Toys Center":{tags:{brand:"Toys Center",name:"Toys Center",shop:"toys"}},"shop/toys|Toys R Us":{tags:{brand:"Toys R Us","brand:wikidata":"Q696334","brand:wikipedia":"en:Toys \"R\" Us",name:"Toys R Us",shop:"toys"}},"shop/toys|Бегемотик":{countryCodes:["ru"],tags:{brand:"Бегемотик",name:"Бегемотик",shop:"toys"}},"shop/toys|Детский мир":{countryCodes:["by","kg","kz","ru","ua","uz"],tags:{brand:"Детский мир","brand:en":"Detskiy Mir","brand:wikidata":"Q16643324","brand:wikipedia":"en:Detsky Mir",name:"Детский мир","name:en":"Detskiy Mir",shop:"toys"}},"shop/toys|Кораблик":{countryCodes:["ru"],tags:{brand:"Кораблик","brand:wikidata":"Q57653416",name:"Кораблик",shop:"toys"}},"shop/trade|84 Lumber":{countryCodes:["us"],matchNames:["84","eighty-four lumber"],tags:{brand:"84 Lumber","brand:wikidata":"Q4644779","brand:wikipedia":"en:84 Lumber",name:"84 Lumber",shop:"trade",trade:"building_supplies"}},"shop/trade|Fastenal":{countryCodes:["ca","pa","us"],tags:{brand:"Fastenal","brand:wikidata":"Q3067119","brand:wikipedia":"en:Fastenal",name:"Fastenal",shop:"trade"}},"shop/trade|Grainger":{countryCodes:["ca","us"],matchNames:["granger","w. w. grainger"],tags:{brand:"Grainger","brand:wikidata":"Q1627894","brand:wikipedia":"en:W. W. Grainger",name:"Grainger",shop:"trade"}},"shop/travel_agency|American Automobile Association":{countryCodes:["us"],matchTags:["office/travel_agent","shop/car"],nomatch:["office/insurance|AAA Insurance"],tags:{brand:"American Automobile Association","brand:wikidata":"Q463436","brand:wikipedia":"en:American Automobile Association",name:"American Automobile Association",shop:"travel_agency",short_name:"AAA"}},"shop/travel_agency|Coral Travel":{countryCodes:["pl","ru","ua"],tags:{brand:"Coral Travel","brand:wikidata":"Q58011479",name:"Coral Travel",shop:"travel_agency"}},"shop/travel_agency|D-reizen":{countryCodes:["nl"],tags:{brand:"D-reizen","brand:wikidata":"Q2445498","brand:wikipedia":"nl:D-reizen",name:"D-reizen",shop:"travel_agency"}},"shop/travel_agency|DER Reisebüro":{countryCodes:["de"],tags:{brand:"DER Reisebüro","brand:wikidata":"Q56729186","brand:wikipedia":"de:Deutsches Reisebüro",name:"DER Reisebüro",shop:"travel_agency"}},"shop/travel_agency|First Reisebüro":{countryCodes:["de"],tags:{brand:"First Reisebüro","brand:wikidata":"Q573103","brand:wikipedia":"en:TUI Group",name:"First Reisebüro",shop:"travel_agency"}},"shop/travel_agency|Flight Centre":{tags:{brand:"Flight Centre","brand:wikidata":"Q5459202","brand:wikipedia":"en:Flight Centre",name:"Flight Centre",shop:"travel_agency"}},"shop/travel_agency|Halcón Viajes":{countryCodes:["es"],tags:{brand:"Halcón Viajes","brand:wikidata":"Q57591939",name:"Halcón Viajes",shop:"travel_agency"}},"shop/travel_agency|Havas Voyages":{countryCodes:["fr"],tags:{brand:"Havas Voyages","brand:wikidata":"Q57628091",name:"Havas Voyages",shop:"travel_agency"}},"shop/travel_agency|Liberty Travel":{countryCodes:["us"],tags:{brand:"Liberty Travel","brand:wikidata":"Q17031665","brand:wikipedia":"en:Liberty Travel",name:"Liberty Travel",shop:"travel_agency"}},"shop/travel_agency|Reiseland":{countryCodes:["de"],tags:{brand:"Reiseland","brand:wikidata":"Q40387610","brand:wikipedia":"de:OTTO Reisen",name:"Reiseland",shop:"travel_agency"}},"shop/travel_agency|Selectour":{countryCodes:["fr"],tags:{brand:"Selectour","brand:wikidata":"Q3478073","brand:wikipedia":"fr:Selectour",name:"Selectour",shop:"travel_agency"}},"shop/travel_agency|TUI~(Group)":{matchNames:["tui reisecenter"],tags:{brand:"TUI","brand:wikidata":"Q573103","brand:wikipedia":"en:TUI Group",name:"TUI",shop:"travel_agency"}},"shop/travel_agency|TUI~(UK)":{countryCodes:["gb"],matchNames:["thomson"],tags:{brand:"TUI","brand:wikidata":"Q7795876","brand:wikipedia":"en:TUI UK",name:"TUI",shop:"travel_agency"}},"shop/travel_agency|The Co-operative Travel":{countryCodes:["gb"],tags:{brand:"The Co-operative Travel","brand:wikidata":"Q7726526","brand:wikipedia":"en:The Co-operative Travel",name:"The Co-operative Travel",shop:"travel_agency"}},"shop/travel_agency|Thomas Cook":{tags:{brand:"Thomas Cook","brand:wikidata":"Q2141800","brand:wikipedia":"en:Thomas Cook Group",name:"Thomas Cook",shop:"travel_agency"}},"shop/travel_agency|Поехали с нами":{countryCodes:["ua"],tags:{brand:"Поехали с нами","brand:wikidata":"Q25439141","brand:wikipedia":"uk:Поїхали з нами",name:"Поехали с нами",shop:"travel_agency"}},"shop/tyres|Big O Tires":{countryCodes:["ca","us"],tags:{brand:"Big O Tires","brand:wikidata":"Q4906085","brand:wikipedia":"en:Big O Tires",name:"Big O Tires",shop:"tyres"}},"shop/tyres|Bridgestone":{tags:{brand:"Bridgestone","brand:wikidata":"Q179433","brand:wikipedia":"en:Bridgestone",name:"Bridgestone",shop:"tyres"}},"shop/tyres|Discount Tire":{countryCodes:["us"],tags:{brand:"Discount Tire","brand:wikidata":"Q5281735","brand:wikipedia":"en:Discount Tire",name:"Discount Tire",shop:"tyres"}},"shop/tyres|Express Oil Change & Tire Engineers":{countryCodes:["us"],tags:{brand:"Express Oil Change & Tire Engineers","brand:wikidata":"Q39057654","brand:wikipedia":"en:Express Oil Change & Tire Engineers",name:"Express Oil Change & Tire Engineers",shop:"tyres"}},"shop/tyres|Les Schwab Tire Center":{countryCodes:["us"],tags:{brand:"Les Schwab Tire Center","brand:wikidata":"Q6529977","brand:wikipedia":"en:Les Schwab Tire Centers",name:"Les Schwab Tire Center",shop:"tyres"}},"shop/tyres|Michelin":{tags:{brand:"Michelin","brand:wikidata":"Q151107","brand:wikipedia":"en:Michelin",name:"Michelin",shop:"tyres"}},"shop/tyres|Tire Discounters":{countryCodes:["us"],tags:{brand:"Tire Discounters","brand:wikidata":"Q29093639","brand:wikipedia":"en:Tire Discounters",name:"Tire Discounters",shop:"tyres"}},"shop/tyres|Tires Plus":{countryCodes:["us"],tags:{brand:"Tires Plus","brand:wikidata":"Q64015091",name:"Tires Plus",shop:"tyres"}},"shop/tyres|Vianor":{tags:{brand:"Vianor","brand:wikidata":"Q10714920","brand:wikipedia":"sv:Vianor",name:"Vianor",shop:"tyres"}},"shop/vacuum_cleaner|Oreck":{countryCodes:["us"],matchNames:["oreck vacuums"],tags:{brand:"Oreck","brand:wikidata":"Q57273844",name:"Oreck",shop:"vacuum_cleaner"}},"shop/variety_store|99 Cents Only Stores":{countryCodes:["us"],matchNames:["99 cent only stores","99 cents only"],matchTags:["shop/convenience","shop/department_store","shop/supermarket"],tags:{brand:"99 Cents Only Stores","brand:wikidata":"Q4646294","brand:wikipedia":"en:99 Cents Only Stores",name:"99 Cents Only Stores",shop:"variety_store"}},"shop/variety_store|Action":{countryCodes:["at","be","de","fr","nl","pl"],matchTags:["shop/supermarket"],tags:{brand:"Action","brand:wikidata":"Q2634111","brand:wikipedia":"nl:Action (winkel)",name:"Action",shop:"variety_store"}},"shop/variety_store|B&M Bargains":{countryCodes:["gb"],tags:{brand:"B&M Bargains","brand:wikidata":"Q4836931","brand:wikipedia":"en:B & M",name:"B&M Bargains",shop:"variety_store"}},"shop/variety_store|Big Bazar":{countryCodes:["be","nl"],tags:{brand:"Big Bazar","brand:wikidata":"Q15873104","brand:wikipedia":"nl:Big Bazar",name:"Big Bazar",shop:"variety_store"}},"shop/variety_store|D10150":{tags:{brand:"D10150",name:"D10150",shop:"variety_store"}},"shop/variety_store|D9150":{tags:{brand:"D9150",name:"D9150",shop:"variety_store"}},"shop/variety_store|D9300":{countryCodes:["br"],tags:{brand:"D9300",name:"D9300",shop:"variety_store"}},"shop/variety_store|Daiso Japan":{countryCodes:["au","us"],tags:{brand:"Daiso","brand:wikidata":"Q866991",name:"Daiso Japan",shop:"variety_store",short_name:"Daiso"}},"shop/variety_store|Dollar General":{countryCodes:["us"],matchTags:["shop/convenience","shop/department_store","shop/supermarket"],nomatch:["amenity/bank|Dollar Bank","amenity/car_rental|Dollar","shop/variety_store|Dollar Tree","shop/variety_store|Dollarama","shop/variety_store|Family Dollar"],tags:{brand:"Dollar General","brand:wikidata":"Q145168","brand:wikipedia":"en:Dollar General",name:"Dollar General",shop:"variety_store"}},"shop/variety_store|Dollar Tree":{countryCodes:["ca","us"],matchTags:["shop/convenience","shop/department_store","shop/supermarket"],nomatch:["amenity/bank|Dollar Bank","amenity/car_rental|Dollar","shop/variety_store|Dollar General","shop/variety_store|Dollarama","shop/variety_store|Family Dollar"],tags:{brand:"Dollar Tree","brand:wikidata":"Q5289230","brand:wikipedia":"en:Dollar Tree",name:"Dollar Tree",shop:"variety_store"}},"shop/variety_store|Dollarama":{countryCodes:["ca"],matchTags:["shop/convenience","shop/department_store","shop/supermarket"],nomatch:["amenity/bank|Dollar Bank","amenity/car_rental|Dollar","shop/variety_store|Dollar General","shop/variety_store|Dollar Tree","shop/variety_store|Family Dollar"],tags:{brand:"Dollarama","brand:wikidata":"Q3033947","brand:wikipedia":"en:Dollarama",name:"Dollarama",shop:"variety_store"}},"shop/variety_store|EuroShop":{countryCodes:["de"],tags:{brand:"EuroShop","brand:wikidata":"Q15846763","brand:wikipedia":"de:Schum EuroShop",name:"EuroShop",shop:"variety_store"}},"shop/variety_store|Family Dollar":{countryCodes:["us"],matchTags:["shop/convenience","shop/department_store","shop/supermarket"],nomatch:["amenity/bank|Dollar Bank","amenity/car_rental|Dollar","shop/variety_store|Dollar General","shop/variety_store|Dollar Tree","shop/variety_store|Dollarama"],tags:{brand:"Family Dollar","brand:wikidata":"Q5433101","brand:wikipedia":"en:Family Dollar",name:"Family Dollar",shop:"variety_store"}},"shop/variety_store|Five Below":{countryCodes:["us"],tags:{brand:"Five Below","brand:wikidata":"Q5455836","brand:wikipedia":"en:Five Below",name:"Five Below",shop:"variety_store"}},"shop/variety_store|Fix Price":{countryCodes:["by","ru"],tags:{brand:"Fix Price","brand:wikidata":"Q4038791","brand:wikipedia":"ru:Fix Price (сеть магазинов)",name:"Fix Price",shop:"variety_store"}},"shop/variety_store|Flying Tiger Copenhagen":{matchNames:["tgr","tiger"],tags:{brand:"Flying Tiger Copenhagen","brand:wikidata":"Q2786319","brand:wikipedia":"en:Flying Tiger Copenhagen",name:"Flying Tiger Copenhagen",shop:"variety_store",short_name:"Flying Tiger"}},"shop/variety_store|GiFi":{countryCodes:["fr"],tags:{brand:"GiFi","brand:wikidata":"Q3105439","brand:wikipedia":"fr:Gifi",name:"GiFi",shop:"variety_store"}},"shop/variety_store|Home Bargains":{countryCodes:["gb"],matchTags:["shop/supermarket"],tags:{brand:"Home Bargains","brand:wikidata":"Q5888229","brand:wikipedia":"en:Home Bargains",name:"Home Bargains",shop:"variety_store"}},"shop/variety_store|Mäc-Geiz":{countryCodes:["de"],tags:{brand:"Mäc-Geiz","brand:wikidata":"Q1957126","brand:wikipedia":"de:Mäc-Geiz",name:"Mäc-Geiz",shop:"variety_store"}},"shop/variety_store|NOZ":{countryCodes:["fr"],tags:{brand:"NOZ","brand:wikidata":"Q3345688","brand:wikipedia":"fr:Noz",name:"NOZ",shop:"variety_store"}},"shop/variety_store|Poundland":{countryCodes:["gb"],tags:{brand:"Poundland","brand:wikidata":"Q1434528","brand:wikipedia":"en:Poundland",name:"Poundland",shop:"variety_store"}},"shop/variety_store|Poundstretcher":{countryCodes:["gb"],tags:{brand:"Poundstretcher","brand:wikidata":"Q7235675","brand:wikipedia":"en:Poundstretcher",name:"Poundstretcher",shop:"variety_store"}},"shop/variety_store|Poundworld":{countryCodes:["gb","ie"],tags:{brand:"Poundworld","brand:wikidata":"Q16967516","brand:wikipedia":"en:Poundworld",name:"Poundworld",shop:"variety_store"}},"shop/variety_store|Roses":{countryCodes:["us"],tags:{brand:"Roses","brand:wikidata":"Q7368644","brand:wikipedia":"en:Roses (store)",name:"Roses",shop:"variety_store"}},"shop/variety_store|TEDi":{countryCodes:["at","de","es","hr","si","sk"],tags:{brand:"TEDi","brand:wikidata":"Q1364603","brand:wikipedia":"de:TEDi",name:"TEDi",shop:"variety_store"}},"shop/variety_store|Tokmanni":{countryCodes:["fi"],tags:{brand:"Tokmanni","brand:wikidata":"Q13423470","brand:wikipedia":"fi:Tokmanni",name:"Tokmanni",shop:"variety_store"}},"shop/variety_store|Wilko":{countryCodes:["gb"],tags:{brand:"Wilko","brand:wikidata":"Q8002536","brand:wikipedia":"en:Wilko (retailer)",name:"Wilko",shop:"variety_store"}},"shop/variety_store|キャンドゥ":{countryCodes:["jp"],tags:{brand:"キャンドゥ","brand:en":"CAN DO","brand:ja":"キャンドゥ","brand:wikidata":"Q11297367","brand:wikipedia":"ja:キャンドゥ",name:"キャンドゥ","name:en":"CAN DO","name:ja":"キャンドゥ",shop:"variety_store"}},"shop/variety_store|セリア":{countryCodes:["jp"],tags:{brand:"セリア","brand:en":"Seria","brand:ja":"セリア","brand:wikidata":"Q11314509","brand:wikipedia":"ja:セリア (100円ショップ)",name:"セリア","name:en":"Seria","name:ja":"セリア",shop:"variety_store"}},"shop/variety_store|ダイソー":{countryCodes:["jp"],matchNames:["ザ・ダイソー"],tags:{brand:"ダイソー","brand:en":"Daiso","brand:ja":"ダイソー","brand:wikidata":"Q866991","brand:wikipedia":"ja:大創産業",name:"ダイソー","name:en":"Daiso","name:ja":"ダイソー",shop:"variety_store"}},"shop/variety_store|ダイレックス":{countryCodes:["jp"],matchTags:["shop/supermarket"],tags:{brand:"ダイレックス","brand:en":"Direx","brand:ja":"ダイレックス","brand:wikidata":"Q11317051","brand:wikipedia":"ja:ダイレックス (ディスカウントストア)",name:"ダイレックス","name:en":"Direx","name:ja":"ダイレックス",shop:"variety_store"}},"shop/variety_store|トライアル":{countryCodes:["jp"],matchTags:["shop/supermarket"],tags:{brand:"トライアル","brand:en":"Trial","brand:ja":"トライアル","brand:wikidata":"Q11321723","brand:wikipedia":"ja:トライアルカンパニー",name:"トライアル","name:en":"Trial","name:ja":"トライアル",shop:"variety_store"}},"shop/variety_store|ドン・キホーテ":{countryCodes:["jp"],matchTags:["shop/supermarket"],tags:{brand:"ドン・キホーテ","brand:en":"Don Quijote","brand:ja":"ドン・キホーテ","brand:wikidata":"Q1185381","brand:wikipedia":"ja:ドン・キホーテ (企業)",name:"ドン・キホーテ","name:en":"Don Quijote","name:ja":"ドン・キホーテ",opening_hours:"24/7",shop:"variety_store",short_name:"ドンキ","short_name:en":"Donki","short_name:ja":"ドンキ"}},"shop/video_games|EB Games":{countryCodes:["au","ca","nz"],tags:{brand:"EB Games","brand:wikidata":"Q4993686","brand:wikipedia":"en:EB Games",name:"EB Games",shop:"video_games"}},"shop/video_games|Game":{countryCodes:["gb"],tags:{brand:"Game","brand:wikidata":"Q5519813","brand:wikipedia":"en:Game (retailer)",name:"Game",shop:"video_games"}},"shop/video_games|GameStop":{tags:{brand:"GameStop","brand:wikidata":"Q202210","brand:wikipedia":"en:GameStop",name:"GameStop",shop:"video_games"}},"shop/video_games|Micromania":{countryCodes:["fr"],tags:{brand:"Micromania","brand:wikidata":"Q3312221","brand:wikipedia":"en:Micromania (video game retailer)",name:"Micromania",shop:"video_games"}},"shop/video|Blockbuster":{tags:{brand:"Blockbuster","brand:wikidata":"Q884711","brand:wikipedia":"en:Blockbuster LLC",name:"Blockbuster",shop:"video"}},"shop/video|Family Video":{countryCodes:["us"],tags:{brand:"Family Video","brand:wikidata":"Q5433297","brand:wikipedia":"en:Family Video",name:"Family Video",shop:"video"}},"shop/video|TSUTAYA":{nomatch:["shop/books|TSUTAYA","shop/music|TSUTAYA"],tags:{brand:"TSUTAYA","brand:wikidata":"Q5193457","brand:wikipedia":"ja:カルチュア・コンビニエンス・クラブ",name:"TSUTAYA",shop:"video"}},"shop/video|ゲオ":{countryCodes:["jp"],matchNames:["geo"],tags:{brand:"GEO","brand:ja":"GEO","brand:wikidata":"Q5533938","brand:wikipedia":"ja:ゲオ",name:"ゲオ","name:en":"GEO","name:ja":"ゲオ",shop:"video"}},"shop/watches|Fossil":{countryCodes:["de","us"],matchTags:["shop/jewelry"],tags:{brand:"Fossil","brand:wikidata":"Q356212","brand:wikipedia":"en:Fossil Group",name:"Fossil",shop:"watches"}},"shop/watches|Omega":{countryCodes:["ch","fr"],tags:{brand:"Omega","brand:wikidata":"Q659224","brand:wikipedia":"en:Omega SA",name:"Omega",shop:"watches"}},"shop/watches|Rolex":{countryCodes:["us"],tags:{brand:"Rolex","brand:wikidata":"Q62288","brand:wikipedia":"en:Rolex",name:"Rolex",shop:"watches"}},"shop/watches|Swatch":{matchTags:["shop/jewelry"],tags:{brand:"Swatch","brand:wikidata":"Q573422","brand:wikipedia":"en:Swatch",name:"Swatch",shop:"watches"}},"shop/wholesale|BJ's Wholesale Club":{countryCodes:["us"],matchTags:["shop/department_store"],tags:{brand:"BJ's Wholesale Club","brand:wikidata":"Q4835754","brand:wikipedia":"en:BJ's Wholesale Club",name:"BJ's Wholesale Club",shop:"wholesale"}},"shop/wholesale|Costco":{matchNames:["costco wholesale"],matchTags:["shop/department_store"],nomatch:["amenity/fuel|Costco Gasoline","amenity/pharmacy|Costco Pharmacy"],tags:{brand:"Costco","brand:wikidata":"Q715583","brand:wikipedia":"en:Costco",name:"Costco",shop:"wholesale"}},"shop/wholesale|Makro":{matchTags:["shop/department_store"],tags:{brand:"Makro","brand:wikidata":"Q704606","brand:wikipedia":"en:Makro",name:"Makro",shop:"wholesale"}},"shop/wholesale|Metro":{matchTags:["shop/department_store"],nomatch:["amenity/bank|Metrobank","shop/supermarket|Metro~(Canada)"],tags:{brand:"Metro","brand:wikidata":"Q13610282","brand:wikipedia":"en:Metro Cash and Carry",name:"Metro",shop:"wholesale"}},"shop/wholesale|Sam's Club":{matchTags:["shop/department_store"],nomatch:["amenity/fuel|Sam's Club"],tags:{brand:"Sam's Club","brand:wikidata":"Q1972120","brand:wikipedia":"en:Sam's Club",name:"Sam's Club",shop:"wholesale"}},"shop/wholesale|コストコ":{countryCodes:["jp"],matchTags:["shop/department_store"],tags:{brand:"コストコ","brand:en":"Costco","brand:ja":"コストコ","brand:wikidata":"Q715583","brand:wikipedia":"ja:コストコ",name:"コストコ","name:en":"Costco","name:ja":"コストコ",shop:"wholesale"}},"tourism/hotel|B&B Hôtel":{countryCodes:["fr"],tags:{brand:"B&B Hôtel","brand:wikidata":"Q794939","brand:wikipedia":"en:B&B Hotels",name:"B&B Hôtel",tourism:"hotel"}},"tourism/hotel|Best Western":{nomatch:["tourism/hotel|Best Western Plus"],tags:{brand:"Best Western","brand:wikidata":"Q830334","brand:wikipedia":"en:Best Western",name:"Best Western",tourism:"hotel"}},"tourism/hotel|Best Western Plus":{countryCodes:["ca","us"],nomatch:["tourism/hotel|Best Western"],tags:{brand:"Best Western","brand:wikidata":"Q830334","brand:wikipedia":"en:Best Western",name:"Best Western Plus",tourism:"hotel"}},"tourism/hotel|Campanile":{nomatch:["amenity/restaurant|Campanile"],tags:{brand:"Campanile","brand:wikidata":"Q2412064","brand:wikipedia":"fr:Campanile (chaîne d'hôtels)",name:"Campanile",tourism:"hotel"}},"tourism/hotel|Candlewood Suites":{countryCodes:["us"],tags:{brand:"Candlewood Suites","brand:wikidata":"Q5032010","brand:wikipedia":"en:Candlewood Suites",name:"Candlewood Suites",tourism:"hotel"}},"tourism/hotel|Comfort Inn":{countryCodes:["ca","gb","us"],nomatch:["tourism/hotel|Comfort Suites"],tags:{brand:"Comfort Inn","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Comfort Inn",tourism:"hotel"}},"tourism/hotel|Comfort Inn & Suites":{countryCodes:["ca","us"],tags:{brand:"Comfort Inn & Suites","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Comfort Inn & Suites",tourism:"hotel"}},"tourism/hotel|Comfort Suites":{nomatch:["tourism/hotel|Comfort Inn"],tags:{brand:"Comfort Suites","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Comfort Suites",tourism:"hotel"}},"tourism/hotel|Country Inn & Suites":{countryCodes:["ca","us"],tags:{brand:"Country Inn & Suites","brand:wikidata":"Q5177332","brand:wikipedia":"en:Country Inns & Suites",name:"Country Inn & Suites",tourism:"hotel"}},"tourism/hotel|Courtyard by Marriott":{countryCodes:["ca","us"],matchNames:["courtyard marriott"],tags:{brand:"Courtyard by Marriott","brand:wikidata":"Q1053170","brand:wikipedia":"en:Courtyard by Marriott",name:"Courtyard by Marriott",tourism:"hotel"}},"tourism/hotel|Crowne Plaza":{tags:{brand:"Crowne Plaza","brand:wikidata":"Q2746220","brand:wikipedia":"en:Crowne Plaza",name:"Crowne Plaza",tourism:"hotel"}},"tourism/hotel|Days Inn":{countryCodes:["ca","gb","us"],tags:{brand:"Days Inn","brand:wikidata":"Q1047239","brand:wikipedia":"en:Days Inn",name:"Days Inn",tourism:"hotel"}},"tourism/hotel|Embassy Suites":{countryCodes:["us"],tags:{brand:"Embassy Suites","brand:wikidata":"Q5369524","brand:wikipedia":"en:Embassy Suites by Hilton",name:"Embassy Suites",tourism:"hotel"}},"tourism/hotel|Extended Stay America":{countryCodes:["us"],tags:{brand:"Extended Stay America","brand:wikidata":"Q5421850","brand:wikipedia":"en:Extended Stay America",name:"Extended Stay America",tourism:"hotel"}},"tourism/hotel|Fairfield Inn":{countryCodes:["ca","us"],matchNames:["fairfield inn & suites","fairfield inn and suites"],tags:{brand:"Fairfield Inn","brand:wikidata":"Q5430314","brand:wikipedia":"en:Fairfield Inn by Marriott",name:"Fairfield Inn",tourism:"hotel"}},"tourism/hotel|Formule 1":{countryCodes:["fr"],tags:{brand:"Formule 1","brand:wikidata":"Q1630895","brand:wikipedia":"en:Hotel Formule 1",name:"Formule 1",tourism:"hotel"}},"tourism/hotel|Grand Hyatt":{tags:{brand:"Grand Hyatt","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Grand Hyatt",tourism:"hotel"}},"tourism/hotel|Hampton":{countryCodes:["us"],matchNames:["hampton inn & suites","hampton inn and suites"],tags:{alt_name:"Hampton Inn",brand:"Hampton","brand:wikidata":"Q5646230","brand:wikipedia":"en:Hampton by Hilton",name:"Hampton",tourism:"hotel"}},"tourism/hotel|Hilton":{tags:{brand:"Hilton","brand:wikidata":"Q598884","brand:wikipedia":"en:Hilton Hotels & Resorts",name:"Hilton",tourism:"hotel"}},"tourism/hotel|Hilton Garden Inn":{countryCodes:["ca","mx","us"],tags:{brand:"Hilton Garden Inn","brand:wikidata":"Q1162859","brand:wikipedia":"en:Hilton Garden Inn",name:"Hilton Garden Inn",tourism:"hotel"}},"tourism/hotel|Holiday Inn":{nomatch:["tourism/hotel|Holiday Inn Express"],tags:{brand:"Holiday Inn","brand:wikidata":"Q2717882","brand:wikipedia":"en:Holiday Inn",name:"Holiday Inn",tourism:"hotel"}},"tourism/hotel|Holiday Inn Express":{nomatch:["tourism/hotel|Holiday Inn"],tags:{brand:"Holiday Inn Express","brand:wikidata":"Q5880423","brand:wikipedia":"en:Holiday Inn Express",name:"Holiday Inn Express",tourism:"hotel"}},"tourism/hotel|Holiday Inn Express & Suites":{countryCodes:["ca","us"],tags:{brand:"Holiday Inn Express & Suites","brand:wikidata":"Q5880423","brand:wikipedia":"en:Holiday Inn Express",name:"Holiday Inn Express & Suites",tourism:"hotel"}},"tourism/hotel|Home2 Suites":{countryCodes:["ca","mx","us"],matchNames:["home2"],tags:{brand:"Home2 Suites","brand:wikidata":"Q5887912","brand:wikipedia":"en:Home2 Suites by Hilton",name:"Home2 Suites",official_name:"Home2 Suites by Hilton",tourism:"hotel"}},"tourism/hotel|Homewood Suites":{countryCodes:["ca","us"],tags:{brand:"Homewood Suites","brand:wikidata":"Q5890701","brand:wikipedia":"en:Homewood Suites by Hilton",name:"Homewood Suites",tourism:"hotel"}},"tourism/hotel|Hyatt":{tags:{brand:"Hyatt","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Hyatt",tourism:"hotel"}},"tourism/hotel|Hyatt Centric":{tags:{brand:"Hyatt Centric","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Hyatt Centric",tourism:"hotel"}},"tourism/hotel|Hyatt House":{countryCodes:["us"],tags:{brand:"Hyatt House","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Hyatt House",tourism:"hotel"}},"tourism/hotel|Hyatt Place":{countryCodes:["us"],tags:{brand:"Hyatt","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Hyatt Place",tourism:"hotel"}},"tourism/hotel|Hyatt Regency":{tags:{brand:"Hyatt Regency","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Hyatt Regency",tourism:"hotel"}},"tourism/hotel|Ibis":{matchNames:["hotel ibis","ibis hotel"],tags:{brand:"Ibis","brand:wikidata":"Q920166","brand:wikipedia":"en:Ibis (hotel)",name:"Ibis",tourism:"hotel"}},"tourism/hotel|Ibis Budget":{tags:{brand:"Ibis Budget","brand:wikidata":"Q1458135","brand:wikipedia":"en:Ibis Budget",name:"Ibis Budget",tourism:"hotel"}},"tourism/hotel|Ibis Styles":{tags:{brand:"Ibis Styles","brand:wikidata":"Q3147425","brand:wikipedia":"en:Ibis Styles",name:"Ibis Styles",tourism:"hotel"}},"tourism/hotel|Kyriad":{countryCodes:["fr"],tags:{brand:"Kyriad","brand:wikidata":"Q11751808","brand:wikipedia":"pl:Kyriad",name:"Kyriad",tourism:"hotel"}},"tourism/hotel|La Quinta":{countryCodes:["us"],matchNames:["la quinta inn & suites","la quinta inn and suites","la quinta inns & suites","la quinta inns and suites"],tags:{brand:"La Quinta","brand:wikidata":"Q6464734","brand:wikipedia":"en:La Quinta Inns & Suites",name:"La Quinta",tourism:"hotel"}},"tourism/hotel|Le Méridien":{tags:{brand:"Le Méridien","brand:wikidata":"Q261077","brand:wikipedia":"en:Le Méridien",name:"Le Méridien",tourism:"hotel"}},"tourism/hotel|Marriott":{tags:{brand:"Marriott","brand:wikidata":"Q1141173","brand:wikipedia":"en:Marriott International",name:"Marriott",tourism:"hotel"}},"tourism/hotel|Mercure":{tags:{brand:"Mercure","brand:wikidata":"Q1709809","brand:wikipedia":"en:Mercure (hotel)",name:"Mercure",tourism:"hotel"}},"tourism/hotel|Novotel":{tags:{brand:"Novotel","brand:wikidata":"Q420545","brand:wikipedia":"en:Novotel",name:"Novotel",tourism:"hotel"}},"tourism/hotel|Park Hyatt":{tags:{brand:"Park Hyatt","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Park Hyatt",tourism:"hotel"}},"tourism/hotel|Premier Inn":{countryCodes:["gb"],tags:{brand:"Premier Inn","brand:wikidata":"Q2108626","brand:wikipedia":"en:Premier Inn",name:"Premier Inn",tourism:"hotel"}},"tourism/hotel|Première Classe":{countryCodes:["fr"],tags:{brand:"Première Classe","brand:wikidata":"Q5964551","brand:wikipedia":"en:Hôtel Première Classe",name:"Première Classe",tourism:"hotel"}},"tourism/hotel|Quality Inn":{countryCodes:["ca","mx","us"],tags:{brand:"Quality Inn","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Quality Inn",tourism:"hotel"}},"tourism/hotel|Quality Inn & Suites":{countryCodes:["ca","us"],tags:{brand:"Quality Inn & Suites","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Quality Inn & Suites",tourism:"hotel"}},"tourism/hotel|Ramada":{tags:{brand:"Ramada","brand:wikidata":"Q1502859","brand:wikipedia":"en:Ramada",name:"Ramada",tourism:"hotel"}},"tourism/hotel|Red Roof Inn":{countryCodes:["us"],tags:{brand:"Red Roof Inn","brand:wikidata":"Q7304949","brand:wikipedia":"en:Red Roof Inn",name:"Red Roof Inn",tourism:"hotel"}},"tourism/hotel|Renaissance Hotel":{countryCodes:["us"],tags:{brand:"Renaissance Hotels","brand:wikidata":"Q2143252","brand:wikipedia":"en:Renaissance Hotels",name:"Renaissance Hotel",tourism:"hotel"}},"tourism/hotel|Residence Inn":{tags:{brand:"Residence Inn","brand:wikidata":"Q7315394","brand:wikipedia":"en:Residence Inn by Marriott",name:"Residence Inn",tourism:"hotel"}},"tourism/hotel|Sheraton":{tags:{brand:"Sheraton","brand:wikidata":"Q634831","brand:wikipedia":"en:Sheraton Hotels and Resorts",name:"Sheraton",tourism:"hotel"}},"tourism/hotel|Sleep Inn":{countryCodes:["us"],tags:{brand:"Sleep Inn","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Sleep Inn",tourism:"hotel"}},"tourism/hotel|Staybridge Suites":{countryCodes:["ca","gb","us"],tags:{brand:"Staybridge Suites","brand:wikidata":"Q7605116","brand:wikipedia":"en:Staybridge Suites",name:"Staybridge Suites",tourism:"hotel"}},"tourism/hotel|Travelodge":{tags:{brand:"Travelodge","brand:wikidata":"Q7836087","brand:wikipedia":"en:Travelodge",name:"Travelodge",tourism:"hotel"}},"tourism/hotel|W Hotels":{tags:{brand:"W Hotels","brand:wikidata":"Q7958488","brand:wikipedia":"en:W Hotels",name:"W Hotels",short_name:"W",tourism:"hotel"}},"tourism/hotel|東横イン":{countryCodes:["jp"],tags:{brand:"東横イン","brand:en":"Toyoko Inn","brand:ja":"東横イン","brand:wikidata":"Q1320541","brand:wikipedia":"en:Toyoko Inn",name:"東横イン","name:en":"Toyoko Inn","name:ja":"東横イン",tourism:"hotel"}},"tourism/motel|Econo Lodge":{tags:{brand:"Econo Lodge","brand:wikidata":"Q5333330","brand:wikipedia":"en:Econo Lodge",name:"Econo Lodge",tourism:"motel"}},"tourism/motel|Motel 6":{countryCodes:["ca","us"],tags:{brand:"Motel 6","brand:wikidata":"Q2188884","brand:wikipedia":"en:Motel 6",name:"Motel 6",tourism:"motel"}},"tourism/motel|Rodeway Inn":{countryCodes:["ca","us"],tags:{brand:"Rodeway Inn","brand:wikidata":"Q7356709","brand:wikipedia":"en:Rodeway Inn",name:"Rodeway Inn",tourism:"motel"}},"tourism/motel|Super 8":{countryCodes:["ca","us"],tags:{brand:"Super 8","brand:wikidata":"Q5364003","brand:wikipedia":"en:Super 8 Motels",name:"Super 8",tourism:"motel"}}};
65080         var brands$1 = {
65081         brands: brands
65082         };
65083
65084         var keepTags = ["^amenity/bank$","^amenity/bicycle_rental$","^amenity/bureau_de_change$","^amenity/cafe$","^amenity/car_rental$","^amenity/car_sharing$","^amenity/charging_station$","^amenity/cinema$","^amenity/dentist$","^amenity/fast_food$","^amenity/fuel$","^amenity/ice_cream$","^amenity/money_transfer$","^amenity/payment_(centre|terminal)$","^amenity/pharmacy$","^amenity/post_(box|office)$","^amenity/public_bookcase$","^amenity/restaurant$","^amenity/social_(centre|facility)$","^amenity/vending_machine$","^amenity/veterinary$","^leisure/fitness_centre$","^office/accountant$","^office/employment_agency$","^office/estate_agent$","^office/financial(_advisor)?$","^office/insurance$","^office/tax_advisor$","^office/telecommunication$","^shop/(?!(yes|no|gas|convenience;gas|laundry|lottery|mall))","^tourism/(h|m)otel$"];
65085         var discardKeys = ["^amenity/bank\\|(bank zachodni|bz) wbk$","^amenity/bank\\|.*sparkasse.*$","^amenity/bank\\|bank spółdzielczy$","^amenity/bank\\|pko$","^amenity/bank\\|volks- und raiffeisenbank$","^amenity/bank\\|volksbank$","^amenity/bank\\|volksbank( |-)raiffeisenbank$","^amenity/bank\\|vr( |-)bank$","^amenity/cafe\\|(kiosque(\\sà)?\\scafé|caf(e|é)\\sexpress|встреча|рандеву|чайхана|жемчужина)$","^amenity/cinema\\|октябрь$","^amenity/fast_food\\|(ali\\sbaba|antalya|asia\\s(bistro|imbiss|wok)|berlin\\sdöner|city\\s(grill|pizza)|kfc/taco\\sbell)$","^amenity/fast_food\\|(pizza\\s(house|time))$","^amenity/fuel\\|gnv|gpl|posto|spbu|جایگاه\\scng$","^amenity/ice_cream\\|gelateria$","^amenity/pharmacy\\|(adler|bahnhof|brunnen|burg|bären|engel|hirsch|hubertus|kur|linden|löwen)(-| )?apotheke$","^amenity/pharmacy\\|(centrum|farm(a|á)cia\\s(central(e)?|comunale))$","^amenity/pharmacy\\|(marien|markt|neue|park|rathaus|rats|rosen|schloss|sonnen|stadt|stern)(-| )?apotheke$","^amenity/pharmacy\\|(айболит|арніка|фармация)$","^amenity/pharmacy\\|pharmacie\\s(centrale|comunale|de\\s(l'hôtel\\sde\\sville|la\\s(gare|mairie|poste))|du\\s(centre|marché|parc))$","^amenity/restaurant\\|((da|la|las|el)\\s|delphi|deutsches\\shaus|dionysos|dorfkrug|europa|frohsinn|((gasthaus|schwarzer)\\s)?adler)","^amenity/restaurant\\|(ali\\sbaba|adria|akropolis|aroma|asia|athen|athos|bahnhof|bamboo|bären|bella\\s(vista|napoli)|belvedere)","^amenity/restaurant\\|(canteen|cantina|capri|carpe\\sdiem|casa\\s?(blanca|mia)|casino|china\\s(buffet|garden|house|king|star|town|wok))","^amenity/restaurant\\|(gasthaus\\slöwen|golden\\sdragon|great\\swall|grüner\\sbaum|hellas|hirsch(en)?|hong\\skong|ichiban|jade\\sgarden)","^amenity/restaurant\\|(jägerhof|kirchenwirt|kreta|kreuz|krone|l'|lamm|le\\sbistrot|linde|lindenhof|little\\s(italy|india)|los\\samigos)","^amenity/restaurant\\|(lotus|löwen|maharaja|mamma\\smia|mandarin|marco\\spolo|mediterraneo|mensa|milano|mykonos|mythos|namaste|napoli)","^amenity/restaurant\\|(new\\schina|oasis|ochsen|olympia|osaka|paradise|parrilla|peking|pho|pinocchio)","^amenity/restaurant\\|(pizza\\shouse|pizz(a|e)ria|pizza\\sking|pomodoro|portofino|poseidon|ratskeller|rhodos|ristorante\\s)","^amenity/restaurant\\|(roma|rose|rössl(e|i)|saffron|saigon|sakura|san\\smarco|santorini|schützenhaus|shalimar|shanghai|sonne|sphinx)","^amenity/restaurant\\|(sportheim|sternen|syrtaki|taj\\smahal|taste\\sof\\sindia|the\\skitchen|toscana|tokyo|traube)","^amenity/restaurant\\|(waldschänke|wok|zorbas|(zum|zur)\\s)","^amenity/social_facility\\|dom pomocy społecznej$","^amenity/social_facility\\|maison de retraite$","^amenity/social_facility\\|safe haven$","^shop/(convenience|kiosk)\\|(777|bp|esso|exxon|mobil|shell)$","^shop/bakery\\|(backshop|schneider|каравай)$","^shop/bakery\\|(bäckerei\\s)?müller","^shop/butcher\\|butcher$","^shop/clothes\\|трикотаж$","^shop/convenience\\|(milk bar|юлия)$","^shop/convenience\\|(августина|весна|визит|ветеран|домашний)$","^shop/convenience\\|(калинка|колобок|колос(ок)?|каравай|ласточка|лидер|любимый|людмила|люкс)$","^shop/convenience\\|(мечта|мираж|белорусские продукты|продукты 24|натали|надежда)$","^shop/convenience\\|(олимп|престиж|подсолнух|росинка|ромашка|родник|родны кут|рассвет)$","^shop/convenience\\|(семейный|спутник|солнечный|светлана|ивушка)$","^shop/convenience\\|(южный|эконом|шанс|чайка|центральный|хороший|фаворит|татьяна)$","^shop/florist\\|(мир цветов|орхидея)$","^shop/frame\\|rumah\\spenduduk$","^shop/hairdresser\\|(haarwerk|стиль|локон|шарм)$","^shop/hardware\\|(всё для дома|1000 мелочей)$","^shop/jewelry\\|585$","^shop/money_transfer|mobil(e)?\\smoney$","^shop/optician\\|(vision plus|оптика)$","^shop/supermarket\\|(famiglia cooperativa|семейный)$","^shop/tailor\\|couture\\s?(dame|homme|mixte)?$","^tourism/(h|m)otel\\|budget inn$","^tourism/hotel\\|(belvedere|krone|victoria)","^tourism/hotel\\|(central|city|europa|grand|palace|park|royal)\\s?hotel$","^tourism/hotel\\|h(o|ô)tel\\s(astoria|central|europa|krone|panorama|plaza|royal|victoria|(zur\\s)?post|de france)$"];
65086         var discardNames = ["^((drummed|independent) )?(cng|filling|fuel|gas|lpg|petrol)(\\s(station|pump))?$","^((le|the) )?salo(o)?n( de)?( coiffure| fryzjerski| beauté)?( homme| dame)?$","^((горячий|свежий) )?хлеб(ница)?$","^((разливное|живое) )?пиво$","^(beer|convenience|corner|general|liquor|variety)(\\sstore)?$","^(bureau de |)change$","^(buzón\\sde\\s)?correos$","^(cl(i|í)nica )?dental$","^(cl(i|í)nica )?veterinari(a|o)$","^(clinique )?vétérinaire$","^(coffee|pet|vulcanizing|gift)(\\sshop)?$","^(hof|dorf)laden$","^(h|m)otel$","^(sklep )?(spożywcz(y|o))(-przemysłowy)?$","^(strom|milch)tankstelle$","^(the )?barber(ia|shop|\\sshop)?$","^(é|e)pic(erie|ier)$","^(агзс|азс|мережа азс приват|магазин при азс)$","^(газовая\\s)?заправка$","^(летнее )?кафе(терий)?$","^(парикмахерская|персона|перукарня)$","^(проездные )?билет(ы)?$","^(свежее )?мяс(ной|о)$","^(спец|детская|женская)?\\s?одежда$","^agencja pocztowa$","^alimentación$","^alimentar(a|i)$","^alimentation\\sgénérale$","^alte (apotheke|post)$","^apotek(a|et)$","^apotheke( am markt)?$","^apteka$","^atelier de couture$","^atm$","^auto serwis$","^baguette$","^bakery$","^bakkal$","^bank$","^baqala$","^bar (centrale|kafe)$","^bar$","^barbea?r(i|í)a$","^bazar$","^benzina$","^berber$","^bijouterie$","^bike sharing$","^biletomat$","^bistro$","^blumen(laden)?$","^bo(u)?tique$","^bodega$","^borrachar(i|í)a$","^botica$","^botiller(i|í)a$","^boucherie(\\scharcuterie)?$","^boulangerie(\\sp(a|â)tisserie)?$","^bread$","^briefkasten$","^bureau de poste$","^bäckerei$","^büfé$","^cabinet dentaire$","^caf(e|é) de(s)? (la )?(place|sports|gare)$","^caf(e|é)(t(e|é)r(i|í)a)?( )?(central)?$","^cajero\\sautomatico\\sbancared$","^carnicer(i|í)a$","^central$","^centro naturista$","^chifa$","^chinese restaurant$","^cine(ma)?$","^cleaners$","^co-operative$","^coffee$","^coiff(eur|ure)\\s?(homme|dame)?$","^colmado$","^comedor$","^comida china$","^commercial hotel$","^consultorio (dental|odontologico)$","^credit union$","^currency exchange$","^d(ö|o)ner(\\skebab)?$","^delikatesy$","^dental(\\s(clinic|surgery))?$","^dentist(a|e)?$","^drinks$","^droguer(i|í)a$","^dép(ô|o)t de gaz$","^dépanneur$","^eczane$","^edicola$","^eiscaf(e|é)(\\s(dolomiti|venezia))?$","^eisdiele","^el árbol$","^estanco$","^exchange$","^fagyizó$","^family dentistry$","^farm(a|à|á)ci(a|à|á|e)$","^fast food$","^ferramenta$","^ferreter(i|í)a$","^figaro$","^fish (and|&) chips$","^fleuriste$","^florărie$","^food court$","^fotocopias$","^fri(t|z)erie$","^fris(eu|ö)r$","^frituur$","^frutería$","^fryzjer$","^funeraria$","^game$","^garage\\s?(moto|auto)?$","^garba(drome)?$","^gasoline(ra)?$","^gast(haus|hof)\\s(krone|(zur)\\s(linde|post))?$","^getränkemarkt$","^gimnasio( municipal)?$","^gomer(i|í)a$","^gym(nase|nasium)?$","^gyógyszertár$","^haar(genau|monie|scharf)$","^hair\\s?(design|lounge|salon|dresser)$","^hardware$","^home\\sutensils$","^hospedaje$","^húsbolt$","^imbiss$","^indipend\\.$","^internet cafe$","^istanbul(\\skebab)?$","^kaf(e|é)$","^kantine$","^kantor pos$","^kantor$","^kebab(ai|\\shouse)?$","^kios(co|k|ko|que)?$","^kisbolt$","^kitchen$","^księgarnia$","^kwiaciarnia$","^kwiaty$","^kулинария$","^ladestation$","^librairie$","^librer(i|í)a$","^libro$","^licorer(i|í)a$","^ljekarna$","^lombard$","^lot 1$","^lubricentro$","^lékárna$","^maceller(i|í)a$","^magazin","^mailbox$","^maison$","^market$","^mercado( municipal)?$","^mercerie$","^mini\\s?(abc|market|mart|mercado|pump)","^money exchange$","^máquina de tickets$","^mécanique$","^nagelstudio$","^nails$","^no name$","^obuwie$","^odontologia$","^oplaadpunt$","^opti(c|k)a$","^optical center$","^optyk$","^outlet$","^pa(r|cz)komat$","^pac?k(etbox|station)$","^padaria$","^panader(i|í)a$","^pancake house$","^panificio$","^panorama$","^papeler(i|í)a$","^parafarmacia$","^parduotuvė$","^parkscheinautomat$","^parquímetro$","^peluquer(i|í)a$","^pharmac(ie|y)$","^piekarnia$","^piscine$","^pizz(eri)?a$","^po(s|š)t(a|e|o)$","^poczta$","^poissonnerie$","^post\\s?(agentur|filiale|partner|office|stelle)?$","^potraviny$","^prehrana$","^pressing$","^pulper(i|í)a$","^punkt apteczny$","^quin?cai?llerie$","^quiosco$","^rent a car$","^repuestos automotrices$","^restaurant(e)?(\\suniversit(ário|aire))?$","^rzeźnik$","^sale$","^salle (omnisport|polyvalente)$","^salão de beleza$","^sari-sari store$","^sb\\stank$","^second\\shand$","^shops?$","^sklep$","^smíšené zboží$","^snacks?$","^souvenir(s)?( shop)?$","^spätkauf$","^stacja (benzynowa|paliw)$","^stadium$","^stadtbäckerei$","^station service$","^steak house$","^stores?$","^super ?america","^super\\s?m(arket|ercado)$","^sushi(\\sbar)?$","^taba(c|k)(os|chi)?(\\strafi(k|c))?$","^tabac\\spresse$","^tabaccher(i|í)a$","^tacos$","^taller( mecánico)?$","^tankstelle$","^tattoo$","^taverna$","^tea stall$","^tesha$","^tienda(\\sde\\s(barrio|abarrotes))?$","^toko pakaian$","^trafik(a)?$","^trattoria$","^trinkhalle$","^télécentre$","^ufficio postale$","^urząd pocztowy$","^vegyesbolt$","^venezia$","^verduler(i|í)a$","^večerka$","^virágbolt$","^vulcanizare$","^warung$","^warzywniak$","^windmill$","^wulkanizacja$","^zahnarzt$","^zigarettenautomat$","^zöldséges$","^änderungsschneiderei$","^élelmiszer(bolt)?$","^φαρμακείο$","^авто(рынок|ремонт|сервис|электрик|запчасти(ни)?)?$","^автома(г|газин|стерская)?$","^автосервис\\+шиномонтаж$","^аптека","^аптечный (пункт|склад)$","^ателье$","^бассейн$","^бистро$","^булочная$","^буфет$","^ветеринарная клиника$","^ветлечебница$","^вс(е|ё) для дома$","^вулканизация$","^газ$","^главпочтамт$","^гостиница$","^детский дом$","^закусочная$","^замена масла$","^золото(й)?$","^зоо(магазин|товары)$","^игрушки$","^канцтовары$","^касса$","^квіти$","^киоск$","^книги$","^кофе(йня|\\sхауз)$","^крамниця$","^купец$","^ломбард$","^маркет$","^меб(ель|лі)$","^метан$","^минимаркет|мини-маркет$","^мороженое$","^мясная лавка$","^обувь$","^овощи(\\sи\\s|-)фрукты$","^октан$","^памятники$","^пекарня$","^пельменная$","^печать$","^пиццерия$","^по(чт|шт|щ)а$","^подарки$","^почтовое отделение$","^пресса$","^продукт(ы|и)?$","^продуктовый( магазин)?$","^промтовары$","^пропан$","^ремонт\\sобуви$","^ресторан$","^ритуал(ьные услуги)?$","^рыб(а|олов)$","^салон красоты$","^сантехника$","^семена$","^социальный участковый$","^спорт(зал|комплекс|товары)$","^столовая$","^стоматолог","^строитель$","^стройматериалы$","^сувениры$","^супермаркет$","^табак(ерка)?$","^ткани$","^товары для дома$","^универ(маг|сам)$","^уют$","^фрукты и овощи$","^химчистка$","^хинкальная$","^хоз(товары|яюшка)$","^хүнсний дэлгүүр$","^цвет(овик|очный|ы)(\\sмагазин)?$","^церковная( лавка)?$","^чайхана$","^ша(ве|у)рма$","^шашлычная$","^шиномонтаж$","^דלק$","^اداره پست$","^باشگاه بدنسازی$","^بانک$","^بقال(ة)?$","^حلاق$","^داروخانه شبانه روزی$","^داروخانه$","^رستوران$","^سوپر\\s?مارکت$","^صيدلية$","^قصابی$","^محط(ه|ة) وقود$","^مخبز(ة)?$","^مطعم$","^مقهى$","^مكتب البريد$","^میوه فروشی$","^نان\\s?(سنگک|بربری|لواش)?$","^نانوایی\\s?(سنگک|بربری|لواش)?ی?$","^پمپ (بنزین|گاز)$","^მარკეტი( \\(market\\))?","^カフェ$","^ポスト$","^体育館$","^加油站$","^珈琲館$","^租$","^自動販売機$","^自販機$","^郵便ポスト$","^郵局$","^食堂$","automat na jizdenky"];
65087         var filters = {
65088         keepTags: keepTags,
65089         discardKeys: discardKeys,
65090         discardNames: discardNames
65091         };
65092
65093         // ES5 for iD, for now
65094
65095
65096         // remove spaces, punctuation, diacritics
65097         var simplify = function simplify(str) {
65098             return diacritics.remove(
65099                 str.replace(/[\s\-=_!"#%&'*{},.\/:;?\(\)\[\]@\\$\^*+<>~`’\u00a1\u00a7\u00b6\u00b7\u00bf\u037e\u0387\u055a-\u055f\u0589\u05c0\u05c3\u05c6\u05f3\u05f4\u0609\u060a\u060c\u060d\u061b\u061e\u061f\u066a-\u066d\u06d4\u0700-\u070d\u07f7-\u07f9\u0830-\u083e\u085e\u0964\u0965\u0970\u0af0\u0df4\u0e4f\u0e5a\u0e5b\u0f04-\u0f12\u0f14\u0f85\u0fd0-\u0fd4\u0fd9\u0fda\u104a-\u104f\u10fb\u1360-\u1368\u166d\u166e\u16eb-\u16ed\u1735\u1736\u17d4-\u17d6\u17d8-\u17da\u1800-\u1805\u1807-\u180a\u1944\u1945\u1a1e\u1a1f\u1aa0-\u1aa6\u1aa8-\u1aad\u1b5a-\u1b60\u1bfc-\u1bff\u1c3b-\u1c3f\u1c7e\u1c7f\u1cc0-\u1cc7\u1cd3\u2016\u2017\u2020-\u2027\u2030-\u2038\u203b-\u203e\u2041-\u2043\u2047-\u2051\u2053\u2055-\u205e\u2cf9-\u2cfc\u2cfe\u2cff\u2d70\u2e00\u2e01\u2e06-\u2e08\u2e0b\u2e0e-\u2e16\u2e18\u2e19\u2e1b\u2e1e\u2e1f\u2e2a-\u2e2e\u2e30-\u2e39\u3001-\u3003\u303d\u30fb\ua4fe\ua4ff\ua60d-\ua60f\ua673\ua67e\ua6f2-\ua6f7\ua874-\ua877\ua8ce\ua8cf\ua8f8-\ua8fa\ua92e\ua92f\ua95f\ua9c1-\ua9cd\ua9de\ua9df\uaa5c-\uaa5f\uaade\uaadf\uaaf0\uaaf1\uabeb\ufe10-\ufe16\ufe19\ufe30\ufe45\ufe46\ufe49-\ufe4c\ufe50-\ufe52\ufe54-\ufe57\ufe5f-\ufe61\ufe68\ufe6a\ufe6b\uff01-\uff03\uff05-\uff07\uff0a\uff0c\uff0e\uff0f\uff1a\uff1b\uff1f\uff20\uff3c\uff61\uff64\uff65]+/g,'')
65100                     .toLowerCase()
65101             );
65102         };
65103
65104         // ES5 for iD, for now
65105
65106
65107         // toParts - split a name-suggestion-index key into parts
65108         // {
65109         //   kvnd:        "amenity/fast_food|Thaï Express~(North America)",
65110         //   kvn:         "amenity/fast_food|Thaï Express",
65111         //   kv:          "amenity/fast_food",
65112         //   k:           "amenity",
65113         //   v:           "fast_food",
65114         //   n:           "Thaï Express",
65115         //   d:           "(North America)",
65116         //   nsimple:     "thaiexpress",
65117         //   kvnnsimple:  "amenity/fast_food|thaiexpress"
65118         // }
65119         var to_parts = function toParts(kvnd) {
65120             var parts = {};
65121             parts.kvnd = kvnd;
65122
65123             var kvndparts = kvnd.split('~', 2);
65124             if (kvndparts.length > 1) parts.d = kvndparts[1];
65125
65126             parts.kvn = kvndparts[0];
65127             var kvnparts = parts.kvn.split('|', 2);
65128             if (kvnparts.length > 1) parts.n = kvnparts[1];
65129
65130             parts.kv = kvnparts[0];
65131             var kvparts = parts.kv.split('/', 2);
65132             parts.k = kvparts[0];
65133             parts.v = kvparts[1];
65134
65135             parts.nsimple = simplify(parts.n);
65136             parts.kvnsimple = parts.kv + '|' + parts.nsimple;
65137             return parts;
65138         };
65139
65140         var matchGroups = {beauty:["shop/beauty","shop/hairdresser_supply"],bed:["shop/bed","shop/furniture"],beverages:["shop/alcohol","shop/beverages"],confectionery:["shop/candy","shop/chocolate","shop/confectionery"],convenience:["shop/beauty","shop/chemist","shop/convenience","shop/cosmetics"],electronics:["office/telecommunication","shop/computer","shop/electronics","shop/hifi","shop/mobile","shop/mobile_phone"],fashion:["shop/accessories","shop/bag","shop/botique","shop/clothes","shop/department_store","shop/fashion","shop/fashion_accessories","shop/sports","shop/shoes"],financial:["office/accountant","office/financial","office/financial_advisor","office/tax_advisor","shop/tax"],fitness:["leisure/fitness_centre","leisure/fitness_center","leisure/sports_centre","leisure/sports_center"],food:["amenity/cafe","amenity/fast_food","amenity/ice_cream","amenity/restaurant","shop/bakery","shop/pastry","shop/tea","shop/coffee"],fuel:["amenity/fuel","shop/gas","shop/convenience;gas","shop/gas;convenience"],gift:["shop/gift","shop/stationery"],hardware:["shop/doityourself","shop/hardware","shop/trade"],houseware:["shop/houseware","shop/interior_decoration"],lodging:["tourism/hotel","tourism/motel"],money_transfer:["amenity/money_transfer","shop/money_transfer"],outdoor:["shop/outdoor","shop/sports"],parts:["shop/car_parts","shop/car_repair","shop/tires","shop/tyres"],vending:["amenity/vending_machine","shop/vending_machine"],wholesale:["shop/supermarket","shop/wholesale"]};
65141         var match_groups = {
65142         matchGroups: matchGroups
65143         };
65144
65145         var match_groups$1 = /*#__PURE__*/Object.freeze({
65146                 matchGroups: matchGroups,
65147                 'default': match_groups
65148         });
65149
65150         var require$$0 = getCjsExportFromNamespace(match_groups$1);
65151
65152         // ES5 for iD, for now
65153
65154
65155
65156         var matchGroups$1 = require$$0.matchGroups;
65157
65158
65159         var matcher$1 = function() {
65160             var _warnings = [];    // array of match conflict pairs
65161             var _ambiguous = {};
65162             var _matchIndex = {};
65163             var matcher = {};
65164
65165             // Create an index of all the keys/simplenames for fast matching
65166             matcher.buildMatchIndex = function(brands) {
65167                 Object.keys(brands).forEach(function(kvnd) {
65168                     var obj = brands[kvnd];
65169                     var parts = to_parts(kvnd);
65170
65171                     if (obj.countryCodes) {
65172                         parts.countryCodes = obj.countryCodes.slice();  // copy
65173                     }
65174
65175                     var matchTags = (obj.matchTags || [])
65176                         .map(function(s) { return s.toLowerCase(); });
65177                     var matchNames = (obj.matchNames || [])
65178                         .concat(obj.tags.alt_name || [])        // #2732
65179                         .concat(obj.tags.official_name || [])   // #2732
65180                         .concat(obj.tags.short_name || [])      // #2732
65181                         .map(simplify);
65182                     var nomatches = (obj.nomatch || [])
65183                         .map(function(kvnd) { return to_parts(kvnd).kvnsimple; });
65184
65185                     var match_kv = [parts.kv].concat(matchTags);
65186                     var match_nsimple = [parts.nsimple].concat(matchNames);
65187
65188                     match_kv.forEach(function(kv) {
65189                         match_nsimple.forEach(function(nsimple) {
65190                             var test = kv + nsimple;
65191                             if (nomatches.some(function(s) { return s === test; })) {
65192                                 console.log('WARNING match/nomatch conflict for ' + test);
65193                                 return;
65194                             }
65195
65196                             if (parts.d) {
65197                                 // fixme: name collisions will overwrite the single entry (ok for now)
65198                                 if (!_ambiguous[kv]) _ambiguous[kv] = {};
65199                                 _ambiguous[kv][nsimple] = parts;
65200                             } else {
65201                                 // name collisions are a problem in matchIndex, warn if we detect it
65202                                 if (!_matchIndex[kv]) _matchIndex[kv] = {};
65203                                 var m = _matchIndex[kv][nsimple];
65204                                 if (m) {  // there already is a match for this
65205                                     _warnings.push([m.kvnd, kvnd + ' ("' + nsimple + '")']);
65206                                 } else {
65207                                     _matchIndex[kv][nsimple] = parts;
65208                                 }
65209                             }
65210                         });
65211                     });
65212                 });
65213             };
65214
65215
65216             // pass a `key`, `value`, `name` and return the best match,
65217             // `countryCode` optional (if supplied, must match that too)
65218             matcher.matchKVN = function(key, value, name, countryCode) {
65219                 return matcher.matchParts(to_parts(key + '/' + value + '|' + name), countryCode);
65220             };
65221
65222             // pass a parts object and return the best match,
65223             // `countryCode` optional (if supplied, must match that too)
65224             matcher.matchParts = function(parts, countryCode) {
65225                 var match = null;
65226                 var inGroup = false;
65227
65228                 // fixme: we currently return a single match for ambiguous
65229                 match = _ambiguous[parts.kv] && _ambiguous[parts.kv][parts.nsimple];
65230                 if (match && matchesCountryCode(match)) return match;
65231
65232                 // try to return an exact match
65233                 match = _matchIndex[parts.kv] && _matchIndex[parts.kv][parts.nsimple];
65234                 if (match && matchesCountryCode(match)) return match;
65235
65236                 // look in match groups
65237                 for (var mg in matchGroups$1) {
65238                     var matchGroup = matchGroups$1[mg];
65239                     match = null;
65240                     inGroup = false;
65241
65242                     for (var i = 0; i < matchGroup.length; i++) {
65243                         var otherkv = matchGroup[i].toLowerCase();
65244                         if (!inGroup) {
65245                             inGroup = (otherkv === parts.kv);
65246                         }
65247                         if (!match) {
65248                             // fixme: we currently return a single match for ambiguous
65249                             match = _ambiguous[otherkv] && _ambiguous[otherkv][parts.nsimple];
65250                         }
65251                         if (!match) {
65252                             match = _matchIndex[otherkv] && _matchIndex[otherkv][parts.nsimple];
65253                         }
65254
65255                         if (!matchesCountryCode(match)) {
65256                             match = null;
65257                         }
65258
65259                         if (inGroup && match) {
65260                             return match;
65261                         }
65262                     }
65263                 }
65264
65265                 return null;
65266
65267
65268                 function matchesCountryCode(match) {
65269                     if (!countryCode) return true;
65270                     if (!match.countryCodes) return true;
65271                     return (match.countryCodes.indexOf(countryCode) !== -1);
65272                 }
65273             };
65274
65275
65276             matcher.getWarnings = function() {
65277                 return _warnings;
65278             };
65279
65280
65281             return matcher;
65282         };
65283
65284         function validationGenericName() {
65285             var type = 'generic_name';
65286
65287             // known list of generic names (e.g. "bar")
65288             var discardNamesRegexes = filters.discardNames.map(function(discardName) {
65289                 return new RegExp(discardName, 'i');
65290             });
65291
65292             var keysToTestForGenericValues = ['amenity', 'building', 'leisure', 'man_made', 'shop', 'tourism'];
65293
65294             function isGenericName(entity) {
65295                 var name = entity.tags.name;
65296                 if (!name) return false;
65297                 name = name.toLowerCase();
65298
65299                 var i, key, val;
65300
65301                 // test if the name is just the key or tag value (e.g. "park")
65302                 for (i = 0; i < keysToTestForGenericValues.length; i++) {
65303                     key = keysToTestForGenericValues[i];
65304                     val = entity.tags[key];
65305                     if (val) {
65306                         val = val.toLowerCase();
65307                         if (key === name ||
65308                             val === name ||
65309                             key.replace(/\_/g, ' ') === name ||
65310                             val.replace(/\_/g, ' ') === name) {
65311                             return entity.tags.name;
65312                         }
65313                     }
65314                 }
65315
65316                 // test if the name is otherwise generic
65317                 for (i = 0; i < discardNamesRegexes.length; i++) {
65318                     if (discardNamesRegexes[i].test(name)) {
65319                         return entity.tags.name;
65320                     }
65321                 }
65322
65323                 return false;
65324             }
65325
65326
65327             var validation = function checkGenericName(entity) {
65328                 var generic = isGenericName(entity);
65329                 if (!generic) return [];
65330
65331                 return [new validationIssue({
65332                     type: type,
65333                     severity: 'warning',
65334                     message: function(context) {
65335                         var entity = context.hasEntity(this.entityIds[0]);
65336                         if (!entity) return '';
65337                         var preset = utilPreset(entity, context);
65338                         return t('issues.generic_name.message', { feature: preset.name(), name: generic });
65339                     },
65340                     reference: showReference,
65341                     entityIds: [entity.id],
65342                     hash: generic,
65343                     fixes: [
65344                         new validationIssueFix({
65345                             icon: 'iD-operation-delete',
65346                             title: t('issues.fix.remove_generic_name.title'),
65347                             onClick: function(context) {
65348                                 var entityId = this.issue.entityIds[0];
65349                                 var entity = context.entity(entityId);
65350                                 var tags = Object.assign({}, entity.tags);   // shallow copy
65351                                 delete tags.name;
65352                                 context.perform(
65353                                     actionChangeTags(entityId, tags),
65354                                     t('issues.fix.remove_generic_name.annotation')
65355                                 );
65356                             }
65357                         })
65358                     ]
65359                 })];
65360
65361
65362                 function showReference(selection) {
65363                     selection.selectAll('.issue-reference')
65364                         .data([0])
65365                         .enter()
65366                         .append('div')
65367                         .attr('class', 'issue-reference')
65368                         .text(t('issues.generic_name.reference'));
65369                 }
65370             };
65371
65372             validation.type = type;
65373
65374             return validation;
65375         }
65376
65377         function validationImpossibleOneway() {
65378             var type = 'impossible_oneway';
65379
65380             var validation = function checkImpossibleOneway(entity, graph) {
65381
65382                 if (entity.type !== 'way' || entity.geometry(graph) !== 'line') return [];
65383
65384                 if (entity.isClosed()) return [];
65385
65386                 if (!typeForWay(entity)) return [];
65387
65388                 if (!isOneway(entity)) return [];
65389
65390                 var firstIssues = issuesForNode(entity, entity.first());
65391                 var lastIssues = issuesForNode(entity, entity.last());
65392
65393                 return firstIssues.concat(lastIssues);
65394
65395                 function typeForWay(way) {
65396                     if (way.geometry(graph) !== 'line') return null;
65397
65398                     if (osmRoutableHighwayTagValues[way.tags.highway]) return 'highway';
65399                     if (osmFlowingWaterwayTagValues[way.tags.waterway]) return 'waterway';
65400                     return null;
65401                 }
65402
65403                 function isOneway(way) {
65404                     if (way.tags.oneway === 'yes') return true;
65405                     if (way.tags.oneway) return false;
65406
65407                     for (var key in way.tags) {
65408                         if (osmOneWayTags[key] && osmOneWayTags[key][way.tags[key]]) {
65409                             return true;
65410                         }
65411                     }
65412                     return false;
65413                 }
65414
65415                 function nodeOccursMoreThanOnce(way, nodeID) {
65416                     var occurences = 0;
65417                     for (var index in way.nodes) {
65418                         if (way.nodes[index] === nodeID) {
65419                             occurences += 1;
65420                             if (occurences > 1) return true;
65421                         }
65422                     }
65423                     return false;
65424                 }
65425
65426                 function isConnectedViaOtherTypes(way, node) {
65427
65428                     var wayType = typeForWay(way);
65429
65430                     if (wayType === 'highway') {
65431                         // entrances are considered connected
65432                         if (node.tags.entrance && node.tags.entrance !== 'no') return true;
65433                         if (node.tags.amenity === 'parking_entrance') return true;
65434                     } else if (wayType === 'waterway') {
65435                         if (node.id === way.first()) {
65436                             // multiple waterways may start at the same spring
65437                             if (node.tags.natural === 'spring') return true;
65438                         } else {
65439                             // multiple waterways may end at the same drain
65440                             if (node.tags.manhole === 'drain') return true;
65441                         }
65442                     }
65443
65444                     return graph.parentWays(node).some(function(parentWay) {
65445                         if (parentWay.id === way.id) return false;
65446
65447                         if (wayType === 'highway') {
65448
65449                             // allow connections to highway areas
65450                             if (parentWay.geometry(graph) === 'area' &&
65451                                 osmRoutableHighwayTagValues[parentWay.tags.highway]) return true;
65452
65453                             // count connections to ferry routes as connected
65454                             if (parentWay.tags.route === 'ferry') return true;
65455
65456                             return graph.parentRelations(parentWay).some(function(parentRelation) {
65457                                 if (parentRelation.tags.type === 'route' &&
65458                                     parentRelation.tags.route === 'ferry') return true;
65459
65460                                 // allow connections to highway multipolygons
65461                                 return parentRelation.isMultipolygon() && osmRoutableHighwayTagValues[parentRelation.tags.highway];
65462                             });
65463                         } else if (wayType === 'waterway') {
65464                             // multiple waterways may start or end at a water body at the same node
65465                             if (parentWay.tags.natural === 'water' ||
65466                                 parentWay.tags.natural === 'coastline') return true;
65467                         }
65468                         return false;
65469                     });
65470                 }
65471
65472                 function issuesForNode(way, nodeID) {
65473
65474                     var isFirst = nodeID === way.first();
65475
65476                     var wayType = typeForWay(way);
65477
65478                     // ignore if this way is self-connected at this node
65479                     if (nodeOccursMoreThanOnce(way, nodeID)) return [];
65480
65481                     var osm = services$1.osm;
65482                     if (!osm) return [];
65483
65484                     var node = graph.hasEntity(nodeID);
65485
65486                     // ignore if this node or its tile are unloaded
65487                     if (!node || !osm.isDataLoaded(node.loc)) return [];
65488
65489                     if (isConnectedViaOtherTypes(way, node)) return [];
65490
65491                     var attachedWaysOfSameType = graph.parentWays(node).filter(function(parentWay) {
65492                         if (parentWay.id === way.id) return false;
65493                         return typeForWay(parentWay) === wayType;
65494                     });
65495
65496                     // assume it's okay for waterways to start or end disconnected for now
65497                     if (wayType === 'waterway' && attachedWaysOfSameType.length === 0) return [];
65498
65499                     var attachedOneways = attachedWaysOfSameType.filter(function(attachedWay) {
65500                         return isOneway(attachedWay);
65501                     });
65502
65503                     // ignore if the way is connected to some non-oneway features
65504                     if (attachedOneways.length < attachedWaysOfSameType.length) return [];
65505
65506                     if (attachedOneways.length) {
65507                         var connectedEndpointsOkay = attachedOneways.some(function(attachedOneway) {
65508                             if ((isFirst ? attachedOneway.first() : attachedOneway.last()) !== nodeID) return true;
65509                             if (nodeOccursMoreThanOnce(attachedOneway, nodeID)) return true;
65510                             return false;
65511                         });
65512                         if (connectedEndpointsOkay) return [];
65513                     }
65514
65515                     var fixes = [];
65516
65517                     if (attachedOneways.length) {
65518                         fixes.push(new validationIssueFix({
65519                             icon: 'iD-operation-reverse',
65520                             title: t('issues.fix.reverse_feature.title'),
65521                             entityIds: [way.id],
65522                             onClick: function(context) {
65523                                 var id = this.issue.entityIds[0];
65524                                 context.perform(actionReverse(id), t('operations.reverse.annotation'));
65525                             }
65526                         }));
65527                     }
65528                     if (node.tags.noexit !== 'yes') {
65529                         fixes.push(new validationIssueFix({
65530                             icon: 'iD-operation-continue' + (isFirst ? '-left' : ''),
65531                             title: t('issues.fix.continue_from_' + (isFirst ? 'start' : 'end') + '.title'),
65532                             onClick: function(context) {
65533                                 var entityID = this.issue.entityIds[0];
65534                                 var vertexID = this.issue.entityIds[1];
65535                                 var way = context.entity(entityID);
65536                                 var vertex = context.entity(vertexID);
65537                                 continueDrawing(way, vertex, context);
65538                             }
65539                         }));
65540                     }
65541
65542                     var placement = isFirst ? 'start' : 'end',
65543                         messageID = wayType + '.',
65544                         referenceID = wayType + '.';
65545
65546                     if (wayType === 'waterway') {
65547                         messageID += 'connected.' + placement;
65548                         referenceID += 'connected';
65549                     } else {
65550                         messageID += placement;
65551                         referenceID += placement;
65552                     }
65553
65554                     return [new validationIssue({
65555                         type: type,
65556                         subtype: wayType,
65557                         severity: 'warning',
65558                         message: function(context) {
65559                             var entity = context.hasEntity(this.entityIds[0]);
65560                             return entity ? t('issues.impossible_oneway.' + messageID + '.message', {
65561                                 feature: utilDisplayLabel(entity, context)
65562                             }) : '';
65563                         },
65564                         reference: getReference(referenceID),
65565                         entityIds: [way.id, node.id],
65566                         fixes: fixes
65567                     })];
65568
65569                     function getReference(referenceID) {
65570                         return function showReference(selection) {
65571                             selection.selectAll('.issue-reference')
65572                                 .data([0])
65573                                 .enter()
65574                                 .append('div')
65575                                 .attr('class', 'issue-reference')
65576                                 .text(t('issues.impossible_oneway.' + referenceID + '.reference'));
65577                         };
65578                     }
65579                 }
65580             };
65581
65582             function continueDrawing(way, vertex, context) {
65583                 // make sure the vertex is actually visible and editable
65584                 var map = context.map();
65585                 if (!map.editable() || !map.trimmedExtent().contains(vertex.loc)) {
65586                     map.zoomToEase(vertex);
65587                 }
65588
65589                 context.enter(
65590                     modeDrawLine(context, way.id, context.graph(), context.graph(), 'line', way.affix(vertex.id), true)
65591                 );
65592             }
65593
65594             validation.type = type;
65595
65596             return validation;
65597         }
65598
65599         function validationIncompatibleSource() {
65600             var type = 'incompatible_source';
65601             var invalidSources = [{id:'google', regex:'google'}];
65602
65603             var validation = function checkIncompatibleSource(entity) {
65604                 var issues = [];
65605
65606                 if (entity.tags && entity.tags.source) {
65607                     invalidSources.forEach(function(invalidSource) {
65608                         var pattern = new RegExp(invalidSource.regex, 'i');
65609
65610                         if (entity.tags.source.match(pattern)) {
65611                             issues.push(new validationIssue({
65612                                 type: type,
65613                                 severity: 'warning',
65614                                 message: function(context) {
65615                                     var entity = context.hasEntity(this.entityIds[0]);
65616                                     return entity ? t('issues.incompatible_source.' + invalidSource.id + '.feature.message', {
65617                                         feature: utilDisplayLabel(entity, context)
65618                                     }) : '';
65619                                 },
65620                                 reference: getReference(invalidSource.id),
65621                                 entityIds: [entity.id],
65622                                 fixes: [
65623                                     new validationIssueFix({
65624                                         title: t('issues.fix.remove_proprietary_data.title')
65625                                     })
65626                                 ]
65627                             }));
65628                         }
65629                     });
65630                 }
65631
65632                 return issues;
65633
65634
65635                 function getReference(id) {
65636                     return function showReference(selection) {
65637                         selection.selectAll('.issue-reference')
65638                             .data([0])
65639                             .enter()
65640                             .append('div')
65641                             .attr('class', 'issue-reference')
65642                             .text(t('issues.incompatible_source.' + id + '.reference'));
65643                     };
65644                 }
65645             };
65646
65647             validation.type = type;
65648
65649             return validation;
65650         }
65651
65652         function validationFormatting() {
65653             var type = 'invalid_format';
65654
65655             var validation = function(entity) {
65656                 var issues = [];
65657
65658                 function isValidEmail(email) {
65659                     // Emails in OSM are going to be official so they should be pretty simple
65660                     // Using negated lists to better support all possible unicode characters (#6494)
65661                     var valid_email = /^[^\(\)\\,":;<>@\[\]]+@[^\(\)\\,":;<>@\[\]\.]+(?:\.[a-z0-9-]+)*$/i;
65662
65663                     // An empty value is also acceptable
65664                     return (!email || valid_email.test(email));
65665                 }
65666
65667                 function isSchemePresent(url) {
65668                     var valid_scheme = /^https?:\/\//i;
65669                     return (!url || valid_scheme.test(url));
65670                 }
65671
65672                 function showReferenceEmail(selection) {
65673                     selection.selectAll('.issue-reference')
65674                         .data([0])
65675                         .enter()
65676                         .append('div')
65677                         .attr('class', 'issue-reference')
65678                         .text(t('issues.invalid_format.email.reference'));
65679                 }
65680
65681                 function showReferenceWebsite(selection) {
65682                     selection.selectAll('.issue-reference')
65683                         .data([0])
65684                         .enter()
65685                         .append('div')
65686                         .attr('class', 'issue-reference')
65687                         .text(t('issues.invalid_format.website.reference'));
65688                 }
65689
65690                 if (entity.tags.website) {
65691                     // Multiple websites are possible
65692                     // If ever we support ES6, arrow functions make this nicer
65693                     var websites = entity.tags.website
65694                         .split(';')
65695                         .map(function(s) { return s.trim(); })
65696                         .filter(function(x) { return !isSchemePresent(x); });
65697
65698                     if (websites.length) {
65699                         issues.push(new validationIssue({
65700                             type: type,
65701                             subtype: 'website',
65702                             severity: 'warning',
65703                             message: function(context) {
65704                                 var entity = context.hasEntity(this.entityIds[0]);
65705                                 return entity ? t('issues.invalid_format.website.message' + this.data,
65706                                     { feature: utilDisplayLabel(entity, context), site: websites.join(', ') }) : '';
65707                             },
65708                             reference: showReferenceWebsite,
65709                             entityIds: [entity.id],
65710                             hash: websites.join(),
65711                             data: (websites.length > 1) ? '_multi' : ''
65712                         }));
65713                     }
65714                 }
65715
65716                 if (entity.tags.email) {
65717                     // Multiple emails are possible
65718                     var emails = entity.tags.email
65719                         .split(';')
65720                         .map(function(s) { return s.trim(); })
65721                         .filter(function(x) { return !isValidEmail(x); });
65722
65723                     if (emails.length) {
65724                         issues.push(new validationIssue({
65725                             type: type,
65726                             subtype: 'email',
65727                             severity: 'warning',
65728                             message: function(context) {
65729                                 var entity = context.hasEntity(this.entityIds[0]);
65730                                 return entity ? t('issues.invalid_format.email.message' + this.data,
65731                                     { feature: utilDisplayLabel(entity, context), email: emails.join(', ') }) : '';
65732                             },
65733                             reference: showReferenceEmail,
65734                             entityIds: [entity.id],
65735                             hash: emails.join(),
65736                             data: (emails.length > 1) ? '_multi' : ''
65737                         }));
65738                     }
65739                 }
65740
65741                 return issues;
65742             };
65743
65744             validation.type = type;
65745
65746             return validation;
65747         }
65748
65749         function validationMaprules() {
65750             var type = 'maprules';
65751
65752             var validation = function checkMaprules(entity, graph) {
65753                 if (!services$1.maprules) return [];
65754
65755                 var rules = services$1.maprules.validationRules();
65756                 var issues = [];
65757
65758                 for (var i = 0; i < rules.length; i++) {
65759                     var rule = rules[i];
65760                     rule.findIssues(entity, graph, issues);
65761                 }
65762
65763                 return issues;
65764             };
65765
65766
65767             validation.type = type;
65768
65769             return validation;
65770         }
65771
65772         function validationMissingRole() {
65773             var type = 'missing_role';
65774
65775             var validation = function checkMissingRole(entity, graph) {
65776                 var issues = [];
65777                 if (entity.type === 'way') {
65778                     graph.parentRelations(entity).forEach(function(relation) {
65779                         if (!relation.isMultipolygon()) return;
65780
65781                         var member = relation.memberById(entity.id);
65782                         if (member && isMissingRole(member)) {
65783                             issues.push(makeIssue(entity, relation, member));
65784                         }
65785                     });
65786                 } else if (entity.type === 'relation' && entity.isMultipolygon()) {
65787                     entity.indexedMembers().forEach(function(member) {
65788                         var way = graph.hasEntity(member.id);
65789                         if (way && isMissingRole(member)) {
65790                             issues.push(makeIssue(way, entity, member));
65791                         }
65792                     });
65793                 }
65794
65795                 return issues;
65796             };
65797
65798
65799             function isMissingRole(member) {
65800                 return !member.role || !member.role.trim().length;
65801             }
65802
65803
65804             function makeIssue(way, relation, member) {
65805                 return new validationIssue({
65806                     type: type,
65807                     severity: 'warning',
65808                     message: function(context) {
65809                         var member = context.hasEntity(this.entityIds[1]),
65810                             relation = context.hasEntity(this.entityIds[0]);
65811                         return (member && relation) ? t('issues.missing_role.message', {
65812                             member: utilDisplayLabel(member, context),
65813                             relation: utilDisplayLabel(relation, context)
65814                         }) : '';
65815                     },
65816                     reference: showReference,
65817                     entityIds: [relation.id, way.id],
65818                     data: {
65819                         member: member
65820                     },
65821                     hash: member.index.toString(),
65822                     fixes: [
65823                         makeAddRoleFix('inner'),
65824                         makeAddRoleFix('outer'),
65825                         new validationIssueFix({
65826                             icon: 'iD-operation-delete',
65827                             title: t('issues.fix.remove_from_relation.title'),
65828                             onClick: function(context) {
65829                                 context.perform(
65830                                     actionDeleteMember(this.issue.entityIds[0], this.issue.data.member.index),
65831                                     t('operations.delete_member.annotation')
65832                                 );
65833                             }
65834                         })
65835                     ]
65836                 });
65837
65838
65839                 function showReference(selection) {
65840                     selection.selectAll('.issue-reference')
65841                         .data([0])
65842                         .enter()
65843                         .append('div')
65844                         .attr('class', 'issue-reference')
65845                         .text(t('issues.missing_role.multipolygon.reference'));
65846                 }
65847             }
65848
65849
65850             function makeAddRoleFix(role) {
65851                 return new validationIssueFix({
65852                     title: t('issues.fix.set_as_' + role + '.title'),
65853                     onClick: function(context) {
65854                         var oldMember = this.issue.data.member;
65855                         var member = { id: this.issue.entityIds[1], type: oldMember.type, role: role };
65856                         context.perform(
65857                             actionChangeMember(this.issue.entityIds[0], member, oldMember.index),
65858                             t('operations.change_role.annotation')
65859                         );
65860                     }
65861                 });
65862             }
65863
65864             validation.type = type;
65865
65866             return validation;
65867         }
65868
65869         function validationMissingTag() {
65870             var type = 'missing_tag';
65871
65872
65873             function hasDescriptiveTags(entity) {
65874                 var keys = Object.keys(entity.tags)
65875                     .filter(function(k) {
65876                         if (k === 'area' || k === 'name') {
65877                             return false;
65878                         } else {
65879                             return osmIsInterestingTag(k);
65880                         }
65881                     });
65882
65883                 if (entity.type === 'relation' && keys.length === 1) {
65884                     return entity.tags.type !== 'multipolygon';
65885                 }
65886                 return keys.length > 0;
65887             }
65888
65889
65890             function isUnknownRoad(entity) {
65891                 return entity.type === 'way' && entity.tags.highway === 'road';
65892             }
65893
65894             function isUntypedRelation(entity) {
65895                 return entity.type === 'relation' && !entity.tags.type;
65896             }
65897
65898
65899             var validation = function checkMissingTag(entity, graph) {
65900
65901                 // ignore vertex features and relation members
65902                 if (entity.geometry(graph) === 'vertex' || entity.hasParentRelations(graph)) {
65903                     return [];
65904                 }
65905
65906                 var subtype;
65907
65908                 if (Object.keys(entity.tags).length === 0) {
65909                     subtype = 'any';
65910                 } else if (!hasDescriptiveTags(entity)) {
65911                     subtype = 'descriptive';
65912                 } else if (isUntypedRelation(entity)) {
65913                     subtype = 'relation_type';
65914                 } else if (isUnknownRoad(entity)) {
65915                     subtype = 'highway_classification';
65916                 }
65917
65918                 if (!subtype) return [];
65919
65920                 var selectFixType = subtype === 'highway_classification' ? 'select_road_type' : 'select_preset';
65921
65922                 var fixes = [
65923                     new validationIssueFix({
65924                         icon: 'iD-icon-search',
65925                         title: t('issues.fix.' + selectFixType + '.title'),
65926                         onClick: function(context) {
65927                             context.ui().sidebar.showPresetList();
65928                         }
65929                     })
65930                 ];
65931
65932                 // can always delete if the user created it in the first place..
65933                 var canDelete = (entity.version === undefined || entity.v !== undefined);
65934                 fixes.push(
65935                     new validationIssueFix({
65936                         icon: 'iD-operation-delete',
65937                         title: t('issues.fix.delete_feature.title'),
65938                         onClick: function(context) {
65939                             var id = this.issue.entityIds[0];
65940                             var operation = operationDelete([id], context);
65941                             if (!operation.disabled()) {
65942                                 operation();
65943                             }
65944                         }
65945                     })
65946                 );
65947
65948                 var messageID = subtype === 'highway_classification' ? 'unknown_road' : 'missing_tag.' + subtype;
65949                 var referenceID = subtype === 'highway_classification' ? 'unknown_road' : 'missing_tag';
65950
65951                 var severity = (canDelete && subtype !== 'highway_classification') ? 'error' : 'warning';
65952
65953                 return [new validationIssue({
65954                     type: type,
65955                     subtype: subtype,
65956                     severity: severity,
65957                     message: function(context) {
65958                         var entity = context.hasEntity(this.entityIds[0]);
65959                         return entity ? t('issues.' + messageID + '.message', {
65960                             feature: utilDisplayLabel(entity, context)
65961                         }) : '';
65962                     },
65963                     reference: showReference,
65964                     entityIds: [entity.id],
65965                     fixes: fixes
65966                 })];
65967
65968
65969                 function showReference(selection) {
65970                     selection.selectAll('.issue-reference')
65971                         .data([0])
65972                         .enter()
65973                         .append('div')
65974                         .attr('class', 'issue-reference')
65975                         .text(t('issues.' + referenceID + '.reference'));
65976                 }
65977             };
65978
65979
65980             validation.type = type;
65981
65982             return validation;
65983         }
65984
65985         function validationOutdatedTags(context) {
65986             var type = 'outdated_tags';
65987
65988             // initialize name-suggestion-index matcher
65989             var nsiMatcher = matcher$1();
65990             nsiMatcher.buildMatchIndex(brands$1.brands);
65991             var nsiKeys = ['amenity', 'shop', 'tourism', 'leisure', 'office'];
65992
65993             var allWD = {};
65994             var allWP = {};
65995             Object.keys(brands$1.brands).forEach(function(kvnd) {
65996                 var brand = brands$1.brands[kvnd];
65997                 var wd = brand.tags['brand:wikidata'];
65998                 var wp = brand.tags['brand:wikipedia'];
65999                 if (wd) { allWD[wd] = kvnd; }
66000                 if (wp) { allWP[wp] = kvnd; }
66001             });
66002
66003
66004             function oldTagIssues(entity, graph) {
66005                 var oldTags = Object.assign({}, entity.tags);  // shallow copy
66006                 var preset = context.presets().match(entity, graph);
66007                 var explicitPresetUpgrade = preset.replacement;
66008                 var subtype = 'deprecated_tags';
66009
66010                 // upgrade preset..
66011                 if (preset.replacement) {
66012                     var newPreset = context.presets().item(preset.replacement);
66013                     graph = actionChangePreset(entity.id, preset, newPreset, true)(graph);  // true = skip field defaults
66014                     entity = graph.entity(entity.id);
66015                     preset = newPreset;
66016                 }
66017
66018                 // upgrade tags..
66019                 var deprecatedTags = entity.deprecatedTags();
66020                 if (deprecatedTags.length) {
66021                     deprecatedTags.forEach(function(tag) {
66022                         graph = actionUpgradeTags(entity.id, tag.old, tag.replace)(graph);
66023                     });
66024                     entity = graph.entity(entity.id);
66025                 }
66026
66027                 // add missing addTags..
66028                 var newTags = Object.assign({}, entity.tags);  // shallow copy
66029                 if (preset.tags !== preset.addTags) {
66030                     Object.keys(preset.addTags).forEach(function(k) {
66031                         if (!newTags[k]) {
66032                             newTags[k] = preset.addTags[k];
66033                             if (!explicitPresetUpgrade) {
66034                                 subtype = 'incomplete_tags';
66035                             }
66036                         }
66037                     });
66038                 }
66039
66040                 // Do `wikidata` or `wikipedia` identify this entity as a brand?  #6416
66041                 // If so, these tags can be swapped to `brand:wikidata`/`brand:wikipedia`
66042                 var isBrand;
66043                 if (newTags.wikidata) {                 // try matching `wikidata`
66044                     isBrand = allWD[newTags.wikidata];
66045                 }
66046                 if (!isBrand && newTags.wikipedia) {    // fallback to `wikipedia`
66047                     isBrand = allWP[newTags.wikipedia];
66048                 }
66049                 if (isBrand && !newTags.office) {       // but avoid doing this for corporate offices
66050                     if (newTags.wikidata) {
66051                         newTags['brand:wikidata'] = newTags.wikidata;
66052                         delete newTags.wikidata;
66053                     }
66054                     if (newTags.wikipedia) {
66055                         newTags['brand:wikipedia'] = newTags.wikipedia;
66056                         delete newTags.wikipedia;
66057                     }
66058                     // I considered setting `name` and other tags here, but they aren't unique per wikidata
66059                     // (Q2759586 -> in USA "Papa John's", in Russia "Папа Джонс")
66060                     // So users will really need to use a preset or assign `name` themselves.
66061                 }
66062
66063                 // try key/value|name match against name-suggestion-index
66064                 if (newTags.name) {
66065                     for (var i = 0; i < nsiKeys.length; i++) {
66066                         var k = nsiKeys[i];
66067                         if (!newTags[k]) continue;
66068
66069                         var match = nsiMatcher.matchKVN(k, newTags[k], newTags.name);
66070                         if (!match) continue;
66071
66072                         // for now skip ambiguous matches (like Target~(USA) vs Target~(Australia))
66073                         if (match.d) continue;
66074
66075                         var brand = brands$1.brands[match.kvnd];
66076                         if (brand && brand.tags['brand:wikidata']) {
66077                             subtype = 'noncanonical_brand';
66078
66079                             var keepTags = ['takeaway'].reduce(function(acc, k) {
66080                                 if (newTags[k]) {
66081                                     acc[k] = newTags[k];
66082                                 }
66083                                 return acc;
66084                             }, {});
66085
66086                             nsiKeys.forEach(function(k) { delete newTags[k]; });
66087                             Object.assign(newTags, brand.tags, keepTags);
66088                             break;
66089                         }
66090                     }
66091                 }
66092
66093
66094                 // determine diff
66095                 var tagDiff = utilTagDiff(oldTags, newTags);
66096                 if (!tagDiff.length) return [];
66097
66098                 var prefix = '';
66099                 if (subtype === 'noncanonical_brand') {
66100                     prefix = 'noncanonical_brand.';
66101                 } else if (subtype === 'incomplete_tags') {
66102                     prefix = 'incomplete.';
66103                 }
66104
66105                 // don't allow autofixing brand tags
66106                 var autoArgs = subtype !== 'noncanonical_brand' ? [doUpgrade, t('issues.fix.upgrade_tags.annotation')] : null;
66107
66108                 return [new validationIssue({
66109                     type: type,
66110                     subtype: subtype,
66111                     severity: 'warning',
66112                     message: showMessage,
66113                     reference: showReference,
66114                     entityIds: [entity.id],
66115                     hash: JSON.stringify(tagDiff),
66116                     fixes: [
66117                         new validationIssueFix({
66118                             autoArgs: autoArgs,
66119                             title: t('issues.fix.upgrade_tags.title'),
66120                             onClick: function(context) {
66121                                 context.perform(doUpgrade, t('issues.fix.upgrade_tags.annotation'));
66122                             }
66123                         })
66124                     ]
66125                 })];
66126
66127
66128                 function doUpgrade(graph) {
66129                     var currEntity = graph.hasEntity(entity.id);
66130                     if (!currEntity) return graph;
66131
66132                     var newTags = Object.assign({}, currEntity.tags);  // shallow copy
66133                     tagDiff.forEach(function(diff) {
66134                         if (diff.type === '-') {
66135                             delete newTags[diff.key];
66136                         } else if (diff.type === '+') {
66137                             newTags[diff.key] = diff.newVal;
66138                         }
66139                     });
66140
66141                     return actionChangeTags(currEntity.id, newTags)(graph);
66142                 }
66143
66144
66145                 function showMessage(context) {
66146                     var currEntity = context.hasEntity(entity.id);
66147                     if (!currEntity) return '';
66148
66149                     return t('issues.outdated_tags.' + prefix + 'message',
66150                         { feature: utilDisplayLabel(currEntity, context) }
66151                     );
66152                 }
66153
66154
66155                 function showReference(selection) {
66156                     var enter = selection.selectAll('.issue-reference')
66157                         .data([0])
66158                         .enter();
66159
66160                     enter
66161                         .append('div')
66162                         .attr('class', 'issue-reference')
66163                         .text(t('issues.outdated_tags.' + prefix + 'reference'));
66164
66165                     enter
66166                         .append('strong')
66167                         .text(t('issues.suggested'));
66168
66169                     enter
66170                         .append('table')
66171                         .attr('class', 'tagDiff-table')
66172                         .selectAll('.tagDiff-row')
66173                         .data(tagDiff)
66174                         .enter()
66175                         .append('tr')
66176                         .attr('class', 'tagDiff-row')
66177                         .append('td')
66178                         .attr('class', function(d) {
66179                             var klass = d.type === '+' ? 'add' : 'remove';
66180                             return 'tagDiff-cell tagDiff-cell-' + klass;
66181                         })
66182                         .text(function(d) { return d.display; });
66183                 }
66184             }
66185
66186
66187             function oldMultipolygonIssues(entity, graph) {
66188
66189                 var multipolygon, outerWay;
66190                 if (entity.type === 'relation') {
66191                     outerWay = osmOldMultipolygonOuterMemberOfRelation(entity, graph);
66192                     multipolygon = entity;
66193                 } else if (entity.type === 'way') {
66194                     multipolygon = osmIsOldMultipolygonOuterMember(entity, graph);
66195                     outerWay = entity;
66196                 } else {
66197                     return [];
66198                 }
66199
66200                 if (!multipolygon || !outerWay) return [];
66201
66202                 return [new validationIssue({
66203                     type: type,
66204                     subtype: 'old_multipolygon',
66205                     severity: 'warning',
66206                     message: showMessage,
66207                     reference: showReference,
66208                     entityIds: [outerWay.id, multipolygon.id],
66209                     fixes: [
66210                         new validationIssueFix({
66211                             autoArgs: [doUpgrade, t('issues.fix.move_tags.annotation')],
66212                             title: t('issues.fix.move_tags.title'),
66213                             onClick: function(context) {
66214                                 context.perform(doUpgrade, t('issues.fix.move_tags.annotation'));
66215                             }
66216                         })
66217                     ]
66218                 })];
66219
66220
66221                 function doUpgrade(graph) {
66222                     var currMultipolygon = graph.hasEntity(multipolygon.id);
66223                     var currOuterWay = graph.hasEntity(outerWay.id);
66224                     if (!currMultipolygon || !currOuterWay) return graph;
66225
66226                     currMultipolygon = currMultipolygon.mergeTags(currOuterWay.tags);
66227                     graph = graph.replace(currMultipolygon);
66228                     return actionChangeTags(currOuterWay.id, {})(graph);
66229                 }
66230
66231
66232                 function showMessage(context) {
66233                     var currMultipolygon = context.hasEntity(multipolygon.id);
66234                     if (!currMultipolygon) return '';
66235
66236                     return t('issues.old_multipolygon.message',
66237                         { multipolygon: utilDisplayLabel(currMultipolygon, context) }
66238                     );
66239                 }
66240
66241
66242                 function showReference(selection) {
66243                     selection.selectAll('.issue-reference')
66244                         .data([0])
66245                         .enter()
66246                         .append('div')
66247                         .attr('class', 'issue-reference')
66248                         .text(t('issues.old_multipolygon.reference'));
66249                 }
66250             }
66251
66252
66253             var validation = function checkOutdatedTags(entity, graph) {
66254                 var issues = oldMultipolygonIssues(entity, graph);
66255                 if (!issues.length) issues = oldTagIssues(entity, graph);
66256                 return issues;
66257             };
66258
66259
66260             validation.type = type;
66261
66262             return validation;
66263         }
66264
66265         function validationPrivateData() {
66266             var type = 'private_data';
66267
66268             // assume that some buildings are private
66269             var privateBuildingValues = {
66270                 detached: true,
66271                 farm: true,
66272                 house: true,
66273                 houseboat: true,
66274                 residential: true,
66275                 semidetached_house: true,
66276                 static_caravan: true
66277             };
66278
66279             // but they might be public if they have one of these other tags
66280             var publicKeys = {
66281                 amenity: true,
66282                 craft: true,
66283                 historic: true,
66284                 leisure: true,
66285                 office: true,
66286                 shop: true,
66287                 tourism: true
66288             };
66289
66290             // these tags may contain personally identifying info
66291             var personalTags = {
66292                 'contact:email': true,
66293                 'contact:fax': true,
66294                 'contact:phone': true,
66295                 email: true,
66296                 fax: true,
66297                 phone: true
66298             };
66299
66300
66301             var validation = function checkPrivateData(entity) {
66302                 var tags = entity.tags;
66303                 if (!tags.building || !privateBuildingValues[tags.building]) return [];
66304
66305                 var keepTags = {};
66306                 for (var k in tags) {
66307                     if (publicKeys[k]) return [];  // probably a public feature
66308                     if (!personalTags[k]) {
66309                         keepTags[k] = tags[k];
66310                     }
66311                 }
66312
66313                 var tagDiff = utilTagDiff(tags, keepTags);
66314                 if (!tagDiff.length) return [];
66315
66316                 var fixID = tagDiff.length === 1 ? 'remove_tag' : 'remove_tags';
66317
66318                 return [new validationIssue({
66319                     type: type,
66320                     severity: 'warning',
66321                     message: showMessage,
66322                     reference: showReference,
66323                     entityIds: [entity.id],
66324                     fixes: [
66325                         new validationIssueFix({
66326                             icon: 'iD-operation-delete',
66327                             title: t('issues.fix.' + fixID + '.title'),
66328                             onClick: function(context) {
66329                                 context.perform(doUpgrade, t('issues.fix.upgrade_tags.annotation'));
66330                             }
66331                         })
66332                     ]
66333                 })];
66334
66335
66336                 function doUpgrade(graph) {
66337                     var currEntity = graph.hasEntity(entity.id);
66338                     if (!currEntity) return graph;
66339
66340                     var newTags = Object.assign({}, currEntity.tags);  // shallow copy
66341                     tagDiff.forEach(function(diff) {
66342                         if (diff.type === '-') {
66343                             delete newTags[diff.key];
66344                         } else if (diff.type === '+') {
66345                             newTags[diff.key] = diff.newVal;
66346                         }
66347                     });
66348
66349                     return actionChangeTags(currEntity.id, newTags)(graph);
66350                 }
66351
66352
66353                 function showMessage(context) {
66354                     var currEntity = context.hasEntity(this.entityIds[0]);
66355                     if (!currEntity) return '';
66356
66357                     return t('issues.private_data.contact.message',
66358                         { feature: utilDisplayLabel(currEntity, context) }
66359                     );
66360                 }
66361
66362
66363                 function showReference(selection) {
66364                     var enter = selection.selectAll('.issue-reference')
66365                         .data([0])
66366                         .enter();
66367
66368                     enter
66369                         .append('div')
66370                         .attr('class', 'issue-reference')
66371                         .text(t('issues.private_data.reference'));
66372
66373                     enter
66374                         .append('strong')
66375                         .text(t('issues.suggested'));
66376
66377                     enter
66378                         .append('table')
66379                         .attr('class', 'tagDiff-table')
66380                         .selectAll('.tagDiff-row')
66381                         .data(tagDiff)
66382                         .enter()
66383                         .append('tr')
66384                         .attr('class', 'tagDiff-row')
66385                         .append('td')
66386                         .attr('class', function(d) {
66387                             var klass = d.type === '+' ? 'add' : 'remove';
66388                             return 'tagDiff-cell tagDiff-cell-' + klass;
66389                         })
66390                         .text(function(d) { return d.display; });
66391                 }
66392             };
66393
66394
66395             validation.type = type;
66396
66397             return validation;
66398         }
66399
66400         function validationTagSuggestsArea(context) {
66401             var type = 'tag_suggests_area';
66402
66403
66404             var validation = function checkTagSuggestsArea(entity, graph) {
66405                 if (entity.type !== 'way' || entity.isClosed()) return [];
66406
66407                 var tagSuggestingArea = entity.tagSuggestingArea();
66408                 if (!tagSuggestingArea) {
66409                     return [];
66410                 }
66411
66412                 if (context.presets().matchTags(tagSuggestingArea, 'line') ===
66413                     context.presets().matchTags(tagSuggestingArea, 'area')) {
66414                     // these tags also allow lines and making this an area wouldn't matter
66415                     return [];
66416                 }
66417
66418                 var tagText = utilTagText({ tags: tagSuggestingArea });
66419                 var fixes = [];
66420
66421                 var connectEndpointsOnClick;
66422
66423                 // must have at least three nodes to close this automatically
66424                 if (entity.nodes.length >= 3) {
66425                     var nodes = graph.childNodes(entity), testNodes;
66426                     var firstToLastDistanceMeters = geoSphericalDistance(nodes[0].loc, nodes[nodes.length-1].loc);
66427
66428                     // if the distance is very small, attempt to merge the endpoints
66429                     if (firstToLastDistanceMeters < 0.75) {
66430                         testNodes = nodes.slice();   // shallow copy
66431                         testNodes.pop();
66432                         testNodes.push(testNodes[0]);
66433                         // make sure this will not create a self-intersection
66434                         if (!geoHasSelfIntersections(testNodes, testNodes[0].id)) {
66435                             connectEndpointsOnClick = function(context) {
66436                                 var way = context.entity(this.issue.entityIds[0]);
66437                                 context.perform(
66438                                     actionMergeNodes([way.nodes[0], way.nodes[way.nodes.length-1]], nodes[0].loc),
66439                                     t('issues.fix.connect_endpoints.annotation')
66440                                 );
66441                             };
66442                         }
66443                     }
66444
66445                     if (!connectEndpointsOnClick) {
66446                         // if the points were not merged, attempt to close the way
66447                         testNodes = nodes.slice();   // shallow copy
66448                         testNodes.push(testNodes[0]);
66449                         // make sure this will not create a self-intersection
66450                         if (!geoHasSelfIntersections(testNodes, testNodes[0].id)) {
66451                             connectEndpointsOnClick = function(context) {
66452                                 var wayId = this.issue.entityIds[0];
66453                                 var way = context.entity(wayId);
66454                                 var nodeId = way.nodes[0];
66455                                 var index = way.nodes.length;
66456                                 context.perform(
66457                                     actionAddVertex(wayId, nodeId, index),
66458                                     t('issues.fix.connect_endpoints.annotation')
66459                                 );
66460                             };
66461                         }
66462                     }
66463                 }
66464
66465                 fixes.push(new validationIssueFix({
66466                     title: t('issues.fix.connect_endpoints.title'),
66467                     onClick: connectEndpointsOnClick
66468                 }));
66469
66470                 fixes.push(new validationIssueFix({
66471                     icon: 'iD-operation-delete',
66472                     title: t('issues.fix.remove_tag.title'),
66473                     onClick: function(context) {
66474                         var entityId = this.issue.entityIds[0];
66475                         var entity = context.entity(entityId);
66476                         var tags = Object.assign({}, entity.tags);  // shallow copy
66477                         for (var key in tagSuggestingArea) {
66478                             delete tags[key];
66479                         }
66480                         context.perform(
66481                             actionChangeTags(entityId, tags),
66482                             t('issues.fix.remove_tag.annotation')
66483                         );
66484                     }
66485                 }));
66486
66487                 return [new validationIssue({
66488                     type: type,
66489                     severity: 'warning',
66490                     message: function(context) {
66491                         var entity = context.hasEntity(this.entityIds[0]);
66492                         return entity ? t('issues.tag_suggests_area.message', {
66493                             feature: utilDisplayLabel(entity, context),
66494                             tag: tagText
66495                         }) : '';
66496                     },
66497                     reference: showReference,
66498                     entityIds: [entity.id],
66499                     hash: JSON.stringify(tagSuggestingArea) +
66500                         // avoid stale "connect endpoints" fix
66501                         (typeof connectEndpointsOnClick),
66502                     fixes: fixes
66503                 })];
66504
66505
66506                 function showReference(selection) {
66507                     selection.selectAll('.issue-reference')
66508                         .data([0])
66509                         .enter()
66510                         .append('div')
66511                         .attr('class', 'issue-reference')
66512                         .text(t('issues.tag_suggests_area.reference'));
66513                 }
66514             };
66515
66516             validation.type = type;
66517
66518             return validation;
66519         }
66520
66521         function validationUnsquareWay(context) {
66522             var type = 'unsquare_way';
66523             var DEFAULT_DEG_THRESHOLD = 5;   // see also issues.js
66524
66525             // use looser epsilon for detection to reduce warnings of buildings that are essentially square already
66526             var epsilon = 0.05;
66527             var nodeThreshold = 10;
66528
66529             function isBuilding(entity, graph) {
66530                 if (entity.type !== 'way' || entity.geometry(graph) !== 'area') return false;
66531                 return entity.tags.building && entity.tags.building !== 'no';
66532             }
66533
66534
66535             var validation = function checkUnsquareWay(entity, graph) {
66536
66537                 if (!isBuilding(entity, graph)) return [];
66538
66539                 // don't flag ways marked as physically unsquare
66540                 if (entity.tags.nonsquare === 'yes') return [];
66541
66542                 var isClosed = entity.isClosed();
66543                 if (!isClosed) return [];        // this building has bigger problems
66544
66545                 // don't flag ways with lots of nodes since they are likely detail-mapped
66546                 var nodes = graph.childNodes(entity).slice();    // shallow copy
66547                 if (nodes.length > nodeThreshold + 1) return [];   // +1 because closing node appears twice
66548
66549                 // ignore if not all nodes are fully downloaded
66550                 var osm = services$1.osm;
66551                 if (!osm || nodes.some(function(node) { return !osm.isDataLoaded(node.loc); })) return [];
66552
66553                 // don't flag connected ways to avoid unresolvable unsquare loops
66554                 var hasConnectedSquarableWays = nodes.some(function(node) {
66555                     return graph.parentWays(node).some(function(way) {
66556                         if (way.id === entity.id) return false;
66557                         if (isBuilding(way, graph)) return true;
66558                         return graph.parentRelations(way).some(function(parentRelation) {
66559                             return parentRelation.isMultipolygon() &&
66560                                 parentRelation.tags.building &&
66561                                 parentRelation.tags.building !== 'no';
66562                         });
66563                     });
66564                 });
66565                 if (hasConnectedSquarableWays) return [];
66566
66567
66568                 // user-configurable square threshold
66569                 var storedDegreeThreshold = context.storage('validate-square-degrees');
66570                 var degreeThreshold = isNaN(storedDegreeThreshold) ? DEFAULT_DEG_THRESHOLD : parseFloat(storedDegreeThreshold);
66571
66572                 var points = nodes.map(function(node) { return context.projection(node.loc); });
66573                 if (!geoOrthoCanOrthogonalize(points, isClosed, epsilon, degreeThreshold, true)) return [];
66574
66575                 var autoArgs;
66576                 // don't allow autosquaring features linked to wikidata
66577                 if (!entity.tags.wikidata) {
66578                     // use same degree threshold as for detection
66579                     var autoAction = actionOrthogonalize(entity.id, context.projection, undefined, degreeThreshold);
66580                     autoAction.transitionable = false;  // when autofixing, do it instantly
66581                     autoArgs = [autoAction, t('operations.orthogonalize.annotation.area')];
66582                 }
66583
66584                 return [new validationIssue({
66585                     type: type,
66586                     severity: 'warning',
66587                     message: function(context) {
66588                         var entity = context.hasEntity(this.entityIds[0]);
66589                         return entity ? t('issues.unsquare_way.message', { feature: utilDisplayLabel(entity, context) }) : '';
66590                     },
66591                     reference: showReference,
66592                     entityIds: [entity.id],
66593                     hash: JSON.stringify(autoArgs !== undefined) + degreeThreshold,
66594                     fixes: [
66595                         new validationIssueFix({
66596                             icon: 'iD-operation-orthogonalize',
66597                             title: t('issues.fix.square_feature.title'),
66598                             autoArgs: autoArgs,
66599                             onClick: function(context, completionHandler) {
66600                                 var entityId = this.issue.entityIds[0];
66601                                 // use same degree threshold as for detection
66602                                 context.perform(
66603                                     actionOrthogonalize(entityId, context.projection, undefined, degreeThreshold),
66604                                     t('operations.orthogonalize.annotation.area')
66605                                 );
66606                                 // run after the squaring transition (currently 150ms)
66607                                 window.setTimeout(function() { completionHandler(); }, 175);
66608                             }
66609                         }),
66610                         /*
66611                         new validationIssueFix({
66612                             title: t('issues.fix.tag_as_unsquare.title'),
66613                             onClick: function(context) {
66614                                 var entityId = this.issue.entityIds[0];
66615                                 var entity = context.entity(entityId);
66616                                 var tags = Object.assign({}, entity.tags);  // shallow copy
66617                                 tags.nonsquare = 'yes';
66618                                 context.perform(
66619                                     actionChangeTags(entityId, tags),
66620                                     t('issues.fix.tag_as_unsquare.annotation')
66621                                 );
66622                             }
66623                         })
66624                         */
66625                     ]
66626                 })];
66627
66628                 function showReference(selection) {
66629                     selection.selectAll('.issue-reference')
66630                         .data([0])
66631                         .enter()
66632                         .append('div')
66633                         .attr('class', 'issue-reference')
66634                         .text(t('issues.unsquare_way.buildings.reference'));
66635                 }
66636             };
66637
66638             validation.type = type;
66639
66640             return validation;
66641         }
66642
66643
66644
66645         var Validations = /*#__PURE__*/Object.freeze({
66646                 validationAlmostJunction: validationAlmostJunction,
66647                 validationCloseNodes: validationCloseNodes,
66648                 validationCrossingWays: validationCrossingWays,
66649                 validationDisconnectedWay: validationDisconnectedWay,
66650                 validationFixmeTag: validationFixmeTag,
66651                 validationGenericName: validationGenericName,
66652                 validationImpossibleOneway: validationImpossibleOneway,
66653                 validationIncompatibleSource: validationIncompatibleSource,
66654                 validationFormatting: validationFormatting,
66655                 validationMaprules: validationMaprules,
66656                 validationMissingRole: validationMissingRole,
66657                 validationMissingTag: validationMissingTag,
66658                 validationOutdatedTags: validationOutdatedTags,
66659                 validationPrivateData: validationPrivateData,
66660                 validationTagSuggestsArea: validationTagSuggestsArea,
66661                 validationUnsquareWay: validationUnsquareWay
66662         });
66663
66664         function coreValidator(context) {
66665             var dispatch$1 = dispatch('validated', 'focusedIssue');
66666             var validator = utilRebind({}, dispatch$1, 'on');
66667
66668             var _rules = {};
66669             var _disabledRules = {};
66670
66671             var _ignoredIssueIDs = {};       // issue.id -> true
66672             var _issuesByIssueID = {};       // issue.id -> issue
66673             var _issuesByEntityID = {};      // entity.id -> set(issue.id)
66674             var _validatedGraph = null;
66675             var _deferred = new Set();
66676
66677             //
66678             // initialize the validator rulesets
66679             //
66680             validator.init = function() {
66681                 Object.values(Validations).forEach(function(validation) {
66682                     if (typeof validation !== 'function') return;
66683
66684                     var fn = validation(context);
66685                     var key = fn.type;
66686                     _rules[key] = fn;
66687                 });
66688
66689                 var disabledRules = context.storage('validate-disabledRules');
66690                 if (disabledRules) {
66691                     disabledRules.split(',')
66692                         .forEach(function(key) { _disabledRules[key] = true; });
66693                 }
66694             };
66695
66696
66697             //
66698             // clear caches, called whenever iD resets after a save
66699             //
66700             validator.reset = function() {
66701                 Array.from(_deferred).forEach(function(handle) {
66702                     window.cancelIdleCallback(handle);
66703                     _deferred.delete(handle);
66704                 });
66705
66706                 // clear caches
66707                 _ignoredIssueIDs = {};
66708                 _issuesByIssueID = {};
66709                 _issuesByEntityID = {};
66710                 _validatedGraph = null;
66711
66712                 for (var key in _rules) {
66713                     if (typeof _rules[key].reset === 'function') {
66714                         _rules[key].reset();   // 'crossing_ways' is the only one like this
66715                     }
66716                 }
66717             };
66718
66719             validator.resetIgnoredIssues = function() {
66720                 _ignoredIssueIDs = {};
66721                 // reload UI
66722                 dispatch$1.call('validated');
66723             };
66724
66725
66726             // when the user changes the squaring thereshold, rerun this on all buildings
66727             validator.changeSquareThreshold = function() {
66728                 var checkUnsquareWay = _rules.unsquare_way;
66729                 if (typeof checkUnsquareWay !== 'function') return;
66730
66731                 // uncache existing
66732                 Object.values(_issuesByIssueID)
66733                     .filter(function(issue) { return issue.type === 'unsquare_way'; })
66734                     .forEach(function(issue) {
66735                         var entityId = issue.entityIds[0];   // always 1 entity for unsquare way
66736                         if (_issuesByEntityID[entityId]) {
66737                             _issuesByEntityID[entityId].delete(issue.id);
66738                         }
66739                         delete _issuesByIssueID[issue.id];
66740                     });
66741
66742                 var buildings = context.intersects(geoExtent([-180,-90],[180, 90]))  // everywhere
66743                     .filter(function(entity) {
66744                         return entity.type === 'way' && entity.tags.building && entity.tags.building !== 'no';
66745                     });
66746
66747                 // rerun for all buildings
66748                 buildings.forEach(function(entity) {
66749                     var detected = checkUnsquareWay(entity, context);
66750                     if (detected.length !== 1) return;
66751
66752                     var issue = detected[0];
66753                     var ignoreFix = new validationIssueFix({
66754                         title: t('issues.fix.ignore_issue.title'),
66755                         icon: 'iD-icon-close',
66756                         onClick: function() {
66757                             ignoreIssue(this.issue.id);
66758                         }
66759                     });
66760                     ignoreFix.type = 'ignore';
66761                     ignoreFix.issue = issue;
66762                     issue.fixes.push(ignoreFix);
66763
66764                     if (!_issuesByEntityID[entity.id]) {
66765                         _issuesByEntityID[entity.id] = new Set();
66766                     }
66767                     _issuesByEntityID[entity.id].add(issue.id);
66768                     _issuesByIssueID[issue.id] = issue;
66769                 });
66770
66771                 dispatch$1.call('validated');
66772             };
66773
66774
66775             // options = {
66776             //     what: 'all',     // 'all' or 'edited'
66777             //     where: 'all',   // 'all' or 'visible'
66778             //     includeIgnored: false   // true, false, or 'only'
66779             //     includeDisabledRules: false   // true, false, or 'only'
66780             // };
66781             validator.getIssues = function(options) {
66782                 var opts = Object.assign({ what: 'all', where: 'all', includeIgnored: false, includeDisabledRules: false }, options);
66783                 var issues = Object.values(_issuesByIssueID);
66784                 var changes = context.history().difference().changes();
66785                 var view = context.map().extent();
66786
66787                 return issues.filter(function(issue) {
66788                     if (opts.includeDisabledRules === 'only' && !_disabledRules[issue.type]) return false;
66789                     if (!opts.includeDisabledRules && _disabledRules[issue.type]) return false;
66790
66791                     if (opts.includeIgnored === 'only' && !_ignoredIssueIDs[issue.id]) return false;
66792                     if (!opts.includeIgnored && _ignoredIssueIDs[issue.id]) return false;
66793
66794                     // Sanity check:  This issue may be for an entity that not longer exists.
66795                     // If we detect this, uncache and return false so it is not included..
66796                     var entityIds = issue.entityIds || [];
66797                     for (var i = 0; i < entityIds.length; i++) {
66798                         var entityId = entityIds[i];
66799                         if (!context.hasEntity(entityId)) {
66800                             delete _issuesByEntityID[entityId];
66801                             delete _issuesByIssueID[issue.id];
66802                             return false;
66803                         }
66804                     }
66805
66806                     if (opts.what === 'edited') {
66807                         var isEdited = entityIds.some(function(entityId) { return changes[entityId]; });
66808                         if (entityIds.length && !isEdited) return false;
66809                     }
66810
66811                     if (opts.where === 'visible') {
66812                         var extent = issue.extent(context.graph());
66813                         if (!view.intersects(extent)) return false;
66814                     }
66815
66816                     return true;
66817                 });
66818             };
66819
66820             validator.focusIssue = function(issue) {
66821                 var extent = issue.extent(context.graph());
66822
66823                 if (extent) {
66824                     var setZoom = Math.max(context.map().zoom(), 19);
66825                     context.map().unobscuredCenterZoomEase(extent.center(), setZoom);
66826
66827                     // select the first entity
66828                     if (issue.entityIds && issue.entityIds.length) {
66829                         window.setTimeout(function() {
66830                             var ids = issue.entityIds;
66831                             context.enter(modeSelect(context, [ids[0]]));
66832                             dispatch$1.call('focusedIssue', this, issue);
66833                         }, 250);  // after ease
66834                     }
66835                 }
66836             };
66837
66838
66839             validator.getIssuesBySeverity = function(options) {
66840                 var groups = utilArrayGroupBy(validator.getIssues(options), 'severity');
66841                 groups.error = groups.error || [];
66842                 groups.warning = groups.warning || [];
66843                 return groups;
66844             };
66845
66846
66847             validator.getEntityIssues = function(entityID, options) {
66848                 var issueIDs = _issuesByEntityID[entityID];
66849                 if (!issueIDs) return [];
66850
66851                 var opts = options || {};
66852
66853                 return Array.from(issueIDs)
66854                     .map(function(id) { return _issuesByIssueID[id]; })
66855                     .filter(function(issue) {
66856                         if (opts.includeDisabledRules === 'only' && !_disabledRules[issue.type]) return false;
66857                         if (!opts.includeDisabledRules && _disabledRules[issue.type]) return false;
66858
66859                         if (opts.includeIgnored === 'only' && !_ignoredIssueIDs[issue.id]) return false;
66860                         if (!opts.includeIgnored && _ignoredIssueIDs[issue.id]) return false;
66861
66862                         return true;
66863                     });
66864             };
66865
66866
66867             validator.getRuleKeys = function() {
66868                 return Object.keys(_rules)
66869                     .filter(function(key) { return key !== 'maprules'; })
66870                     .sort(function(key1, key2) {
66871                         // alphabetize by localized title
66872                         return t('issues.' + key1 + '.title') < t('issues.' + key2 + '.title') ? -1 : 1;
66873                     });
66874             };
66875
66876
66877             validator.isRuleEnabled = function(key) {
66878                 return !_disabledRules[key];
66879             };
66880
66881
66882             validator.toggleRule = function(key) {
66883                 if (_disabledRules[key]) {
66884                     delete _disabledRules[key];
66885                 } else {
66886                     _disabledRules[key] = true;
66887                 }
66888
66889                 context.storage('validate-disabledRules', Object.keys(_disabledRules).join(','));
66890                 validator.validate();
66891             };
66892
66893
66894             validator.disableRules = function(keys) {
66895                 _disabledRules = {};
66896                 keys.forEach(function(k) {
66897                     _disabledRules[k] = true;
66898                 });
66899
66900                 context.storage('validate-disabledRules', Object.keys(_disabledRules).join(','));
66901                 validator.validate();
66902             };
66903
66904
66905             //
66906             // Remove a single entity and all its related issues from the caches
66907             //
66908             function uncacheEntityID(entityID) {
66909                 var issueIDs = _issuesByEntityID[entityID];
66910                 if (!issueIDs) return;
66911
66912                 issueIDs.forEach(function(issueID) {
66913                     var issue = _issuesByIssueID[issueID];
66914                     if (issue) {
66915                         // When multiple entities are involved (e.g. crossing_ways),
66916                         // remove this issue from the other entity caches too..
66917                         var entityIds = issue.entityIds || [];
66918                         entityIds.forEach(function(other) {
66919                             if (other !== entityID) {
66920                                 if (_issuesByEntityID[other]) {
66921                                     _issuesByEntityID[other].delete(issueID);
66922                                 }
66923                             }
66924                         });
66925                     }
66926
66927                     delete _issuesByIssueID[issueID];
66928                 });
66929
66930                 delete _issuesByEntityID[entityID];
66931             }
66932
66933
66934             function ignoreIssue(id) {
66935                 _ignoredIssueIDs[id] = true;
66936             }
66937
66938
66939             //
66940             // Run validation on a single entity for the given graph
66941             //
66942             function validateEntity(entity, graph) {
66943                 var entityIssues = [];
66944                 var ran = {};
66945
66946                 // runs validation and appends resulting issues,
66947                 // returning true if validation passed without issue
66948                 function runValidation(key) {
66949                     if (ran[key]) return true;
66950
66951                     var fn = _rules[key];
66952                     if (typeof fn !== 'function') {
66953                         console.error('no such validation rule = ' + key);  // eslint-disable-line no-console
66954                         ran[key] = true;
66955                         return true;
66956                     }
66957
66958                     var detected = fn(entity, graph);
66959                     detected.forEach(function(issue) {
66960                         var hasIgnoreFix = issue.fixes && issue.fixes.length && issue.fixes[issue.fixes.length - 1].type === 'ignore';
66961                         if (issue.severity === 'warning' && !hasIgnoreFix) {
66962                             var ignoreFix = new validationIssueFix({
66963                                 title: t('issues.fix.ignore_issue.title'),
66964                                 icon: 'iD-icon-close',
66965                                 onClick: function() {
66966                                     ignoreIssue(this.issue.id);
66967                                 }
66968                             });
66969                             ignoreFix.type = 'ignore';
66970                             ignoreFix.issue = issue;
66971                             issue.fixes.push(ignoreFix);
66972                         }
66973                     });
66974                     entityIssues = entityIssues.concat(detected);
66975                     ran[key] = true;
66976                     return !detected.length;
66977                 }
66978
66979                 // run some validations manually to control the order and to skip some
66980
66981                 runValidation('missing_role');
66982
66983                 if (entity.type === 'relation') {
66984                     if (!runValidation('outdated_tags')) {
66985                         // don't flag missing tags if they are on the outer way
66986                         ran.missing_tag = true;
66987                     }
66988                 }
66989
66990                 runValidation('missing_tag');
66991
66992                 runValidation('outdated_tags');
66993
66994                 runValidation('crossing_ways');
66995                 runValidation('almost_junction');
66996
66997                 // only check impossible_oneway if no disconnected_way issues
66998                 if (runValidation('disconnected_way')) {
66999                     runValidation('impossible_oneway');
67000                 } else {
67001                     ran.impossible_oneway = true;
67002                 }
67003
67004                 runValidation('tag_suggests_area');
67005
67006                 // run all rules not yet run
67007                 Object.keys(_rules).forEach(runValidation);
67008
67009                 return entityIssues;
67010             }
67011
67012             function entityIDsToValidate(entityIDs, graph) {
67013                 var processedIDs = new Set();
67014                 return entityIDs.reduce(function(acc, entityID) {
67015                     // keep redundancy check separate from `acc` because an `entityID`
67016                     // could have been added to `acc` as a related entity through an earlier pass
67017                     if (processedIDs.has(entityID)) return acc;
67018                     processedIDs.add(entityID);
67019
67020                     var entity = graph.hasEntity(entityID);
67021                     if (!entity) return acc;
67022
67023                     acc.add(entityID);
67024
67025                     var checkParentRels = [entity];
67026
67027                     if (entity.type === 'node') {   // include parent ways
67028                         graph.parentWays(entity).forEach(function(parentWay) {
67029                             acc.add(parentWay.id);
67030                             checkParentRels.push(parentWay);
67031                         });
67032                     } else if (entity.type === 'relation') {   // include members
67033                         entity.members.forEach(function(member) {
67034                             acc.add(member.id);
67035                         });
67036                     } else if (entity.type === 'way') {   // include connected ways
67037                         entity.nodes.forEach(function(nodeID) {
67038                             graph._parentWays[nodeID].forEach(function(wayID) {
67039                                 acc.add(wayID);
67040                             });
67041                         });
67042                     }
67043
67044                     checkParentRels.forEach(function(entity) {   // include parent relations
67045                         if (entity.type !== 'relation') {        // but not super-relations
67046                             graph.parentRelations(entity).forEach(function(parentRelation) {
67047                                 acc.add(parentRelation.id);
67048                             });
67049                         }
67050                     });
67051
67052                     return acc;
67053
67054                 }, new Set());
67055             }
67056
67057             //
67058             // Run validation for several entities, supplied `entityIDs`
67059             //
67060             function validateEntities(entityIDs) {
67061
67062                 var graph = context.graph();
67063
67064                 // clear caches for existing issues related to these entities
67065                 entityIDs.forEach(uncacheEntityID);
67066
67067                 // detect new issues and update caches
67068                 entityIDs.forEach(function(entityID) {
67069                     var entity = graph.hasEntity(entityID);
67070                     // don't validate deleted entities
67071                     if (!entity) return;
67072
67073                     var issues = validateEntity(entity, graph);
67074                     issues.forEach(function(issue) {
67075                         var entityIds = issue.entityIds || [];
67076                         entityIds.forEach(function(entityId) {
67077                             if (!_issuesByEntityID[entityId]) {
67078                                 _issuesByEntityID[entityId] = new Set();
67079                             }
67080                             _issuesByEntityID[entityId].add(issue.id);
67081                         });
67082                         _issuesByIssueID[issue.id] = issue;
67083                     });
67084                 });
67085
67086                 dispatch$1.call('validated');
67087             }
67088
67089
67090             //
67091             // Validates anything that has changed since the last time it was run.
67092             // Also updates the "validatedGraph" to be the current graph
67093             // and dispatches a `validated` event when finished.
67094             //
67095             validator.validate = function() {
67096                 var currGraph = context.graph();
67097                 _validatedGraph = _validatedGraph || context.history().base();
67098                 if (currGraph === _validatedGraph) {
67099                     dispatch$1.call('validated');
67100                     return;
67101                 }
67102                 var oldGraph = _validatedGraph;
67103                 var difference = coreDifference(oldGraph, currGraph);
67104                 _validatedGraph = currGraph;
67105
67106                 for (var key in _rules) {
67107                     if (typeof _rules[key].reset === 'function') {
67108                         _rules[key].reset();   // 'crossing_ways' is the only one like this
67109                     }
67110                 }
67111
67112                 var createdAndModifiedEntityIDs = difference.extantIDs(true);   // created/modified (true = w/relation members)
67113                 var entityIDsToCheck = entityIDsToValidate(createdAndModifiedEntityIDs, currGraph);
67114
67115                 // "validate" deleted entities in order to update their related entities
67116                 // (e.g. deleting the only highway connected to a road should create a disconnected highway issue)
67117                 var deletedEntityIDs = difference.deleted().map(function(entity) { return entity.id; });
67118                 var entityIDsToCheckForDeleted = entityIDsToValidate(deletedEntityIDs, oldGraph);
67119
67120                 // concat the sets
67121                 entityIDsToCheckForDeleted.forEach(entityIDsToCheck.add, entityIDsToCheck);
67122
67123                 validateEntities(entityIDsToCheck);   // dispatches 'validated'
67124             };
67125
67126
67127             // WHEN TO RUN VALIDATION:
67128             // When graph changes:
67129             context.history()
67130                 .on('restore.validator', validator.validate)   // restore saved history
67131                 .on('undone.validator', validator.validate)    // undo
67132                 .on('redone.validator', validator.validate);   // redo
67133                 // but not on 'change' (e.g. while drawing)
67134
67135             // When user chages editing modes:
67136             context
67137                 .on('exit.validator', validator.validate);
67138
67139             // When merging fetched data:
67140             context.history()
67141                 .on('merge.validator', function(entities) {
67142                     if (!entities) return;
67143                     var handle = window.requestIdleCallback(function() {
67144                         var ids = entities.map(function(entity) { return entity.id; });
67145                         validateEntities(entityIDsToValidate(ids, context.graph()));
67146                     });
67147                     _deferred.add(handle);
67148                 });
67149
67150
67151             return validator;
67152         }
67153
67154         function presetCollection(collection) {
67155             var maxSearchResults = 50;
67156
67157             var presets = {
67158
67159                 collection: collection,
67160
67161
67162                 item: function(id) {
67163                     return this.collection.find(function(d) {
67164                         return d.id === id;
67165                     });
67166                 },
67167
67168                 index: function(id) {
67169                     return this.collection.findIndex(function(d) {
67170                         return d.id === id;
67171                     });
67172                 },
67173
67174                 matchGeometry: function(geometry) {
67175                     return presetCollection(this.collection.filter(function(d) {
67176                         return d.matchGeometry(geometry);
67177                     }));
67178                 },
67179
67180                 matchAnyGeometry: function(geometries) {
67181                     return presetCollection(this.collection.filter(function(d) {
67182                         return geometries.some(function(geometry) {
67183                             return d.matchGeometry(geometry);
67184                         });
67185                     }));
67186                 },
67187
67188                 fallback: function(geometry) {
67189                     var id = geometry;
67190                     if (id === 'vertex') id = 'point';
67191                     return this.item(id);
67192                 },
67193
67194                 search: function(value, geometry, countryCode) {
67195                     if (!value) return this;
67196
67197                     value = value.toLowerCase().trim();
67198
67199                     // match at name beginning or just after a space (e.g. "office" -> match "Law Office")
67200                     function leading(a) {
67201                         var index = a.indexOf(value);
67202                         return index === 0 || a[index - 1] === ' ';
67203                     }
67204
67205                     // match at name beginning only
67206                     function leadingStrict(a) {
67207                         var index = a.indexOf(value);
67208                         return index === 0;
67209                     }
67210
67211                     function sortNames(a, b) {
67212                         var aCompare = (a.suggestion ? a.originalName : a.name()).toLowerCase();
67213                         var bCompare = (b.suggestion ? b.originalName : b.name()).toLowerCase();
67214
67215                         // priority if search string matches preset name exactly - #4325
67216                         if (value === aCompare) return -1;
67217                         if (value === bCompare) return 1;
67218
67219                         // priority for higher matchScore
67220                         var i = b.originalScore - a.originalScore;
67221                         if (i !== 0) return i;
67222
67223                         // priority if search string appears earlier in preset name
67224                         i = aCompare.indexOf(value) - bCompare.indexOf(value);
67225                         if (i !== 0) return i;
67226
67227                         // priority for shorter preset names
67228                         return aCompare.length - bCompare.length;
67229                     }
67230
67231                     var pool = this.collection;
67232                     if (countryCode) {
67233                         pool = pool.filter(function(a) {
67234                             if (!a.countryCodes) return true;
67235                             return a.countryCodes.indexOf(countryCode) !== -1;
67236                         });
67237                     }
67238                     var searchable = pool.filter(function(a) {
67239                         return a.searchable !== false && a.suggestion !== true;
67240                     });
67241                     var suggestions = pool.filter(function(a) {
67242                         return a.suggestion === true;
67243                     });
67244
67245                     // matches value to preset.name
67246                     var leading_name = searchable
67247                         .filter(function(a) {
67248                             return leading(a.name().toLowerCase());
67249                         }).sort(sortNames);
67250
67251                     // matches value to preset.terms values
67252                     var leading_terms = searchable
67253                         .filter(function(a) {
67254                             return (a.terms() || []).some(leading);
67255                         });
67256
67257                     // matches value to preset.tags values
67258                     var leading_tag_values = searchable
67259                         .filter(function(a) {
67260                             return Object.values(a.tags || {})
67261                                 .filter(function(val) { return val !== '*'; })
67262                                 .some(leading);
67263                         });
67264
67265                     var leading_suggestions = suggestions
67266                         .filter(function(a) {
67267                             return leadingStrict(a.originalName.toLowerCase());
67268                         }).sort(sortNames);
67269
67270                     // finds close matches to value in preset.name
67271                     var similar_name = searchable
67272                         .map(function(a) {
67273                             return { preset: a, dist: utilEditDistance(value, a.name()) };
67274                         }).filter(function(a) {
67275                             return a.dist + Math.min(value.length - a.preset.name().length, 0) < 3;
67276                         }).sort(function(a, b) {
67277                             return a.dist - b.dist;
67278                         }).map(function(a) {
67279                             return a.preset;
67280                         });
67281
67282                     // finds close matches to value in preset.terms
67283                     var similar_terms = searchable
67284                         .filter(function(a) {
67285                             return (a.terms() || []).some(function(b) {
67286                                 return utilEditDistance(value, b) + Math.min(value.length - b.length, 0) < 3;
67287                             });
67288                         });
67289
67290                     var similar_suggestions = suggestions
67291                         .map(function(a) {
67292                             return { preset: a, dist: utilEditDistance(value, a.originalName.toLowerCase()) };
67293                         }).filter(function(a) {
67294                             return a.dist + Math.min(value.length - a.preset.originalName.length, 0) < 1;
67295                         }).sort(function(a, b) {
67296                             return a.dist - b.dist;
67297                         }).map(function(a) {
67298                             return a.preset;
67299                         });
67300
67301                     var results = leading_name.concat(
67302                         leading_suggestions,
67303                         leading_terms,
67304                         leading_tag_values,
67305                         similar_name,
67306                         similar_suggestions,
67307                         similar_terms
67308                     ).slice(0, maxSearchResults - 1);
67309
67310                     if (geometry) {
67311                         if (typeof geometry === 'string') {
67312                             results.push(presets.fallback(geometry));
67313                         } else {
67314                             geometry.forEach(function(geom) {
67315                                 results.push(presets.fallback(geom));
67316                             });
67317                         }
67318                     }
67319
67320                     return presetCollection(utilArrayUniq(results));
67321                 }
67322             };
67323
67324
67325             return presets;
67326         }
67327
67328         function presetCategory(id, category, all) {
67329             category = Object.assign({}, category);   // shallow copy
67330
67331             category.id = id;
67332
67333
67334             category.members = presetCollection(category.members.map(function(id) {
67335                 return all.item(id);
67336             }));
67337
67338
67339             category.geometry = category.members.collection.reduce(function(geometries, preset) {
67340                 for (var index in preset.geometry) {
67341                     var geometry = preset.geometry[index];
67342                     if (geometries.indexOf(geometry) === -1) {
67343                         geometries.push(geometry);
67344                     }
67345                 }
67346                 return geometries;
67347             }, []);
67348
67349
67350             category.matchGeometry = function(geometry) {
67351                 return category.geometry.indexOf(geometry) >= 0;
67352             };
67353
67354
67355             category.matchScore = function() {
67356                 return -1;
67357             };
67358
67359
67360             category.name = function() {
67361                 return t('presets.categories.' + id + '.name', {'default': id});
67362             };
67363
67364
67365             category.terms = function() {
67366                 return [];
67367             };
67368
67369
67370             return category;
67371         }
67372
67373         function presetField(id, field) {
67374             field = Object.assign({}, field);   // shallow copy
67375
67376             field.id = id;
67377
67378             // for use in classes, element ids, css selectors
67379             field.safeid = id.replace(/[^_a-zA-Z0-9\-]/g, '_');
67380
67381             field.matchGeometry = function(geometry) {
67382                 return !field.geometry || field.geometry === geometry;
67383             };
67384
67385
67386             field.t = function(scope, options) {
67387                 return t('presets.fields.' + id + '.' + scope, options);
67388             };
67389
67390
67391             field.label = function() {
67392                 return field.overrideLabel || field.t('label', {'default': id});
67393             };
67394
67395
67396             var placeholder = field.placeholder;
67397             field.placeholder = function() {
67398                 return field.t('placeholder', {'default': placeholder});
67399             };
67400
67401
67402             return field;
67403         }
67404
67405         function presetPreset(id, preset, fields, visible, rawPresets) {
67406             preset = Object.assign({}, preset);   // shallow copy
67407
67408             preset.id = id;
67409
67410             preset.parentPresetID = function() {
67411                 var endIndex = preset.id.lastIndexOf('/');
67412                 if (endIndex < 0) return null;
67413
67414                 return preset.id.substring(0, endIndex);
67415             };
67416
67417
67418             // For a preset without fields, use the fields of the parent preset.
67419             // Replace {preset} placeholders with the fields of the specified presets.
67420             function resolveFieldInheritance() {
67421
67422                 // Skip `fields` for the keys which define the preset.
67423                 // These are usually `typeCombo` fields like `shop=*`
67424                 function shouldInheritFieldWithID(fieldID) {
67425                     var f = fields[fieldID];
67426                     if (f.key) {
67427                         if (preset.tags[f.key] !== undefined &&
67428                             // inherit anyway if multiple values are allowed or just a checkbox
67429                             f.type !== 'multiCombo' && f.type !== 'semiCombo' && f.type !== 'check') {
67430                             return false;
67431                         }
67432                     }
67433                     return true;
67434                 }
67435
67436                 // returns an array of field IDs to inherit from the given presetID, if found
67437                 function inheritedFieldIDs(presetID, prop) {
67438                     if (!presetID) return null;
67439
67440                     var inheritPreset = rawPresets[presetID];
67441                     if (!inheritPreset) return null;
67442
67443                     var inheritFieldIDs = inheritPreset[prop] || [];
67444
67445                     if (prop === 'fields') {
67446                         inheritFieldIDs = inheritFieldIDs.filter(shouldInheritFieldWithID);
67447                     }
67448
67449                     return inheritFieldIDs;
67450                 }
67451
67452
67453                 ['fields', 'moreFields'].forEach(function(prop) {
67454                     var fieldIDs = [];
67455                     if (preset[prop] && preset[prop].length) {    // fields were defined
67456                         preset[prop].forEach(function(fieldID) {
67457                             var match = fieldID.match(/\{(.*)\}/);
67458                             if (match !== null) {        // presetID wrapped in braces {}
67459                                 var inheritIDs = inheritedFieldIDs(match[1], prop);
67460                                 if (inheritIDs !== null) {
67461                                     fieldIDs = fieldIDs.concat(inheritIDs);
67462                                 } else {
67463                                     /* eslint-disable no-console */
67464                                     console.log('Cannot resolve presetID ' + match[0] +
67465                                         ' found in ' + preset.id + ' ' + prop);
67466                                     /* eslint-enable no-console */
67467                                 }
67468                             } else {
67469                                 fieldIDs.push(fieldID);  // no braces - just a normal field
67470                             }
67471                         });
67472
67473                     } else {  // no fields defined, so use the parent's if possible
67474                         fieldIDs = inheritedFieldIDs(preset.parentPresetID(), prop);
67475                     }
67476                     // resolve duplicate fields
67477                     fieldIDs = utilArrayUniq(fieldIDs);
67478
67479                     // update this preset with the results
67480                     preset[prop] = fieldIDs;
67481
67482                     // update the raw object to allow for multiple levels of inheritance
67483                     rawPresets[preset.id][prop] = fieldIDs;
67484                 });
67485             }
67486
67487             if (rawPresets) {
67488                 resolveFieldInheritance();
67489             }
67490
67491             preset.fields = (preset.fields || []).map(getFields);
67492             preset.moreFields = (preset.moreFields || []).map(getFields);
67493             preset.geometry = (preset.geometry || []);
67494
67495             visible = visible || false;
67496
67497             function getFields(f) {
67498                 return fields[f];
67499             }
67500
67501
67502             preset.matchGeometry = function(geometry) {
67503                 return preset.geometry.indexOf(geometry) >= 0;
67504             };
67505
67506
67507             preset.originalScore = preset.matchScore || 1;
67508
67509
67510             preset.matchScore = function(entityTags) {
67511                 var tags = preset.tags;
67512                 var score = 0;
67513
67514                 for (var t in tags) {
67515                     if (entityTags[t] === tags[t]) {
67516                         score += preset.originalScore;
67517                     } else if (tags[t] === '*' && t in entityTags) {
67518                         score += preset.originalScore / 2;
67519                     } else {
67520                         return -1;
67521                     }
67522                 }
67523
67524                 return score;
67525             };
67526
67527             var _textCache = {};
67528
67529             preset.t = function(scope, options) {
67530                 var textID = 'presets.presets.' + id + '.' + scope;
67531
67532                 if (_textCache[textID]) return _textCache[textID];
67533
67534                 var text = t(textID, options);
67535                 _textCache[textID] = text;
67536                 return text;
67537             };
67538
67539
67540             preset.originalName = preset.name || '';
67541
67542
67543             preset.name = function() {
67544                 if (preset.suggestion) {
67545                     var path = id.split('/');
67546                     path.pop();  // remove brand name
67547                     // NOTE: insert an en-dash, not a hypen (to avoid conflict with fr - nl names in Brussels etc)
67548                     return preset.originalName + ' – ' + t('presets.presets.' + path.join('/') + '.name');
67549                 }
67550                 return preset.t('name', { 'default': preset.originalName });
67551             };
67552
67553
67554             preset.originalTerms = (preset.terms || []).join();
67555
67556
67557             preset.terms = function() {
67558                 return preset.t('terms', { 'default': preset.originalTerms }).toLowerCase().trim().split(/\s*,+\s*/);
67559             };
67560
67561
67562             preset.isFallback = function() {
67563                 var tagCount = Object.keys(preset.tags).length;
67564                 return tagCount === 0 || (tagCount === 1 && preset.tags.hasOwnProperty('area'));
67565             };
67566
67567             preset.visible = function(val) {
67568                 if (!arguments.length) return visible;
67569                 visible = val;
67570                 return visible;
67571             };
67572
67573
67574             var reference = preset.reference || {};
67575             preset.reference = function(geometry) {
67576                 // Lookup documentation on Wikidata...
67577                 var qid = preset.tags.wikidata || preset.tags['brand:wikidata'] || preset.tags['operator:wikidata'];
67578                 if (qid) {
67579                     return { qid: qid };
67580                 }
67581
67582                 // Lookup documentation on OSM Wikibase...
67583                 var key = reference.key || Object.keys(utilObjectOmit(preset.tags, 'name'))[0];
67584                 var value = reference.value || preset.tags[key];
67585
67586                 if (geometry === 'relation' && key === 'type') {
67587                     if (value in preset.tags) {
67588                         key = value;
67589                         value = preset.tags[key];
67590                     } else {
67591                         return { rtype: value };
67592                     }
67593                 }
67594
67595                 if (value === '*') {
67596                     return { key: key };
67597                 } else {
67598                     return { key: key, value: value };
67599                 }
67600             };
67601
67602
67603             preset.removeTags = preset.removeTags || preset.addTags || preset.tags || {};
67604             preset.unsetTags = function(tags, geometry) {
67605                 tags = utilObjectOmit(tags, Object.keys(preset.removeTags));
67606
67607                 for (var f in preset.fields) {
67608                     var field = preset.fields[f];
67609                     if (field.matchGeometry(geometry) && field.default === tags[field.key]) {
67610                         delete tags[field.key];
67611                     }
67612                 }
67613
67614                 delete tags.area;
67615                 return tags;
67616             };
67617
67618
67619             preset.addTags = preset.addTags || preset.tags || {};
67620             preset.setTags = function(tags, geometry, skipFieldDefaults) {
67621                 var addTags = preset.addTags;
67622                 var k;
67623
67624                 tags = Object.assign({}, tags);   // shallow copy
67625
67626                 for (k in addTags) {
67627                     if (addTags[k] === '*') {
67628                         tags[k] = 'yes';
67629                     } else {
67630                         tags[k] = addTags[k];
67631                     }
67632                 }
67633
67634                 // Add area=yes if necessary.
67635                 // This is necessary if the geometry is already an area (e.g. user drew an area) AND any of:
67636                 // 1. chosen preset could be either an area or a line (`barrier=city_wall`)
67637                 // 2. chosen preset doesn't have a key in osmAreaKeys (`railway=station`)
67638                 if (!addTags.hasOwnProperty('area')) {
67639                     delete tags.area;
67640                     if (geometry === 'area') {
67641                         var needsAreaTag = true;
67642                         if (preset.geometry.indexOf('line') === -1) {
67643                             for (k in addTags) {
67644                                 if (k in osmAreaKeys) {
67645                                     needsAreaTag = false;
67646                                     break;
67647                                 }
67648                             }
67649                         }
67650                         if (needsAreaTag) {
67651                             tags.area = 'yes';
67652                         }
67653                     }
67654                 }
67655                 if (geometry && !skipFieldDefaults) {
67656                     for (var f in preset.fields) {
67657                         var field = preset.fields[f];
67658                         if (field.matchGeometry(geometry) && field.key && !tags[field.key] && field.default) {
67659                             tags[field.key] = field.default;
67660                         }
67661                     }
67662                 }
67663
67664                 return tags;
67665             };
67666
67667
67668             return preset;
67669         }
67670
67671         function presetIndex(context) {
67672             // a presetCollection with methods for
67673             // loading new data and returning defaults
67674
67675             var dispatch$1 = dispatch('recentsChange', 'favoritePreset');
67676
67677             var all = presetCollection([]);
67678             var _defaults = { area: all, line: all, point: all, vertex: all, relation: all };
67679             var _fields = {};
67680             var _universal = [];
67681             var _favorites, _recents;
67682
67683             // Index of presets by (geometry, tag key).
67684             var _index = {
67685                 point: {},
67686                 vertex: {},
67687                 line: {},
67688                 area: {},
67689                 relation: {}
67690             };
67691
67692             all.match = function(entity, resolver) {
67693                 return resolver.transient(entity, 'presetMatch', function() {
67694                     var geometry = entity.geometry(resolver);
67695
67696                     // Treat entities on addr:interpolation lines as points, not vertices - #3241
67697                     if (geometry === 'vertex' && entity.isOnAddressLine(resolver)) {
67698                         geometry = 'point';
67699                     }
67700
67701                     return all.matchTags(entity.tags, geometry);
67702                 });
67703             };
67704
67705             all.matchTags = function(tags, geometry) {
67706
67707                 var address;
67708                 var geometryMatches = _index[geometry];
67709                 var best = -1;
67710                 var match;
67711
67712                 for (var k in tags) {
67713                     // If any part of an address is present,
67714                     // allow fallback to "Address" preset - #4353
67715                     if (/^addr:/.test(k) && geometryMatches['addr:*']) {
67716                         address = geometryMatches['addr:*'][0];
67717                     }
67718
67719                     var keyMatches = geometryMatches[k];
67720                     if (!keyMatches) continue;
67721
67722                     for (var i = 0; i < keyMatches.length; i++) {
67723                         var score = keyMatches[i].matchScore(tags);
67724                         if (score > best) {
67725                             best = score;
67726                             match = keyMatches[i];
67727                         }
67728                     }
67729
67730                 }
67731
67732                 if (address && (!match || match.isFallback())) {
67733                     match = address;
67734                 }
67735                 return match || all.fallback(geometry);
67736             };
67737
67738             all.allowsVertex = function(entity, resolver) {
67739                 if (entity.type !== 'node') return false;
67740                 if (Object.keys(entity.tags).length === 0) return true;
67741
67742                 return resolver.transient(entity, 'vertexMatch', function() {
67743                     // address lines allow vertices to act as standalone points
67744                     if (entity.isOnAddressLine(resolver)) return true;
67745
67746                     var geometries = osmNodeGeometriesForTags(entity.tags);
67747                     if (geometries.vertex) return true;
67748                     if (geometries.point) return false;
67749                     // allow vertices for unspecified points
67750                     return true;
67751                 });
67752             };
67753
67754
67755             // Because of the open nature of tagging, iD will never have a complete
67756             // list of tags used in OSM, so we want it to have logic like "assume
67757             // that a closed way with an amenity tag is an area, unless the amenity
67758             // is one of these specific types". This function computes a structure
67759             // that allows testing of such conditions, based on the presets designated
67760             // as as supporting (or not supporting) the area geometry.
67761             //
67762             // The returned object L is a whitelist/blacklist of tags. A closed way
67763             // with a tag (k, v) is considered to be an area if `k in L && !(v in L[k])`
67764             // (see `Way#isArea()`). In other words, the keys of L form the whitelist,
67765             // and the subkeys form the blacklist.
67766             all.areaKeys = function() {
67767                 var areaKeys = {};
67768                 var ignore = ['barrier', 'highway', 'footway', 'railway', 'type'];  // probably a line..
67769
67770                 // ignore name-suggestion-index and deprecated presets
67771                 var presets = all.collection.filter(function(p) {
67772                     return !p.suggestion && !p.replacement;
67773                 });
67774
67775                 // whitelist
67776                 presets.forEach(function(d) {
67777                     for (var key in d.tags) break;
67778                     if (!key) return;
67779                     if (ignore.indexOf(key) !== -1) return;
67780
67781                     if (d.geometry.indexOf('area') !== -1) {    // probably an area..
67782                         areaKeys[key] = areaKeys[key] || {};
67783                     }
67784                 });
67785
67786                 // blacklist
67787                 presets.forEach(function(d) {
67788                     for (var key in d.tags) break;
67789                     if (!key) return;
67790                     if (ignore.indexOf(key) !== -1) return;
67791
67792                     var value = d.tags[key];
67793                     if (key in areaKeys &&                      // probably an area...
67794                         d.geometry.indexOf('line') !== -1 &&    // but sometimes a line
67795                         value !== '*') {
67796                         areaKeys[key][value] = true;
67797                     }
67798                 });
67799
67800                 return areaKeys;
67801             };
67802
67803             all.pointTags = function() {
67804                 return all.collection.reduce(function(pointTags, d) {
67805                     // ignore name-suggestion-index, deprecated, and generic presets
67806                     if (d.suggestion || d.replacement || d.searchable === false) return pointTags;
67807
67808                     // only care about the primary tag
67809                     for (var key in d.tags) break;
67810                     if (!key) return pointTags;
67811
67812                     // if this can be a point
67813                     if (d.geometry.indexOf('point') !== -1) {
67814                         pointTags[key] = pointTags[key] || {};
67815                         pointTags[key][d.tags[key]] = true;
67816                     }
67817                     return pointTags;
67818                 }, {});
67819             };
67820
67821             all.vertexTags = function() {
67822                 return all.collection.reduce(function(vertexTags, d) {
67823                     // ignore name-suggestion-index, deprecated, and generic presets
67824                     if (d.suggestion || d.replacement || d.searchable === false) return vertexTags;
67825
67826                     // only care about the primary tag
67827                     for (var key in d.tags) break;
67828                     if (!key) return vertexTags;
67829
67830                     // if this can be a vertex
67831                     if (d.geometry.indexOf('vertex') !== -1) {
67832                         vertexTags[key] = vertexTags[key] || {};
67833                         vertexTags[key][d.tags[key]] = true;
67834                     }
67835                     return vertexTags;
67836                 }, {});
67837             };
67838
67839             all.build = function(d, visible) {
67840                 if (d.fields) {
67841                     Object.keys(d.fields).forEach(function(id) {
67842                         var f = d.fields[id];
67843                         _fields[id] = presetField(id, f);
67844                         if (f.universal) {
67845                             _universal.push(_fields[id]);
67846                         }
67847                     });
67848                 }
67849
67850                 if (d.presets) {
67851                     var rawPresets = d.presets;
67852                     Object.keys(d.presets).forEach(function(id) {
67853                         var p = d.presets[id];
67854                         var existing = all.index(id);
67855                         var isVisible = typeof visible === 'function' ? visible(id, p) : visible;
67856                         if (existing !== -1) {
67857                             all.collection[existing] = presetPreset(id, p, _fields, isVisible, rawPresets);
67858                         } else {
67859                             all.collection.push(presetPreset(id, p, _fields, isVisible, rawPresets));
67860                         }
67861                     });
67862                 }
67863
67864                 if (d.categories) {
67865                     Object.keys(d.categories).forEach(function(id) {
67866                         var c = d.categories[id];
67867                         var existing = all.index(id);
67868                         if (existing !== -1) {
67869                             all.collection[existing] = presetCategory(id, c, all);
67870                         } else {
67871                             all.collection.push(presetCategory(id, c, all));
67872                         }
67873                     });
67874                 }
67875
67876                 if (d.defaults) {
67877                     var getItem = (all.item).bind(all);
67878                     _defaults = {
67879                         area: presetCollection(d.defaults.area.map(getItem)),
67880                         line: presetCollection(d.defaults.line.map(getItem)),
67881                         point: presetCollection(d.defaults.point.map(getItem)),
67882                         vertex: presetCollection(d.defaults.vertex.map(getItem)),
67883                         relation: presetCollection(d.defaults.relation.map(getItem))
67884                     };
67885                 }
67886
67887                 for (var i = 0; i < all.collection.length; i++) {
67888                     var preset = all.collection[i];
67889                     var geometry = preset.geometry;
67890
67891                     for (var j = 0; j < geometry.length; j++) {
67892                         var g = _index[geometry[j]];
67893                         for (var k in preset.tags) {
67894                             (g[k] = g[k] || []).push(preset);
67895                         }
67896                     }
67897                 }
67898                 return all;
67899             };
67900
67901             all.init = function(shouldShow) {
67902                 all.collection = [];
67903                 _favorites = null;
67904                 _recents = null;
67905                 _fields = {};
67906                 _universal = [];
67907                 _index = { point: {}, vertex: {}, line: {}, area: {}, relation: {} };
67908
67909                 return all.build(data.presets, shouldShow || true);
67910             };
67911
67912
67913             all.reset = function() {
67914                 all.collection = [];
67915                 _defaults = { area: all, line: all, point: all, vertex: all, relation: all };
67916                 _fields = {};
67917                 _universal = [];
67918                 _favorites = null;
67919                 _recents = null;
67920
67921                 // Index of presets by (geometry, tag key).
67922                 _index = {
67923                     point: {},
67924                     vertex: {},
67925                     line: {},
67926                     area: {},
67927                     relation: {}
67928                 };
67929
67930                 return all;
67931             };
67932
67933             all.fromExternal = function(external, done) {
67934                 all.reset();
67935                 d3_json(external)
67936                     .then(function(externalPresets) {
67937                         all.build(data.presets, false);    // make default presets hidden to begin
67938                         all.build(externalPresets, true);  // make the external visible
67939                     })
67940                     .catch(function() {
67941                         all.init();
67942                     })
67943                     .finally(function() {
67944                         done(all);
67945                     });
67946             };
67947
67948             all.field = function(id) {
67949                 return _fields[id];
67950             };
67951
67952             all.universal = function() {
67953                 return _universal;
67954             };
67955
67956             all.defaults = function(geometry, n) {
67957                 var rec = [];
67958                 if (!context.inIntro()) {
67959                     rec = all.recent().matchGeometry(geometry).collection.slice(0, 4);
67960                 }
67961                 var def = utilArrayUniq(rec.concat(_defaults[geometry].collection)).slice(0, n - 1);
67962                 return presetCollection(utilArrayUniq(rec.concat(def).concat(all.fallback(geometry))));
67963             };
67964
67965             all.recent = function() {
67966                 return presetCollection(utilArrayUniq(all.getRecents().map(function(d) {
67967                     return d.preset;
67968                 })));
67969             };
67970
67971             function RibbonItem(preset, geometry, source) {
67972                 var item = {};
67973                 item.preset = preset;
67974                 item.geometry = geometry;
67975                 item.source = source;
67976
67977                 item.isFavorite = function() {
67978                     return item.source === 'favorite';
67979                 };
67980                 item.isRecent = function() {
67981                     return item.source === 'recent';
67982                 };
67983                 item.matches = function(preset, geometry) {
67984                     return item.preset.id === preset.id && item.geometry === geometry;
67985                 };
67986                 item.minified = function() {
67987                     return {
67988                         pID: item.preset.id,
67989                         geom: item.geometry
67990                     };
67991                 };
67992                 return item;
67993             }
67994
67995             function ribbonItemForMinified(d, source) {
67996                 if (d && d.pID && d.geom) {
67997                     var preset = all.item(d.pID);
67998                     if (!preset) return null;
67999
68000                     var geom = d.geom;
68001                     // treat point and vertex features as one geometry
68002                     if (geom === 'vertex') geom = 'point';
68003
68004                     // iD's presets could have changed since this was saved,
68005                     // so make sure it's still valid.
68006                     if (preset.matchGeometry(geom) || (geom === 'point' && preset.matchGeometry('vertex'))) {
68007                         return RibbonItem(preset, geom, source);
68008                     }
68009                 }
68010                 return null;
68011             }
68012
68013             function setFavorites(items) {
68014                 _favorites = items;
68015                 var minifiedItems = items.map(function(d) { return d.minified(); });
68016                 context.storage('preset_favorites', JSON.stringify(minifiedItems));
68017
68018                 // call update
68019                 dispatch$1.call('favoritePreset');
68020             }
68021
68022             all.getFavorites = function() {
68023                 if (!_favorites) {
68024                     // fetch from local storage
68025                     _favorites = (JSON.parse(context.storage('preset_favorites')) || [
68026                             // use the generic presets as the default favorites
68027                             { pID: 'point', geom: 'point'},
68028                             { pID: 'line', geom: 'line'},
68029                             { pID: 'area', geom: 'area'}
68030                         ]).reduce(function(output, d) {
68031                             var item = ribbonItemForMinified(d, 'favorite');
68032                             if (item) output.push(item);
68033                             return output;
68034                         }, []);
68035                 }
68036                 return _favorites;
68037             };
68038
68039             function setRecents(items) {
68040                 _recents = items;
68041                 var minifiedItems = items.map(function(d) { return d.minified(); });
68042                 context.storage('preset_recents', JSON.stringify(minifiedItems));
68043
68044                 dispatch$1.call('recentsChange');
68045             }
68046
68047             all.getRecents = function() {
68048                 if (!_recents) {
68049                     // fetch from local storage
68050                     _recents = (JSON.parse(context.storage('preset_recents')) || [])
68051                         .reduce(function(output, d) {
68052                             var item = ribbonItemForMinified(d, 'recent');
68053                             if (item) output.push(item);
68054                             return output;
68055                         }, []);
68056                 }
68057                 return _recents;
68058             };
68059
68060             all.toggleFavorite = function(preset, geometry) {
68061                 geometry = all.fallback(geometry).id;
68062                 var favs = all.getFavorites();
68063                 var favorite = all.favoriteMatching(preset, geometry);
68064                 if (favorite) {
68065                     favs.splice(favs.indexOf(favorite), 1);
68066                 } else {
68067                     // only allow 10 favorites
68068                     if (favs.length === 10) {
68069                         // remove the last favorite (last in, first out)
68070                         favs.pop();
68071                     }
68072                     // append array
68073                     favs.push(RibbonItem(preset, geometry, 'favorite'));
68074                 }
68075                 setFavorites(favs);
68076             };
68077
68078             all.removeFavorite = function(preset, geometry) {
68079                 geometry = all.fallback(geometry).id;
68080                 var item = all.favoriteMatching(preset, geometry);
68081                 if (item) {
68082                     var items = all.getFavorites();
68083                     items.splice(items.indexOf(item), 1);
68084                     setFavorites(items);
68085                 }
68086             };
68087
68088             all.removeRecent = function(preset, geometry) {
68089                 var item = all.recentMatching(preset, geometry);
68090                 if (item) {
68091                     var items = all.getRecents();
68092                     items.splice(items.indexOf(item), 1);
68093                     setRecents(items);
68094                 }
68095             };
68096
68097             all.favoriteMatching = function(preset, geometry) {
68098                 geometry = all.fallback(geometry).id;
68099                 var favs = all.getFavorites();
68100                 for (var index in favs) {
68101                     if (favs[index].matches(preset, geometry)) {
68102                         return favs[index];
68103                     }
68104                 }
68105                 return null;
68106             };
68107             all.recentMatching = function(preset, geometry) {
68108                 geometry = all.fallback(geometry).id;
68109                 var items = all.getRecents();
68110                 for (var index in items) {
68111                     if (items[index].matches(preset, geometry)) {
68112                         return items[index];
68113                     }
68114                 }
68115                 return null;
68116             };
68117
68118             all.moveItem = function(items, fromIndex, toIndex) {
68119                 if (fromIndex === toIndex ||
68120                     fromIndex < 0 || toIndex < 0 ||
68121                     fromIndex >= items.length || toIndex >= items.length) return null;
68122                 items.splice(toIndex, 0, items.splice(fromIndex, 1)[0]);
68123                 return items;
68124             };
68125
68126             all.moveFavorite = function(fromIndex, toIndex) {
68127                 var items = all.moveItem(all.getFavorites(), fromIndex, toIndex);
68128                 if (items) setFavorites(items);
68129             };
68130
68131             all.moveRecent = function(item, beforeItem) {
68132                 var recents = all.getRecents();
68133                 var fromIndex = recents.indexOf(item);
68134                 var toIndex = recents.indexOf(beforeItem);
68135                 var items = all.moveItem(recents, fromIndex, toIndex);
68136                 if (items) setRecents(items);
68137             };
68138
68139             all.setMostRecent = function(preset, geometry) {
68140                 if (context.inIntro()) return;
68141                 if (preset.searchable === false) return;
68142
68143                 geometry = all.fallback(geometry).id;
68144
68145                 var items = all.getRecents();
68146                 var item = all.recentMatching(preset, geometry);
68147                 if (item) {
68148                     items.splice(items.indexOf(item), 1);
68149                 } else {
68150                     item = RibbonItem(preset, geometry, 'recent');
68151                 }
68152                 // allow 30 recents
68153                 if (items.length === 30) {
68154                     // remove the last favorite (first in, first out)
68155                     items.pop();
68156                 }
68157                 // prepend array
68158                 items.unshift(item);
68159                 setRecents(items);
68160             };
68161
68162             return utilRebind(all, dispatch$1, 'on');
68163         }
68164
68165         function localeDateString(s) {
68166             if (!s) return null;
68167             var detected = utilDetect();
68168             var options = { day: 'numeric', month: 'short', year: 'numeric' };
68169             var d = new Date(s);
68170             if (isNaN(d.getTime())) return null;
68171             return d.toLocaleDateString(detected.locale, options);
68172         }
68173
68174         function vintageRange(vintage) {
68175             var s;
68176             if (vintage.start || vintage.end) {
68177                 s = (vintage.start || '?');
68178                 if (vintage.start !== vintage.end) {
68179                     s += ' - ' + (vintage.end || '?');
68180                 }
68181             }
68182             return s;
68183         }
68184
68185
68186         function rendererBackgroundSource(data) {
68187             var source = Object.assign({}, data);   // shallow copy
68188             var offset = [0, 0];
68189             var name = source.name;
68190             var description = source.description;
68191             var best = !!source.best;
68192             var template = source.template;
68193
68194             source.tileSize = data.tileSize || 256;
68195             source.zoomExtent = data.zoomExtent || [0, 22];
68196             source.overzoom = data.overzoom !== false;
68197
68198             source.offset = function(_) {
68199                 if (!arguments.length) return offset;
68200                 offset = _;
68201                 return source;
68202             };
68203
68204
68205             source.nudge = function(val, zoomlevel) {
68206                 offset[0] += val[0] / Math.pow(2, zoomlevel);
68207                 offset[1] += val[1] / Math.pow(2, zoomlevel);
68208                 return source;
68209             };
68210
68211
68212             source.name = function() {
68213                 var id_safe = source.id.replace(/\./g, '<TX_DOT>');
68214                 return t('imagery.' + id_safe + '.name', { default: name });
68215             };
68216
68217
68218             source.description = function() {
68219                 var id_safe = source.id.replace(/\./g, '<TX_DOT>');
68220                 return t('imagery.' + id_safe + '.description', { default: description });
68221             };
68222
68223
68224             source.best = function() {
68225                 return best;
68226             };
68227
68228
68229             source.area = function() {
68230                 if (!data.polygon) return Number.MAX_VALUE;  // worldwide
68231                 var area = d3_geoArea({ type: 'MultiPolygon', coordinates: [ data.polygon ] });
68232                 return isNaN(area) ? 0 : area;
68233             };
68234
68235
68236             source.imageryUsed = function() {
68237                 return name || source.id;
68238             };
68239
68240
68241             source.template = function(_) {
68242                 if (!arguments.length) return template;
68243                 if (source.id === 'custom') template = _;
68244                 return source;
68245             };
68246
68247
68248             source.url = function(coord) {
68249                 if (this.type === 'wms') {
68250                     var tileToProjectedCoords = (function(x, y, z) {
68251                         //polyfill for IE11, PhantomJS
68252                         var sinh = Math.sinh || function(x) {
68253                             var y = Math.exp(x);
68254                             return (y - 1 / y) / 2;
68255                         };
68256
68257                         var zoomSize = Math.pow(2, z);
68258                         var lon = x / zoomSize * Math.PI * 2 - Math.PI;
68259                         var lat = Math.atan(sinh(Math.PI * (1 - 2 * y / zoomSize)));
68260
68261                         switch (this.projection) {
68262                             case 'EPSG:4326':
68263                                 return {
68264                                     x: lon * 180 / Math.PI,
68265                                     y: lat * 180 / Math.PI
68266                                 };
68267                             default: // EPSG:3857 and synonyms
68268                                 var mercCoords = mercatorRaw(lon, lat);
68269                                 return {
68270                                     x: 20037508.34 / Math.PI * mercCoords[0],
68271                                     y: 20037508.34 / Math.PI * mercCoords[1]
68272                                 };
68273                         }
68274                     }).bind(this);
68275
68276                     var tileSize = this.tileSize;
68277                     var projection = this.projection;
68278                     var minXmaxY = tileToProjectedCoords(coord[0], coord[1], coord[2]);
68279                     var maxXminY = tileToProjectedCoords(coord[0]+1, coord[1]+1, coord[2]);
68280                     return template.replace(/\{(\w+)\}/g, function (token, key) {
68281                       switch (key) {
68282                         case 'width':
68283                         case 'height':
68284                           return tileSize;
68285                         case 'proj':
68286                           return projection;
68287                         case 'wkid':
68288                           return projection.replace(/^EPSG:/, '');
68289                         case 'bbox':
68290                           return minXmaxY.x + ',' + maxXminY.y + ',' + maxXminY.x + ',' + minXmaxY.y;
68291                         case 'w':
68292                           return minXmaxY.x;
68293                         case 's':
68294                           return maxXminY.y;
68295                         case 'n':
68296                           return maxXminY.x;
68297                         case 'e':
68298                           return minXmaxY.y;
68299                         default:
68300                           return token;
68301                       }
68302                     });
68303                 }
68304                 return template
68305                     .replace('{x}', coord[0])
68306                     .replace('{y}', coord[1])
68307                     // TMS-flipped y coordinate
68308                     .replace(/\{[t-]y\}/, Math.pow(2, coord[2]) - coord[1] - 1)
68309                     .replace(/\{z(oom)?\}/, coord[2])
68310                     .replace(/\{switch:([^}]+)\}/, function(s, r) {
68311                         var subdomains = r.split(',');
68312                         return subdomains[(coord[0] + coord[1]) % subdomains.length];
68313                     })
68314                     .replace('{u}', function() {
68315                         var u = '';
68316                         for (var zoom = coord[2]; zoom > 0; zoom--) {
68317                             var b = 0;
68318                             var mask = 1 << (zoom - 1);
68319                             if ((coord[0] & mask) !== 0) b++;
68320                             if ((coord[1] & mask) !== 0) b += 2;
68321                             u += b.toString();
68322                         }
68323                         return u;
68324                     });
68325             };
68326
68327
68328             source.validZoom = function(z) {
68329                 return source.zoomExtent[0] <= z &&
68330                     (source.overzoom || source.zoomExtent[1] > z);
68331             };
68332
68333
68334             source.isLocatorOverlay = function() {
68335                 return source.id === 'mapbox_locator_overlay';
68336             };
68337
68338
68339             /* hides a source from the list, but leaves it available for use */
68340             source.isHidden = function() {
68341                 return source.id === 'DigitalGlobe-Premium-vintage' ||
68342                     source.id === 'DigitalGlobe-Standard-vintage';
68343             };
68344
68345
68346             source.copyrightNotices = function() {};
68347
68348
68349             source.getMetadata = function(center, tileCoord, callback) {
68350                 var vintage = {
68351                     start: localeDateString(source.startDate),
68352                     end: localeDateString(source.endDate)
68353                 };
68354                 vintage.range = vintageRange(vintage);
68355
68356                 var metadata = { vintage: vintage };
68357                 callback(null, metadata);
68358             };
68359
68360
68361             return source;
68362         }
68363
68364
68365         rendererBackgroundSource.Bing = function(data, dispatch) {
68366             // http://msdn.microsoft.com/en-us/library/ff701716.aspx
68367             // http://msdn.microsoft.com/en-us/library/ff701701.aspx
68368
68369             data.template = 'https://ecn.t{switch:0,1,2,3}.tiles.virtualearth.net/tiles/a{u}.jpeg?g=587&mkt=en-gb&n=z';
68370
68371             var bing = rendererBackgroundSource(data);
68372             // var key = 'Arzdiw4nlOJzRwOz__qailc8NiR31Tt51dN2D7cm57NrnceZnCpgOkmJhNpGoppU'; // P2, JOSM, etc
68373             var key = 'Ak5oTE46TUbjRp08OFVcGpkARErDobfpuyNKa-W2mQ8wbt1K1KL8p1bIRwWwcF-Q';    // iD
68374
68375
68376             var url = 'https://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial?include=ImageryProviders&key=' + key;
68377             var cache = {};
68378             var inflight = {};
68379             var providers = [];
68380
68381             d3_json(url)
68382                 .then(function(json) {
68383                     providers = json.resourceSets[0].resources[0].imageryProviders.map(function(provider) {
68384                         return {
68385                             attribution: provider.attribution,
68386                             areas: provider.coverageAreas.map(function(area) {
68387                                 return {
68388                                     zoom: [area.zoomMin, area.zoomMax],
68389                                     extent: geoExtent([area.bbox[1], area.bbox[0]], [area.bbox[3], area.bbox[2]])
68390                                 };
68391                             })
68392                         };
68393                     });
68394                     dispatch.call('change');
68395                 })
68396                 .catch(function() {
68397                     /* ignore */
68398                 });
68399
68400
68401             bing.copyrightNotices = function(zoom, extent) {
68402                 zoom = Math.min(zoom, 21);
68403                 return providers.filter(function(provider) {
68404                     return provider.areas.some(function(area) {
68405                         return extent.intersects(area.extent) &&
68406                             area.zoom[0] <= zoom &&
68407                             area.zoom[1] >= zoom;
68408                     });
68409                 }).map(function(provider) {
68410                     return provider.attribution;
68411                 }).join(', ');
68412             };
68413
68414
68415             bing.getMetadata = function(center, tileCoord, callback) {
68416                 var tileID = tileCoord.slice(0, 3).join('/');
68417                 var zoom = Math.min(tileCoord[2], 21);
68418                 var centerPoint = center[1] + ',' + center[0];  // lat,lng
68419                 var url = 'https://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial/' + centerPoint +
68420                         '?zl=' + zoom + '&key=' + key;
68421
68422                 if (inflight[tileID]) return;
68423
68424                 if (!cache[tileID]) {
68425                     cache[tileID] = {};
68426                 }
68427                 if (cache[tileID] && cache[tileID].metadata) {
68428                     return callback(null, cache[tileID].metadata);
68429                 }
68430
68431                 inflight[tileID] = true;
68432                 d3_json(url)
68433                     .then(function(result) {
68434                         delete inflight[tileID];
68435                         if (!result) {
68436                             throw new Error('Unknown Error');
68437                         }
68438                         var vintage = {
68439                             start: localeDateString(result.resourceSets[0].resources[0].vintageStart),
68440                             end: localeDateString(result.resourceSets[0].resources[0].vintageEnd)
68441                         };
68442                         vintage.range = vintageRange(vintage);
68443
68444                         var metadata = { vintage: vintage };
68445                         cache[tileID].metadata = metadata;
68446                         if (callback) callback(null, metadata);
68447                     })
68448                     .catch(function(err) {
68449                         delete inflight[tileID];
68450                         if (callback) callback(err.message);
68451                     });
68452             };
68453
68454
68455             bing.terms_url = 'https://blog.openstreetmap.org/2010/11/30/microsoft-imagery-details';
68456
68457
68458             return bing;
68459         };
68460
68461
68462
68463         rendererBackgroundSource.Esri = function(data) {
68464             // in addition to using the tilemap at zoom level 20, overzoom real tiles - #4327 (deprecated technique, but it works)
68465             if (data.template.match(/blankTile/) === null) {
68466                 data.template = data.template + '?blankTile=false';
68467             }
68468
68469             var esri = rendererBackgroundSource(data);
68470             var cache = {};
68471             var inflight = {};
68472             var _prevCenter;
68473
68474             // use a tilemap service to set maximum zoom for esri tiles dynamically
68475             // https://developers.arcgis.com/documentation/tiled-elevation-service/
68476             esri.fetchTilemap = function(center) {
68477                 // skip if we have already fetched a tilemap within 5km
68478                 if (_prevCenter && geoSphericalDistance(center, _prevCenter) < 5000) return;
68479                 _prevCenter = center;
68480
68481                 // tiles are available globally to zoom level 19, afterward they may or may not be present
68482                 var z = 20;
68483
68484                 // first generate a random url using the template
68485                 var dummyUrl = esri.url([1,2,3]);
68486
68487                 // calculate url z/y/x from the lat/long of the center of the map
68488                 var x = (Math.floor((center[0] + 180) / 360 * Math.pow(2, z)));
68489                 var y = (Math.floor((1 - Math.log(Math.tan(center[1] * Math.PI / 180) + 1 / Math.cos(center[1] * Math.PI / 180)) / Math.PI) / 2 * Math.pow(2, z)));
68490
68491                 // fetch an 8x8 grid to leverage cache
68492                 var tilemapUrl = dummyUrl.replace(/tile\/[0-9]+\/[0-9]+\/[0-9]+\?blankTile=false/, 'tilemap') + '/' + z + '/' + y + '/' + x + '/8/8';
68493
68494                 // make the request and introspect the response from the tilemap server
68495                 d3_json(tilemapUrl)
68496                     .then(function(tilemap) {
68497                         if (!tilemap) {
68498                             throw new Error('Unknown Error');
68499                         }
68500                         var hasTiles = true;
68501                         for (var i = 0; i < tilemap.data.length; i++) {
68502                             // 0 means an individual tile in the grid doesn't exist
68503                             if (!tilemap.data[i]) {
68504                                 hasTiles = false;
68505                                 break;
68506                             }
68507                         }
68508
68509                         // if any tiles are missing at level 20 we restrict maxZoom to 19
68510                         esri.zoomExtent[1] = (hasTiles ? 22 : 19);
68511                     })
68512                     .catch(function() {
68513                         /* ignore */
68514                     });
68515             };
68516
68517
68518             esri.getMetadata = function(center, tileCoord, callback) {
68519                 var tileID = tileCoord.slice(0, 3).join('/');
68520                 var zoom = Math.min(tileCoord[2], esri.zoomExtent[1]);
68521                 var centerPoint = center[0] + ',' + center[1];  // long, lat (as it should be)
68522                 var unknown = t('info_panels.background.unknown');
68523                 var metadataLayer;
68524                 var vintage = {};
68525                 var metadata = {};
68526
68527                 if (inflight[tileID]) return;
68528
68529                 switch (true) {
68530                     case (zoom >= 20 && esri.id === 'EsriWorldImageryClarity'):
68531                         metadataLayer = 4;
68532                         break;
68533                     case zoom >= 19:
68534                         metadataLayer = 3;
68535                         break;
68536                     case zoom >= 17:
68537                         metadataLayer = 2;
68538                         break;
68539                     case zoom >= 13:
68540                         metadataLayer = 0;
68541                         break;
68542                     default:
68543                         metadataLayer = 99;
68544                 }
68545
68546                 var url;
68547                 // build up query using the layer appropriate to the current zoom
68548                 if (esri.id === 'EsriWorldImagery') {
68549                     url = 'https://services.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/';
68550                 } else if (esri.id === 'EsriWorldImageryClarity') {
68551                     url = 'https://serviceslab.arcgisonline.com/arcgis/rest/services/Clarity_World_Imagery/MapServer/';
68552                 }
68553
68554                 url += metadataLayer + '/query?returnGeometry=false&geometry=' + centerPoint + '&inSR=4326&geometryType=esriGeometryPoint&outFields=*&f=json';
68555
68556                 if (!cache[tileID]) {
68557                     cache[tileID] = {};
68558                 }
68559                 if (cache[tileID] && cache[tileID].metadata) {
68560                     return callback(null, cache[tileID].metadata);
68561                 }
68562
68563                 // accurate metadata is only available >= 13
68564                 if (metadataLayer === 99) {
68565                     vintage = {
68566                         start: null,
68567                         end: null,
68568                         range: null
68569                     };
68570                     metadata = {
68571                         vintage: null,
68572                         source: unknown,
68573                         description: unknown,
68574                         resolution: unknown,
68575                         accuracy: unknown
68576                     };
68577
68578                     callback(null, metadata);
68579
68580                 } else {
68581                     inflight[tileID] = true;
68582                     d3_json(url)
68583                         .then(function(result) {
68584                             delete inflight[tileID];
68585                             if (!result) {
68586                                 throw new Error('Unknown Error');
68587                             } else if (result.features && result.features.length < 1) {
68588                                 throw new Error('No Results');
68589                             } else if (result.error && result.error.message) {
68590                                 throw new Error(result.error.message);
68591                             }
68592
68593                             // pass through the discrete capture date from metadata
68594                             var captureDate = localeDateString(result.features[0].attributes.SRC_DATE2);
68595                             vintage = {
68596                                 start: captureDate,
68597                                 end: captureDate,
68598                                 range: captureDate
68599                             };
68600                             metadata = {
68601                                 vintage: vintage,
68602                                 source: clean(result.features[0].attributes.NICE_NAME),
68603                                 description: clean(result.features[0].attributes.NICE_DESC),
68604                                 resolution: clean(result.features[0].attributes.SRC_RES),
68605                                 accuracy: clean(result.features[0].attributes.SRC_ACC)
68606                             };
68607
68608                             // append units - meters
68609                             if (isFinite(metadata.resolution)) {
68610                                 metadata.resolution += ' m';
68611                             }
68612                             if (isFinite(metadata.accuracy)) {
68613                                 metadata.accuracy += ' m';
68614                             }
68615
68616                             cache[tileID].metadata = metadata;
68617                             if (callback) callback(null, metadata);
68618                         })
68619                         .catch(function(err) {
68620                             delete inflight[tileID];
68621                             if (callback) callback(err.message);
68622                         });
68623                 }
68624
68625
68626                 function clean(val) {
68627                     return String(val).trim() || unknown;
68628                 }
68629             };
68630
68631             return esri;
68632         };
68633
68634
68635         rendererBackgroundSource.None = function() {
68636             var source = rendererBackgroundSource({ id: 'none', template: '' });
68637
68638
68639             source.name = function() {
68640                 return t('background.none');
68641             };
68642
68643
68644             source.imageryUsed = function() {
68645                 return null;
68646             };
68647
68648
68649             source.area = function() {
68650                 return -1;  // sources in background pane are sorted by area
68651             };
68652
68653
68654             return source;
68655         };
68656
68657
68658         rendererBackgroundSource.Custom = function(template) {
68659             var source = rendererBackgroundSource({ id: 'custom', template: template });
68660
68661
68662             source.name = function() {
68663                 return t('background.custom');
68664             };
68665
68666
68667             source.imageryUsed = function() {
68668                 return 'Custom (' + source.template() + ')';
68669             };
68670
68671
68672             source.area = function() {
68673                 return -2;  // sources in background pane are sorted by area
68674             };
68675
68676
68677             return source;
68678         };
68679
68680         function rendererTileLayer(context) {
68681             var transformProp = utilPrefixCSSProperty('Transform');
68682             var tiler = utilTiler();
68683
68684             var _tileSize = 256;
68685             var _projection;
68686             var _cache = {};
68687             var _tileOrigin;
68688             var _zoom;
68689             var _source;
68690
68691
68692             function tileSizeAtZoom(d, z) {
68693                 var EPSILON = 0.002;    // close seams
68694                 return ((_tileSize * Math.pow(2, z - d[2])) / _tileSize) + EPSILON;
68695             }
68696
68697
68698             function atZoom(t, distance) {
68699                 var power = Math.pow(2, distance);
68700                 return [
68701                     Math.floor(t[0] * power),
68702                     Math.floor(t[1] * power),
68703                     t[2] + distance
68704                 ];
68705             }
68706
68707
68708             function lookUp(d) {
68709                 for (var up = -1; up > -d[2]; up--) {
68710                     var tile = atZoom(d, up);
68711                     if (_cache[_source.url(tile)] !== false) {
68712                         return tile;
68713                     }
68714                 }
68715             }
68716
68717
68718             function uniqueBy(a, n) {
68719                 var o = [];
68720                 var seen = {};
68721                 for (var i = 0; i < a.length; i++) {
68722                     if (seen[a[i][n]] === undefined) {
68723                         o.push(a[i]);
68724                         seen[a[i][n]] = true;
68725                     }
68726                 }
68727                 return o;
68728             }
68729
68730
68731             function addSource(d) {
68732                 d.push(_source.url(d));
68733                 return d;
68734             }
68735
68736
68737             // Update tiles based on current state of `projection`.
68738             function background(selection) {
68739                 _zoom = geoScaleToZoom(_projection.scale(), _tileSize);
68740
68741                 var pixelOffset;
68742                 if (_source) {
68743                     pixelOffset = [
68744                         _source.offset()[0] * Math.pow(2, _zoom),
68745                         _source.offset()[1] * Math.pow(2, _zoom)
68746                     ];
68747                 } else {
68748                     pixelOffset = [0, 0];
68749                 }
68750
68751                 var translate = [
68752                     _projection.translate()[0] + pixelOffset[0],
68753                     _projection.translate()[1] + pixelOffset[1]
68754                 ];
68755
68756                 tiler
68757                     .scale(_projection.scale() * 2 * Math.PI)
68758                     .translate(translate);
68759
68760                 _tileOrigin = [
68761                     _projection.scale() * Math.PI - translate[0],
68762                     _projection.scale() * Math.PI - translate[1]
68763                 ];
68764
68765                 render(selection);
68766             }
68767
68768
68769             // Derive the tiles onscreen, remove those offscreen and position them.
68770             // Important that this part not depend on `_projection` because it's
68771             // rentered when tiles load/error (see #644).
68772             function render(selection) {
68773                 if (!_source) return;
68774                 var requests = [];
68775                 var showDebug = context.getDebug('tile') && !_source.overlay;
68776
68777                 if (_source.validZoom(_zoom)) {
68778                     tiler.skipNullIsland(!!_source.overlay);
68779
68780                     tiler().forEach(function(d) {
68781                         addSource(d);
68782                         if (d[3] === '') return;
68783                         if (typeof d[3] !== 'string') return; // Workaround for #2295
68784                         requests.push(d);
68785                         if (_cache[d[3]] === false && lookUp(d)) {
68786                             requests.push(addSource(lookUp(d)));
68787                         }
68788                     });
68789
68790                     requests = uniqueBy(requests, 3).filter(function(r) {
68791                         // don't re-request tiles which have failed in the past
68792                         return _cache[r[3]] !== false;
68793                     });
68794                 }
68795
68796                 function load(d) {
68797                     _cache[d[3]] = true;
68798                     d3_select(this)
68799                         .on('error', null)
68800                         .on('load', null)
68801                         .classed('tile-loaded', true);
68802                     render(selection);
68803                 }
68804
68805                 function error(d) {
68806                     _cache[d[3]] = false;
68807                     d3_select(this)
68808                         .on('error', null)
68809                         .on('load', null)
68810                         .remove();
68811                     render(selection);
68812                 }
68813
68814                 function imageTransform(d) {
68815                     var ts = _tileSize * Math.pow(2, _zoom - d[2]);
68816                     var scale = tileSizeAtZoom(d, _zoom);
68817                     return 'translate(' +
68818                         ((d[0] * ts) - _tileOrigin[0]) + 'px,' +
68819                         ((d[1] * ts) - _tileOrigin[1]) + 'px) ' +
68820                         'scale(' + scale + ',' + scale + ')';
68821                 }
68822
68823                 function tileCenter(d) {
68824                     var ts = _tileSize * Math.pow(2, _zoom - d[2]);
68825                     return [
68826                         ((d[0] * ts) - _tileOrigin[0] + (ts / 2)),
68827                         ((d[1] * ts) - _tileOrigin[1] + (ts / 2))
68828                     ];
68829                 }
68830
68831                 function debugTransform(d) {
68832                     var coord = tileCenter(d);
68833                     return 'translate(' + coord[0] + 'px,' + coord[1] + 'px)';
68834                 }
68835
68836
68837                 // Pick a representative tile near the center of the viewport
68838                 // (This is useful for sampling the imagery vintage)
68839                 var dims = tiler.size();
68840                 var mapCenter = [dims[0] / 2, dims[1] / 2];
68841                 var minDist = Math.max(dims[0], dims[1]);
68842                 var nearCenter;
68843
68844                 requests.forEach(function(d) {
68845                     var c = tileCenter(d);
68846                     var dist = geoVecLength(c, mapCenter);
68847                     if (dist < minDist) {
68848                         minDist = dist;
68849                         nearCenter = d;
68850                     }
68851                 });
68852
68853
68854                 var image = selection.selectAll('img')
68855                     .data(requests, function(d) { return d[3]; });
68856
68857                 image.exit()
68858                     .style(transformProp, imageTransform)
68859                     .classed('tile-removing', true)
68860                     .classed('tile-center', false)
68861                     .each(function() {
68862                         var tile = d3_select(this);
68863                         window.setTimeout(function() {
68864                             if (tile.classed('tile-removing')) {
68865                                 tile.remove();
68866                             }
68867                         }, 300);
68868                     });
68869
68870                 image.enter()
68871                   .append('img')
68872                     .attr('class', 'tile')
68873                     .attr('src', function(d) { return d[3]; })
68874                     .on('error', error)
68875                     .on('load', load)
68876                   .merge(image)
68877                     .style(transformProp, imageTransform)
68878                     .classed('tile-debug', showDebug)
68879                     .classed('tile-removing', false)
68880                     .classed('tile-center', function(d) { return d === nearCenter; });
68881
68882
68883
68884                 var debug = selection.selectAll('.tile-label-debug')
68885                     .data(showDebug ? requests : [], function(d) { return d[3]; });
68886
68887                 debug.exit()
68888                     .remove();
68889
68890                 if (showDebug) {
68891                     var debugEnter = debug.enter()
68892                         .append('div')
68893                         .attr('class', 'tile-label-debug');
68894
68895                     debugEnter
68896                         .append('div')
68897                         .attr('class', 'tile-label-debug-coord');
68898
68899                     debugEnter
68900                         .append('div')
68901                         .attr('class', 'tile-label-debug-vintage');
68902
68903                     debug = debug.merge(debugEnter);
68904
68905                     debug
68906                         .style(transformProp, debugTransform);
68907
68908                     debug
68909                         .selectAll('.tile-label-debug-coord')
68910                         .text(function(d) { return d[2] + ' / ' + d[0] + ' / ' + d[1]; });
68911
68912                     debug
68913                         .selectAll('.tile-label-debug-vintage')
68914                         .each(function(d) {
68915                             var span = d3_select(this);
68916                             var center = context.projection.invert(tileCenter(d));
68917                             _source.getMetadata(center, d, function(err, result) {
68918                                 span.text((result && result.vintage && result.vintage.range) ||
68919                                     t('info_panels.background.vintage') + ': ' + t('info_panels.background.unknown')
68920                                 );
68921                             });
68922                         });
68923                 }
68924
68925             }
68926
68927
68928             background.projection = function(val) {
68929                 if (!arguments.length) return _projection;
68930                 _projection = val;
68931                 return background;
68932             };
68933
68934
68935             background.dimensions = function(val) {
68936                 if (!arguments.length) return tiler.size();
68937                 tiler.size(val);
68938                 return background;
68939             };
68940
68941
68942             background.source = function(val) {
68943                 if (!arguments.length) return _source;
68944                 _source = val;
68945                 _tileSize = _source.tileSize;
68946                 _cache = {};
68947                 tiler.tileSize(_source.tileSize).zoomExtent(_source.zoomExtent);
68948                 return background;
68949             };
68950
68951
68952             return background;
68953         }
68954
68955         function rendererBackground(context) {
68956             var dispatch$1 = dispatch('change');
68957             var detected = utilDetect();
68958             var baseLayer = rendererTileLayer(context).projection(context.projection);
68959             var _isValid = true;
68960             var _overlayLayers = [];
68961             var _backgroundSources = [];
68962             var _brightness = 1;
68963             var _contrast = 1;
68964             var _saturation = 1;
68965             var _sharpness = 1;
68966
68967
68968             function background(selection) {
68969                 // If we are displaying an Esri basemap at high zoom,
68970                 // check its tilemap to see how high the zoom can go
68971                 if (context.map().zoom() > 18) {
68972                     var basemap = baseLayer.source();
68973                     if (basemap && /^EsriWorldImagery/.test(basemap.id)) {
68974                         var center = context.map().center();
68975                         basemap.fetchTilemap(center);
68976                     }
68977                 }
68978
68979                 // Is the imagery valid here? - #4827
68980                 var sources = background.sources(context.map().extent());
68981                 var wasValid = _isValid;
68982                 _isValid = !!sources
68983                     .filter(function(d) { return d === baseLayer.source(); }).length;
68984
68985                 if (wasValid !== _isValid) {      // change in valid status
68986                     background.updateImagery();
68987                 }
68988
68989
68990                 var baseFilter = '';
68991                 if (detected.cssfilters) {
68992                     if (_brightness !== 1) {
68993                         baseFilter += 'brightness(' + _brightness + ')';
68994                     }
68995                     if (_contrast !== 1) {
68996                         baseFilter += 'contrast(' + _contrast + ')';
68997                     }
68998                     if (_saturation !== 1) {
68999                         baseFilter += 'saturate(' + _saturation + ')';
69000                     }
69001                     if (_sharpness < 1) {  // gaussian blur
69002                         var blur = d3_interpolateNumber(0.5, 5)(1 - _sharpness);
69003                         baseFilter += 'blur(' + blur + 'px)';
69004                     }
69005                 }
69006
69007                 var base = selection.selectAll('.layer-background')
69008                     .data([0]);
69009
69010                 base = base.enter()
69011                     .insert('div', '.layer-data')
69012                     .attr('class', 'layer layer-background')
69013                     .merge(base);
69014
69015                 if (detected.cssfilters) {
69016                     base.style('filter', baseFilter || null);
69017                 } else {
69018                     base.style('opacity', _brightness);
69019                 }
69020
69021
69022                 var imagery = base.selectAll('.layer-imagery')
69023                     .data([0]);
69024
69025                 imagery.enter()
69026                     .append('div')
69027                     .attr('class', 'layer layer-imagery')
69028                     .merge(imagery)
69029                     .call(baseLayer);
69030
69031
69032                 var maskFilter = '';
69033                 var mixBlendMode = '';
69034                 if (detected.cssfilters && _sharpness > 1) {  // apply unsharp mask
69035                     mixBlendMode = 'overlay';
69036                     maskFilter = 'saturate(0) blur(3px) invert(1)';
69037
69038                     var contrast = _sharpness - 1;
69039                     maskFilter += ' contrast(' + contrast + ')';
69040
69041                     var brightness = d3_interpolateNumber(1, 0.85)(_sharpness - 1);
69042                     maskFilter += ' brightness(' + brightness + ')';
69043                 }
69044
69045                 var mask = base.selectAll('.layer-unsharp-mask')
69046                     .data(detected.cssfilters && _sharpness > 1 ? [0] : []);
69047
69048                 mask.exit()
69049                     .remove();
69050
69051                 mask.enter()
69052                     .append('div')
69053                     .attr('class', 'layer layer-mask layer-unsharp-mask')
69054                     .merge(mask)
69055                     .call(baseLayer)
69056                     .style('filter', maskFilter || null)
69057                     .style('mix-blend-mode', mixBlendMode || null);
69058
69059
69060                 var overlays = selection.selectAll('.layer-overlay')
69061                     .data(_overlayLayers, function(d) { return d.source().name(); });
69062
69063                 overlays.exit()
69064                     .remove();
69065
69066                 overlays.enter()
69067                     .insert('div', '.layer-data')
69068                     .attr('class', 'layer layer-overlay')
69069                     .merge(overlays)
69070                     .each(function(layer) { d3_select(this).call(layer); });
69071             }
69072
69073
69074             background.updateImagery = function() {
69075                 var b = baseLayer.source();
69076                 if (context.inIntro() || !b) return;
69077
69078                 var o = _overlayLayers
69079                     .filter(function (d) { return !d.source().isLocatorOverlay() && !d.source().isHidden(); })
69080                     .map(function (d) { return d.source().id; })
69081                     .join(',');
69082
69083                 var meters = geoOffsetToMeters(b.offset());
69084                 var epsilon = 0.01;
69085                 var x = +meters[0].toFixed(2);
69086                 var y = +meters[1].toFixed(2);
69087                 var q = utilStringQs(window.location.hash.substring(1));
69088
69089                 var id = b.id;
69090                 if (id === 'custom') {
69091                     id = 'custom:' + b.template();
69092                 }
69093
69094                 if (id) {
69095                     q.background = id;
69096                 } else {
69097                     delete q.background;
69098                 }
69099
69100                 if (o) {
69101                     q.overlays = o;
69102                 } else {
69103                     delete q.overlays;
69104                 }
69105
69106                 if (Math.abs(x) > epsilon || Math.abs(y) > epsilon) {
69107                     q.offset = x + ',' + y;
69108                 } else {
69109                     delete q.offset;
69110                 }
69111
69112                 if (!window.mocha) {
69113                     window.location.replace('#' + utilQsString(q, true));
69114                 }
69115
69116                 var imageryUsed = [];
69117                 var photoOverlaysUsed = [];
69118
69119                 var current = b.imageryUsed();
69120                 if (current && _isValid) {
69121                     imageryUsed.push(current);
69122                 }
69123
69124                 _overlayLayers
69125                     .filter(function (d) { return !d.source().isLocatorOverlay() && !d.source().isHidden(); })
69126                     .forEach(function (d) { imageryUsed.push(d.source().imageryUsed()); });
69127
69128                 var data = context.layers().layer('data');
69129                 if (data && data.enabled() && data.hasData()) {
69130                     imageryUsed.push(data.getSrc());
69131                 }
69132
69133                 var photoOverlayLayers = {
69134                     streetside: 'Bing Streetside',
69135                     mapillary: 'Mapillary Images',
69136                     'mapillary-signs': 'Mapillary Signs',
69137                     openstreetcam: 'OpenStreetCam Images'
69138                 };
69139
69140                 for (var layerID in photoOverlayLayers) {
69141                     var layer = context.layers().layer(layerID);
69142                     if (layer && layer.enabled()) {
69143                         photoOverlaysUsed.push(layerID);
69144                         imageryUsed.push(photoOverlayLayers[layerID]);
69145                     }
69146                 }
69147
69148                 context.history().photoOverlaysUsed(photoOverlaysUsed);
69149                 context.history().imageryUsed(imageryUsed);
69150             };
69151
69152
69153             background.sources = function(extent) {
69154                 if (!data.imagery || !data.imagery.query) return [];   // called before init()?
69155
69156                 var matchIDs = {};
69157                 var matchImagery = data.imagery.query.bbox(extent.rectangle(), true) || [];
69158                 matchImagery.forEach(function(d) { matchIDs[d.id] = true; });
69159
69160                 return _backgroundSources.filter(function(source) {
69161                     return matchIDs[source.id] || !source.polygon;   // no polygon = worldwide
69162                 });
69163             };
69164
69165
69166             background.dimensions = function(d) {
69167                 if (!d) return;
69168                 baseLayer.dimensions(d);
69169
69170                 _overlayLayers.forEach(function(layer) {
69171                     layer.dimensions(d);
69172                 });
69173             };
69174
69175
69176             background.baseLayerSource = function(d) {
69177                 if (!arguments.length) return baseLayer.source();
69178
69179                 // test source against OSM imagery blacklists..
69180                 var osm = context.connection();
69181                 if (!osm) return background;
69182
69183                 var blacklists = context.connection().imageryBlacklists();
69184                 var template = d.template();
69185                 var fail = false;
69186                 var tested = 0;
69187                 var regex;
69188
69189                 for (var i = 0; i < blacklists.length; i++) {
69190                     try {
69191                         regex = new RegExp(blacklists[i]);
69192                         fail = regex.test(template);
69193                         tested++;
69194                         if (fail) break;
69195                     } catch (e) {
69196                         /* noop */
69197                     }
69198                 }
69199
69200                 // ensure at least one test was run.
69201                 if (!tested) {
69202                     regex = new RegExp('.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*');
69203                     fail = regex.test(template);
69204                 }
69205
69206                 baseLayer.source(!fail ? d : background.findSource('none'));
69207                 dispatch$1.call('change');
69208                 background.updateImagery();
69209                 return background;
69210             };
69211
69212
69213             background.findSource = function(id) {
69214                 return _backgroundSources.find(function(d) {
69215                     return d.id && d.id === id;
69216                 });
69217             };
69218
69219
69220             background.bing = function() {
69221                 background.baseLayerSource(background.findSource('Bing'));
69222             };
69223
69224
69225             background.showsLayer = function(d) {
69226                 return d.id === baseLayer.source().id ||
69227                     _overlayLayers.some(function(layer) { return d.id === layer.source().id; });
69228             };
69229
69230
69231             background.overlayLayerSources = function() {
69232                 return _overlayLayers.map(function (l) { return l.source(); });
69233             };
69234
69235
69236             background.toggleOverlayLayer = function(d) {
69237                 var layer;
69238                 for (var i = 0; i < _overlayLayers.length; i++) {
69239                     layer = _overlayLayers[i];
69240                     if (layer.source() === d) {
69241                         _overlayLayers.splice(i, 1);
69242                         dispatch$1.call('change');
69243                         background.updateImagery();
69244                         return;
69245                     }
69246                 }
69247
69248                 layer = rendererTileLayer(context)
69249                     .source(d)
69250                     .projection(context.projection)
69251                     .dimensions(baseLayer.dimensions()
69252                 );
69253
69254                 _overlayLayers.push(layer);
69255                 dispatch$1.call('change');
69256                 background.updateImagery();
69257             };
69258
69259
69260             background.nudge = function(d, zoom) {
69261                 baseLayer.source().nudge(d, zoom);
69262                 dispatch$1.call('change');
69263                 background.updateImagery();
69264                 return background;
69265             };
69266
69267
69268             background.offset = function(d) {
69269                 if (!arguments.length) return baseLayer.source().offset();
69270                 baseLayer.source().offset(d);
69271                 dispatch$1.call('change');
69272                 background.updateImagery();
69273                 return background;
69274             };
69275
69276
69277             background.brightness = function(d) {
69278                 if (!arguments.length) return _brightness;
69279                 _brightness = d;
69280                 if (context.mode()) dispatch$1.call('change');
69281                 return background;
69282             };
69283
69284
69285             background.contrast = function(d) {
69286                 if (!arguments.length) return _contrast;
69287                 _contrast = d;
69288                 if (context.mode()) dispatch$1.call('change');
69289                 return background;
69290             };
69291
69292
69293             background.saturation = function(d) {
69294                 if (!arguments.length) return _saturation;
69295                 _saturation = d;
69296                 if (context.mode()) dispatch$1.call('change');
69297                 return background;
69298             };
69299
69300
69301             background.sharpness = function(d) {
69302                 if (!arguments.length) return _sharpness;
69303                 _sharpness = d;
69304                 if (context.mode()) dispatch$1.call('change');
69305                 return background;
69306             };
69307
69308
69309             background.init = function() {
69310                 function parseMap(qmap) {
69311                     if (!qmap) return false;
69312                     var args = qmap.split('/').map(Number);
69313                     if (args.length < 3 || args.some(isNaN)) return false;
69314                     return geoExtent([args[2], args[1]]);
69315                 }
69316
69317                 var q = utilStringQs(window.location.hash.substring(1));
69318                 var requested = q.background || q.layer;
69319                 var extent = parseMap(q.map);
69320                 var first;
69321                 var best;
69322
69323
69324                 data.imagery = data.imagery || [];
69325                 data.imagery.features = {};
69326
69327                 // build efficient index and querying for data.imagery
69328                 var features = data.imagery.map(function(source) {
69329                     if (!source.polygon) return null;
69330
69331                     // Add an extra array nest to each element in `source.polygon`
69332                     // so the rings are not treated as a bunch of holes:
69333                     // what we have: [ [[outer],[hole],[hole]] ]
69334                     // what we want: [ [[outer]],[[outer]],[[outer]] ]
69335                     var rings = source.polygon.map(function(ring) { return [ring]; });
69336
69337                     var feature = {
69338                         type: 'Feature',
69339                         properties: { id: source.id },
69340                         geometry: { type: 'MultiPolygon', coordinates: rings }
69341                     };
69342
69343                     data.imagery.features[source.id] = feature;
69344                     return feature;
69345
69346                 }).filter(Boolean);
69347
69348                 data.imagery.query = whichPolygon_1({
69349                     type: 'FeatureCollection',
69350                     features: features
69351                 });
69352
69353
69354                 // Add all the available imagery sources
69355                 _backgroundSources = data.imagery.map(function(source) {
69356                     if (source.type === 'bing') {
69357                         return rendererBackgroundSource.Bing(source, dispatch$1);
69358                     } else if (/^EsriWorldImagery/.test(source.id)) {
69359                         return rendererBackgroundSource.Esri(source);
69360                     } else {
69361                         return rendererBackgroundSource(source);
69362                     }
69363                 });
69364
69365                 first = _backgroundSources.length && _backgroundSources[0];
69366
69367                 // Add 'None'
69368                 _backgroundSources.unshift(rendererBackgroundSource.None());
69369
69370                 // Add 'Custom'
69371                 var template = context.storage('background-custom-template') || '';
69372                 var custom = rendererBackgroundSource.Custom(template);
69373                 _backgroundSources.unshift(custom);
69374
69375
69376                 // Decide which background layer to display
69377                 if (!requested && extent) {
69378                     best = this.sources(extent).find(function(s) { return s.best(); });
69379                 }
69380                 if (requested && requested.indexOf('custom:') === 0) {
69381                     template = requested.replace(/^custom:/, '');
69382                     background.baseLayerSource(custom.template(template));
69383                     context.storage('background-custom-template', template);
69384                 } else {
69385                     background.baseLayerSource(
69386                         background.findSource(requested) ||
69387                         best ||
69388                         background.findSource(context.storage('background-last-used')) ||
69389                         background.findSource('Bing') ||
69390                         first ||
69391                         background.findSource('none')
69392                     );
69393                 }
69394
69395                 var locator = _backgroundSources.find(function(d) {
69396                     return d.overlay && d.default;
69397                 });
69398
69399                 if (locator) {
69400                     background.toggleOverlayLayer(locator);
69401                 }
69402
69403                 var overlays = (q.overlays || '').split(',');
69404                 overlays.forEach(function(overlay) {
69405                     overlay = background.findSource(overlay);
69406                     if (overlay) {
69407                         background.toggleOverlayLayer(overlay);
69408                     }
69409                 });
69410
69411                 if (q.gpx) {
69412                     var gpx = context.layers().layer('data');
69413                     if (gpx) {
69414                         gpx.url(q.gpx, '.gpx');
69415                     }
69416                 }
69417
69418                 if (q.offset) {
69419                     var offset = q.offset.replace(/;/g, ',').split(',').map(function(n) {
69420                         return !isNaN(n) && n;
69421                     });
69422
69423                     if (offset.length === 2) {
69424                         background.offset(geoMetersToOffset(offset));
69425                     }
69426                 }
69427             };
69428
69429
69430             return utilRebind(background, dispatch$1, 'on');
69431         }
69432
69433         function rendererFeatures(context) {
69434             var dispatch$1 = dispatch('change', 'redraw');
69435             var features = utilRebind({}, dispatch$1, 'on');
69436             var _deferred = new Set();
69437
69438             var traffic_roads = {
69439                 'motorway': true,
69440                 'motorway_link': true,
69441                 'trunk': true,
69442                 'trunk_link': true,
69443                 'primary': true,
69444                 'primary_link': true,
69445                 'secondary': true,
69446                 'secondary_link': true,
69447                 'tertiary': true,
69448                 'tertiary_link': true,
69449                 'residential': true,
69450                 'unclassified': true,
69451                 'living_street': true
69452             };
69453
69454             var service_roads = {
69455                 'service': true,
69456                 'road': true,
69457                 'track': true
69458             };
69459
69460             var paths = {
69461                 'path': true,
69462                 'footway': true,
69463                 'cycleway': true,
69464                 'bridleway': true,
69465                 'steps': true,
69466                 'pedestrian': true,
69467                 'corridor': true
69468             };
69469
69470             var past_futures = {
69471                 'proposed': true,
69472                 'construction': true,
69473                 'abandoned': true,
69474                 'dismantled': true,
69475                 'disused': true,
69476                 'razed': true,
69477                 'demolished': true,
69478                 'obliterated': true
69479             };
69480
69481             var _cullFactor = 1;
69482             var _cache = {};
69483             var _rules = {};
69484             var _stats = {};
69485             var _keys = [];
69486             var _hidden = [];
69487             var _forceVisible = {};
69488
69489
69490             function update() {
69491                 if (!window.mocha) {
69492                     var q = utilStringQs(window.location.hash.substring(1));
69493                     var disabled = features.disabled();
69494                     if (disabled.length) {
69495                         q.disable_features = disabled.join(',');
69496                     } else {
69497                         delete q.disable_features;
69498                     }
69499                     window.location.replace('#' + utilQsString(q, true));
69500                     context.storage('disabled-features', disabled.join(','));
69501                 }
69502                 _hidden = features.hidden();
69503                 dispatch$1.call('change');
69504                 dispatch$1.call('redraw');
69505             }
69506
69507
69508             function defineRule(k, filter, max) {
69509                 var isEnabled = true;
69510
69511                 _keys.push(k);
69512                 _rules[k] = {
69513                     filter: filter,
69514                     enabled: isEnabled,   // whether the user wants it enabled..
69515                     count: 0,
69516                     currentMax: (max || Infinity),
69517                     defaultMax: (max || Infinity),
69518                     enable: function() { this.enabled = true; this.currentMax = this.defaultMax; },
69519                     disable: function() { this.enabled = false; this.currentMax = 0; },
69520                     hidden: function() {
69521                         return !context.editable() ||
69522                             (this.count === 0 && !this.enabled) ||
69523                             this.count > this.currentMax * _cullFactor;
69524                     },
69525                     autoHidden: function() { return this.hidden() && this.currentMax > 0; }
69526                 };
69527             }
69528
69529
69530             defineRule('points', function isPoint(tags, geometry) {
69531                 return geometry === 'point';
69532             }, 200);
69533
69534             defineRule('traffic_roads', function isTrafficRoad(tags) {
69535                 return traffic_roads[tags.highway];
69536             });
69537
69538             defineRule('service_roads', function isServiceRoad(tags) {
69539                 return service_roads[tags.highway];
69540             });
69541
69542             defineRule('paths', function isPath(tags) {
69543                 return paths[tags.highway];
69544             });
69545
69546             defineRule('buildings', function isBuilding(tags) {
69547                 return (
69548                     (!!tags.building && tags.building !== 'no') ||
69549                     tags.parking === 'multi-storey' ||
69550                     tags.parking === 'sheds' ||
69551                     tags.parking === 'carports' ||
69552                     tags.parking === 'garage_boxes'
69553                 );
69554             }, 250);
69555
69556             defineRule('building_parts', function isBuildingPart(tags) {
69557                 return tags['building:part'];
69558             });
69559
69560             defineRule('indoor', function isIndoor(tags) {
69561                 return tags.indoor;
69562             });
69563
69564             defineRule('landuse', function isLanduse(tags, geometry) {
69565                 return geometry === 'area' &&
69566                     !_rules.buildings.filter(tags) &&
69567                     !_rules.building_parts.filter(tags) &&
69568                     !_rules.indoor.filter(tags) &&
69569                     !_rules.water.filter(tags) &&
69570                     !_rules.pistes.filter(tags);
69571             });
69572
69573             defineRule('boundaries', function isBoundary(tags) {
69574                 return (
69575                     !!tags.boundary
69576                 ) && !(
69577                     traffic_roads[tags.highway] ||
69578                     service_roads[tags.highway] ||
69579                     paths[tags.highway] ||
69580                     tags.waterway ||
69581                     tags.railway ||
69582                     tags.landuse ||
69583                     tags.natural ||
69584                     tags.building ||
69585                     tags.power
69586                 );
69587             });
69588
69589             defineRule('water', function isWater(tags) {
69590                 return (
69591                     !!tags.waterway ||
69592                     tags.natural === 'water' ||
69593                     tags.natural === 'coastline' ||
69594                     tags.natural === 'bay' ||
69595                     tags.landuse === 'pond' ||
69596                     tags.landuse === 'basin' ||
69597                     tags.landuse === 'reservoir' ||
69598                     tags.landuse === 'salt_pond'
69599                 );
69600             });
69601
69602             defineRule('rail', function isRail(tags) {
69603                 return (
69604                     !!tags.railway ||
69605                     tags.landuse === 'railway'
69606                 ) && !(
69607                     traffic_roads[tags.highway] ||
69608                     service_roads[tags.highway] ||
69609                     paths[tags.highway]
69610                 );
69611             });
69612
69613             defineRule('pistes', function isPiste(tags) {
69614                 return tags['piste:type'];
69615             });
69616
69617             defineRule('aerialways', function isPiste(tags) {
69618                 return tags.aerialway &&
69619                     tags.aerialway !== 'yes' &&
69620                     tags.aerialway !== 'station';
69621             });
69622
69623             defineRule('power', function isPower(tags) {
69624                 return !!tags.power;
69625             });
69626
69627             // contains a past/future tag, but not in active use as a road/path/cycleway/etc..
69628             defineRule('past_future', function isPastFuture(tags) {
69629                 if (
69630                     traffic_roads[tags.highway] ||
69631                     service_roads[tags.highway] ||
69632                     paths[tags.highway]
69633                 ) { return false; }
69634
69635                 var strings = Object.keys(tags);
69636
69637                 for (var i = 0; i < strings.length; i++) {
69638                     var s = strings[i];
69639                     if (past_futures[s] || past_futures[tags[s]]) { return true; }
69640                 }
69641                 return false;
69642             });
69643
69644             // Lines or areas that don't match another feature filter.
69645             // IMPORTANT: The 'others' feature must be the last one defined,
69646             //   so that code in getMatches can skip this test if `hasMatch = true`
69647             defineRule('others', function isOther(tags, geometry) {
69648                 return (geometry === 'line' || geometry === 'area');
69649             });
69650
69651
69652
69653             features.features = function() {
69654                 return _rules;
69655             };
69656
69657
69658             features.keys = function() {
69659                 return _keys;
69660             };
69661
69662
69663             features.enabled = function(k) {
69664                 if (!arguments.length) {
69665                     return _keys.filter(function(k) { return _rules[k].enabled; });
69666                 }
69667                 return _rules[k] && _rules[k].enabled;
69668             };
69669
69670
69671             features.disabled = function(k) {
69672                 if (!arguments.length) {
69673                     return _keys.filter(function(k) { return !_rules[k].enabled; });
69674                 }
69675                 return _rules[k] && !_rules[k].enabled;
69676             };
69677
69678
69679             features.hidden = function(k) {
69680                 if (!arguments.length) {
69681                     return _keys.filter(function(k) { return _rules[k].hidden(); });
69682                 }
69683                 return _rules[k] && _rules[k].hidden();
69684             };
69685
69686
69687             features.autoHidden = function(k) {
69688                 if (!arguments.length) {
69689                     return _keys.filter(function(k) { return _rules[k].autoHidden(); });
69690                 }
69691                 return _rules[k] && _rules[k].autoHidden();
69692             };
69693
69694
69695             features.enable = function(k) {
69696                 if (_rules[k] && !_rules[k].enabled) {
69697                     _rules[k].enable();
69698                     update();
69699                 }
69700             };
69701
69702             features.enableAll = function() {
69703                 var didEnable = false;
69704                 for (var k in _rules) {
69705                     if (!_rules[k].enabled) {
69706                         didEnable = true;
69707                         _rules[k].enable();
69708                     }
69709                 }
69710                 if (didEnable) update();
69711             };
69712
69713
69714             features.disable = function(k) {
69715                 if (_rules[k] && _rules[k].enabled) {
69716                     _rules[k].disable();
69717                     update();
69718                 }
69719             };
69720
69721             features.disableAll = function() {
69722                 var didDisable = false;
69723                 for (var k in _rules) {
69724                     if (_rules[k].enabled) {
69725                         didDisable = true;
69726                         _rules[k].disable();
69727                     }
69728                 }
69729                 if (didDisable) update();
69730             };
69731
69732
69733             features.toggle = function(k) {
69734                 if (_rules[k]) {
69735                     (function(f) { return f.enabled ? f.disable() : f.enable(); }(_rules[k]));
69736                     update();
69737                 }
69738             };
69739
69740
69741             features.resetStats = function() {
69742                 for (var i = 0; i < _keys.length; i++) {
69743                     _rules[_keys[i]].count = 0;
69744                 }
69745                 dispatch$1.call('change');
69746             };
69747
69748
69749             features.gatherStats = function(d, resolver, dimensions) {
69750                 var needsRedraw = false;
69751                 var types = utilArrayGroupBy(d, 'type');
69752                 var entities = [].concat(types.relation || [], types.way || [], types.node || []);
69753                 var currHidden, geometry, matches, i, j;
69754
69755                 for (i = 0; i < _keys.length; i++) {
69756                     _rules[_keys[i]].count = 0;
69757                 }
69758
69759                 // adjust the threshold for point/building culling based on viewport size..
69760                 // a _cullFactor of 1 corresponds to a 1000x1000px viewport..
69761                 _cullFactor = dimensions[0] * dimensions[1] / 1000000;
69762
69763                 for (i = 0; i < entities.length; i++) {
69764                     geometry = entities[i].geometry(resolver);
69765                     matches = Object.keys(features.getMatches(entities[i], resolver, geometry));
69766                     for (j = 0; j < matches.length; j++) {
69767                         _rules[matches[j]].count++;
69768                     }
69769                 }
69770
69771                 currHidden = features.hidden();
69772                 if (currHidden !== _hidden) {
69773                     _hidden = currHidden;
69774                     needsRedraw = true;
69775                     dispatch$1.call('change');
69776                 }
69777
69778                 return needsRedraw;
69779             };
69780
69781
69782             features.stats = function() {
69783                 for (var i = 0; i < _keys.length; i++) {
69784                     _stats[_keys[i]] = _rules[_keys[i]].count;
69785                 }
69786
69787                 return _stats;
69788             };
69789
69790
69791             features.clear = function(d) {
69792                 for (var i = 0; i < d.length; i++) {
69793                     features.clearEntity(d[i]);
69794                 }
69795             };
69796
69797
69798             features.clearEntity = function(entity) {
69799                 delete _cache[osmEntity.key(entity)];
69800             };
69801
69802
69803             features.reset = function() {
69804                 Array.from(_deferred).forEach(function(handle) {
69805                     window.cancelIdleCallback(handle);
69806                     _deferred.delete(handle);
69807                 });
69808
69809                 _cache = {};
69810             };
69811
69812             // only certain relations are worth checking
69813             function relationShouldBeChecked(relation) {
69814                 // multipolygon features have `area` geometry and aren't checked here
69815                 return relation.tags.type === 'boundary';
69816             }
69817
69818             features.getMatches = function(entity, resolver, geometry) {
69819                 if (geometry === 'vertex' ||
69820                     (geometry === 'relation' && !relationShouldBeChecked(entity))) return {};
69821
69822                 var ent = osmEntity.key(entity);
69823                 if (!_cache[ent]) {
69824                     _cache[ent] = {};
69825                 }
69826
69827                 if (!_cache[ent].matches) {
69828                     var matches = {};
69829                     var hasMatch = false;
69830
69831                     for (var i = 0; i < _keys.length; i++) {
69832                         if (_keys[i] === 'others') {
69833                             if (hasMatch) continue;
69834
69835                             // If an entity...
69836                             //   1. is a way that hasn't matched other 'interesting' feature rules,
69837                             if (entity.type === 'way') {
69838                                 var parents = features.getParents(entity, resolver, geometry);
69839
69840                                 //   2a. belongs only to a single multipolygon relation
69841                                 if ((parents.length === 1 && parents[0].isMultipolygon()) ||
69842                                     // 2b. or belongs only to boundary relations
69843                                     (parents.length > 0 && parents.every(function(parent) { return parent.tags.type === 'boundary'; }))) {
69844
69845                                     // ...then match whatever feature rules the parent relation has matched.
69846                                     // see #2548, #2887
69847                                     //
69848                                     // IMPORTANT:
69849                                     // For this to work, getMatches must be called on relations before ways.
69850                                     //
69851                                     var pkey = osmEntity.key(parents[0]);
69852                                     if (_cache[pkey] && _cache[pkey].matches) {
69853                                         matches = Object.assign({}, _cache[pkey].matches);  // shallow copy
69854                                         continue;
69855                                     }
69856                                 }
69857                             }
69858                         }
69859
69860                         if (_rules[_keys[i]].filter(entity.tags, geometry)) {
69861                             matches[_keys[i]] = hasMatch = true;
69862                         }
69863                     }
69864                     _cache[ent].matches = matches;
69865                 }
69866
69867                 return _cache[ent].matches;
69868             };
69869
69870
69871             features.getParents = function(entity, resolver, geometry) {
69872                 if (geometry === 'point') return [];
69873
69874                 var ent = osmEntity.key(entity);
69875                 if (!_cache[ent]) {
69876                     _cache[ent] = {};
69877                 }
69878
69879                 if (!_cache[ent].parents) {
69880                     var parents = [];
69881                     if (geometry === 'vertex') {
69882                         parents = resolver.parentWays(entity);
69883                     } else {   // 'line', 'area', 'relation'
69884                         parents = resolver.parentRelations(entity);
69885                     }
69886                     _cache[ent].parents = parents;
69887                 }
69888                 return _cache[ent].parents;
69889             };
69890
69891
69892             features.isHiddenPreset = function(preset, geometry) {
69893                 if (!_hidden.length) return false;
69894                 if (!preset.tags) return false;
69895
69896                 var test = preset.setTags({}, geometry);
69897                 for (var key in _rules) {
69898                     if (_rules[key].filter(test, geometry)) {
69899                         if (_hidden.indexOf(key) !== -1) {
69900                             return key;
69901                         }
69902                         return false;
69903                     }
69904                 }
69905                 return false;
69906             };
69907
69908
69909             features.isHiddenFeature = function(entity, resolver, geometry) {
69910                 if (!_hidden.length) return false;
69911                 if (!entity.version) return false;
69912                 if (_forceVisible[entity.id]) return false;
69913
69914                 var matches = Object.keys(features.getMatches(entity, resolver, geometry));
69915                 return matches.length && matches.every(function(k) { return features.hidden(k); });
69916             };
69917
69918
69919             features.isHiddenChild = function(entity, resolver, geometry) {
69920                 if (!_hidden.length) return false;
69921                 if (!entity.version || geometry === 'point') return false;
69922                 if (_forceVisible[entity.id]) return false;
69923
69924                 var parents = features.getParents(entity, resolver, geometry);
69925                 if (!parents.length) return false;
69926
69927                 for (var i = 0; i < parents.length; i++) {
69928                     if (!features.isHidden(parents[i], resolver, parents[i].geometry(resolver))) {
69929                         return false;
69930                     }
69931                 }
69932                 return true;
69933             };
69934
69935
69936             features.hasHiddenConnections = function(entity, resolver) {
69937                 if (!_hidden.length) return false;
69938
69939                 var childNodes, connections;
69940                 if (entity.type === 'midpoint') {
69941                     childNodes = [resolver.entity(entity.edge[0]), resolver.entity(entity.edge[1])];
69942                     connections = [];
69943                 } else {
69944                     childNodes = entity.nodes ? resolver.childNodes(entity) : [];
69945                     connections = features.getParents(entity, resolver, entity.geometry(resolver));
69946                 }
69947
69948                 // gather ways connected to child nodes..
69949                 connections = childNodes.reduce(function(result, e) {
69950                     return resolver.isShared(e) ? utilArrayUnion(result, resolver.parentWays(e)) : result;
69951                 }, connections);
69952
69953                 return connections.some(function(e) {
69954                     return features.isHidden(e, resolver, e.geometry(resolver));
69955                 });
69956             };
69957
69958
69959             features.isHidden = function(entity, resolver, geometry) {
69960                 if (!_hidden.length) return false;
69961                 if (!entity.version) return false;
69962
69963                 var fn = (geometry === 'vertex' ? features.isHiddenChild : features.isHiddenFeature);
69964                 return fn(entity, resolver, geometry);
69965             };
69966
69967
69968             features.filter = function(d, resolver) {
69969                 if (!_hidden.length) return d;
69970
69971                 var result = [];
69972                 for (var i = 0; i < d.length; i++) {
69973                     var entity = d[i];
69974                     if (!features.isHidden(entity, resolver, entity.geometry(resolver))) {
69975                         result.push(entity);
69976                     }
69977                 }
69978                 return result;
69979             };
69980
69981
69982             features.forceVisible = function(entityIDs) {
69983                 if (!arguments.length) return Object.keys(_forceVisible);
69984
69985                 _forceVisible = {};
69986                 for (var i = 0; i < entityIDs.length; i++) {
69987                     _forceVisible[entityIDs[i]] = true;
69988                     var entity = context.hasEntity(entityIDs[i]);
69989                     if (entity && entity.type === 'relation') {
69990                         // also show relation members (one level deep)
69991                         for (var j in entity.members) {
69992                             _forceVisible[entity.members[j].id] = true;
69993                         }
69994                     }
69995                 }
69996                 return features;
69997             };
69998
69999
70000             features.init = function() {
70001                 var storage = context.storage('disabled-features');
70002                 if (storage) {
70003                     var storageDisabled = storage.replace(/;/g, ',').split(',');
70004                     storageDisabled.forEach(features.disable);
70005                 }
70006
70007                 var q = utilStringQs(window.location.hash.substring(1));
70008                 if (q.disable_features) {
70009                     var hashDisabled = q.disable_features.replace(/;/g, ',').split(',');
70010                     hashDisabled.forEach(features.disable);
70011                 }
70012             };
70013
70014
70015             // warm up the feature matching cache upon merging fetched data
70016             context.history().on('merge.features', function(newEntities) {
70017                 if (!newEntities) return;
70018                 var handle = window.requestIdleCallback(function() {
70019                     var graph = context.graph();
70020                     var types = utilArrayGroupBy(newEntities, 'type');
70021                     // ensure that getMatches is called on relations before ways
70022                     var entities = [].concat(types.relation || [], types.way || [], types.node || []);
70023                     for (var i = 0; i < entities.length; i++) {
70024                         var geometry = entities[i].geometry(graph);
70025                         features.getMatches(entities[i], graph, geometry);
70026                     }
70027                 });
70028                 _deferred.add(handle);
70029             });
70030
70031
70032             return features;
70033         }
70034
70035         // Touch targets control which other vertices we can drag a vertex onto.
70036         //
70037         // - the activeID - nope
70038         // - 1 away (adjacent) to the activeID - yes (vertices will be merged)
70039         // - 2 away from the activeID - nope (would create a self intersecting segment)
70040         // - all others on a linear way - yes
70041         // - all others on a closed way - nope (would create a self intersecting polygon)
70042         //
70043         // returns
70044         // 0 = active vertex - no touch/connect
70045         // 1 = passive vertex - yes touch/connect
70046         // 2 = adjacent vertex - yes but pay attention segmenting a line here
70047         //
70048         function svgPassiveVertex(node, graph, activeID) {
70049             if (!activeID) return 1;
70050             if (activeID === node.id) return 0;
70051
70052             var parents = graph.parentWays(node);
70053
70054             for (var i = 0; i < parents.length; i++) {
70055                 var nodes = parents[i].nodes;
70056                 var isClosed = parents[i].isClosed();
70057                 for (var j = 0; j < nodes.length; j++) {   // find this vertex, look nearby
70058                     if (nodes[j] === node.id) {
70059                         var ix1 = j - 2;
70060                         var ix2 = j - 1;
70061                         var ix3 = j + 1;
70062                         var ix4 = j + 2;
70063
70064                         if (isClosed) {  // wraparound if needed
70065                             var max = nodes.length - 1;
70066                             if (ix1 < 0)   ix1 = max + ix1;
70067                             if (ix2 < 0)   ix2 = max + ix2;
70068                             if (ix3 > max) ix3 = ix3 - max;
70069                             if (ix4 > max) ix4 = ix4 - max;
70070                         }
70071
70072                         if (nodes[ix1] === activeID) return 0;        // no - prevent self intersect
70073                         else if (nodes[ix2] === activeID) return 2;   // ok - adjacent
70074                         else if (nodes[ix3] === activeID) return 2;   // ok - adjacent
70075                         else if (nodes[ix4] === activeID) return 0;   // no - prevent self intersect
70076                         else if (isClosed && nodes.indexOf(activeID) !== -1) return 0;  // no - prevent self intersect
70077                     }
70078                 }
70079             }
70080
70081             return 1;   // ok
70082         }
70083
70084
70085         function svgMarkerSegments(projection, graph, dt,
70086                                           shouldReverse,
70087                                           bothDirections) {
70088             return function(entity) {
70089                 var i = 0;
70090                 var offset = dt;
70091                 var segments = [];
70092                 var clip = d3_geoIdentity().clipExtent(projection.clipExtent()).stream;
70093                 var coordinates = graph.childNodes(entity).map(function(n) { return n.loc; });
70094                 var a, b;
70095
70096                 if (shouldReverse(entity)) {
70097                     coordinates.reverse();
70098                 }
70099
70100                 d3_geoStream({
70101                     type: 'LineString',
70102                     coordinates: coordinates
70103                 }, projection.stream(clip({
70104                     lineStart: function() {},
70105                     lineEnd: function() { a = null; },
70106                     point: function(x, y) {
70107                         b = [x, y];
70108
70109                         if (a) {
70110                             var span = geoVecLength(a, b) - offset;
70111
70112                             if (span >= 0) {
70113                                 var heading = geoVecAngle(a, b);
70114                                 var dx = dt * Math.cos(heading);
70115                                 var dy = dt * Math.sin(heading);
70116                                 var p = [
70117                                     a[0] + offset * Math.cos(heading),
70118                                     a[1] + offset * Math.sin(heading)
70119                                 ];
70120
70121                                 // gather coordinates
70122                                 var coord = [a, p];
70123                                 for (span -= dt; span >= 0; span -= dt) {
70124                                     p = geoVecAdd(p, [dx, dy]);
70125                                     coord.push(p);
70126                                 }
70127                                 coord.push(b);
70128
70129                                 // generate svg paths
70130                                 var segment = '';
70131                                 var j;
70132
70133                                 for (j = 0; j < coord.length; j++) {
70134                                     segment += (j === 0 ? 'M' : 'L') + coord[j][0] + ',' + coord[j][1];
70135                                 }
70136                                 segments.push({ id: entity.id, index: i++, d: segment });
70137
70138                                 if (bothDirections(entity)) {
70139                                     segment = '';
70140                                     for (j = coord.length - 1; j >= 0; j--) {
70141                                         segment += (j === coord.length - 1 ? 'M' : 'L') + coord[j][0] + ',' + coord[j][1];
70142                                     }
70143                                     segments.push({ id: entity.id, index: i++, d: segment });
70144                                 }
70145                             }
70146
70147                             offset = -span;
70148                         }
70149
70150                         a = b;
70151                     }
70152                 })));
70153
70154                 return segments;
70155             };
70156         }
70157
70158
70159         function svgPath(projection, graph, isArea) {
70160
70161             // Explanation of magic numbers:
70162             // "padding" here allows space for strokes to extend beyond the viewport,
70163             // so that the stroke isn't drawn along the edge of the viewport when
70164             // the shape is clipped.
70165             //
70166             // When drawing lines, pad viewport by 5px.
70167             // When drawing areas, pad viewport by 65px in each direction to allow
70168             // for 60px area fill stroke (see ".fill-partial path.fill" css rule)
70169
70170             var cache = {};
70171             var padding = isArea ? 65 : 5;
70172             var viewport = projection.clipExtent();
70173             var paddedExtent = [
70174                 [viewport[0][0] - padding, viewport[0][1] - padding],
70175                 [viewport[1][0] + padding, viewport[1][1] + padding]
70176             ];
70177             var clip = d3_geoIdentity().clipExtent(paddedExtent).stream;
70178             var project = projection.stream;
70179             var path = d3_geoPath()
70180                 .projection({stream: function(output) { return project(clip(output)); }});
70181
70182             var svgpath = function(entity) {
70183                 if (entity.id in cache) {
70184                     return cache[entity.id];
70185                 } else {
70186                     return cache[entity.id] = path(entity.asGeoJSON(graph));
70187                 }
70188             };
70189
70190             svgpath.geojson = function(d) {
70191                 if (d.__featurehash__ !== undefined) {
70192                     if (d.__featurehash__ in cache) {
70193                         return cache[d.__featurehash__];
70194                     } else {
70195                         return cache[d.__featurehash__] = path(d);
70196                     }
70197                 } else {
70198                     return path(d);
70199                 }
70200             };
70201
70202             return svgpath;
70203         }
70204
70205
70206         function svgPointTransform(projection) {
70207             var svgpoint = function(entity) {
70208                 // http://jsperf.com/short-array-join
70209                 var pt = projection(entity.loc);
70210                 return 'translate(' + pt[0] + ',' + pt[1] + ')';
70211             };
70212
70213             svgpoint.geojson = function(d) {
70214                 return svgpoint(d.properties.entity);
70215             };
70216
70217             return svgpoint;
70218         }
70219
70220
70221         function svgRelationMemberTags(graph) {
70222             return function(entity) {
70223                 var tags = entity.tags;
70224                 var shouldCopyMultipolygonTags = !entity.hasInterestingTags();
70225                 graph.parentRelations(entity).forEach(function(relation) {
70226                     var type = relation.tags.type;
70227                     if ((type === 'multipolygon' && shouldCopyMultipolygonTags) || type === 'boundary') {
70228                         tags = Object.assign({}, relation.tags, tags);
70229                     }
70230                 });
70231                 return tags;
70232             };
70233         }
70234
70235
70236         function svgSegmentWay(way, graph, activeID) {
70237             // When there is no activeID, we can memoize this expensive computation
70238             if (activeID === undefined) {
70239                 return graph.transient(way, 'waySegments', getWaySegments);
70240             } else {
70241                 return getWaySegments();
70242             }
70243
70244             function getWaySegments() {
70245                 var isActiveWay = (way.nodes.indexOf(activeID) !== -1);
70246                 var features = { passive: [], active: [] };
70247                 var start = {};
70248                 var end = {};
70249                 var node, type;
70250
70251                 for (var i = 0; i < way.nodes.length; i++) {
70252                     node = graph.entity(way.nodes[i]);
70253                     type = svgPassiveVertex(node, graph, activeID);
70254                     end = { node: node, type: type };
70255
70256                     if (start.type !== undefined) {
70257                         if (start.node.id === activeID || end.node.id === activeID) ; else if (isActiveWay && (start.type === 2 || end.type === 2)) {   // one adjacent vertex
70258                             pushActive(start, end, i);
70259                         } else if (start.type === 0 && end.type === 0) {   // both active vertices
70260                             pushActive(start, end, i);
70261                         } else {
70262                             pushPassive(start, end, i);
70263                         }
70264                     }
70265
70266                     start = end;
70267                 }
70268
70269                 return features;
70270
70271                 function pushActive(start, end, index) {
70272                     features.active.push({
70273                         type: 'Feature',
70274                         id: way.id + '-' + index + '-nope',
70275                         properties: {
70276                             nope: true,
70277                             target: true,
70278                             entity: way,
70279                             nodes: [start.node, end.node],
70280                             index: index
70281                         },
70282                         geometry: {
70283                             type: 'LineString',
70284                             coordinates: [start.node.loc, end.node.loc]
70285                         }
70286                     });
70287                 }
70288
70289                 function pushPassive(start, end, index) {
70290                     features.passive.push({
70291                         type: 'Feature',
70292                         id: way.id + '-' + index,
70293                         properties: {
70294                             target: true,
70295                             entity: way,
70296                             nodes: [start.node, end.node],
70297                             index: index
70298                         },
70299                         geometry: {
70300                             type: 'LineString',
70301                             coordinates: [start.node.loc, end.node.loc]
70302                         }
70303                     });
70304                 }
70305             }
70306         }
70307
70308         function svgTagClasses() {
70309             var primaries = [
70310                 'building', 'highway', 'railway', 'waterway', 'aeroway', 'aerialway',
70311                 'piste:type', 'boundary', 'power', 'amenity', 'natural', 'landuse',
70312                 'leisure', 'military', 'place', 'man_made', 'route', 'attraction',
70313                 'building:part', 'indoor'
70314             ];
70315             var statuses = [
70316                 'proposed', 'construction', 'disused', 'abandoned', 'dismantled',
70317                 'razed', 'demolished', 'obliterated', 'intermittent'
70318             ];
70319             var secondaries = [
70320                 'oneway', 'bridge', 'tunnel', 'embankment', 'cutting', 'barrier',
70321                 'surface', 'tracktype', 'footway', 'crossing', 'service', 'sport',
70322                 'public_transport', 'location', 'parking', 'golf', 'type', 'leisure',
70323                 'man_made', 'indoor'
70324             ];
70325             var _tags = function(entity) { return entity.tags; };
70326
70327
70328             var tagClasses = function(selection) {
70329                 selection.each(function tagClassesEach(entity) {
70330                     var value = this.className;
70331
70332                     if (value.baseVal !== undefined) {
70333                         value = value.baseVal;
70334                     }
70335
70336                     var t = _tags(entity);
70337
70338                     var computed = tagClasses.getClassesString(t, value, entity);
70339
70340                     if (computed !== value) {
70341                         d3_select(this).attr('class', computed);
70342                     }
70343                 });
70344             };
70345
70346
70347             tagClasses.getClassesString = function(t, value, entity) {
70348                 var primary, status;
70349                 var i, k, v;
70350
70351                 // in some situations we want to render perimeter strokes a certain way
70352                 var overrideGeometry;
70353                 if (/\bstroke\b/.test(value)) {
70354                     if (!!t.barrier && t.barrier !== 'no') {
70355                         overrideGeometry = 'line';
70356                     } else if (t.type === 'multipolygon' && !entity.hasInterestingTags()) {
70357                         overrideGeometry = 'area';
70358                     }
70359                 }
70360
70361                 // preserve base classes (nothing with `tag-`)
70362                 var classes = value.trim().split(/\s+/)
70363                     .filter(function(klass) {
70364                         return klass.length && !/^tag-/.test(klass);
70365                     })
70366                     .map(function(klass) {  // special overrides for some perimeter strokes
70367                         return (klass === 'line' || klass === 'area') ? (overrideGeometry || klass) : klass;
70368                     });
70369
70370                 // pick at most one primary classification tag..
70371                 for (i = 0; i < primaries.length; i++) {
70372                     k = primaries[i];
70373                     v = t[k];
70374                     if (!v || v === 'no') continue;
70375
70376                     if (k === 'piste:type') {  // avoid a ':' in the class name
70377                         k = 'piste';
70378                     } else if (k === 'building:part') {  // avoid a ':' in the class name
70379                         k = 'building_part';
70380                     }
70381
70382                     primary = k;
70383                     if (statuses.indexOf(v) !== -1) {   // e.g. `railway=abandoned`
70384                         status = v;
70385                         classes.push('tag-' + k);
70386                     } else {
70387                         classes.push('tag-' + k);
70388                         classes.push('tag-' + k + '-' + v);
70389                     }
70390
70391                     break;
70392                 }
70393
70394                 // add at most one status tag, only if relates to primary tag..
70395                 if (!status) {
70396                     for (i = 0; i < statuses.length; i++) {
70397                         k = statuses[i];
70398                         v = t[k];
70399                         if (!v || v === 'no') continue;
70400
70401                         if (v === 'yes') {   // e.g. `railway=rail + abandoned=yes`
70402                             status = k;
70403                         }
70404                         else if (primary && primary === v) {  // e.g. `railway=rail + abandoned=railway`
70405                             status = k;
70406                         } else if (!primary && primaries.indexOf(v) !== -1) {  // e.g. `abandoned=railway`
70407                             status = k;
70408                             primary = v;
70409                             classes.push('tag-' + v);
70410                         }  // else ignore e.g.  `highway=path + abandoned=railway`
70411
70412                         if (status) break;
70413                     }
70414                 }
70415
70416                 if (status) {
70417                     classes.push('tag-status');
70418                     classes.push('tag-status-' + status);
70419                 }
70420
70421                 // add any secondary tags
70422                 for (i = 0; i < secondaries.length; i++) {
70423                     k = secondaries[i];
70424                     v = t[k];
70425                     if (!v || v === 'no' || k === primary) continue;
70426                     classes.push('tag-' + k);
70427                     classes.push('tag-' + k + '-' + v);
70428                 }
70429
70430                 // For highways, look for surface tagging..
70431                 if (primary === 'highway' || primary === 'aeroway') {
70432                     var paved = (t.highway !== 'track');
70433                     for (k in t) {
70434                         v = t[k];
70435                         if (k in osmPavedTags) {
70436                             paved = !!osmPavedTags[k][v];
70437                             break;
70438                         }
70439                     }
70440                     if (!paved) {
70441                         classes.push('tag-unpaved');
70442                     }
70443                 }
70444
70445                 // If this is a wikidata-tagged item, add a class for that..
70446                 if (t.wikidata || t['brand:wikidata']) {
70447                     classes.push('tag-wikidata');
70448                 }
70449
70450                 return classes.join(' ').trim();
70451             };
70452
70453
70454             tagClasses.tags = function(val) {
70455                 if (!arguments.length) return _tags;
70456                 _tags = val;
70457                 return tagClasses;
70458             };
70459
70460             return tagClasses;
70461         }
70462
70463         function svgAreas(projection, context) {
70464             // Patterns only work in Firefox when set directly on element.
70465             // (This is not a bug: https://bugzilla.mozilla.org/show_bug.cgi?id=750632)
70466             var patterns = {
70467                 // tag - pattern name
70468                 // -or-
70469                 // tag - value - pattern name
70470                 // -or-
70471                 // tag - value - rules (optional tag-values, pattern name)
70472                 // (matches earlier rules first, so fallback should be last entry)
70473                 amenity: {
70474                     grave_yard: 'cemetery',
70475                     fountain: 'water_standing'
70476                 },
70477                 landuse: {
70478                     cemetery: [
70479                         { religion: 'christian', pattern: 'cemetery_christian' },
70480                         { religion: 'buddhist', pattern: 'cemetery_buddhist' },
70481                         { religion: 'muslim', pattern: 'cemetery_muslim' },
70482                         { religion: 'jewish', pattern: 'cemetery_jewish' },
70483                         { pattern: 'cemetery' }
70484                     ],
70485                     construction: 'construction',
70486                     farmland: 'farmland',
70487                     farmyard: 'farmyard',
70488                     forest: [
70489                         { leaf_type: 'broadleaved', pattern: 'forest_broadleaved' },
70490                         { leaf_type: 'needleleaved', pattern: 'forest_needleleaved' },
70491                         { leaf_type: 'leafless', pattern: 'forest_leafless' },
70492                         { pattern: 'forest' } // same as 'leaf_type:mixed'
70493                     ],
70494                     grave_yard: 'cemetery',
70495                     grass: 'grass',
70496                     landfill: 'landfill',
70497                     meadow: 'meadow',
70498                     military: 'construction',
70499                     orchard: 'orchard',
70500                     quarry: 'quarry',
70501                     vineyard: 'vineyard'
70502                 },
70503                 natural: {
70504                     beach: 'beach',
70505                     grassland: 'grass',
70506                     sand: 'beach',
70507                     scrub: 'scrub',
70508                     water: [
70509                         { water: 'pond', pattern: 'pond' },
70510                         { water: 'reservoir', pattern: 'water_standing' },
70511                         { pattern: 'waves' }
70512                     ],
70513                     wetland: [
70514                         { wetland: 'marsh', pattern: 'wetland_marsh' },
70515                         { wetland: 'swamp', pattern: 'wetland_swamp' },
70516                         { wetland: 'bog', pattern: 'wetland_bog' },
70517                         { wetland: 'reedbed', pattern: 'wetland_reedbed' },
70518                         { pattern: 'wetland' }
70519                     ],
70520                     wood: [
70521                         { leaf_type: 'broadleaved', pattern: 'forest_broadleaved' },
70522                         { leaf_type: 'needleleaved', pattern: 'forest_needleleaved' },
70523                         { leaf_type: 'leafless', pattern: 'forest_leafless' },
70524                         { pattern: 'forest' } // same as 'leaf_type:mixed'
70525                     ]
70526                 },
70527                 traffic_calming: {
70528                     island: [
70529                         { surface: 'grass', pattern: 'grass' },
70530                     ],
70531                     chicane: [
70532                         { surface: 'grass', pattern: 'grass' },
70533                     ],
70534                     choker: [
70535                         { surface: 'grass', pattern: 'grass' },
70536                     ]
70537                 }
70538             };
70539
70540             function setPattern(entity) {
70541                 // Skip pattern filling if this is a building (buildings don't get patterns applied)
70542                 if (entity.tags.building && entity.tags.building !== 'no') {
70543                     this.style.fill = this.style.stroke = '';
70544                     return;
70545                 }
70546
70547                 for (var tag in patterns) {
70548                     var entityValue = entity.tags[tag];
70549                     if (!entityValue) continue;
70550
70551                     if (typeof patterns[tag] === 'string') { // extra short syntax (just tag) - pattern name
70552                         this.style.fill = this.style.stroke = 'url("#pattern-' + patterns[tag] + '")';
70553                         return;
70554                     } else {
70555                         var values = patterns[tag];
70556                         for (var value in values) {
70557                             if (entityValue !== value) continue;
70558
70559                             var rules = values[value];
70560                             if (typeof rules === 'string') { // short syntax - pattern name
70561                                 this.style.fill = this.style.stroke = 'url("#pattern-' + rules + '")';
70562                                 return;
70563                             } else { // long syntax - rule array
70564                                 for (var ruleKey in rules) {
70565                                     var rule = rules[ruleKey];
70566
70567                                     var pass = true;
70568                                     for (var criterion in rule) {
70569                                         if (criterion !== 'pattern') { // reserved for pattern name
70570                                             // The only rule is a required tag-value pair
70571                                             var v = entity.tags[criterion];
70572                                             if (!v || v !== rule[criterion]) {
70573                                                 pass = false;
70574                                                 break;
70575                                             }
70576                                         }
70577                                     }
70578
70579                                     if (pass) {
70580                                         this.style.fill = this.style.stroke = 'url("#pattern-' + rule.pattern + '")';
70581                                         return;
70582                                     }
70583                                 }
70584                             }
70585                         }
70586                     }
70587                 }
70588
70589                 this.style.fill = this.style.stroke = '';
70590             }
70591
70592
70593             function drawTargets(selection, graph, entities, filter) {
70594                 var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
70595                 var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
70596                 var getPath = svgPath(projection).geojson;
70597                 var activeID = context.activeID();
70598
70599                 // The targets and nopes will be MultiLineString sub-segments of the ways
70600                 var data = { targets: [], nopes: [] };
70601
70602                 entities.forEach(function(way) {
70603                     var features = svgSegmentWay(way, graph, activeID);
70604                     data.targets.push.apply(data.targets, features.passive);
70605                     data.nopes.push.apply(data.nopes, features.active);
70606                 });
70607
70608
70609                 // Targets allow hover and vertex snapping
70610                 var targetData = data.targets.filter(getPath);
70611                 var targets = selection.selectAll('.area.target-allowed')
70612                     .filter(function(d) { return filter(d.properties.entity); })
70613                     .data(targetData, function key(d) { return d.id; });
70614
70615                 // exit
70616                 targets.exit()
70617                     .remove();
70618
70619                 // enter/update
70620                 targets.enter()
70621                     .append('path')
70622                     .merge(targets)
70623                     .attr('d', getPath)
70624                     .attr('class', function(d) { return 'way area target target-allowed ' + targetClass + d.id; });
70625
70626
70627                 // NOPE
70628                 var nopeData = data.nopes.filter(getPath);
70629                 var nopes = selection.selectAll('.area.target-nope')
70630                     .filter(function(d) { return filter(d.properties.entity); })
70631                     .data(nopeData, function key(d) { return d.id; });
70632
70633                 // exit
70634                 nopes.exit()
70635                     .remove();
70636
70637                 // enter/update
70638                 nopes.enter()
70639                     .append('path')
70640                     .merge(nopes)
70641                     .attr('d', getPath)
70642                     .attr('class', function(d) { return 'way area target target-nope ' + nopeClass + d.id; });
70643             }
70644
70645
70646             function drawAreas(selection, graph, entities, filter) {
70647                 var path = svgPath(projection, graph, true);
70648                 var areas = {};
70649                 var multipolygon;
70650
70651                 for (var i = 0; i < entities.length; i++) {
70652                     var entity = entities[i];
70653                     if (entity.geometry(graph) !== 'area') continue;
70654
70655                     multipolygon = osmIsOldMultipolygonOuterMember(entity, graph);
70656                     if (multipolygon) {
70657                         areas[multipolygon.id] = {
70658                             entity: multipolygon.mergeTags(entity.tags),
70659                             area: Math.abs(entity.area(graph))
70660                         };
70661                     } else if (!areas[entity.id]) {
70662                         areas[entity.id] = {
70663                             entity: entity,
70664                             area: Math.abs(entity.area(graph))
70665                         };
70666                     }
70667                 }
70668
70669                 var fills = Object.values(areas).filter(function hasPath(a) { return path(a.entity); });
70670                 fills.sort(function areaSort(a, b) { return b.area - a.area; });
70671                 fills = fills.map(function(a) { return a.entity; });
70672
70673                 var strokes = fills.filter(function(area) { return area.type === 'way'; });
70674
70675                 var data = {
70676                     clip: fills,
70677                     shadow: strokes,
70678                     stroke: strokes,
70679                     fill: fills
70680                 };
70681
70682                 var clipPaths = context.surface().selectAll('defs').selectAll('.clipPath-osm')
70683                    .filter(filter)
70684                    .data(data.clip, osmEntity.key);
70685
70686                 clipPaths.exit()
70687                    .remove();
70688
70689                 var clipPathsEnter = clipPaths.enter()
70690                    .append('clipPath')
70691                    .attr('class', 'clipPath-osm')
70692                    .attr('id', function(entity) { return entity.id + '-clippath'; });
70693
70694                 clipPathsEnter
70695                    .append('path');
70696
70697                 clipPaths.merge(clipPathsEnter)
70698                    .selectAll('path')
70699                    .attr('d', path);
70700
70701
70702                 var drawLayer = selection.selectAll('.layer-osm.areas');
70703                 var touchLayer = selection.selectAll('.layer-touch.areas');
70704
70705                 // Draw areas..
70706                 var areagroup = drawLayer
70707                     .selectAll('g.areagroup')
70708                     .data(['fill', 'shadow', 'stroke']);
70709
70710                 areagroup = areagroup.enter()
70711                     .append('g')
70712                     .attr('class', function(d) { return 'areagroup area-' + d; })
70713                     .merge(areagroup);
70714
70715                 var paths = areagroup
70716                     .selectAll('path')
70717                     .filter(filter)
70718                     .data(function(layer) { return data[layer]; }, osmEntity.key);
70719
70720                 paths.exit()
70721                     .remove();
70722
70723
70724                 var fillpaths = selection.selectAll('.area-fill path.area').nodes();
70725                 var bisect = d3_bisector(function(node) { return -node.__data__.area(graph); }).left;
70726
70727                 function sortedByArea(entity) {
70728                     if (this._parent.__data__ === 'fill') {
70729                         return fillpaths[bisect(fillpaths, -entity.area(graph))];
70730                     }
70731                 }
70732
70733                 paths = paths.enter()
70734                     .insert('path', sortedByArea)
70735                     .merge(paths)
70736                     .each(function(entity) {
70737                         var layer = this.parentNode.__data__;
70738                         this.setAttribute('class', entity.type + ' area ' + layer + ' ' + entity.id);
70739
70740                         if (layer === 'fill') {
70741                             this.setAttribute('clip-path', 'url(#' + entity.id + '-clippath)');
70742                             setPattern.call(this, entity);
70743                         }
70744                     })
70745                     .call(svgTagClasses())
70746                     .attr('d', path);
70747
70748
70749                 // Draw touch targets..
70750                 touchLayer
70751                     .call(drawTargets, graph, data.stroke, filter);
70752             }
70753
70754             return drawAreas;
70755         }
70756
70757         //[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]
70758         //[4a]          NameChar           ::=          NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
70759         //[5]           Name       ::=          NameStartChar (NameChar)*
70760         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
70761         var nameChar = new RegExp("[\\-\\.0-9"+nameStartChar.source.slice(1,-1)+"\\u00B7\\u0300-\\u036F\\u203F-\\u2040]");
70762         var tagNamePattern = new RegExp('^'+nameStartChar.source+nameChar.source+'*(?:\:'+nameStartChar.source+nameChar.source+'*)?$');
70763         //var tagNamePattern = /^[a-zA-Z_][\w\-\.]*(?:\:[a-zA-Z_][\w\-\.]*)?$/
70764         //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(',')
70765
70766         //S_TAG,        S_ATTR, S_EQ,   S_ATTR_NOQUOT_VALUE
70767         //S_ATTR_SPACE, S_ATTR_END,     S_TAG_SPACE, S_TAG_CLOSE
70768         var S_TAG = 0;//tag name offerring
70769         var S_ATTR = 1;//attr name offerring 
70770         var S_ATTR_SPACE=2;//attr name end and space offer
70771         var S_EQ = 3;//=space?
70772         var S_ATTR_NOQUOT_VALUE = 4;//attr value(no quot value only)
70773         var S_ATTR_END = 5;//attr value end and no space(quot end)
70774         var S_TAG_SPACE = 6;//(attr value end || tag end ) && (space offer)
70775         var S_TAG_CLOSE = 7;//closed el<el />
70776
70777         function XMLReader(){
70778                 
70779         }
70780
70781         XMLReader.prototype = {
70782                 parse:function(source,defaultNSMap,entityMap){
70783                         var domBuilder = this.domBuilder;
70784                         domBuilder.startDocument();
70785                         _copy(defaultNSMap ,defaultNSMap = {});
70786                         parse(source,defaultNSMap,entityMap,
70787                                         domBuilder,this.errorHandler);
70788                         domBuilder.endDocument();
70789                 }
70790         };
70791         function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){
70792                 function fixedFromCharCode(code) {
70793                         // String.prototype.fromCharCode does not supports
70794                         // > 2 bytes unicode chars directly
70795                         if (code > 0xffff) {
70796                                 code -= 0x10000;
70797                                 var surrogate1 = 0xd800 + (code >> 10)
70798                                         , surrogate2 = 0xdc00 + (code & 0x3ff);
70799
70800                                 return String.fromCharCode(surrogate1, surrogate2);
70801                         } else {
70802                                 return String.fromCharCode(code);
70803                         }
70804                 }
70805                 function entityReplacer(a){
70806                         var k = a.slice(1,-1);
70807                         if(k in entityMap){
70808                                 return entityMap[k]; 
70809                         }else if(k.charAt(0) === '#'){
70810                                 return fixedFromCharCode(parseInt(k.substr(1).replace('x','0x')))
70811                         }else{
70812                                 errorHandler.error('entity not found:'+a);
70813                                 return a;
70814                         }
70815                 }
70816                 function appendText(end){//has some bugs
70817                         if(end>start){
70818                                 var xt = source.substring(start,end).replace(/&#?\w+;/g,entityReplacer);
70819                                 locator&&position(start);
70820                                 domBuilder.characters(xt,0,end-start);
70821                                 start = end;
70822                         }
70823                 }
70824                 function position(p,m){
70825                         while(p>=lineEnd && (m = linePattern.exec(source))){
70826                                 lineStart = m.index;
70827                                 lineEnd = lineStart + m[0].length;
70828                                 locator.lineNumber++;
70829                                 //console.log('line++:',locator,startPos,endPos)
70830                         }
70831                         locator.columnNumber = p-lineStart+1;
70832                 }
70833                 var lineStart = 0;
70834                 var lineEnd = 0;
70835                 var linePattern = /.*(?:\r\n?|\n)|.*$/g;
70836                 var locator = domBuilder.locator;
70837                 
70838                 var parseStack = [{currentNSMap:defaultNSMapCopy}];
70839                 var closeMap = {};
70840                 var start = 0;
70841                 while(true){
70842                         try{
70843                                 var tagStart = source.indexOf('<',start);
70844                                 if(tagStart<0){
70845                                         if(!source.substr(start).match(/^\s*$/)){
70846                                                 var doc = domBuilder.doc;
70847                                         var text = doc.createTextNode(source.substr(start));
70848                                         doc.appendChild(text);
70849                                         domBuilder.currentElement = text;
70850                                         }
70851                                         return;
70852                                 }
70853                                 if(tagStart>start){
70854                                         appendText(tagStart);
70855                                 }
70856                                 switch(source.charAt(tagStart+1)){
70857                                 case '/':
70858                                         var end = source.indexOf('>',tagStart+3);
70859                                         var tagName = source.substring(tagStart+2,end);
70860                                         var config = parseStack.pop();
70861                                         if(end<0){
70862                                                 
70863                                         tagName = source.substring(tagStart+2).replace(/[\s<].*/,'');
70864                                         //console.error('#@@@@@@'+tagName)
70865                                         errorHandler.error("end tag name: "+tagName+' is not complete:'+config.tagName);
70866                                         end = tagStart+1+tagName.length;
70867                                 }else if(tagName.match(/\s</)){
70868                                         tagName = tagName.replace(/[\s<].*/,'');
70869                                         errorHandler.error("end tag name: "+tagName+' maybe not complete');
70870                                         end = tagStart+1+tagName.length;
70871                                         }
70872                                         //console.error(parseStack.length,parseStack)
70873                                         //console.error(config);
70874                                         var localNSMap = config.localNSMap;
70875                                         var endMatch = config.tagName == tagName;
70876                                         var endIgnoreCaseMach = endMatch || config.tagName&&config.tagName.toLowerCase() == tagName.toLowerCase();
70877                                 if(endIgnoreCaseMach){
70878                                         domBuilder.endElement(config.uri,config.localName,tagName);
70879                                                 if(localNSMap){
70880                                                         for(var prefix in localNSMap){
70881                                                                 domBuilder.endPrefixMapping(prefix) ;
70882                                                         }
70883                                                 }
70884                                                 if(!endMatch){
70885                                         errorHandler.fatalError("end tag name: "+tagName+' is not match the current start tagName:'+config.tagName );
70886                                                 }
70887                                 }else{
70888                                         parseStack.push(config);
70889                                 }
70890                                         
70891                                         end++;
70892                                         break;
70893                                         // end elment
70894                                 case '?':// <?...?>
70895                                         locator&&position(tagStart);
70896                                         end = parseInstruction(source,tagStart,domBuilder);
70897                                         break;
70898                                 case '!':// <!doctype,<![CDATA,<!--
70899                                         locator&&position(tagStart);
70900                                         end = parseDCC(source,tagStart,domBuilder,errorHandler);
70901                                         break;
70902                                 default:
70903                                         locator&&position(tagStart);
70904                                         var el = new ElementAttributes();
70905                                         var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
70906                                         //elStartEnd
70907                                         var end = parseElementStartPart(source,tagStart,el,currentNSMap,entityReplacer,errorHandler);
70908                                         var len = el.length;
70909                                         
70910                                         
70911                                         if(!el.closed && fixSelfClosed(source,end,el.tagName,closeMap)){
70912                                                 el.closed = true;
70913                                                 if(!entityMap.nbsp){
70914                                                         errorHandler.warning('unclosed xml attribute');
70915                                                 }
70916                                         }
70917                                         if(locator && len){
70918                                                 var locator2 = copyLocator(locator,{});
70919                                                 //try{//attribute position fixed
70920                                                 for(var i = 0;i<len;i++){
70921                                                         var a = el[i];
70922                                                         position(a.offset);
70923                                                         a.locator = copyLocator(locator,{});
70924                                                 }
70925                                                 //}catch(e){console.error('@@@@@'+e)}
70926                                                 domBuilder.locator = locator2;
70927                                                 if(appendElement(el,domBuilder,currentNSMap)){
70928                                                         parseStack.push(el);
70929                                                 }
70930                                                 domBuilder.locator = locator;
70931                                         }else{
70932                                                 if(appendElement(el,domBuilder,currentNSMap)){
70933                                                         parseStack.push(el);
70934                                                 }
70935                                         }
70936                                         
70937                                         
70938                                         
70939                                         if(el.uri === 'http://www.w3.org/1999/xhtml' && !el.closed){
70940                                                 end = parseHtmlSpecialContent(source,end,el.tagName,entityReplacer,domBuilder);
70941                                         }else{
70942                                                 end++;
70943                                         }
70944                                 }
70945                         }catch(e){
70946                                 errorHandler.error('element parse error: '+e);
70947                                 //errorHandler.error('element parse error: '+e);
70948                                 end = -1;
70949                                 //throw e;
70950                         }
70951                         if(end>start){
70952                                 start = end;
70953                         }else{
70954                                 //TODO: 这里有可能sax回退,有位置错误风险
70955                                 appendText(Math.max(tagStart,start)+1);
70956                         }
70957                 }
70958         }
70959         function copyLocator(f,t){
70960                 t.lineNumber = f.lineNumber;
70961                 t.columnNumber = f.columnNumber;
70962                 return t;
70963         }
70964
70965         /**
70966          * @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack);
70967          * @return end of the elementStartPart(end of elementEndPart for selfClosed el)
70968          */
70969         function parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){
70970                 var attrName;
70971                 var value;
70972                 var p = ++start;
70973                 var s = S_TAG;//status
70974                 while(true){
70975                         var c = source.charAt(p);
70976                         switch(c){
70977                         case '=':
70978                                 if(s === S_ATTR){//attrName
70979                                         attrName = source.slice(start,p);
70980                                         s = S_EQ;
70981                                 }else if(s === S_ATTR_SPACE){
70982                                         s = S_EQ;
70983                                 }else{
70984                                         //fatalError: equal must after attrName or space after attrName
70985                                         throw new Error('attribute equal must after attrName');
70986                                 }
70987                                 break;
70988                         case '\'':
70989                         case '"':
70990                                 if(s === S_EQ || s === S_ATTR //|| s == S_ATTR_SPACE
70991                                         ){//equal
70992                                         if(s === S_ATTR){
70993                                                 errorHandler.warning('attribute value must after "="');
70994                                                 attrName = source.slice(start,p);
70995                                         }
70996                                         start = p+1;
70997                                         p = source.indexOf(c,start);
70998                                         if(p>0){
70999                                                 value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
71000                                                 el.add(attrName,value,start-1);
71001                                                 s = S_ATTR_END;
71002                                         }else{
71003                                                 //fatalError: no end quot match
71004                                                 throw new Error('attribute value no end \''+c+'\' match');
71005                                         }
71006                                 }else if(s == S_ATTR_NOQUOT_VALUE){
71007                                         value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
71008                                         //console.log(attrName,value,start,p)
71009                                         el.add(attrName,value,start);
71010                                         //console.dir(el)
71011                                         errorHandler.warning('attribute "'+attrName+'" missed start quot('+c+')!!');
71012                                         start = p+1;
71013                                         s = S_ATTR_END;
71014                                 }else{
71015                                         //fatalError: no equal before
71016                                         throw new Error('attribute value must after "="');
71017                                 }
71018                                 break;
71019                         case '/':
71020                                 switch(s){
71021                                 case S_TAG:
71022                                         el.setTagName(source.slice(start,p));
71023                                 case S_ATTR_END:
71024                                 case S_TAG_SPACE:
71025                                 case S_TAG_CLOSE:
71026                                         s =S_TAG_CLOSE;
71027                                         el.closed = true;
71028                                 case S_ATTR_NOQUOT_VALUE:
71029                                 case S_ATTR:
71030                                 case S_ATTR_SPACE:
71031                                         break;
71032                                 //case S_EQ:
71033                                 default:
71034                                         throw new Error("attribute invalid close char('/')")
71035                                 }
71036                                 break;
71037                         case ''://end document
71038                                 //throw new Error('unexpected end of input')
71039                                 errorHandler.error('unexpected end of input');
71040                                 if(s == S_TAG){
71041                                         el.setTagName(source.slice(start,p));
71042                                 }
71043                                 return p;
71044                         case '>':
71045                                 switch(s){
71046                                 case S_TAG:
71047                                         el.setTagName(source.slice(start,p));
71048                                 case S_ATTR_END:
71049                                 case S_TAG_SPACE:
71050                                 case S_TAG_CLOSE:
71051                                         break;//normal
71052                                 case S_ATTR_NOQUOT_VALUE://Compatible state
71053                                 case S_ATTR:
71054                                         value = source.slice(start,p);
71055                                         if(value.slice(-1) === '/'){
71056                                                 el.closed  = true;
71057                                                 value = value.slice(0,-1);
71058                                         }
71059                                 case S_ATTR_SPACE:
71060                                         if(s === S_ATTR_SPACE){
71061                                                 value = attrName;
71062                                         }
71063                                         if(s == S_ATTR_NOQUOT_VALUE){
71064                                                 errorHandler.warning('attribute "'+value+'" missed quot(")!!');
71065                                                 el.add(attrName,value.replace(/&#?\w+;/g,entityReplacer),start);
71066                                         }else{
71067                                                 if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !value.match(/^(?:disabled|checked|selected)$/i)){
71068                                                         errorHandler.warning('attribute "'+value+'" missed value!! "'+value+'" instead!!');
71069                                                 }
71070                                                 el.add(value,value,start);
71071                                         }
71072                                         break;
71073                                 case S_EQ:
71074                                         throw new Error('attribute value missed!!');
71075                                 }
71076         //                      console.log(tagName,tagNamePattern,tagNamePattern.test(tagName))
71077                                 return p;
71078                         /*xml space '\x20' | #x9 | #xD | #xA; */
71079                         case '\u0080':
71080                                 c = ' ';
71081                         default:
71082                                 if(c<= ' '){//space
71083                                         switch(s){
71084                                         case S_TAG:
71085                                                 el.setTagName(source.slice(start,p));//tagName
71086                                                 s = S_TAG_SPACE;
71087                                                 break;
71088                                         case S_ATTR:
71089                                                 attrName = source.slice(start,p);
71090                                                 s = S_ATTR_SPACE;
71091                                                 break;
71092                                         case S_ATTR_NOQUOT_VALUE:
71093                                                 var value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
71094                                                 errorHandler.warning('attribute "'+value+'" missed quot(")!!');
71095                                                 el.add(attrName,value,start);
71096                                         case S_ATTR_END:
71097                                                 s = S_TAG_SPACE;
71098                                                 break;
71099                                         //case S_TAG_SPACE:
71100                                         //case S_EQ:
71101                                         //case S_ATTR_SPACE:
71102                                         //      void();break;
71103                                         //case S_TAG_CLOSE:
71104                                                 //ignore warning
71105                                         }
71106                                 }else{//not space
71107         //S_TAG,        S_ATTR, S_EQ,   S_ATTR_NOQUOT_VALUE
71108         //S_ATTR_SPACE, S_ATTR_END,     S_TAG_SPACE, S_TAG_CLOSE
71109                                         switch(s){
71110                                         //case S_TAG:void();break;
71111                                         //case S_ATTR:void();break;
71112                                         //case S_ATTR_NOQUOT_VALUE:void();break;
71113                                         case S_ATTR_SPACE:
71114                                                 var tagName =  el.tagName;
71115                                                 if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !attrName.match(/^(?:disabled|checked|selected)$/i)){
71116                                                         errorHandler.warning('attribute "'+attrName+'" missed value!! "'+attrName+'" instead2!!');
71117                                                 }
71118                                                 el.add(attrName,attrName,start);
71119                                                 start = p;
71120                                                 s = S_ATTR;
71121                                                 break;
71122                                         case S_ATTR_END:
71123                                                 errorHandler.warning('attribute space is required"'+attrName+'"!!');
71124                                         case S_TAG_SPACE:
71125                                                 s = S_ATTR;
71126                                                 start = p;
71127                                                 break;
71128                                         case S_EQ:
71129                                                 s = S_ATTR_NOQUOT_VALUE;
71130                                                 start = p;
71131                                                 break;
71132                                         case S_TAG_CLOSE:
71133                                                 throw new Error("elements closed character '/' and '>' must be connected to");
71134                                         }
71135                                 }
71136                         }//end outer switch
71137                         //console.log('p++',p)
71138                         p++;
71139                 }
71140         }
71141         /**
71142          * @return true if has new namespace define
71143          */
71144         function appendElement(el,domBuilder,currentNSMap){
71145                 var tagName = el.tagName;
71146                 var localNSMap = null;
71147                 //var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
71148                 var i = el.length;
71149                 while(i--){
71150                         var a = el[i];
71151                         var qName = a.qName;
71152                         var value = a.value;
71153                         var nsp = qName.indexOf(':');
71154                         if(nsp>0){
71155                                 var prefix = a.prefix = qName.slice(0,nsp);
71156                                 var localName = qName.slice(nsp+1);
71157                                 var nsPrefix = prefix === 'xmlns' && localName;
71158                         }else{
71159                                 localName = qName;
71160                                 prefix = null;
71161                                 nsPrefix = qName === 'xmlns' && '';
71162                         }
71163                         //can not set prefix,because prefix !== ''
71164                         a.localName = localName ;
71165                         //prefix == null for no ns prefix attribute 
71166                         if(nsPrefix !== false){//hack!!
71167                                 if(localNSMap == null){
71168                                         localNSMap = {};
71169                                         //console.log(currentNSMap,0)
71170                                         _copy(currentNSMap,currentNSMap={});
71171                                         //console.log(currentNSMap,1)
71172                                 }
71173                                 currentNSMap[nsPrefix] = localNSMap[nsPrefix] = value;
71174                                 a.uri = 'http://www.w3.org/2000/xmlns/';
71175                                 domBuilder.startPrefixMapping(nsPrefix, value); 
71176                         }
71177                 }
71178                 var i = el.length;
71179                 while(i--){
71180                         a = el[i];
71181                         var prefix = a.prefix;
71182                         if(prefix){//no prefix attribute has no namespace
71183                                 if(prefix === 'xml'){
71184                                         a.uri = 'http://www.w3.org/XML/1998/namespace';
71185                                 }if(prefix !== 'xmlns'){
71186                                         a.uri = currentNSMap[prefix || ''];
71187                                         
71188                                         //{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)}
71189                                 }
71190                         }
71191                 }
71192                 var nsp = tagName.indexOf(':');
71193                 if(nsp>0){
71194                         prefix = el.prefix = tagName.slice(0,nsp);
71195                         localName = el.localName = tagName.slice(nsp+1);
71196                 }else{
71197                         prefix = null;//important!!
71198                         localName = el.localName = tagName;
71199                 }
71200                 //no prefix element has default namespace
71201                 var ns = el.uri = currentNSMap[prefix || ''];
71202                 domBuilder.startElement(ns,localName,tagName,el);
71203                 //endPrefixMapping and startPrefixMapping have not any help for dom builder
71204                 //localNSMap = null
71205                 if(el.closed){
71206                         domBuilder.endElement(ns,localName,tagName);
71207                         if(localNSMap){
71208                                 for(prefix in localNSMap){
71209                                         domBuilder.endPrefixMapping(prefix); 
71210                                 }
71211                         }
71212                 }else{
71213                         el.currentNSMap = currentNSMap;
71214                         el.localNSMap = localNSMap;
71215                         //parseStack.push(el);
71216                         return true;
71217                 }
71218         }
71219         function parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){
71220                 if(/^(?:script|textarea)$/i.test(tagName)){
71221                         var elEndStart =  source.indexOf('</'+tagName+'>',elStartEnd);
71222                         var text = source.substring(elStartEnd+1,elEndStart);
71223                         if(/[&<]/.test(text)){
71224                                 if(/^script$/i.test(tagName)){
71225                                         //if(!/\]\]>/.test(text)){
71226                                                 //lexHandler.startCDATA();
71227                                                 domBuilder.characters(text,0,text.length);
71228                                                 //lexHandler.endCDATA();
71229                                                 return elEndStart;
71230                                         //}
71231                                 }//}else{//text area
71232                                         text = text.replace(/&#?\w+;/g,entityReplacer);
71233                                         domBuilder.characters(text,0,text.length);
71234                                         return elEndStart;
71235                                 //}
71236                                 
71237                         }
71238                 }
71239                 return elStartEnd+1;
71240         }
71241         function fixSelfClosed(source,elStartEnd,tagName,closeMap){
71242                 //if(tagName in closeMap){
71243                 var pos = closeMap[tagName];
71244                 if(pos == null){
71245                         //console.log(tagName)
71246                         pos =  source.lastIndexOf('</'+tagName+'>');
71247                         if(pos<elStartEnd){//忘记闭合
71248                                 pos = source.lastIndexOf('</'+tagName);
71249                         }
71250                         closeMap[tagName] =pos;
71251                 }
71252                 return pos<elStartEnd;
71253                 //} 
71254         }
71255         function _copy(source,target){
71256                 for(var n in source){target[n] = source[n];}
71257         }
71258         function parseDCC(source,start,domBuilder,errorHandler){//sure start with '<!'
71259                 var next= source.charAt(start+2);
71260                 switch(next){
71261                 case '-':
71262                         if(source.charAt(start + 3) === '-'){
71263                                 var end = source.indexOf('-->',start+4);
71264                                 //append comment source.substring(4,end)//<!--
71265                                 if(end>start){
71266                                         domBuilder.comment(source,start+4,end-start-4);
71267                                         return end+3;
71268                                 }else{
71269                                         errorHandler.error("Unclosed comment");
71270                                         return -1;
71271                                 }
71272                         }else{
71273                                 //error
71274                                 return -1;
71275                         }
71276                 default:
71277                         if(source.substr(start+3,6) == 'CDATA['){
71278                                 var end = source.indexOf(']]>',start+9);
71279                                 domBuilder.startCDATA();
71280                                 domBuilder.characters(source,start+9,end-start-9);
71281                                 domBuilder.endCDATA(); 
71282                                 return end+3;
71283                         }
71284                         //<!DOCTYPE
71285                         //startDTD(java.lang.String name, java.lang.String publicId, java.lang.String systemId) 
71286                         var matchs = split(source,start);
71287                         var len = matchs.length;
71288                         if(len>1 && /!doctype/i.test(matchs[0][0])){
71289                                 var name = matchs[1][0];
71290                                 var pubid = len>3 && /^public$/i.test(matchs[2][0]) && matchs[3][0];
71291                                 var sysid = len>4 && matchs[4][0];
71292                                 var lastMatch = matchs[len-1];
71293                                 domBuilder.startDTD(name,pubid && pubid.replace(/^(['"])(.*?)\1$/,'$2'),
71294                                                 sysid && sysid.replace(/^(['"])(.*?)\1$/,'$2'));
71295                                 domBuilder.endDTD();
71296                                 
71297                                 return lastMatch.index+lastMatch[0].length
71298                         }
71299                 }
71300                 return -1;
71301         }
71302
71303
71304
71305         function parseInstruction(source,start,domBuilder){
71306                 var end = source.indexOf('?>',start);
71307                 if(end){
71308                         var match = source.substring(start,end).match(/^<\?(\S*)\s*([\s\S]*?)\s*$/);
71309                         if(match){
71310                                 var len = match[0].length;
71311                                 domBuilder.processingInstruction(match[1], match[2]) ;
71312                                 return end+2;
71313                         }else{//error
71314                                 return -1;
71315                         }
71316                 }
71317                 return -1;
71318         }
71319
71320         /**
71321          * @param source
71322          */
71323         function ElementAttributes(source){
71324                 
71325         }
71326         ElementAttributes.prototype = {
71327                 setTagName:function(tagName){
71328                         if(!tagNamePattern.test(tagName)){
71329                                 throw new Error('invalid tagName:'+tagName)
71330                         }
71331                         this.tagName = tagName;
71332                 },
71333                 add:function(qName,value,offset){
71334                         if(!tagNamePattern.test(qName)){
71335                                 throw new Error('invalid attribute:'+qName)
71336                         }
71337                         this[this.length++] = {qName:qName,value:value,offset:offset};
71338                 },
71339                 length:0,
71340                 getLocalName:function(i){return this[i].localName},
71341                 getLocator:function(i){return this[i].locator},
71342                 getQName:function(i){return this[i].qName},
71343                 getURI:function(i){return this[i].uri},
71344                 getValue:function(i){return this[i].value}
71345         //      ,getIndex:function(uri, localName)){
71346         //              if(localName){
71347         //                      
71348         //              }else{
71349         //                      var qName = uri
71350         //              }
71351         //      },
71352         //      getValue:function(){return this.getValue(this.getIndex.apply(this,arguments))},
71353         //      getType:function(uri,localName){}
71354         //      getType:function(i){},
71355         };
71356
71357
71358
71359
71360         function _set_proto_(thiz,parent){
71361                 thiz.__proto__ = parent;
71362                 return thiz;
71363         }
71364         if(!(_set_proto_({},_set_proto_.prototype) instanceof _set_proto_)){
71365                 _set_proto_ = function(thiz,parent){
71366                         function p(){}          p.prototype = parent;
71367                         p = new p();
71368                         for(parent in thiz){
71369                                 p[parent] = thiz[parent];
71370                         }
71371                         return p;
71372                 };
71373         }
71374
71375         function split(source,start){
71376                 var match;
71377                 var buf = [];
71378                 var reg = /'[^']+'|"[^"]+"|[^\s<>\/=]+=?|(\/?\s*>|<)/g;
71379                 reg.lastIndex = start;
71380                 reg.exec(source);//skip <
71381                 while(match = reg.exec(source)){
71382                         buf.push(match);
71383                         if(match[1])return buf;
71384                 }
71385         }
71386
71387         var XMLReader_1 = XMLReader;
71388
71389         var sax = {
71390                 XMLReader: XMLReader_1
71391         };
71392
71393         /*
71394          * DOM Level 2
71395          * Object DOMException
71396          * @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html
71397          * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html
71398          */
71399
71400         function copy$3(src,dest){
71401                 for(var p in src){
71402                         dest[p] = src[p];
71403                 }
71404         }
71405         /**
71406         ^\w+\.prototype\.([_\w]+)\s*=\s*((?:.*\{\s*?[\r\n][\s\S]*?^})|\S.*?(?=[;\r\n]));?
71407         ^\w+\.prototype\.([_\w]+)\s*=\s*(\S.*?(?=[;\r\n]));?
71408          */
71409         function _extends(Class,Super){
71410                 var pt = Class.prototype;
71411                 if(Object.create){
71412                         var ppt = Object.create(Super.prototype);
71413                         pt.__proto__ = ppt;
71414                 }
71415                 if(!(pt instanceof Super)){
71416                         function t(){}          t.prototype = Super.prototype;
71417                         t = new t();
71418                         copy$3(pt,t);
71419                         Class.prototype = pt = t;
71420                 }
71421                 if(pt.constructor != Class){
71422                         if(typeof Class != 'function'){
71423                                 console.error("unknow Class:"+Class);
71424                         }
71425                         pt.constructor = Class;
71426                 }
71427         }
71428         var htmlns = 'http://www.w3.org/1999/xhtml' ;
71429         // Node Types
71430         var NodeType = {};
71431         var ELEMENT_NODE                = NodeType.ELEMENT_NODE                = 1;
71432         var ATTRIBUTE_NODE              = NodeType.ATTRIBUTE_NODE              = 2;
71433         var TEXT_NODE                   = NodeType.TEXT_NODE                   = 3;
71434         var CDATA_SECTION_NODE          = NodeType.CDATA_SECTION_NODE          = 4;
71435         var ENTITY_REFERENCE_NODE       = NodeType.ENTITY_REFERENCE_NODE       = 5;
71436         var ENTITY_NODE                 = NodeType.ENTITY_NODE                 = 6;
71437         var PROCESSING_INSTRUCTION_NODE = NodeType.PROCESSING_INSTRUCTION_NODE = 7;
71438         var COMMENT_NODE                = NodeType.COMMENT_NODE                = 8;
71439         var DOCUMENT_NODE               = NodeType.DOCUMENT_NODE               = 9;
71440         var DOCUMENT_TYPE_NODE          = NodeType.DOCUMENT_TYPE_NODE          = 10;
71441         var DOCUMENT_FRAGMENT_NODE      = NodeType.DOCUMENT_FRAGMENT_NODE      = 11;
71442         var NOTATION_NODE               = NodeType.NOTATION_NODE               = 12;
71443
71444         // ExceptionCode
71445         var ExceptionCode = {};
71446         var ExceptionMessage = {};
71447         var INDEX_SIZE_ERR              = ExceptionCode.INDEX_SIZE_ERR              = ((ExceptionMessage[1]="Index size error"),1);
71448         var DOMSTRING_SIZE_ERR          = ExceptionCode.DOMSTRING_SIZE_ERR          = ((ExceptionMessage[2]="DOMString size error"),2);
71449         var HIERARCHY_REQUEST_ERR       = ExceptionCode.HIERARCHY_REQUEST_ERR       = ((ExceptionMessage[3]="Hierarchy request error"),3);
71450         var WRONG_DOCUMENT_ERR          = ExceptionCode.WRONG_DOCUMENT_ERR          = ((ExceptionMessage[4]="Wrong document"),4);
71451         var INVALID_CHARACTER_ERR       = ExceptionCode.INVALID_CHARACTER_ERR       = ((ExceptionMessage[5]="Invalid character"),5);
71452         var NO_DATA_ALLOWED_ERR         = ExceptionCode.NO_DATA_ALLOWED_ERR         = ((ExceptionMessage[6]="No data allowed"),6);
71453         var NO_MODIFICATION_ALLOWED_ERR = ExceptionCode.NO_MODIFICATION_ALLOWED_ERR = ((ExceptionMessage[7]="No modification allowed"),7);
71454         var NOT_FOUND_ERR               = ExceptionCode.NOT_FOUND_ERR               = ((ExceptionMessage[8]="Not found"),8);
71455         var NOT_SUPPORTED_ERR           = ExceptionCode.NOT_SUPPORTED_ERR           = ((ExceptionMessage[9]="Not supported"),9);
71456         var INUSE_ATTRIBUTE_ERR         = ExceptionCode.INUSE_ATTRIBUTE_ERR         = ((ExceptionMessage[10]="Attribute in use"),10);
71457         //level2
71458         var INVALID_STATE_ERR           = ExceptionCode.INVALID_STATE_ERR               = ((ExceptionMessage[11]="Invalid state"),11);
71459         var SYNTAX_ERR                  = ExceptionCode.SYNTAX_ERR                      = ((ExceptionMessage[12]="Syntax error"),12);
71460         var INVALID_MODIFICATION_ERR    = ExceptionCode.INVALID_MODIFICATION_ERR        = ((ExceptionMessage[13]="Invalid modification"),13);
71461         var NAMESPACE_ERR               = ExceptionCode.NAMESPACE_ERR                   = ((ExceptionMessage[14]="Invalid namespace"),14);
71462         var INVALID_ACCESS_ERR          = ExceptionCode.INVALID_ACCESS_ERR              = ((ExceptionMessage[15]="Invalid access"),15);
71463
71464
71465         function DOMException$2(code, message) {
71466                 if(message instanceof Error){
71467                         var error = message;
71468                 }else{
71469                         error = this;
71470                         Error.call(this, ExceptionMessage[code]);
71471                         this.message = ExceptionMessage[code];
71472                         if(Error.captureStackTrace) Error.captureStackTrace(this, DOMException$2);
71473                 }
71474                 error.code = code;
71475                 if(message) this.message = this.message + ": " + message;
71476                 return error;
71477         }DOMException$2.prototype = Error.prototype;
71478         copy$3(ExceptionCode,DOMException$2);
71479         /**
71480          * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177
71481          * 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.
71482          * The items in the NodeList are accessible via an integral index, starting from 0.
71483          */
71484         function NodeList() {
71485         }NodeList.prototype = {
71486                 /**
71487                  * The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive.
71488                  * @standard level1
71489                  */
71490                 length:0, 
71491                 /**
71492                  * 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.
71493                  * @standard level1
71494                  * @param index  unsigned long 
71495                  *   Index into the collection.
71496                  * @return Node
71497                  *      The node at the indexth position in the NodeList, or null if that is not a valid index. 
71498                  */
71499                 item: function(index) {
71500                         return this[index] || null;
71501                 },
71502                 toString:function(isHTML,nodeFilter){
71503                         for(var buf = [], i = 0;i<this.length;i++){
71504                                 serializeToString(this[i],buf,isHTML,nodeFilter);
71505                         }
71506                         return buf.join('');
71507                 }
71508         };
71509         function LiveNodeList(node,refresh){
71510                 this._node = node;
71511                 this._refresh = refresh;
71512                 _updateLiveList(this);
71513         }
71514         function _updateLiveList(list){
71515                 var inc = list._node._inc || list._node.ownerDocument._inc;
71516                 if(list._inc != inc){
71517                         var ls = list._refresh(list._node);
71518                         //console.log(ls.length)
71519                         __set__(list,'length',ls.length);
71520                         copy$3(ls,list);
71521                         list._inc = inc;
71522                 }
71523         }
71524         LiveNodeList.prototype.item = function(i){
71525                 _updateLiveList(this);
71526                 return this[i];
71527         };
71528
71529         _extends(LiveNodeList,NodeList);
71530         /**
71531          * 
71532          * 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.
71533          * NamedNodeMap objects in the DOM are live.
71534          * used for attributes or DocumentType entities 
71535          */
71536         function NamedNodeMap() {
71537         }
71538         function _findNodeIndex(list,node){
71539                 var i = list.length;
71540                 while(i--){
71541                         if(list[i] === node){return i}
71542                 }
71543         }
71544
71545         function _addNamedNode(el,list,newAttr,oldAttr){
71546                 if(oldAttr){
71547                         list[_findNodeIndex(list,oldAttr)] = newAttr;
71548                 }else{
71549                         list[list.length++] = newAttr;
71550                 }
71551                 if(el){
71552                         newAttr.ownerElement = el;
71553                         var doc = el.ownerDocument;
71554                         if(doc){
71555                                 oldAttr && _onRemoveAttribute(doc,el,oldAttr);
71556                                 _onAddAttribute(doc,el,newAttr);
71557                         }
71558                 }
71559         }
71560         function _removeNamedNode(el,list,attr){
71561                 //console.log('remove attr:'+attr)
71562                 var i = _findNodeIndex(list,attr);
71563                 if(i>=0){
71564                         var lastIndex = list.length-1;
71565                         while(i<lastIndex){
71566                                 list[i] = list[++i];
71567                         }
71568                         list.length = lastIndex;
71569                         if(el){
71570                                 var doc = el.ownerDocument;
71571                                 if(doc){
71572                                         _onRemoveAttribute(doc,el,attr);
71573                                         attr.ownerElement = null;
71574                                 }
71575                         }
71576                 }else{
71577                         throw DOMException$2(NOT_FOUND_ERR,new Error(el.tagName+'@'+attr))
71578                 }
71579         }
71580         NamedNodeMap.prototype = {
71581                 length:0,
71582                 item:NodeList.prototype.item,
71583                 getNamedItem: function(key) {
71584         //              if(key.indexOf(':')>0 || key == 'xmlns'){
71585         //                      return null;
71586         //              }
71587                         //console.log()
71588                         var i = this.length;
71589                         while(i--){
71590                                 var attr = this[i];
71591                                 //console.log(attr.nodeName,key)
71592                                 if(attr.nodeName == key){
71593                                         return attr;
71594                                 }
71595                         }
71596                 },
71597                 setNamedItem: function(attr) {
71598                         var el = attr.ownerElement;
71599                         if(el && el!=this._ownerElement){
71600                                 throw new DOMException$2(INUSE_ATTRIBUTE_ERR);
71601                         }
71602                         var oldAttr = this.getNamedItem(attr.nodeName);
71603                         _addNamedNode(this._ownerElement,this,attr,oldAttr);
71604                         return oldAttr;
71605                 },
71606                 /* returns Node */
71607                 setNamedItemNS: function(attr) {// raises: WRONG_DOCUMENT_ERR,NO_MODIFICATION_ALLOWED_ERR,INUSE_ATTRIBUTE_ERR
71608                         var el = attr.ownerElement, oldAttr;
71609                         if(el && el!=this._ownerElement){
71610                                 throw new DOMException$2(INUSE_ATTRIBUTE_ERR);
71611                         }
71612                         oldAttr = this.getNamedItemNS(attr.namespaceURI,attr.localName);
71613                         _addNamedNode(this._ownerElement,this,attr,oldAttr);
71614                         return oldAttr;
71615                 },
71616
71617                 /* returns Node */
71618                 removeNamedItem: function(key) {
71619                         var attr = this.getNamedItem(key);
71620                         _removeNamedNode(this._ownerElement,this,attr);
71621                         return attr;
71622                         
71623                         
71624                 },// raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR
71625                 
71626                 //for level2
71627                 removeNamedItemNS:function(namespaceURI,localName){
71628                         var attr = this.getNamedItemNS(namespaceURI,localName);
71629                         _removeNamedNode(this._ownerElement,this,attr);
71630                         return attr;
71631                 },
71632                 getNamedItemNS: function(namespaceURI, localName) {
71633                         var i = this.length;
71634                         while(i--){
71635                                 var node = this[i];
71636                                 if(node.localName == localName && node.namespaceURI == namespaceURI){
71637                                         return node;
71638                                 }
71639                         }
71640                         return null;
71641                 }
71642         };
71643         /**
71644          * @see http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490
71645          */
71646         function DOMImplementation(/* Object */ features) {
71647                 this._features = {};
71648                 if (features) {
71649                         for (var feature in features) {
71650                                  this._features = features[feature];
71651                         }
71652                 }
71653         }
71654         DOMImplementation.prototype = {
71655                 hasFeature: function(/* string */ feature, /* string */ version) {
71656                         var versions = this._features[feature.toLowerCase()];
71657                         if (versions && (!version || version in versions)) {
71658                                 return true;
71659                         } else {
71660                                 return false;
71661                         }
71662                 },
71663                 // Introduced in DOM Level 2:
71664                 createDocument:function(namespaceURI,  qualifiedName, doctype){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR,WRONG_DOCUMENT_ERR
71665                         var doc = new Document();
71666                         doc.implementation = this;
71667                         doc.childNodes = new NodeList();
71668                         doc.doctype = doctype;
71669                         if(doctype){
71670                                 doc.appendChild(doctype);
71671                         }
71672                         if(qualifiedName){
71673                                 var root = doc.createElementNS(namespaceURI,qualifiedName);
71674                                 doc.appendChild(root);
71675                         }
71676                         return doc;
71677                 },
71678                 // Introduced in DOM Level 2:
71679                 createDocumentType:function(qualifiedName, publicId, systemId){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR
71680                         var node = new DocumentType();
71681                         node.name = qualifiedName;
71682                         node.nodeName = qualifiedName;
71683                         node.publicId = publicId;
71684                         node.systemId = systemId;
71685                         // Introduced in DOM Level 2:
71686                         //readonly attribute DOMString        internalSubset;
71687                         
71688                         //TODO:..
71689                         //  readonly attribute NamedNodeMap     entities;
71690                         //  readonly attribute NamedNodeMap     notations;
71691                         return node;
71692                 }
71693         };
71694
71695
71696         /**
71697          * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247
71698          */
71699
71700         function Node$2() {
71701         }
71702         Node$2.prototype = {
71703                 firstChild : null,
71704                 lastChild : null,
71705                 previousSibling : null,
71706                 nextSibling : null,
71707                 attributes : null,
71708                 parentNode : null,
71709                 childNodes : null,
71710                 ownerDocument : null,
71711                 nodeValue : null,
71712                 namespaceURI : null,
71713                 prefix : null,
71714                 localName : null,
71715                 // Modified in DOM Level 2:
71716                 insertBefore:function(newChild, refChild){//raises 
71717                         return _insertBefore(this,newChild,refChild);
71718                 },
71719                 replaceChild:function(newChild, oldChild){//raises 
71720                         this.insertBefore(newChild,oldChild);
71721                         if(oldChild){
71722                                 this.removeChild(oldChild);
71723                         }
71724                 },
71725                 removeChild:function(oldChild){
71726                         return _removeChild(this,oldChild);
71727                 },
71728                 appendChild:function(newChild){
71729                         return this.insertBefore(newChild,null);
71730                 },
71731                 hasChildNodes:function(){
71732                         return this.firstChild != null;
71733                 },
71734                 cloneNode:function(deep){
71735                         return cloneNode(this.ownerDocument||this,this,deep);
71736                 },
71737                 // Modified in DOM Level 2:
71738                 normalize:function(){
71739                         var child = this.firstChild;
71740                         while(child){
71741                                 var next = child.nextSibling;
71742                                 if(next && next.nodeType == TEXT_NODE && child.nodeType == TEXT_NODE){
71743                                         this.removeChild(next);
71744                                         child.appendData(next.data);
71745                                 }else{
71746                                         child.normalize();
71747                                         child = next;
71748                                 }
71749                         }
71750                 },
71751                 // Introduced in DOM Level 2:
71752                 isSupported:function(feature, version){
71753                         return this.ownerDocument.implementation.hasFeature(feature,version);
71754                 },
71755             // Introduced in DOM Level 2:
71756             hasAttributes:function(){
71757                 return this.attributes.length>0;
71758             },
71759             lookupPrefix:function(namespaceURI){
71760                 var el = this;
71761                 while(el){
71762                         var map = el._nsMap;
71763                         //console.dir(map)
71764                         if(map){
71765                                 for(var n in map){
71766                                         if(map[n] == namespaceURI){
71767                                                 return n;
71768                                         }
71769                                 }
71770                         }
71771                         el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
71772                 }
71773                 return null;
71774             },
71775             // Introduced in DOM Level 3:
71776             lookupNamespaceURI:function(prefix){
71777                 var el = this;
71778                 while(el){
71779                         var map = el._nsMap;
71780                         //console.dir(map)
71781                         if(map){
71782                                 if(prefix in map){
71783                                         return map[prefix] ;
71784                                 }
71785                         }
71786                         el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
71787                 }
71788                 return null;
71789             },
71790             // Introduced in DOM Level 3:
71791             isDefaultNamespace:function(namespaceURI){
71792                 var prefix = this.lookupPrefix(namespaceURI);
71793                 return prefix == null;
71794             }
71795         };
71796
71797
71798         function _xmlEncoder(c){
71799                 return c == '<' && '&lt;' ||
71800                  c == '>' && '&gt;' ||
71801                  c == '&' && '&amp;' ||
71802                  c == '"' && '&quot;' ||
71803                  '&#'+c.charCodeAt()+';'
71804         }
71805
71806
71807         copy$3(NodeType,Node$2);
71808         copy$3(NodeType,Node$2.prototype);
71809
71810         /**
71811          * @param callback return true for continue,false for break
71812          * @return boolean true: break visit;
71813          */
71814         function _visitNode(node,callback){
71815                 if(callback(node)){
71816                         return true;
71817                 }
71818                 if(node = node.firstChild){
71819                         do{
71820                                 if(_visitNode(node,callback)){return true}
71821                 }while(node=node.nextSibling)
71822             }
71823         }
71824
71825
71826
71827         function Document(){
71828         }
71829         function _onAddAttribute(doc,el,newAttr){
71830                 doc && doc._inc++;
71831                 var ns = newAttr.namespaceURI ;
71832                 if(ns == 'http://www.w3.org/2000/xmlns/'){
71833                         //update namespace
71834                         el._nsMap[newAttr.prefix?newAttr.localName:''] = newAttr.value;
71835                 }
71836         }
71837         function _onRemoveAttribute(doc,el,newAttr,remove){
71838                 doc && doc._inc++;
71839                 var ns = newAttr.namespaceURI ;
71840                 if(ns == 'http://www.w3.org/2000/xmlns/'){
71841                         //update namespace
71842                         delete el._nsMap[newAttr.prefix?newAttr.localName:''];
71843                 }
71844         }
71845         function _onUpdateChild(doc,el,newChild){
71846                 if(doc && doc._inc){
71847                         doc._inc++;
71848                         //update childNodes
71849                         var cs = el.childNodes;
71850                         if(newChild){
71851                                 cs[cs.length++] = newChild;
71852                         }else{
71853                                 //console.log(1)
71854                                 var child = el.firstChild;
71855                                 var i = 0;
71856                                 while(child){
71857                                         cs[i++] = child;
71858                                         child =child.nextSibling;
71859                                 }
71860                                 cs.length = i;
71861                         }
71862                 }
71863         }
71864
71865         /**
71866          * attributes;
71867          * children;
71868          * 
71869          * writeable properties:
71870          * nodeValue,Attr:value,CharacterData:data
71871          * prefix
71872          */
71873         function _removeChild(parentNode,child){
71874                 var previous = child.previousSibling;
71875                 var next = child.nextSibling;
71876                 if(previous){
71877                         previous.nextSibling = next;
71878                 }else{
71879                         parentNode.firstChild = next;
71880                 }
71881                 if(next){
71882                         next.previousSibling = previous;
71883                 }else{
71884                         parentNode.lastChild = previous;
71885                 }
71886                 _onUpdateChild(parentNode.ownerDocument,parentNode);
71887                 return child;
71888         }
71889         /**
71890          * preformance key(refChild == null)
71891          */
71892         function _insertBefore(parentNode,newChild,nextChild){
71893                 var cp = newChild.parentNode;
71894                 if(cp){
71895                         cp.removeChild(newChild);//remove and update
71896                 }
71897                 if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
71898                         var newFirst = newChild.firstChild;
71899                         if (newFirst == null) {
71900                                 return newChild;
71901                         }
71902                         var newLast = newChild.lastChild;
71903                 }else{
71904                         newFirst = newLast = newChild;
71905                 }
71906                 var pre = nextChild ? nextChild.previousSibling : parentNode.lastChild;
71907
71908                 newFirst.previousSibling = pre;
71909                 newLast.nextSibling = nextChild;
71910                 
71911                 
71912                 if(pre){
71913                         pre.nextSibling = newFirst;
71914                 }else{
71915                         parentNode.firstChild = newFirst;
71916                 }
71917                 if(nextChild == null){
71918                         parentNode.lastChild = newLast;
71919                 }else{
71920                         nextChild.previousSibling = newLast;
71921                 }
71922                 do{
71923                         newFirst.parentNode = parentNode;
71924                 }while(newFirst !== newLast && (newFirst= newFirst.nextSibling))
71925                 _onUpdateChild(parentNode.ownerDocument||parentNode,parentNode);
71926                 //console.log(parentNode.lastChild.nextSibling == null)
71927                 if (newChild.nodeType == DOCUMENT_FRAGMENT_NODE) {
71928                         newChild.firstChild = newChild.lastChild = null;
71929                 }
71930                 return newChild;
71931         }
71932         function _appendSingleChild(parentNode,newChild){
71933                 var cp = newChild.parentNode;
71934                 if(cp){
71935                         var pre = parentNode.lastChild;
71936                         cp.removeChild(newChild);//remove and update
71937                         var pre = parentNode.lastChild;
71938                 }
71939                 var pre = parentNode.lastChild;
71940                 newChild.parentNode = parentNode;
71941                 newChild.previousSibling = pre;
71942                 newChild.nextSibling = null;
71943                 if(pre){
71944                         pre.nextSibling = newChild;
71945                 }else{
71946                         parentNode.firstChild = newChild;
71947                 }
71948                 parentNode.lastChild = newChild;
71949                 _onUpdateChild(parentNode.ownerDocument,parentNode,newChild);
71950                 return newChild;
71951                 //console.log("__aa",parentNode.lastChild.nextSibling == null)
71952         }
71953         Document.prototype = {
71954                 //implementation : null,
71955                 nodeName :  '#document',
71956                 nodeType :  DOCUMENT_NODE,
71957                 doctype :  null,
71958                 documentElement :  null,
71959                 _inc : 1,
71960                 
71961                 insertBefore :  function(newChild, refChild){//raises 
71962                         if(newChild.nodeType == DOCUMENT_FRAGMENT_NODE){
71963                                 var child = newChild.firstChild;
71964                                 while(child){
71965                                         var next = child.nextSibling;
71966                                         this.insertBefore(child,refChild);
71967                                         child = next;
71968                                 }
71969                                 return newChild;
71970                         }
71971                         if(this.documentElement == null && newChild.nodeType == ELEMENT_NODE){
71972                                 this.documentElement = newChild;
71973                         }
71974                         
71975                         return _insertBefore(this,newChild,refChild),(newChild.ownerDocument = this),newChild;
71976                 },
71977                 removeChild :  function(oldChild){
71978                         if(this.documentElement == oldChild){
71979                                 this.documentElement = null;
71980                         }
71981                         return _removeChild(this,oldChild);
71982                 },
71983                 // Introduced in DOM Level 2:
71984                 importNode : function(importedNode,deep){
71985                         return importNode(this,importedNode,deep);
71986                 },
71987                 // Introduced in DOM Level 2:
71988                 getElementById :        function(id){
71989                         var rtv = null;
71990                         _visitNode(this.documentElement,function(node){
71991                                 if(node.nodeType == ELEMENT_NODE){
71992                                         if(node.getAttribute('id') == id){
71993                                                 rtv = node;
71994                                                 return true;
71995                                         }
71996                                 }
71997                         });
71998                         return rtv;
71999                 },
72000                 
72001                 //document factory method:
72002                 createElement : function(tagName){
72003                         var node = new Element();
72004                         node.ownerDocument = this;
72005                         node.nodeName = tagName;
72006                         node.tagName = tagName;
72007                         node.childNodes = new NodeList();
72008                         var attrs       = node.attributes = new NamedNodeMap();
72009                         attrs._ownerElement = node;
72010                         return node;
72011                 },
72012                 createDocumentFragment :        function(){
72013                         var node = new DocumentFragment();
72014                         node.ownerDocument = this;
72015                         node.childNodes = new NodeList();
72016                         return node;
72017                 },
72018                 createTextNode :        function(data){
72019                         var node = new Text();
72020                         node.ownerDocument = this;
72021                         node.appendData(data);
72022                         return node;
72023                 },
72024                 createComment : function(data){
72025                         var node = new Comment();
72026                         node.ownerDocument = this;
72027                         node.appendData(data);
72028                         return node;
72029                 },
72030                 createCDATASection :    function(data){
72031                         var node = new CDATASection();
72032                         node.ownerDocument = this;
72033                         node.appendData(data);
72034                         return node;
72035                 },
72036                 createProcessingInstruction :   function(target,data){
72037                         var node = new ProcessingInstruction();
72038                         node.ownerDocument = this;
72039                         node.tagName = node.target = target;
72040                         node.nodeValue= node.data = data;
72041                         return node;
72042                 },
72043                 createAttribute :       function(name){
72044                         var node = new Attr();
72045                         node.ownerDocument      = this;
72046                         node.name = name;
72047                         node.nodeName   = name;
72048                         node.localName = name;
72049                         node.specified = true;
72050                         return node;
72051                 },
72052                 createEntityReference : function(name){
72053                         var node = new EntityReference();
72054                         node.ownerDocument      = this;
72055                         node.nodeName   = name;
72056                         return node;
72057                 },
72058                 // Introduced in DOM Level 2:
72059                 createElementNS :       function(namespaceURI,qualifiedName){
72060                         var node = new Element();
72061                         var pl = qualifiedName.split(':');
72062                         var attrs       = node.attributes = new NamedNodeMap();
72063                         node.childNodes = new NodeList();
72064                         node.ownerDocument = this;
72065                         node.nodeName = qualifiedName;
72066                         node.tagName = qualifiedName;
72067                         node.namespaceURI = namespaceURI;
72068                         if(pl.length == 2){
72069                                 node.prefix = pl[0];
72070                                 node.localName = pl[1];
72071                         }else{
72072                                 //el.prefix = null;
72073                                 node.localName = qualifiedName;
72074                         }
72075                         attrs._ownerElement = node;
72076                         return node;
72077                 },
72078                 // Introduced in DOM Level 2:
72079                 createAttributeNS :     function(namespaceURI,qualifiedName){
72080                         var node = new Attr();
72081                         var pl = qualifiedName.split(':');
72082                         node.ownerDocument = this;
72083                         node.nodeName = qualifiedName;
72084                         node.name = qualifiedName;
72085                         node.namespaceURI = namespaceURI;
72086                         node.specified = true;
72087                         if(pl.length == 2){
72088                                 node.prefix = pl[0];
72089                                 node.localName = pl[1];
72090                         }else{
72091                                 //el.prefix = null;
72092                                 node.localName = qualifiedName;
72093                         }
72094                         return node;
72095                 }
72096         };
72097         _extends(Document,Node$2);
72098
72099
72100         function Element() {
72101                 this._nsMap = {};
72102         }Element.prototype = {
72103                 nodeType : ELEMENT_NODE,
72104                 hasAttribute : function(name){
72105                         return this.getAttributeNode(name)!=null;
72106                 },
72107                 getAttribute : function(name){
72108                         var attr = this.getAttributeNode(name);
72109                         return attr && attr.value || '';
72110                 },
72111                 getAttributeNode : function(name){
72112                         return this.attributes.getNamedItem(name);
72113                 },
72114                 setAttribute : function(name, value){
72115                         var attr = this.ownerDocument.createAttribute(name);
72116                         attr.value = attr.nodeValue = "" + value;
72117                         this.setAttributeNode(attr);
72118                 },
72119                 removeAttribute : function(name){
72120                         var attr = this.getAttributeNode(name);
72121                         attr && this.removeAttributeNode(attr);
72122                 },
72123                 
72124                 //four real opeartion method
72125                 appendChild:function(newChild){
72126                         if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
72127                                 return this.insertBefore(newChild,null);
72128                         }else{
72129                                 return _appendSingleChild(this,newChild);
72130                         }
72131                 },
72132                 setAttributeNode : function(newAttr){
72133                         return this.attributes.setNamedItem(newAttr);
72134                 },
72135                 setAttributeNodeNS : function(newAttr){
72136                         return this.attributes.setNamedItemNS(newAttr);
72137                 },
72138                 removeAttributeNode : function(oldAttr){
72139                         //console.log(this == oldAttr.ownerElement)
72140                         return this.attributes.removeNamedItem(oldAttr.nodeName);
72141                 },
72142                 //get real attribute name,and remove it by removeAttributeNode
72143                 removeAttributeNS : function(namespaceURI, localName){
72144                         var old = this.getAttributeNodeNS(namespaceURI, localName);
72145                         old && this.removeAttributeNode(old);
72146                 },
72147                 
72148                 hasAttributeNS : function(namespaceURI, localName){
72149                         return this.getAttributeNodeNS(namespaceURI, localName)!=null;
72150                 },
72151                 getAttributeNS : function(namespaceURI, localName){
72152                         var attr = this.getAttributeNodeNS(namespaceURI, localName);
72153                         return attr && attr.value || '';
72154                 },
72155                 setAttributeNS : function(namespaceURI, qualifiedName, value){
72156                         var attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName);
72157                         attr.value = attr.nodeValue = "" + value;
72158                         this.setAttributeNode(attr);
72159                 },
72160                 getAttributeNodeNS : function(namespaceURI, localName){
72161                         return this.attributes.getNamedItemNS(namespaceURI, localName);
72162                 },
72163                 
72164                 getElementsByTagName : function(tagName){
72165                         return new LiveNodeList(this,function(base){
72166                                 var ls = [];
72167                                 _visitNode(base,function(node){
72168                                         if(node !== base && node.nodeType == ELEMENT_NODE && (tagName === '*' || node.tagName == tagName)){
72169                                                 ls.push(node);
72170                                         }
72171                                 });
72172                                 return ls;
72173                         });
72174                 },
72175                 getElementsByTagNameNS : function(namespaceURI, localName){
72176                         return new LiveNodeList(this,function(base){
72177                                 var ls = [];
72178                                 _visitNode(base,function(node){
72179                                         if(node !== base && node.nodeType === ELEMENT_NODE && (namespaceURI === '*' || node.namespaceURI === namespaceURI) && (localName === '*' || node.localName == localName)){
72180                                                 ls.push(node);
72181                                         }
72182                                 });
72183                                 return ls;
72184                                 
72185                         });
72186                 }
72187         };
72188         Document.prototype.getElementsByTagName = Element.prototype.getElementsByTagName;
72189         Document.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS;
72190
72191
72192         _extends(Element,Node$2);
72193         function Attr() {
72194         }Attr.prototype.nodeType = ATTRIBUTE_NODE;
72195         _extends(Attr,Node$2);
72196
72197
72198         function CharacterData() {
72199         }CharacterData.prototype = {
72200                 data : '',
72201                 substringData : function(offset, count) {
72202                         return this.data.substring(offset, offset+count);
72203                 },
72204                 appendData: function(text) {
72205                         text = this.data+text;
72206                         this.nodeValue = this.data = text;
72207                         this.length = text.length;
72208                 },
72209                 insertData: function(offset,text) {
72210                         this.replaceData(offset,0,text);
72211                 
72212                 },
72213                 appendChild:function(newChild){
72214                         throw new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR])
72215                 },
72216                 deleteData: function(offset, count) {
72217                         this.replaceData(offset,count,"");
72218                 },
72219                 replaceData: function(offset, count, text) {
72220                         var start = this.data.substring(0,offset);
72221                         var end = this.data.substring(offset+count);
72222                         text = start + text + end;
72223                         this.nodeValue = this.data = text;
72224                         this.length = text.length;
72225                 }
72226         };
72227         _extends(CharacterData,Node$2);
72228         function Text() {
72229         }Text.prototype = {
72230                 nodeName : "#text",
72231                 nodeType : TEXT_NODE,
72232                 splitText : function(offset) {
72233                         var text = this.data;
72234                         var newText = text.substring(offset);
72235                         text = text.substring(0, offset);
72236                         this.data = this.nodeValue = text;
72237                         this.length = text.length;
72238                         var newNode = this.ownerDocument.createTextNode(newText);
72239                         if(this.parentNode){
72240                                 this.parentNode.insertBefore(newNode, this.nextSibling);
72241                         }
72242                         return newNode;
72243                 }
72244         };
72245         _extends(Text,CharacterData);
72246         function Comment() {
72247         }Comment.prototype = {
72248                 nodeName : "#comment",
72249                 nodeType : COMMENT_NODE
72250         };
72251         _extends(Comment,CharacterData);
72252
72253         function CDATASection() {
72254         }CDATASection.prototype = {
72255                 nodeName : "#cdata-section",
72256                 nodeType : CDATA_SECTION_NODE
72257         };
72258         _extends(CDATASection,CharacterData);
72259
72260
72261         function DocumentType() {
72262         }DocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE;
72263         _extends(DocumentType,Node$2);
72264
72265         function Notation() {
72266         }Notation.prototype.nodeType = NOTATION_NODE;
72267         _extends(Notation,Node$2);
72268
72269         function Entity() {
72270         }Entity.prototype.nodeType = ENTITY_NODE;
72271         _extends(Entity,Node$2);
72272
72273         function EntityReference() {
72274         }EntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE;
72275         _extends(EntityReference,Node$2);
72276
72277         function DocumentFragment() {
72278         }DocumentFragment.prototype.nodeName =  "#document-fragment";
72279         DocumentFragment.prototype.nodeType =   DOCUMENT_FRAGMENT_NODE;
72280         _extends(DocumentFragment,Node$2);
72281
72282
72283         function ProcessingInstruction() {
72284         }
72285         ProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE;
72286         _extends(ProcessingInstruction,Node$2);
72287         function XMLSerializer$1(){}
72288         XMLSerializer$1.prototype.serializeToString = function(node,isHtml,nodeFilter){
72289                 return nodeSerializeToString.call(node,isHtml,nodeFilter);
72290         };
72291         Node$2.prototype.toString = nodeSerializeToString;
72292         function nodeSerializeToString(isHtml,nodeFilter){
72293                 var buf = [];
72294                 var refNode = this.nodeType == 9?this.documentElement:this;
72295                 var prefix = refNode.prefix;
72296                 var uri = refNode.namespaceURI;
72297                 
72298                 if(uri && prefix == null){
72299                         //console.log(prefix)
72300                         var prefix = refNode.lookupPrefix(uri);
72301                         if(prefix == null){
72302                                 //isHTML = true;
72303                                 var visibleNamespaces=[
72304                                 {namespace:uri,prefix:null}
72305                                 //{namespace:uri,prefix:''}
72306                                 ];
72307                         }
72308                 }
72309                 serializeToString(this,buf,isHtml,nodeFilter,visibleNamespaces);
72310                 //console.log('###',this.nodeType,uri,prefix,buf.join(''))
72311                 return buf.join('');
72312         }
72313         function needNamespaceDefine(node,isHTML, visibleNamespaces) {
72314                 var prefix = node.prefix||'';
72315                 var uri = node.namespaceURI;
72316                 if (!prefix && !uri){
72317                         return false;
72318                 }
72319                 if (prefix === "xml" && uri === "http://www.w3.org/XML/1998/namespace" 
72320                         || uri == 'http://www.w3.org/2000/xmlns/'){
72321                         return false;
72322                 }
72323                 
72324                 var i = visibleNamespaces.length; 
72325                 //console.log('@@@@',node.tagName,prefix,uri,visibleNamespaces)
72326                 while (i--) {
72327                         var ns = visibleNamespaces[i];
72328                         // get namespace prefix
72329                         //console.log(node.nodeType,node.tagName,ns.prefix,prefix)
72330                         if (ns.prefix == prefix){
72331                                 return ns.namespace != uri;
72332                         }
72333                 }
72334                 //console.log(isHTML,uri,prefix=='')
72335                 //if(isHTML && prefix ==null && uri == 'http://www.w3.org/1999/xhtml'){
72336                 //      return false;
72337                 //}
72338                 //node.flag = '11111'
72339                 //console.error(3,true,node.flag,node.prefix,node.namespaceURI)
72340                 return true;
72341         }
72342         function serializeToString(node,buf,isHTML,nodeFilter,visibleNamespaces){
72343                 if(nodeFilter){
72344                         node = nodeFilter(node);
72345                         if(node){
72346                                 if(typeof node == 'string'){
72347                                         buf.push(node);
72348                                         return;
72349                                 }
72350                         }else{
72351                                 return;
72352                         }
72353                         //buf.sort.apply(attrs, attributeSorter);
72354                 }
72355                 switch(node.nodeType){
72356                 case ELEMENT_NODE:
72357                         if (!visibleNamespaces) visibleNamespaces = [];
72358                         var startVisibleNamespaces = visibleNamespaces.length;
72359                         var attrs = node.attributes;
72360                         var len = attrs.length;
72361                         var child = node.firstChild;
72362                         var nodeName = node.tagName;
72363                         
72364                         isHTML =  (htmlns === node.namespaceURI) ||isHTML; 
72365                         buf.push('<',nodeName);
72366                         
72367                         
72368                         
72369                         for(var i=0;i<len;i++){
72370                                 // add namespaces for attributes
72371                                 var attr = attrs.item(i);
72372                                 if (attr.prefix == 'xmlns') {
72373                                         visibleNamespaces.push({ prefix: attr.localName, namespace: attr.value });
72374                                 }else if(attr.nodeName == 'xmlns'){
72375                                         visibleNamespaces.push({ prefix: '', namespace: attr.value });
72376                                 }
72377                         }
72378                         for(var i=0;i<len;i++){
72379                                 var attr = attrs.item(i);
72380                                 if (needNamespaceDefine(attr,isHTML, visibleNamespaces)) {
72381                                         var prefix = attr.prefix||'';
72382                                         var uri = attr.namespaceURI;
72383                                         var ns = prefix ? ' xmlns:' + prefix : " xmlns";
72384                                         buf.push(ns, '="' , uri , '"');
72385                                         visibleNamespaces.push({ prefix: prefix, namespace:uri });
72386                                 }
72387                                 serializeToString(attr,buf,isHTML,nodeFilter,visibleNamespaces);
72388                         }
72389                         // add namespace for current node               
72390                         if (needNamespaceDefine(node,isHTML, visibleNamespaces)) {
72391                                 var prefix = node.prefix||'';
72392                                 var uri = node.namespaceURI;
72393                                 var ns = prefix ? ' xmlns:' + prefix : " xmlns";
72394                                 buf.push(ns, '="' , uri , '"');
72395                                 visibleNamespaces.push({ prefix: prefix, namespace:uri });
72396                         }
72397                         
72398                         if(child || isHTML && !/^(?:meta|link|img|br|hr|input)$/i.test(nodeName)){
72399                                 buf.push('>');
72400                                 //if is cdata child node
72401                                 if(isHTML && /^script$/i.test(nodeName)){
72402                                         while(child){
72403                                                 if(child.data){
72404                                                         buf.push(child.data);
72405                                                 }else{
72406                                                         serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
72407                                                 }
72408                                                 child = child.nextSibling;
72409                                         }
72410                                 }else
72411                                 {
72412                                         while(child){
72413                                                 serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
72414                                                 child = child.nextSibling;
72415                                         }
72416                                 }
72417                                 buf.push('</',nodeName,'>');
72418                         }else{
72419                                 buf.push('/>');
72420                         }
72421                         // remove added visible namespaces
72422                         //visibleNamespaces.length = startVisibleNamespaces;
72423                         return;
72424                 case DOCUMENT_NODE:
72425                 case DOCUMENT_FRAGMENT_NODE:
72426                         var child = node.firstChild;
72427                         while(child){
72428                                 serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
72429                                 child = child.nextSibling;
72430                         }
72431                         return;
72432                 case ATTRIBUTE_NODE:
72433                         return buf.push(' ',node.name,'="',node.value.replace(/[<&"]/g,_xmlEncoder),'"');
72434                 case TEXT_NODE:
72435                         return buf.push(node.data.replace(/[<&]/g,_xmlEncoder));
72436                 case CDATA_SECTION_NODE:
72437                         return buf.push( '<![CDATA[',node.data,']]>');
72438                 case COMMENT_NODE:
72439                         return buf.push( "<!--",node.data,"-->");
72440                 case DOCUMENT_TYPE_NODE:
72441                         var pubid = node.publicId;
72442                         var sysid = node.systemId;
72443                         buf.push('<!DOCTYPE ',node.name);
72444                         if(pubid){
72445                                 buf.push(' PUBLIC "',pubid);
72446                                 if (sysid && sysid!='.') {
72447                                         buf.push( '" "',sysid);
72448                                 }
72449                                 buf.push('">');
72450                         }else if(sysid && sysid!='.'){
72451                                 buf.push(' SYSTEM "',sysid,'">');
72452                         }else{
72453                                 var sub = node.internalSubset;
72454                                 if(sub){
72455                                         buf.push(" [",sub,"]");
72456                                 }
72457                                 buf.push(">");
72458                         }
72459                         return;
72460                 case PROCESSING_INSTRUCTION_NODE:
72461                         return buf.push( "<?",node.target," ",node.data,"?>");
72462                 case ENTITY_REFERENCE_NODE:
72463                         return buf.push( '&',node.nodeName,';');
72464                 //case ENTITY_NODE:
72465                 //case NOTATION_NODE:
72466                 default:
72467                         buf.push('??',node.nodeName);
72468                 }
72469         }
72470         function importNode(doc,node,deep){
72471                 var node2;
72472                 switch (node.nodeType) {
72473                 case ELEMENT_NODE:
72474                         node2 = node.cloneNode(false);
72475                         node2.ownerDocument = doc;
72476                         //var attrs = node2.attributes;
72477                         //var len = attrs.length;
72478                         //for(var i=0;i<len;i++){
72479                                 //node2.setAttributeNodeNS(importNode(doc,attrs.item(i),deep));
72480                         //}
72481                 case DOCUMENT_FRAGMENT_NODE:
72482                         break;
72483                 case ATTRIBUTE_NODE:
72484                         deep = true;
72485                         break;
72486                 //case ENTITY_REFERENCE_NODE:
72487                 //case PROCESSING_INSTRUCTION_NODE:
72488                 ////case TEXT_NODE:
72489                 //case CDATA_SECTION_NODE:
72490                 //case COMMENT_NODE:
72491                 //      deep = false;
72492                 //      break;
72493                 //case DOCUMENT_NODE:
72494                 //case DOCUMENT_TYPE_NODE:
72495                 //cannot be imported.
72496                 //case ENTITY_NODE:
72497                 //case NOTATION_NODE:
72498                 //can not hit in level3
72499                 //default:throw e;
72500                 }
72501                 if(!node2){
72502                         node2 = node.cloneNode(false);//false
72503                 }
72504                 node2.ownerDocument = doc;
72505                 node2.parentNode = null;
72506                 if(deep){
72507                         var child = node.firstChild;
72508                         while(child){
72509                                 node2.appendChild(importNode(doc,child,deep));
72510                                 child = child.nextSibling;
72511                         }
72512                 }
72513                 return node2;
72514         }
72515         //
72516         //var _relationMap = {firstChild:1,lastChild:1,previousSibling:1,nextSibling:1,
72517         //                                      attributes:1,childNodes:1,parentNode:1,documentElement:1,doctype,};
72518         function cloneNode(doc,node,deep){
72519                 var node2 = new node.constructor();
72520                 for(var n in node){
72521                         var v = node[n];
72522                         if(typeof v != 'object' ){
72523                                 if(v != node2[n]){
72524                                         node2[n] = v;
72525                                 }
72526                         }
72527                 }
72528                 if(node.childNodes){
72529                         node2.childNodes = new NodeList();
72530                 }
72531                 node2.ownerDocument = doc;
72532                 switch (node2.nodeType) {
72533                 case ELEMENT_NODE:
72534                         var attrs       = node.attributes;
72535                         var attrs2      = node2.attributes = new NamedNodeMap();
72536                         var len = attrs.length;
72537                         attrs2._ownerElement = node2;
72538                         for(var i=0;i<len;i++){
72539                                 node2.setAttributeNode(cloneNode(doc,attrs.item(i),true));
72540                         }
72541                         break;
72542                 case ATTRIBUTE_NODE:
72543                         deep = true;
72544                 }
72545                 if(deep){
72546                         var child = node.firstChild;
72547                         while(child){
72548                                 node2.appendChild(cloneNode(doc,child,deep));
72549                                 child = child.nextSibling;
72550                         }
72551                 }
72552                 return node2;
72553         }
72554
72555         function __set__(object,key,value){
72556                 object[key] = value;
72557         }
72558         //do dynamic
72559         try{
72560                 if(Object.defineProperty){
72561                         Object.defineProperty(LiveNodeList.prototype,'length',{
72562                                 get:function(){
72563                                         _updateLiveList(this);
72564                                         return this.$$length;
72565                                 }
72566                         });
72567                         Object.defineProperty(Node$2.prototype,'textContent',{
72568                                 get:function(){
72569                                         return getTextContent(this);
72570                                 },
72571                                 set:function(data){
72572                                         switch(this.nodeType){
72573                                         case ELEMENT_NODE:
72574                                         case DOCUMENT_FRAGMENT_NODE:
72575                                                 while(this.firstChild){
72576                                                         this.removeChild(this.firstChild);
72577                                                 }
72578                                                 if(data || String(data)){
72579                                                         this.appendChild(this.ownerDocument.createTextNode(data));
72580                                                 }
72581                                                 break;
72582                                         default:
72583                                                 //TODO:
72584                                                 this.data = data;
72585                                                 this.value = data;
72586                                                 this.nodeValue = data;
72587                                         }
72588                                 }
72589                         });
72590                         
72591                         function getTextContent(node){
72592                                 switch(node.nodeType){
72593                                 case ELEMENT_NODE:
72594                                 case DOCUMENT_FRAGMENT_NODE:
72595                                         var buf = [];
72596                                         node = node.firstChild;
72597                                         while(node){
72598                                                 if(node.nodeType!==7 && node.nodeType !==8){
72599                                                         buf.push(getTextContent(node));
72600                                                 }
72601                                                 node = node.nextSibling;
72602                                         }
72603                                         return buf.join('');
72604                                 default:
72605                                         return node.nodeValue;
72606                                 }
72607                         }
72608                         __set__ = function(object,key,value){
72609                                 //console.log(value)
72610                                 object['$$'+key] = value;
72611                         };
72612                 }
72613         }catch(e){//ie8
72614         }
72615
72616         //if(typeof require == 'function'){
72617                 var DOMImplementation_1 = DOMImplementation;
72618                 var XMLSerializer_1 = XMLSerializer$1;
72619         //}
72620
72621         var dom = {
72622                 DOMImplementation: DOMImplementation_1,
72623                 XMLSerializer: XMLSerializer_1
72624         };
72625
72626         var domParser = createCommonjsModule(function (module, exports) {
72627         function DOMParser(options){
72628                 this.options = options ||{locator:{}};
72629                 
72630         }
72631         DOMParser.prototype.parseFromString = function(source,mimeType){
72632                 var options = this.options;
72633                 var sax =  new XMLReader();
72634                 var domBuilder = options.domBuilder || new DOMHandler();//contentHandler and LexicalHandler
72635                 var errorHandler = options.errorHandler;
72636                 var locator = options.locator;
72637                 var defaultNSMap = options.xmlns||{};
72638                 var entityMap = {'lt':'<','gt':'>','amp':'&','quot':'"','apos':"'"};
72639                 if(locator){
72640                         domBuilder.setDocumentLocator(locator);
72641                 }
72642                 
72643                 sax.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator);
72644                 sax.domBuilder = options.domBuilder || domBuilder;
72645                 if(/\/x?html?$/.test(mimeType)){
72646                         entityMap.nbsp = '\xa0';
72647                         entityMap.copy = '\xa9';
72648                         defaultNSMap['']= 'http://www.w3.org/1999/xhtml';
72649                 }
72650                 defaultNSMap.xml = defaultNSMap.xml || 'http://www.w3.org/XML/1998/namespace';
72651                 if(source){
72652                         sax.parse(source,defaultNSMap,entityMap);
72653                 }else{
72654                         sax.errorHandler.error("invalid doc source");
72655                 }
72656                 return domBuilder.doc;
72657         };
72658         function buildErrorHandler(errorImpl,domBuilder,locator){
72659                 if(!errorImpl){
72660                         if(domBuilder instanceof DOMHandler){
72661                                 return domBuilder;
72662                         }
72663                         errorImpl = domBuilder ;
72664                 }
72665                 var errorHandler = {};
72666                 var isCallback = errorImpl instanceof Function;
72667                 locator = locator||{};
72668                 function build(key){
72669                         var fn = errorImpl[key];
72670                         if(!fn && isCallback){
72671                                 fn = errorImpl.length == 2?function(msg){errorImpl(key,msg);}:errorImpl;
72672                         }
72673                         errorHandler[key] = fn && function(msg){
72674                                 fn('[xmldom '+key+']\t'+msg+_locator(locator));
72675                         }||function(){};
72676                 }
72677                 build('warning');
72678                 build('error');
72679                 build('fatalError');
72680                 return errorHandler;
72681         }
72682
72683         //console.log('#\n\n\n\n\n\n\n####')
72684         /**
72685          * +ContentHandler+ErrorHandler
72686          * +LexicalHandler+EntityResolver2
72687          * -DeclHandler-DTDHandler 
72688          * 
72689          * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler
72690          * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2
72691          * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html
72692          */
72693         function DOMHandler() {
72694             this.cdata = false;
72695         }
72696         function position(locator,node){
72697                 node.lineNumber = locator.lineNumber;
72698                 node.columnNumber = locator.columnNumber;
72699         }
72700         /**
72701          * @see org.xml.sax.ContentHandler#startDocument
72702          * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html
72703          */ 
72704         DOMHandler.prototype = {
72705                 startDocument : function() {
72706                 this.doc = new DOMImplementation().createDocument(null, null, null);
72707                 if (this.locator) {
72708                         this.doc.documentURI = this.locator.systemId;
72709                 }
72710                 },
72711                 startElement:function(namespaceURI, localName, qName, attrs) {
72712                         var doc = this.doc;
72713                     var el = doc.createElementNS(namespaceURI, qName||localName);
72714                     var len = attrs.length;
72715                     appendElement(this, el);
72716                     this.currentElement = el;
72717                     
72718                         this.locator && position(this.locator,el);
72719                     for (var i = 0 ; i < len; i++) {
72720                         var namespaceURI = attrs.getURI(i);
72721                         var value = attrs.getValue(i);
72722                         var qName = attrs.getQName(i);
72723                                 var attr = doc.createAttributeNS(namespaceURI, qName);
72724                                 this.locator &&position(attrs.getLocator(i),attr);
72725                                 attr.value = attr.nodeValue = value;
72726                                 el.setAttributeNode(attr);
72727                     }
72728                 },
72729                 endElement:function(namespaceURI, localName, qName) {
72730                         var current = this.currentElement;
72731                         var tagName = current.tagName;
72732                         this.currentElement = current.parentNode;
72733                 },
72734                 startPrefixMapping:function(prefix, uri) {
72735                 },
72736                 endPrefixMapping:function(prefix) {
72737                 },
72738                 processingInstruction:function(target, data) {
72739                     var ins = this.doc.createProcessingInstruction(target, data);
72740                     this.locator && position(this.locator,ins);
72741                     appendElement(this, ins);
72742                 },
72743                 ignorableWhitespace:function(ch, start, length) {
72744                 },
72745                 characters:function(chars, start, length) {
72746                         chars = _toString.apply(this,arguments);
72747                         //console.log(chars)
72748                         if(chars){
72749                                 if (this.cdata) {
72750                                         var charNode = this.doc.createCDATASection(chars);
72751                                 } else {
72752                                         var charNode = this.doc.createTextNode(chars);
72753                                 }
72754                                 if(this.currentElement){
72755                                         this.currentElement.appendChild(charNode);
72756                                 }else if(/^\s*$/.test(chars)){
72757                                         this.doc.appendChild(charNode);
72758                                         //process xml
72759                                 }
72760                                 this.locator && position(this.locator,charNode);
72761                         }
72762                 },
72763                 skippedEntity:function(name) {
72764                 },
72765                 endDocument:function() {
72766                         this.doc.normalize();
72767                 },
72768                 setDocumentLocator:function (locator) {
72769                     if(this.locator = locator){// && !('lineNumber' in locator)){
72770                         locator.lineNumber = 0;
72771                     }
72772                 },
72773                 //LexicalHandler
72774                 comment:function(chars, start, length) {
72775                         chars = _toString.apply(this,arguments);
72776                     var comm = this.doc.createComment(chars);
72777                     this.locator && position(this.locator,comm);
72778                     appendElement(this, comm);
72779                 },
72780                 
72781                 startCDATA:function() {
72782                     //used in characters() methods
72783                     this.cdata = true;
72784                 },
72785                 endCDATA:function() {
72786                     this.cdata = false;
72787                 },
72788                 
72789                 startDTD:function(name, publicId, systemId) {
72790                         var impl = this.doc.implementation;
72791                     if (impl && impl.createDocumentType) {
72792                         var dt = impl.createDocumentType(name, publicId, systemId);
72793                         this.locator && position(this.locator,dt);
72794                         appendElement(this, dt);
72795                     }
72796                 },
72797                 /**
72798                  * @see org.xml.sax.ErrorHandler
72799                  * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html
72800                  */
72801                 warning:function(error) {
72802                         console.warn('[xmldom warning]\t'+error,_locator(this.locator));
72803                 },
72804                 error:function(error) {
72805                         console.error('[xmldom error]\t'+error,_locator(this.locator));
72806                 },
72807                 fatalError:function(error) {
72808                         console.error('[xmldom fatalError]\t'+error,_locator(this.locator));
72809                     throw error;
72810                 }
72811         };
72812         function _locator(l){
72813                 if(l){
72814                         return '\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']'
72815                 }
72816         }
72817         function _toString(chars,start,length){
72818                 if(typeof chars == 'string'){
72819                         return chars.substr(start,length)
72820                 }else{//java sax connect width xmldom on rhino(what about: "? && !(chars instanceof String)")
72821                         if(chars.length >= start+length || start){
72822                                 return new java.lang.String(chars,start,length)+'';
72823                         }
72824                         return chars;
72825                 }
72826         }
72827
72828         /*
72829          * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html
72830          * used method of org.xml.sax.ext.LexicalHandler:
72831          *  #comment(chars, start, length)
72832          *  #startCDATA()
72833          *  #endCDATA()
72834          *  #startDTD(name, publicId, systemId)
72835          *
72836          *
72837          * IGNORED method of org.xml.sax.ext.LexicalHandler:
72838          *  #endDTD()
72839          *  #startEntity(name)
72840          *  #endEntity(name)
72841          *
72842          *
72843          * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html
72844          * IGNORED method of org.xml.sax.ext.DeclHandler
72845          *      #attributeDecl(eName, aName, type, mode, value)
72846          *  #elementDecl(name, model)
72847          *  #externalEntityDecl(name, publicId, systemId)
72848          *  #internalEntityDecl(name, value)
72849          * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html
72850          * IGNORED method of org.xml.sax.EntityResolver2
72851          *  #resolveEntity(String name,String publicId,String baseURI,String systemId)
72852          *  #resolveEntity(publicId, systemId)
72853          *  #getExternalSubset(name, baseURI)
72854          * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html
72855          * IGNORED method of org.xml.sax.DTDHandler
72856          *  #notationDecl(name, publicId, systemId) {};
72857          *  #unparsedEntityDecl(name, publicId, systemId, notationName) {};
72858          */
72859         "endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(key){
72860                 DOMHandler.prototype[key] = function(){return null};
72861         });
72862
72863         /* 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 */
72864         function appendElement (hander,node) {
72865             if (!hander.currentElement) {
72866                 hander.doc.appendChild(node);
72867             } else {
72868                 hander.currentElement.appendChild(node);
72869             }
72870         }//appendChild and setAttributeNS are preformance key
72871
72872         //if(typeof require == 'function'){
72873                 var XMLReader = sax.XMLReader;
72874                 var DOMImplementation = exports.DOMImplementation = dom.DOMImplementation;
72875                 exports.XMLSerializer = dom.XMLSerializer ;
72876                 exports.DOMParser = DOMParser;
72877         //}
72878         });
72879         var domParser_1 = domParser.DOMImplementation;
72880         var domParser_2 = domParser.XMLSerializer;
72881         var domParser_3 = domParser.DOMParser;
72882
72883         var togeojson = createCommonjsModule(function (module, exports) {
72884         var toGeoJSON = (function() {
72885
72886             var removeSpace = /\s*/g,
72887                 trimSpace = /^\s*|\s*$/g,
72888                 splitSpace = /\s+/;
72889             // generate a short, numeric hash of a string
72890             function okhash(x) {
72891                 if (!x || !x.length) return 0;
72892                 for (var i = 0, h = 0; i < x.length; i++) {
72893                     h = ((h << 5) - h) + x.charCodeAt(i) | 0;
72894                 } return h;
72895             }
72896             // all Y children of X
72897             function get(x, y) { return x.getElementsByTagName(y); }
72898             function attr(x, y) { return x.getAttribute(y); }
72899             function attrf(x, y) { return parseFloat(attr(x, y)); }
72900             // one Y child of X, if any, otherwise null
72901             function get1(x, y) { var n = get(x, y); return n.length ? n[0] : null; }
72902             // https://developer.mozilla.org/en-US/docs/Web/API/Node.normalize
72903             function norm(el) { if (el.normalize) { el.normalize(); } return el; }
72904             // cast array x into numbers
72905             function numarray(x) {
72906                 for (var j = 0, o = []; j < x.length; j++) { o[j] = parseFloat(x[j]); }
72907                 return o;
72908             }
72909             // get the content of a text node, if any
72910             function nodeVal(x) {
72911                 if (x) { norm(x); }
72912                 return (x && x.textContent) || '';
72913             }
72914             // get the contents of multiple text nodes, if present
72915             function getMulti(x, ys) {
72916                 var o = {}, n, k;
72917                 for (k = 0; k < ys.length; k++) {
72918                     n = get1(x, ys[k]);
72919                     if (n) o[ys[k]] = nodeVal(n);
72920                 }
72921                 return o;
72922             }
72923             // add properties of Y to X, overwriting if present in both
72924             function extend(x, y) { for (var k in y) x[k] = y[k]; }
72925             // get one coordinate from a coordinate array, if any
72926             function coord1(v) { return numarray(v.replace(removeSpace, '').split(',')); }
72927             // get all coordinates from a coordinate array as [[],[]]
72928             function coord(v) {
72929                 var coords = v.replace(trimSpace, '').split(splitSpace),
72930                     o = [];
72931                 for (var i = 0; i < coords.length; i++) {
72932                     o.push(coord1(coords[i]));
72933                 }
72934                 return o;
72935             }
72936             function coordPair(x) {
72937                 var ll = [attrf(x, 'lon'), attrf(x, 'lat')],
72938                     ele = get1(x, 'ele'),
72939                     // handle namespaced attribute in browser
72940                     heartRate = get1(x, 'gpxtpx:hr') || get1(x, 'hr'),
72941                     time = get1(x, 'time'),
72942                     e;
72943                 if (ele) {
72944                     e = parseFloat(nodeVal(ele));
72945                     if (!isNaN(e)) {
72946                         ll.push(e);
72947                     }
72948                 }
72949                 return {
72950                     coordinates: ll,
72951                     time: time ? nodeVal(time) : null,
72952                     heartRate: heartRate ? parseFloat(nodeVal(heartRate)) : null
72953                 };
72954             }
72955
72956             // create a new feature collection parent object
72957             function fc() {
72958                 return {
72959                     type: 'FeatureCollection',
72960                     features: []
72961                 };
72962             }
72963
72964             var serializer;
72965             if (typeof XMLSerializer !== 'undefined') {
72966                 /* istanbul ignore next */
72967                 serializer = new XMLSerializer();
72968             // only require xmldom in a node environment
72969             } else if ( typeof process === 'object' && !process.browser) {
72970                 serializer = new (domParser.XMLSerializer)();
72971             }
72972             function xml2str(str) {
72973                 // IE9 will create a new XMLSerializer but it'll crash immediately.
72974                 // This line is ignored because we don't run coverage tests in IE9
72975                 /* istanbul ignore next */
72976                 if (str.xml !== undefined) return str.xml;
72977                 return serializer.serializeToString(str);
72978             }
72979
72980             var t = {
72981                 kml: function(doc) {
72982
72983                     var gj = fc(),
72984                         // styleindex keeps track of hashed styles in order to match features
72985                         styleIndex = {}, styleByHash = {},
72986                         // stylemapindex keeps track of style maps to expose in properties
72987                         styleMapIndex = {},
72988                         // atomic geospatial types supported by KML - MultiGeometry is
72989                         // handled separately
72990                         geotypes = ['Polygon', 'LineString', 'Point', 'Track', 'gx:Track'],
72991                         // all root placemarks in the file
72992                         placemarks = get(doc, 'Placemark'),
72993                         styles = get(doc, 'Style'),
72994                         styleMaps = get(doc, 'StyleMap');
72995
72996                     for (var k = 0; k < styles.length; k++) {
72997                         var hash = okhash(xml2str(styles[k])).toString(16);
72998                         styleIndex['#' + attr(styles[k], 'id')] = hash;
72999                         styleByHash[hash] = styles[k];
73000                     }
73001                     for (var l = 0; l < styleMaps.length; l++) {
73002                         styleIndex['#' + attr(styleMaps[l], 'id')] = okhash(xml2str(styleMaps[l])).toString(16);
73003                         var pairs = get(styleMaps[l], 'Pair');
73004                         var pairsMap = {};
73005                         for (var m = 0; m < pairs.length; m++) {
73006                             pairsMap[nodeVal(get1(pairs[m], 'key'))] = nodeVal(get1(pairs[m], 'styleUrl'));
73007                         }
73008                         styleMapIndex['#' + attr(styleMaps[l], 'id')] = pairsMap;
73009
73010                     }
73011                     for (var j = 0; j < placemarks.length; j++) {
73012                         gj.features = gj.features.concat(getPlacemark(placemarks[j]));
73013                     }
73014                     function kmlColor(v) {
73015                         var color, opacity;
73016                         v = v || '';
73017                         if (v.substr(0, 1) === '#') { v = v.substr(1); }
73018                         if (v.length === 6 || v.length === 3) { color = v; }
73019                         if (v.length === 8) {
73020                             opacity = parseInt(v.substr(0, 2), 16) / 255;
73021                             color = '#' + v.substr(6, 2) +
73022                                 v.substr(4, 2) +
73023                                 v.substr(2, 2);
73024                         }
73025                         return [color, isNaN(opacity) ? undefined : opacity];
73026                     }
73027                     function gxCoord(v) { return numarray(v.split(' ')); }
73028                     function gxCoords(root) {
73029                         var elems = get(root, 'coord'), coords = [], times = [];
73030                         if (elems.length === 0) elems = get(root, 'gx:coord');
73031                         for (var i = 0; i < elems.length; i++) coords.push(gxCoord(nodeVal(elems[i])));
73032                         var timeElems = get(root, 'when');
73033                         for (var j = 0; j < timeElems.length; j++) times.push(nodeVal(timeElems[j]));
73034                         return {
73035                             coords: coords,
73036                             times: times
73037                         };
73038                     }
73039                     function getGeometry(root) {
73040                         var geomNode, geomNodes, i, j, k, geoms = [], coordTimes = [];
73041                         if (get1(root, 'MultiGeometry')) { return getGeometry(get1(root, 'MultiGeometry')); }
73042                         if (get1(root, 'MultiTrack')) { return getGeometry(get1(root, 'MultiTrack')); }
73043                         if (get1(root, 'gx:MultiTrack')) { return getGeometry(get1(root, 'gx:MultiTrack')); }
73044                         for (i = 0; i < geotypes.length; i++) {
73045                             geomNodes = get(root, geotypes[i]);
73046                             if (geomNodes) {
73047                                 for (j = 0; j < geomNodes.length; j++) {
73048                                     geomNode = geomNodes[j];
73049                                     if (geotypes[i] === 'Point') {
73050                                         geoms.push({
73051                                             type: 'Point',
73052                                             coordinates: coord1(nodeVal(get1(geomNode, 'coordinates')))
73053                                         });
73054                                     } else if (geotypes[i] === 'LineString') {
73055                                         geoms.push({
73056                                             type: 'LineString',
73057                                             coordinates: coord(nodeVal(get1(geomNode, 'coordinates')))
73058                                         });
73059                                     } else if (geotypes[i] === 'Polygon') {
73060                                         var rings = get(geomNode, 'LinearRing'),
73061                                             coords = [];
73062                                         for (k = 0; k < rings.length; k++) {
73063                                             coords.push(coord(nodeVal(get1(rings[k], 'coordinates'))));
73064                                         }
73065                                         geoms.push({
73066                                             type: 'Polygon',
73067                                             coordinates: coords
73068                                         });
73069                                     } else if (geotypes[i] === 'Track' ||
73070                                         geotypes[i] === 'gx:Track') {
73071                                         var track = gxCoords(geomNode);
73072                                         geoms.push({
73073                                             type: 'LineString',
73074                                             coordinates: track.coords
73075                                         });
73076                                         if (track.times.length) coordTimes.push(track.times);
73077                                     }
73078                                 }
73079                             }
73080                         }
73081                         return {
73082                             geoms: geoms,
73083                             coordTimes: coordTimes
73084                         };
73085                     }
73086                     function getPlacemark(root) {
73087                         var geomsAndTimes = getGeometry(root), i, properties = {},
73088                             name = nodeVal(get1(root, 'name')),
73089                             address = nodeVal(get1(root, 'address')),
73090                             styleUrl = nodeVal(get1(root, 'styleUrl')),
73091                             description = nodeVal(get1(root, 'description')),
73092                             timeSpan = get1(root, 'TimeSpan'),
73093                             timeStamp = get1(root, 'TimeStamp'),
73094                             extendedData = get1(root, 'ExtendedData'),
73095                             lineStyle = get1(root, 'LineStyle'),
73096                             polyStyle = get1(root, 'PolyStyle'),
73097                             visibility = get1(root, 'visibility');
73098
73099                         if (!geomsAndTimes.geoms.length) return [];
73100                         if (name) properties.name = name;
73101                         if (address) properties.address = address;
73102                         if (styleUrl) {
73103                             if (styleUrl[0] !== '#') {
73104                                 styleUrl = '#' + styleUrl;
73105                             }
73106
73107                             properties.styleUrl = styleUrl;
73108                             if (styleIndex[styleUrl]) {
73109                                 properties.styleHash = styleIndex[styleUrl];
73110                             }
73111                             if (styleMapIndex[styleUrl]) {
73112                                 properties.styleMapHash = styleMapIndex[styleUrl];
73113                                 properties.styleHash = styleIndex[styleMapIndex[styleUrl].normal];
73114                             }
73115                             // Try to populate the lineStyle or polyStyle since we got the style hash
73116                             var style = styleByHash[properties.styleHash];
73117                             if (style) {
73118                                 if (!lineStyle) lineStyle = get1(style, 'LineStyle');
73119                                 if (!polyStyle) polyStyle = get1(style, 'PolyStyle');
73120                             }
73121                         }
73122                         if (description) properties.description = description;
73123                         if (timeSpan) {
73124                             var begin = nodeVal(get1(timeSpan, 'begin'));
73125                             var end = nodeVal(get1(timeSpan, 'end'));
73126                             properties.timespan = { begin: begin, end: end };
73127                         }
73128                         if (timeStamp) {
73129                             properties.timestamp = nodeVal(get1(timeStamp, 'when'));
73130                         }
73131                         if (lineStyle) {
73132                             var linestyles = kmlColor(nodeVal(get1(lineStyle, 'color'))),
73133                                 color = linestyles[0],
73134                                 opacity = linestyles[1],
73135                                 width = parseFloat(nodeVal(get1(lineStyle, 'width')));
73136                             if (color) properties.stroke = color;
73137                             if (!isNaN(opacity)) properties['stroke-opacity'] = opacity;
73138                             if (!isNaN(width)) properties['stroke-width'] = width;
73139                         }
73140                         if (polyStyle) {
73141                             var polystyles = kmlColor(nodeVal(get1(polyStyle, 'color'))),
73142                                 pcolor = polystyles[0],
73143                                 popacity = polystyles[1],
73144                                 fill = nodeVal(get1(polyStyle, 'fill')),
73145                                 outline = nodeVal(get1(polyStyle, 'outline'));
73146                             if (pcolor) properties.fill = pcolor;
73147                             if (!isNaN(popacity)) properties['fill-opacity'] = popacity;
73148                             if (fill) properties['fill-opacity'] = fill === '1' ? properties['fill-opacity'] || 1 : 0;
73149                             if (outline) properties['stroke-opacity'] = outline === '1' ? properties['stroke-opacity'] || 1 : 0;
73150                         }
73151                         if (extendedData) {
73152                             var datas = get(extendedData, 'Data'),
73153                                 simpleDatas = get(extendedData, 'SimpleData');
73154
73155                             for (i = 0; i < datas.length; i++) {
73156                                 properties[datas[i].getAttribute('name')] = nodeVal(get1(datas[i], 'value'));
73157                             }
73158                             for (i = 0; i < simpleDatas.length; i++) {
73159                                 properties[simpleDatas[i].getAttribute('name')] = nodeVal(simpleDatas[i]);
73160                             }
73161                         }
73162                         if (visibility) {
73163                             properties.visibility = nodeVal(visibility);
73164                         }
73165                         if (geomsAndTimes.coordTimes.length) {
73166                             properties.coordTimes = (geomsAndTimes.coordTimes.length === 1) ?
73167                                 geomsAndTimes.coordTimes[0] : geomsAndTimes.coordTimes;
73168                         }
73169                         var feature = {
73170                             type: 'Feature',
73171                             geometry: (geomsAndTimes.geoms.length === 1) ? geomsAndTimes.geoms[0] : {
73172                                 type: 'GeometryCollection',
73173                                 geometries: geomsAndTimes.geoms
73174                             },
73175                             properties: properties
73176                         };
73177                         if (attr(root, 'id')) feature.id = attr(root, 'id');
73178                         return [feature];
73179                     }
73180                     return gj;
73181                 },
73182                 gpx: function(doc) {
73183                     var i,
73184                         tracks = get(doc, 'trk'),
73185                         routes = get(doc, 'rte'),
73186                         waypoints = get(doc, 'wpt'),
73187                         // a feature collection
73188                         gj = fc(),
73189                         feature;
73190                     for (i = 0; i < tracks.length; i++) {
73191                         feature = getTrack(tracks[i]);
73192                         if (feature) gj.features.push(feature);
73193                     }
73194                     for (i = 0; i < routes.length; i++) {
73195                         feature = getRoute(routes[i]);
73196                         if (feature) gj.features.push(feature);
73197                     }
73198                     for (i = 0; i < waypoints.length; i++) {
73199                         gj.features.push(getPoint(waypoints[i]));
73200                     }
73201                     function getPoints(node, pointname) {
73202                         var pts = get(node, pointname),
73203                             line = [],
73204                             times = [],
73205                             heartRates = [],
73206                             l = pts.length;
73207                         if (l < 2) return {};  // Invalid line in GeoJSON
73208                         for (var i = 0; i < l; i++) {
73209                             var c = coordPair(pts[i]);
73210                             line.push(c.coordinates);
73211                             if (c.time) times.push(c.time);
73212                             if (c.heartRate) heartRates.push(c.heartRate);
73213                         }
73214                         return {
73215                             line: line,
73216                             times: times,
73217                             heartRates: heartRates
73218                         };
73219                     }
73220                     function getTrack(node) {
73221                         var segments = get(node, 'trkseg'),
73222                             track = [],
73223                             times = [],
73224                             heartRates = [],
73225                             line;
73226                         for (var i = 0; i < segments.length; i++) {
73227                             line = getPoints(segments[i], 'trkpt');
73228                             if (line) {
73229                                 if (line.line) track.push(line.line);
73230                                 if (line.times && line.times.length) times.push(line.times);
73231                                 if (line.heartRates && line.heartRates.length) heartRates.push(line.heartRates);
73232                             }
73233                         }
73234                         if (track.length === 0) return;
73235                         var properties = getProperties(node);
73236                         extend(properties, getLineStyle(get1(node, 'extensions')));
73237                         if (times.length) properties.coordTimes = track.length === 1 ? times[0] : times;
73238                         if (heartRates.length) properties.heartRates = track.length === 1 ? heartRates[0] : heartRates;
73239                         return {
73240                             type: 'Feature',
73241                             properties: properties,
73242                             geometry: {
73243                                 type: track.length === 1 ? 'LineString' : 'MultiLineString',
73244                                 coordinates: track.length === 1 ? track[0] : track
73245                             }
73246                         };
73247                     }
73248                     function getRoute(node) {
73249                         var line = getPoints(node, 'rtept');
73250                         if (!line.line) return;
73251                         var prop = getProperties(node);
73252                         extend(prop, getLineStyle(get1(node, 'extensions')));
73253                         var routeObj = {
73254                             type: 'Feature',
73255                             properties: prop,
73256                             geometry: {
73257                                 type: 'LineString',
73258                                 coordinates: line.line
73259                             }
73260                         };
73261                         return routeObj;
73262                     }
73263                     function getPoint(node) {
73264                         var prop = getProperties(node);
73265                         extend(prop, getMulti(node, ['sym']));
73266                         return {
73267                             type: 'Feature',
73268                             properties: prop,
73269                             geometry: {
73270                                 type: 'Point',
73271                                 coordinates: coordPair(node).coordinates
73272                             }
73273                         };
73274                     }
73275                     function getLineStyle(extensions) {
73276                         var style = {};
73277                         if (extensions) {
73278                             var lineStyle = get1(extensions, 'line');
73279                             if (lineStyle) {
73280                                 var color = nodeVal(get1(lineStyle, 'color')),
73281                                     opacity = parseFloat(nodeVal(get1(lineStyle, 'opacity'))),
73282                                     width = parseFloat(nodeVal(get1(lineStyle, 'width')));
73283                                 if (color) style.stroke = color;
73284                                 if (!isNaN(opacity)) style['stroke-opacity'] = opacity;
73285                                 // GPX width is in mm, convert to px with 96 px per inch
73286                                 if (!isNaN(width)) style['stroke-width'] = width * 96 / 25.4;
73287                             }
73288                         }
73289                         return style;
73290                     }
73291                     function getProperties(node) {
73292                         var prop = getMulti(node, ['name', 'cmt', 'desc', 'type', 'time', 'keywords']),
73293                             links = get(node, 'link');
73294                         if (links.length) prop.links = [];
73295                         for (var i = 0, link; i < links.length; i++) {
73296                             link = { href: attr(links[i], 'href') };
73297                             extend(link, getMulti(links[i], ['text', 'type']));
73298                             prop.links.push(link);
73299                         }
73300                         return prop;
73301                     }
73302                     return gj;
73303                 }
73304             };
73305             return t;
73306         })();
73307
73308         module.exports = toGeoJSON;
73309         });
73310
73311         var _initialized = false;
73312         var _enabled = false;
73313         var _geojson;
73314
73315
73316         function svgData(projection, context, dispatch) {
73317             var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
73318             var _showLabels = true;
73319             var detected = utilDetect();
73320             var layer = d3_select(null);
73321             var _vtService;
73322             var _fileList;
73323             var _template;
73324             var _src;
73325
73326
73327             function init() {
73328                 if (_initialized) return;  // run once
73329
73330                 _geojson = {};
73331                 _enabled = true;
73332
73333                 function over() {
73334                     event.stopPropagation();
73335                     event.preventDefault();
73336                     event.dataTransfer.dropEffect = 'copy';
73337                 }
73338
73339                 d3_select('body')
73340                     .attr('dropzone', 'copy')
73341                     .on('drop.svgData', function() {
73342                         event.stopPropagation();
73343                         event.preventDefault();
73344                         if (!detected.filedrop) return;
73345                         drawData.fileList(event.dataTransfer.files);
73346                     })
73347                     .on('dragenter.svgData', over)
73348                     .on('dragexit.svgData', over)
73349                     .on('dragover.svgData', over);
73350
73351                 _initialized = true;
73352             }
73353
73354
73355             function getService() {
73356                 if (services$1.vectorTile && !_vtService) {
73357                     _vtService = services$1.vectorTile;
73358                     _vtService.event.on('loadedData', throttledRedraw);
73359                 } else if (!services$1.vectorTile && _vtService) {
73360                     _vtService = null;
73361                 }
73362
73363                 return _vtService;
73364             }
73365
73366
73367             function showLayer() {
73368                 layerOn();
73369
73370                 layer
73371                     .style('opacity', 0)
73372                     .transition()
73373                     .duration(250)
73374                     .style('opacity', 1)
73375                     .on('end', function () { dispatch.call('change'); });
73376             }
73377
73378
73379             function hideLayer() {
73380                 throttledRedraw.cancel();
73381
73382                 layer
73383                     .transition()
73384                     .duration(250)
73385                     .style('opacity', 0)
73386                     .on('end', layerOff);
73387             }
73388
73389
73390             function layerOn() {
73391                 layer.style('display', 'block');
73392             }
73393
73394
73395             function layerOff() {
73396                 layer.selectAll('.viewfield-group').remove();
73397                 layer.style('display', 'none');
73398             }
73399
73400
73401             // ensure that all geojson features in a collection have IDs
73402             function ensureIDs(gj) {
73403                 if (!gj) return null;
73404
73405                 if (gj.type === 'FeatureCollection') {
73406                     for (var i = 0; i < gj.features.length; i++) {
73407                         ensureFeatureID(gj.features[i]);
73408                     }
73409                 } else {
73410                     ensureFeatureID(gj);
73411                 }
73412                 return gj;
73413             }
73414
73415
73416             // ensure that each single Feature object has a unique ID
73417             function ensureFeatureID(feature) {
73418                 if (!feature) return;
73419                 feature.__featurehash__ = utilHashcode(fastJsonStableStringify(feature));
73420                 return feature;
73421             }
73422
73423
73424             // Prefer an array of Features instead of a FeatureCollection
73425             function getFeatures(gj) {
73426                 if (!gj) return [];
73427
73428                 if (gj.type === 'FeatureCollection') {
73429                     return gj.features;
73430                 } else {
73431                     return [gj];
73432                 }
73433             }
73434
73435
73436             function featureKey(d) {
73437                 return d.__featurehash__;
73438             }
73439
73440
73441             function isPolygon(d) {
73442                 return d.geometry.type === 'Polygon' || d.geometry.type === 'MultiPolygon';
73443             }
73444
73445
73446             function clipPathID(d) {
73447                 return 'data-' + d.__featurehash__ + '-clippath';
73448             }
73449
73450
73451             function featureClasses(d) {
73452                 return [
73453                     'data' + d.__featurehash__,
73454                     d.geometry.type,
73455                     isPolygon(d) ? 'area' : '',
73456                     d.__layerID__ || ''
73457                 ].filter(Boolean).join(' ');
73458             }
73459
73460
73461             function drawData(selection) {
73462                 var vtService = getService();
73463                 var getPath = svgPath(projection).geojson;
73464                 var getAreaPath = svgPath(projection, null, true).geojson;
73465                 var hasData = drawData.hasData();
73466
73467                 layer = selection.selectAll('.layer-mapdata')
73468                     .data(_enabled && hasData ? [0] : []);
73469
73470                 layer.exit()
73471                     .remove();
73472
73473                 layer = layer.enter()
73474                     .append('g')
73475                     .attr('class', 'layer-mapdata')
73476                     .merge(layer);
73477
73478                 var surface = context.surface();
73479                 if (!surface || surface.empty()) return;  // not ready to draw yet, starting up
73480
73481
73482                 // Gather data
73483                 var geoData, polygonData;
73484                 if (_template && vtService) {   // fetch data from vector tile service
73485                     var sourceID = _template;
73486                     vtService.loadTiles(sourceID, _template, projection);
73487                     geoData = vtService.data(sourceID, projection);
73488                 } else {
73489                     geoData = getFeatures(_geojson);
73490                 }
73491                 geoData = geoData.filter(getPath);
73492                 polygonData = geoData.filter(isPolygon);
73493
73494
73495                 // Draw clip paths for polygons
73496                 var clipPaths = surface.selectAll('defs').selectAll('.clipPath-data')
73497                    .data(polygonData, featureKey);
73498
73499                 clipPaths.exit()
73500                    .remove();
73501
73502                 var clipPathsEnter = clipPaths.enter()
73503                    .append('clipPath')
73504                    .attr('class', 'clipPath-data')
73505                    .attr('id', clipPathID);
73506
73507                 clipPathsEnter
73508                    .append('path');
73509
73510                 clipPaths.merge(clipPathsEnter)
73511                    .selectAll('path')
73512                    .attr('d', getAreaPath);
73513
73514
73515                 // Draw fill, shadow, stroke layers
73516                 var datagroups = layer
73517                     .selectAll('g.datagroup')
73518                     .data(['fill', 'shadow', 'stroke']);
73519
73520                 datagroups = datagroups.enter()
73521                     .append('g')
73522                     .attr('class', function(d) { return 'datagroup datagroup-' + d; })
73523                     .merge(datagroups);
73524
73525
73526                 // Draw paths
73527                 var pathData = {
73528                     fill: polygonData,
73529                     shadow: geoData,
73530                     stroke: geoData
73531                 };
73532
73533                 var paths = datagroups
73534                     .selectAll('path')
73535                     .data(function(layer) { return pathData[layer]; }, featureKey);
73536
73537                 // exit
73538                 paths.exit()
73539                     .remove();
73540
73541                 // enter/update
73542                 paths = paths.enter()
73543                     .append('path')
73544                     .attr('class', function(d) {
73545                         var datagroup = this.parentNode.__data__;
73546                         return 'pathdata ' + datagroup + ' ' + featureClasses(d);
73547                     })
73548                     .attr('clip-path', function(d) {
73549                         var datagroup = this.parentNode.__data__;
73550                         return datagroup === 'fill' ? ('url(#' + clipPathID(d) + ')') : null;
73551                     })
73552                     .merge(paths)
73553                     .attr('d', function(d) {
73554                         var datagroup = this.parentNode.__data__;
73555                         return datagroup === 'fill' ? getAreaPath(d) : getPath(d);
73556                     });
73557
73558
73559                 // Draw labels
73560                 layer
73561                     .call(drawLabels, 'label-halo', geoData)
73562                     .call(drawLabels, 'label', geoData);
73563
73564
73565                 function drawLabels(selection, textClass, data) {
73566                     var labelPath = d3_geoPath(projection);
73567                     var labelData = data.filter(function(d) {
73568                         return _showLabels && d.properties && (d.properties.desc || d.properties.name);
73569                     });
73570
73571                     var labels = selection.selectAll('text.' + textClass)
73572                         .data(labelData, featureKey);
73573
73574                     // exit
73575                     labels.exit()
73576                         .remove();
73577
73578                     // enter/update
73579                     labels = labels.enter()
73580                         .append('text')
73581                         .attr('class', function(d) { return textClass + ' ' + featureClasses(d); })
73582                         .merge(labels)
73583                         .text(function(d) {
73584                             return d.properties.desc || d.properties.name;
73585                         })
73586                         .attr('x', function(d) {
73587                             var centroid = labelPath.centroid(d);
73588                             return centroid[0] + 11;
73589                         })
73590                         .attr('y', function(d) {
73591                             var centroid = labelPath.centroid(d);
73592                             return centroid[1];
73593                         });
73594                 }
73595             }
73596
73597
73598             function getExtension(fileName) {
73599                 if (!fileName) return;
73600
73601                 var re = /\.(gpx|kml|(geo)?json)$/i;
73602                 var match = fileName.toLowerCase().match(re);
73603                 return match && match.length && match[0];
73604             }
73605
73606
73607             function xmlToDom(textdata) {
73608                 return (new DOMParser()).parseFromString(textdata, 'text/xml');
73609             }
73610
73611
73612             drawData.setFile = function(extension, data) {
73613                 _template = null;
73614                 _fileList = null;
73615                 _geojson = null;
73616                 _src = null;
73617
73618                 var gj;
73619                 switch (extension) {
73620                     case '.gpx':
73621                         gj = togeojson.gpx(xmlToDom(data));
73622                         break;
73623                     case '.kml':
73624                         gj = togeojson.kml(xmlToDom(data));
73625                         break;
73626                     case '.geojson':
73627                     case '.json':
73628                         gj = JSON.parse(data);
73629                         break;
73630                 }
73631
73632                 gj = gj || {};
73633                 if (Object.keys(gj).length) {
73634                     _geojson = ensureIDs(gj);
73635                     _src = extension + ' data file';
73636                     this.fitZoom();
73637                 }
73638
73639                 dispatch.call('change');
73640                 return this;
73641             };
73642
73643
73644             drawData.showLabels = function(val) {
73645                 if (!arguments.length) return _showLabels;
73646
73647                 _showLabels = val;
73648                 return this;
73649             };
73650
73651
73652             drawData.enabled = function(val) {
73653                 if (!arguments.length) return _enabled;
73654
73655                 _enabled = val;
73656                 if (_enabled) {
73657                     showLayer();
73658                 } else {
73659                     hideLayer();
73660                 }
73661
73662                 dispatch.call('change');
73663                 return this;
73664             };
73665
73666
73667             drawData.hasData = function() {
73668                 var gj = _geojson || {};
73669                 return !!(_template || Object.keys(gj).length);
73670             };
73671
73672
73673             drawData.template = function(val, src) {
73674                 if (!arguments.length) return _template;
73675
73676                 // test source against OSM imagery blacklists..
73677                 var osm = context.connection();
73678                 if (osm) {
73679                     var blacklists = osm.imageryBlacklists();
73680                     var fail = false;
73681                     var tested = 0;
73682                     var regex;
73683
73684                     for (var i = 0; i < blacklists.length; i++) {
73685                         try {
73686                             regex = new RegExp(blacklists[i]);
73687                             fail = regex.test(val);
73688                             tested++;
73689                             if (fail) break;
73690                         } catch (e) {
73691                             /* noop */
73692                         }
73693                     }
73694
73695                     // ensure at least one test was run.
73696                     if (!tested) {
73697                         regex = new RegExp('.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*');
73698                         fail = regex.test(val);
73699                     }
73700                 }
73701
73702                 _template = val;
73703                 _fileList = null;
73704                 _geojson = null;
73705
73706                 // strip off the querystring/hash from the template,
73707                 // it often includes the access token
73708                 _src = src || ('vectortile:' + val.split(/[?#]/)[0]);
73709
73710                 dispatch.call('change');
73711                 return this;
73712             };
73713
73714
73715             drawData.geojson = function(gj, src) {
73716                 if (!arguments.length) return _geojson;
73717
73718                 _template = null;
73719                 _fileList = null;
73720                 _geojson = null;
73721                 _src = null;
73722
73723                 gj = gj || {};
73724                 if (Object.keys(gj).length) {
73725                     _geojson = ensureIDs(gj);
73726                     _src = src || 'unknown.geojson';
73727                 }
73728
73729                 dispatch.call('change');
73730                 return this;
73731             };
73732
73733
73734             drawData.fileList = function(fileList) {
73735                 if (!arguments.length) return _fileList;
73736
73737                 _template = null;
73738                 _fileList = fileList;
73739                 _geojson = null;
73740                 _src = null;
73741
73742                 if (!fileList || !fileList.length) return this;
73743                 var f = fileList[0];
73744                 var extension = getExtension(f.name);
73745                 var reader = new FileReader();
73746                 reader.onload = (function() {
73747                     return function(e) {
73748                         drawData.setFile(extension, e.target.result);
73749                     };
73750                 })();
73751
73752                 reader.readAsText(f);
73753
73754                 return this;
73755             };
73756
73757
73758             drawData.url = function(url, defaultExtension) {
73759                 _template = null;
73760                 _fileList = null;
73761                 _geojson = null;
73762                 _src = null;
73763
73764                 // strip off any querystring/hash from the url before checking extension
73765                 var testUrl = url.split(/[?#]/)[0];
73766                 var extension = getExtension(testUrl) || defaultExtension;
73767                 if (extension) {
73768                     _template = null;
73769                     d3_text(url)
73770                         .then(function(data) {
73771                             drawData.setFile(extension, data);
73772                         })
73773                         .catch(function() {
73774                             /* ignore */
73775                         });
73776
73777                 } else {
73778                     drawData.template(url);
73779                 }
73780
73781                 return this;
73782             };
73783
73784
73785             drawData.getSrc = function() {
73786                 return _src || '';
73787             };
73788
73789
73790             drawData.fitZoom = function() {
73791                 var features = getFeatures(_geojson);
73792                 if (!features.length) return;
73793
73794                 var map = context.map();
73795                 var viewport = map.trimmedExtent().polygon();
73796                 var coords = features.reduce(function(coords, feature) {
73797                     var c = feature.geometry.coordinates;
73798
73799                     /* eslint-disable no-fallthrough */
73800                     switch (feature.geometry.type) {
73801                         case 'Point':
73802                             c = [c];
73803                         case 'MultiPoint':
73804                         case 'LineString':
73805                             break;
73806
73807                         case 'MultiPolygon':
73808                             c = utilArrayFlatten(c);
73809                         case 'Polygon':
73810                         case 'MultiLineString':
73811                             c = utilArrayFlatten(c);
73812                             break;
73813                     }
73814                     /* eslint-enable no-fallthrough */
73815
73816                     return utilArrayUnion(coords, c);
73817                 }, []);
73818
73819                 if (!geoPolygonIntersectsPolygon(viewport, coords, true)) {
73820                     var extent = geoExtent(d3_geoBounds({ type: 'LineString', coordinates: coords }));
73821                     map.centerZoom(extent.center(), map.trimmedExtentZoom(extent));
73822                 }
73823
73824                 return this;
73825             };
73826
73827
73828             init();
73829             return drawData;
73830         }
73831
73832         function svgDebug(projection, context) {
73833
73834             function drawDebug(selection) {
73835                 var showsTile = context.getDebug('tile');
73836                 var showsCollision = context.getDebug('collision');
73837                 var showsImagery = context.getDebug('imagery');
73838                 var showsCommunity = context.getDebug('community');
73839                 var showsImperial = context.getDebug('imperial');
73840                 var showsDriveLeft = context.getDebug('driveLeft');
73841                 var showsTouchTargets = context.getDebug('target');
73842                 var showsDownloaded = context.getDebug('downloaded');
73843
73844                 var debugData = [];
73845                 if (showsTile) {
73846                     debugData.push({ class: 'red', label: 'tile' });
73847                 }
73848                 if (showsCollision) {
73849                     debugData.push({ class: 'yellow', label: 'collision' });
73850                 }
73851                 if (showsImagery) {
73852                     debugData.push({ class: 'orange', label: 'imagery' });
73853                 }
73854                 if (showsCommunity) {
73855                     debugData.push({ class: 'blue', label: 'community' });
73856                 }
73857                 if (showsImperial) {
73858                     debugData.push({ class: 'cyan', label: 'imperial' });
73859                 }
73860                 if (showsDriveLeft) {
73861                     debugData.push({ class: 'green', label: 'driveLeft' });
73862                 }
73863                 if (showsTouchTargets) {
73864                     debugData.push({ class: 'pink', label: 'touchTargets' });
73865                 }
73866                 if (showsDownloaded) {
73867                     debugData.push({ class: 'purple', label: 'downloaded' });
73868                 }
73869
73870
73871                 var legend = d3_select('#content')
73872                     .selectAll('.debug-legend')
73873                     .data(debugData.length ? [0] : []);
73874
73875                 legend.exit()
73876                     .remove();
73877
73878                 legend = legend.enter()
73879                     .append('div')
73880                     .attr('class', 'fillD debug-legend')
73881                     .merge(legend);
73882
73883
73884                 var legendItems = legend.selectAll('.debug-legend-item')
73885                     .data(debugData, function(d) { return d.label; });
73886
73887                 legendItems.exit()
73888                     .remove();
73889
73890                 legendItems.enter()
73891                     .append('span')
73892                     .attr('class', function(d) { return 'debug-legend-item ' + d.class; })
73893                     .text(function(d) { return d.label; });
73894
73895
73896                 var layer = selection.selectAll('.layer-debug')
73897                     .data(showsImagery || showsCommunity || showsImperial || showsDriveLeft || showsDownloaded ? [0] : []);
73898
73899                 layer.exit()
73900                     .remove();
73901
73902                 layer = layer.enter()
73903                     .append('g')
73904                     .attr('class', 'layer-debug')
73905                     .merge(layer);
73906
73907
73908                 // imagery
73909                 var extent = context.map().extent();
73910                 var matchImagery = (showsImagery && data.imagery.query.bbox(extent.rectangle(), true)) || [];
73911                 var features = matchImagery.map(function(d) { return data.imagery.features[d.id]; });
73912
73913                 var imagery = layer.selectAll('path.debug-imagery')
73914                     .data(features);
73915
73916                 imagery.exit()
73917                     .remove();
73918
73919                 imagery.enter()
73920                     .append('path')
73921                     .attr('class', 'debug-imagery debug orange');
73922
73923
73924                 // community index
73925                 var community = layer.selectAll('path.debug-community')
73926                     .data(showsCommunity ? Object.values(data.community.features) : []);
73927
73928                 community.exit()
73929                     .remove();
73930
73931                 community.enter()
73932                     .append('path')
73933                     .attr('class', 'debug-community debug blue');
73934
73935
73936                 // imperial
73937                 var imperial = layer
73938                     .selectAll('path.debug-imperial')
73939                     .data(showsImperial ? [dataImperial] : []);
73940
73941                 imperial.exit()
73942                     .remove();
73943
73944                 imperial.enter()
73945                     .append('path')
73946                     .attr('class', 'debug-imperial debug cyan');
73947
73948
73949                 // driveleft
73950                 var driveLeft = layer
73951                     .selectAll('path.debug-drive-left')
73952                     .data(showsDriveLeft ? [dataDriveLeft] : []);
73953
73954                 driveLeft.exit()
73955                     .remove();
73956
73957                 driveLeft.enter()
73958                     .append('path')
73959                     .attr('class', 'debug-drive-left debug green');
73960
73961
73962                 // downloaded
73963                 var osm = context.connection();
73964                 var dataDownloaded = [];
73965
73966                 if (osm) {
73967                     var rtree = osm.caches('get').tile.rtree;
73968                     dataDownloaded = rtree.all().map(function(bbox) {
73969                         return {
73970                             type: 'Feature',
73971                             properties: { id: bbox.id },
73972                             geometry: {
73973                                 type: 'Polygon',
73974                                 coordinates: [[
73975                                     [ bbox.minX, bbox.minY ],
73976                                     [ bbox.minX, bbox.maxY ],
73977                                     [ bbox.maxX, bbox.maxY ],
73978                                     [ bbox.maxX, bbox.minY ],
73979                                     [ bbox.minX, bbox.minY ]
73980                                 ]]
73981                             }
73982                         };
73983                     });
73984                 }
73985
73986
73987                 var downloaded = layer
73988                     .selectAll('path.debug-downloaded')
73989                     .data(showsDownloaded ? dataDownloaded : []);
73990
73991                 downloaded.exit()
73992                     .remove();
73993
73994                 downloaded.enter()
73995                     .append('path')
73996                     .attr('class', 'debug-downloaded debug purple');
73997
73998
73999                 // update
74000                 layer.selectAll('path')
74001                     .attr('d', svgPath(projection).geojson);
74002             }
74003
74004
74005             // This looks strange because `enabled` methods on other layers are
74006             // chainable getter/setters, and this one is just a getter.
74007             drawDebug.enabled = function() {
74008                 if (!arguments.length) {
74009                     return context.getDebug('tile') ||
74010                         context.getDebug('collision') ||
74011                         context.getDebug('imagery') ||
74012                         context.getDebug('imperial') ||
74013                         context.getDebug('driveLeft') ||
74014                         context.getDebug('target') ||
74015                         context.getDebug('downloaded');
74016                 } else {
74017                     return this;
74018                 }
74019             };
74020
74021
74022             return drawDebug;
74023         }
74024
74025         var _keepRightEnabled = false;
74026         var _keepRightService;
74027
74028
74029         function svgKeepRight(projection, context, dispatch) {
74030             var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
74031             var minZoom = 12;
74032             var touchLayer = d3_select(null);
74033             var drawLayer = d3_select(null);
74034             var _keepRightVisible = false;
74035
74036
74037             function markerPath(selection, klass) {
74038                 selection
74039                     .attr('class', klass)
74040                     .attr('transform', 'translate(-4, -24)')
74041                     .attr('d', 'M11.6,6.2H7.1l1.4-5.1C8.6,0.6,8.1,0,7.5,0H2.2C1.7,0,1.3,0.3,1.3,0.8L0,10.2c-0.1,0.6,0.4,1.1,0.9,1.1h4.6l-1.8,7.6C3.6,19.4,4.1,20,4.7,20c0.3,0,0.6-0.2,0.8-0.5l6.9-11.9C12.7,7,12.3,6.2,11.6,6.2z');
74042             }
74043
74044
74045             // Loosely-coupled keepRight service for fetching errors.
74046             function getService() {
74047                 if (services$1.keepRight && !_keepRightService) {
74048                     _keepRightService = services$1.keepRight;
74049                     _keepRightService.on('loaded', throttledRedraw);
74050                 } else if (!services$1.keepRight && _keepRightService) {
74051                     _keepRightService = null;
74052                 }
74053
74054                 return _keepRightService;
74055             }
74056
74057
74058             // Show the errors
74059             function editOn() {
74060                 if (!_keepRightVisible) {
74061                     _keepRightVisible = true;
74062                     drawLayer
74063                         .style('display', 'block');
74064                 }
74065             }
74066
74067
74068             // Immediately remove the errors and their touch targets
74069             function editOff() {
74070                 if (_keepRightVisible) {
74071                     _keepRightVisible = false;
74072                     drawLayer
74073                         .style('display', 'none');
74074                     drawLayer.selectAll('.qa_error.keepRight')
74075                         .remove();
74076                     touchLayer.selectAll('.qa_error.keepRight')
74077                         .remove();
74078                 }
74079             }
74080
74081
74082             // Enable the layer.  This shows the errors and transitions them to visible.
74083             function layerOn() {
74084                 editOn();
74085
74086                 drawLayer
74087                     .style('opacity', 0)
74088                     .transition()
74089                     .duration(250)
74090                     .style('opacity', 1)
74091                     .on('end interrupt', function () {
74092                         dispatch.call('change');
74093                     });
74094             }
74095
74096
74097             // Disable the layer.  This transitions the layer invisible and then hides the errors.
74098             function layerOff() {
74099                 throttledRedraw.cancel();
74100                 drawLayer.interrupt();
74101                 touchLayer.selectAll('.qa_error.keepRight')
74102                     .remove();
74103
74104                 drawLayer
74105                     .transition()
74106                     .duration(250)
74107                     .style('opacity', 0)
74108                     .on('end interrupt', function () {
74109                         editOff();
74110                         dispatch.call('change');
74111                     });
74112             }
74113
74114
74115             // Update the error markers
74116             function updateMarkers() {
74117                 if (!_keepRightVisible || !_keepRightEnabled) return;
74118
74119                 var service = getService();
74120                 var selectedID = context.selectedErrorID();
74121                 var data = (service ? service.getErrors(projection) : []);
74122                 var getTransform = svgPointTransform(projection);
74123
74124                 // Draw markers..
74125                 var markers = drawLayer.selectAll('.qa_error.keepRight')
74126                     .data(data, function(d) { return d.id; });
74127
74128                 // exit
74129                 markers.exit()
74130                     .remove();
74131
74132                 // enter
74133                 var markersEnter = markers.enter()
74134                     .append('g')
74135                     .attr('class', function(d) {
74136                         return [
74137                             'qa_error',
74138                             d.service,
74139                             'error_id-' + d.id,
74140                             'error_type-' + d.parent_error_type
74141                         ].join(' ');
74142                     });
74143
74144                 markersEnter
74145                     .append('ellipse')
74146                     .attr('cx', 0.5)
74147                     .attr('cy', 1)
74148                     .attr('rx', 6.5)
74149                     .attr('ry', 3)
74150                     .attr('class', 'stroke');
74151
74152                 markersEnter
74153                     .append('path')
74154                     .call(markerPath, 'shadow');
74155
74156                 markersEnter
74157                     .append('use')
74158                     .attr('class', 'qa_error-fill')
74159                     .attr('width', '20px')
74160                     .attr('height', '20px')
74161                     .attr('x', '-8px')
74162                     .attr('y', '-22px')
74163                     .attr('xlink:href', '#iD-icon-bolt');
74164
74165                 // update
74166                 markers
74167                     .merge(markersEnter)
74168                     .sort(sortY)
74169                     .classed('selected', function(d) { return d.id === selectedID; })
74170                     .attr('transform', getTransform);
74171
74172
74173                 // Draw targets..
74174                 if (touchLayer.empty()) return;
74175                 var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
74176
74177                 var targets = touchLayer.selectAll('.qa_error.keepRight')
74178                     .data(data, function(d) { return d.id; });
74179
74180                 // exit
74181                 targets.exit()
74182                     .remove();
74183
74184                 // enter/update
74185                 targets.enter()
74186                     .append('rect')
74187                     .attr('width', '20px')
74188                     .attr('height', '20px')
74189                     .attr('x', '-8px')
74190                     .attr('y', '-22px')
74191                     .merge(targets)
74192                     .sort(sortY)
74193                     .attr('class', function(d) {
74194                         return 'qa_error ' + d.service + ' target error_id-' + d.id + ' ' + fillClass;
74195                     })
74196                     .attr('transform', getTransform);
74197
74198
74199                 function sortY(a, b) {
74200                     return (a.id === selectedID) ? 1
74201                         : (b.id === selectedID) ? -1
74202                         : (a.severity === 'error' && b.severity !== 'error') ? 1
74203                         : (b.severity === 'error' && a.severity !== 'error') ? -1
74204                         : b.loc[1] - a.loc[1];
74205                 }
74206             }
74207
74208
74209             // Draw the keepRight layer and schedule loading errors and updating markers.
74210             function drawKeepRight(selection) {
74211                 var service = getService();
74212
74213                 var surface = context.surface();
74214                 if (surface && !surface.empty()) {
74215                     touchLayer = surface.selectAll('.data-layer.touch .layer-touch.markers');
74216                 }
74217
74218                 drawLayer = selection.selectAll('.layer-keepRight')
74219                     .data(service ? [0] : []);
74220
74221                 drawLayer.exit()
74222                     .remove();
74223
74224                 drawLayer = drawLayer.enter()
74225                     .append('g')
74226                     .attr('class', 'layer-keepRight')
74227                     .style('display', _keepRightEnabled ? 'block' : 'none')
74228                     .merge(drawLayer);
74229
74230                 if (_keepRightEnabled) {
74231                     if (service && ~~context.map().zoom() >= minZoom) {
74232                         editOn();
74233                         service.loadErrors(projection);
74234                         updateMarkers();
74235                     } else {
74236                         editOff();
74237                     }
74238                 }
74239             }
74240
74241
74242             // Toggles the layer on and off
74243             drawKeepRight.enabled = function(val) {
74244                 if (!arguments.length) return _keepRightEnabled;
74245
74246                 _keepRightEnabled = val;
74247                 if (_keepRightEnabled) {
74248                     layerOn();
74249                 } else {
74250                     layerOff();
74251                     if (context.selectedErrorID()) {
74252                         context.enter(modeBrowse(context));
74253                     }
74254                 }
74255
74256                 dispatch.call('change');
74257                 return this;
74258             };
74259
74260
74261             drawKeepRight.supported = function() {
74262                 return !!getService();
74263             };
74264
74265
74266             return drawKeepRight;
74267         }
74268
74269         function svgGeolocate(projection) {
74270             var layer = d3_select(null);
74271             var _position;
74272
74273
74274             function init() {
74275                 if (svgGeolocate.initialized) return;  // run once
74276                 svgGeolocate.enabled = false;
74277                 svgGeolocate.initialized = true;
74278             }
74279
74280             function showLayer() {
74281                 layer.style('display', 'block');
74282             }
74283
74284
74285             function hideLayer() {
74286                 layer
74287                     .transition()
74288                     .duration(250)
74289                     .style('opacity', 0);
74290             }
74291
74292             function layerOn() {
74293                 layer
74294                     .style('opacity', 0)
74295                     .transition()
74296                     .duration(250)
74297                     .style('opacity', 1);
74298
74299             }
74300
74301             function layerOff() {
74302                 layer.style('display', 'none');
74303             }
74304
74305             function transform(d) {
74306                 return svgPointTransform(projection)(d);
74307             }
74308
74309             function accuracy(accuracy, loc) { // converts accuracy to pixels...
74310                 var degreesRadius = geoMetersToLat(accuracy),
74311                     tangentLoc = [loc[0], loc[1] + degreesRadius],
74312                     projectedTangent = projection(tangentLoc),
74313                     projectedLoc = projection([loc[0], loc[1]]);
74314
74315                 // southern most point will have higher pixel value...
74316                return Math.round(projectedLoc[1] - projectedTangent[1]).toString();
74317             }
74318
74319             function update() {
74320                 var geolocation = { loc: [_position.coords.longitude, _position.coords.latitude] };
74321
74322                 var groups = layer.selectAll('.geolocations').selectAll('.geolocation')
74323                     .data([geolocation]);
74324
74325                 groups.exit()
74326                     .remove();
74327
74328                 var pointsEnter = groups.enter()
74329                     .append('g')
74330                     .attr('class', 'geolocation');
74331
74332                 pointsEnter
74333                     .append('circle')
74334                     .attr('id', 'geolocate-radius')
74335                     .attr('dx', '0')
74336                     .attr('dy', '0')
74337                     .attr('fill', 'rgb(15,128,225)')
74338                     .attr('fill-opacity', '0.3')
74339                     .attr('r', '0');
74340
74341                 pointsEnter
74342                     .append('circle')
74343                     .attr('dx', '0')
74344                     .attr('dy', '0')
74345                     .attr('fill', 'rgb(15,128,225)')
74346                     .attr('stroke', 'white')
74347                     .attr('stroke-width', '1.5')
74348                     .attr('r', '6');
74349
74350                 groups.merge(pointsEnter)
74351                     .attr('transform', transform);
74352
74353                 d3_select('#geolocate-radius').attr('r', accuracy(_position.coords.accuracy, geolocation.loc));
74354             }
74355
74356             function drawLocation(selection) {
74357                 var enabled = svgGeolocate.enabled;
74358
74359                 layer = selection.selectAll('.layer-geolocate')
74360                     .data([0]);
74361
74362                 layer.exit()
74363                     .remove();
74364
74365                 var layerEnter = layer.enter()
74366                     .append('g')
74367                     .attr('class', 'layer-geolocate')
74368                     .style('display', enabled ? 'block' : 'none');
74369
74370                 layerEnter
74371                     .append('g')
74372                     .attr('class', 'geolocations');
74373
74374                 layer = layerEnter
74375                     .merge(layer);
74376
74377                 if (enabled) {
74378                     update();
74379                 } else {
74380                     layerOff();
74381                 }
74382             }
74383
74384             drawLocation.enabled = function (position, enabled) {
74385                 if (!arguments.length) return svgGeolocate.enabled;
74386                 _position = position;
74387                 svgGeolocate.enabled = enabled;
74388                 if (svgGeolocate.enabled) {
74389                     showLayer();
74390                     layerOn();
74391                 } else {
74392                     hideLayer();
74393                 }
74394                 return this;
74395             };
74396
74397             init();
74398             return drawLocation;
74399         }
74400
74401         function svgLabels(projection, context) {
74402             var path = d3_geoPath(projection);
74403             var detected = utilDetect();
74404             var baselineHack = (detected.ie || detected.browser.toLowerCase() === 'edge');
74405             var _rdrawn = rbush_1();
74406             var _rskipped = rbush_1();
74407             var _textWidthCache = {};
74408             var _entitybboxes = {};
74409
74410             // Listed from highest to lowest priority
74411             var labelStack = [
74412                 ['line', 'aeroway', '*', 12],
74413                 ['line', 'highway', 'motorway', 12],
74414                 ['line', 'highway', 'trunk', 12],
74415                 ['line', 'highway', 'primary', 12],
74416                 ['line', 'highway', 'secondary', 12],
74417                 ['line', 'highway', 'tertiary', 12],
74418                 ['line', 'highway', '*', 12],
74419                 ['line', 'railway', '*', 12],
74420                 ['line', 'waterway', '*', 12],
74421                 ['area', 'aeroway', '*', 12],
74422                 ['area', 'amenity', '*', 12],
74423                 ['area', 'building', '*', 12],
74424                 ['area', 'historic', '*', 12],
74425                 ['area', 'leisure', '*', 12],
74426                 ['area', 'man_made', '*', 12],
74427                 ['area', 'natural', '*', 12],
74428                 ['area', 'shop', '*', 12],
74429                 ['area', 'tourism', '*', 12],
74430                 ['area', 'camp_site', '*', 12],
74431                 ['point', 'aeroway', '*', 10],
74432                 ['point', 'amenity', '*', 10],
74433                 ['point', 'building', '*', 10],
74434                 ['point', 'historic', '*', 10],
74435                 ['point', 'leisure', '*', 10],
74436                 ['point', 'man_made', '*', 10],
74437                 ['point', 'natural', '*', 10],
74438                 ['point', 'shop', '*', 10],
74439                 ['point', 'tourism', '*', 10],
74440                 ['point', 'camp_site', '*', 10],
74441                 ['line', 'name', '*', 12],
74442                 ['area', 'name', '*', 12],
74443                 ['point', 'name', '*', 10]
74444             ];
74445
74446
74447             function blacklisted(preset) {
74448                 var noIcons = ['building', 'landuse', 'natural'];
74449                 return noIcons.some(function(s) {
74450                     return preset.id.indexOf(s) >= 0;
74451                 });
74452             }
74453
74454
74455             function get(array, prop) {
74456                 return function(d, i) { return array[i][prop]; };
74457             }
74458
74459
74460             function textWidth(text, size, elem) {
74461                 var c = _textWidthCache[size];
74462                 if (!c) c = _textWidthCache[size] = {};
74463
74464                 if (c[text]) {
74465                     return c[text];
74466
74467                 } else if (elem) {
74468                     c[text] = elem.getComputedTextLength();
74469                     return c[text];
74470
74471                 } else {
74472                     var str = encodeURIComponent(text).match(/%[CDEFcdef]/g);
74473                     if (str === null) {
74474                         return size / 3 * 2 * text.length;
74475                     } else {
74476                         return size / 3 * (2 * text.length + str.length);
74477                     }
74478                 }
74479             }
74480
74481
74482             function drawLinePaths(selection, entities, filter, classes, labels) {
74483                 var paths = selection.selectAll('path')
74484                     .filter(filter)
74485                     .data(entities, osmEntity.key);
74486
74487                 // exit
74488                 paths.exit()
74489                     .remove();
74490
74491                 // enter/update
74492                 paths.enter()
74493                     .append('path')
74494                     .style('stroke-width', get(labels, 'font-size'))
74495                     .attr('id', function(d) { return 'labelpath-' + d.id; })
74496                     .attr('class', classes)
74497                     .merge(paths)
74498                     .attr('d', get(labels, 'lineString'));
74499             }
74500
74501
74502             function drawLineLabels(selection, entities, filter, classes, labels) {
74503                 var texts = selection.selectAll('text.' + classes)
74504                     .filter(filter)
74505                     .data(entities, osmEntity.key);
74506
74507                 // exit
74508                 texts.exit()
74509                     .remove();
74510
74511                 // enter
74512                 texts.enter()
74513                     .append('text')
74514                     .attr('class', function(d, i) { return classes + ' ' + labels[i].classes + ' ' + d.id; })
74515                     .attr('dy', baselineHack ? '0.35em' : null)
74516                     .append('textPath')
74517                     .attr('class', 'textpath');
74518
74519                 // update
74520                 selection.selectAll('text.' + classes).selectAll('.textpath')
74521                     .filter(filter)
74522                     .data(entities, osmEntity.key)
74523                     .attr('startOffset', '50%')
74524                     .attr('xlink:href', function(d) { return '#labelpath-' + d.id; })
74525                     .text(utilDisplayNameForPath);
74526             }
74527
74528
74529             function drawPointLabels(selection, entities, filter, classes, labels) {
74530                 var texts = selection.selectAll('text.' + classes)
74531                     .filter(filter)
74532                     .data(entities, osmEntity.key);
74533
74534                 // exit
74535                 texts.exit()
74536                     .remove();
74537
74538                 // enter/update
74539                 texts.enter()
74540                     .append('text')
74541                     .attr('class', function(d, i) {
74542                         return classes + ' ' + labels[i].classes + ' ' + d.id;
74543                     })
74544                     .merge(texts)
74545                     .attr('x', get(labels, 'x'))
74546                     .attr('y', get(labels, 'y'))
74547                     .style('text-anchor', get(labels, 'textAnchor'))
74548                     .text(utilDisplayName)
74549                     .each(function(d, i) {
74550                         textWidth(utilDisplayName(d), labels[i].height, this);
74551                     });
74552             }
74553
74554
74555             function drawAreaLabels(selection, entities, filter, classes, labels) {
74556                 entities = entities.filter(hasText);
74557                 labels = labels.filter(hasText);
74558                 drawPointLabels(selection, entities, filter, classes, labels);
74559
74560                 function hasText(d, i) {
74561                     return labels[i].hasOwnProperty('x') && labels[i].hasOwnProperty('y');
74562                 }
74563             }
74564
74565
74566             function drawAreaIcons(selection, entities, filter, classes, labels) {
74567                 var icons = selection.selectAll('use.' + classes)
74568                     .filter(filter)
74569                     .data(entities, osmEntity.key);
74570
74571                 // exit
74572                 icons.exit()
74573                     .remove();
74574
74575                 // enter/update
74576                 icons.enter()
74577                     .append('use')
74578                     .attr('class', 'icon ' + classes)
74579                     .attr('width', '17px')
74580                     .attr('height', '17px')
74581                     .merge(icons)
74582                     .attr('transform', get(labels, 'transform'))
74583                     .attr('xlink:href', function(d) {
74584                         var preset = context.presets().match(d, context.graph());
74585                         var picon = preset && preset.icon;
74586
74587                         if (!picon) {
74588                             return '';
74589                         } else {
74590                             var isMaki = /^maki-/.test(picon);
74591                             return '#' + picon + (isMaki ? '-15' : '');
74592                         }
74593                     });
74594             }
74595
74596
74597             function drawCollisionBoxes(selection, rtree, which) {
74598                 var classes = 'debug ' + which + ' ' + (which === 'debug-skipped' ? 'orange' : 'yellow');
74599
74600                 var gj = [];
74601                 if (context.getDebug('collision')) {
74602                     gj = rtree.all().map(function(d) {
74603                         return { type: 'Polygon', coordinates: [[
74604                             [d.minX, d.minY],
74605                             [d.maxX, d.minY],
74606                             [d.maxX, d.maxY],
74607                             [d.minX, d.maxY],
74608                             [d.minX, d.minY]
74609                         ]]};
74610                     });
74611                 }
74612
74613                 var boxes = selection.selectAll('.' + which)
74614                     .data(gj);
74615
74616                 // exit
74617                 boxes.exit()
74618                     .remove();
74619
74620                 // enter/update
74621                 boxes.enter()
74622                     .append('path')
74623                     .attr('class', classes)
74624                     .merge(boxes)
74625                     .attr('d', d3_geoPath());
74626             }
74627
74628
74629             function drawLabels(selection, graph, entities, filter, dimensions, fullRedraw) {
74630                 var wireframe = context.surface().classed('fill-wireframe');
74631                 var zoom = geoScaleToZoom(projection.scale());
74632
74633                 var labelable = [];
74634                 var renderNodeAs = {};
74635                 var i, j, k, entity, geometry;
74636
74637                 for (i = 0; i < labelStack.length; i++) {
74638                     labelable.push([]);
74639                 }
74640
74641                 if (fullRedraw) {
74642                     _rdrawn.clear();
74643                     _rskipped.clear();
74644                     _entitybboxes = {};
74645
74646                 } else {
74647                     for (i = 0; i < entities.length; i++) {
74648                         entity = entities[i];
74649                         var toRemove = []
74650                             .concat(_entitybboxes[entity.id] || [])
74651                             .concat(_entitybboxes[entity.id + 'I'] || []);
74652
74653                         for (j = 0; j < toRemove.length; j++) {
74654                             _rdrawn.remove(toRemove[j]);
74655                             _rskipped.remove(toRemove[j]);
74656                         }
74657                     }
74658                 }
74659
74660                 // Loop through all the entities to do some preprocessing
74661                 for (i = 0; i < entities.length; i++) {
74662                     entity = entities[i];
74663                     geometry = entity.geometry(graph);
74664
74665                     // Insert collision boxes around interesting points/vertices
74666                     if (geometry === 'point' || (geometry === 'vertex' && isInterestingVertex(entity))) {
74667                         var hasDirections = entity.directions(graph, projection).length;
74668                         var markerPadding;
74669
74670                         if (!wireframe && geometry === 'point' && !(zoom >= 18 && hasDirections)) {
74671                             renderNodeAs[entity.id] = 'point';
74672                             markerPadding = 20;   // extra y for marker height
74673                         } else {
74674                             renderNodeAs[entity.id] = 'vertex';
74675                             markerPadding = 0;
74676                         }
74677
74678                         var coord = projection(entity.loc);
74679                         var nodePadding = 10;
74680                         var bbox = {
74681                             minX: coord[0] - nodePadding,
74682                             minY: coord[1] - nodePadding - markerPadding,
74683                             maxX: coord[0] + nodePadding,
74684                             maxY: coord[1] + nodePadding
74685                         };
74686
74687                         doInsert(bbox, entity.id + 'P');
74688                     }
74689
74690                     // From here on, treat vertices like points
74691                     if (geometry === 'vertex') {
74692                         geometry = 'point';
74693                     }
74694
74695                     // Determine which entities are label-able
74696                     var preset = geometry === 'area' && context.presets().match(entity, graph);
74697                     var icon = preset && !blacklisted(preset) && preset.icon;
74698
74699                     if (!icon && !utilDisplayName(entity))
74700                         continue;
74701
74702                     for (k = 0; k < labelStack.length; k++) {
74703                         var matchGeom = labelStack[k][0];
74704                         var matchKey = labelStack[k][1];
74705                         var matchVal = labelStack[k][2];
74706                         var hasVal = entity.tags[matchKey];
74707
74708                         if (geometry === matchGeom && hasVal && (matchVal === '*' || matchVal === hasVal)) {
74709                             labelable[k].push(entity);
74710                             break;
74711                         }
74712                     }
74713                 }
74714
74715                 var positions = {
74716                     point: [],
74717                     line: [],
74718                     area: []
74719                 };
74720
74721                 var labelled = {
74722                     point: [],
74723                     line: [],
74724                     area: []
74725                 };
74726
74727                 // Try and find a valid label for labellable entities
74728                 for (k = 0; k < labelable.length; k++) {
74729                     var fontSize = labelStack[k][3];
74730
74731                     for (i = 0; i < labelable[k].length; i++) {
74732                         entity = labelable[k][i];
74733                         geometry = entity.geometry(graph);
74734
74735                         var getName = (geometry === 'line') ? utilDisplayNameForPath : utilDisplayName;
74736                         var name = getName(entity);
74737                         var width = name && textWidth(name, fontSize);
74738                         var p = null;
74739
74740                         if (geometry === 'point' || geometry === 'vertex') {
74741                             // no point or vertex labels in wireframe mode
74742                             // no vertex labels at low zooms (vertices have no icons)
74743                             if (wireframe) continue;
74744                             var renderAs = renderNodeAs[entity.id];
74745                             if (renderAs === 'vertex' && zoom < 17) continue;
74746
74747                             p = getPointLabel(entity, width, fontSize, renderAs);
74748
74749                         } else if (geometry === 'line') {
74750                             p = getLineLabel(entity, width, fontSize);
74751
74752                         } else if (geometry === 'area') {
74753                             p = getAreaLabel(entity, width, fontSize);
74754                         }
74755
74756                         if (p) {
74757                             if (geometry === 'vertex') { geometry = 'point'; }  // treat vertex like point
74758                             p.classes = geometry + ' tag-' + labelStack[k][1];
74759                             positions[geometry].push(p);
74760                             labelled[geometry].push(entity);
74761                         }
74762                     }
74763                 }
74764
74765
74766                 function isInterestingVertex(entity) {
74767                     var selectedIDs = context.selectedIDs();
74768
74769                     return entity.hasInterestingTags() ||
74770                         entity.isEndpoint(graph) ||
74771                         entity.isConnected(graph) ||
74772                         selectedIDs.indexOf(entity.id) !== -1 ||
74773                         graph.parentWays(entity).some(function(parent) {
74774                             return selectedIDs.indexOf(parent.id) !== -1;
74775                         });
74776                 }
74777
74778
74779                 function getPointLabel(entity, width, height, geometry) {
74780                     var y = (geometry === 'point' ? -12 : 0);
74781                     var pointOffsets = {
74782                         ltr: [15, y, 'start'],
74783                         rtl: [-15, y, 'end']
74784                     };
74785
74786                     var coord = projection(entity.loc);
74787                     var textPadding = 2;
74788                     var offset = pointOffsets[textDirection];
74789                     var p = {
74790                         height: height,
74791                         width: width,
74792                         x: coord[0] + offset[0],
74793                         y: coord[1] + offset[1],
74794                         textAnchor: offset[2]
74795                     };
74796
74797                     // insert a collision box for the text label..
74798                     var bbox;
74799                     if (textDirection === 'rtl') {
74800                         bbox = {
74801                             minX: p.x - width - textPadding,
74802                             minY: p.y - (height / 2) - textPadding,
74803                             maxX: p.x + textPadding,
74804                             maxY: p.y + (height / 2) + textPadding
74805                         };
74806                     } else {
74807                         bbox = {
74808                             minX: p.x - textPadding,
74809                             minY: p.y - (height / 2) - textPadding,
74810                             maxX: p.x + width + textPadding,
74811                             maxY: p.y + (height / 2) + textPadding
74812                         };
74813                     }
74814
74815                     if (tryInsert([bbox], entity.id, true)) {
74816                         return p;
74817                     }
74818                 }
74819
74820
74821                 function getLineLabel(entity, width, height) {
74822                     var viewport = geoExtent(context.projection.clipExtent()).polygon();
74823                     var points = graph.childNodes(entity)
74824                         .map(function(node) { return projection(node.loc); });
74825                     var length = geoPathLength(points);
74826
74827                     if (length < width + 20) return;
74828
74829                     // todo: properly clip points to viewport
74830
74831                     // % along the line to attempt to place the label
74832                     var lineOffsets = [50, 45, 55, 40, 60, 35, 65, 30, 70,
74833                                        25, 75, 20, 80, 15, 95, 10, 90, 5, 95];
74834                     var padding = 3;
74835
74836                     for (var i = 0; i < lineOffsets.length; i++) {
74837                         var offset = lineOffsets[i];
74838                         var middle = offset / 100 * length;
74839                         var start = middle - width / 2;
74840
74841                         if (start < 0 || start + width > length) continue;
74842
74843                         // generate subpath and ignore paths that are invalid or don't cross viewport.
74844                         var sub = subpath(points, start, start + width);
74845                         if (!sub || !geoPolygonIntersectsPolygon(viewport, sub, true)) {
74846                             continue;
74847                         }
74848
74849                         var isReverse = reverse(sub);
74850                         if (isReverse) {
74851                             sub = sub.reverse();
74852                         }
74853
74854                         var bboxes = [];
74855                         var boxsize = (height + 2) / 2;
74856
74857                         for (var j = 0; j < sub.length - 1; j++) {
74858                             var a = sub[j];
74859                             var b = sub[j + 1];
74860
74861                             // split up the text into small collision boxes
74862                             var num = Math.max(1, Math.floor(geoVecLength(a, b) / boxsize / 2));
74863
74864                             for (var box = 0; box < num; box++) {
74865                                 var p = geoVecInterp(a, b, box / num);
74866                                 var x0 = p[0] - boxsize - padding;
74867                                 var y0 = p[1] - boxsize - padding;
74868                                 var x1 = p[0] + boxsize + padding;
74869                                 var y1 = p[1] + boxsize + padding;
74870
74871                                 bboxes.push({
74872                                     minX: Math.min(x0, x1),
74873                                     minY: Math.min(y0, y1),
74874                                     maxX: Math.max(x0, x1),
74875                                     maxY: Math.max(y0, y1)
74876                                 });
74877                             }
74878                         }
74879
74880                         if (tryInsert(bboxes, entity.id, false)) {   // accept this one
74881                             return {
74882                                 'font-size': height + 2,
74883                                 lineString: lineString(sub),
74884                                 startOffset: offset + '%'
74885                             };
74886                         }
74887                     }
74888
74889                     function reverse(p) {
74890                         var angle = Math.atan2(p[1][1] - p[0][1], p[1][0] - p[0][0]);
74891                         return !(p[0][0] < p[p.length - 1][0] && angle < Math.PI/2 && angle > -Math.PI/2);
74892                     }
74893
74894                     function lineString(points) {
74895                         return 'M' + points.join('L');
74896                     }
74897
74898                     function subpath(points, from, to) {
74899                         var sofar = 0;
74900                         var start, end, i0, i1;
74901
74902                         for (var i = 0; i < points.length - 1; i++) {
74903                             var a = points[i];
74904                             var b = points[i + 1];
74905                             var current = geoVecLength(a, b);
74906                             var portion;
74907                             if (!start && sofar + current >= from) {
74908                                 portion = (from - sofar) / current;
74909                                 start = [
74910                                     a[0] + portion * (b[0] - a[0]),
74911                                     a[1] + portion * (b[1] - a[1])
74912                                 ];
74913                                 i0 = i + 1;
74914                             }
74915                             if (!end && sofar + current >= to) {
74916                                 portion = (to - sofar) / current;
74917                                 end = [
74918                                     a[0] + portion * (b[0] - a[0]),
74919                                     a[1] + portion * (b[1] - a[1])
74920                                 ];
74921                                 i1 = i + 1;
74922                             }
74923                             sofar += current;
74924                         }
74925
74926                         var result = points.slice(i0, i1);
74927                         result.unshift(start);
74928                         result.push(end);
74929                         return result;
74930                     }
74931                 }
74932
74933
74934                 function getAreaLabel(entity, width, height) {
74935                     var centroid = path.centroid(entity.asGeoJSON(graph, true));
74936                     var extent = entity.extent(graph);
74937                     var areaWidth = projection(extent[1])[0] - projection(extent[0])[0];
74938
74939                     if (isNaN(centroid[0]) || areaWidth < 20) return;
74940
74941                     var preset = context.presets().match(entity, context.graph());
74942                     var picon = preset && preset.icon;
74943                     var iconSize = 17;
74944                     var padding = 2;
74945                     var p = {};
74946
74947                     if (picon) {  // icon and label..
74948                         if (addIcon()) {
74949                             addLabel(iconSize + padding);
74950                             return p;
74951                         }
74952                     } else {   // label only..
74953                         if (addLabel(0)) {
74954                             return p;
74955                         }
74956                     }
74957
74958
74959                     function addIcon() {
74960                         var iconX = centroid[0] - (iconSize / 2);
74961                         var iconY = centroid[1] - (iconSize / 2);
74962                         var bbox = {
74963                             minX: iconX,
74964                             minY: iconY,
74965                             maxX: iconX + iconSize,
74966                             maxY: iconY + iconSize
74967                         };
74968
74969                         if (tryInsert([bbox], entity.id + 'I', true)) {
74970                             p.transform = 'translate(' + iconX + ',' + iconY + ')';
74971                             return true;
74972                         }
74973                         return false;
74974                     }
74975
74976                     function addLabel(yOffset) {
74977                         if (width && areaWidth >= width + 20) {
74978                             var labelX = centroid[0];
74979                             var labelY = centroid[1] + yOffset;
74980                             var bbox = {
74981                                 minX: labelX - (width / 2) - padding,
74982                                 minY: labelY - (height / 2) - padding,
74983                                 maxX: labelX + (width / 2) + padding,
74984                                 maxY: labelY + (height / 2) + padding
74985                             };
74986
74987                             if (tryInsert([bbox], entity.id, true)) {
74988                                 p.x = labelX;
74989                                 p.y = labelY;
74990                                 p.textAnchor = 'middle';
74991                                 p.height = height;
74992                                 return true;
74993                             }
74994                         }
74995                         return false;
74996                     }
74997                 }
74998
74999
75000                 // force insert a singular bounding box
75001                 // singular box only, no array, id better be unique
75002                 function doInsert(bbox, id) {
75003                     bbox.id = id;
75004
75005                     var oldbox = _entitybboxes[id];
75006                     if (oldbox) {
75007                         _rdrawn.remove(oldbox);
75008                     }
75009                     _entitybboxes[id] = bbox;
75010                     _rdrawn.insert(bbox);
75011                 }
75012
75013
75014                 function tryInsert(bboxes, id, saveSkipped) {
75015                     var skipped = false;
75016
75017                     for (var i = 0; i < bboxes.length; i++) {
75018                         var bbox = bboxes[i];
75019                         bbox.id = id;
75020
75021                         // Check that label is visible
75022                         if (bbox.minX < 0 || bbox.minY < 0 || bbox.maxX > dimensions[0] || bbox.maxY > dimensions[1]) {
75023                             skipped = true;
75024                             break;
75025                         }
75026                         if (_rdrawn.collides(bbox)) {
75027                             skipped = true;
75028                             break;
75029                         }
75030                     }
75031
75032                     _entitybboxes[id] = bboxes;
75033
75034                     if (skipped) {
75035                         if (saveSkipped) {
75036                             _rskipped.load(bboxes);
75037                         }
75038                     } else {
75039                         _rdrawn.load(bboxes);
75040                     }
75041
75042                     return !skipped;
75043                 }
75044
75045
75046                 var layer = selection.selectAll('.layer-osm.labels');
75047                 layer.selectAll('.labels-group')
75048                     .data(['halo', 'label', 'debug'])
75049                     .enter()
75050                     .append('g')
75051                     .attr('class', function(d) { return 'labels-group ' + d; });
75052
75053                 var halo = layer.selectAll('.labels-group.halo');
75054                 var label = layer.selectAll('.labels-group.label');
75055                 var debug = layer.selectAll('.labels-group.debug');
75056
75057                 // points
75058                 drawPointLabels(label, labelled.point, filter, 'pointlabel', positions.point);
75059                 drawPointLabels(halo, labelled.point, filter, 'pointlabel-halo', positions.point);
75060
75061                 // lines
75062                 drawLinePaths(layer, labelled.line, filter, '', positions.line);
75063                 drawLineLabels(label, labelled.line, filter, 'linelabel', positions.line);
75064                 drawLineLabels(halo, labelled.line, filter, 'linelabel-halo', positions.line);
75065
75066                 // areas
75067                 drawAreaLabels(label, labelled.area, filter, 'arealabel', positions.area);
75068                 drawAreaLabels(halo, labelled.area, filter, 'arealabel-halo', positions.area);
75069                 drawAreaIcons(label, labelled.area, filter, 'areaicon', positions.area);
75070                 drawAreaIcons(halo, labelled.area, filter, 'areaicon-halo', positions.area);
75071
75072                 // debug
75073                 drawCollisionBoxes(debug, _rskipped, 'debug-skipped');
75074                 drawCollisionBoxes(debug, _rdrawn, 'debug-drawn');
75075
75076                 layer.call(filterLabels);
75077             }
75078
75079
75080             function filterLabels(selection) {
75081                 var drawLayer = selection.selectAll('.layer-osm.labels');
75082                 var layers = drawLayer.selectAll('.labels-group.halo, .labels-group.label');
75083
75084                 layers.selectAll('.nolabel')
75085                     .classed('nolabel', false);
75086
75087                 var mouse = context.mouse();
75088                 var graph = context.graph();
75089                 var selectedIDs = context.selectedIDs();
75090                 var ids = [];
75091                 var pad, bbox;
75092
75093                 // hide labels near the mouse
75094                 if (mouse) {
75095                     pad = 20;
75096                     bbox = { minX: mouse[0] - pad, minY: mouse[1] - pad, maxX: mouse[0] + pad, maxY: mouse[1] + pad };
75097                     var nearMouse = _rdrawn.search(bbox).map(function(entity) { return entity.id; });
75098                     ids.push.apply(ids, nearMouse);
75099                 }
75100
75101                 // hide labels on selected nodes (they look weird when dragging / haloed)
75102                 for (var i = 0; i < selectedIDs.length; i++) {
75103                     var entity = graph.hasEntity(selectedIDs[i]);
75104                     if (entity && entity.type === 'node') {
75105                         ids.push(selectedIDs[i]);
75106                     }
75107                 }
75108
75109                 layers.selectAll(utilEntitySelector(ids))
75110                     .classed('nolabel', true);
75111
75112
75113                 // draw the mouse bbox if debugging is on..
75114                 var debug = selection.selectAll('.labels-group.debug');
75115                 var gj = [];
75116                 if (context.getDebug('collision')) {
75117                     gj = bbox ? [{
75118                         type: 'Polygon',
75119                         coordinates: [[
75120                             [bbox.minX, bbox.minY],
75121                             [bbox.maxX, bbox.minY],
75122                             [bbox.maxX, bbox.maxY],
75123                             [bbox.minX, bbox.maxY],
75124                             [bbox.minX, bbox.minY]
75125                         ]]
75126                     }] : [];
75127                 }
75128
75129                 var box = debug.selectAll('.debug-mouse')
75130                     .data(gj);
75131
75132                 // exit
75133                 box.exit()
75134                     .remove();
75135
75136                 // enter/update
75137                 box.enter()
75138                     .append('path')
75139                     .attr('class', 'debug debug-mouse yellow')
75140                     .merge(box)
75141                     .attr('d', d3_geoPath());
75142             }
75143
75144
75145             var throttleFilterLabels = throttle(filterLabels, 100);
75146
75147
75148             drawLabels.observe = function(selection) {
75149                 var listener = function() { throttleFilterLabels(selection); };
75150                 selection.on('mousemove.hidelabels', listener);
75151                 context.on('enter.hidelabels', listener);
75152             };
75153
75154
75155             drawLabels.off = function(selection) {
75156                 throttleFilterLabels.cancel();
75157                 selection.on('mousemove.hidelabels', null);
75158                 context.on('enter.hidelabels', null);
75159             };
75160
75161
75162             return drawLabels;
75163         }
75164
75165         var _improveOsmEnabled = false;
75166         var _errorService;
75167
75168
75169         function svgImproveOSM(projection, context, dispatch) {
75170             var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
75171             var minZoom = 12;
75172             var touchLayer = d3_select(null);
75173             var drawLayer = d3_select(null);
75174             var _improveOsmVisible = false;
75175
75176             function markerPath(selection, klass) {
75177                 selection
75178                     .attr('class', klass)
75179                     .attr('transform', 'translate(-10, -28)')
75180                     .attr('points', '16,3 4,3 1,6 1,17 4,20 7,20 10,27 13,20 16,20 19,17.033 19,6');
75181             }
75182
75183
75184             // Loosely-coupled improveOSM service for fetching errors.
75185             function getService() {
75186                 if (services$1.improveOSM && !_errorService) {
75187                     _errorService = services$1.improveOSM;
75188                     _errorService.on('loaded', throttledRedraw);
75189                 } else if (!services$1.improveOSM && _errorService) {
75190                     _errorService = null;
75191                 }
75192
75193                 return _errorService;
75194             }
75195
75196
75197             // Show the errors
75198             function editOn() {
75199                 if (!_improveOsmVisible) {
75200                     _improveOsmVisible = true;
75201                     drawLayer
75202                         .style('display', 'block');
75203                 }
75204             }
75205
75206
75207             // Immediately remove the errors and their touch targets
75208             function editOff() {
75209                 if (_improveOsmVisible) {
75210                     _improveOsmVisible = false;
75211                     drawLayer
75212                         .style('display', 'none');
75213                     drawLayer.selectAll('.qa_error.improveOSM')
75214                         .remove();
75215                     touchLayer.selectAll('.qa_error.improveOSM')
75216                         .remove();
75217                 }
75218             }
75219
75220
75221             // Enable the layer.  This shows the errors and transitions them to visible.
75222             function layerOn() {
75223                 editOn();
75224
75225                 drawLayer
75226                     .style('opacity', 0)
75227                     .transition()
75228                     .duration(250)
75229                     .style('opacity', 1)
75230                     .on('end interrupt', function () {
75231                         dispatch.call('change');
75232                     });
75233             }
75234
75235
75236             // Disable the layer.  This transitions the layer invisible and then hides the errors.
75237             function layerOff() {
75238                 throttledRedraw.cancel();
75239                 drawLayer.interrupt();
75240                 touchLayer.selectAll('.qa_error.improveOSM')
75241                     .remove();
75242
75243                 drawLayer
75244                     .transition()
75245                     .duration(250)
75246                     .style('opacity', 0)
75247                     .on('end interrupt', function () {
75248                         editOff();
75249                         dispatch.call('change');
75250                     });
75251             }
75252
75253
75254             // Update the error markers
75255             function updateMarkers() {
75256                 if (!_improveOsmVisible || !_improveOsmEnabled) return;
75257
75258                 var service = getService();
75259                 var selectedID = context.selectedErrorID();
75260                 var data = (service ? service.getErrors(projection) : []);
75261                 var getTransform = svgPointTransform(projection);
75262
75263                 // Draw markers..
75264                 var markers = drawLayer.selectAll('.qa_error.improveOSM')
75265                     .data(data, function(d) { return d.id; });
75266
75267                 // exit
75268                 markers.exit()
75269                     .remove();
75270
75271                 // enter
75272                 var markersEnter = markers.enter()
75273                     .append('g')
75274                     .attr('class', function(d) {
75275                         return [
75276                             'qa_error',
75277                             d.service,
75278                             'error_id-' + d.id,
75279                             'error_type-' + d.error_type,
75280                             'category-' + d.category
75281                         ].join(' ');
75282                     });
75283
75284                 markersEnter
75285                     .append('polygon')
75286                     .call(markerPath, 'shadow');
75287
75288                 markersEnter
75289                     .append('ellipse')
75290                     .attr('cx', 0)
75291                     .attr('cy', 0)
75292                     .attr('rx', 4.5)
75293                     .attr('ry', 2)
75294                     .attr('class', 'stroke');
75295
75296                 markersEnter
75297                     .append('polygon')
75298                     .attr('fill', 'currentColor')
75299                     .call(markerPath, 'qa_error-fill');
75300
75301                 markersEnter
75302                     .append('use')
75303                     .attr('transform', 'translate(-5.5, -21)')
75304                     .attr('class', 'icon-annotation')
75305                     .attr('width', '11px')
75306                     .attr('height', '11px')
75307                     .attr('xlink:href', function(d) {
75308                         var picon = d.icon;
75309
75310                         if (!picon) {
75311                             return '';
75312                         } else {
75313                             var isMaki = /^maki-/.test(picon);
75314                             return '#' + picon + (isMaki ? '-11' : '');
75315                         }
75316                     });
75317
75318                 // update
75319                 markers
75320                     .merge(markersEnter)
75321                     .sort(sortY)
75322                     .classed('selected', function(d) { return d.id === selectedID; })
75323                     .attr('transform', getTransform);
75324
75325
75326                 // Draw targets..
75327                 if (touchLayer.empty()) return;
75328                 var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
75329
75330                 var targets = touchLayer.selectAll('.qa_error.improveOSM')
75331                     .data(data, function(d) { return d.id; });
75332
75333                 // exit
75334                 targets.exit()
75335                     .remove();
75336
75337                 // enter/update
75338                 targets.enter()
75339                     .append('rect')
75340                     .attr('width', '20px')
75341                     .attr('height', '30px')
75342                     .attr('x', '-10px')
75343                     .attr('y', '-28px')
75344                     .merge(targets)
75345                     .sort(sortY)
75346                     .attr('class', function(d) {
75347                         return 'qa_error ' + d.service + ' target error_id-' + d.id + ' ' + fillClass;
75348                     })
75349                     .attr('transform', getTransform);
75350
75351
75352                 function sortY(a, b) {
75353                     return (a.id === selectedID) ? 1
75354                         : (b.id === selectedID) ? -1
75355                         : b.loc[1] - a.loc[1];
75356                 }
75357             }
75358
75359
75360             // Draw the ImproveOSM layer and schedule loading errors and updating markers.
75361             function drawImproveOSM(selection) {
75362                 var service = getService();
75363
75364                 var surface = context.surface();
75365                 if (surface && !surface.empty()) {
75366                     touchLayer = surface.selectAll('.data-layer.touch .layer-touch.markers');
75367                 }
75368
75369                 drawLayer = selection.selectAll('.layer-improveOSM')
75370                     .data(service ? [0] : []);
75371
75372                 drawLayer.exit()
75373                     .remove();
75374
75375                 drawLayer = drawLayer.enter()
75376                     .append('g')
75377                     .attr('class', 'layer-improveOSM')
75378                     .style('display', _improveOsmEnabled ? 'block' : 'none')
75379                     .merge(drawLayer);
75380
75381                 if (_improveOsmEnabled) {
75382                     if (service && ~~context.map().zoom() >= minZoom) {
75383                         editOn();
75384                         service.loadErrors(projection);
75385                         updateMarkers();
75386                     } else {
75387                         editOff();
75388                     }
75389                 }
75390             }
75391
75392
75393             // Toggles the layer on and off
75394             drawImproveOSM.enabled = function(val) {
75395                 if (!arguments.length) return _improveOsmEnabled;
75396
75397                 _improveOsmEnabled = val;
75398                 if (_improveOsmEnabled) {
75399                     layerOn();
75400                 } else {
75401                     layerOff();
75402                     if (context.selectedErrorID()) {
75403                         context.enter(modeBrowse(context));
75404                     }
75405                 }
75406
75407                 dispatch.call('change');
75408                 return this;
75409             };
75410
75411
75412             drawImproveOSM.supported = function() {
75413                 return !!getService();
75414             };
75415
75416
75417             return drawImproveOSM;
75418         }
75419
75420         function svgStreetside(projection, context, dispatch) {
75421             var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
75422             var minZoom = 14;
75423             var minMarkerZoom = 16;
75424             var minViewfieldZoom = 18;
75425             var layer = d3_select(null);
75426             var _viewerYaw = 0;
75427             var _selectedSequence = null;
75428             var _streetside;
75429
75430             /**
75431              * init().
75432              */
75433             function init() {
75434                 if (svgStreetside.initialized) return;  // run once
75435                 svgStreetside.enabled = false;
75436                 svgStreetside.initialized = true;
75437             }
75438
75439             /**
75440              * getService().
75441              */
75442             function getService() {
75443                 if (services$1.streetside && !_streetside) {
75444                     _streetside = services$1.streetside;
75445                     _streetside.event
75446                         .on('viewerChanged', viewerChanged)
75447                         .on('loadedBubbles', throttledRedraw);
75448                 } else if (!services$1.streetside && _streetside) {
75449                     _streetside = null;
75450                 }
75451
75452                 return _streetside;
75453             }
75454
75455             /**
75456              * showLayer().
75457              */
75458             function showLayer() {
75459                 var service = getService();
75460                 if (!service) return;
75461
75462                 editOn();
75463
75464                 layer
75465                     .style('opacity', 0)
75466                     .transition()
75467                     .duration(250)
75468                     .style('opacity', 1)
75469                     .on('end', function () { dispatch.call('change'); });
75470             }
75471
75472             /**
75473              * hideLayer().
75474              */
75475             function hideLayer() {
75476                 throttledRedraw.cancel();
75477
75478                 layer
75479                     .transition()
75480                     .duration(250)
75481                     .style('opacity', 0)
75482                     .on('end', editOff);
75483             }
75484
75485             /**
75486              * editOn().
75487              */
75488             function editOn() {
75489                 layer.style('display', 'block');
75490             }
75491
75492             /**
75493              * editOff().
75494              */
75495             function editOff() {
75496                 layer.selectAll('.viewfield-group').remove();
75497                 layer.style('display', 'none');
75498             }
75499
75500             /**
75501              * click() Handles 'bubble' point click event.
75502              */
75503             function click(d) {
75504                 var service = getService();
75505                 if (!service) return;
75506
75507                 // try to preserve the viewer rotation when staying on the same sequence
75508                 if (d.sequenceKey !== _selectedSequence) {
75509                     _viewerYaw = 0;  // reset
75510                 }
75511                 _selectedSequence = d.sequenceKey;
75512
75513                 service
75514                     .selectImage(d)
75515                     .then(function(r) {
75516                         if (r.status === 'ok'){
75517                             service.showViewer(_viewerYaw);
75518                         }
75519                     });
75520
75521
75522                 context.map().centerEase(d.loc);
75523             }
75524
75525             /**
75526              * mouseover().
75527              */
75528             function mouseover(d) {
75529                 var service = getService();
75530                 if (service) service.setStyles(d);
75531             }
75532
75533             /**
75534              * mouseout().
75535              */
75536             function mouseout() {
75537                 var service = getService();
75538                 if (service) service.setStyles(null);
75539             }
75540
75541             /**
75542              * transform().
75543              */
75544             function transform(d) {
75545                 var t = svgPointTransform(projection)(d);
75546                 var rot = d.ca + _viewerYaw;
75547                 if (rot) {
75548                     t += ' rotate(' + Math.floor(rot) + ',0,0)';
75549                 }
75550                 return t;
75551             }
75552
75553
75554             function viewerChanged() {
75555                 var service = getService();
75556                 if (!service) return;
75557
75558                 var viewer = service.viewer();
75559                 if (!viewer) return;
75560
75561                 // update viewfield rotation
75562                 _viewerYaw = viewer.getYaw();
75563
75564                 // avoid updating if the map is currently transformed
75565                 // e.g. during drags or easing.
75566                 if (context.map().isTransformed()) return;
75567
75568                 layer.selectAll('.viewfield-group.currentView')
75569                     .attr('transform', transform);
75570             }
75571
75572
75573             context.photos().on('change.streetside', update);
75574
75575             /**
75576              * update().
75577              */
75578             function update() {
75579                 var viewer = d3_select('#photoviewer');
75580                 var selected = viewer.empty() ? undefined : viewer.datum();
75581                 var z = ~~context.map().zoom();
75582                 var showMarkers = (z >= minMarkerZoom);
75583                 var showViewfields = (z >= minViewfieldZoom);
75584                 var service = getService();
75585
75586                 var sequences = [];
75587                 var bubbles = [];
75588
75589                 if (context.photos().showsPanoramic()) {
75590                     sequences = (service ? service.sequences(projection) : []);
75591                     bubbles = (service && showMarkers ? service.bubbles(projection) : []);
75592                 }
75593
75594                 var traces = layer.selectAll('.sequences').selectAll('.sequence')
75595                     .data(sequences, function(d) { return d.properties.key; });
75596
75597                 // exit
75598                 traces.exit()
75599                     .remove();
75600
75601                 // enter/update
75602                 traces = traces.enter()
75603                     .append('path')
75604                     .attr('class', 'sequence')
75605                     .merge(traces)
75606                     .attr('d', svgPath(projection).geojson);
75607
75608
75609                 var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
75610                     .data(bubbles, function(d) {
75611                         // force reenter once bubbles are attached to a sequence
75612                         return d.key + (d.sequenceKey ? 'v1' : 'v0');
75613                     });
75614
75615                 // exit
75616                 groups.exit()
75617                     .remove();
75618
75619                 // enter
75620                 var groupsEnter = groups.enter()
75621                     .append('g')
75622                     .attr('class', 'viewfield-group')
75623                     .on('mouseenter', mouseover)
75624                     .on('mouseleave', mouseout)
75625                     .on('click', click);
75626
75627                 groupsEnter
75628                     .append('g')
75629                     .attr('class', 'viewfield-scale');
75630
75631                 // update
75632                 var markers = groups
75633                     .merge(groupsEnter)
75634                     .sort(function(a, b) {
75635                         return (a === selected) ? 1
75636                             : (b === selected) ? -1
75637                             : b.loc[1] - a.loc[1];
75638                     })
75639                     .attr('transform', transform)
75640                     .select('.viewfield-scale');
75641
75642
75643                 markers.selectAll('circle')
75644                     .data([0])
75645                     .enter()
75646                     .append('circle')
75647                     .attr('dx', '0')
75648                     .attr('dy', '0')
75649                     .attr('r', '6');
75650
75651                 var viewfields = markers.selectAll('.viewfield')
75652                     .data(showViewfields ? [0] : []);
75653
75654                 viewfields.exit()
75655                     .remove();
75656
75657                 // viewfields may or may not be drawn...
75658                 // but if they are, draw below the circles
75659                 viewfields.enter()
75660                     .insert('path', 'circle')
75661                     .attr('class', 'viewfield')
75662                     .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
75663                     .attr('d', viewfieldPath);
75664
75665                 function viewfieldPath() {
75666                     var d = this.parentNode.__data__;
75667                     if (d.pano) {
75668                         return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
75669                     } else {
75670                         return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
75671                     }
75672                 }
75673
75674             }
75675
75676             /**
75677              * drawImages()
75678              * drawImages is the method that is returned (and that runs) everytime 'svgStreetside()' is called.
75679              * 'svgStreetside()' is called from index.js
75680              */
75681             function drawImages(selection) {
75682                 var enabled = svgStreetside.enabled;
75683                 var service = getService();
75684
75685                 layer = selection.selectAll('.layer-streetside-images')
75686                     .data(service ? [0] : []);
75687
75688                 layer.exit()
75689                     .remove();
75690
75691                 var layerEnter = layer.enter()
75692                     .append('g')
75693                     .attr('class', 'layer-streetside-images')
75694                     .style('display', enabled ? 'block' : 'none');
75695
75696                 layerEnter
75697                     .append('g')
75698                     .attr('class', 'sequences');
75699
75700                 layerEnter
75701                     .append('g')
75702                     .attr('class', 'markers');
75703
75704                 layer = layerEnter
75705                     .merge(layer);
75706
75707                 if (enabled) {
75708                     if (service && ~~context.map().zoom() >= minZoom) {
75709                         editOn();
75710                         update();
75711                         service.loadBubbles(projection);
75712                     } else {
75713                         editOff();
75714                     }
75715                 }
75716             }
75717
75718
75719             /**
75720              * drawImages.enabled().
75721              */
75722             drawImages.enabled = function(_) {
75723                 if (!arguments.length) return svgStreetside.enabled;
75724                 svgStreetside.enabled = _;
75725                 if (svgStreetside.enabled) {
75726                     showLayer();
75727                 } else {
75728                     hideLayer();
75729                 }
75730                 dispatch.call('change');
75731                 return this;
75732             };
75733
75734             /**
75735              * drawImages.supported().
75736              */
75737             drawImages.supported = function() {
75738                 return !!getService();
75739             };
75740
75741             init();
75742
75743             return drawImages;
75744         }
75745
75746         function svgMapillaryImages(projection, context, dispatch) {
75747             var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
75748             var minZoom = 12;
75749             var minMarkerZoom = 16;
75750             var minViewfieldZoom = 18;
75751             var layer = d3_select(null);
75752             var _mapillary;
75753             var viewerCompassAngle;
75754
75755
75756             function init() {
75757                 if (svgMapillaryImages.initialized) return;  // run once
75758                 svgMapillaryImages.enabled = false;
75759                 svgMapillaryImages.initialized = true;
75760             }
75761
75762
75763             function getService() {
75764                 if (services$1.mapillary && !_mapillary) {
75765                     _mapillary = services$1.mapillary;
75766                     _mapillary.event.on('loadedImages', throttledRedraw);
75767                     _mapillary.event.on('bearingChanged', function(e) {
75768                         viewerCompassAngle = e;
75769
75770                         // avoid updating if the map is currently transformed
75771                         // e.g. during drags or easing.
75772                         if (context.map().isTransformed()) return;
75773
75774                         layer.selectAll('.viewfield-group.currentView')
75775                             .filter(function(d) {
75776                                 return d.pano;
75777                             })
75778                             .attr('transform', transform);
75779                     });
75780                 } else if (!services$1.mapillary && _mapillary) {
75781                     _mapillary = null;
75782                 }
75783
75784                 return _mapillary;
75785             }
75786
75787
75788             function showLayer() {
75789                 var service = getService();
75790                 if (!service) return;
75791
75792                 editOn();
75793
75794                 layer
75795                     .style('opacity', 0)
75796                     .transition()
75797                     .duration(250)
75798                     .style('opacity', 1)
75799                     .on('end', function () { dispatch.call('change'); });
75800             }
75801
75802
75803             function hideLayer() {
75804                 throttledRedraw.cancel();
75805
75806                 layer
75807                     .transition()
75808                     .duration(250)
75809                     .style('opacity', 0)
75810                     .on('end', editOff);
75811             }
75812
75813
75814             function editOn() {
75815                 layer.style('display', 'block');
75816             }
75817
75818
75819             function editOff() {
75820                 layer.selectAll('.viewfield-group').remove();
75821                 layer.style('display', 'none');
75822             }
75823
75824
75825             function click(d) {
75826                 var service = getService();
75827                 if (!service) return;
75828
75829                 service
75830                     .selectImage(d)
75831                     .updateViewer(d.key, context)
75832                     .showViewer();
75833
75834                 context.map().centerEase(d.loc);
75835             }
75836
75837
75838             function mouseover(d) {
75839                 var service = getService();
75840                 if (service) service.setStyles(d);
75841             }
75842
75843
75844             function mouseout() {
75845                 var service = getService();
75846                 if (service) service.setStyles(null);
75847             }
75848
75849
75850             function transform(d) {
75851                 var t = svgPointTransform(projection)(d);
75852                 if (d.pano && viewerCompassAngle !== null && isFinite(viewerCompassAngle)) {
75853                     t += ' rotate(' + Math.floor(viewerCompassAngle) + ',0,0)';
75854                 } else if (d.ca) {
75855                     t += ' rotate(' + Math.floor(d.ca) + ',0,0)';
75856                 }
75857                 return t;
75858             }
75859
75860             context.photos().on('change.mapillary_images', update);
75861
75862             function filterImages(images) {
75863                 var showsPano = context.photos().showsPanoramic();
75864                 var showsFlat = context.photos().showsFlat();
75865                 if (!showsPano || !showsFlat) {
75866                     images = images.filter(function(image) {
75867                         if (image.pano) return showsPano;
75868                         return showsFlat;
75869                     });
75870                 }
75871                 return images;
75872             }
75873
75874             function filterSequences(sequences, service) {
75875                 var showsPano = context.photos().showsPanoramic();
75876                 var showsFlat = context.photos().showsFlat();
75877                 if (!showsPano || !showsFlat) {
75878                     sequences = sequences.filter(function(sequence) {
75879                         if (sequence.properties.hasOwnProperty('pano')) {
75880                             if (sequence.properties.pano) return showsPano;
75881                             return showsFlat;
75882                         } else {
75883                             // if the sequence doesn't specify pano or not, search its images
75884                             var cProps = sequence.properties.coordinateProperties;
75885                             if (cProps && cProps.image_keys && cProps.image_keys.length > 0) {
75886                                 for (var index in cProps.image_keys) {
75887                                     var imageKey = cProps.image_keys[index];
75888                                     var image = service.cachedImage(imageKey);
75889                                     if (image && image.hasOwnProperty('pano')) {
75890                                         if (image.pano) return showsPano;
75891                                         return showsFlat;
75892                                     }
75893                                 }
75894                             }
75895                         }
75896                     });
75897                 }
75898                 return sequences;
75899             }
75900
75901             function update() {
75902                 var viewer = d3_select('#photoviewer');
75903                 var selected = viewer.empty() ? undefined : viewer.datum();
75904
75905                 var z = ~~context.map().zoom();
75906                 var showMarkers = (z >= minMarkerZoom);
75907                 var showViewfields = (z >= minViewfieldZoom);
75908
75909                 var service = getService();
75910                 var sequences = (service ? service.sequences(projection) : []);
75911                 var images = (service && showMarkers ? service.images(projection) : []);
75912
75913                 images = filterImages(images);
75914                 sequences = filterSequences(sequences, service);
75915
75916                 var traces = layer.selectAll('.sequences').selectAll('.sequence')
75917                     .data(sequences, function(d) { return d.properties.key; });
75918
75919                 // exit
75920                 traces.exit()
75921                     .remove();
75922
75923                 // enter/update
75924                 traces = traces.enter()
75925                     .append('path')
75926                     .attr('class', 'sequence')
75927                     .merge(traces)
75928                     .attr('d', svgPath(projection).geojson);
75929
75930
75931                 var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
75932                     .data(images, function(d) { return d.key; });
75933
75934                 // exit
75935                 groups.exit()
75936                     .remove();
75937
75938                 // enter
75939                 var groupsEnter = groups.enter()
75940                     .append('g')
75941                     .attr('class', 'viewfield-group')
75942                     .on('mouseenter', mouseover)
75943                     .on('mouseleave', mouseout)
75944                     .on('click', click);
75945
75946                 groupsEnter
75947                     .append('g')
75948                     .attr('class', 'viewfield-scale');
75949
75950                 // update
75951                 var markers = groups
75952                     .merge(groupsEnter)
75953                     .sort(function(a, b) {
75954                         return (a === selected) ? 1
75955                             : (b === selected) ? -1
75956                             : b.loc[1] - a.loc[1];  // sort Y
75957                     })
75958                     .attr('transform', transform)
75959                     .select('.viewfield-scale');
75960
75961
75962                 markers.selectAll('circle')
75963                     .data([0])
75964                     .enter()
75965                     .append('circle')
75966                     .attr('dx', '0')
75967                     .attr('dy', '0')
75968                     .attr('r', '6');
75969
75970                 var viewfields = markers.selectAll('.viewfield')
75971                     .data(showViewfields ? [0] : []);
75972
75973                 viewfields.exit()
75974                     .remove();
75975
75976                 viewfields.enter()               // viewfields may or may not be drawn...
75977                     .insert('path', 'circle')    // but if they are, draw below the circles
75978                     .attr('class', 'viewfield')
75979                     .classed('pano', function() { return this.parentNode.__data__.pano; })
75980                     .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
75981                     .attr('d', viewfieldPath);
75982
75983                 function viewfieldPath() {
75984                     var d = this.parentNode.__data__;
75985                     if (d.pano) {
75986                         return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
75987                     } else {
75988                         return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
75989                     }
75990                 }
75991             }
75992
75993
75994             function drawImages(selection) {
75995                 var enabled = svgMapillaryImages.enabled;
75996                 var service = getService();
75997
75998                 layer = selection.selectAll('.layer-mapillary')
75999                     .data(service ? [0] : []);
76000
76001                 layer.exit()
76002                     .remove();
76003
76004                 var layerEnter = layer.enter()
76005                     .append('g')
76006                     .attr('class', 'layer-mapillary')
76007                     .style('display', enabled ? 'block' : 'none');
76008
76009                 layerEnter
76010                     .append('g')
76011                     .attr('class', 'sequences');
76012
76013                 layerEnter
76014                     .append('g')
76015                     .attr('class', 'markers');
76016
76017                 layer = layerEnter
76018                     .merge(layer);
76019
76020                 if (enabled) {
76021                     if (service && ~~context.map().zoom() >= minZoom) {
76022                         editOn();
76023                         update();
76024                         service.loadImages(projection);
76025                     } else {
76026                         editOff();
76027                     }
76028                 }
76029             }
76030
76031
76032             drawImages.enabled = function(_) {
76033                 if (!arguments.length) return svgMapillaryImages.enabled;
76034                 svgMapillaryImages.enabled = _;
76035                 if (svgMapillaryImages.enabled) {
76036                     showLayer();
76037                 } else {
76038                     hideLayer();
76039                 }
76040                 dispatch.call('change');
76041                 return this;
76042             };
76043
76044
76045             drawImages.supported = function() {
76046                 return !!getService();
76047             };
76048
76049
76050             init();
76051             return drawImages;
76052         }
76053
76054         function svgMapillarySigns(projection, context, dispatch) {
76055             var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
76056             var minZoom = 12;
76057             var layer = d3_select(null);
76058             var _mapillary;
76059
76060
76061             function init() {
76062                 if (svgMapillarySigns.initialized) return;  // run once
76063                 svgMapillarySigns.enabled = false;
76064                 svgMapillarySigns.initialized = true;
76065             }
76066
76067
76068             function getService() {
76069                 if (services$1.mapillary && !_mapillary) {
76070                     _mapillary = services$1.mapillary;
76071                     _mapillary.event.on('loadedSigns', throttledRedraw);
76072                 } else if (!services$1.mapillary && _mapillary) {
76073                     _mapillary = null;
76074                 }
76075                 return _mapillary;
76076             }
76077
76078
76079             function showLayer() {
76080                 var service = getService();
76081                 if (!service) return;
76082
76083                 editOn();
76084             }
76085
76086
76087             function hideLayer() {
76088                 throttledRedraw.cancel();
76089                 editOff();
76090             }
76091
76092
76093             function editOn() {
76094                 layer.style('display', 'block');
76095             }
76096
76097
76098             function editOff() {
76099                 layer.selectAll('.icon-sign').remove();
76100                 layer.style('display', 'none');
76101             }
76102
76103
76104             function click(d) {
76105                 var service = getService();
76106                 if (!service) return;
76107
76108                 context.map().centerEase(d.loc);
76109
76110                 var selected = service.getSelectedImage();
76111                 var selectedImageKey = selected && selected.key;
76112                 var imageKey;
76113
76114                 // Pick one of the images the sign was detected in,
76115                 // preference given to an image already selected.
76116                 d.detections.forEach(function(detection) {
76117                     if (!imageKey || selectedImageKey === detection.image_key) {
76118                         imageKey = detection.image_key;
76119                     }
76120                 });
76121
76122                 service
76123                     .selectImage(null, imageKey)
76124                     .updateViewer(imageKey, context)
76125                     .showViewer();
76126             }
76127
76128
76129             function update() {
76130                 var service = getService();
76131                 var data = (service ? service.signs(projection) : []);
76132                 var viewer = d3_select('#photoviewer');
76133                 var selected = viewer.empty() ? undefined : viewer.datum();
76134                 var selectedImageKey = selected && selected.key;
76135                 var transform = svgPointTransform(projection);
76136
76137                 var signs = layer.selectAll('.icon-sign')
76138                     .data(data, function(d) { return d.key; });
76139
76140                 // exit
76141                 signs.exit()
76142                     .remove();
76143
76144                 // enter
76145                 var enter = signs.enter()
76146                     .append('use')
76147                     .attr('class', 'icon-sign')
76148                     .attr('width', '24px')
76149                     .attr('height', '24px')
76150                     .attr('x', '-12px')
76151                     .attr('y', '-12px')
76152                     .attr('xlink:href', function(d) { return '#' + d.value; })
76153                     .classed('currentView', function(d) {
76154                         return d.detections.some(function(detection) {
76155                             return detection.image_key === selectedImageKey;
76156                         });
76157                     })
76158                     .on('click', click);
76159
76160                 // update
76161                 signs
76162                     .merge(enter)
76163                     .sort(function(a, b) {
76164                         return (a === selected) ? 1
76165                             : (b === selected) ? -1
76166                             : b.loc[1] - a.loc[1];  // sort Y
76167                     })
76168                     .attr('transform', transform);
76169             }
76170
76171
76172             function drawSigns(selection) {
76173                 var enabled = svgMapillarySigns.enabled;
76174                 var service = getService();
76175
76176                 layer = selection.selectAll('.layer-mapillary-signs')
76177                     .data(service ? [0] : []);
76178
76179                 layer.exit()
76180                     .remove();
76181
76182                 layer = layer.enter()
76183                     .append('g')
76184                     .attr('class', 'layer-mapillary-signs')
76185                     .style('display', enabled ? 'block' : 'none')
76186                     .merge(layer);
76187
76188                 if (enabled) {
76189                     if (service && ~~context.map().zoom() >= minZoom) {
76190                         editOn();
76191                         update();
76192                         service.loadSigns(projection);
76193                     } else {
76194                         editOff();
76195                     }
76196                 }
76197             }
76198
76199
76200             drawSigns.enabled = function(_) {
76201                 if (!arguments.length) return svgMapillarySigns.enabled;
76202                 svgMapillarySigns.enabled = _;
76203                 if (svgMapillarySigns.enabled) {
76204                     showLayer();
76205                 } else {
76206                     hideLayer();
76207                 }
76208                 dispatch.call('change');
76209                 return this;
76210             };
76211
76212
76213             drawSigns.supported = function() {
76214                 return !!getService();
76215             };
76216
76217
76218             init();
76219             return drawSigns;
76220         }
76221
76222         function svgOpenstreetcamImages(projection, context, dispatch) {
76223             var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
76224             var minZoom = 12;
76225             var minMarkerZoom = 16;
76226             var minViewfieldZoom = 18;
76227             var layer = d3_select(null);
76228             var _openstreetcam;
76229
76230
76231             function init() {
76232                 if (svgOpenstreetcamImages.initialized) return;  // run once
76233                 svgOpenstreetcamImages.enabled = false;
76234                 svgOpenstreetcamImages.initialized = true;
76235             }
76236
76237
76238             function getService() {
76239                 if (services$1.openstreetcam && !_openstreetcam) {
76240                     _openstreetcam = services$1.openstreetcam;
76241                     _openstreetcam.event.on('loadedImages', throttledRedraw);
76242                 } else if (!services$1.openstreetcam && _openstreetcam) {
76243                     _openstreetcam = null;
76244                 }
76245
76246                 return _openstreetcam;
76247             }
76248
76249
76250             function showLayer() {
76251                 var service = getService();
76252                 if (!service) return;
76253
76254                 editOn();
76255
76256                 layer
76257                     .style('opacity', 0)
76258                     .transition()
76259                     .duration(250)
76260                     .style('opacity', 1)
76261                     .on('end', function () { dispatch.call('change'); });
76262             }
76263
76264
76265             function hideLayer() {
76266                 throttledRedraw.cancel();
76267
76268                 layer
76269                     .transition()
76270                     .duration(250)
76271                     .style('opacity', 0)
76272                     .on('end', editOff);
76273             }
76274
76275
76276             function editOn() {
76277                 layer.style('display', 'block');
76278             }
76279
76280
76281             function editOff() {
76282                 layer.selectAll('.viewfield-group').remove();
76283                 layer.style('display', 'none');
76284             }
76285
76286
76287             function click(d) {
76288                 var service = getService();
76289                 if (!service) return;
76290
76291                 service
76292                     .selectImage(d)
76293                     .updateViewer(d)
76294                     .showViewer();
76295
76296                 context.map().centerEase(d.loc);
76297             }
76298
76299
76300             function mouseover(d) {
76301                 var service = getService();
76302                 if (service) service.setStyles(d);
76303             }
76304
76305
76306             function mouseout() {
76307                 var service = getService();
76308                 if (service) service.setStyles(null);
76309             }
76310
76311
76312             function transform(d) {
76313                 var t = svgPointTransform(projection)(d);
76314                 if (d.ca) {
76315                     t += ' rotate(' + Math.floor(d.ca) + ',0,0)';
76316                 }
76317                 return t;
76318             }
76319
76320
76321             context.photos().on('change.openstreetcam_images', update);
76322
76323             function update() {
76324                 var viewer = d3_select('#photoviewer');
76325                 var selected = viewer.empty() ? undefined : viewer.datum();
76326
76327                 var z = ~~context.map().zoom();
76328                 var showMarkers = (z >= minMarkerZoom);
76329                 var showViewfields = (z >= minViewfieldZoom);
76330
76331                 var service = getService();
76332                 var sequences = [];
76333                 var images = [];
76334
76335                 if (context.photos().showsFlat()) {
76336                     sequences = (service ? service.sequences(projection) : []);
76337                     images = (service && showMarkers ? service.images(projection) : []);
76338                 }
76339
76340                 var traces = layer.selectAll('.sequences').selectAll('.sequence')
76341                     .data(sequences, function(d) { return d.properties.key; });
76342
76343                 // exit
76344                 traces.exit()
76345                     .remove();
76346
76347                 // enter/update
76348                 traces = traces.enter()
76349                     .append('path')
76350                     .attr('class', 'sequence')
76351                     .merge(traces)
76352                     .attr('d', svgPath(projection).geojson);
76353
76354
76355                 var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
76356                     .data(images, function(d) { return d.key; });
76357
76358                 // exit
76359                 groups.exit()
76360                     .remove();
76361
76362                 // enter
76363                 var groupsEnter = groups.enter()
76364                     .append('g')
76365                     .attr('class', 'viewfield-group')
76366                     .on('mouseenter', mouseover)
76367                     .on('mouseleave', mouseout)
76368                     .on('click', click);
76369
76370                 groupsEnter
76371                     .append('g')
76372                     .attr('class', 'viewfield-scale');
76373
76374                 // update
76375                 var markers = groups
76376                     .merge(groupsEnter)
76377                     .sort(function(a, b) {
76378                         return (a === selected) ? 1
76379                             : (b === selected) ? -1
76380                             : b.loc[1] - a.loc[1];  // sort Y
76381                     })
76382                     .attr('transform', transform)
76383                     .select('.viewfield-scale');
76384
76385
76386                 markers.selectAll('circle')
76387                     .data([0])
76388                     .enter()
76389                     .append('circle')
76390                     .attr('dx', '0')
76391                     .attr('dy', '0')
76392                     .attr('r', '6');
76393
76394                 var viewfields = markers.selectAll('.viewfield')
76395                     .data(showViewfields ? [0] : []);
76396
76397                 viewfields.exit()
76398                     .remove();
76399
76400                 viewfields.enter()               // viewfields may or may not be drawn...
76401                     .insert('path', 'circle')    // but if they are, draw below the circles
76402                     .attr('class', 'viewfield')
76403                     .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
76404                     .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');
76405             }
76406
76407
76408             function drawImages(selection) {
76409                 var enabled = svgOpenstreetcamImages.enabled,
76410                     service = getService();
76411
76412                 layer = selection.selectAll('.layer-openstreetcam')
76413                     .data(service ? [0] : []);
76414
76415                 layer.exit()
76416                     .remove();
76417
76418                 var layerEnter = layer.enter()
76419                     .append('g')
76420                     .attr('class', 'layer-openstreetcam')
76421                     .style('display', enabled ? 'block' : 'none');
76422
76423                 layerEnter
76424                     .append('g')
76425                     .attr('class', 'sequences');
76426
76427                 layerEnter
76428                     .append('g')
76429                     .attr('class', 'markers');
76430
76431                 layer = layerEnter
76432                     .merge(layer);
76433
76434                 if (enabled) {
76435                     if (service && ~~context.map().zoom() >= minZoom) {
76436                         editOn();
76437                         update();
76438                         service.loadImages(projection);
76439                     } else {
76440                         editOff();
76441                     }
76442                 }
76443             }
76444
76445
76446             drawImages.enabled = function(_) {
76447                 if (!arguments.length) return svgOpenstreetcamImages.enabled;
76448                 svgOpenstreetcamImages.enabled = _;
76449                 if (svgOpenstreetcamImages.enabled) {
76450                     showLayer();
76451                 } else {
76452                     hideLayer();
76453                 }
76454                 dispatch.call('change');
76455                 return this;
76456             };
76457
76458
76459             drawImages.supported = function() {
76460                 return !!getService();
76461             };
76462
76463
76464             init();
76465             return drawImages;
76466         }
76467
76468         function svgOsm(projection, context, dispatch) {
76469             var enabled = true;
76470
76471
76472             function drawOsm(selection) {
76473                 selection.selectAll('.layer-osm')
76474                     .data(['covered', 'areas', 'lines', 'points', 'labels'])
76475                     .enter()
76476                     .append('g')
76477                     .attr('class', function(d) { return 'layer-osm ' + d; });
76478
76479                 selection.selectAll('.layer-osm.points').selectAll('.points-group')
76480                     .data(['points', 'midpoints', 'vertices', 'turns'])
76481                     .enter()
76482                     .append('g')
76483                     .attr('class', function(d) { return 'points-group ' + d; });
76484             }
76485
76486
76487             function showLayer() {
76488                 var layer = context.surface().selectAll('.data-layer.osm');
76489                 layer.interrupt();
76490
76491                 layer
76492                     .classed('disabled', false)
76493                     .style('opacity', 0)
76494                     .transition()
76495                     .duration(250)
76496                     .style('opacity', 1)
76497                     .on('end interrupt', function () {
76498                         dispatch.call('change');
76499                     });
76500             }
76501
76502
76503             function hideLayer() {
76504                 var layer = context.surface().selectAll('.data-layer.osm');
76505                 layer.interrupt();
76506
76507                 layer
76508                     .transition()
76509                     .duration(250)
76510                     .style('opacity', 0)
76511                     .on('end interrupt', function () {
76512                         layer.classed('disabled', true);
76513                         dispatch.call('change');
76514                     });
76515             }
76516
76517
76518             drawOsm.enabled = function(val) {
76519                 if (!arguments.length) return enabled;
76520                 enabled = val;
76521
76522                 if (enabled) {
76523                     showLayer();
76524                 } else {
76525                     hideLayer();
76526                 }
76527
76528                 dispatch.call('change');
76529                 return this;
76530             };
76531
76532
76533             return drawOsm;
76534         }
76535
76536         var _notesEnabled = false;
76537         var _osmService;
76538
76539
76540         function svgNotes(projection, context, dispatch$1) {
76541             if (!dispatch$1) { dispatch$1 = dispatch('change'); }
76542             var throttledRedraw = throttle(function () { dispatch$1.call('change'); }, 1000);
76543             var minZoom = 12;
76544             var touchLayer = d3_select(null);
76545             var drawLayer = d3_select(null);
76546             var _notesVisible = false;
76547
76548
76549             function markerPath(selection, klass) {
76550                 selection
76551                     .attr('class', klass)
76552                     .attr('transform', 'translate(-8, -22)')
76553                     .attr('d', 'm17.5,0l-15,0c-1.37,0 -2.5,1.12 -2.5,2.5l0,11.25c0,1.37 1.12,2.5 2.5,2.5l3.75,0l0,3.28c0,0.38 0.43,0.6 0.75,0.37l4.87,-3.65l5.62,0c1.37,0 2.5,-1.12 2.5,-2.5l0,-11.25c0,-1.37 -1.12,-2.5 -2.5,-2.5z');
76554             }
76555
76556
76557             // Loosely-coupled osm service for fetching notes.
76558             function getService() {
76559                 if (services$1.osm && !_osmService) {
76560                     _osmService = services$1.osm;
76561                     _osmService.on('loadedNotes', throttledRedraw);
76562                 } else if (!services$1.osm && _osmService) {
76563                     _osmService = null;
76564                 }
76565
76566                 return _osmService;
76567             }
76568
76569
76570             // Show the notes
76571             function editOn() {
76572                 if (!_notesVisible) {
76573                     _notesVisible = true;
76574                     drawLayer
76575                         .style('display', 'block');
76576                 }
76577             }
76578
76579
76580             // Immediately remove the notes and their touch targets
76581             function editOff() {
76582                 if (_notesVisible) {
76583                     _notesVisible = false;
76584                     drawLayer
76585                         .style('display', 'none');
76586                     drawLayer.selectAll('.note')
76587                         .remove();
76588                     touchLayer.selectAll('.note')
76589                         .remove();
76590                 }
76591             }
76592
76593
76594             // Enable the layer.  This shows the notes and transitions them to visible.
76595             function layerOn() {
76596                 editOn();
76597
76598                 drawLayer
76599                     .style('opacity', 0)
76600                     .transition()
76601                     .duration(250)
76602                     .style('opacity', 1)
76603                     .on('end interrupt', function () {
76604                         dispatch$1.call('change');
76605                     });
76606             }
76607
76608
76609             // Disable the layer.  This transitions the layer invisible and then hides the notes.
76610             function layerOff() {
76611                 throttledRedraw.cancel();
76612                 drawLayer.interrupt();
76613                 touchLayer.selectAll('.note')
76614                     .remove();
76615
76616                 drawLayer
76617                     .transition()
76618                     .duration(250)
76619                     .style('opacity', 0)
76620                     .on('end interrupt', function () {
76621                         editOff();
76622                         dispatch$1.call('change');
76623                     });
76624             }
76625
76626
76627             // Update the note markers
76628             function updateMarkers() {
76629                 if (!_notesVisible || !_notesEnabled) return;
76630
76631                 var service = getService();
76632                 var selectedID = context.selectedNoteID();
76633                 var data = (service ? service.notes(projection) : []);
76634                 var getTransform = svgPointTransform(projection);
76635
76636                 // Draw markers..
76637                 var notes = drawLayer.selectAll('.note')
76638                     .data(data, function(d) { return d.status + d.id; });
76639
76640                 // exit
76641                 notes.exit()
76642                     .remove();
76643
76644                 // enter
76645                 var notesEnter = notes.enter()
76646                     .append('g')
76647                     .attr('class', function(d) { return 'note note-' + d.id + ' ' + d.status; })
76648                     .classed('new', function(d) { return d.id < 0; });
76649
76650                 notesEnter
76651                     .append('ellipse')
76652                     .attr('cx', 0.5)
76653                     .attr('cy', 1)
76654                     .attr('rx', 6.5)
76655                     .attr('ry', 3)
76656                     .attr('class', 'stroke');
76657
76658                 notesEnter
76659                     .append('path')
76660                     .call(markerPath, 'shadow');
76661
76662                 notesEnter
76663                     .append('use')
76664                     .attr('class', 'note-fill')
76665                     .attr('width', '20px')
76666                     .attr('height', '20px')
76667                     .attr('x', '-8px')
76668                     .attr('y', '-22px')
76669                     .attr('xlink:href', '#iD-icon-note');
76670
76671                 notesEnter.selectAll('.icon-annotation')
76672                     .data(function(d) { return [d]; })
76673                     .enter()
76674                     .append('use')
76675                     .attr('class', 'icon-annotation')
76676                     .attr('width', '10px')
76677                     .attr('height', '10px')
76678                     .attr('x', '-3px')
76679                     .attr('y', '-19px')
76680                     .attr('xlink:href', function(d) {
76681                         return '#iD-icon-' + (d.id < 0 ? 'plus' : (d.status === 'open' ? 'close' : 'apply'));
76682                     });
76683
76684                 // update
76685                 notes
76686                     .merge(notesEnter)
76687                     .sort(sortY)
76688                     .classed('selected', function(d) {
76689                         var mode = context.mode();
76690                         var isMoving = mode && mode.id === 'drag-note';  // no shadows when dragging
76691                         return !isMoving && d.id === selectedID;
76692                     })
76693                     .attr('transform', getTransform);
76694
76695
76696                 // Draw targets..
76697                 if (touchLayer.empty()) return;
76698                 var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
76699
76700                 var targets = touchLayer.selectAll('.note')
76701                     .data(data, function(d) { return d.id; });
76702
76703                 // exit
76704                 targets.exit()
76705                     .remove();
76706
76707                 // enter/update
76708                 targets.enter()
76709                     .append('rect')
76710                     .attr('width', '20px')
76711                     .attr('height', '20px')
76712                     .attr('x', '-8px')
76713                     .attr('y', '-22px')
76714                     .merge(targets)
76715                     .sort(sortY)
76716                     .attr('class', function(d) {
76717                         var newClass = (d.id < 0 ? 'new' : '');
76718                         return 'note target note-' + d.id + ' ' + fillClass + newClass;
76719                     })
76720                     .attr('transform', getTransform);
76721
76722
76723                 function sortY(a, b) {
76724                     return (a.id === selectedID) ? 1 : (b.id === selectedID) ? -1 : b.loc[1] - a.loc[1];
76725                 }
76726             }
76727
76728
76729             // Draw the notes layer and schedule loading notes and updating markers.
76730             function drawNotes(selection) {
76731                 var service = getService();
76732
76733                 var surface = context.surface();
76734                 if (surface && !surface.empty()) {
76735                     touchLayer = surface.selectAll('.data-layer.touch .layer-touch.markers');
76736                 }
76737
76738                 drawLayer = selection.selectAll('.layer-notes')
76739                     .data(service ? [0] : []);
76740
76741                 drawLayer.exit()
76742                     .remove();
76743
76744                 drawLayer = drawLayer.enter()
76745                     .append('g')
76746                     .attr('class', 'layer-notes')
76747                     .style('display', _notesEnabled ? 'block' : 'none')
76748                     .merge(drawLayer);
76749
76750                 if (_notesEnabled) {
76751                     if (service && ~~context.map().zoom() >= minZoom) {
76752                         editOn();
76753                         service.loadNotes(projection);
76754                         updateMarkers();
76755                     } else {
76756                         editOff();
76757                     }
76758                 }
76759             }
76760
76761
76762             // Toggles the layer on and off
76763             drawNotes.enabled = function(val) {
76764                 if (!arguments.length) return _notesEnabled;
76765
76766                 _notesEnabled = val;
76767                 if (_notesEnabled) {
76768                     layerOn();
76769                 } else {
76770                     layerOff();
76771                     if (context.selectedNoteID()) {
76772                         context.enter(modeBrowse(context));
76773                     }
76774                 }
76775
76776                 dispatch$1.call('change');
76777                 return this;
76778             };
76779
76780
76781             return drawNotes;
76782         }
76783
76784         function svgTouch() {
76785
76786             function drawTouch(selection) {
76787                 selection.selectAll('.layer-touch')
76788                     .data(['areas', 'lines', 'points', 'turns', 'markers'])
76789                     .enter()
76790                     .append('g')
76791                     .attr('class', function(d) { return 'layer-touch ' + d; });
76792             }
76793
76794             return drawTouch;
76795         }
76796
76797         function svgLayers(projection, context) {
76798             var dispatch$1 = dispatch('change');
76799             var svg = d3_select(null);
76800             var _layers = [
76801                 { id: 'osm', layer: svgOsm(projection, context, dispatch$1) },
76802                 { id: 'notes', layer: svgNotes(projection, context, dispatch$1) },
76803                 { id: 'data', layer: svgData(projection, context, dispatch$1) },
76804                 { id: 'keepRight', layer: svgKeepRight(projection, context, dispatch$1) },
76805                 { id: 'improveOSM', layer: svgImproveOSM(projection, context, dispatch$1) },
76806                 { id: 'streetside', layer: svgStreetside(projection, context, dispatch$1)},
76807                 { id: 'mapillary', layer: svgMapillaryImages(projection, context, dispatch$1) },
76808                 { id: 'mapillary-signs',  layer: svgMapillarySigns(projection, context, dispatch$1) },
76809                 { id: 'openstreetcam', layer: svgOpenstreetcamImages(projection, context, dispatch$1) },
76810                 { id: 'debug', layer: svgDebug(projection, context) },
76811                 { id: 'geolocate', layer: svgGeolocate(projection) },
76812                 { id: 'touch', layer: svgTouch() }
76813             ];
76814
76815
76816             function drawLayers(selection) {
76817                 svg = selection.selectAll('.surface')
76818                     .data([0]);
76819
76820                 svg = svg.enter()
76821                     .append('svg')
76822                     .attr('class', 'surface')
76823                     .merge(svg);
76824
76825                 var defs = svg.selectAll('.surface-defs')
76826                     .data([0]);
76827
76828                 defs.enter()
76829                     .append('defs')
76830                     .attr('class', 'surface-defs');
76831
76832                 var groups = svg.selectAll('.data-layer')
76833                     .data(_layers);
76834
76835                 groups.exit()
76836                     .remove();
76837
76838                 groups.enter()
76839                     .append('g')
76840                     .attr('class', function(d) { return 'data-layer ' + d.id; })
76841                     .merge(groups)
76842                     .each(function(d) { d3_select(this).call(d.layer); });
76843             }
76844
76845
76846             drawLayers.all = function() {
76847                 return _layers;
76848             };
76849
76850
76851             drawLayers.layer = function(id) {
76852                 var obj = _layers.find(function(o) { return o.id === id; });
76853                 return obj && obj.layer;
76854             };
76855
76856
76857             drawLayers.only = function(what) {
76858                 var arr = [].concat(what);
76859                 var all = _layers.map(function(layer) { return layer.id; });
76860                 return drawLayers.remove(utilArrayDifference(all, arr));
76861             };
76862
76863
76864             drawLayers.remove = function(what) {
76865                 var arr = [].concat(what);
76866                 arr.forEach(function(id) {
76867                     _layers = _layers.filter(function(o) { return o.id !== id; });
76868                 });
76869                 dispatch$1.call('change');
76870                 return this;
76871             };
76872
76873
76874             drawLayers.add = function(what) {
76875                 var arr = [].concat(what);
76876                 arr.forEach(function(obj) {
76877                     if ('id' in obj && 'layer' in obj) {
76878                         _layers.push(obj);
76879                     }
76880                 });
76881                 dispatch$1.call('change');
76882                 return this;
76883             };
76884
76885
76886             drawLayers.dimensions = function(val) {
76887                 if (!arguments.length) return utilGetDimensions(svg);
76888                 utilSetDimensions(svg, val);
76889                 return this;
76890             };
76891
76892
76893             return utilRebind(drawLayers, dispatch$1, 'on');
76894         }
76895
76896         function svgLines(projection, context) {
76897             var detected = utilDetect();
76898
76899             var highway_stack = {
76900                 motorway: 0,
76901                 motorway_link: 1,
76902                 trunk: 2,
76903                 trunk_link: 3,
76904                 primary: 4,
76905                 primary_link: 5,
76906                 secondary: 6,
76907                 tertiary: 7,
76908                 unclassified: 8,
76909                 residential: 9,
76910                 service: 10,
76911                 footway: 11
76912             };
76913
76914
76915             function drawTargets(selection, graph, entities, filter) {
76916                 var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
76917                 var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
76918                 var getPath = svgPath(projection).geojson;
76919                 var activeID = context.activeID();
76920
76921                 // The targets and nopes will be MultiLineString sub-segments of the ways
76922                 var data = { targets: [], nopes: [] };
76923
76924                 entities.forEach(function(way) {
76925                     var features = svgSegmentWay(way, graph, activeID);
76926                     data.targets.push.apply(data.targets, features.passive);
76927                     data.nopes.push.apply(data.nopes, features.active);
76928                 });
76929
76930
76931                 // Targets allow hover and vertex snapping
76932                 var targetData = data.targets.filter(getPath);
76933                 var targets = selection.selectAll('.line.target-allowed')
76934                     .filter(function(d) { return filter(d.properties.entity); })
76935                     .data(targetData, function key(d) { return d.id; });
76936
76937                 // exit
76938                 targets.exit()
76939                     .remove();
76940
76941                 // enter/update
76942                 targets.enter()
76943                     .append('path')
76944                     .merge(targets)
76945                     .attr('d', getPath)
76946                     .attr('class', function(d) { return 'way line target target-allowed ' + targetClass + d.id; });
76947
76948
76949                 // NOPE
76950                 var nopeData = data.nopes.filter(getPath);
76951                 var nopes = selection.selectAll('.line.target-nope')
76952                     .filter(function(d) { return filter(d.properties.entity); })
76953                     .data(nopeData, function key(d) { return d.id; });
76954
76955                 // exit
76956                 nopes.exit()
76957                     .remove();
76958
76959                 // enter/update
76960                 nopes.enter()
76961                     .append('path')
76962                     .merge(nopes)
76963                     .attr('d', getPath)
76964                     .attr('class', function(d) { return 'way line target target-nope ' + nopeClass + d.id; });
76965             }
76966
76967
76968             function drawLines(selection, graph, entities, filter) {
76969
76970                 function waystack(a, b) {
76971                     var selected = context.selectedIDs();
76972                     var scoreA = selected.indexOf(a.id) !== -1 ? 20 : 0;
76973                     var scoreB = selected.indexOf(b.id) !== -1 ? 20 : 0;
76974
76975                     if (a.tags.highway) { scoreA -= highway_stack[a.tags.highway]; }
76976                     if (b.tags.highway) { scoreB -= highway_stack[b.tags.highway]; }
76977                     return scoreA - scoreB;
76978                 }
76979
76980
76981                 function drawLineGroup(selection, klass, isSelected) {
76982                     // Note: Don't add `.selected` class in draw modes
76983                     var mode = context.mode();
76984                     var isDrawing = mode && /^draw/.test(mode.id);
76985                     var selectedClass = (!isDrawing && isSelected) ? 'selected ' : '';
76986
76987                     var lines = selection
76988                         .selectAll('path')
76989                         .filter(filter)
76990                         .data(getPathData(isSelected), osmEntity.key);
76991
76992                     lines.exit()
76993                         .remove();
76994
76995                     // Optimization: Call expensive TagClasses only on enter selection. This
76996                     // works because osmEntity.key is defined to include the entity v attribute.
76997                     lines.enter()
76998                         .append('path')
76999                         .attr('class', function(d) {
77000
77001                             var prefix = 'way line';
77002                             if (!d.hasInterestingTags() && graph.parentMultipolygons(d).length > 0) {
77003                                 // fudge the classes to style multipolygon member lines as area edges
77004                                 prefix = 'relation area';
77005                             }
77006
77007                             var oldMPClass = oldMultiPolygonOuters[d.id] ? 'old-multipolygon ' : '';
77008                             return prefix + ' ' + klass + ' ' + selectedClass + oldMPClass + d.id;
77009                         })
77010                         .call(svgTagClasses())
77011                         .merge(lines)
77012                         .sort(waystack)
77013                         .attr('d', getPath)
77014                         .call(svgTagClasses().tags(svgRelationMemberTags(graph)));
77015
77016                     return selection;
77017                 }
77018
77019
77020                 function getPathData(isSelected) {
77021                     return function() {
77022                         var layer = this.parentNode.__data__;
77023                         var data = pathdata[layer] || [];
77024                         return data.filter(function(d) {
77025                             if (isSelected)
77026                                 return context.selectedIDs().indexOf(d.id) !== -1;
77027                             else
77028                                 return context.selectedIDs().indexOf(d.id) === -1;
77029                         });
77030                     };
77031                 }
77032
77033                 function addMarkers(layergroup, pathclass, groupclass, groupdata, marker) {
77034                     var markergroup = layergroup
77035                         .selectAll('g.' + groupclass)
77036                         .data([pathclass]);
77037
77038                     markergroup = markergroup.enter()
77039                         .append('g')
77040                         .attr('class', groupclass)
77041                         .merge(markergroup);
77042
77043                     var markers = markergroup
77044                         .selectAll('path')
77045                         .filter(filter)
77046                         .data(
77047                             function data() { return groupdata[this.parentNode.__data__] || []; },
77048                             function key(d) { return [d.id, d.index]; }
77049                         );
77050
77051                     markers.exit()
77052                         .remove();
77053
77054                     markers = markers.enter()
77055                         .append('path')
77056                         .attr('class', pathclass)
77057                         .attr('marker-mid', marker)
77058                         .merge(markers)
77059                         .attr('d', function(d) { return d.d; });
77060
77061                     if (detected.ie) {
77062                         markers.each(function() { this.parentNode.insertBefore(this, this); });
77063                     }
77064                 }
77065
77066
77067                 var getPath = svgPath(projection, graph);
77068                 var ways = [];
77069                 var onewaydata = {};
77070                 var sideddata = {};
77071                 var oldMultiPolygonOuters = {};
77072
77073                 for (var i = 0; i < entities.length; i++) {
77074                     var entity = entities[i];
77075                     var outer = osmOldMultipolygonOuterMember(entity, graph);
77076                     if (outer) {
77077                         ways.push(entity.mergeTags(outer.tags));
77078                         oldMultiPolygonOuters[outer.id] = true;
77079                     } else if (entity.geometry(graph) === 'line') {
77080                         ways.push(entity);
77081                     }
77082                 }
77083
77084                 ways = ways.filter(getPath);
77085                 var pathdata = utilArrayGroupBy(ways, function(way) { return way.layer(); });
77086
77087                 Object.keys(pathdata).forEach(function(k) {
77088                     var v = pathdata[k];
77089                     var onewayArr = v.filter(function(d) { return d.isOneWay(); });
77090                     var onewaySegments = svgMarkerSegments(
77091                         projection, graph, 35,
77092                         function shouldReverse(entity) { return entity.tags.oneway === '-1'; },
77093                         function bothDirections(entity) {
77094                             return entity.tags.oneway === 'reversible' || entity.tags.oneway === 'alternating';
77095                         }
77096                     );
77097                     onewaydata[k] = utilArrayFlatten(onewayArr.map(onewaySegments));
77098
77099                     var sidedArr = v.filter(function(d) { return d.isSided(); });
77100                     var sidedSegments = svgMarkerSegments(
77101                         projection, graph, 30,
77102                         function shouldReverse() { return false; },
77103                         function bothDirections() { return false; }
77104                     );
77105                     sideddata[k] = utilArrayFlatten(sidedArr.map(sidedSegments));
77106                 });
77107
77108
77109                 var covered = selection.selectAll('.layer-osm.covered');     // under areas
77110                 var uncovered = selection.selectAll('.layer-osm.lines');     // over areas
77111                 var touchLayer = selection.selectAll('.layer-touch.lines');
77112
77113                 // Draw lines..
77114                 [covered, uncovered].forEach(function(selection) {
77115                     var range = (selection === covered ? d3_range(-10,0) : d3_range(0,11));
77116                     var layergroup = selection
77117                         .selectAll('g.layergroup')
77118                         .data(range);
77119
77120                     layergroup = layergroup.enter()
77121                         .append('g')
77122                         .attr('class', function(d) { return 'layergroup layer' + String(d); })
77123                         .merge(layergroup);
77124
77125                     layergroup
77126                         .selectAll('g.linegroup')
77127                         .data(['shadow', 'casing', 'stroke', 'shadow-highlighted', 'casing-highlighted', 'stroke-highlighted'])
77128                         .enter()
77129                         .append('g')
77130                         .attr('class', function(d) { return 'linegroup line-' + d; });
77131
77132                     layergroup.selectAll('g.line-shadow')
77133                         .call(drawLineGroup, 'shadow', false);
77134                     layergroup.selectAll('g.line-casing')
77135                         .call(drawLineGroup, 'casing', false);
77136                     layergroup.selectAll('g.line-stroke')
77137                         .call(drawLineGroup, 'stroke', false);
77138
77139                     layergroup.selectAll('g.line-shadow-highlighted')
77140                         .call(drawLineGroup, 'shadow', true);
77141                     layergroup.selectAll('g.line-casing-highlighted')
77142                         .call(drawLineGroup, 'casing', true);
77143                     layergroup.selectAll('g.line-stroke-highlighted')
77144                         .call(drawLineGroup, 'stroke', true);
77145
77146                     addMarkers(layergroup, 'oneway', 'onewaygroup', onewaydata, 'url(#oneway-marker)');
77147                     addMarkers(layergroup, 'sided', 'sidedgroup', sideddata,
77148                         function marker(d) {
77149                             var category = graph.entity(d.id).sidednessIdentifier();
77150                             return 'url(#sided-marker-' + category + ')';
77151                         }
77152                     );
77153                 });
77154
77155                 // Draw touch targets..
77156                 touchLayer
77157                     .call(drawTargets, graph, ways, filter);
77158             }
77159
77160
77161             return drawLines;
77162         }
77163
77164         function svgMidpoints(projection, context) {
77165             var targetRadius = 8;
77166
77167             function drawTargets(selection, graph, entities, filter) {
77168                 var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
77169                 var getTransform = svgPointTransform(projection).geojson;
77170
77171                 var data = entities.map(function(midpoint) {
77172                     return {
77173                         type: 'Feature',
77174                         id: midpoint.id,
77175                         properties: {
77176                             target: true,
77177                             entity: midpoint
77178                         },
77179                         geometry: {
77180                             type: 'Point',
77181                             coordinates: midpoint.loc
77182                         }
77183                     };
77184                 });
77185
77186                 var targets = selection.selectAll('.midpoint.target')
77187                     .filter(function(d) { return filter(d.properties.entity); })
77188                     .data(data, function key(d) { return d.id; });
77189
77190                 // exit
77191                 targets.exit()
77192                     .remove();
77193
77194                 // enter/update
77195                 targets.enter()
77196                     .append('circle')
77197                     .attr('r', targetRadius)
77198                     .merge(targets)
77199                     .attr('class', function(d) { return 'node midpoint target ' + fillClass + d.id; })
77200                     .attr('transform', getTransform);
77201             }
77202
77203
77204             function drawMidpoints(selection, graph, entities, filter, extent) {
77205                 var drawLayer = selection.selectAll('.layer-osm.points .points-group.midpoints');
77206                 var touchLayer = selection.selectAll('.layer-touch.points');
77207
77208                 var mode = context.mode();
77209                 if (mode && mode.id !== 'select') {
77210                     drawLayer.selectAll('.midpoint').remove();
77211                     touchLayer.selectAll('.midpoint.target').remove();
77212                     return;
77213                 }
77214
77215                 var poly = extent.polygon();
77216                 var midpoints = {};
77217
77218                 for (var i = 0; i < entities.length; i++) {
77219                     var entity = entities[i];
77220
77221                     if (entity.type !== 'way') continue;
77222                     if (!filter(entity)) continue;
77223                     if (context.selectedIDs().indexOf(entity.id) < 0) continue;
77224
77225                     var nodes = graph.childNodes(entity);
77226                     for (var j = 0; j < nodes.length - 1; j++) {
77227                         var a = nodes[j];
77228                         var b = nodes[j + 1];
77229                         var id = [a.id, b.id].sort().join('-');
77230
77231                         if (midpoints[id]) {
77232                             midpoints[id].parents.push(entity);
77233                         } else if (geoVecLength(projection(a.loc), projection(b.loc)) > 40) {
77234                             var point = geoVecInterp(a.loc, b.loc, 0.5);
77235                             var loc = null;
77236
77237                             if (extent.intersects(point)) {
77238                                 loc = point;
77239                             } else {
77240                                 for (var k = 0; k < 4; k++) {
77241                                     point = geoLineIntersection([a.loc, b.loc], [poly[k], poly[k + 1]]);
77242                                     if (point &&
77243                                         geoVecLength(projection(a.loc), projection(point)) > 20 &&
77244                                         geoVecLength(projection(b.loc), projection(point)) > 20)
77245                                     {
77246                                         loc = point;
77247                                         break;
77248                                     }
77249                                 }
77250                             }
77251
77252                             if (loc) {
77253                                 midpoints[id] = {
77254                                     type: 'midpoint',
77255                                     id: id,
77256                                     loc: loc,
77257                                     edge: [a.id, b.id],
77258                                     parents: [entity]
77259                                 };
77260                             }
77261                         }
77262                     }
77263                 }
77264
77265
77266                 function midpointFilter(d) {
77267                     if (midpoints[d.id])
77268                         return true;
77269
77270                     for (var i = 0; i < d.parents.length; i++) {
77271                         if (filter(d.parents[i])) {
77272                             return true;
77273                         }
77274                     }
77275
77276                     return false;
77277                 }
77278
77279
77280                 var groups = drawLayer.selectAll('.midpoint')
77281                     .filter(midpointFilter)
77282                     .data(Object.values(midpoints), function(d) { return d.id; });
77283
77284                 groups.exit()
77285                     .remove();
77286
77287                 var enter = groups.enter()
77288                     .insert('g', ':first-child')
77289                     .attr('class', 'midpoint');
77290
77291                 enter
77292                     .append('polygon')
77293                     .attr('points', '-6,8 10,0 -6,-8')
77294                     .attr('class', 'shadow');
77295
77296                 enter
77297                     .append('polygon')
77298                     .attr('points', '-3,4 5,0 -3,-4')
77299                     .attr('class', 'fill');
77300
77301                 groups = groups
77302                     .merge(enter)
77303                     .attr('transform', function(d) {
77304                         var translate = svgPointTransform(projection);
77305                         var a = graph.entity(d.edge[0]);
77306                         var b = graph.entity(d.edge[1]);
77307                         var angle = geoAngle(a, b, projection) * (180 / Math.PI);
77308                         return translate(d) + ' rotate(' + angle + ')';
77309                     })
77310                     .call(svgTagClasses().tags(
77311                         function(d) { return d.parents[0].tags; }
77312                     ));
77313
77314                 // Propagate data bindings.
77315                 groups.select('polygon.shadow');
77316                 groups.select('polygon.fill');
77317
77318
77319                 // Draw touch targets..
77320                 touchLayer
77321                     .call(drawTargets, graph, Object.values(midpoints), midpointFilter);
77322             }
77323
77324             return drawMidpoints;
77325         }
77326
77327         function svgPoints(projection, context) {
77328
77329             function markerPath(selection, klass) {
77330                 selection
77331                     .attr('class', klass)
77332                     .attr('transform', 'translate(-8, -23)')
77333                     .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');
77334             }
77335
77336             function sortY(a, b) {
77337                 return b.loc[1] - a.loc[1];
77338             }
77339
77340
77341             // Avoid exit/enter if we're just moving stuff around.
77342             // The node will get a new version but we only need to run the update selection.
77343             function fastEntityKey(d) {
77344                 var mode = context.mode();
77345                 var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
77346                 return isMoving ? d.id : osmEntity.key(d);
77347             }
77348
77349
77350             function drawTargets(selection, graph, entities, filter) {
77351                 var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
77352                 var getTransform = svgPointTransform(projection).geojson;
77353                 var activeID = context.activeID();
77354                 var data = [];
77355
77356                 entities.forEach(function(node) {
77357                     if (activeID === node.id) return;   // draw no target on the activeID
77358
77359                     data.push({
77360                         type: 'Feature',
77361                         id: node.id,
77362                         properties: {
77363                             target: true,
77364                             entity: node
77365                         },
77366                         geometry: node.asGeoJSON()
77367                     });
77368                 });
77369
77370                 var targets = selection.selectAll('.point.target')
77371                     .filter(function(d) { return filter(d.properties.entity); })
77372                     .data(data, function key(d) { return d.id; });
77373
77374                 // exit
77375                 targets.exit()
77376                     .remove();
77377
77378                 // enter/update
77379                 targets.enter()
77380                     .append('rect')
77381                     .attr('x', -10)
77382                     .attr('y', -26)
77383                     .attr('width', 20)
77384                     .attr('height', 30)
77385                     .merge(targets)
77386                     .attr('class', function(d) { return 'node point target ' + fillClass + d.id; })
77387                     .attr('transform', getTransform);
77388             }
77389
77390
77391             function drawPoints(selection, graph, entities, filter) {
77392                 var wireframe = context.surface().classed('fill-wireframe');
77393                 var zoom = geoScaleToZoom(projection.scale());
77394
77395                 // Points with a direction will render as vertices at higher zooms..
77396                 function renderAsPoint(entity) {
77397                     return entity.geometry(graph) === 'point' &&
77398                         !(zoom >= 18 && entity.directions(graph, projection).length);
77399                 }
77400
77401                 // All points will render as vertices in wireframe mode too..
77402                 var points = wireframe ? [] : entities.filter(renderAsPoint);
77403                 points.sort(sortY);
77404
77405
77406                 var drawLayer = selection.selectAll('.layer-osm.points .points-group.points');
77407                 var touchLayer = selection.selectAll('.layer-touch.points');
77408
77409                 // Draw points..
77410                 var groups = drawLayer.selectAll('g.point')
77411                     .filter(filter)
77412                     .data(points, fastEntityKey);
77413
77414                 groups.exit()
77415                     .remove();
77416
77417                 var enter = groups.enter()
77418                     .append('g')
77419                     .attr('class', function(d) { return 'node point ' + d.id; })
77420                     .order();
77421
77422                 enter
77423                     .append('path')
77424                     .call(markerPath, 'shadow');
77425
77426                 enter
77427                     .append('ellipse')
77428                     .attr('cx', 0.5)
77429                     .attr('cy', 1)
77430                     .attr('rx', 6.5)
77431                     .attr('ry', 3)
77432                     .attr('class', 'stroke');
77433
77434                 enter
77435                     .append('path')
77436                     .call(markerPath, 'stroke');
77437
77438                 enter
77439                     .append('use')
77440                     .attr('transform', 'translate(-5, -19)')
77441                     .attr('class', 'icon')
77442                     .attr('width', '11px')
77443                     .attr('height', '11px');
77444
77445                 groups = groups
77446                     .merge(enter)
77447                     .attr('transform', svgPointTransform(projection))
77448                     .call(svgTagClasses());
77449
77450                 groups.select('.shadow');   // propagate bound data
77451                 groups.select('.stroke');   // propagate bound data
77452                 groups.select('.icon')      // propagate bound data
77453                     .attr('xlink:href', function(entity) {
77454                         var preset = context.presets().match(entity, graph);
77455                         var picon = preset && preset.icon;
77456
77457                         if (!picon) {
77458                             return '';
77459                         } else {
77460                             var isMaki = /^maki-/.test(picon);
77461                             return '#' + picon + (isMaki ? '-11' : '');
77462                         }
77463                     });
77464
77465
77466                 // Draw touch targets..
77467                 touchLayer
77468                     .call(drawTargets, graph, points, filter);
77469             }
77470
77471
77472             return drawPoints;
77473         }
77474
77475         function svgTurns(projection, context) {
77476
77477             function icon(turn) {
77478                 var u = turn.u ? '-u' : '';
77479                 if (turn.no) return '#iD-turn-no' + u;
77480                 if (turn.only) return '#iD-turn-only' + u;
77481                 return '#iD-turn-yes' + u;
77482             }
77483
77484             function drawTurns(selection, graph, turns) {
77485
77486                 function turnTransform(d) {
77487                     var pxRadius = 50;
77488                     var toWay = graph.entity(d.to.way);
77489                     var toPoints = graph.childNodes(toWay)
77490                         .map(function (n) { return n.loc; })
77491                         .map(projection);
77492                     var toLength = geoPathLength(toPoints);
77493                     var mid = toLength / 2;    // midpoint of destination way
77494
77495                     var toNode = graph.entity(d.to.node);
77496                     var toVertex = graph.entity(d.to.vertex);
77497                     var a = geoAngle(toVertex, toNode, projection);
77498                     var o = projection(toVertex.loc);
77499                     var r = d.u ? 0                  // u-turn: no radius
77500                         : !toWay.__via ? pxRadius    // leaf way: put marker at pxRadius
77501                         : Math.min(mid, pxRadius);   // via way: prefer pxRadius, fallback to mid for very short ways
77502
77503                     return 'translate(' + (r * Math.cos(a) + o[0]) + ',' + (r * Math.sin(a) + o[1]) + ') ' +
77504                         'rotate(' + a * 180 / Math.PI + ')';
77505                 }
77506
77507
77508                 var drawLayer = selection.selectAll('.layer-osm.points .points-group.turns');
77509                 var touchLayer = selection.selectAll('.layer-touch.turns');
77510
77511                 // Draw turns..
77512                 var groups = drawLayer.selectAll('g.turn')
77513                     .data(turns, function(d) { return d.key; });
77514
77515                 // exit
77516                 groups.exit()
77517                     .remove();
77518
77519                 // enter
77520                 var groupsEnter = groups.enter()
77521                     .append('g')
77522                     .attr('class', function(d) { return 'turn ' + d.key; });
77523
77524                 var turnsEnter = groupsEnter
77525                     .filter(function(d) { return !d.u; });
77526
77527                 turnsEnter.append('rect')
77528                     .attr('transform', 'translate(-22, -12)')
77529                     .attr('width', '44')
77530                     .attr('height', '24');
77531
77532                 turnsEnter.append('use')
77533                     .attr('transform', 'translate(-22, -12)')
77534                     .attr('width', '44')
77535                     .attr('height', '24');
77536
77537                 var uEnter = groupsEnter
77538                     .filter(function(d) { return d.u; });
77539
77540                 uEnter.append('circle')
77541                     .attr('r', '16');
77542
77543                 uEnter.append('use')
77544                     .attr('transform', 'translate(-16, -16)')
77545                     .attr('width', '32')
77546                     .attr('height', '32');
77547
77548                 // update
77549                 groups = groups
77550                     .merge(groupsEnter)
77551                     .attr('opacity', function(d) { return d.direct === false ? '0.7' : null; })
77552                     .attr('transform', turnTransform);
77553
77554                 groups.select('use')
77555                     .attr('xlink:href', icon);
77556
77557                 groups.select('rect');      // propagate bound data
77558                 groups.select('circle');    // propagate bound data
77559
77560
77561                 // Draw touch targets..
77562                 var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
77563                 groups = touchLayer.selectAll('g.turn')
77564                     .data(turns, function(d) { return d.key; });
77565
77566                 // exit
77567                 groups.exit()
77568                     .remove();
77569
77570                 // enter
77571                 groupsEnter = groups.enter()
77572                     .append('g')
77573                     .attr('class', function(d) { return 'turn ' + d.key; });
77574
77575                 turnsEnter = groupsEnter
77576                     .filter(function(d) { return !d.u; });
77577
77578                 turnsEnter.append('rect')
77579                     .attr('class', 'target ' + fillClass)
77580                     .attr('transform', 'translate(-22, -12)')
77581                     .attr('width', '44')
77582                     .attr('height', '24');
77583
77584                 uEnter = groupsEnter
77585                     .filter(function(d) { return d.u; });
77586
77587                 uEnter.append('circle')
77588                     .attr('class', 'target ' + fillClass)
77589                     .attr('r', '16');
77590
77591                 // update
77592                 groups = groups
77593                     .merge(groupsEnter)
77594                     .attr('transform', turnTransform);
77595
77596                 groups.select('rect');      // propagate bound data
77597                 groups.select('circle');    // propagate bound data
77598
77599
77600                 return this;
77601             }
77602
77603             return drawTurns;
77604         }
77605
77606         function svgVertices(projection, context) {
77607             var radiuses = {
77608                 //       z16-, z17,   z18+,  w/icon
77609                 shadow: [6,    7.5,   7.5,   12],
77610                 stroke: [2.5,  3.5,   3.5,   8],
77611                 fill:   [1,    1.5,   1.5,   1.5]
77612             };
77613
77614             var _currHoverTarget;
77615             var _currPersistent = {};
77616             var _currHover = {};
77617             var _prevHover = {};
77618             var _currSelected = {};
77619             var _prevSelected = {};
77620             var _radii = {};
77621
77622
77623             function sortY(a, b) {
77624                 return b.loc[1] - a.loc[1];
77625             }
77626
77627             // Avoid exit/enter if we're just moving stuff around.
77628             // The node will get a new version but we only need to run the update selection.
77629             function fastEntityKey(d) {
77630                 var mode = context.mode();
77631                 var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
77632                 return isMoving ? d.id : osmEntity.key(d);
77633             }
77634
77635
77636             function draw(selection, graph, vertices, sets, filter) {
77637                 sets = sets || { selected: {}, important: {}, hovered: {} };
77638
77639                 var icons = {};
77640                 var directions = {};
77641                 var wireframe = context.surface().classed('fill-wireframe');
77642                 var zoom = geoScaleToZoom(projection.scale());
77643                 var z = (zoom < 17 ? 0 : zoom < 18 ? 1 : 2);
77644                 var activeID = context.activeID();
77645
77646
77647                 function getIcon(d) {
77648                     // always check latest entity, as fastEntityKey avoids enter/exit now
77649                     var entity = graph.entity(d.id);
77650                     if (entity.id in icons) return icons[entity.id];
77651
77652                     icons[entity.id] =
77653                         entity.hasInterestingTags() &&
77654                         context.presets().match(entity, graph).icon;
77655
77656                     return icons[entity.id];
77657                 }
77658
77659
77660                 // memoize directions results, return false for empty arrays (for use in filter)
77661                 function getDirections(entity) {
77662                     if (entity.id in directions) return directions[entity.id];
77663
77664                     var angles = entity.directions(graph, projection);
77665                     directions[entity.id] = angles.length ? angles : false;
77666                     return angles;
77667                 }
77668
77669
77670                 function updateAttributes(selection) {
77671                     ['shadow', 'stroke', 'fill'].forEach(function(klass) {
77672                         var rads = radiuses[klass];
77673                         selection.selectAll('.' + klass)
77674                             .each(function(entity) {
77675                                 var i = z && getIcon(entity);
77676                                 var r = rads[i ? 3 : z];
77677
77678                                 // slightly increase the size of unconnected endpoints #3775
77679                                 if (entity.id !== activeID && entity.isEndpoint(graph) && !entity.isConnected(graph)) {
77680                                     r += 1.5;
77681                                 }
77682
77683                                 if (klass === 'shadow') {   // remember this value, so we don't need to
77684                                     _radii[entity.id] = r;  // recompute it when we draw the touch targets
77685                                 }
77686
77687                                 d3_select(this)
77688                                     .attr('r', r)
77689                                     .attr('visibility', (i && klass === 'fill') ? 'hidden' : null);
77690                             });
77691                     });
77692                 }
77693
77694                 vertices.sort(sortY);
77695
77696                 var groups = selection.selectAll('g.vertex')
77697                     .filter(filter)
77698                     .data(vertices, fastEntityKey);
77699
77700                 // exit
77701                 groups.exit()
77702                     .remove();
77703
77704                 // enter
77705                 var enter = groups.enter()
77706                     .append('g')
77707                     .attr('class', function(d) { return 'node vertex ' + d.id; })
77708                     .order();
77709
77710                 enter
77711                     .append('circle')
77712                     .attr('class', 'shadow');
77713
77714                 enter
77715                     .append('circle')
77716                     .attr('class', 'stroke');
77717
77718                 // Vertices with tags get a fill.
77719                 enter.filter(function(d) { return d.hasInterestingTags(); })
77720                     .append('circle')
77721                     .attr('class', 'fill');
77722
77723                 // update
77724                 groups = groups
77725                     .merge(enter)
77726                     .attr('transform', svgPointTransform(projection))
77727                     .classed('sibling', function(d) { return d.id in sets.selected; })
77728                     .classed('shared', function(d) { return graph.isShared(d); })
77729                     .classed('endpoint', function(d) { return d.isEndpoint(graph); })
77730                     .call(updateAttributes);
77731
77732
77733                 // Vertices with icons get a `use`.
77734                 var iconUse = groups
77735                     .selectAll('.icon')
77736                     .data(function data(d) { return zoom >= 17 && getIcon(d) ? [d] : []; }, fastEntityKey);
77737
77738                 // exit
77739                 iconUse.exit()
77740                     .remove();
77741
77742                 // enter
77743                 iconUse.enter()
77744                     .append('use')
77745                     .attr('class', 'icon')
77746                     .attr('width', '11px')
77747                     .attr('height', '11px')
77748                     .attr('transform', 'translate(-5.5, -5.5)')
77749                     .attr('xlink:href', function(d) {
77750                         var picon = getIcon(d);
77751                         var isMaki = /^maki-/.test(picon);
77752                         return '#' + picon + (isMaki ? '-11' : '');
77753                     });
77754
77755
77756                 // Vertices with directions get viewfields
77757                 var dgroups = groups
77758                     .selectAll('.viewfieldgroup')
77759                     .data(function data(d) { return zoom >= 18 && getDirections(d) ? [d] : []; }, fastEntityKey);
77760
77761                 // exit
77762                 dgroups.exit()
77763                     .remove();
77764
77765                 // enter/update
77766                 dgroups = dgroups.enter()
77767                     .insert('g', '.shadow')
77768                     .attr('class', 'viewfieldgroup')
77769                     .merge(dgroups);
77770
77771                 var viewfields = dgroups.selectAll('.viewfield')
77772                     .data(getDirections, function key(d) { return osmEntity.key(d); });
77773
77774                 // exit
77775                 viewfields.exit()
77776                     .remove();
77777
77778                 // enter/update
77779                 viewfields.enter()
77780                     .append('path')
77781                     .attr('class', 'viewfield')
77782                     .attr('d', 'M0,0H0')
77783                     .merge(viewfields)
77784                     .attr('marker-start', 'url(#viewfield-marker' + (wireframe ? '-wireframe' : '') + ')')
77785                     .attr('transform', function(d) { return 'rotate(' + d + ')'; });
77786             }
77787
77788
77789             function drawTargets(selection, graph, entities, filter) {
77790                 var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
77791                 var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
77792                 var getTransform = svgPointTransform(projection).geojson;
77793                 var activeID = context.activeID();
77794                 var data = { targets: [], nopes: [] };
77795
77796                 entities.forEach(function(node) {
77797                     if (activeID === node.id) return;   // draw no target on the activeID
77798
77799                     var vertexType = svgPassiveVertex(node, graph, activeID);
77800                     if (vertexType !== 0) {     // passive or adjacent - allow to connect
77801                         data.targets.push({
77802                             type: 'Feature',
77803                             id: node.id,
77804                             properties: {
77805                                 target: true,
77806                                 entity: node
77807                             },
77808                             geometry: node.asGeoJSON()
77809                         });
77810                     } else {
77811                         data.nopes.push({
77812                             type: 'Feature',
77813                             id: node.id + '-nope',
77814                             properties: {
77815                                 nope: true,
77816                                 target: true,
77817                                 entity: node
77818                             },
77819                             geometry: node.asGeoJSON()
77820                         });
77821                     }
77822                 });
77823
77824
77825                 // Targets allow hover and vertex snapping
77826                 var targets = selection.selectAll('.vertex.target-allowed')
77827                     .filter(function(d) { return filter(d.properties.entity); })
77828                     .data(data.targets, function key(d) { return d.id; });
77829
77830                 // exit
77831                 targets.exit()
77832                     .remove();
77833
77834                 // enter/update
77835                 targets.enter()
77836                     .append('circle')
77837                     .attr('r', function(d) { return (_radii[d.id] || radiuses.shadow[3]); })
77838                     .merge(targets)
77839                     .attr('class', function(d) { return 'node vertex target target-allowed ' + targetClass + d.id; })
77840                     .attr('transform', getTransform);
77841
77842
77843                 // NOPE
77844                 var nopes = selection.selectAll('.vertex.target-nope')
77845                     .filter(function(d) { return filter(d.properties.entity); })
77846                     .data(data.nopes, function key(d) { return d.id; });
77847
77848                 // exit
77849                 nopes.exit()
77850                     .remove();
77851
77852                 // enter/update
77853                 nopes.enter()
77854                     .append('circle')
77855                     .attr('r', function(d) { return (_radii[d.properties.entity.id] || radiuses.shadow[3]); })
77856                     .merge(nopes)
77857                     .attr('class', function(d) { return 'node vertex target target-nope ' + nopeClass + d.id; })
77858                     .attr('transform', getTransform);
77859             }
77860
77861
77862             // Points can also render as vertices:
77863             // 1. in wireframe mode or
77864             // 2. at higher zooms if they have a direction
77865             function renderAsVertex(entity, graph, wireframe, zoom) {
77866                 var geometry = entity.geometry(graph);
77867                 return geometry === 'vertex' || (geometry === 'point' && (
77868                     wireframe || (zoom >= 18 && entity.directions(graph, projection).length)
77869                 ));
77870             }
77871
77872
77873             function getSiblingAndChildVertices(ids, graph, wireframe, zoom) {
77874                 var results = {};
77875
77876                 function addChildVertices(entity) {
77877                     var geometry = entity.geometry(graph);
77878                     if (!context.features().isHiddenFeature(entity, graph, geometry)) {
77879                         var i;
77880                         if (entity.type === 'way') {
77881                             for (i = 0; i < entity.nodes.length; i++) {
77882                                 var child = graph.hasEntity(entity.nodes[i]);
77883                                 if (child) {
77884                                     addChildVertices(child);
77885                                 }
77886                             }
77887                         } else if (entity.type === 'relation') {
77888                             for (i = 0; i < entity.members.length; i++) {
77889                                 var member = graph.hasEntity(entity.members[i].id);
77890                                 if (member) {
77891                                     addChildVertices(member);
77892                                 }
77893                             }
77894                         } else if (renderAsVertex(entity, graph, wireframe, zoom)) {
77895                             results[entity.id] = entity;
77896                         }
77897                     }
77898                 }
77899
77900                 ids.forEach(function(id) {
77901                     var entity = graph.hasEntity(id);
77902                     if (!entity) return;
77903
77904                     if (entity.type === 'node') {
77905                         if (renderAsVertex(entity, graph, wireframe, zoom)) {
77906                             results[entity.id] = entity;
77907                             graph.parentWays(entity).forEach(function(entity) {
77908                                 addChildVertices(entity);
77909                             });
77910                         }
77911                     } else {  // way, relation
77912                         addChildVertices(entity);
77913                     }
77914                 });
77915
77916                 return results;
77917             }
77918
77919
77920             function drawVertices(selection, graph, entities, filter, extent, fullRedraw) {
77921                 var wireframe = context.surface().classed('fill-wireframe');
77922                 var zoom = geoScaleToZoom(projection.scale());
77923                 var mode = context.mode();
77924                 var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
77925
77926                 var drawLayer = selection.selectAll('.layer-osm.points .points-group.vertices');
77927                 var touchLayer = selection.selectAll('.layer-touch.points');
77928
77929                 if (fullRedraw) {
77930                     _currPersistent = {};
77931                     _radii = {};
77932                 }
77933
77934                 // Collect important vertices from the `entities` list..
77935                 // (during a paritial redraw, it will not contain everything)
77936                 for (var i = 0; i < entities.length; i++) {
77937                     var entity = entities[i];
77938                     var geometry = entity.geometry(graph);
77939                     var keep = false;
77940
77941                     // a point that looks like a vertex..
77942                     if ((geometry === 'point') && renderAsVertex(entity, graph, wireframe, zoom)) {
77943                         _currPersistent[entity.id] = entity;
77944                         keep = true;
77945
77946                     // a vertex of some importance..
77947                     } else if (geometry === 'vertex' &&
77948                         (entity.hasInterestingTags() || entity.isEndpoint(graph) || entity.isConnected(graph))) {
77949                         _currPersistent[entity.id] = entity;
77950                         keep = true;
77951                     }
77952
77953                     // whatever this is, it's not a persistent vertex..
77954                     if (!keep && !fullRedraw) {
77955                         delete _currPersistent[entity.id];
77956                     }
77957                 }
77958
77959                 // 3 sets of vertices to consider:
77960                 var sets = {
77961                     persistent: _currPersistent,  // persistent = important vertices (render always)
77962                     selected: _currSelected,      // selected + siblings of selected (render always)
77963                     hovered: _currHover           // hovered + siblings of hovered (render only in draw modes)
77964                 };
77965
77966                 var all = Object.assign({}, (isMoving ? _currHover : {}), _currSelected, _currPersistent);
77967
77968                 // Draw the vertices..
77969                 // The filter function controls the scope of what objects d3 will touch (exit/enter/update)
77970                 // Adjust the filter function to expand the scope beyond whatever entities were passed in.
77971                 var filterRendered = function(d) {
77972                     return d.id in _currPersistent || d.id in _currSelected || d.id in _currHover || filter(d);
77973                 };
77974                 drawLayer
77975                     .call(draw, graph, currentVisible(all), sets, filterRendered);
77976
77977                 // Draw touch targets..
77978                 // When drawing, render all targets (not just those affected by a partial redraw)
77979                 var filterTouch = function(d) {
77980                     return isMoving ? true : filterRendered(d);
77981                 };
77982                 touchLayer
77983                     .call(drawTargets, graph, currentVisible(all), filterTouch);
77984
77985
77986                 function currentVisible(which) {
77987                     return Object.keys(which)
77988                         .map(graph.hasEntity, graph)     // the current version of this entity
77989                         .filter(function (entity) { return entity && entity.intersects(extent, graph); });
77990                 }
77991             }
77992
77993
77994             // partial redraw - only update the selected items..
77995             drawVertices.drawSelected = function(selection, graph, extent) {
77996                 var wireframe = context.surface().classed('fill-wireframe');
77997                 var zoom = geoScaleToZoom(projection.scale());
77998
77999                 _prevSelected = _currSelected || {};
78000                 _currSelected = getSiblingAndChildVertices(context.selectedIDs(), graph, wireframe, zoom);
78001
78002                 // note that drawVertices will add `_currSelected` automatically if needed..
78003                 var filter = function(d) { return d.id in _prevSelected; };
78004                 drawVertices(selection, graph, Object.values(_prevSelected), filter, extent, false);
78005             };
78006
78007
78008             // partial redraw - only update the hovered items..
78009             drawVertices.drawHover = function(selection, graph, target, extent) {
78010                 if (target === _currHoverTarget) return;  // continue only if something changed
78011
78012                 var wireframe = context.surface().classed('fill-wireframe');
78013                 var zoom = geoScaleToZoom(projection.scale());
78014
78015                 _prevHover = _currHover || {};
78016                 _currHoverTarget = target;
78017                 var entity = target && target.properties && target.properties.entity;
78018
78019                 if (entity) {
78020                     _currHover = getSiblingAndChildVertices([entity.id], graph, wireframe, zoom);
78021                 } else {
78022                     _currHover = {};
78023                 }
78024
78025                 // note that drawVertices will add `_currHover` automatically if needed..
78026                 var filter = function(d) { return d.id in _prevHover; };
78027                 drawVertices(selection, graph, Object.values(_prevHover), filter, extent, false);
78028             };
78029
78030             return drawVertices;
78031         }
78032
78033         function utilBindOnce(target, type, listener, capture) {
78034             var typeOnce = type + '.once';
78035             function one() {
78036                 target.on(typeOnce, null);
78037                 listener.apply(this, arguments);
78038             }
78039             target.on(typeOnce, one, capture);
78040             return this;
78041         }
78042
78043         // constants
78044         var TILESIZE = 256;
78045         var kMin = geoZoomToScale(2, TILESIZE);
78046         var kMax = geoZoomToScale(24, TILESIZE);
78047
78048         function clamp(num, min, max) {
78049             return Math.max(min, Math.min(num, max));
78050         }
78051
78052
78053         function rendererMap(context) {
78054             var dispatch$1 = dispatch('move', 'drawn');
78055             var projection = context.projection;
78056             var curtainProjection = context.curtainProjection;
78057             var drawLayers = svgLayers(projection, context);
78058             var drawPoints = svgPoints(projection, context);
78059             var drawVertices = svgVertices(projection, context);
78060             var drawLines = svgLines(projection, context);
78061             var drawAreas = svgAreas(projection, context);
78062             var drawMidpoints = svgMidpoints(projection, context);
78063             var drawLabels = svgLabels(projection, context);
78064
78065             var _selection = d3_select(null);
78066             var supersurface = d3_select(null);
78067             var wrapper = d3_select(null);
78068             var surface = d3_select(null);
78069
78070             var _dimensions = [1, 1];
78071             var _dblClickEnabled = true;
78072             var _redrawEnabled = true;
78073             var _gestureTransformStart;
78074             var _transformStart = projection.transform();
78075             var _transformLast;
78076             var _isTransformed = false;
78077             var _minzoom = 0;
78078             var _getMouseCoords;
78079             var _mouseEvent;
78080
78081             var zoom = d3_zoom()
78082                 .scaleExtent([kMin, kMax])
78083                 .interpolate(d3_interpolate)
78084                 .filter(zoomEventFilter)
78085                 .on('zoom', zoomPan);
78086
78087             var scheduleRedraw = throttle(redraw, 750);
78088             // var isRedrawScheduled = false;
78089             // var pendingRedrawCall;
78090             // function scheduleRedraw() {
78091             //     // Only schedule the redraw if one has not already been set.
78092             //     if (isRedrawScheduled) return;
78093             //     isRedrawScheduled = true;
78094             //     var that = this;
78095             //     var args = arguments;
78096             //     pendingRedrawCall = window.requestIdleCallback(function () {
78097             //         // Reset the boolean so future redraws can be set.
78098             //         isRedrawScheduled = false;
78099             //         redraw.apply(that, args);
78100             //     }, { timeout: 1400 });
78101             // }
78102
78103             function cancelPendingRedraw() {
78104                 scheduleRedraw.cancel();
78105                 // isRedrawScheduled = false;
78106                 // window.cancelIdleCallback(pendingRedrawCall);
78107             }
78108
78109
78110             function map(selection) {
78111                 _selection = selection;
78112
78113                 context
78114                     .on('change.map', immediateRedraw);
78115
78116                 var osm = context.connection();
78117                 if (osm) {
78118                     osm.on('change.map', immediateRedraw);
78119                 }
78120
78121                 function didUndoOrRedo(targetTransform) {
78122                     var mode = context.mode().id;
78123                     if (mode !== 'browse' && mode !== 'select') return;
78124                     if (targetTransform) {
78125                         map.transformEase(targetTransform);
78126                     }
78127                 }
78128
78129                 context.history()
78130                     .on('merge.map', function() { scheduleRedraw(); })
78131                     .on('change.map', immediateRedraw)
78132                     .on('undone.map', function(stack, fromStack) {
78133                         didUndoOrRedo(fromStack.transform);
78134                     })
78135                     .on('redone.map', function(stack) {
78136                         didUndoOrRedo(stack.transform);
78137                     });
78138
78139                 context.background()
78140                     .on('change.map', immediateRedraw);
78141
78142                 context.features()
78143                     .on('redraw.map', immediateRedraw);
78144
78145                 drawLayers
78146                     .on('change.map', function() {
78147                         context.background().updateImagery();
78148                         immediateRedraw();
78149                     });
78150
78151                 selection
78152                     .on('dblclick.map', dblClick)
78153                     .call(zoom)
78154                     .call(zoom.transform, projection.transform());
78155
78156                 supersurface = selection.append('div')
78157                     .attr('id', 'supersurface')
78158                     .call(utilSetTransform, 0, 0);
78159
78160                 // Need a wrapper div because Opera can't cope with an absolutely positioned
78161                 // SVG element: http://bl.ocks.org/jfirebaugh/6fbfbd922552bf776c16
78162                 wrapper = supersurface
78163                     .append('div')
78164                     .attr('class', 'layer layer-data');
78165
78166                 map.surface = surface = wrapper
78167                     .call(drawLayers)
78168                     .selectAll('.surface')
78169                     .attr('id', 'surface');
78170
78171                 surface
78172                     .call(drawLabels.observe)
78173                     .on('gesturestart.surface', function() {
78174                         _gestureTransformStart = projection.transform();
78175                     })
78176                     .on('gesturechange.surface', gestureChange)
78177                     .on('mousedown.zoom', function() {
78178                         if (event.button === 2) {
78179                             event.stopPropagation();
78180                         }
78181                     }, true)
78182                     .on('mouseup.zoom', function() {
78183                         if (resetTransform()) {
78184                             immediateRedraw();
78185                         }
78186                     })
78187                     .on('mousemove.map', function() {
78188                         _mouseEvent = event;
78189                     })
78190                     .on('mouseover.vertices', function() {
78191                         if (map.editable() && !_isTransformed) {
78192                             var hover = event.target.__data__;
78193                             surface.call(drawVertices.drawHover, context.graph(), hover, map.extent());
78194                             dispatch$1.call('drawn', this, { full: false });
78195                         }
78196                     })
78197                     .on('mouseout.vertices', function() {
78198                         if (map.editable() && !_isTransformed) {
78199                             var hover = event.relatedTarget && event.relatedTarget.__data__;
78200                             surface.call(drawVertices.drawHover, context.graph(), hover, map.extent());
78201                             dispatch$1.call('drawn', this, { full: false });
78202                         }
78203                     });
78204
78205                 context.on('enter.map',  function() {
78206                     if (map.editable() && !_isTransformed) {
78207                         // redraw immediately any objects affected by a change in selectedIDs.
78208                         var graph = context.graph();
78209                         var selectedAndParents = {};
78210                         context.selectedIDs().forEach(function(id) {
78211                             var entity = graph.hasEntity(id);
78212                             if (entity) {
78213                                 selectedAndParents[entity.id] = entity;
78214                                 if (entity.type === 'node') {
78215                                     graph.parentWays(entity).forEach(function(parent) {
78216                                         selectedAndParents[parent.id] = parent;
78217                                     });
78218                                 }
78219                             }
78220                         });
78221                         var data = Object.values(selectedAndParents);
78222                         var filter = function(d) { return d.id in selectedAndParents; };
78223
78224                         data = context.features().filter(data, graph);
78225
78226                         surface
78227                             .call(drawVertices.drawSelected, graph, map.extent())
78228                             .call(drawLines, graph, data, filter)
78229                             .call(drawAreas, graph, data, filter)
78230                             .call(drawMidpoints, graph, data, filter, map.trimmedExtent());
78231
78232                         dispatch$1.call('drawn', this, { full: false });
78233
78234                         // redraw everything else later
78235                         scheduleRedraw();
78236                     }
78237                 });
78238
78239                 map.dimensions(utilGetDimensions(selection));
78240             }
78241
78242
78243             function zoomEventFilter() {
78244                 // Fix for #2151, (see also d3/d3-zoom#60, d3/d3-brush#18)
78245                 // Intercept `mousedown` and check if there is an orphaned zoom gesture.
78246                 // This can happen if a previous `mousedown` occurred without a `mouseup`.
78247                 // If we detect this, dispatch `mouseup` to complete the orphaned gesture,
78248                 // so that d3-zoom won't stop propagation of new `mousedown` events.
78249                 if (event.type === 'mousedown') {
78250                     var hasOrphan = false;
78251                     var listeners = window.__on;
78252                     for (var i = 0; i < listeners.length; i++) {
78253                         var listener = listeners[i];
78254                         if (listener.name === 'zoom' && listener.type === 'mouseup') {
78255                             hasOrphan = true;
78256                             break;
78257                         }
78258                     }
78259                     if (hasOrphan) {
78260                         var event$1 = window.CustomEvent;
78261                         if (event$1) {
78262                             event$1 = new event$1('mouseup');
78263                         } else {
78264                             event$1 = window.document.createEvent('Event');
78265                             event$1.initEvent('mouseup', false, false);
78266                         }
78267                         // Event needs to be dispatched with an event.view property.
78268                         event$1.view = window;
78269                         window.dispatchEvent(event$1);
78270                     }
78271                 }
78272
78273                 return event.button !== 2;   // ignore right clicks
78274             }
78275
78276
78277             function pxCenter() {
78278                 return [_dimensions[0] / 2, _dimensions[1] / 2];
78279             }
78280
78281
78282             function drawEditable(difference, extent) {
78283                 var mode = context.mode();
78284                 var graph = context.graph();
78285                 var features = context.features();
78286                 var all = context.intersects(map.extent());
78287                 var fullRedraw = false;
78288                 var data;
78289                 var set;
78290                 var filter;
78291
78292                 if (difference) {
78293                     var complete = difference.complete(map.extent());
78294                     data = Object.values(complete).filter(Boolean);
78295                     set = new Set(data.map(function(entity) { return entity.id; }));
78296                     filter = function(d) { return set.has(d.id); };
78297                     features.clear(data);
78298
78299                 } else {
78300                     // force a full redraw if gatherStats detects that a feature
78301                     // should be auto-hidden (e.g. points or buildings)..
78302                     if (features.gatherStats(all, graph, _dimensions)) {
78303                         extent = undefined;
78304                     }
78305
78306                     if (extent) {
78307                         data = context.intersects(map.extent().intersection(extent));
78308                         set = new Set(data.map(function(entity) { return entity.id; }));
78309                         filter = function(d) { return set.has(d.id); };
78310
78311                     } else {
78312                         data = all;
78313                         fullRedraw = true;
78314                         filter = utilFunctor(true);
78315                     }
78316                 }
78317
78318                 data = features.filter(data, graph);
78319
78320                 if (mode && mode.id === 'select') {
78321                     // update selected vertices - the user might have just double-clicked a way,
78322                     // creating a new vertex, triggering a partial redraw without a mode change
78323                     surface.call(drawVertices.drawSelected, graph, map.extent());
78324                 }
78325
78326                 surface
78327                     .call(drawVertices, graph, data, filter, map.extent(), fullRedraw)
78328                     .call(drawLines, graph, data, filter)
78329                     .call(drawAreas, graph, data, filter)
78330                     .call(drawMidpoints, graph, data, filter, map.trimmedExtent())
78331                     .call(drawLabels, graph, data, filter, _dimensions, fullRedraw)
78332                     .call(drawPoints, graph, data, filter);
78333
78334                 dispatch$1.call('drawn', this, {full: true});
78335             }
78336
78337
78338             function editOff() {
78339                 context.features().resetStats();
78340                 surface.selectAll('.layer-osm *').remove();
78341                 surface.selectAll('.layer-touch:not(.markers) *').remove();
78342
78343                 var allowed = {
78344                     'browse': true,
78345                     'save': true,
78346                     'select-note': true,
78347                     'select-data': true,
78348                     'select-error': true
78349                 };
78350
78351                 var mode = context.mode();
78352                 if (mode && !allowed[mode.id]) {
78353                     context.enter(modeBrowse(context));
78354                 }
78355
78356                 dispatch$1.call('drawn', this, {full: true});
78357             }
78358
78359
78360             function dblClick() {
78361                 if (!_dblClickEnabled) {
78362                     event.preventDefault();
78363                     event.stopImmediatePropagation();
78364                 }
78365             }
78366
78367
78368             function gestureChange() {
78369                 // Remap Safari gesture events to wheel events - #5492
78370                 // We want these disabled most places, but enabled for zoom/unzoom on map surface
78371                 // https://developer.mozilla.org/en-US/docs/Web/API/GestureEvent
78372                 var e = event;
78373                 e.preventDefault();
78374
78375                 var props = {
78376                     deltaMode: 0,    // dummy values to ignore in zoomPan
78377                     deltaY: 1,       // dummy values to ignore in zoomPan
78378                     clientX: e.clientX,
78379                     clientY: e.clientY,
78380                     screenX: e.screenX,
78381                     screenY: e.screenY,
78382                     x: e.x,
78383                     y: e.y
78384                 };
78385
78386                 var e2 = new WheelEvent('wheel', props);
78387                 e2._scale = e.scale;         // preserve the original scale
78388                 e2._rotation = e.rotation;   // preserve the original rotation
78389
78390                 _selection.node().dispatchEvent(e2);
78391             }
78392
78393
78394             function zoomPan(manualEvent) {
78395                 var event$1 = (manualEvent || event);
78396                 var source = event$1.sourceEvent;
78397                 var eventTransform = event$1.transform;
78398                 var x = eventTransform.x;
78399                 var y = eventTransform.y;
78400                 var k = eventTransform.k;
78401
78402                 if (_transformStart.x === x &&
78403                     _transformStart.y === y &&
78404                     _transformStart.k === k) {
78405                     return;  // no change
78406                 }
78407
78408                 // Special handling of 'wheel' events:
78409                 // They might be triggered by the user scrolling the mouse wheel,
78410                 // or 2-finger pinch/zoom gestures, the transform may need adjustment.
78411                 if (source && source.type === 'wheel') {
78412                     var detected = utilDetect();
78413                     var dX = source.deltaX;
78414                     var dY = source.deltaY;
78415                     var x2 = x;
78416                     var y2 = y;
78417                     var k2 = k;
78418                     var t0, p0, p1;
78419
78420                     // Normalize mousewheel scroll speed (Firefox) - #3029
78421                     // If wheel delta is provided in LINE units, recalculate it in PIXEL units
78422                     // We are essentially redoing the calculations that occur here:
78423                     //   https://github.com/d3/d3-zoom/blob/78563a8348aa4133b07cac92e2595c2227ca7cd7/src/zoom.js#L203
78424                     // See this for more info:
78425                     //   https://github.com/basilfx/normalize-wheel/blob/master/src/normalizeWheel.js
78426                     if (source.deltaMode === 1 /* LINE */) {
78427                         // Convert from lines to pixels, more if the user is scrolling fast.
78428                         // (I made up the exp function to roughly match Firefox to what Chrome does)
78429                         // These numbers should be floats, because integers are treated as pan gesture below.
78430                         var lines = Math.abs(source.deltaY);
78431                         var sign = (source.deltaY > 0) ? 1 : -1;
78432                         dY = sign * clamp(
78433                             Math.exp((lines - 1) * 0.75) * 4.000244140625,
78434                             4.000244140625,    // min
78435                             350.000244140625   // max
78436                         );
78437
78438                         // On Firefox Windows and Linux we always get +/- the scroll line amount (default 3)
78439                         // There doesn't seem to be any scroll accelleration.
78440                         // This multiplier increases the speed a little bit - #5512
78441                         if (detected.os !== 'mac') {
78442                             dY *= 5;
78443                         }
78444
78445                         // recalculate x2,y2,k2
78446                         t0 = _isTransformed ? _transformLast : _transformStart;
78447                         p0 = _getMouseCoords(source);
78448                         p1 = t0.invert(p0);
78449                         k2 = t0.k * Math.pow(2, -dY / 500);
78450                         x2 = p0[0] - p1[0] * k2;
78451                         y2 = p0[1] - p1[1] * k2;
78452
78453                     // 2 finger map pinch zooming (Safari) - #5492
78454                     // These are fake `wheel` events we made from Safari `gesturechange` events..
78455                     } else if (source._scale) {
78456                         // recalculate x2,y2,k2
78457                         t0 = _gestureTransformStart;
78458                         p0 = _getMouseCoords(source);
78459                         p1 = t0.invert(p0);
78460                         k2 = t0.k * source._scale;
78461                         x2 = p0[0] - p1[0] * k2;
78462                         y2 = p0[1] - p1[1] * k2;
78463
78464                     // 2 finger map pinch zooming (all browsers except Safari) - #5492
78465                     // Pinch zooming via the `wheel` event will always have:
78466                     // - `ctrlKey = true`
78467                     // - `deltaY` is not round integer pixels (ignore `deltaX`)
78468                     } else if (source.ctrlKey && !isInteger(dY)) {
78469                         dY *= 6;   // slightly scale up whatever the browser gave us
78470
78471                         // recalculate x2,y2,k2
78472                         t0 = _isTransformed ? _transformLast : _transformStart;
78473                         p0 = _getMouseCoords(source);
78474                         p1 = t0.invert(p0);
78475                         k2 = t0.k * Math.pow(2, -dY / 500);
78476                         x2 = p0[0] - p1[0] * k2;
78477                         y2 = p0[1] - p1[1] * k2;
78478
78479                     // Trackpad scroll zooming with shift or alt/option key down
78480                     } else if ((source.altKey || source.shiftKey) && isInteger(dY)) {
78481                         // recalculate x2,y2,k2
78482                         t0 = _isTransformed ? _transformLast : _transformStart;
78483                         p0 = _getMouseCoords(source);
78484                         p1 = t0.invert(p0);
78485                         k2 = t0.k * Math.pow(2, -dY / 500);
78486                         x2 = p0[0] - p1[0] * k2;
78487                         y2 = p0[1] - p1[1] * k2;
78488
78489                     // 2 finger map panning (Mac only, all browsers) - #5492, #5512
78490                     // Panning via the `wheel` event will always have:
78491                     // - `ctrlKey = false`
78492                     // - `deltaX`,`deltaY` are round integer pixels
78493                     } else if (detected.os === 'mac' && !source.ctrlKey && isInteger(dX) && isInteger(dY)) {
78494                         p1 = projection.translate();
78495                         x2 = p1[0] - dX;
78496                         y2 = p1[1] - dY;
78497                         k2 = projection.scale();
78498                     }
78499
78500                     // something changed - replace the event transform
78501                     if (x2 !== x || y2 !== y || k2 !== k) {
78502                         x = x2;
78503                         y = y2;
78504                         k = k2;
78505                         eventTransform = identity$8.translate(x2, y2).scale(k2);
78506                         _selection.node().__zoom = eventTransform;
78507                     }
78508
78509                 }
78510
78511                 if (geoScaleToZoom(k, TILESIZE) < _minzoom) {
78512                     surface.interrupt();
78513                     uiFlash().text(t('cannot_zoom'))();
78514                     setCenterZoom(map.center(), context.minEditableZoom(), 0, true);
78515                     scheduleRedraw();
78516                     dispatch$1.call('move', this, map);
78517                     return;
78518                 }
78519
78520                 projection.transform(eventTransform);
78521
78522                 var scale = k / _transformStart.k;
78523                 var tX = (x / scale - _transformStart.x) * scale;
78524                 var tY = (y / scale - _transformStart.y) * scale;
78525
78526                 if (context.inIntro()) {
78527                     curtainProjection.transform({
78528                         x: x - tX,
78529                         y: y - tY,
78530                         k: k
78531                     });
78532                 }
78533
78534                 if (source) {
78535                     _mouseEvent = event$1;
78536                 }
78537                 _isTransformed = true;
78538                 _transformLast = eventTransform;
78539                 utilSetTransform(supersurface, tX, tY, scale);
78540                 scheduleRedraw();
78541
78542                 dispatch$1.call('move', this, map);
78543
78544
78545                 function isInteger(val) {
78546                     return typeof val === 'number' && isFinite(val) && Math.floor(val) === val;
78547                 }
78548             }
78549
78550
78551             function resetTransform() {
78552                 if (!_isTransformed) return false;
78553
78554                 // deprecation warning - Radial Menu to be removed in iD v3
78555                 surface.selectAll('.edit-menu, .radial-menu').interrupt().remove();
78556                 utilSetTransform(supersurface, 0, 0);
78557                 _isTransformed = false;
78558                 if (context.inIntro()) {
78559                     curtainProjection.transform(projection.transform());
78560                 }
78561                 return true;
78562             }
78563
78564
78565             function redraw(difference, extent) {
78566                 if (surface.empty() || !_redrawEnabled) return;
78567
78568                 // If we are in the middle of a zoom/pan, we can't do differenced redraws.
78569                 // It would result in artifacts where differenced entities are redrawn with
78570                 // one transform and unchanged entities with another.
78571                 if (resetTransform()) {
78572                     difference = extent = undefined;
78573                 }
78574
78575                 var zoom = map.zoom();
78576                 var z = String(~~zoom);
78577
78578                 if (surface.attr('data-zoom') !== z) {
78579                     surface.attr('data-zoom', z);
78580                 }
78581
78582                 // class surface as `lowzoom` around z17-z18.5 (based on latitude)
78583                 var lat = map.center()[1];
78584                 var lowzoom = linear$2()
78585                     .domain([-60, 0, 60])
78586                     .range([17, 18.5, 17])
78587                     .clamp(true);
78588
78589                 surface
78590                     .classed('low-zoom', zoom <= lowzoom(lat));
78591
78592
78593                 if (!difference) {
78594                     supersurface.call(context.background());
78595                     wrapper.call(drawLayers);
78596                 }
78597
78598                 // OSM
78599                 if (map.editable()) {
78600                     context.loadTiles(projection);
78601                     drawEditable(difference, extent);
78602                 } else {
78603                     editOff();
78604                 }
78605
78606                 _transformStart = projection.transform();
78607
78608                 return map;
78609             }
78610
78611
78612
78613             var immediateRedraw = function(difference, extent) {
78614                 if (!difference && !extent) cancelPendingRedraw();
78615                 redraw(difference, extent);
78616             };
78617
78618
78619             map.mouse = function() {
78620                 var event$1 = _mouseEvent || event;
78621                 if (event$1) {
78622                     var s;
78623                     while ((s = event$1.sourceEvent)) { event$1 = s; }
78624                     return _getMouseCoords(event$1);
78625                 }
78626                 return null;
78627             };
78628
78629
78630             // returns Lng/Lat
78631             map.mouseCoordinates = function() {
78632                 var coord = map.mouse() || pxCenter();
78633                 return projection.invert(coord);
78634             };
78635
78636
78637             map.dblclickEnable = function(val) {
78638                 if (!arguments.length) return _dblClickEnabled;
78639                 _dblClickEnabled = val;
78640                 return map;
78641             };
78642
78643
78644             map.redrawEnable = function(val) {
78645                 if (!arguments.length) return _redrawEnabled;
78646                 _redrawEnabled = val;
78647                 return map;
78648             };
78649
78650
78651             map.isTransformed = function() {
78652                 return _isTransformed;
78653             };
78654
78655
78656             function setTransform(t2, duration, force) {
78657                 var t = projection.transform();
78658                 if (!force && t2.k === t.k && t2.x === t.x && t2.y === t.y) return false;
78659
78660                 if (duration) {
78661                     _selection
78662                         .transition()
78663                         .duration(duration)
78664                         .on('start', function() { map.startEase(); })
78665                         .call(zoom.transform, identity$8.translate(t2.x, t2.y).scale(t2.k));
78666                 } else {
78667                     projection.transform(t2);
78668                     _transformStart = t2;
78669                     _selection.call(zoom.transform, _transformStart);
78670                 }
78671
78672                 return true;
78673             }
78674
78675
78676             function setCenterZoom(loc2, z2, duration, force) {
78677                 var c = map.center();
78678                 var z = map.zoom();
78679                 if (loc2[0] === c[0] && loc2[1] === c[1] && z2 === z && !force) return false;
78680
78681                 var proj = geoRawMercator().transform(projection.transform());  // copy projection
78682
78683                 var k2 = clamp(geoZoomToScale(z2, TILESIZE), kMin, kMax);
78684                 proj.scale(k2);
78685
78686                 var t = proj.translate();
78687                 var point = proj(loc2);
78688
78689                 var center = pxCenter();
78690                 t[0] += center[0] - point[0];
78691                 t[1] += center[1] - point[1];
78692
78693                 return setTransform(identity$8.translate(t[0], t[1]).scale(k2), duration, force);
78694             }
78695
78696
78697             map.pan = function(delta, duration) {
78698                 var t = projection.translate();
78699                 var k = projection.scale();
78700
78701                 t[0] += delta[0];
78702                 t[1] += delta[1];
78703
78704                 if (duration) {
78705                     _selection
78706                         .transition()
78707                         .duration(duration)
78708                         .on('start', function() { map.startEase(); })
78709                         .call(zoom.transform, identity$8.translate(t[0], t[1]).scale(k));
78710                 } else {
78711                     projection.translate(t);
78712                     _transformStart = projection.transform();
78713                     _selection.call(zoom.transform, _transformStart);
78714                     dispatch$1.call('move', this, map);
78715                     immediateRedraw();
78716                 }
78717
78718                 return map;
78719             };
78720
78721
78722             map.dimensions = function(val) {
78723                 if (!arguments.length) return _dimensions;
78724
78725                 _dimensions = val;
78726                 drawLayers.dimensions(_dimensions);
78727                 context.background().dimensions(_dimensions);
78728                 projection.clipExtent([[0, 0], _dimensions]);
78729                 _getMouseCoords = utilFastMouse(supersurface.node());
78730
78731                 scheduleRedraw();
78732                 return map;
78733             };
78734
78735
78736             function zoomIn(delta) {
78737                 setCenterZoom(map.center(), ~~map.zoom() + delta, 250, true);
78738             }
78739
78740             function zoomOut(delta) {
78741                 setCenterZoom(map.center(), ~~map.zoom() - delta, 250, true);
78742             }
78743
78744             map.zoomIn = function() { zoomIn(1); };
78745             map.zoomInFurther = function() { zoomIn(4); };
78746
78747             map.zoomOut = function() { zoomOut(1); };
78748             map.zoomOutFurther = function() { zoomOut(4); };
78749
78750
78751             map.center = function(loc2) {
78752                 if (!arguments.length) {
78753                     return projection.invert(pxCenter());
78754                 }
78755
78756                 if (setCenterZoom(loc2, map.zoom())) {
78757                     dispatch$1.call('move', this, map);
78758                 }
78759
78760                 scheduleRedraw();
78761                 return map;
78762             };
78763
78764             map.unobscuredCenterZoomEase = function(loc, zoom) {
78765                 var offset = map.unobscuredOffsetPx();
78766
78767                 var proj = geoRawMercator().transform(projection.transform());  // copy projection
78768                 // use the target zoom to calculate the offset center
78769                 proj.scale(geoZoomToScale(zoom, TILESIZE));
78770                 
78771                 var locPx = proj(loc);
78772                 var offsetLocPx = [locPx[0] + offset[0], locPx[1] + offset[1]];
78773                 var offsetLoc = proj.invert(offsetLocPx);
78774
78775                 map.centerZoomEase(offsetLoc, zoom);
78776             };
78777
78778             map.unobscuredOffsetPx = function() {
78779                 var openPane = d3_select('.map-panes .map-pane.shown');
78780                 if (!openPane.empty()) {
78781                     return [openPane.node().offsetWidth/2, 0];
78782                 }
78783                 return [0, 0];
78784             };
78785
78786             map.zoom = function(z2) {
78787                 if (!arguments.length) {
78788                     return Math.max(geoScaleToZoom(projection.scale(), TILESIZE), 0);
78789                 }
78790
78791                 if (z2 < _minzoom) {
78792                     surface.interrupt();
78793                     uiFlash().text(t('cannot_zoom'))();
78794                     z2 = context.minEditableZoom();
78795                 }
78796
78797                 if (setCenterZoom(map.center(), z2)) {
78798                     dispatch$1.call('move', this, map);
78799                 }
78800
78801                 scheduleRedraw();
78802                 return map;
78803             };
78804
78805
78806             map.centerZoom = function(loc2, z2) {
78807                 if (setCenterZoom(loc2, z2)) {
78808                     dispatch$1.call('move', this, map);
78809                 }
78810
78811                 scheduleRedraw();
78812                 return map;
78813             };
78814
78815
78816             map.zoomTo = function(entity) {
78817                 var extent = entity.extent(context.graph());
78818                 if (!isFinite(extent.area())) return map;
78819
78820                 var z2 = clamp(map.trimmedExtentZoom(extent), context.minEditableZoom(), 20);
78821                 return map.centerZoom(extent.center(), z2);
78822             };
78823
78824
78825             map.centerEase = function(loc2, duration) {
78826                 duration = duration || 250;
78827                 setCenterZoom(loc2, map.zoom(), duration);
78828                 return map;
78829             };
78830
78831
78832             map.zoomEase = function(z2, duration) {
78833                 duration = duration || 250;
78834                 setCenterZoom(map.center(), z2, duration, false);
78835                 return map;
78836             };
78837
78838
78839             map.centerZoomEase = function(loc2, z2, duration) {
78840                 duration = duration || 250;
78841                 setCenterZoom(loc2, z2, duration, false);
78842                 return map;
78843             };
78844
78845
78846             map.transformEase = function(t2, duration) {
78847                 duration = duration || 250;
78848                 setTransform(t2, duration, false);
78849                 return map;
78850             };
78851
78852
78853             map.zoomToEase = function(entity, duration) {
78854                 var extent = entity.extent(context.graph());
78855                 if (!isFinite(extent.area())) return map;
78856
78857                 var z2 = clamp(map.trimmedExtentZoom(extent), context.minEditableZoom(), 20);
78858                 return map.centerZoomEase(extent.center(), z2, duration);
78859             };
78860
78861
78862             map.startEase = function() {
78863                 utilBindOnce(surface, 'mousedown.ease', function() {
78864                     map.cancelEase();
78865                 });
78866                 return map;
78867             };
78868
78869
78870             map.cancelEase = function() {
78871                 _selection.interrupt();
78872                 return map;
78873             };
78874
78875
78876             map.extent = function(val) {
78877                 if (!arguments.length) {
78878                     return new geoExtent(
78879                         projection.invert([0, _dimensions[1]]),
78880                         projection.invert([_dimensions[0], 0])
78881                     );
78882                 } else {
78883                     var extent = geoExtent(val);
78884                     map.centerZoom(extent.center(), map.extentZoom(extent));
78885                 }
78886             };
78887
78888
78889             map.trimmedExtent = function(val) {
78890                 if (!arguments.length) {
78891                     var headerY = 60;
78892                     var footerY = 30;
78893                     var pad = 10;
78894                     return new geoExtent(
78895                         projection.invert([pad, _dimensions[1] - footerY - pad]),
78896                         projection.invert([_dimensions[0] - pad, headerY + pad])
78897                     );
78898                 } else {
78899                     var extent = geoExtent(val);
78900                     map.centerZoom(extent.center(), map.trimmedExtentZoom(extent));
78901                 }
78902             };
78903
78904
78905             function calcExtentZoom(extent, dim) {
78906                 var tl = projection([extent[0][0], extent[1][1]]);
78907                 var br = projection([extent[1][0], extent[0][1]]);
78908
78909                 // Calculate maximum zoom that fits extent
78910                 var hFactor = (br[0] - tl[0]) / dim[0];
78911                 var vFactor = (br[1] - tl[1]) / dim[1];
78912                 var hZoomDiff = Math.log(Math.abs(hFactor)) / Math.LN2;
78913                 var vZoomDiff = Math.log(Math.abs(vFactor)) / Math.LN2;
78914                 var newZoom = map.zoom() - Math.max(hZoomDiff, vZoomDiff);
78915
78916                 return newZoom;
78917             }
78918
78919
78920             map.extentZoom = function(val) {
78921                 return calcExtentZoom(geoExtent(val), _dimensions);
78922             };
78923
78924
78925             map.trimmedExtentZoom = function(val) {
78926                 var trimY = 120;
78927                 var trimX = 40;
78928                 var trimmed = [_dimensions[0] - trimX, _dimensions[1] - trimY];
78929                 return calcExtentZoom(geoExtent(val), trimmed);
78930             };
78931
78932
78933             map.editable = function() {
78934                 var layer = context.layers().layer('osm');
78935                 if (!layer || !layer.enabled()) return false;
78936
78937                 return map.zoom() >= context.minEditableZoom();
78938             };
78939
78940
78941             map.notesEditable = function() {
78942                 var layer = context.layers().layer('notes');
78943                 if (!layer || !layer.enabled()) return false;
78944
78945                 return map.zoom() >= context.minEditableZoom();
78946             };
78947
78948
78949             map.minzoom = function(val) {
78950                 if (!arguments.length) return _minzoom;
78951                 _minzoom = val;
78952                 return map;
78953             };
78954
78955
78956             map.layers = drawLayers;
78957
78958
78959             return utilRebind(map, dispatch$1, 'on');
78960         }
78961
78962         function rendererPhotos(context) {
78963             var dispatch$1 = dispatch('change');
78964             var _layerIDs = ['streetside', 'mapillary', 'mapillary-signs', 'openstreetcam'];
78965             var _allPhotoTypes = ['flat', 'panoramic'];
78966             var _shownPhotoTypes = _allPhotoTypes.slice();   // shallow copy
78967
78968             function photos() {}
78969
78970             function updateStorage() {
78971                 if (window.mocha) return;
78972
78973                 var q = utilStringQs(window.location.hash.substring(1));
78974                 var enabled = context.layers().all().filter(function(d) {
78975                     return _layerIDs.indexOf(d.id) !== -1 && d.layer && d.layer.supported() && d.layer.enabled();
78976                 }).map(function(d) {
78977                     return d.id;
78978                 });
78979                 if (enabled.length) {
78980                     q.photo_overlay = enabled.join(',');
78981                 } else {
78982                     delete q.photo_overlay;
78983                 }
78984                 window.location.replace('#' + utilQsString(q, true));
78985             }
78986
78987             photos.overlayLayerIDs = function() {
78988                 return _layerIDs;
78989             };
78990
78991             photos.allPhotoTypes = function() {
78992                 return _allPhotoTypes;
78993             };
78994
78995             function showsLayer(id) {
78996                 var layer = context.layers().layer(id);
78997                 return layer && layer.supported() && layer.enabled();
78998             }
78999
79000             photos.shouldFilterByPhotoType = function() {
79001                 return showsLayer('mapillary') ||
79002                     (showsLayer('streetside') && showsLayer('openstreetcam'));
79003             };
79004
79005             photos.showsPhotoType = function(val) {
79006                 if (!photos.shouldFilterByPhotoType()) return true;
79007
79008                 return _shownPhotoTypes.indexOf(val) !== -1;
79009             };
79010
79011             photos.showsFlat = function() {
79012                 return photos.showsPhotoType('flat');
79013             };
79014
79015             photos.showsPanoramic = function() {
79016                 return photos.showsPhotoType('panoramic');
79017             };
79018
79019             photos.togglePhotoType = function(val) {
79020                 var index = _shownPhotoTypes.indexOf(val);
79021                 if (index !== -1) {
79022                     _shownPhotoTypes.splice(index, 1);
79023                 } else {
79024                     _shownPhotoTypes.push(val);
79025                 }
79026                 dispatch$1.call('change', this);
79027                 return photos;
79028             };
79029
79030             photos.init = function() {
79031                 var q = utilStringQs(window.location.hash.substring(1));
79032                 if (q.photo_overlay) {
79033                     var hashOverlayIDs = q.photo_overlay.replace(/;/g, ',').split(',');
79034                     hashOverlayIDs.forEach(function(id) {
79035                         var layer = context.layers().layer(id);
79036                         if (layer) layer.enabled(true);
79037                     });
79038                 }
79039
79040                 context.layers().on('change.rendererPhotos', updateStorage);
79041             };
79042
79043             return utilRebind(photos, dispatch$1, 'on');
79044         }
79045
79046         function uiAccount(context) {
79047             var osm = context.connection();
79048
79049
79050             function update(selection) {
79051                 if (!osm) return;
79052
79053                 if (!osm.authenticated()) {
79054                     selection.selectAll('#userLink, #logoutLink')
79055                         .classed('hide', true);
79056                     return;
79057                 }
79058
79059                 osm.userDetails(function(err, details) {
79060                     var userLink = selection.select('#userLink'),
79061                         logoutLink = selection.select('#logoutLink');
79062
79063                     userLink.html('');
79064                     logoutLink.html('');
79065
79066                     if (err) return;
79067
79068                     selection.selectAll('#userLink, #logoutLink')
79069                         .classed('hide', false);
79070
79071                     // Link
79072                     userLink.append('a')
79073                         .attr('href', osm.userURL(details.display_name))
79074                         .attr('target', '_blank');
79075
79076                     // Add thumbnail or dont
79077                     if (details.image_url) {
79078                         userLink.append('img')
79079                             .attr('class', 'icon pre-text user-icon')
79080                             .attr('src', details.image_url);
79081                     } else {
79082                         userLink
79083                             .call(svgIcon('#iD-icon-avatar', 'pre-text light'));
79084                     }
79085
79086                     // Add user name
79087                     userLink.append('span')
79088                         .attr('class', 'label')
79089                         .text(details.display_name);
79090
79091                     logoutLink.append('a')
79092                         .attr('class', 'logout')
79093                         .attr('href', '#')
79094                         .text(t('logout'))
79095                         .on('click.logout', function() {
79096                             event.preventDefault();
79097                             osm.logout();
79098                         });
79099                 });
79100             }
79101
79102
79103             return function(selection) {
79104                 selection.append('li')
79105                     .attr('id', 'logoutLink')
79106                     .classed('hide', true);
79107
79108                 selection.append('li')
79109                     .attr('id', 'userLink')
79110                     .classed('hide', true);
79111
79112                 if (osm) {
79113                     osm.on('change.account', function() { update(selection); });
79114                     update(selection);
79115                 }
79116             };
79117         }
79118
79119         function uiAttribution(context) {
79120             var selection;
79121
79122
79123             function attribution(data, klass) {
79124                 var div = selection.selectAll('.' + klass)
79125                     .data([0]);
79126
79127                 div = div.enter()
79128                     .append('div')
79129                     .attr('class', klass)
79130                     .merge(div);
79131
79132
79133                 var background = div.selectAll('.attribution')
79134                     .data(data, function(d) { return d.name(); });
79135
79136                 background.exit()
79137                     .remove();
79138
79139                 background = background.enter()
79140                     .append('span')
79141                     .attr('class', 'attribution')
79142                     .each(function(d) {
79143                         if (d.terms_html) {
79144                             d3_select(this)
79145                                 .html(d.terms_html);
79146                             return;
79147                         }
79148
79149                         var selection;
79150                         if (d.terms_url) {
79151                             selection = d3_select(this)
79152                                 .append('a')
79153                                 .attr('href', d.terms_url)
79154                                 .attr('target', '_blank');
79155                         } else {
79156                             selection = d3_select(this);
79157                         }
79158
79159
79160                         var id_safe = d.id.replace(/\./g, '<TX_DOT>');
79161                         var terms_text = t('imagery.' + id_safe + '.attribution.text',
79162                             { default: d.terms_text || d.id || d.name() }
79163                         );
79164
79165                         if (d.icon && !d.overlay) {
79166                             selection
79167                                 .append('img')
79168                                 .attr('class', 'source-image')
79169                                 .attr('src', d.icon);
79170                         }
79171
79172                         selection
79173                             .append('span')
79174                             .attr('class', 'attribution-text')
79175                             .text(terms_text);
79176                     })
79177                     .merge(background);
79178
79179
79180                 var copyright = background.selectAll('.copyright-notice')
79181                     .data(function(d) {
79182                         var notice = d.copyrightNotices(context.map().zoom(), context.map().extent());
79183                         return notice ? [notice] : [];
79184                     });
79185
79186                 copyright.exit()
79187                     .remove();
79188
79189                 copyright = copyright.enter()
79190                     .append('span')
79191                     .attr('class', 'copyright-notice')
79192                     .merge(copyright);
79193
79194                 copyright
79195                     .text(String);
79196             }
79197
79198
79199             function update() {
79200                 attribution([context.background().baseLayerSource()], 'base-layer-attribution');
79201                 attribution(context.background().overlayLayerSources().filter(function (s) {
79202                     return s.validZoom(context.map().zoom());
79203                 }), 'overlay-layer-attribution');
79204             }
79205
79206
79207             return function(select) {
79208                 selection = select;
79209
79210                 context.background()
79211                     .on('change.attribution', update);
79212
79213                 context.map()
79214                     .on('move.attribution', throttle(update, 400, {leading: false}));
79215
79216                 update();
79217             };
79218         }
79219
79220         function uiBackgroundDisplayOptions(context) {
79221             var detected = utilDetect();
79222             var storedOpacity = context.storage('background-opacity');
79223             var minVal = 0.25;
79224             var maxVal = detected.cssfilters ? 2 : 1;
79225
79226             var sliders = detected.cssfilters
79227                 ? ['brightness', 'contrast', 'saturation', 'sharpness']
79228                 : ['brightness'];
79229
79230             var _options = {
79231                 brightness: (storedOpacity !== null ? (+storedOpacity) : 1),
79232                 contrast: 1,
79233                 saturation: 1,
79234                 sharpness: 1
79235             };
79236
79237             var _selection = d3_select(null);
79238
79239
79240             function clamp(x, min, max) {
79241                 return Math.max(min, Math.min(x, max));
79242             }
79243
79244
79245             function updateValue(d, val) {
79246                 if (!val && event && event.target) {
79247                     val = event.target.value;
79248                 }
79249
79250                 val = clamp(val, minVal, maxVal);
79251
79252                 _options[d] = val;
79253                 context.background()[d](val);
79254
79255                 if (d === 'brightness') {
79256                     context.storage('background-opacity', val);
79257                 }
79258
79259                 _selection
79260                     .call(render);
79261             }
79262
79263
79264             function render(selection) {
79265                 var container = selection.selectAll('.display-options-container')
79266                     .data([0]);
79267
79268                 var containerEnter = container.enter()
79269                     .append('div')
79270                     .attr('class', 'display-options-container controls-list');
79271
79272                 // add slider controls
79273                 var slidersEnter = containerEnter.selectAll('.display-control')
79274                     .data(sliders)
79275                     .enter()
79276                     .append('div')
79277                     .attr('class', function(d) { return 'display-control display-control-' + d; });
79278
79279                 slidersEnter
79280                     .append('h5')
79281                     .text(function(d) { return t('background.' + d); })
79282                     .append('span')
79283                     .attr('class', function(d) { return 'display-option-value display-option-value-' + d; });
79284
79285                 slidersEnter
79286                     .append('input')
79287                     .attr('class', function(d) { return 'display-option-input display-option-input-' + d; })
79288                     .attr('type', 'range')
79289                     .attr('min', minVal)
79290                     .attr('max', maxVal)
79291                     .attr('step', '0.05')
79292                     .on('input', function(d) {
79293                         var val = d3_select(this).property('value');
79294                         updateValue(d, val);
79295                     });
79296
79297                 slidersEnter
79298                     .append('button')
79299                     .attr('title', t('background.reset'))
79300                     .attr('class', function(d) { return 'display-option-reset display-option-reset-' + d; })
79301                     .on('click', function(d) {
79302                         if (event.button !== 0) return;
79303                         updateValue(d, 1);
79304                     })
79305                     .call(svgIcon('#iD-icon-' + (textDirection === 'rtl' ? 'redo' : 'undo')));
79306
79307                 // reset all button
79308                 containerEnter
79309                     .append('a')
79310                     .attr('class', 'display-option-resetlink')
79311                     .attr('href', '#')
79312                     .text(t('background.reset_all'))
79313                     .on('click', function() {
79314                         for (var i = 0; i < sliders.length; i++) {
79315                             updateValue(sliders[i],1);
79316                         }
79317                     });
79318
79319                 // update
79320                 container = containerEnter
79321                     .merge(container);
79322
79323                 container.selectAll('.display-option-input')
79324                     .property('value', function(d) { return _options[d]; });
79325
79326                 container.selectAll('.display-option-value')
79327                     .text(function(d) { return Math.floor(_options[d] * 100) + '%'; });
79328
79329                 container.selectAll('.display-option-reset')
79330                     .classed('disabled', function(d) { return _options[d] === 1; });
79331
79332                 // first time only, set brightness if needed
79333                 if (containerEnter.size() && _options.brightness !== 1) {
79334                     context.background().brightness(_options.brightness);
79335                 }
79336             }
79337
79338
79339             function backgroundDisplayOptions(selection) {
79340                 _selection = selection;
79341
79342                 selection
79343                     .call(uiDisclosure(context, 'background_display_options', true)
79344                         .title(t('background.display_options'))
79345                         .content(render)
79346                     );
79347             }
79348
79349
79350             return backgroundDisplayOptions;
79351         }
79352
79353         function uiBackgroundOffset(context) {
79354             var directions = [
79355                 ['right', [0.5, 0]],
79356                 ['top', [0, -0.5]],
79357                 ['left', [-0.5, 0]],
79358                 ['bottom', [0, 0.5]]
79359             ];
79360
79361
79362             function d3_eventCancel() {
79363                 event.stopPropagation();
79364                 event.preventDefault();
79365             }
79366
79367
79368             function updateValue() {
79369                 var meters = geoOffsetToMeters(context.background().offset());
79370                 var x = +meters[0].toFixed(2);
79371                 var y = +meters[1].toFixed(2);
79372
79373                 d3_selectAll('.nudge-inner-rect')
79374                     .select('input')
79375                     .classed('error', false)
79376                     .property('value', x + ', ' + y);
79377
79378                 d3_selectAll('.nudge-reset')
79379                     .classed('disabled', function() {
79380                         return (x === 0 && y === 0);
79381                     });
79382             }
79383
79384
79385             function resetOffset() {
79386                 context.background().offset([0, 0]);
79387                 updateValue();
79388             }
79389
79390
79391             function nudge(d) {
79392                 context.background().nudge(d, context.map().zoom());
79393                 updateValue();
79394             }
79395
79396
79397             function clickNudgeButton(d) {
79398                 var interval;
79399                 var timeout = window.setTimeout(function() {
79400                         interval = window.setInterval(nudge.bind(null, d), 100);
79401                     }, 500);
79402
79403                 function doneNudge() {
79404                     window.clearTimeout(timeout);
79405                     window.clearInterval(interval);
79406                     d3_select(window)
79407                         .on('mouseup.buttonoffset', null, true)
79408                         .on('mousedown.buttonoffset', null, true);
79409                 }
79410
79411                 d3_select(window)
79412                     .on('mouseup.buttonoffset', doneNudge, true)
79413                     .on('mousedown.buttonoffset', doneNudge, true);
79414
79415                 nudge(d);
79416             }
79417
79418
79419             function inputOffset() {
79420                 var input = d3_select(this);
79421                 var d = input.node().value;
79422
79423                 if (d === '') return resetOffset();
79424
79425                 d = d.replace(/;/g, ',').split(',').map(function(n) {
79426                     // if n is NaN, it will always get mapped to false.
79427                     return !isNaN(n) && n;
79428                 });
79429
79430                 if (d.length !== 2 || !d[0] || !d[1]) {
79431                     input.classed('error', true);
79432                     return;
79433                 }
79434
79435                 context.background().offset(geoMetersToOffset(d));
79436                 updateValue();
79437             }
79438
79439
79440             function dragOffset() {
79441                 event.preventDefault();
79442                 if (event.button !== 0) return;
79443
79444                 var origin = [event.clientX, event.clientY];
79445
79446                 context.container()
79447                     .append('div')
79448                     .attr('class', 'nudge-surface');
79449
79450                 d3_select(window)
79451                     .on('mousemove.offset', function() {
79452                         var latest = [event.clientX, event.clientY];
79453                         var d = [
79454                             -(origin[0] - latest[0]) / 4,
79455                             -(origin[1] - latest[1]) / 4
79456                         ];
79457
79458                         origin = latest;
79459                         nudge(d);
79460                     })
79461                     .on('mouseup.offset', function() {
79462                         if (event.button !== 0) return;
79463                         d3_selectAll('.nudge-surface')
79464                             .remove();
79465
79466                         d3_select(window)
79467                             .on('mousemove.offset', null)
79468                             .on('mouseup.offset', null);
79469                     });
79470             }
79471
79472
79473             function render(selection) {
79474                 var container = selection.selectAll('.nudge-container')
79475                     .data([0]);
79476
79477                 var containerEnter = container.enter()
79478                     .append('div')
79479                     .attr('class', 'nudge-container cf');
79480
79481                 containerEnter
79482                     .append('div')
79483                     .attr('class', 'nudge-instructions')
79484                     .text(t('background.offset'));
79485
79486                 var nudgeEnter = containerEnter
79487                     .append('div')
79488                     .attr('class', 'nudge-outer-rect')
79489                     .on('mousedown', dragOffset);
79490
79491                 nudgeEnter
79492                     .append('div')
79493                     .attr('class', 'nudge-inner-rect')
79494                     .append('input')
79495                     .on('change', inputOffset);
79496
79497                 containerEnter
79498                     .append('div')
79499                     .selectAll('button')
79500                     .data(directions).enter()
79501                     .append('button')
79502                     .attr('class', function(d) { return d[0] + ' nudge'; })
79503                     .on('contextmenu', d3_eventCancel)
79504                     .on('mousedown', function(d) {
79505                         if (event.button !== 0) return;
79506                         clickNudgeButton(d[1]);
79507                     });
79508
79509                 containerEnter
79510                     .append('button')
79511                     .attr('title', t('background.reset'))
79512                     .attr('class', 'nudge-reset disabled')
79513                     .on('contextmenu', d3_eventCancel)
79514                     .on('click', function() {
79515                         if (event.button !== 0) return;
79516                         resetOffset();
79517                     })
79518                     .call(svgIcon('#iD-icon-' + (textDirection === 'rtl' ? 'redo' : 'undo')));
79519
79520                 updateValue();
79521             }
79522
79523
79524             function backgroundOffset(selection) {
79525                 selection
79526                     .call(uiDisclosure(context, 'background_offset', false)
79527                         .title(t('background.fix_misalignment'))
79528                         .content(render)
79529                     );
79530             }
79531
79532
79533             context.background()
79534                 .on('change.backgroundOffset-update', updateValue);
79535
79536             return backgroundOffset;
79537         }
79538
79539         // import { utilGetDimensions } from '../util/dimensions';
79540
79541
79542         function uiMapInMap(context) {
79543
79544             function mapInMap(selection) {
79545                 var backgroundLayer = rendererTileLayer(context);
79546                 var overlayLayers = {};
79547                 var projection = geoRawMercator();
79548                 var dataLayer = svgData(projection, context).showLabels(false);
79549                 var debugLayer = svgDebug(projection, context);
79550                 var zoom = d3_zoom()
79551                     .scaleExtent([geoZoomToScale(0.5), geoZoomToScale(24)])
79552                     .on('start', zoomStarted)
79553                     .on('zoom', zoomed)
79554                     .on('end', zoomEnded);
79555
79556                 var wrap = d3_select(null);
79557                 var tiles = d3_select(null);
79558                 var viewport = d3_select(null);
79559
79560                 var _isTransformed = false;
79561                 var _isHidden = true;
79562                 var _skipEvents = false;
79563                 var _gesture = null;
79564                 var _zDiff = 6;    // by default, minimap renders at (main zoom - 6)
79565                 var _dMini;        // dimensions of minimap
79566                 var _cMini;        // center pixel of minimap
79567                 var _tStart;       // transform at start of gesture
79568                 var _tCurr;        // transform at most recent event
79569                 var _timeoutID;
79570
79571
79572                 function zoomStarted() {
79573                     if (_skipEvents) return;
79574                     _tStart = _tCurr = projection.transform();
79575                     _gesture = null;
79576                 }
79577
79578
79579                 function zoomed() {
79580                     if (_skipEvents) return;
79581
79582                     var x = event.transform.x;
79583                     var y = event.transform.y;
79584                     var k = event.transform.k;
79585                     var isZooming = (k !== _tStart.k);
79586                     var isPanning = (x !== _tStart.x || y !== _tStart.y);
79587
79588                     if (!isZooming && !isPanning) {
79589                         return;  // no change
79590                     }
79591
79592                     // lock in either zooming or panning, don't allow both in minimap.
79593                     if (!_gesture) {
79594                         _gesture = isZooming ? 'zoom' : 'pan';
79595                     }
79596
79597                     var tMini = projection.transform();
79598                     var tX, tY, scale;
79599
79600                     if (_gesture === 'zoom') {
79601                         scale = k / tMini.k;
79602                         tX = (_cMini[0] / scale - _cMini[0]) * scale;
79603                         tY = (_cMini[1] / scale - _cMini[1]) * scale;
79604                     } else {
79605                         k = tMini.k;
79606                         scale = 1;
79607                         tX = x - tMini.x;
79608                         tY = y - tMini.y;
79609                     }
79610
79611                     utilSetTransform(tiles, tX, tY, scale);
79612                     utilSetTransform(viewport, 0, 0, scale);
79613                     _isTransformed = true;
79614                     _tCurr = identity$8.translate(x, y).scale(k);
79615
79616                     var zMain = geoScaleToZoom(context.projection.scale());
79617                     var zMini = geoScaleToZoom(k);
79618
79619                     _zDiff = zMain - zMini;
79620
79621                     queueRedraw();
79622                 }
79623
79624
79625                 function zoomEnded() {
79626                     if (_skipEvents) return;
79627                     if (_gesture !== 'pan') return;
79628
79629                     updateProjection();
79630                     _gesture = null;
79631                     context.map().center(projection.invert(_cMini));   // recenter main map..
79632                 }
79633
79634
79635                 function updateProjection() {
79636                     var loc = context.map().center();
79637                     var tMain = context.projection.transform();
79638                     var zMain = geoScaleToZoom(tMain.k);
79639                     var zMini = Math.max(zMain - _zDiff, 0.5);
79640                     var kMini = geoZoomToScale(zMini);
79641
79642                     projection
79643                         .translate([tMain.x, tMain.y])
79644                         .scale(kMini);
79645
79646                     var point = projection(loc);
79647                     var mouse = (_gesture === 'pan') ? geoVecSubtract([_tCurr.x, _tCurr.y], [_tStart.x, _tStart.y]) : [0, 0];
79648                     var xMini = _cMini[0] - point[0] + tMain.x + mouse[0];
79649                     var yMini = _cMini[1] - point[1] + tMain.y + mouse[1];
79650
79651                     projection
79652                         .translate([xMini, yMini])
79653                         .clipExtent([[0, 0], _dMini]);
79654
79655                     _tCurr = projection.transform();
79656
79657                     if (_isTransformed) {
79658                         utilSetTransform(tiles, 0, 0);
79659                         utilSetTransform(viewport, 0, 0);
79660                         _isTransformed = false;
79661                     }
79662
79663                     zoom
79664                         .scaleExtent([geoZoomToScale(0.5), geoZoomToScale(zMain - 3)]);
79665
79666                     _skipEvents = true;
79667                     wrap.call(zoom.transform, _tCurr);
79668                     _skipEvents = false;
79669                 }
79670
79671
79672                 function redraw() {
79673                     clearTimeout(_timeoutID);
79674                     if (_isHidden) return;
79675
79676                     updateProjection();
79677                     var zMini = geoScaleToZoom(projection.scale());
79678
79679                     // setup tile container
79680                     tiles = wrap
79681                         .selectAll('.map-in-map-tiles')
79682                         .data([0]);
79683
79684                     tiles = tiles.enter()
79685                         .append('div')
79686                         .attr('class', 'map-in-map-tiles')
79687                         .merge(tiles);
79688
79689                     // redraw background
79690                     backgroundLayer
79691                         .source(context.background().baseLayerSource())
79692                         .projection(projection)
79693                         .dimensions(_dMini);
79694
79695                     var background = tiles
79696                         .selectAll('.map-in-map-background')
79697                         .data([0]);
79698
79699                     background.enter()
79700                         .append('div')
79701                         .attr('class', 'map-in-map-background')
79702                         .merge(background)
79703                         .call(backgroundLayer);
79704
79705
79706                     // redraw overlay
79707                     var overlaySources = context.background().overlayLayerSources();
79708                     var activeOverlayLayers = [];
79709                     for (var i = 0; i < overlaySources.length; i++) {
79710                         if (overlaySources[i].validZoom(zMini)) {
79711                             if (!overlayLayers[i]) overlayLayers[i] = rendererTileLayer(context);
79712                             activeOverlayLayers.push(overlayLayers[i]
79713                                 .source(overlaySources[i])
79714                                 .projection(projection)
79715                                 .dimensions(_dMini));
79716                         }
79717                     }
79718
79719                     var overlay = tiles
79720                         .selectAll('.map-in-map-overlay')
79721                         .data([0]);
79722
79723                     overlay = overlay.enter()
79724                         .append('div')
79725                         .attr('class', 'map-in-map-overlay')
79726                         .merge(overlay);
79727
79728
79729                     var overlays = overlay
79730                         .selectAll('div')
79731                         .data(activeOverlayLayers, function(d) { return d.source().name(); });
79732
79733                     overlays.exit()
79734                         .remove();
79735
79736                     overlays = overlays.enter()
79737                         .append('div')
79738                         .merge(overlays)
79739                         .each(function(layer) { d3_select(this).call(layer); });
79740
79741
79742                     var dataLayers = tiles
79743                         .selectAll('.map-in-map-data')
79744                         .data([0]);
79745
79746                     dataLayers.exit()
79747                         .remove();
79748
79749                     dataLayers = dataLayers.enter()
79750                         .append('svg')
79751                         .attr('class', 'map-in-map-data')
79752                         .merge(dataLayers)
79753                         .call(dataLayer)
79754                         .call(debugLayer);
79755
79756
79757                     // redraw viewport bounding box
79758                     if (_gesture !== 'pan') {
79759                         var getPath = d3_geoPath(projection);
79760                         var bbox = { type: 'Polygon', coordinates: [context.map().extent().polygon()] };
79761
79762                         viewport = wrap.selectAll('.map-in-map-viewport')
79763                             .data([0]);
79764
79765                         viewport = viewport.enter()
79766                             .append('svg')
79767                             .attr('class', 'map-in-map-viewport')
79768                             .merge(viewport);
79769
79770
79771                         var path = viewport.selectAll('.map-in-map-bbox')
79772                             .data([bbox]);
79773
79774                         path.enter()
79775                             .append('path')
79776                             .attr('class', 'map-in-map-bbox')
79777                             .merge(path)
79778                             .attr('d', getPath)
79779                             .classed('thick', function(d) { return getPath.area(d) < 30; });
79780                     }
79781                 }
79782
79783
79784                 function queueRedraw() {
79785                     clearTimeout(_timeoutID);
79786                     _timeoutID = setTimeout(function() { redraw(); }, 750);
79787                 }
79788
79789
79790                 function toggle() {
79791                     if (event) event.preventDefault();
79792
79793                     _isHidden = !_isHidden;
79794
79795                     d3_select('.minimap-toggle-item')
79796                         .classed('active', !_isHidden)
79797                         .select('input')
79798                         .property('checked', !_isHidden);
79799
79800                     if (_isHidden) {
79801                         wrap
79802                             .style('display', 'block')
79803                             .style('opacity', '1')
79804                             .transition()
79805                             .duration(200)
79806                             .style('opacity', '0')
79807                             .on('end', function() {
79808                                 selection.selectAll('.map-in-map')
79809                                     .style('display', 'none');
79810                             });
79811                     } else {
79812                         wrap
79813                             .style('display', 'block')
79814                             .style('opacity', '0')
79815                             .transition()
79816                             .duration(200)
79817                             .style('opacity', '1')
79818                             .on('end', function() {
79819                                 redraw();
79820                             });
79821                     }
79822                 }
79823
79824
79825                 uiMapInMap.toggle = toggle;
79826
79827                 wrap = selection.selectAll('.map-in-map')
79828                     .data([0]);
79829
79830                 wrap = wrap.enter()
79831                     .append('div')
79832                     .attr('class', 'map-in-map')
79833                     .style('display', (_isHidden ? 'none' : 'block'))
79834                     .call(zoom)
79835                     .on('dblclick.zoom', null)
79836                     .merge(wrap);
79837
79838                 // reflow warning: Hardcode dimensions - currently can't resize it anyway..
79839                 _dMini = [200,150]; //utilGetDimensions(wrap);
79840                 _cMini = geoVecScale(_dMini, 0.5);
79841
79842                 context.map()
79843                     .on('drawn.map-in-map', function(drawn) {
79844                         if (drawn.full === true) {
79845                             redraw();
79846                         }
79847                     });
79848
79849                 redraw();
79850
79851                 context.keybinding()
79852                     .on(t('background.minimap.key'), toggle);
79853             }
79854
79855             return mapInMap;
79856         }
79857
79858         function uiConfirm(selection) {
79859             var modalSelection = uiModal(selection);
79860
79861             modalSelection.select('.modal')
79862                 .classed('modal-alert', true);
79863
79864             var section = modalSelection.select('.content');
79865
79866             section.append('div')
79867                 .attr('class', 'modal-section header');
79868
79869             section.append('div')
79870                 .attr('class', 'modal-section message-text');
79871
79872             var buttons = section.append('div')
79873                 .attr('class', 'modal-section buttons cf');
79874
79875
79876             modalSelection.okButton = function() {
79877                 buttons
79878                     .append('button')
79879                     .attr('class', 'button ok-button action')
79880                     .on('click.confirm', function() {
79881                         modalSelection.remove();
79882                     })
79883                     .text(t('confirm.okay'))
79884                     .node()
79885                     .focus();
79886
79887                 return modalSelection;
79888             };
79889
79890
79891             return modalSelection;
79892         }
79893
79894         function uiSettingsCustomBackground(context) {
79895             var dispatch$1 = dispatch('change');
79896
79897             function render(selection) {
79898                 // keep separate copies of original and current settings
79899                 var _origSettings = {
79900                     template: context.storage('background-custom-template')
79901                 };
79902                 var _currSettings = {
79903                     template: context.storage('background-custom-template')
79904                 };
79905
79906                 var example = 'https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png';
79907                 var modal = uiConfirm(selection).okButton();
79908
79909                 modal
79910                     .classed('settings-modal settings-custom-background', true);
79911
79912                 modal.select('.modal-section.header')
79913                     .append('h3')
79914                     .text(t('settings.custom_background.header'));
79915
79916
79917                 var textSection = modal.select('.modal-section.message-text');
79918
79919                 textSection
79920                     .append('pre')
79921                     .attr('class', 'instructions-template')
79922                     .text(t('settings.custom_background.instructions', { example: example }));
79923
79924                 textSection
79925                     .append('textarea')
79926                     .attr('class', 'field-template')
79927                     .attr('placeholder', t('settings.custom_background.template.placeholder'))
79928                     .call(utilNoAuto)
79929                     .property('value', _currSettings.template);
79930
79931
79932                 // insert a cancel button
79933                 var buttonSection = modal.select('.modal-section.buttons');
79934
79935                 buttonSection
79936                     .insert('button', '.ok-button')
79937                     .attr('class', 'button cancel-button secondary-action')
79938                     .text(t('confirm.cancel'));
79939
79940
79941                 buttonSection.select('.cancel-button')
79942                     .on('click.cancel', clickCancel);
79943
79944                 buttonSection.select('.ok-button')
79945                     .attr('disabled', isSaveDisabled)
79946                     .on('click.save', clickSave);
79947
79948
79949                 function isSaveDisabled() {
79950                     return null;
79951                 }
79952
79953
79954                 // restore the original template
79955                 function clickCancel() {
79956                     textSection.select('.field-template').property('value', _origSettings.template);
79957                     context.storage('background-custom-template', _origSettings.template);
79958                     this.blur();
79959                     modal.close();
79960                 }
79961
79962                 // accept the current template
79963                 function clickSave() {
79964                     _currSettings.template = textSection.select('.field-template').property('value');
79965                     context.storage('background-custom-template', _currSettings.template);
79966                     this.blur();
79967                     modal.close();
79968                     dispatch$1.call('change', this, _currSettings);
79969                 }
79970             }
79971
79972             return utilRebind(render, dispatch$1, 'on');
79973         }
79974
79975         function uiBackground(context) {
79976             var key = t('background.key');
79977
79978             var _pane = d3_select(null), _toggleButton = d3_select(null);
79979
79980             var _customSource = context.background().findSource('custom');
79981             var _previousBackground = context.background().findSource(context.storage('background-last-used-toggle'));
79982
79983             var _backgroundList = d3_select(null);
79984             var _overlayList = d3_select(null);
79985             var _displayOptionsContainer = d3_select(null);
79986             var _offsetContainer = d3_select(null);
79987
79988             var backgroundDisplayOptions = uiBackgroundDisplayOptions(context);
79989             var backgroundOffset = uiBackgroundOffset(context);
79990
79991             var settingsCustomBackground = uiSettingsCustomBackground(context)
79992                 .on('change', customChanged);
79993
79994
79995             function setTooltips(selection) {
79996                 selection.each(function(d, i, nodes) {
79997                     var item = d3_select(this).select('label');
79998                     var span = item.select('span');
79999                     var placement = (i < nodes.length / 2) ? 'bottom' : 'top';
80000                     var description = d.description();
80001                     var isOverflowing = (span.property('clientWidth') !== span.property('scrollWidth'));
80002
80003                     item.call(tooltip().destroyAny);
80004
80005                     if (d === _previousBackground) {
80006                         item.call(tooltip()
80007                             .placement(placement)
80008                             .html(true)
80009                             .title(function() {
80010                                 var tip = '<div>' + t('background.switch') + '</div>';
80011                                 return uiTooltipHtml(tip, uiCmd('⌘' + key));
80012                             })
80013                         );
80014                     } else if (description || isOverflowing) {
80015                         item.call(tooltip()
80016                             .placement(placement)
80017                             .title(description || d.name())
80018                         );
80019                     }
80020                 });
80021             }
80022
80023
80024             function updateLayerSelections(selection) {
80025                 function active(d) {
80026                     return context.background().showsLayer(d);
80027                 }
80028
80029                 selection.selectAll('li')
80030                     .classed('active', active)
80031                     .classed('switch', function(d) { return d === _previousBackground; })
80032                     .call(setTooltips)
80033                     .selectAll('input')
80034                     .property('checked', active);
80035             }
80036
80037
80038             function chooseBackground(d) {
80039                 if (d.id === 'custom' && !d.template()) {
80040                     return editCustom();
80041                 }
80042
80043                 event.preventDefault();
80044                 _previousBackground = context.background().baseLayerSource();
80045                 context.storage('background-last-used-toggle', _previousBackground.id);
80046                 context.storage('background-last-used', d.id);
80047                 context.background().baseLayerSource(d);
80048                 _backgroundList.call(updateLayerSelections);
80049                 document.activeElement.blur();
80050             }
80051
80052
80053             function customChanged(d) {
80054                 if (d && d.template) {
80055                     _customSource.template(d.template);
80056                     chooseBackground(_customSource);
80057                 } else {
80058                     _customSource.template('');
80059                     chooseBackground(context.background().findSource('none'));
80060                 }
80061             }
80062
80063
80064             function editCustom() {
80065                 event.preventDefault();
80066                 context.container()
80067                     .call(settingsCustomBackground);
80068             }
80069
80070
80071             function chooseOverlay(d) {
80072                 event.preventDefault();
80073                 context.background().toggleOverlayLayer(d);
80074                 _overlayList.call(updateLayerSelections);
80075                 document.activeElement.blur();
80076             }
80077
80078
80079             function drawListItems(layerList, type, change, filter) {
80080                 var sources = context.background()
80081                     .sources(context.map().extent())
80082                     .filter(filter);
80083
80084                 var layerLinks = layerList.selectAll('li')
80085                     .data(sources, function(d) { return d.name(); });
80086
80087                 layerLinks.exit()
80088                     .remove();
80089
80090                 var enter = layerLinks.enter()
80091                     .append('li')
80092                     .classed('layer-custom', function(d) { return d.id === 'custom'; })
80093                     .classed('best', function(d) { return d.best(); });
80094
80095                 enter.filter(function(d) { return d.id === 'custom'; })
80096                     .append('button')
80097                     .attr('class', 'layer-browse')
80098                     .call(tooltip()
80099                         .title(t('settings.custom_background.tooltip'))
80100                         .placement((textDirection === 'rtl') ? 'right' : 'left')
80101                     )
80102                     .on('click', editCustom)
80103                     .call(svgIcon('#iD-icon-more'));
80104
80105                 enter.filter(function(d) { return d.best(); })
80106                     .append('div')
80107                     .attr('class', 'best')
80108                     .call(tooltip()
80109                         .title(t('background.best_imagery'))
80110                         .placement((textDirection === 'rtl') ? 'right' : 'left')
80111                     )
80112                     .append('span')
80113                     .html('&#9733;');
80114
80115                 var label = enter
80116                     .append('label');
80117
80118                 label
80119                     .append('input')
80120                     .attr('type', type)
80121                     .attr('name', 'layers')
80122                     .on('change', change);
80123
80124                 label
80125                     .append('span')
80126                     .text(function(d) { return d.name(); });
80127
80128
80129                 layerList.selectAll('li')
80130                     .sort(sortSources)
80131                     .style('display', layerList.selectAll('li').data().length > 0 ? 'block' : 'none');
80132
80133                 layerList
80134                     .call(updateLayerSelections);
80135
80136
80137                 function sortSources(a, b) {
80138                     return a.best() && !b.best() ? -1
80139                         : b.best() && !a.best() ? 1
80140                         : d3_descending(a.area(), b.area()) || d3_ascending(a.name(), b.name()) || 0;
80141                 }
80142             }
80143
80144
80145             function renderBackgroundList(selection) {
80146
80147                 // the background list
80148                 var container = selection.selectAll('.layer-background-list')
80149                     .data([0]);
80150
80151                 _backgroundList = container.enter()
80152                     .append('ul')
80153                     .attr('class', 'layer-list layer-background-list')
80154                     .attr('dir', 'auto')
80155                     .merge(container);
80156
80157
80158                 // add minimap toggle below list
80159                 var minimapEnter = selection.selectAll('.minimap-toggle-list')
80160                     .data([0])
80161                     .enter()
80162                     .append('ul')
80163                     .attr('class', 'layer-list minimap-toggle-list')
80164                     .append('li')
80165                     .attr('class', 'minimap-toggle-item');
80166
80167                 var minimapLabelEnter = minimapEnter
80168                     .append('label')
80169                     .call(tooltip()
80170                         .html(true)
80171                         .title(uiTooltipHtml(t('background.minimap.tooltip'), t('background.minimap.key')))
80172                         .placement('top')
80173                     );
80174
80175                 minimapLabelEnter
80176                     .append('input')
80177                     .attr('type', 'checkbox')
80178                     .on('change', function() {
80179                         event.preventDefault();
80180                         uiMapInMap.toggle();
80181                     });
80182
80183                 minimapLabelEnter
80184                     .append('span')
80185                     .text(t('background.minimap.description'));
80186
80187
80188                 // "Info / Report a Problem" link
80189                 selection.selectAll('.imagery-faq')
80190                     .data([0])
80191                     .enter()
80192                     .append('div')
80193                     .attr('class', 'imagery-faq')
80194                     .append('a')
80195                     .attr('target', '_blank')
80196                     .attr('tabindex', -1)
80197                     .call(svgIcon('#iD-icon-out-link', 'inline'))
80198                     .attr('href', 'https://github.com/openstreetmap/iD/blob/master/FAQ.md#how-can-i-report-an-issue-with-background-imagery')
80199                     .append('span')
80200                     .text(t('background.imagery_source_faq'));
80201
80202                 updateBackgroundList();
80203             }
80204
80205
80206             function renderOverlayList(selection) {
80207                 var container = selection.selectAll('.layer-overlay-list')
80208                     .data([0]);
80209
80210                 _overlayList = container.enter()
80211                     .append('ul')
80212                     .attr('class', 'layer-list layer-overlay-list')
80213                     .attr('dir', 'auto')
80214                     .merge(container);
80215
80216                 updateOverlayList();
80217             }
80218
80219             function updateBackgroundList() {
80220                 _backgroundList
80221                     .call(drawListItems, 'radio', chooseBackground, function(d) { return !d.isHidden() && !d.overlay; });
80222             }
80223
80224             function updateOverlayList() {
80225                 _overlayList
80226                     .call(drawListItems, 'checkbox', chooseOverlay, function(d) { return !d.isHidden() && d.overlay; });
80227             }
80228
80229
80230             function update() {
80231                 if (!_pane.select('.disclosure-wrap-background_list').classed('hide')) {
80232                     updateBackgroundList();
80233                 }
80234
80235                 if (!_pane.select('.disclosure-wrap-overlay_list').classed('hide')) {
80236                     updateOverlayList();
80237                 }
80238
80239                 _displayOptionsContainer
80240                     .call(backgroundDisplayOptions);
80241
80242                 _offsetContainer
80243                     .call(backgroundOffset);
80244             }
80245
80246
80247             function quickSwitch() {
80248                 if (event) {
80249                     event.stopImmediatePropagation();
80250                     event.preventDefault();
80251                 }
80252                 if (_previousBackground) {
80253                     chooseBackground(_previousBackground);
80254                 }
80255             }
80256
80257             var paneTooltip = tooltip()
80258                 .placement((textDirection === 'rtl') ? 'right' : 'left')
80259                 .html(true)
80260                 .title(uiTooltipHtml(t('background.description'), key));
80261
80262             uiBackground.togglePane = function() {
80263                 if (event) event.preventDefault();
80264                 paneTooltip.hide(_toggleButton);
80265                 context.ui().togglePanes(!_pane.classed('shown') ? _pane : undefined);
80266             };
80267
80268             function hidePane() {
80269                 context.ui().togglePanes();
80270             }
80271
80272             uiBackground.renderToggleButton = function(selection) {
80273
80274                 _toggleButton = selection
80275                     .append('button')
80276                     .attr('tabindex', -1)
80277                     .on('click', uiBackground.togglePane)
80278                     .call(svgIcon('#iD-icon-layers', 'light'))
80279                     .call(paneTooltip);
80280             };
80281
80282             uiBackground.renderPane = function(selection) {
80283
80284                 _pane = selection
80285                     .append('div')
80286                     .attr('class', 'fillL map-pane background-pane hide')
80287                     .attr('pane', 'background');
80288
80289
80290                 var heading = _pane
80291                     .append('div')
80292                     .attr('class', 'pane-heading');
80293
80294                 heading
80295                     .append('h2')
80296                     .text(t('background.title'));
80297
80298                 heading
80299                     .append('button')
80300                     .on('click', hidePane)
80301                     .call(svgIcon('#iD-icon-close'));
80302
80303
80304                 var content = _pane
80305                     .append('div')
80306                     .attr('class', 'pane-content');
80307
80308                 // background list
80309                 content
80310                     .append('div')
80311                     .attr('class', 'background-background-list-container')
80312                     .call(uiDisclosure(context, 'background_list', true)
80313                         .title(t('background.backgrounds'))
80314                         .content(renderBackgroundList)
80315                     );
80316
80317                 // overlay list
80318                 content
80319                     .append('div')
80320                     .attr('class', 'background-overlay-list-container')
80321                     .call(uiDisclosure(context, 'overlay_list', true)
80322                         .title(t('background.overlays'))
80323                         .content(renderOverlayList)
80324                     );
80325
80326                 // display options
80327                 _displayOptionsContainer = content
80328                     .append('div')
80329                     .attr('class', 'background-display-options');
80330
80331                 // offset controls
80332                 _offsetContainer = content
80333                     .append('div')
80334                     .attr('class', 'background-offset');
80335
80336
80337                 // add listeners
80338                 context.map()
80339                     .on('move.background-update',
80340                         debounce(function() { window.requestIdleCallback(update); }, 1000)
80341                     );
80342
80343
80344                 context.background()
80345                     .on('change.background-update', update);
80346
80347
80348                 update();
80349
80350                 context.keybinding()
80351                     .on(key, uiBackground.togglePane)
80352                     .on(uiCmd('⌘' + key), quickSwitch);
80353             };
80354
80355             return uiBackground;
80356         }
80357
80358         function uiContributors(context) {
80359             var osm = context.connection(),
80360                 debouncedUpdate = debounce(function() { update(); }, 1000),
80361                 limit = 4,
80362                 hidden = false,
80363                 wrap = d3_select(null);
80364
80365
80366             function update() {
80367                 if (!osm) return;
80368
80369                 var users = {},
80370                     entities = context.intersects(context.map().extent());
80371
80372                 entities.forEach(function(entity) {
80373                     if (entity && entity.user) users[entity.user] = true;
80374                 });
80375
80376                 var u = Object.keys(users),
80377                     subset = u.slice(0, u.length > limit ? limit - 1 : limit);
80378
80379                 wrap.html('')
80380                     .call(svgIcon('#iD-icon-nearby', 'pre-text light'));
80381
80382                 var userList = d3_select(document.createElement('span'));
80383
80384                 userList.selectAll()
80385                     .data(subset)
80386                     .enter()
80387                     .append('a')
80388                     .attr('class', 'user-link')
80389                     .attr('href', function(d) { return osm.userURL(d); })
80390                     .attr('target', '_blank')
80391                     .attr('tabindex', -1)
80392                     .text(String);
80393
80394                 if (u.length > limit) {
80395                     var count = d3_select(document.createElement('span'));
80396
80397                     count.append('a')
80398                         .attr('target', '_blank')
80399                         .attr('tabindex', -1)
80400                         .attr('href', function() {
80401                             return osm.changesetsURL(context.map().center(), context.map().zoom());
80402                         })
80403                         .text(u.length - limit + 1);
80404
80405                     wrap.append('span')
80406                         .html(t('contributors.truncated_list', { users: userList.html(), count: count.html() }));
80407
80408                 } else {
80409                     wrap.append('span')
80410                         .html(t('contributors.list', { users: userList.html() }));
80411                 }
80412
80413                 if (!u.length) {
80414                     hidden = true;
80415                     wrap
80416                         .transition()
80417                         .style('opacity', 0);
80418
80419                 } else if (hidden) {
80420                     wrap
80421                         .transition()
80422                         .style('opacity', 1);
80423                 }
80424             }
80425
80426
80427             return function(selection) {
80428                 if (!osm) return;
80429                 wrap = selection;
80430                 update();
80431
80432                 osm.on('loaded.contributors', debouncedUpdate);
80433                 context.map().on('move.contributors', debouncedUpdate);
80434             };
80435         }
80436
80437         function uiFeatureInfo(context) {
80438             function update(selection) {
80439                 var features = context.features();
80440                 var stats = features.stats();
80441                 var count = 0;
80442                 var hiddenList = features.hidden().map(function(k) {
80443                     if (stats[k]) {
80444                         count += stats[k];
80445                         return String(stats[k]) + ' ' + t('feature.' + k + '.description');
80446                     }
80447                 }).filter(Boolean);
80448
80449                 selection.html('');
80450
80451                 if (hiddenList.length) {
80452                     var tooltipBehavior = tooltip()
80453                         .placement('top')
80454                         .html(true)
80455                         .title(function() {
80456                             return uiTooltipHtml(hiddenList.join('<br/>'));
80457                         });
80458
80459                     var warning = selection.append('a')
80460                         .attr('href', '#')
80461                         .attr('tabindex', -1)
80462                         .html(t('feature_info.hidden_warning', { count: count }))
80463                         .call(tooltipBehavior)
80464                         .on('click', function() {
80465                             tooltipBehavior.hide(warning);
80466                             // open map data panel?
80467                             event.preventDefault();
80468                         });
80469                 }
80470
80471                 selection
80472                     .classed('hide', !hiddenList.length);
80473             }
80474
80475
80476             return function(selection) {
80477                 update(selection);
80478
80479                 context.features().on('change.feature_info', function() {
80480                     update(selection);
80481                 });
80482             };
80483         }
80484
80485         function uiFullScreen(context) {
80486             var element = context.container().node();
80487             // var button = d3_select(null);
80488
80489
80490             function getFullScreenFn() {
80491                 if (element.requestFullscreen) {
80492                     return element.requestFullscreen;
80493                 } else if (element.msRequestFullscreen) {
80494                     return element.msRequestFullscreen;
80495                 } else if (element.mozRequestFullScreen) {
80496                     return element.mozRequestFullScreen;
80497                 } else if (element.webkitRequestFullscreen) {
80498                     return element.webkitRequestFullscreen;
80499                 }
80500             }
80501
80502
80503             function getExitFullScreenFn() {
80504                 if (document.exitFullscreen) {
80505                     return document.exitFullscreen;
80506                 } else if (document.msExitFullscreen) {
80507                     return document.msExitFullscreen;
80508                 } else if (document.mozCancelFullScreen) {
80509                     return document.mozCancelFullScreen;
80510                 } else if (document.webkitExitFullscreen) {
80511                     return document.webkitExitFullscreen;
80512                 }
80513             }
80514
80515
80516             function isFullScreen() {
80517                 return document.fullscreenElement ||
80518                     document.mozFullScreenElement ||
80519                     document.webkitFullscreenElement ||
80520                     document.msFullscreenElement;
80521             }
80522
80523
80524             function isSupported() {
80525                 return !!getFullScreenFn();
80526             }
80527
80528
80529             function fullScreen() {
80530                 event.preventDefault();
80531                 if (!isFullScreen()) {
80532                     // button.classed('active', true);
80533                     getFullScreenFn().apply(element);
80534                 } else {
80535                     // button.classed('active', false);
80536                     getExitFullScreenFn().apply(document);
80537                 }
80538             }
80539
80540
80541             return function() { // selection) {
80542                 if (!isSupported()) return;
80543
80544                 // button = selection.append('button')
80545                 //     .attr('title', t('full_screen'))
80546                 //     .attr('tabindex', -1)
80547                 //     .on('click', fullScreen)
80548                 //     .call(tooltip);
80549
80550                 // button.append('span')
80551                 //     .attr('class', 'icon full-screen');
80552
80553                 var detected = utilDetect();
80554                 var keys = (detected.os === 'mac' ? [uiCmd('⌃⌘F'), 'f11'] : ['f11']);
80555                 context.keybinding().on(keys, fullScreen);
80556             };
80557         }
80558
80559         function uiGeolocate(context) {
80560             var geoOptions = { enableHighAccuracy: false, timeout: 6000 /* 6sec */ };
80561             var locating = uiLoading(context).message(t('geolocate.locating')).blocking(true);
80562             var layer = context.layers().layer('geolocate');
80563             var _position;
80564             var _extent;
80565             var _timeoutID;
80566
80567
80568             function click() {
80569                 if (context.inIntro()) return;
80570                 context.enter(modeBrowse(context));
80571                 if (!layer.enabled()) {
80572                     if (!_position) {
80573                         context.container().call(locating);
80574                         navigator.geolocation.getCurrentPosition(success, error, geoOptions);
80575                     } else {
80576                         zoomTo();
80577                     }
80578                 } else {
80579                     layer.enabled(null, false);
80580                 }
80581                 // This timeout ensures that we still call finish() even if
80582                 // the user declines to share their location in Firefox
80583                 _timeoutID = setTimeout(finish, 10000 /* 10sec */ );
80584             }
80585
80586             function zoomTo() {
80587                 var map = context.map();
80588                 layer.enabled(_position, true);
80589                 map.centerZoomEase(_extent.center(), Math.min(20, map.extentZoom(_extent)));
80590             }
80591
80592
80593             function success(geolocation) {
80594                 _position = geolocation;
80595                 var coords = _position.coords;
80596                 _extent = geoExtent([coords.longitude, coords.latitude]).padByMeters(coords.accuracy);
80597                 zoomTo();
80598                 finish();
80599             }
80600
80601
80602             function error() {
80603                 finish();
80604             }
80605
80606
80607             function finish() {
80608                 locating.close();  // unblock ui
80609                 if (_timeoutID) { clearTimeout(_timeoutID); }
80610                 _timeoutID = undefined;
80611             }
80612
80613
80614             return function(selection) {
80615                 if (!navigator.geolocation) return;
80616
80617                 selection
80618                     .append('button')
80619                     .attr('tabindex', -1)
80620                     .attr('title', t('geolocate.title'))
80621                     .on('click', click)
80622                     .call(svgIcon('#iD-icon-geolocate', 'light'))
80623                     .call(tooltip()
80624                         .placement((textDirection === 'rtl') ? 'right' : 'left'));
80625             };
80626         }
80627
80628         var marked = createCommonjsModule(function (module, exports) {
80629         (function(root) {
80630
80631         /**
80632          * Block-Level Grammar
80633          */
80634
80635         var block = {
80636           newline: /^\n+/,
80637           code: /^( {4}[^\n]+\n*)+/,
80638           fences: noop,
80639           hr: /^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,
80640           heading: /^ *(#{1,6}) *([^\n]+?) *(?:#+ *)?(?:\n+|$)/,
80641           nptable: noop,
80642           blockquote: /^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,
80643           list: /^( {0,3})(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,
80644           html: '^ {0,3}(?:' // optional indentation
80645             + '<(script|pre|style)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)' // (1)
80646             + '|comment[^\\n]*(\\n+|$)' // (2)
80647             + '|<\\?[\\s\\S]*?\\?>\\n*' // (3)
80648             + '|<![A-Z][\\s\\S]*?>\\n*' // (4)
80649             + '|<!\\[CDATA\\[[\\s\\S]*?\\]\\]>\\n*' // (5)
80650             + '|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:\\n{2,}|$)' // (6)
80651             + '|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$)' // (7) open tag
80652             + '|</(?!script|pre|style)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$)' // (7) closing tag
80653             + ')',
80654           def: /^ {0,3}\[(label)\]: *\n? *<?([^\s>]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,
80655           table: noop,
80656           lheading: /^([^\n]+)\n {0,3}(=|-){2,} *(?:\n+|$)/,
80657           paragraph: /^([^\n]+(?:\n(?!hr|heading|lheading| {0,3}>|<\/?(?:tag)(?: +|\n|\/?>)|<(?:script|pre|style|!--))[^\n]+)*)/,
80658           text: /^[^\n]+/
80659         };
80660
80661         block._label = /(?!\s*\])(?:\\[\[\]]|[^\[\]])+/;
80662         block._title = /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/;
80663         block.def = edit(block.def)
80664           .replace('label', block._label)
80665           .replace('title', block._title)
80666           .getRegex();
80667
80668         block.bullet = /(?:[*+-]|\d{1,9}\.)/;
80669         block.item = /^( *)(bull) ?[^\n]*(?:\n(?!\1bull ?)[^\n]*)*/;
80670         block.item = edit(block.item, 'gm')
80671           .replace(/bull/g, block.bullet)
80672           .getRegex();
80673
80674         block.list = edit(block.list)
80675           .replace(/bull/g, block.bullet)
80676           .replace('hr', '\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))')
80677           .replace('def', '\\n+(?=' + block.def.source + ')')
80678           .getRegex();
80679
80680         block._tag = 'address|article|aside|base|basefont|blockquote|body|caption'
80681           + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption'
80682           + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe'
80683           + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option'
80684           + '|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr'
80685           + '|track|ul';
80686         block._comment = /<!--(?!-?>)[\s\S]*?-->/;
80687         block.html = edit(block.html, 'i')
80688           .replace('comment', block._comment)
80689           .replace('tag', block._tag)
80690           .replace('attribute', / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/)
80691           .getRegex();
80692
80693         block.paragraph = edit(block.paragraph)
80694           .replace('hr', block.hr)
80695           .replace('heading', block.heading)
80696           .replace('lheading', block.lheading)
80697           .replace('tag', block._tag) // pars can be interrupted by type (6) html blocks
80698           .getRegex();
80699
80700         block.blockquote = edit(block.blockquote)
80701           .replace('paragraph', block.paragraph)
80702           .getRegex();
80703
80704         /**
80705          * Normal Block Grammar
80706          */
80707
80708         block.normal = merge({}, block);
80709
80710         /**
80711          * GFM Block Grammar
80712          */
80713
80714         block.gfm = merge({}, block.normal, {
80715           fences: /^ {0,3}(`{3,}|~{3,})([^`\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?:\n+|$)|$)/,
80716           paragraph: /^/,
80717           heading: /^ *(#{1,6}) +([^\n]+?) *#* *(?:\n+|$)/
80718         });
80719
80720         block.gfm.paragraph = edit(block.paragraph)
80721           .replace('(?!', '(?!'
80722             + block.gfm.fences.source.replace('\\1', '\\2') + '|'
80723             + block.list.source.replace('\\1', '\\3') + '|')
80724           .getRegex();
80725
80726         /**
80727          * GFM + Tables Block Grammar
80728          */
80729
80730         block.tables = merge({}, block.gfm, {
80731           nptable: /^ *([^|\n ].*\|.*)\n *([-:]+ *\|[-| :]*)(?:\n((?:.*[^>\n ].*(?:\n|$))*)\n*|$)/,
80732           table: /^ *\|(.+)\n *\|?( *[-:]+[-| :]*)(?:\n((?: *[^>\n ].*(?:\n|$))*)\n*|$)/
80733         });
80734
80735         /**
80736          * Pedantic grammar
80737          */
80738
80739         block.pedantic = merge({}, block.normal, {
80740           html: edit(
80741             '^ *(?:comment *(?:\\n|\\s*$)'
80742             + '|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)' // closed tag
80743             + '|<tag(?:"[^"]*"|\'[^\']*\'|\\s[^\'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))')
80744             .replace('comment', block._comment)
80745             .replace(/tag/g, '(?!(?:'
80746               + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub'
80747               + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)'
80748               + '\\b)\\w+(?!:|[^\\w\\s@]*@)\\b')
80749             .getRegex(),
80750           def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/
80751         });
80752
80753         /**
80754          * Block Lexer
80755          */
80756
80757         function Lexer(options) {
80758           this.tokens = [];
80759           this.tokens.links = Object.create(null);
80760           this.options = options || marked.defaults;
80761           this.rules = block.normal;
80762
80763           if (this.options.pedantic) {
80764             this.rules = block.pedantic;
80765           } else if (this.options.gfm) {
80766             if (this.options.tables) {
80767               this.rules = block.tables;
80768             } else {
80769               this.rules = block.gfm;
80770             }
80771           }
80772         }
80773
80774         /**
80775          * Expose Block Rules
80776          */
80777
80778         Lexer.rules = block;
80779
80780         /**
80781          * Static Lex Method
80782          */
80783
80784         Lexer.lex = function(src, options) {
80785           var lexer = new Lexer(options);
80786           return lexer.lex(src);
80787         };
80788
80789         /**
80790          * Preprocessing
80791          */
80792
80793         Lexer.prototype.lex = function(src) {
80794           src = src
80795             .replace(/\r\n|\r/g, '\n')
80796             .replace(/\t/g, '    ')
80797             .replace(/\u00a0/g, ' ')
80798             .replace(/\u2424/g, '\n');
80799
80800           return this.token(src, true);
80801         };
80802
80803         /**
80804          * Lexing
80805          */
80806
80807         Lexer.prototype.token = function(src, top) {
80808           src = src.replace(/^ +$/gm, '');
80809           var next,
80810               loose,
80811               cap,
80812               bull,
80813               b,
80814               item,
80815               listStart,
80816               listItems,
80817               t,
80818               space,
80819               i,
80820               tag,
80821               l,
80822               isordered,
80823               istask,
80824               ischecked;
80825
80826           while (src) {
80827             // newline
80828             if (cap = this.rules.newline.exec(src)) {
80829               src = src.substring(cap[0].length);
80830               if (cap[0].length > 1) {
80831                 this.tokens.push({
80832                   type: 'space'
80833                 });
80834               }
80835             }
80836
80837             // code
80838             if (cap = this.rules.code.exec(src)) {
80839               var lastToken = this.tokens[this.tokens.length - 1];
80840               src = src.substring(cap[0].length);
80841               // An indented code block cannot interrupt a paragraph.
80842               if (lastToken && lastToken.type === 'paragraph') {
80843                 lastToken.text += '\n' + cap[0].trimRight();
80844               } else {
80845                 cap = cap[0].replace(/^ {4}/gm, '');
80846                 this.tokens.push({
80847                   type: 'code',
80848                   codeBlockStyle: 'indented',
80849                   text: !this.options.pedantic
80850                     ? rtrim(cap, '\n')
80851                     : cap
80852                 });
80853               }
80854               continue;
80855             }
80856
80857             // fences (gfm)
80858             if (cap = this.rules.fences.exec(src)) {
80859               src = src.substring(cap[0].length);
80860               this.tokens.push({
80861                 type: 'code',
80862                 lang: cap[2] ? cap[2].trim() : cap[2],
80863                 text: cap[3] || ''
80864               });
80865               continue;
80866             }
80867
80868             // heading
80869             if (cap = this.rules.heading.exec(src)) {
80870               src = src.substring(cap[0].length);
80871               this.tokens.push({
80872                 type: 'heading',
80873                 depth: cap[1].length,
80874                 text: cap[2]
80875               });
80876               continue;
80877             }
80878
80879             // table no leading pipe (gfm)
80880             if (cap = this.rules.nptable.exec(src)) {
80881               item = {
80882                 type: 'table',
80883                 header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')),
80884                 align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
80885                 cells: cap[3] ? cap[3].replace(/\n$/, '').split('\n') : []
80886               };
80887
80888               if (item.header.length === item.align.length) {
80889                 src = src.substring(cap[0].length);
80890
80891                 for (i = 0; i < item.align.length; i++) {
80892                   if (/^ *-+: *$/.test(item.align[i])) {
80893                     item.align[i] = 'right';
80894                   } else if (/^ *:-+: *$/.test(item.align[i])) {
80895                     item.align[i] = 'center';
80896                   } else if (/^ *:-+ *$/.test(item.align[i])) {
80897                     item.align[i] = 'left';
80898                   } else {
80899                     item.align[i] = null;
80900                   }
80901                 }
80902
80903                 for (i = 0; i < item.cells.length; i++) {
80904                   item.cells[i] = splitCells(item.cells[i], item.header.length);
80905                 }
80906
80907                 this.tokens.push(item);
80908
80909                 continue;
80910               }
80911             }
80912
80913             // hr
80914             if (cap = this.rules.hr.exec(src)) {
80915               src = src.substring(cap[0].length);
80916               this.tokens.push({
80917                 type: 'hr'
80918               });
80919               continue;
80920             }
80921
80922             // blockquote
80923             if (cap = this.rules.blockquote.exec(src)) {
80924               src = src.substring(cap[0].length);
80925
80926               this.tokens.push({
80927                 type: 'blockquote_start'
80928               });
80929
80930               cap = cap[0].replace(/^ *> ?/gm, '');
80931
80932               // Pass `top` to keep the current
80933               // "toplevel" state. This is exactly
80934               // how markdown.pl works.
80935               this.token(cap, top);
80936
80937               this.tokens.push({
80938                 type: 'blockquote_end'
80939               });
80940
80941               continue;
80942             }
80943
80944             // list
80945             if (cap = this.rules.list.exec(src)) {
80946               src = src.substring(cap[0].length);
80947               bull = cap[2];
80948               isordered = bull.length > 1;
80949
80950               listStart = {
80951                 type: 'list_start',
80952                 ordered: isordered,
80953                 start: isordered ? +bull : '',
80954                 loose: false
80955               };
80956
80957               this.tokens.push(listStart);
80958
80959               // Get each top-level item.
80960               cap = cap[0].match(this.rules.item);
80961
80962               listItems = [];
80963               next = false;
80964               l = cap.length;
80965               i = 0;
80966
80967               for (; i < l; i++) {
80968                 item = cap[i];
80969
80970                 // Remove the list item's bullet
80971                 // so it is seen as the next token.
80972                 space = item.length;
80973                 item = item.replace(/^ *([*+-]|\d+\.) */, '');
80974
80975                 // Outdent whatever the
80976                 // list item contains. Hacky.
80977                 if (~item.indexOf('\n ')) {
80978                   space -= item.length;
80979                   item = !this.options.pedantic
80980                     ? item.replace(new RegExp('^ {1,' + space + '}', 'gm'), '')
80981                     : item.replace(/^ {1,4}/gm, '');
80982                 }
80983
80984                 // Determine whether the next list item belongs here.
80985                 // Backpedal if it does not belong in this list.
80986                 if (i !== l - 1) {
80987                   b = block.bullet.exec(cap[i + 1])[0];
80988                   if (bull.length > 1 ? b.length === 1
80989                     : (b.length > 1 || (this.options.smartLists && b !== bull))) {
80990                     src = cap.slice(i + 1).join('\n') + src;
80991                     i = l - 1;
80992                   }
80993                 }
80994
80995                 // Determine whether item is loose or not.
80996                 // Use: /(^|\n)(?! )[^\n]+\n\n(?!\s*$)/
80997                 // for discount behavior.
80998                 loose = next || /\n\n(?!\s*$)/.test(item);
80999                 if (i !== l - 1) {
81000                   next = item.charAt(item.length - 1) === '\n';
81001                   if (!loose) loose = next;
81002                 }
81003
81004                 if (loose) {
81005                   listStart.loose = true;
81006                 }
81007
81008                 // Check for task list items
81009                 istask = /^\[[ xX]\] /.test(item);
81010                 ischecked = undefined;
81011                 if (istask) {
81012                   ischecked = item[1] !== ' ';
81013                   item = item.replace(/^\[[ xX]\] +/, '');
81014                 }
81015
81016                 t = {
81017                   type: 'list_item_start',
81018                   task: istask,
81019                   checked: ischecked,
81020                   loose: loose
81021                 };
81022
81023                 listItems.push(t);
81024                 this.tokens.push(t);
81025
81026                 // Recurse.
81027                 this.token(item, false);
81028
81029                 this.tokens.push({
81030                   type: 'list_item_end'
81031                 });
81032               }
81033
81034               if (listStart.loose) {
81035                 l = listItems.length;
81036                 i = 0;
81037                 for (; i < l; i++) {
81038                   listItems[i].loose = true;
81039                 }
81040               }
81041
81042               this.tokens.push({
81043                 type: 'list_end'
81044               });
81045
81046               continue;
81047             }
81048
81049             // html
81050             if (cap = this.rules.html.exec(src)) {
81051               src = src.substring(cap[0].length);
81052               this.tokens.push({
81053                 type: this.options.sanitize
81054                   ? 'paragraph'
81055                   : 'html',
81056                 pre: !this.options.sanitizer
81057                   && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'),
81058                 text: cap[0]
81059               });
81060               continue;
81061             }
81062
81063             // def
81064             if (top && (cap = this.rules.def.exec(src))) {
81065               src = src.substring(cap[0].length);
81066               if (cap[3]) cap[3] = cap[3].substring(1, cap[3].length - 1);
81067               tag = cap[1].toLowerCase().replace(/\s+/g, ' ');
81068               if (!this.tokens.links[tag]) {
81069                 this.tokens.links[tag] = {
81070                   href: cap[2],
81071                   title: cap[3]
81072                 };
81073               }
81074               continue;
81075             }
81076
81077             // table (gfm)
81078             if (cap = this.rules.table.exec(src)) {
81079               item = {
81080                 type: 'table',
81081                 header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')),
81082                 align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
81083                 cells: cap[3] ? cap[3].replace(/\n$/, '').split('\n') : []
81084               };
81085
81086               if (item.header.length === item.align.length) {
81087                 src = src.substring(cap[0].length);
81088
81089                 for (i = 0; i < item.align.length; i++) {
81090                   if (/^ *-+: *$/.test(item.align[i])) {
81091                     item.align[i] = 'right';
81092                   } else if (/^ *:-+: *$/.test(item.align[i])) {
81093                     item.align[i] = 'center';
81094                   } else if (/^ *:-+ *$/.test(item.align[i])) {
81095                     item.align[i] = 'left';
81096                   } else {
81097                     item.align[i] = null;
81098                   }
81099                 }
81100
81101                 for (i = 0; i < item.cells.length; i++) {
81102                   item.cells[i] = splitCells(
81103                     item.cells[i].replace(/^ *\| *| *\| *$/g, ''),
81104                     item.header.length);
81105                 }
81106
81107                 this.tokens.push(item);
81108
81109                 continue;
81110               }
81111             }
81112
81113             // lheading
81114             if (cap = this.rules.lheading.exec(src)) {
81115               src = src.substring(cap[0].length);
81116               this.tokens.push({
81117                 type: 'heading',
81118                 depth: cap[2] === '=' ? 1 : 2,
81119                 text: cap[1]
81120               });
81121               continue;
81122             }
81123
81124             // top-level paragraph
81125             if (top && (cap = this.rules.paragraph.exec(src))) {
81126               src = src.substring(cap[0].length);
81127               this.tokens.push({
81128                 type: 'paragraph',
81129                 text: cap[1].charAt(cap[1].length - 1) === '\n'
81130                   ? cap[1].slice(0, -1)
81131                   : cap[1]
81132               });
81133               continue;
81134             }
81135
81136             // text
81137             if (cap = this.rules.text.exec(src)) {
81138               // Top-level should never reach here.
81139               src = src.substring(cap[0].length);
81140               this.tokens.push({
81141                 type: 'text',
81142                 text: cap[0]
81143               });
81144               continue;
81145             }
81146
81147             if (src) {
81148               throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));
81149             }
81150           }
81151
81152           return this.tokens;
81153         };
81154
81155         /**
81156          * Inline-Level Grammar
81157          */
81158
81159         var inline = {
81160           escape: /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,
81161           autolink: /^<(scheme:[^\s\x00-\x1f<>]*|email)>/,
81162           url: noop,
81163           tag: '^comment'
81164             + '|^</[a-zA-Z][\\w:-]*\\s*>' // self-closing tag
81165             + '|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>' // open tag
81166             + '|^<\\?[\\s\\S]*?\\?>' // processing instruction, e.g. <?php ?>
81167             + '|^<![a-zA-Z]+\\s[\\s\\S]*?>' // declaration, e.g. <!DOCTYPE html>
81168             + '|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>', // CDATA section
81169           link: /^!?\[(label)\]\(href(?:\s+(title))?\s*\)/,
81170           reflink: /^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,
81171           nolink: /^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,
81172           strong: /^__([^\s_])__(?!_)|^\*\*([^\s*])\*\*(?!\*)|^__([^\s][\s\S]*?[^\s])__(?!_)|^\*\*([^\s][\s\S]*?[^\s])\*\*(?!\*)/,
81173           em: /^_([^\s_])_(?!_)|^\*([^\s*<\[])\*(?!\*)|^_([^\s<][\s\S]*?[^\s_])_(?!_|[^\spunctuation])|^_([^\s_<][\s\S]*?[^\s])_(?!_|[^\spunctuation])|^\*([^\s<"][\s\S]*?[^\s\*])\*(?!\*|[^\spunctuation])|^\*([^\s*"<\[][\s\S]*?[^\s])\*(?!\*)/,
81174           code: /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,
81175           br: /^( {2,}|\\)\n(?!\s*$)/,
81176           del: noop,
81177           text: /^(`+|[^`])(?:[\s\S]*?(?:(?=[\\<!\[`*]|\b_|$)|[^ ](?= {2,}\n))|(?= {2,}\n))/
81178         };
81179
81180         // list of punctuation marks from common mark spec
81181         // without ` and ] to workaround Rule 17 (inline code blocks/links)
81182         inline._punctuation = '!"#$%&\'()*+,\\-./:;<=>?@\\[^_{|}~';
81183         inline.em = edit(inline.em).replace(/punctuation/g, inline._punctuation).getRegex();
81184
81185         inline._escapes = /\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g;
81186
81187         inline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/;
81188         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])?)+(?![-_])/;
81189         inline.autolink = edit(inline.autolink)
81190           .replace('scheme', inline._scheme)
81191           .replace('email', inline._email)
81192           .getRegex();
81193
81194         inline._attribute = /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/;
81195
81196         inline.tag = edit(inline.tag)
81197           .replace('comment', block._comment)
81198           .replace('attribute', inline._attribute)
81199           .getRegex();
81200
81201         inline._label = /(?:\[[^\[\]]*\]|\\[\[\]]?|`[^`]*`|`(?!`)|[^\[\]\\`])*?/;
81202         inline._href = /\s*(<(?:\\[<>]?|[^\s<>\\])*>|[^\s\x00-\x1f]*)/;
81203         inline._title = /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/;
81204
81205         inline.link = edit(inline.link)
81206           .replace('label', inline._label)
81207           .replace('href', inline._href)
81208           .replace('title', inline._title)
81209           .getRegex();
81210
81211         inline.reflink = edit(inline.reflink)
81212           .replace('label', inline._label)
81213           .getRegex();
81214
81215         /**
81216          * Normal Inline Grammar
81217          */
81218
81219         inline.normal = merge({}, inline);
81220
81221         /**
81222          * Pedantic Inline Grammar
81223          */
81224
81225         inline.pedantic = merge({}, inline.normal, {
81226           strong: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,
81227           em: /^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/,
81228           link: edit(/^!?\[(label)\]\((.*?)\)/)
81229             .replace('label', inline._label)
81230             .getRegex(),
81231           reflink: edit(/^!?\[(label)\]\s*\[([^\]]*)\]/)
81232             .replace('label', inline._label)
81233             .getRegex()
81234         });
81235
81236         /**
81237          * GFM Inline Grammar
81238          */
81239
81240         inline.gfm = merge({}, inline.normal, {
81241           escape: edit(inline.escape).replace('])', '~|])').getRegex(),
81242           _extended_email: /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,
81243           url: /^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,
81244           _backpedal: /(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,
81245           del: /^~+(?=\S)([\s\S]*?\S)~+/,
81246           text: /^(`+|[^`])(?:[\s\S]*?(?:(?=[\\<!\[`*~]|\b_|https?:\/\/|ftp:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@))|(?= {2,}\n|[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@))/
81247         });
81248
81249         inline.gfm.url = edit(inline.gfm.url, 'i')
81250           .replace('email', inline.gfm._extended_email)
81251           .getRegex();
81252         /**
81253          * GFM + Line Breaks Inline Grammar
81254          */
81255
81256         inline.breaks = merge({}, inline.gfm, {
81257           br: edit(inline.br).replace('{2,}', '*').getRegex(),
81258           text: edit(inline.gfm.text)
81259             .replace('\\b_', '\\b_| {2,}\\n')
81260             .replace(/\{2,\}/g, '*')
81261             .getRegex()
81262         });
81263
81264         /**
81265          * Inline Lexer & Compiler
81266          */
81267
81268         function InlineLexer(links, options) {
81269           this.options = options || marked.defaults;
81270           this.links = links;
81271           this.rules = inline.normal;
81272           this.renderer = this.options.renderer || new Renderer();
81273           this.renderer.options = this.options;
81274
81275           if (!this.links) {
81276             throw new Error('Tokens array requires a `links` property.');
81277           }
81278
81279           if (this.options.pedantic) {
81280             this.rules = inline.pedantic;
81281           } else if (this.options.gfm) {
81282             if (this.options.breaks) {
81283               this.rules = inline.breaks;
81284             } else {
81285               this.rules = inline.gfm;
81286             }
81287           }
81288         }
81289
81290         /**
81291          * Expose Inline Rules
81292          */
81293
81294         InlineLexer.rules = inline;
81295
81296         /**
81297          * Static Lexing/Compiling Method
81298          */
81299
81300         InlineLexer.output = function(src, links, options) {
81301           var inline = new InlineLexer(links, options);
81302           return inline.output(src);
81303         };
81304
81305         /**
81306          * Lexing/Compiling
81307          */
81308
81309         InlineLexer.prototype.output = function(src) {
81310           var out = '',
81311               link,
81312               text,
81313               href,
81314               title,
81315               cap,
81316               prevCapZero;
81317
81318           while (src) {
81319             // escape
81320             if (cap = this.rules.escape.exec(src)) {
81321               src = src.substring(cap[0].length);
81322               out += escape(cap[1]);
81323               continue;
81324             }
81325
81326             // tag
81327             if (cap = this.rules.tag.exec(src)) {
81328               if (!this.inLink && /^<a /i.test(cap[0])) {
81329                 this.inLink = true;
81330               } else if (this.inLink && /^<\/a>/i.test(cap[0])) {
81331                 this.inLink = false;
81332               }
81333               if (!this.inRawBlock && /^<(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
81334                 this.inRawBlock = true;
81335               } else if (this.inRawBlock && /^<\/(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
81336                 this.inRawBlock = false;
81337               }
81338
81339               src = src.substring(cap[0].length);
81340               out += this.options.sanitize
81341                 ? this.options.sanitizer
81342                   ? this.options.sanitizer(cap[0])
81343                   : escape(cap[0])
81344                 : cap[0];
81345               continue;
81346             }
81347
81348             // link
81349             if (cap = this.rules.link.exec(src)) {
81350               var lastParenIndex = findClosingBracket(cap[2], '()');
81351               if (lastParenIndex > -1) {
81352                 var linkLen = cap[0].length - (cap[2].length - lastParenIndex) - (cap[3] || '').length;
81353                 cap[2] = cap[2].substring(0, lastParenIndex);
81354                 cap[0] = cap[0].substring(0, linkLen).trim();
81355                 cap[3] = '';
81356               }
81357               src = src.substring(cap[0].length);
81358               this.inLink = true;
81359               href = cap[2];
81360               if (this.options.pedantic) {
81361                 link = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(href);
81362
81363                 if (link) {
81364                   href = link[1];
81365                   title = link[3];
81366                 } else {
81367                   title = '';
81368                 }
81369               } else {
81370                 title = cap[3] ? cap[3].slice(1, -1) : '';
81371               }
81372               href = href.trim().replace(/^<([\s\S]*)>$/, '$1');
81373               out += this.outputLink(cap, {
81374                 href: InlineLexer.escapes(href),
81375                 title: InlineLexer.escapes(title)
81376               });
81377               this.inLink = false;
81378               continue;
81379             }
81380
81381             // reflink, nolink
81382             if ((cap = this.rules.reflink.exec(src))
81383                 || (cap = this.rules.nolink.exec(src))) {
81384               src = src.substring(cap[0].length);
81385               link = (cap[2] || cap[1]).replace(/\s+/g, ' ');
81386               link = this.links[link.toLowerCase()];
81387               if (!link || !link.href) {
81388                 out += cap[0].charAt(0);
81389                 src = cap[0].substring(1) + src;
81390                 continue;
81391               }
81392               this.inLink = true;
81393               out += this.outputLink(cap, link);
81394               this.inLink = false;
81395               continue;
81396             }
81397
81398             // strong
81399             if (cap = this.rules.strong.exec(src)) {
81400               src = src.substring(cap[0].length);
81401               out += this.renderer.strong(this.output(cap[4] || cap[3] || cap[2] || cap[1]));
81402               continue;
81403             }
81404
81405             // em
81406             if (cap = this.rules.em.exec(src)) {
81407               src = src.substring(cap[0].length);
81408               out += this.renderer.em(this.output(cap[6] || cap[5] || cap[4] || cap[3] || cap[2] || cap[1]));
81409               continue;
81410             }
81411
81412             // code
81413             if (cap = this.rules.code.exec(src)) {
81414               src = src.substring(cap[0].length);
81415               out += this.renderer.codespan(escape(cap[2].trim(), true));
81416               continue;
81417             }
81418
81419             // br
81420             if (cap = this.rules.br.exec(src)) {
81421               src = src.substring(cap[0].length);
81422               out += this.renderer.br();
81423               continue;
81424             }
81425
81426             // del (gfm)
81427             if (cap = this.rules.del.exec(src)) {
81428               src = src.substring(cap[0].length);
81429               out += this.renderer.del(this.output(cap[1]));
81430               continue;
81431             }
81432
81433             // autolink
81434             if (cap = this.rules.autolink.exec(src)) {
81435               src = src.substring(cap[0].length);
81436               if (cap[2] === '@') {
81437                 text = escape(this.mangle(cap[1]));
81438                 href = 'mailto:' + text;
81439               } else {
81440                 text = escape(cap[1]);
81441                 href = text;
81442               }
81443               out += this.renderer.link(href, null, text);
81444               continue;
81445             }
81446
81447             // url (gfm)
81448             if (!this.inLink && (cap = this.rules.url.exec(src))) {
81449               if (cap[2] === '@') {
81450                 text = escape(cap[0]);
81451                 href = 'mailto:' + text;
81452               } else {
81453                 // do extended autolink path validation
81454                 do {
81455                   prevCapZero = cap[0];
81456                   cap[0] = this.rules._backpedal.exec(cap[0])[0];
81457                 } while (prevCapZero !== cap[0]);
81458                 text = escape(cap[0]);
81459                 if (cap[1] === 'www.') {
81460                   href = 'http://' + text;
81461                 } else {
81462                   href = text;
81463                 }
81464               }
81465               src = src.substring(cap[0].length);
81466               out += this.renderer.link(href, null, text);
81467               continue;
81468             }
81469
81470             // text
81471             if (cap = this.rules.text.exec(src)) {
81472               src = src.substring(cap[0].length);
81473               if (this.inRawBlock) {
81474                 out += this.renderer.text(cap[0]);
81475               } else {
81476                 out += this.renderer.text(escape(this.smartypants(cap[0])));
81477               }
81478               continue;
81479             }
81480
81481             if (src) {
81482               throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));
81483             }
81484           }
81485
81486           return out;
81487         };
81488
81489         InlineLexer.escapes = function(text) {
81490           return text ? text.replace(InlineLexer.rules._escapes, '$1') : text;
81491         };
81492
81493         /**
81494          * Compile Link
81495          */
81496
81497         InlineLexer.prototype.outputLink = function(cap, link) {
81498           var href = link.href,
81499               title = link.title ? escape(link.title) : null;
81500
81501           return cap[0].charAt(0) !== '!'
81502             ? this.renderer.link(href, title, this.output(cap[1]))
81503             : this.renderer.image(href, title, escape(cap[1]));
81504         };
81505
81506         /**
81507          * Smartypants Transformations
81508          */
81509
81510         InlineLexer.prototype.smartypants = function(text) {
81511           if (!this.options.smartypants) return text;
81512           return text
81513             // em-dashes
81514             .replace(/---/g, '\u2014')
81515             // en-dashes
81516             .replace(/--/g, '\u2013')
81517             // opening singles
81518             .replace(/(^|[-\u2014/(\[{"\s])'/g, '$1\u2018')
81519             // closing singles & apostrophes
81520             .replace(/'/g, '\u2019')
81521             // opening doubles
81522             .replace(/(^|[-\u2014/(\[{\u2018\s])"/g, '$1\u201c')
81523             // closing doubles
81524             .replace(/"/g, '\u201d')
81525             // ellipses
81526             .replace(/\.{3}/g, '\u2026');
81527         };
81528
81529         /**
81530          * Mangle Links
81531          */
81532
81533         InlineLexer.prototype.mangle = function(text) {
81534           if (!this.options.mangle) return text;
81535           var out = '',
81536               l = text.length,
81537               i = 0,
81538               ch;
81539
81540           for (; i < l; i++) {
81541             ch = text.charCodeAt(i);
81542             if (Math.random() > 0.5) {
81543               ch = 'x' + ch.toString(16);
81544             }
81545             out += '&#' + ch + ';';
81546           }
81547
81548           return out;
81549         };
81550
81551         /**
81552          * Renderer
81553          */
81554
81555         function Renderer(options) {
81556           this.options = options || marked.defaults;
81557         }
81558
81559         Renderer.prototype.code = function(code, infostring, escaped) {
81560           var lang = (infostring || '').match(/\S*/)[0];
81561           if (this.options.highlight) {
81562             var out = this.options.highlight(code, lang);
81563             if (out != null && out !== code) {
81564               escaped = true;
81565               code = out;
81566             }
81567           }
81568
81569           if (!lang) {
81570             return '<pre><code>'
81571               + (escaped ? code : escape(code, true))
81572               + '</code></pre>';
81573           }
81574
81575           return '<pre><code class="'
81576             + this.options.langPrefix
81577             + escape(lang, true)
81578             + '">'
81579             + (escaped ? code : escape(code, true))
81580             + '</code></pre>\n';
81581         };
81582
81583         Renderer.prototype.blockquote = function(quote) {
81584           return '<blockquote>\n' + quote + '</blockquote>\n';
81585         };
81586
81587         Renderer.prototype.html = function(html) {
81588           return html;
81589         };
81590
81591         Renderer.prototype.heading = function(text, level, raw, slugger) {
81592           if (this.options.headerIds) {
81593             return '<h'
81594               + level
81595               + ' id="'
81596               + this.options.headerPrefix
81597               + slugger.slug(raw)
81598               + '">'
81599               + text
81600               + '</h'
81601               + level
81602               + '>\n';
81603           }
81604           // ignore IDs
81605           return '<h' + level + '>' + text + '</h' + level + '>\n';
81606         };
81607
81608         Renderer.prototype.hr = function() {
81609           return this.options.xhtml ? '<hr/>\n' : '<hr>\n';
81610         };
81611
81612         Renderer.prototype.list = function(body, ordered, start) {
81613           var type = ordered ? 'ol' : 'ul',
81614               startatt = (ordered && start !== 1) ? (' start="' + start + '"') : '';
81615           return '<' + type + startatt + '>\n' + body + '</' + type + '>\n';
81616         };
81617
81618         Renderer.prototype.listitem = function(text) {
81619           return '<li>' + text + '</li>\n';
81620         };
81621
81622         Renderer.prototype.checkbox = function(checked) {
81623           return '<input '
81624             + (checked ? 'checked="" ' : '')
81625             + 'disabled="" type="checkbox"'
81626             + (this.options.xhtml ? ' /' : '')
81627             + '> ';
81628         };
81629
81630         Renderer.prototype.paragraph = function(text) {
81631           return '<p>' + text + '</p>\n';
81632         };
81633
81634         Renderer.prototype.table = function(header, body) {
81635           if (body) body = '<tbody>' + body + '</tbody>';
81636
81637           return '<table>\n'
81638             + '<thead>\n'
81639             + header
81640             + '</thead>\n'
81641             + body
81642             + '</table>\n';
81643         };
81644
81645         Renderer.prototype.tablerow = function(content) {
81646           return '<tr>\n' + content + '</tr>\n';
81647         };
81648
81649         Renderer.prototype.tablecell = function(content, flags) {
81650           var type = flags.header ? 'th' : 'td';
81651           var tag = flags.align
81652             ? '<' + type + ' align="' + flags.align + '">'
81653             : '<' + type + '>';
81654           return tag + content + '</' + type + '>\n';
81655         };
81656
81657         // span level renderer
81658         Renderer.prototype.strong = function(text) {
81659           return '<strong>' + text + '</strong>';
81660         };
81661
81662         Renderer.prototype.em = function(text) {
81663           return '<em>' + text + '</em>';
81664         };
81665
81666         Renderer.prototype.codespan = function(text) {
81667           return '<code>' + text + '</code>';
81668         };
81669
81670         Renderer.prototype.br = function() {
81671           return this.options.xhtml ? '<br/>' : '<br>';
81672         };
81673
81674         Renderer.prototype.del = function(text) {
81675           return '<del>' + text + '</del>';
81676         };
81677
81678         Renderer.prototype.link = function(href, title, text) {
81679           href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);
81680           if (href === null) {
81681             return text;
81682           }
81683           var out = '<a href="' + escape(href) + '"';
81684           if (title) {
81685             out += ' title="' + title + '"';
81686           }
81687           out += '>' + text + '</a>';
81688           return out;
81689         };
81690
81691         Renderer.prototype.image = function(href, title, text) {
81692           href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);
81693           if (href === null) {
81694             return text;
81695           }
81696
81697           var out = '<img src="' + href + '" alt="' + text + '"';
81698           if (title) {
81699             out += ' title="' + title + '"';
81700           }
81701           out += this.options.xhtml ? '/>' : '>';
81702           return out;
81703         };
81704
81705         Renderer.prototype.text = function(text) {
81706           return text;
81707         };
81708
81709         /**
81710          * TextRenderer
81711          * returns only the textual part of the token
81712          */
81713
81714         function TextRenderer() {}
81715
81716         // no need for block level renderers
81717
81718         TextRenderer.prototype.strong =
81719         TextRenderer.prototype.em =
81720         TextRenderer.prototype.codespan =
81721         TextRenderer.prototype.del =
81722         TextRenderer.prototype.text = function(text) {
81723           return text;
81724         };
81725
81726         TextRenderer.prototype.link =
81727         TextRenderer.prototype.image = function(href, title, text) {
81728           return '' + text;
81729         };
81730
81731         TextRenderer.prototype.br = function() {
81732           return '';
81733         };
81734
81735         /**
81736          * Parsing & Compiling
81737          */
81738
81739         function Parser(options) {
81740           this.tokens = [];
81741           this.token = null;
81742           this.options = options || marked.defaults;
81743           this.options.renderer = this.options.renderer || new Renderer();
81744           this.renderer = this.options.renderer;
81745           this.renderer.options = this.options;
81746           this.slugger = new Slugger();
81747         }
81748
81749         /**
81750          * Static Parse Method
81751          */
81752
81753         Parser.parse = function(src, options) {
81754           var parser = new Parser(options);
81755           return parser.parse(src);
81756         };
81757
81758         /**
81759          * Parse Loop
81760          */
81761
81762         Parser.prototype.parse = function(src) {
81763           this.inline = new InlineLexer(src.links, this.options);
81764           // use an InlineLexer with a TextRenderer to extract pure text
81765           this.inlineText = new InlineLexer(
81766             src.links,
81767             merge({}, this.options, { renderer: new TextRenderer() })
81768           );
81769           this.tokens = src.reverse();
81770
81771           var out = '';
81772           while (this.next()) {
81773             out += this.tok();
81774           }
81775
81776           return out;
81777         };
81778
81779         /**
81780          * Next Token
81781          */
81782
81783         Parser.prototype.next = function() {
81784           this.token = this.tokens.pop();
81785           return this.token;
81786         };
81787
81788         /**
81789          * Preview Next Token
81790          */
81791
81792         Parser.prototype.peek = function() {
81793           return this.tokens[this.tokens.length - 1] || 0;
81794         };
81795
81796         /**
81797          * Parse Text Tokens
81798          */
81799
81800         Parser.prototype.parseText = function() {
81801           var body = this.token.text;
81802
81803           while (this.peek().type === 'text') {
81804             body += '\n' + this.next().text;
81805           }
81806
81807           return this.inline.output(body);
81808         };
81809
81810         /**
81811          * Parse Current Token
81812          */
81813
81814         Parser.prototype.tok = function() {
81815           switch (this.token.type) {
81816             case 'space': {
81817               return '';
81818             }
81819             case 'hr': {
81820               return this.renderer.hr();
81821             }
81822             case 'heading': {
81823               return this.renderer.heading(
81824                 this.inline.output(this.token.text),
81825                 this.token.depth,
81826                 unescape(this.inlineText.output(this.token.text)),
81827                 this.slugger);
81828             }
81829             case 'code': {
81830               return this.renderer.code(this.token.text,
81831                 this.token.lang,
81832                 this.token.escaped);
81833             }
81834             case 'table': {
81835               var header = '',
81836                   body = '',
81837                   i,
81838                   row,
81839                   cell,
81840                   j;
81841
81842               // header
81843               cell = '';
81844               for (i = 0; i < this.token.header.length; i++) {
81845                 cell += this.renderer.tablecell(
81846                   this.inline.output(this.token.header[i]),
81847                   { header: true, align: this.token.align[i] }
81848                 );
81849               }
81850               header += this.renderer.tablerow(cell);
81851
81852               for (i = 0; i < this.token.cells.length; i++) {
81853                 row = this.token.cells[i];
81854
81855                 cell = '';
81856                 for (j = 0; j < row.length; j++) {
81857                   cell += this.renderer.tablecell(
81858                     this.inline.output(row[j]),
81859                     { header: false, align: this.token.align[j] }
81860                   );
81861                 }
81862
81863                 body += this.renderer.tablerow(cell);
81864               }
81865               return this.renderer.table(header, body);
81866             }
81867             case 'blockquote_start': {
81868               body = '';
81869
81870               while (this.next().type !== 'blockquote_end') {
81871                 body += this.tok();
81872               }
81873
81874               return this.renderer.blockquote(body);
81875             }
81876             case 'list_start': {
81877               body = '';
81878               var ordered = this.token.ordered,
81879                   start = this.token.start;
81880
81881               while (this.next().type !== 'list_end') {
81882                 body += this.tok();
81883               }
81884
81885               return this.renderer.list(body, ordered, start);
81886             }
81887             case 'list_item_start': {
81888               body = '';
81889               var loose = this.token.loose;
81890               var checked = this.token.checked;
81891               var task = this.token.task;
81892
81893               if (this.token.task) {
81894                 body += this.renderer.checkbox(checked);
81895               }
81896
81897               while (this.next().type !== 'list_item_end') {
81898                 body += !loose && this.token.type === 'text'
81899                   ? this.parseText()
81900                   : this.tok();
81901               }
81902               return this.renderer.listitem(body, task, checked);
81903             }
81904             case 'html': {
81905               // TODO parse inline content if parameter markdown=1
81906               return this.renderer.html(this.token.text);
81907             }
81908             case 'paragraph': {
81909               return this.renderer.paragraph(this.inline.output(this.token.text));
81910             }
81911             case 'text': {
81912               return this.renderer.paragraph(this.parseText());
81913             }
81914             default: {
81915               var errMsg = 'Token with "' + this.token.type + '" type was not found.';
81916               if (this.options.silent) {
81917                 console.log(errMsg);
81918               } else {
81919                 throw new Error(errMsg);
81920               }
81921             }
81922           }
81923         };
81924
81925         /**
81926          * Slugger generates header id
81927          */
81928
81929         function Slugger() {
81930           this.seen = {};
81931         }
81932
81933         /**
81934          * Convert string to unique id
81935          */
81936
81937         Slugger.prototype.slug = function(value) {
81938           var slug = value
81939             .toLowerCase()
81940             .trim()
81941             .replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g, '')
81942             .replace(/\s/g, '-');
81943
81944           if (this.seen.hasOwnProperty(slug)) {
81945             var originalSlug = slug;
81946             do {
81947               this.seen[originalSlug]++;
81948               slug = originalSlug + '-' + this.seen[originalSlug];
81949             } while (this.seen.hasOwnProperty(slug));
81950           }
81951           this.seen[slug] = 0;
81952
81953           return slug;
81954         };
81955
81956         /**
81957          * Helpers
81958          */
81959
81960         function escape(html, encode) {
81961           if (encode) {
81962             if (escape.escapeTest.test(html)) {
81963               return html.replace(escape.escapeReplace, function(ch) { return escape.replacements[ch]; });
81964             }
81965           } else {
81966             if (escape.escapeTestNoEncode.test(html)) {
81967               return html.replace(escape.escapeReplaceNoEncode, function(ch) { return escape.replacements[ch]; });
81968             }
81969           }
81970
81971           return html;
81972         }
81973
81974         escape.escapeTest = /[&<>"']/;
81975         escape.escapeReplace = /[&<>"']/g;
81976         escape.replacements = {
81977           '&': '&amp;',
81978           '<': '&lt;',
81979           '>': '&gt;',
81980           '"': '&quot;',
81981           "'": '&#39;'
81982         };
81983
81984         escape.escapeTestNoEncode = /[<>"']|&(?!#?\w+;)/;
81985         escape.escapeReplaceNoEncode = /[<>"']|&(?!#?\w+;)/g;
81986
81987         function unescape(html) {
81988           // explicitly match decimal, hex, and named HTML entities
81989           return html.replace(/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig, function(_, n) {
81990             n = n.toLowerCase();
81991             if (n === 'colon') return ':';
81992             if (n.charAt(0) === '#') {
81993               return n.charAt(1) === 'x'
81994                 ? String.fromCharCode(parseInt(n.substring(2), 16))
81995                 : String.fromCharCode(+n.substring(1));
81996             }
81997             return '';
81998           });
81999         }
82000
82001         function edit(regex, opt) {
82002           regex = regex.source || regex;
82003           opt = opt || '';
82004           return {
82005             replace: function(name, val) {
82006               val = val.source || val;
82007               val = val.replace(/(^|[^\[])\^/g, '$1');
82008               regex = regex.replace(name, val);
82009               return this;
82010             },
82011             getRegex: function() {
82012               return new RegExp(regex, opt);
82013             }
82014           };
82015         }
82016
82017         function cleanUrl(sanitize, base, href) {
82018           if (sanitize) {
82019             try {
82020               var prot = decodeURIComponent(unescape(href))
82021                 .replace(/[^\w:]/g, '')
82022                 .toLowerCase();
82023             } catch (e) {
82024               return null;
82025             }
82026             if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0 || prot.indexOf('data:') === 0) {
82027               return null;
82028             }
82029           }
82030           if (base && !originIndependentUrl.test(href)) {
82031             href = resolveUrl(base, href);
82032           }
82033           try {
82034             href = encodeURI(href).replace(/%25/g, '%');
82035           } catch (e) {
82036             return null;
82037           }
82038           return href;
82039         }
82040
82041         function resolveUrl(base, href) {
82042           if (!baseUrls[' ' + base]) {
82043             // we can ignore everything in base after the last slash of its path component,
82044             // but we might need to add _that_
82045             // https://tools.ietf.org/html/rfc3986#section-3
82046             if (/^[^:]+:\/*[^/]*$/.test(base)) {
82047               baseUrls[' ' + base] = base + '/';
82048             } else {
82049               baseUrls[' ' + base] = rtrim(base, '/', true);
82050             }
82051           }
82052           base = baseUrls[' ' + base];
82053
82054           if (href.slice(0, 2) === '//') {
82055             return base.replace(/:[\s\S]*/, ':') + href;
82056           } else if (href.charAt(0) === '/') {
82057             return base.replace(/(:\/*[^/]*)[\s\S]*/, '$1') + href;
82058           } else {
82059             return base + href;
82060           }
82061         }
82062         var baseUrls = {};
82063         var originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;
82064
82065         function noop() {}
82066         noop.exec = noop;
82067
82068         function merge(obj) {
82069           var i = 1,
82070               target,
82071               key;
82072
82073           for (; i < arguments.length; i++) {
82074             target = arguments[i];
82075             for (key in target) {
82076               if (Object.prototype.hasOwnProperty.call(target, key)) {
82077                 obj[key] = target[key];
82078               }
82079             }
82080           }
82081
82082           return obj;
82083         }
82084
82085         function splitCells(tableRow, count) {
82086           // ensure that every cell-delimiting pipe has a space
82087           // before it to distinguish it from an escaped pipe
82088           var row = tableRow.replace(/\|/g, function(match, offset, str) {
82089                 var escaped = false,
82090                     curr = offset;
82091                 while (--curr >= 0 && str[curr] === '\\') escaped = !escaped;
82092                 if (escaped) {
82093                   // odd number of slashes means | is escaped
82094                   // so we leave it alone
82095                   return '|';
82096                 } else {
82097                   // add space before unescaped |
82098                   return ' |';
82099                 }
82100               }),
82101               cells = row.split(/ \|/),
82102               i = 0;
82103
82104           if (cells.length > count) {
82105             cells.splice(count);
82106           } else {
82107             while (cells.length < count) cells.push('');
82108           }
82109
82110           for (; i < cells.length; i++) {
82111             // leading or trailing whitespace is ignored per the gfm spec
82112             cells[i] = cells[i].trim().replace(/\\\|/g, '|');
82113           }
82114           return cells;
82115         }
82116
82117         // Remove trailing 'c's. Equivalent to str.replace(/c*$/, '').
82118         // /c*$/ is vulnerable to REDOS.
82119         // invert: Remove suffix of non-c chars instead. Default falsey.
82120         function rtrim(str, c, invert) {
82121           if (str.length === 0) {
82122             return '';
82123           }
82124
82125           // Length of suffix matching the invert condition.
82126           var suffLen = 0;
82127
82128           // Step left until we fail to match the invert condition.
82129           while (suffLen < str.length) {
82130             var currChar = str.charAt(str.length - suffLen - 1);
82131             if (currChar === c && !invert) {
82132               suffLen++;
82133             } else if (currChar !== c && invert) {
82134               suffLen++;
82135             } else {
82136               break;
82137             }
82138           }
82139
82140           return str.substr(0, str.length - suffLen);
82141         }
82142
82143         function findClosingBracket(str, b) {
82144           if (str.indexOf(b[1]) === -1) {
82145             return -1;
82146           }
82147           var level = 0;
82148           for (var i = 0; i < str.length; i++) {
82149             if (str[i] === '\\') {
82150               i++;
82151             } else if (str[i] === b[0]) {
82152               level++;
82153             } else if (str[i] === b[1]) {
82154               level--;
82155               if (level < 0) {
82156                 return i;
82157               }
82158             }
82159           }
82160           return -1;
82161         }
82162
82163         /**
82164          * Marked
82165          */
82166
82167         function marked(src, opt, callback) {
82168           // throw error in case of non string input
82169           if (typeof src === 'undefined' || src === null) {
82170             throw new Error('marked(): input parameter is undefined or null');
82171           }
82172           if (typeof src !== 'string') {
82173             throw new Error('marked(): input parameter is of type '
82174               + Object.prototype.toString.call(src) + ', string expected');
82175           }
82176
82177           if (callback || typeof opt === 'function') {
82178             if (!callback) {
82179               callback = opt;
82180               opt = null;
82181             }
82182
82183             opt = merge({}, marked.defaults, opt || {});
82184
82185             var highlight = opt.highlight,
82186                 tokens,
82187                 pending,
82188                 i = 0;
82189
82190             try {
82191               tokens = Lexer.lex(src, opt);
82192             } catch (e) {
82193               return callback(e);
82194             }
82195
82196             pending = tokens.length;
82197
82198             var done = function(err) {
82199               if (err) {
82200                 opt.highlight = highlight;
82201                 return callback(err);
82202               }
82203
82204               var out;
82205
82206               try {
82207                 out = Parser.parse(tokens, opt);
82208               } catch (e) {
82209                 err = e;
82210               }
82211
82212               opt.highlight = highlight;
82213
82214               return err
82215                 ? callback(err)
82216                 : callback(null, out);
82217             };
82218
82219             if (!highlight || highlight.length < 3) {
82220               return done();
82221             }
82222
82223             delete opt.highlight;
82224
82225             if (!pending) return done();
82226
82227             for (; i < tokens.length; i++) {
82228               (function(token) {
82229                 if (token.type !== 'code') {
82230                   return --pending || done();
82231                 }
82232                 return highlight(token.text, token.lang, function(err, code) {
82233                   if (err) return done(err);
82234                   if (code == null || code === token.text) {
82235                     return --pending || done();
82236                   }
82237                   token.text = code;
82238                   token.escaped = true;
82239                   --pending || done();
82240                 });
82241               })(tokens[i]);
82242             }
82243
82244             return;
82245           }
82246           try {
82247             if (opt) opt = merge({}, marked.defaults, opt);
82248             return Parser.parse(Lexer.lex(src, opt), opt);
82249           } catch (e) {
82250             e.message += '\nPlease report this to https://github.com/markedjs/marked.';
82251             if ((opt || marked.defaults).silent) {
82252               return '<p>An error occurred:</p><pre>'
82253                 + escape(e.message + '', true)
82254                 + '</pre>';
82255             }
82256             throw e;
82257           }
82258         }
82259
82260         /**
82261          * Options
82262          */
82263
82264         marked.options =
82265         marked.setOptions = function(opt) {
82266           merge(marked.defaults, opt);
82267           return marked;
82268         };
82269
82270         marked.getDefaults = function() {
82271           return {
82272             baseUrl: null,
82273             breaks: false,
82274             gfm: true,
82275             headerIds: true,
82276             headerPrefix: '',
82277             highlight: null,
82278             langPrefix: 'language-',
82279             mangle: true,
82280             pedantic: false,
82281             renderer: new Renderer(),
82282             sanitize: false,
82283             sanitizer: null,
82284             silent: false,
82285             smartLists: false,
82286             smartypants: false,
82287             tables: true,
82288             xhtml: false
82289           };
82290         };
82291
82292         marked.defaults = marked.getDefaults();
82293
82294         /**
82295          * Expose
82296          */
82297
82298         marked.Parser = Parser;
82299         marked.parser = Parser.parse;
82300
82301         marked.Renderer = Renderer;
82302         marked.TextRenderer = TextRenderer;
82303
82304         marked.Lexer = Lexer;
82305         marked.lexer = Lexer.lex;
82306
82307         marked.InlineLexer = InlineLexer;
82308         marked.inlineLexer = InlineLexer.output;
82309
82310         marked.Slugger = Slugger;
82311
82312         marked.parse = marked;
82313
82314         {
82315           module.exports = marked;
82316         }
82317         })();
82318         });
82319
82320         function pointBox(loc, context) {
82321             var rect = context.surfaceRect();
82322             var point = context.curtainProjection(loc);
82323             return {
82324                 left: point[0] + rect.left - 40,
82325                 top: point[1] + rect.top - 60,
82326                 width: 80,
82327                 height: 90
82328             };
82329         }
82330
82331
82332         function pad$2(locOrBox, padding, context) {
82333             var box;
82334             if (locOrBox instanceof Array) {
82335                 var rect = context.surfaceRect();
82336                 var point = context.curtainProjection(locOrBox);
82337                 box = {
82338                     left: point[0] + rect.left,
82339                     top: point[1] + rect.top
82340                 };
82341             } else {
82342                 box = locOrBox;
82343             }
82344
82345             return {
82346                 left: box.left - padding,
82347                 top: box.top - padding,
82348                 width: (box.width || 0) + 2 * padding,
82349                 height: (box.width || 0) + 2 * padding
82350             };
82351         }
82352
82353
82354         function icon(name, svgklass, useklass) {
82355             return '<svg class="icon ' + (svgklass || '') + '">' +
82356                  '<use xlink:href="' + name + '"' +
82357                  (useklass ? ' class="' + useklass + '"' : '') + '></use></svg>';
82358         }
82359
82360
82361         function slugify(text) {
82362             return text.toString().toLowerCase()
82363                 .replace(/\s+/g, '-')           // Replace spaces with -
82364                 .replace(/[^\w\-]+/g, '')       // Remove all non-word chars
82365                 .replace(/\-\-+/g, '-')         // Replace multiple - with single -
82366                 .replace(/^-+/, '')             // Trim - from start of text
82367                 .replace(/-+$/, '');            // Trim - from end of text
82368         }
82369
82370
82371         // console warning for missing walkthrough names
82372         var missingStrings = {};
82373         function checkKey(key, text) {
82374             if (t(key, { default: undefined}) === undefined) {
82375                 if (missingStrings.hasOwnProperty(key)) return;  // warn once
82376                 missingStrings[key] = text;
82377                 var missing = key + ': ' + text;
82378                 if (typeof console !== 'undefined') console.log(missing); // eslint-disable-line
82379             }
82380         }
82381
82382
82383         function localize(obj) {
82384             var key;
82385
82386             // Assign name if entity has one..
82387             var name = obj.tags && obj.tags.name;
82388             if (name) {
82389                 key = 'intro.graph.name.' + slugify(name);
82390                 obj.tags.name = t(key, { default: name });
82391                 checkKey(key, name);
82392             }
82393
82394             // Assign street name if entity has one..
82395             var street = obj.tags && obj.tags['addr:street'];
82396             if (street) {
82397                 key = 'intro.graph.name.' + slugify(street);
82398                 obj.tags['addr:street'] = t(key, { default: street });
82399                 checkKey(key, street);
82400
82401                 // Add address details common across walkthrough..
82402                 var addrTags = [
82403                     'block_number', 'city', 'county', 'district', 'hamlet', 'neighbourhood',
82404                     'postcode', 'province', 'quarter', 'state', 'subdistrict', 'suburb'
82405                 ];
82406                 addrTags.forEach(function(k) {
82407                     var key = 'intro.graph.' + k;
82408                     var tag = 'addr:' + k;
82409                     var val = obj.tags && obj.tags[tag];
82410                     var str = t(key, { default: val });
82411
82412                     if (str) {
82413                         if (str.match(/^<.*>$/) !== null) {
82414                             delete obj.tags[tag];
82415                         } else {
82416                             obj.tags[tag] = str;
82417                         }
82418                     }
82419                 });
82420             }
82421
82422             return obj;
82423         }
82424
82425
82426         // Used to detect squareness.. some duplicataion of code from actionOrthogonalize.
82427         function isMostlySquare(points) {
82428             // note: uses 15 here instead of the 12 from actionOrthogonalize because
82429             // actionOrthogonalize can actually straighten some larger angles as it iterates
82430             var threshold = 15; // degrees within right or straight
82431             var lowerBound = Math.cos((90 - threshold) * Math.PI / 180);  // near right
82432             var upperBound = Math.cos(threshold * Math.PI / 180);         // near straight
82433
82434             for (var i = 0; i < points.length; i++) {
82435                 var a = points[(i - 1 + points.length) % points.length];
82436                 var origin = points[i];
82437                 var b = points[(i + 1) % points.length];
82438
82439                 var dotp = geoVecNormalizedDot(a, b, origin);
82440                 var mag = Math.abs(dotp);
82441                 if (mag > lowerBound && mag < upperBound) {
82442                     return false;
82443                 }
82444             }
82445
82446             return true;
82447         }
82448
82449
82450         function selectMenuItem(operation) {
82451             var selector = '.edit-menu .edit-menu-item-' + operation +
82452                 ', .radial-menu .radial-menu-item-' + operation;
82453             return d3_select(selector);
82454         }
82455
82456
82457         function transitionTime(point1, point2) {
82458             var distance = geoSphericalDistance(point1, point2);
82459             if (distance === 0)
82460                 return 0;
82461             else if (distance < 80)
82462                 return 500;
82463             else
82464                 return 1000;
82465         }
82466
82467         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",brand:"Sherwin Williams","brand:wikidata":"Q48881","brand:wikipedia":"en:Sherwin-Williams"}},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",brand:"Dollar Tree","brand:wikidata":"Q5289230","brand:wikipedia":"en:Dollar Tree",shop:"variety_store"}},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.634513,41.946181]},n102:{id:"n102",loc:[-85.637357,41.942216]},n1020:{id:"n1020",loc:[-85.634079,41.946194]},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:"marked",highway:"crossing"}},n1027:{id:"n1027",loc:[-85.634766,41.946178]},n1028:{id:"n1028",loc:[-85.634622,41.946179],tags:{crossing:"marked",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","seamark:type":"light_major"}},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.635775,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",crossing:"unmarked"}},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.635806,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.942648]},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.634982,41.946262],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.635805,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:"marked",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.635798,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.634841,41.945778]},n2525:{id:"n2525",loc:[-85.635315,41.945939]},n2526:{id:"n2526",loc:[-85.634841,41.945921]},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.635818,41.942677],tags:{crossing:"marked",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.635777,41.940183],tags:{crossing:"marked",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:"marked",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:"marked",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:"marked",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:"marked",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:"marked",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.635818,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:"marked",highway:"crossing"}},n4687:{id:"n4687",loc:[-85.635883,41.94006]},n4688:{id:"n4688",loc:[-85.635774,41.940051],tags:{crossing:"marked",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:"marked",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.635783,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.635785,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:"marked",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.63489,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:"marked",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:"marked",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:"marked",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",brand:"Pizza Hut","brand:wikidata":"Q191615","brand:wikipedia":"en: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",natural:"water",water:"river"}},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:"marked",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",building:"yes"}},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:"marked",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:"marked",footway:"crossing",highway:"footway"}},w162:{id:"w162",nodes:["n727","n2411","n728"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w163:{id:"w163",nodes:["n729","n730","n731"],tags:{crossing:"marked",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","n3355","n1020"],tags:{footway:"sidewalk",highway:"footway"}},w219:{id:"w219",nodes:["n719","n1026","n1027"],tags:{crossing:"marked",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:"marked",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",building:"yes",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",building:"yes",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",building:"yes",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",building:"yes",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",building:"yes",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",building:"yes",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:"marked",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:"marked",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:{name:"Hoffman Pond",natural:"water",water:"reservoir"}},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",highway:"footway"}},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:"marked",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:"marked",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:"marked",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:"marked",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",building:"yes",shelter_type:"picnic_shelter"}},w815:{id:"w815",nodes:["n4678","n4679","n4680","n1889"],tags:{highway:"service"}},w816:{id:"w816",nodes:["n239","n4686","n4687"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w817:{id:"w817",nodes:["n4687","n4688","n4689"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w818:{id:"w818",nodes:["n4689","n4690","n307"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w819:{id:"w819",nodes:["n2266","n4743"],tags:{highway:"path"}},w82:{id:"w82",nodes:["n724","n368","n369"],tags:{crossing:"marked",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]},w599:{tags:{footway:"sidewalk",highway:"footway"},id:"w599",nodes:["n1021","n1022","n731","n728","n1023","n1025","n1024","n1019"]},w618:{tags:{footway:"sidewalk",highway:"footway"},id:"w618",nodes:["n1020","n1021"]},n3355:{id:"n3355",loc:[-85.634489,41.946193]}};
82468
82469         // Tooltips and svg mask used to highlight certain features
82470         function uiCurtain() {
82471
82472             var surface = d3_select(null),
82473                 tooltip = d3_select(null),
82474                 darkness = d3_select(null);
82475
82476             function curtain(selection) {
82477                 surface = selection
82478                     .append('svg')
82479                     .attr('id', 'curtain')
82480                     .style('z-index', 1000)
82481                     .style('pointer-events', 'none')
82482                     .style('position', 'absolute')
82483                     .style('top', 0)
82484                     .style('left', 0);
82485
82486                 darkness = surface.append('path')
82487                     .attr('x', 0)
82488                     .attr('y', 0)
82489                     .attr('class', 'curtain-darkness');
82490
82491                 d3_select(window).on('resize.curtain', resize);
82492
82493                 tooltip = selection.append('div')
82494                     .attr('class', 'tooltip')
82495                     .style('z-index', 1002);
82496
82497                 tooltip
82498                     .append('div')
82499                     .attr('class', 'tooltip-arrow');
82500
82501                 tooltip
82502                     .append('div')
82503                     .attr('class', 'tooltip-inner');
82504
82505                 resize();
82506
82507
82508                 function resize() {
82509                     surface
82510                         .attr('width', window.innerWidth)
82511                         .attr('height', window.innerHeight);
82512                     curtain.cut(darkness.datum());
82513                 }
82514             }
82515
82516
82517             /**
82518              * Reveal cuts the curtain to highlight the given box,
82519              * and shows a tooltip with instructions next to the box.
82520              *
82521              * @param  {String|ClientRect} [box]   box used to cut the curtain
82522              * @param  {String}    [text]          text for a tooltip
82523              * @param  {Object}    [options]
82524              * @param  {string}    [options.tooltipClass]    optional class to add to the tooltip
82525              * @param  {integer}   [options.duration]        transition time in milliseconds
82526              * @param  {string}    [options.buttonText]      if set, create a button with this text label
82527              * @param  {function}  [options.buttonCallback]  if set, the callback for the button
82528              * @param  {String|ClientRect} [options.tooltipBox]  box for tooltip position, if different from box for the curtain
82529              */
82530             curtain.reveal = function(box, text, options) {
82531                 if (typeof box === 'string') {
82532                     box = d3_select(box).node();
82533                 }
82534                 if (box && box.getBoundingClientRect) {
82535                     box = copyBox(box.getBoundingClientRect());
82536                 }
82537
82538                 options = options || {};
82539
82540                 var tooltipBox;
82541                 if (options.tooltipBox) {
82542                     tooltipBox = options.tooltipBox;
82543                     if (typeof tooltipBox === 'string') {
82544                         tooltipBox = d3_select(tooltipBox).node();
82545                     }
82546                     if (tooltipBox && tooltipBox.getBoundingClientRect) {
82547                         tooltipBox = copyBox(tooltipBox.getBoundingClientRect());
82548                     }
82549                 } else {
82550                     tooltipBox = box;
82551                 }
82552
82553                 if (tooltipBox && text) {
82554                     // pseudo markdown bold text for the instruction section..
82555                     var parts = text.split('**');
82556                     var html = parts[0] ? '<span>' + parts[0] + '</span>' : '';
82557                     if (parts[1]) {
82558                         html += '<span class="instruction">' + parts[1] + '</span>';
82559                     }
82560
82561                     html = html.replace(/\*(.*?)\*/g, '<em>$1</em>');   // emphasis
82562                     html = html.replace(/\{br\}/g, '<br/><br/>');       // linebreak
82563
82564                     if (options.buttonText && options.buttonCallback) {
82565                         html += '<div class="button-section">' +
82566                             '<button href="#" class="button action">' + options.buttonText + '</button></div>';
82567                     }
82568
82569                     var classes = 'curtain-tooltip tooltip in ' + (options.tooltipClass || '');
82570                     tooltip
82571                         .classed(classes, true)
82572                         .selectAll('.tooltip-inner')
82573                         .html(html);
82574
82575                     if (options.buttonText && options.buttonCallback) {
82576                         var button = tooltip.selectAll('.button-section .button.action');
82577                         button
82578                             .on('click', function() {
82579                                 event.preventDefault();
82580                                 options.buttonCallback();
82581                             });
82582                     }
82583
82584                     var tip = copyBox(tooltip.node().getBoundingClientRect()),
82585                         w = window.innerWidth,
82586                         h = window.innerHeight,
82587                         tooltipWidth = 200,
82588                         tooltipArrow = 5,
82589                         side, pos;
82590
82591
82592                     // hack: this will have bottom placement,
82593                     // so need to reserve extra space for the tooltip illustration.
82594                     if (options.tooltipClass === 'intro-mouse') {
82595                         tip.height += 80;
82596                     }
82597
82598                     // trim box dimensions to just the portion that fits in the window..
82599                     if (tooltipBox.top + tooltipBox.height > h) {
82600                         tooltipBox.height -= (tooltipBox.top + tooltipBox.height - h);
82601                     }
82602                     if (tooltipBox.left + tooltipBox.width > w) {
82603                         tooltipBox.width -= (tooltipBox.left + tooltipBox.width - w);
82604                     }
82605
82606                     // determine tooltip placement..
82607
82608                     if (tooltipBox.top + tooltipBox.height < 100) {
82609                         // tooltip below box..
82610                         side = 'bottom';
82611                         pos = [
82612                             tooltipBox.left + tooltipBox.width / 2 - tip.width / 2,
82613                             tooltipBox.top + tooltipBox.height
82614                         ];
82615
82616                     } else if (tooltipBox.top > h - 140) {
82617                         // tooltip above box..
82618                         side = 'top';
82619                         pos = [
82620                             tooltipBox.left + tooltipBox.width / 2 - tip.width / 2,
82621                             tooltipBox.top - tip.height
82622                         ];
82623
82624                     } else {
82625                         // tooltip to the side of the tooltipBox..
82626                         var tipY = tooltipBox.top + tooltipBox.height / 2 - tip.height / 2;
82627
82628                         if (textDirection === 'rtl') {
82629                             if (tooltipBox.left - tooltipWidth - tooltipArrow < 70) {
82630                                 side = 'right';
82631                                 pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
82632
82633                             } else {
82634                                 side = 'left';
82635                                 pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
82636                             }
82637
82638                         } else {
82639                             if (tooltipBox.left + tooltipBox.width + tooltipArrow + tooltipWidth > w - 70) {
82640                                 side = 'left';
82641                                 pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
82642                             }
82643                             else {
82644                                 side = 'right';
82645                                 pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
82646                             }
82647                         }
82648                     }
82649
82650                     if (options.duration !== 0 || !tooltip.classed(side)) {
82651                         tooltip.call(uiToggle(true));
82652                     }
82653
82654                     tooltip
82655                         .style('top', pos[1] + 'px')
82656                         .style('left', pos[0] + 'px')
82657                         .attr('class', classes + ' ' + side);
82658
82659
82660                     // shift tooltip-inner if it is very close to the top or bottom edge
82661                     // (doesn't affect the placement of the tooltip-arrow)
82662                     var shiftY = 0;
82663                     if (side === 'left' || side === 'right') {
82664                         if (pos[1] < 60) {
82665                             shiftY = 60 - pos[1];
82666                         }
82667                         else if (pos[1] + tip.height > h - 100) {
82668                             shiftY = h - pos[1] - tip.height - 100;
82669                         }
82670                     }
82671                     tooltip.selectAll('.tooltip-inner')
82672                         .style('top', shiftY + 'px');
82673
82674                 } else {
82675                     tooltip
82676                         .classed('in', false)
82677                         .call(uiToggle(false));
82678                 }
82679
82680                 curtain.cut(box, options.duration);
82681
82682                 return tooltip;
82683             };
82684
82685
82686             curtain.cut = function(datum, duration) {
82687                 darkness.datum(datum)
82688                     .interrupt();
82689
82690                 var selection;
82691                 if (duration === 0) {
82692                     selection = darkness;
82693                 } else {
82694                     selection = darkness
82695                         .transition()
82696                         .duration(duration || 600)
82697                         .ease(linear$1);
82698                 }
82699
82700                 selection
82701                     .attr('d', function(d) {
82702                         var string = 'M 0,0 L 0,' + window.innerHeight + ' L ' +
82703                             window.innerWidth + ',' + window.innerHeight + 'L' +
82704                             window.innerWidth + ',0 Z';
82705
82706                         if (!d) return string;
82707                         return string + 'M' +
82708                             d.left + ',' + d.top + 'L' +
82709                             d.left + ',' + (d.top + d.height) + 'L' +
82710                             (d.left + d.width) + ',' + (d.top + d.height) + 'L' +
82711                             (d.left + d.width) + ',' + (d.top) + 'Z';
82712
82713                     });
82714             };
82715
82716
82717             curtain.remove = function() {
82718                 surface.remove();
82719                 tooltip.remove();
82720                 d3_select(window).on('resize.curtain', null);
82721             };
82722
82723
82724             // ClientRects are immutable, so copy them to an object,
82725             // in case we need to trim the height/width.
82726             function copyBox(src) {
82727                 return {
82728                     top: src.top,
82729                     right: src.right,
82730                     bottom: src.bottom,
82731                     left: src.left,
82732                     width: src.width,
82733                     height: src.height
82734                 };
82735             }
82736
82737
82738             return curtain;
82739         }
82740
82741         function uiIntroWelcome(context, reveal) {
82742             var dispatch$1 = dispatch('done');
82743             var listener = clickListener();
82744
82745             var chapter = {
82746                 title: 'intro.welcome.title'
82747             };
82748
82749
82750             function welcome() {
82751                 context.map().centerZoom([-85.63591, 41.94285], 19);
82752                 reveal('.intro-nav-wrap .chapter-welcome',
82753                     t('intro.welcome.welcome'),
82754                     { buttonText: t('intro.ok'), buttonCallback: practice }
82755                 );
82756             }
82757
82758             function practice() {
82759                 reveal('.intro-nav-wrap .chapter-welcome',
82760                     t('intro.welcome.practice'),
82761                     { buttonText: t('intro.ok'), buttonCallback: words }
82762                 );
82763             }
82764
82765             function words() {
82766                 reveal('.intro-nav-wrap .chapter-welcome',
82767                     t('intro.welcome.words'),
82768                     { buttonText: t('intro.ok'), buttonCallback: mouse }
82769                 );
82770             }
82771
82772
82773             function mouse() {
82774                 reveal('.intro-nav-wrap .chapter-welcome',
82775                     t('intro.welcome.mouse'),
82776                     { buttonText: t('intro.ok'), buttonCallback: leftClick }
82777                 );
82778             }
82779
82780
82781             function leftClick() {
82782                 var counter = 0;
82783                 var times = 5;
82784
82785                 var tooltip = reveal('.intro-nav-wrap .chapter-welcome',
82786                     t('intro.welcome.leftclick', { num: times }),
82787                     { tooltipClass: 'intro-mouse' }
82788                 );
82789
82790                 tooltip.selectAll('.tooltip-inner')
82791                     .insert('svg', 'span')
82792                     .attr('class', 'tooltip-illustration')
82793                     .append('use')
82794                     .attr('xlink:href', '#iD-walkthrough-mouse');
82795
82796                 tooltip
82797                     .append('div')
82798                     .attr('class', 'counter');
82799
82800                 tooltip.call(listener);
82801
82802                 listener.on('click', function(which) {
82803                     if (which === 'left') {
82804                         d3_select('.curtain-tooltip.intro-mouse .counter')
82805                             .text(String(++counter));
82806
82807                         if (counter === times) {
82808                             window.setTimeout(function() { continueTo(rightClick); }, 1000);
82809                         }
82810                     }
82811                 });
82812
82813                 function continueTo(nextStep) {
82814                     listener.on('click', null);
82815                     tooltip.call(listener.off);
82816                     tooltip.select('.counter').remove();
82817                     nextStep();
82818                 }
82819             }
82820
82821
82822             function rightClick() {
82823                 var counter = 0;
82824                 var times = 5;
82825
82826                 var tooltip = reveal('.intro-nav-wrap .chapter-welcome',
82827                     t('intro.welcome.rightclick', { num: times }),
82828                     { tooltipClass: 'intro-mouse' }
82829                 );
82830
82831                 tooltip.selectAll('.tooltip-inner')
82832                     .insert('svg', 'span')
82833                     .attr('class', 'tooltip-illustration')
82834                     .append('use')
82835                     .attr('xlink:href', '#iD-walkthrough-mouse');
82836
82837                 tooltip
82838                     .append('div')
82839                     .attr('class', 'counter');
82840
82841                 tooltip.call(listener);
82842
82843                 listener.on('click', function(which) {
82844                     if (which === 'right') {
82845                         d3_select('.curtain-tooltip.intro-mouse .counter')
82846                             .text(String(++counter));
82847
82848                         if (counter === times) {
82849                             window.setTimeout(function() { continueTo(chapters); }, 1000);
82850                         }
82851                     }
82852                 });
82853
82854                 function continueTo(nextStep) {
82855                     listener.on('click', null);
82856                     tooltip.call(listener.off);
82857                     tooltip.select('.counter').remove();
82858                     nextStep();
82859                 }
82860             }
82861
82862
82863             function chapters() {
82864                 dispatch$1.call('done');
82865                 reveal('.intro-nav-wrap .chapter-navigation',
82866                     t('intro.welcome.chapters', { next: t('intro.navigation.title') })
82867                 );
82868             }
82869
82870
82871             chapter.enter = function() {
82872                 welcome();
82873             };
82874
82875
82876             chapter.exit = function() {
82877                 listener.off();
82878                 d3_select('.curtain-tooltip.intro-mouse')
82879                     .selectAll('.counter')
82880                     .remove();
82881             };
82882
82883
82884             chapter.restart = function() {
82885                 chapter.exit();
82886                 chapter.enter();
82887             };
82888
82889
82890             return utilRebind(chapter, dispatch$1, 'on');
82891         }
82892
82893
82894
82895         function clickListener() {
82896             var dispatch$1 = dispatch('click');
82897             var minTime = 120;
82898             var tooltip = d3_select(null);
82899             var down = {};
82900
82901             // `down` keeps track of which buttons/keys are down.
82902             // Setting a property in `down` happens immediately.
82903             // Unsetting a property in `down` is delayed because
82904             //   on Windows a contextmenu event happens after keyup/mouseup
82905
82906             function keydown() {
82907                 if (event.keyCode === 93)  {   // context menu
82908                     event.preventDefault();
82909                     event.stopPropagation();
82910                     down.menu = event.timeStamp;
82911                     tooltip.classed('rightclick', true);
82912                 }
82913             }
82914
82915
82916             function keyup() {
82917                 if (event.keyCode === 93)  {   // context menu
82918                     event.preventDefault();
82919                     event.stopPropagation();
82920                     var endTime = event.timeStamp;
82921                     var startTime = down.menu || endTime;
82922                     var delay = (endTime - startTime < minTime) ? minTime : 0;
82923
82924                     window.setTimeout(function() {
82925                         tooltip.classed('rightclick', false);
82926                         down.menu = undefined;  // delayed, for Windows
82927                     }, delay);
82928
82929                     dispatch$1.call('click', this, 'right');
82930                 }
82931             }
82932
82933
82934             function mousedown() {
82935                 var button = event.button;
82936                 if (button === 0 && !event.ctrlKey) {
82937                     tooltip.classed('leftclick', true);
82938                 } else if (button === 2) {
82939                     tooltip.classed('rightclick', true);
82940                 }
82941                 down[button] = event.timeStamp;
82942             }
82943
82944
82945             function mouseup() {
82946                 var button = event.button;
82947                 var endTime = event.timeStamp;
82948                 var startTime = down[button] || endTime;
82949                 var delay = (endTime - startTime < minTime) ? minTime : 0;
82950
82951                 if (button === 0 && !event.ctrlKey) {
82952                     window.setTimeout(function() {
82953                         tooltip.classed('leftclick', false);
82954                         down[button] = undefined;  // delayed, for Windows
82955                     }, delay);
82956
82957                     dispatch$1.call('click', this, 'left');
82958
82959                 } else if (button === 2) {
82960                     window.setTimeout(function() {
82961                         tooltip.classed('rightclick', false);
82962                         down[button] = undefined;  // delayed, for Windows
82963                     }, delay);
82964
82965                     dispatch$1.call('click', this, 'right');
82966
82967                 } else {
82968                     window.setTimeout(function() {
82969                         down[button] = undefined;  // delayed, for Windows
82970                     }, delay);
82971                 }
82972             }
82973
82974
82975             function contextmenu() {
82976                 event.preventDefault();
82977                 event.stopPropagation();
82978                 if (!down[2] && !down.menu) {
82979                     tooltip.classed('rightclick', true);
82980                     window.setTimeout(function() {
82981                         tooltip.classed('rightclick', false);
82982                     }, minTime);
82983                     dispatch$1.call('click', this, 'right');
82984                 }
82985             }
82986
82987
82988             var behavior = function(selection) {
82989                 tooltip = selection;
82990                 down = {};
82991
82992                 d3_select(window)
82993                     .on('keydown.intro', keydown)
82994                     .on('keyup.intro', keyup)
82995                     .on('mousedown.intro', mousedown)
82996                     .on('mouseup.intro', mouseup)
82997                     .on('contextmenu.intro', contextmenu);
82998             };
82999
83000
83001             behavior.off = function() {
83002                 d3_select(window)
83003                     .on('keydown.intro', null)
83004                     .on('keyup.intro', null)
83005                     .on('mousedown.intro', null)
83006                     .on('mouseup.intro', null)
83007                     .on('contextmenu.intro', null);
83008
83009                 tooltip
83010                     .classed('leftclick', false)
83011                     .classed('rightclick', false);
83012             };
83013
83014             return utilRebind(behavior, dispatch$1, 'on');
83015         }
83016
83017         function uiIntroNavigation(context, reveal) {
83018             var dispatch$1 = dispatch('done');
83019             var timeouts = [];
83020             var hallId = 'n2061';
83021             var townHall = [-85.63591, 41.94285];
83022             var springStreetId = 'w397';
83023             var springStreetEndId = 'n1834';
83024             var springStreet = [-85.63582, 41.94255];
83025             var onewayField = context.presets().field('oneway');
83026             var maxspeedField = context.presets().field('maxspeed');
83027
83028
83029             var chapter = {
83030                 title: 'intro.navigation.title'
83031             };
83032
83033
83034             function timeout(f, t) {
83035                 timeouts.push(window.setTimeout(f, t));
83036             }
83037
83038
83039             function eventCancel() {
83040                 event.stopPropagation();
83041                 event.preventDefault();
83042             }
83043
83044
83045             function isTownHallSelected() {
83046                 var ids = context.selectedIDs();
83047                 return ids.length === 1 && ids[0] === hallId;
83048             }
83049
83050
83051             function dragMap() {
83052                 context.enter(modeBrowse(context));
83053                 context.history().reset('initial');
83054
83055                 var msec = transitionTime(townHall, context.map().center());
83056                 if (msec) { reveal(null, null, { duration: 0 }); }
83057                 context.map().centerZoomEase(townHall, 19, msec);
83058
83059                 timeout(function() {
83060                     var centerStart = context.map().center();
83061
83062                     reveal('#surface', t('intro.navigation.drag'));
83063                     context.map().on('drawn.intro', function() {
83064                         reveal('#surface', t('intro.navigation.drag'), { duration: 0 });
83065                     });
83066
83067                     context.map().on('move.intro', function() {
83068                         var centerNow = context.map().center();
83069                         if (centerStart[0] !== centerNow[0] || centerStart[1] !== centerNow[1]) {
83070                             context.map().on('move.intro', null);
83071                             timeout(function() { continueTo(zoomMap); }, 3000);
83072                         }
83073                     });
83074
83075                 }, msec + 100);
83076
83077                 function continueTo(nextStep) {
83078                     context.map().on('move.intro drawn.intro', null);
83079                     nextStep();
83080                 }
83081             }
83082
83083
83084             function zoomMap() {
83085                 var zoomStart = context.map().zoom();
83086
83087                 reveal('#surface',
83088                     t('intro.navigation.zoom', {
83089                         plus: icon('#iD-icon-plus', 'pre-text'),
83090                         minus: icon('#iD-icon-minus', 'pre-text')
83091                     })
83092                 );
83093
83094                 context.map().on('drawn.intro', function() {
83095                     reveal('#surface',
83096                         t('intro.navigation.zoom', {
83097                             plus: icon('#iD-icon-plus', 'pre-text'),
83098                             minus: icon('#iD-icon-minus', 'pre-text')
83099                         }), { duration: 0 }
83100                     );
83101                 });
83102
83103                 context.map().on('move.intro', function() {
83104                     if (context.map().zoom() !== zoomStart) {
83105                         context.map().on('move.intro', null);
83106                         timeout(function() { continueTo(features); }, 3000);
83107                     }
83108                 });
83109
83110                 function continueTo(nextStep) {
83111                     context.map().on('move.intro drawn.intro', null);
83112                     nextStep();
83113                 }
83114             }
83115
83116
83117             function features() {
83118                 var onClick = function() { continueTo(pointsLinesAreas); };
83119
83120                 reveal('#surface', t('intro.navigation.features'),
83121                     { buttonText: t('intro.ok'), buttonCallback: onClick }
83122                 );
83123
83124                 context.map().on('drawn.intro', function() {
83125                     reveal('#surface', t('intro.navigation.features'),
83126                         { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
83127                     );
83128                 });
83129
83130                 function continueTo(nextStep) {
83131                     context.map().on('drawn.intro', null);
83132                     nextStep();
83133                 }
83134             }
83135
83136             function pointsLinesAreas() {
83137                 var onClick = function() { continueTo(nodesWays); };
83138
83139                 reveal('#surface', t('intro.navigation.points_lines_areas'),
83140                     { buttonText: t('intro.ok'), buttonCallback: onClick }
83141                 );
83142
83143                 context.map().on('drawn.intro', function() {
83144                     reveal('#surface', t('intro.navigation.points_lines_areas'),
83145                         { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
83146                     );
83147                 });
83148
83149                 function continueTo(nextStep) {
83150                     context.map().on('drawn.intro', null);
83151                     nextStep();
83152                 }
83153             }
83154
83155             function nodesWays() {
83156                 var onClick = function() { continueTo(clickTownHall); };
83157
83158                 reveal('#surface', t('intro.navigation.nodes_ways'),
83159                     { buttonText: t('intro.ok'), buttonCallback: onClick }
83160                 );
83161
83162                 context.map().on('drawn.intro', function() {
83163                     reveal('#surface', t('intro.navigation.nodes_ways'),
83164                         { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
83165                     );
83166                 });
83167
83168                 function continueTo(nextStep) {
83169                     context.map().on('drawn.intro', null);
83170                     nextStep();
83171                 }
83172             }
83173
83174             function clickTownHall() {
83175                 context.enter(modeBrowse(context));
83176                 context.history().reset('initial');
83177
83178                 var entity = context.hasEntity(hallId);
83179                 if (!entity) return;
83180                 reveal(null, null, { duration: 0 });
83181                 context.map().centerZoomEase(entity.loc, 19, 500);
83182
83183                 timeout(function() {
83184                     var entity = context.hasEntity(hallId);
83185                     if (!entity) return;
83186                     var box = pointBox(entity.loc, context);
83187                     reveal(box, t('intro.navigation.click_townhall'));
83188
83189                     context.map().on('move.intro drawn.intro', function() {
83190                         var entity = context.hasEntity(hallId);
83191                         if (!entity) return;
83192                         var box = pointBox(entity.loc, context);
83193                         reveal(box, t('intro.navigation.click_townhall'), { duration: 0 });
83194                     });
83195
83196                     context.on('enter.intro', function() {
83197                         if (isTownHallSelected()) continueTo(selectedTownHall);
83198                     });
83199
83200                 }, 550);  // after centerZoomEase
83201
83202                 context.history().on('change.intro', function() {
83203                     if (!context.hasEntity(hallId)) {
83204                         continueTo(clickTownHall);
83205                     }
83206                 });
83207
83208                 function continueTo(nextStep) {
83209                     context.on('enter.intro', null);
83210                     context.map().on('move.intro drawn.intro', null);
83211                     context.history().on('change.intro', null);
83212                     nextStep();
83213                 }
83214             }
83215
83216
83217             function selectedTownHall() {
83218                 if (!isTownHallSelected()) return clickTownHall();
83219
83220                 var entity = context.hasEntity(hallId);
83221                 if (!entity) return clickTownHall();
83222
83223                 var box = pointBox(entity.loc, context);
83224                 var onClick = function() { continueTo(editorTownHall); };
83225
83226                 reveal(box, t('intro.navigation.selected_townhall'),
83227                     { buttonText: t('intro.ok'), buttonCallback: onClick }
83228                 );
83229
83230                 context.map().on('move.intro drawn.intro', function() {
83231                     var entity = context.hasEntity(hallId);
83232                     if (!entity) return;
83233                     var box = pointBox(entity.loc, context);
83234                     reveal(box, t('intro.navigation.selected_townhall'),
83235                         { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
83236                     );
83237                 });
83238
83239                 context.history().on('change.intro', function() {
83240                     if (!context.hasEntity(hallId)) {
83241                         continueTo(clickTownHall);
83242                     }
83243                 });
83244
83245                 function continueTo(nextStep) {
83246                     context.map().on('move.intro drawn.intro', null);
83247                     context.history().on('change.intro', null);
83248                     nextStep();
83249                 }
83250             }
83251
83252
83253             function editorTownHall() {
83254                 if (!isTownHallSelected()) return clickTownHall();
83255
83256                 // disallow scrolling
83257                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
83258
83259                 var onClick = function() { continueTo(presetTownHall); };
83260
83261                 reveal('.entity-editor-pane',
83262                     t('intro.navigation.editor_townhall'),
83263                     { buttonText: t('intro.ok'), buttonCallback: onClick }
83264                 );
83265
83266                 context.on('exit.intro', function() {
83267                     continueTo(clickTownHall);
83268                 });
83269
83270                 context.history().on('change.intro', function() {
83271                     if (!context.hasEntity(hallId)) {
83272                         continueTo(clickTownHall);
83273                     }
83274                 });
83275
83276                 function continueTo(nextStep) {
83277                     context.on('exit.intro', null);
83278                     context.history().on('change.intro', null);
83279                     d3_select('.inspector-wrap').on('wheel.intro', null);
83280                     nextStep();
83281                 }
83282             }
83283
83284
83285             function presetTownHall() {
83286                 if (!isTownHallSelected()) return clickTownHall();
83287
83288                 // reset pane, in case user happened to change it..
83289                 d3_select('.inspector-wrap .panewrap').style('right', '0%');
83290                 // disallow scrolling
83291                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
83292
83293                 // preset match, in case the user happened to change it.
83294                 var entity = context.entity(context.selectedIDs()[0]);
83295                 var preset = context.presets().match(entity, context.graph());
83296
83297                 var onClick = function() { continueTo(fieldsTownHall); };
83298
83299                 context.on('exit.intro', function() {
83300                     continueTo(clickTownHall);
83301                 });
83302
83303                 context.history().on('change.intro', function() {
83304                     if (!context.hasEntity(hallId)) {
83305                         continueTo(clickTownHall);
83306                     }
83307                 });
83308
83309                 reveal('.inspector-body .preset-list-item.inspector-inner',
83310                     t('intro.navigation.preset_townhall', { preset: preset.name() }),
83311                     { buttonText: t('intro.ok'), buttonCallback: onClick }
83312                 );
83313
83314                 function continueTo(nextStep) {
83315                     context.on('exit.intro', null);
83316                     context.history().on('change.intro', null);
83317                     d3_select('.inspector-wrap').on('wheel.intro', null);
83318                     nextStep();
83319                 }
83320             }
83321
83322
83323             function fieldsTownHall() {
83324                 if (!isTownHallSelected()) return clickTownHall();
83325
83326                 // reset pane, in case user happened to change it..
83327                 d3_select('.inspector-wrap .panewrap').style('right', '0%');
83328                 // disallow scrolling
83329                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
83330
83331                 var onClick = function() { continueTo(closeTownHall); };
83332
83333                 reveal('.inspector-body .preset-editor',
83334                     t('intro.navigation.fields_townhall'),
83335                     { buttonText: t('intro.ok'), buttonCallback: onClick }
83336                 );
83337
83338                 context.on('exit.intro', function() {
83339                     continueTo(clickTownHall);
83340                 });
83341
83342                 context.history().on('change.intro', function() {
83343                     if (!context.hasEntity(hallId)) {
83344                         continueTo(clickTownHall);
83345                     }
83346                 });
83347
83348                 function continueTo(nextStep) {
83349                     context.on('exit.intro', null);
83350                     context.history().on('change.intro', null);
83351                     d3_select('.inspector-wrap').on('wheel.intro', null);
83352                     nextStep();
83353                 }
83354             }
83355
83356
83357             function closeTownHall() {
83358                 if (!isTownHallSelected()) return clickTownHall();
83359
83360                 var selector = '.entity-editor-pane button.preset-close svg use';
83361                 var href = d3_select(selector).attr('href') || '#iD-icon-close';
83362
83363                 reveal('.entity-editor-pane',
83364                     t('intro.navigation.close_townhall', { button: icon(href, 'pre-text') })
83365                 );
83366
83367                 context.on('exit.intro', function() {
83368                     continueTo(searchStreet);
83369                 });
83370
83371                 context.history().on('change.intro', function() {
83372                     // update the close icon in the tooltip if the user edits something.
83373                     var selector = '.entity-editor-pane button.preset-close svg use';
83374                     var href = d3_select(selector).attr('href') || '#iD-icon-close';
83375
83376                     reveal('.entity-editor-pane',
83377                         t('intro.navigation.close_townhall', { button: icon(href, 'pre-text') }),
83378                         { duration: 0 }
83379                     );
83380                 });
83381
83382                 function continueTo(nextStep) {
83383                     context.on('exit.intro', null);
83384                     context.history().on('change.intro', null);
83385                     nextStep();
83386                 }
83387             }
83388
83389
83390             function searchStreet() {
83391                 context.enter(modeBrowse(context));
83392                 context.history().reset('initial');  // ensure spring street exists
83393
83394                 var msec = transitionTime(springStreet, context.map().center());
83395                 if (msec) { reveal(null, null, { duration: 0 }); }
83396                 context.map().centerZoomEase(springStreet, 19, msec);  // ..and user can see it
83397
83398                 timeout(function() {
83399                     reveal('.search-header input',
83400                         t('intro.navigation.search_street', { name: t('intro.graph.name.spring-street') })
83401                     );
83402
83403                     d3_select('.search-header input')
83404                         .on('keyup.intro', checkSearchResult);
83405                 }, msec + 100);
83406             }
83407
83408
83409             function checkSearchResult() {
83410                 var first = d3_select('.feature-list-item:nth-child(0n+2)');  // skip "No Results" item
83411                 var firstName = first.select('.entity-name');
83412                 var name = t('intro.graph.name.spring-street');
83413
83414                 if (!firstName.empty() && firstName.text() === name) {
83415                     reveal(first.node(),
83416                         t('intro.navigation.choose_street', { name: name }),
83417                         { duration: 300 }
83418                     );
83419
83420                     context.on('exit.intro', function() {
83421                         continueTo(selectedStreet);
83422                     });
83423
83424                     d3_select('.search-header input')
83425                         .on('keydown.intro', eventCancel, true)
83426                         .on('keyup.intro', null);
83427                 }
83428
83429                 function continueTo(nextStep) {
83430                     context.on('exit.intro', null);
83431                     d3_select('.search-header input')
83432                         .on('keydown.intro', null)
83433                         .on('keyup.intro', null);
83434                     nextStep();
83435                 }
83436             }
83437
83438
83439             function selectedStreet() {
83440                 if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
83441                     return searchStreet();
83442                 }
83443
83444                 var onClick = function() { continueTo(editorStreet); };
83445                 var entity = context.entity(springStreetEndId);
83446                 var box = pointBox(entity.loc, context);
83447                 box.height = 500;
83448
83449                 reveal(box,
83450                     t('intro.navigation.selected_street', { name: t('intro.graph.name.spring-street') }),
83451                     { duration: 600, buttonText: t('intro.ok'), buttonCallback: onClick }
83452                 );
83453
83454                 timeout(function() {
83455                     context.map().on('move.intro drawn.intro', function() {
83456                         var entity = context.hasEntity(springStreetEndId);
83457                         if (!entity) return;
83458                         var box = pointBox(entity.loc, context);
83459                         box.height = 500;
83460                         reveal(box,
83461                             t('intro.navigation.selected_street', { name: t('intro.graph.name.spring-street') }),
83462                             { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
83463                         );
83464                     });
83465                 }, 600);  // after reveal.
83466
83467                 context.on('enter.intro', function(mode) {
83468                     if (!context.hasEntity(springStreetId)) {
83469                         return continueTo(searchStreet);
83470                     }
83471                     var ids = context.selectedIDs();
83472                     if (mode.id !== 'select' || !ids.length || ids[0] !== springStreetId) {
83473                         // keep Spring Street selected..
83474                         context.enter(modeSelect(context, [springStreetId]));
83475                     }
83476                 });
83477
83478                 context.history().on('change.intro', function() {
83479                     if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
83480                         timeout(function() {
83481                             continueTo(searchStreet);
83482                         }, 300);  // after any transition (e.g. if user deleted intersection)
83483                     }
83484                 });
83485
83486                 function continueTo(nextStep) {
83487                     context.map().on('move.intro drawn.intro', null);
83488                     context.on('enter.intro', null);
83489                     context.history().on('change.intro', null);
83490                     nextStep();
83491                 }
83492             }
83493
83494
83495             function editorStreet() {
83496                 var selector = '.entity-editor-pane button.preset-close svg use';
83497                 var href = d3_select(selector).attr('href') || '#iD-icon-close';
83498
83499                 reveal('.entity-editor-pane',
83500                     t('intro.navigation.editor_street', {
83501                         button: icon(href, 'pre-text'),
83502                         field1: onewayField.label(),
83503                         field2: maxspeedField.label()
83504                     })
83505                 );
83506
83507                 context.on('exit.intro', function() {
83508                     continueTo(play);
83509                 });
83510
83511                 context.history().on('change.intro', function() {
83512                     // update the close icon in the tooltip if the user edits something.
83513                     var selector = '.entity-editor-pane button.preset-close svg use';
83514                     var href = d3_select(selector).attr('href') || '#iD-icon-close';
83515
83516                     reveal('.entity-editor-pane',
83517                         t('intro.navigation.editor_street', {
83518                             button: icon(href, 'pre-text'),
83519                             field1: onewayField.label().toLowerCase(),
83520                             field2: maxspeedField.label().toLowerCase()
83521                         }), { duration: 0 }
83522                     );
83523                 });
83524
83525                 function continueTo(nextStep) {
83526                     context.on('exit.intro', null);
83527                     context.history().on('change.intro', null);
83528                     nextStep();
83529                 }
83530             }
83531
83532
83533             function play() {
83534                 dispatch$1.call('done');
83535                 reveal('#id-container',
83536                     t('intro.navigation.play', { next: t('intro.points.title') }), {
83537                         tooltipBox: '.intro-nav-wrap .chapter-point',
83538                         buttonText: t('intro.ok'),
83539                         buttonCallback: function() { reveal('#id-container'); }
83540                     }
83541                 );
83542             }
83543
83544
83545             chapter.enter = function() {
83546                 dragMap();
83547             };
83548
83549
83550             chapter.exit = function() {
83551                 timeouts.forEach(window.clearTimeout);
83552                 context.on('enter.intro exit.intro', null);
83553                 context.map().on('move.intro drawn.intro', null);
83554                 context.history().on('change.intro', null);
83555                 d3_select('.inspector-wrap').on('wheel.intro', null);
83556                 d3_select('.search-header input').on('keydown.intro keyup.intro', null);
83557             };
83558
83559
83560             chapter.restart = function() {
83561                 chapter.exit();
83562                 chapter.enter();
83563             };
83564
83565
83566             return utilRebind(chapter, dispatch$1, 'on');
83567         }
83568
83569         function uiIntroPoint(context, reveal) {
83570             var dispatch$1 = dispatch('done');
83571             var timeouts = [];
83572             var intersection = [-85.63279, 41.94394];
83573             var building = [-85.632422, 41.944045];
83574             var cafePreset = context.presets().item('amenity/cafe');
83575             var _pointID = null;
83576
83577
83578             var chapter = {
83579                 title: 'intro.points.title'
83580             };
83581
83582
83583             function timeout(f, t) {
83584                 timeouts.push(window.setTimeout(f, t));
83585             }
83586
83587
83588             function revealEditMenu(loc, text, options) {
83589                 var rect = context.surfaceRect();
83590                 var point = context.curtainProjection(loc);
83591                 var pad = 40;
83592                 var width = 250 + (2 * pad);
83593                 var height = 250;
83594                 var startX = rect.left + point[0];
83595                 var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
83596                 var box = {
83597                     left: left,
83598                     top: point[1] + rect.top - 60,
83599                     width: width,
83600                     height: height
83601                 };
83602                 reveal(box, text, options);
83603             }
83604
83605
83606             function eventCancel() {
83607                 event.stopPropagation();
83608                 event.preventDefault();
83609             }
83610
83611
83612             function addPoint() {
83613                 context.enter(modeBrowse(context));
83614                 context.history().reset('initial');
83615
83616                 var msec = transitionTime(intersection, context.map().center());
83617                 if (msec) { reveal(null, null, { duration: 0 }); }
83618                 context.map().centerZoomEase(intersection, 19, msec);
83619
83620                 timeout(function() {
83621                     var tooltip = reveal('button.add-point',
83622                         t('intro.points.add_point', { button: icon('#iD-icon-point', 'pre-text') }));
83623
83624                     _pointID = null;
83625
83626                     tooltip.selectAll('.tooltip-inner')
83627                         .insert('svg', 'span')
83628                         .attr('class', 'tooltip-illustration')
83629                         .append('use')
83630                         .attr('xlink:href', '#iD-graphic-points');
83631
83632                     context.on('enter.intro', function(mode) {
83633                         if (mode.id !== 'add-point') return;
83634                         continueTo(placePoint);
83635                     });
83636                 }, msec + 100);
83637
83638                 function continueTo(nextStep) {
83639                     context.on('enter.intro', null);
83640                     nextStep();
83641                 }
83642             }
83643
83644
83645             function placePoint() {
83646                 if (context.mode().id !== 'add-point') {
83647                     return chapter.restart();
83648                 }
83649
83650                 var pointBox = pad$2(building, 150, context);
83651                 reveal(pointBox, t('intro.points.place_point'));
83652
83653                 context.map().on('move.intro drawn.intro', function() {
83654                     pointBox = pad$2(building, 150, context);
83655                     reveal(pointBox, t('intro.points.place_point'), { duration: 0 });
83656                 });
83657
83658                 context.on('enter.intro', function(mode) {
83659                     if (mode.id !== 'select') return chapter.restart();
83660                     _pointID = context.mode().selectedIDs()[0];
83661                     continueTo(searchPreset);
83662                 });
83663
83664                 function continueTo(nextStep) {
83665                     context.map().on('move.intro drawn.intro', null);
83666                     context.on('enter.intro', null);
83667                     nextStep();
83668                 }
83669             }
83670
83671
83672             function searchPreset() {
83673                 if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
83674                     return addPoint();
83675                 }
83676
83677                 // disallow scrolling
83678                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
83679
83680                 d3_select('.preset-search-input')
83681                     .on('keydown.intro', null)
83682                     .on('keyup.intro', checkPresetSearch);
83683
83684                 reveal('.preset-search-input',
83685                     t('intro.points.search_cafe', { preset: cafePreset.name() })
83686                 );
83687
83688                 context.on('enter.intro', function(mode) {
83689                     if (!_pointID || !context.hasEntity(_pointID)) {
83690                         return continueTo(addPoint);
83691                     }
83692
83693                     var ids = context.selectedIDs();
83694                     if (mode.id !== 'select' || !ids.length || ids[0] !== _pointID) {
83695                         // keep the user's point selected..
83696                         context.enter(modeSelect(context, [_pointID]));
83697
83698                         // disallow scrolling
83699                         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
83700
83701                         d3_select('.preset-search-input')
83702                             .on('keydown.intro', null)
83703                             .on('keyup.intro', checkPresetSearch);
83704
83705                         reveal('.preset-search-input',
83706                             t('intro.points.search_cafe', { preset: cafePreset.name() })
83707                         );
83708
83709                         context.history().on('change.intro', null);
83710                     }
83711                 });
83712
83713
83714                 function checkPresetSearch() {
83715                     var first = d3_select('.preset-list-item:first-child');
83716
83717                     if (first.classed('preset-amenity-cafe')) {
83718                         d3_select('.preset-search-input')
83719                             .on('keydown.intro', eventCancel, true)
83720                             .on('keyup.intro', null);
83721
83722                         reveal(first.select('.preset-list-button').node(),
83723                             t('intro.points.choose_cafe', { preset: cafePreset.name() }),
83724                             { duration: 300 }
83725                         );
83726
83727                         context.history().on('change.intro', function() {
83728                             continueTo(aboutFeatureEditor);
83729                         });
83730                     }
83731                 }
83732
83733                 function continueTo(nextStep) {
83734                     context.on('enter.intro', null);
83735                     context.history().on('change.intro', null);
83736                     d3_select('.inspector-wrap').on('wheel.intro', null);
83737                     d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
83738                     nextStep();
83739                 }
83740             }
83741
83742
83743             function aboutFeatureEditor() {
83744                 if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
83745                     return addPoint();
83746                 }
83747
83748                 timeout(function() {
83749                     reveal('.entity-editor-pane', t('intro.points.feature_editor'), {
83750                         tooltipClass: 'intro-points-describe',
83751                         buttonText: t('intro.ok'),
83752                         buttonCallback: function() { continueTo(addName); }
83753                     });
83754                 }, 400);
83755
83756                 context.on('exit.intro', function() {
83757                     // if user leaves select mode here, just continue with the tutorial.
83758                     continueTo(reselectPoint);
83759                 });
83760
83761                 function continueTo(nextStep) {
83762                     context.on('exit.intro', null);
83763                     nextStep();
83764                 }
83765             }
83766
83767
83768             function addName() {
83769                 if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
83770                     return addPoint();
83771                 }
83772
83773                 // reset pane, in case user happened to change it..
83774                 d3_select('.inspector-wrap .panewrap').style('right', '0%');
83775
83776                 timeout(function() {
83777                     // It's possible for the user to add a name in a previous step..
83778                     // If so, don't tell them to add the name in this step.
83779                     // Give them an OK button instead.
83780                     var entity = context.entity(_pointID);
83781                     if (entity.tags.name) {
83782                         var tooltip = reveal('.entity-editor-pane', t('intro.points.add_name'), {
83783                             tooltipClass: 'intro-points-describe',
83784                             buttonText: t('intro.ok'),
83785                             buttonCallback: function() { continueTo(addCloseEditor); }
83786                         });
83787                         tooltip.select('.instruction').style('display', 'none');
83788
83789                     } else {
83790                         reveal('.entity-editor-pane', t('intro.points.add_name'),
83791                             { tooltipClass: 'intro-points-describe' }
83792                         );
83793                     }
83794                 }, 400);
83795
83796                 context.history().on('change.intro', function() {
83797                     continueTo(addCloseEditor);
83798                 });
83799
83800                 context.on('exit.intro', function() {
83801                     // if user leaves select mode here, just continue with the tutorial.
83802                     continueTo(reselectPoint);
83803                 });
83804
83805                 function continueTo(nextStep) {
83806                     context.on('exit.intro', null);
83807                     context.history().on('change.intro', null);
83808                     nextStep();
83809                 }
83810             }
83811
83812
83813             function addCloseEditor() {
83814                 // reset pane, in case user happened to change it..
83815                 d3_select('.inspector-wrap .panewrap').style('right', '0%');
83816
83817                 var selector = '.entity-editor-pane button.preset-close svg use';
83818                 var href = d3_select(selector).attr('href') || '#iD-icon-close';
83819
83820                 context.on('exit.intro', function() {
83821                     continueTo(reselectPoint);
83822                 });
83823
83824                 reveal('.entity-editor-pane',
83825                     t('intro.points.add_close', { button: icon(href, 'pre-text') })
83826                 );
83827
83828                 function continueTo(nextStep) {
83829                     context.on('exit.intro', null);
83830                     nextStep();
83831                 }
83832             }
83833
83834
83835             function reselectPoint() {
83836                 if (!_pointID) return chapter.restart();
83837                 var entity = context.hasEntity(_pointID);
83838                 if (!entity) return chapter.restart();
83839
83840                 // make sure it's still a cafe, in case user somehow changed it..
83841                 var oldPreset = context.presets().match(entity, context.graph());
83842                 context.replace(actionChangePreset(_pointID, oldPreset, cafePreset));
83843
83844                 context.enter(modeBrowse(context));
83845
83846                 var msec = transitionTime(entity.loc, context.map().center());
83847                 if (msec) { reveal(null, null, { duration: 0 }); }
83848                 context.map().centerEase(entity.loc, msec);
83849
83850                 timeout(function() {
83851                     var box = pointBox(entity.loc, context);
83852                     reveal(box, t('intro.points.reselect'), { duration: 600 });
83853
83854                     timeout(function() {
83855                         context.map().on('move.intro drawn.intro', function() {
83856                             var entity = context.hasEntity(_pointID);
83857                             if (!entity) return chapter.restart();
83858                             var box = pointBox(entity.loc, context);
83859                             reveal(box, t('intro.points.reselect'), { duration: 0 });
83860                         });
83861                     }, 600); // after reveal..
83862
83863                     context.on('enter.intro', function(mode) {
83864                         if (mode.id !== 'select') return;
83865                         continueTo(updatePoint);
83866                     });
83867
83868                 }, msec + 100);
83869
83870                 function continueTo(nextStep) {
83871                     context.map().on('move.intro drawn.intro', null);
83872                     context.on('enter.intro', null);
83873                     nextStep();
83874                 }
83875             }
83876
83877
83878             function updatePoint() {
83879                 if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
83880                     return continueTo(reselectPoint);
83881                 }
83882
83883                 // reset pane, in case user happened to untag the point..
83884                 d3_select('.inspector-wrap .panewrap').style('right', '0%');
83885
83886                 context.on('exit.intro', function() {
83887                     continueTo(reselectPoint);
83888                 });
83889
83890                 context.history().on('change.intro', function() {
83891                     continueTo(updateCloseEditor);
83892                 });
83893
83894                 timeout(function() {
83895                     reveal('.entity-editor-pane', t('intro.points.update'),
83896                         { tooltipClass: 'intro-points-describe' }
83897                     );
83898                 }, 400);
83899
83900                 function continueTo(nextStep) {
83901                     context.on('exit.intro', null);
83902                     context.history().on('change.intro', null);
83903                     nextStep();
83904                 }
83905             }
83906
83907
83908             function updateCloseEditor() {
83909                 if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
83910                     return continueTo(reselectPoint);
83911                 }
83912
83913                 // reset pane, in case user happened to change it..
83914                 d3_select('.inspector-wrap .panewrap').style('right', '0%');
83915
83916                 context.on('exit.intro', function() {
83917                     continueTo(rightClickPoint);
83918                 });
83919
83920                 timeout(function() {
83921                     reveal('.entity-editor-pane',
83922                         t('intro.points.update_close', { button: icon('#iD-icon-apply', 'pre-text') })
83923                     );
83924                 }, 500);
83925
83926                 function continueTo(nextStep) {
83927                     context.on('exit.intro', null);
83928                     nextStep();
83929                 }
83930             }
83931
83932
83933             function rightClickPoint() {
83934                 if (!_pointID) return chapter.restart();
83935                 var entity = context.hasEntity(_pointID);
83936                 if (!entity) return chapter.restart();
83937
83938                 context.enter(modeBrowse(context));
83939
83940                 var box = pointBox(entity.loc, context);
83941                 reveal(box, t('intro.points.rightclick'), { duration: 600 });
83942
83943                 timeout(function() {
83944                     context.map().on('move.intro drawn.intro', function() {
83945                         var entity = context.hasEntity(_pointID);
83946                         if (!entity) return chapter.restart();
83947                         var box = pointBox(entity.loc, context);
83948                         reveal(box, t('intro.points.rightclick'), { duration: 0 });
83949                     });
83950                 }, 600); // after reveal
83951
83952                 context.on('enter.intro', function(mode) {
83953                     if (mode.id !== 'select') return;
83954                     var ids = context.selectedIDs();
83955                     if (ids.length !== 1 || ids[0] !== _pointID) return;
83956
83957                     timeout(function() {
83958                         var node = selectMenuItem('delete').node();
83959                         if (!node) return;
83960                         continueTo(enterDelete);
83961                     }, 300);  // after menu visible
83962                 });
83963
83964                 function continueTo(nextStep) {
83965                     context.on('enter.intro', null);
83966                     context.map().on('move.intro drawn.intro', null);
83967                     nextStep();
83968                 }
83969             }
83970
83971
83972             function enterDelete() {
83973                 if (!_pointID) return chapter.restart();
83974                 var entity = context.hasEntity(_pointID);
83975                 if (!entity) return chapter.restart();
83976
83977                 var node = selectMenuItem('delete').node();
83978                 if (!node) { return continueTo(rightClickPoint); }
83979
83980                 revealEditMenu(entity.loc,
83981                     t('intro.points.delete', { button: icon('#iD-operation-delete', 'pre-text') })
83982                 );
83983
83984                 timeout(function() {
83985                     context.map().on('move.intro drawn.intro', function() {
83986                         revealEditMenu(entity.loc,
83987                             t('intro.points.delete', { button: icon('#iD-operation-delete', 'pre-text') }),
83988                             { duration: 0}
83989                         );
83990                     });
83991                 }, 300); // after menu visible
83992
83993                 context.on('exit.intro', function() {
83994                     if (!_pointID) return chapter.restart();
83995                     var entity = context.hasEntity(_pointID);
83996                     if (entity) return continueTo(rightClickPoint);  // point still exists
83997                 });
83998
83999                 context.history().on('change.intro', function(changed) {
84000                     if (changed.deleted().length) {
84001                         continueTo(undo);
84002                     }
84003                 });
84004
84005                 function continueTo(nextStep) {
84006                     context.map().on('move.intro drawn.intro', null);
84007                     context.history().on('change.intro', null);
84008                     context.on('exit.intro', null);
84009                     nextStep();
84010                 }
84011             }
84012
84013
84014             function undo() {
84015                 context.history().on('change.intro', function() {
84016                     continueTo(play);
84017                 });
84018
84019                 var iconName = '#iD-icon-' + (textDirection === 'rtl' ? 'redo' : 'undo');
84020                 reveal('#bar button.undo-button',
84021                     t('intro.points.undo', { button: icon(iconName, 'pre-text') })
84022                 );
84023
84024                 function continueTo(nextStep) {
84025                     context.history().on('change.intro', null);
84026                     nextStep();
84027                 }
84028             }
84029
84030
84031             function play() {
84032                 dispatch$1.call('done');
84033                 reveal('#id-container',
84034                     t('intro.points.play', { next: t('intro.areas.title') }), {
84035                         tooltipBox: '.intro-nav-wrap .chapter-area',
84036                         buttonText: t('intro.ok'),
84037                         buttonCallback: function() { reveal('#id-container'); }
84038                     }
84039                 );
84040             }
84041
84042
84043             chapter.enter = function() {
84044                 addPoint();
84045             };
84046
84047
84048             chapter.exit = function() {
84049                 timeouts.forEach(window.clearTimeout);
84050                 context.on('enter.intro exit.intro', null);
84051                 context.map().on('move.intro drawn.intro', null);
84052                 context.history().on('change.intro', null);
84053                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
84054                 d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
84055             };
84056
84057
84058             chapter.restart = function() {
84059                 chapter.exit();
84060                 chapter.enter();
84061             };
84062
84063
84064             return utilRebind(chapter, dispatch$1, 'on');
84065         }
84066
84067         function uiIntroArea(context, reveal) {
84068             var dispatch$1 = dispatch('done');
84069             var playground = [-85.63552, 41.94159];
84070             var playgroundPreset = context.presets().item('leisure/playground');
84071             var descriptionField = context.presets().field('description');
84072             var timeouts = [];
84073             var _areaID;
84074
84075
84076             var chapter = {
84077                 title: 'intro.areas.title'
84078             };
84079
84080
84081             function timeout(f, t) {
84082                 timeouts.push(window.setTimeout(f, t));
84083             }
84084
84085
84086             function eventCancel() {
84087                 event.stopPropagation();
84088                 event.preventDefault();
84089             }
84090
84091
84092             function revealPlayground(center, text, options) {
84093                 var padding = 180 * Math.pow(2, context.map().zoom() - 19.5);
84094                 var box = pad$2(center, padding, context);
84095                 reveal(box, text, options);
84096             }
84097
84098
84099             function addArea() {
84100                 context.enter(modeBrowse(context));
84101                 context.history().reset('initial');
84102                 _areaID = null;
84103
84104                 var msec = transitionTime(playground, context.map().center());
84105                 if (msec) { reveal(null, null, { duration: 0 }); }
84106                 context.map().centerZoomEase(playground, 19, msec);
84107
84108                 timeout(function() {
84109                     var tooltip = reveal('button.add-area',
84110                         t('intro.areas.add_playground', { button: icon('#iD-icon-area', 'pre-text') }));
84111
84112                     tooltip.selectAll('.tooltip-inner')
84113                         .insert('svg', 'span')
84114                         .attr('class', 'tooltip-illustration')
84115                         .append('use')
84116                         .attr('xlink:href', '#iD-graphic-areas');
84117
84118                     context.on('enter.intro', function(mode) {
84119                         if (mode.id !== 'add-area') return;
84120                         continueTo(startPlayground);
84121                     });
84122                 }, msec + 100);
84123
84124                 function continueTo(nextStep) {
84125                     context.on('enter.intro', null);
84126                     nextStep();
84127                 }
84128             }
84129
84130
84131             function startPlayground() {
84132                 if (context.mode().id !== 'add-area') {
84133                     return chapter.restart();
84134                 }
84135
84136                 _areaID = null;
84137                 context.map().zoomEase(19.5, 500);
84138
84139                 timeout(function() {
84140                     revealPlayground(playground,
84141                         t('intro.areas.start_playground'), { duration: 250 }
84142                     );
84143
84144                     timeout(function() {
84145                         context.map().on('move.intro drawn.intro', function() {
84146                             revealPlayground(playground,
84147                                 t('intro.areas.start_playground'), { duration: 0 }
84148                             );
84149                         });
84150                         context.on('enter.intro', function(mode) {
84151                             if (mode.id !== 'draw-area') return chapter.restart();
84152                             continueTo(continuePlayground);
84153                         });
84154                     }, 250);  // after reveal
84155
84156                 }, 550);  // after easing
84157
84158                 function continueTo(nextStep) {
84159                     context.map().on('move.intro drawn.intro', null);
84160                     context.on('enter.intro', null);
84161                     nextStep();
84162                 }
84163             }
84164
84165
84166             function continuePlayground() {
84167                 if (context.mode().id !== 'draw-area') {
84168                     return chapter.restart();
84169                 }
84170
84171                 _areaID = null;
84172                 revealPlayground(playground,
84173                     t('intro.areas.continue_playground', { alt: uiCmd.display('⌥') }),
84174                     { duration: 250 }
84175                 );
84176
84177                 timeout(function() {
84178                     context.map().on('move.intro drawn.intro', function() {
84179                         revealPlayground(playground,
84180                             t('intro.areas.continue_playground', { alt: uiCmd.display('⌥') }),
84181                             { duration: 0 }
84182                         );
84183                     });
84184                 }, 250);  // after reveal
84185
84186                 context.on('enter.intro', function(mode) {
84187                     if (mode.id === 'draw-area') {
84188                         var entity = context.hasEntity(context.selectedIDs()[0]);
84189                         if (entity && entity.nodes.length >= 6) {
84190                             return continueTo(finishPlayground);
84191                         } else {
84192                             return;
84193                         }
84194                     } else if (mode.id === 'select') {
84195                         _areaID = context.selectedIDs()[0];
84196                         return continueTo(searchPresets);
84197                     } else {
84198                         return chapter.restart();
84199                     }
84200                 });
84201
84202                 function continueTo(nextStep) {
84203                     context.map().on('move.intro drawn.intro', null);
84204                     context.on('enter.intro', null);
84205                     nextStep();
84206                 }
84207             }
84208
84209
84210             function finishPlayground() {
84211                 if (context.mode().id !== 'draw-area') {
84212                     return chapter.restart();
84213                 }
84214
84215                 _areaID = null;
84216                 revealPlayground(playground,
84217                     t('intro.areas.finish_playground'), { duration: 250 }
84218                 );
84219
84220                 timeout(function() {
84221                     context.map().on('move.intro drawn.intro', function() {
84222                         revealPlayground(playground,
84223                             t('intro.areas.finish_playground'), { duration: 0 }
84224                         );
84225                     });
84226                 }, 250);  // after reveal
84227
84228                 context.on('enter.intro', function(mode) {
84229                     if (mode.id === 'draw-area') {
84230                         return;
84231                     } else if (mode.id === 'select') {
84232                         _areaID = context.selectedIDs()[0];
84233                         return continueTo(searchPresets);
84234                     } else {
84235                         return chapter.restart();
84236                     }
84237                 });
84238
84239                 function continueTo(nextStep) {
84240                     context.map().on('move.intro drawn.intro', null);
84241                     context.on('enter.intro', null);
84242                     nextStep();
84243                 }
84244             }
84245
84246
84247             function searchPresets() {
84248                 if (!_areaID || !context.hasEntity(_areaID)) {
84249                     return addArea();
84250                 }
84251                 var ids = context.selectedIDs();
84252                 if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
84253                     context.enter(modeSelect(context, [_areaID]));
84254                 }
84255
84256                 // disallow scrolling
84257                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
84258
84259                 timeout(function() {
84260                     // reset pane, in case user somehow happened to change it..
84261                     d3_select('.inspector-wrap .panewrap').style('right', '-100%');
84262
84263                     d3_select('.preset-search-input')
84264                         .on('keydown.intro', null)
84265                         .on('keyup.intro', checkPresetSearch);
84266
84267                     reveal('.preset-search-input',
84268                         t('intro.areas.search_playground', { preset: playgroundPreset.name() })
84269                     );
84270                 }, 400);  // after preset list pane visible..
84271
84272                 context.on('enter.intro', function(mode) {
84273                     if (!_areaID || !context.hasEntity(_areaID)) {
84274                         return continueTo(addArea);
84275                     }
84276
84277                     var ids = context.selectedIDs();
84278                     if (mode.id !== 'select' || !ids.length || ids[0] !== _areaID) {
84279                         // keep the user's area selected..
84280                         context.enter(modeSelect(context, [_areaID]));
84281
84282                         // reset pane, in case user somehow happened to change it..
84283                         d3_select('.inspector-wrap .panewrap').style('right', '-100%');
84284                         // disallow scrolling
84285                         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
84286
84287                         d3_select('.preset-search-input')
84288                             .on('keydown.intro', null)
84289                             .on('keyup.intro', checkPresetSearch);
84290
84291                         reveal('.preset-search-input',
84292                             t('intro.areas.search_playground', { preset: playgroundPreset.name() })
84293                         );
84294
84295                         context.history().on('change.intro', null);
84296                     }
84297                 });
84298
84299                 function checkPresetSearch() {
84300                     var first = d3_select('.preset-list-item:first-child');
84301
84302                     if (first.classed('preset-leisure-playground')) {
84303                         reveal(first.select('.preset-list-button').node(),
84304                             t('intro.areas.choose_playground', { preset: playgroundPreset.name() }),
84305                             { duration: 300 }
84306                         );
84307
84308                         d3_select('.preset-search-input')
84309                             .on('keydown.intro', eventCancel, true)
84310                             .on('keyup.intro', null);
84311
84312                         context.history().on('change.intro', function() {
84313                             continueTo(clickAddField);
84314                         });
84315                     }
84316                 }
84317
84318                 function continueTo(nextStep) {
84319                     d3_select('.inspector-wrap').on('wheel.intro', null);
84320                     context.on('enter.intro', null);
84321                     context.history().on('change.intro', null);
84322                     d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
84323                     nextStep();
84324                 }
84325             }
84326
84327
84328             function clickAddField() {
84329                 if (!_areaID || !context.hasEntity(_areaID)) {
84330                     return addArea();
84331                 }
84332                 var ids = context.selectedIDs();
84333                 if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
84334                     return searchPresets();
84335                 }
84336
84337                 if (!d3_select('.form-field-description').empty()) {
84338                     return continueTo(describePlayground);
84339                 }
84340
84341                 // disallow scrolling
84342                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
84343
84344                 timeout(function() {
84345                     // reset pane, in case user somehow happened to change it..
84346                     d3_select('.inspector-wrap .panewrap').style('right', '0%');
84347
84348                     // It's possible for the user to add a description in a previous step..
84349                     // If they did this already, just continue to next step.
84350                     var entity = context.entity(_areaID);
84351                     if (entity.tags.description) {
84352                         return continueTo(play);
84353                     }
84354
84355                     // scroll "Add field" into view
84356                     var box = d3_select('.more-fields').node().getBoundingClientRect();
84357                     if (box.top > 300) {
84358                         var pane = d3_select('.entity-editor-pane .inspector-body');
84359                         var start = pane.node().scrollTop;
84360                         var end = start + (box.top - 300);
84361
84362                         pane
84363                             .transition()
84364                             .duration(250)
84365                             .tween('scroll.inspector', function() {
84366                                 var node = this;
84367                                 var i = d3_interpolateNumber(start, end);
84368                                 return function(t) {
84369                                     node.scrollTop = i(t);
84370                                 };
84371                             });
84372                     }
84373
84374                     timeout(function() {
84375                         reveal('.more-fields .combobox-input',
84376                             t('intro.areas.add_field'),
84377                             { duration: 300 }
84378                         );
84379
84380                         d3_select('.more-fields .combobox-input')
84381                             .on('click.intro', function() {
84382                                 // Watch for the combobox to appear...
84383                                 var watcher;
84384                                 watcher = window.setInterval(function() {
84385                                     if (!d3_select('div.combobox').empty()) {
84386                                         window.clearInterval(watcher);
84387                                         continueTo(chooseDescriptionField);
84388                                     }
84389                                 }, 300);
84390                             });
84391                     }, 300);  // after "Add Field" visible
84392
84393                 }, 400);  // after editor pane visible
84394
84395                 context.on('exit.intro', function() {
84396                     return continueTo(searchPresets);
84397                 });
84398
84399                 function continueTo(nextStep) {
84400                     d3_select('.inspector-wrap').on('wheel.intro', null);
84401                     d3_select('.more-fields .combobox-input').on('click.intro', null);
84402                     context.on('exit.intro', null);
84403                     nextStep();
84404                 }
84405             }
84406
84407
84408             function chooseDescriptionField() {
84409                 if (!_areaID || !context.hasEntity(_areaID)) {
84410                     return addArea();
84411                 }
84412                 var ids = context.selectedIDs();
84413                 if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
84414                     return searchPresets();
84415                 }
84416
84417                 if (!d3_select('.form-field-description').empty()) {
84418                     return continueTo(describePlayground);
84419                 }
84420
84421                 // Make sure combobox is ready..
84422                 if (d3_select('div.combobox').empty()) {
84423                     return continueTo(clickAddField);
84424                 }
84425                 // Watch for the combobox to go away..
84426                 var watcher;
84427                 watcher = window.setInterval(function() {
84428                     if (d3_select('div.combobox').empty()) {
84429                         window.clearInterval(watcher);
84430                         timeout(function() {
84431                             if (d3_select('.form-field-description').empty()) {
84432                                 continueTo(retryChooseDescription);
84433                             } else {
84434                                 continueTo(describePlayground);
84435                             }
84436                         }, 300);  // after description field added.
84437                     }
84438                 }, 300);
84439
84440                 reveal('div.combobox',
84441                     t('intro.areas.choose_field', { field: descriptionField.label() }),
84442                     { duration: 300 }
84443                 );
84444
84445                 context.on('exit.intro', function() {
84446                     return continueTo(searchPresets);
84447                 });
84448
84449                 function continueTo(nextStep) {
84450                     if (watcher) window.clearInterval(watcher);
84451                     context.on('exit.intro', null);
84452                     nextStep();
84453                 }
84454             }
84455
84456
84457             function describePlayground() {
84458                 if (!_areaID || !context.hasEntity(_areaID)) {
84459                     return addArea();
84460                 }
84461                 var ids = context.selectedIDs();
84462                 if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
84463                     return searchPresets();
84464                 }
84465
84466                 // reset pane, in case user happened to change it..
84467                 d3_select('.inspector-wrap .panewrap').style('right', '0%');
84468
84469                 if (d3_select('.form-field-description').empty()) {
84470                     return continueTo(retryChooseDescription);
84471                 }
84472
84473                 context.on('exit.intro', function() {
84474                     continueTo(play);
84475                 });
84476
84477                 reveal('.entity-editor-pane',
84478                     t('intro.areas.describe_playground', { button: icon('#iD-icon-apply', 'pre-text') }),
84479                     { duration: 300 }
84480                 );
84481
84482                 function continueTo(nextStep) {
84483                     context.on('exit.intro', null);
84484                     nextStep();
84485                 }
84486             }
84487
84488
84489             function retryChooseDescription() {
84490                 if (!_areaID || !context.hasEntity(_areaID)) {
84491                     return addArea();
84492                 }
84493                 var ids = context.selectedIDs();
84494                 if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
84495                     return searchPresets();
84496                 }
84497
84498                 // reset pane, in case user happened to change it..
84499                 d3_select('.inspector-wrap .panewrap').style('right', '0%');
84500
84501                 reveal('.entity-editor-pane',
84502                     t('intro.areas.retry_add_field', { field: descriptionField.label() }), {
84503                     buttonText: t('intro.ok'),
84504                     buttonCallback: function() { continueTo(clickAddField); }
84505                 });
84506
84507                 context.on('exit.intro', function() {
84508                     return continueTo(searchPresets);
84509                 });
84510
84511                 function continueTo(nextStep) {
84512                     context.on('exit.intro', null);
84513                     nextStep();
84514                 }
84515             }
84516
84517
84518             function play() {
84519                 dispatch$1.call('done');
84520                 reveal('#id-container',
84521                     t('intro.areas.play', { next: t('intro.lines.title') }), {
84522                         tooltipBox: '.intro-nav-wrap .chapter-line',
84523                         buttonText: t('intro.ok'),
84524                         buttonCallback: function() { reveal('#id-container'); }
84525                     }
84526                 );
84527             }
84528
84529
84530             chapter.enter = function() {
84531                 addArea();
84532             };
84533
84534
84535             chapter.exit = function() {
84536                 timeouts.forEach(window.clearTimeout);
84537                 context.on('enter.intro exit.intro', null);
84538                 context.map().on('move.intro drawn.intro', null);
84539                 context.history().on('change.intro', null);
84540                 d3_select('.inspector-wrap').on('wheel.intro', null);
84541                 d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
84542                 d3_select('.more-fields .combobox-input').on('click.intro', null);
84543             };
84544
84545
84546             chapter.restart = function() {
84547                 chapter.exit();
84548                 chapter.enter();
84549             };
84550
84551
84552             return utilRebind(chapter, dispatch$1, 'on');
84553         }
84554
84555         function uiIntroLine(context, reveal) {
84556             var dispatch$1 = dispatch('done');
84557             var timeouts = [];
84558             var _tulipRoadID = null;
84559             var flowerRoadID = 'w646';
84560             var tulipRoadStart = [-85.6297754121684, 41.95805253325314];
84561             var tulipRoadMidpoint = [-85.62975395449628, 41.95787501510204];
84562             var tulipRoadIntersection = [-85.62974496187628, 41.95742515554585];
84563             var roadCategory = context.presets().item('category-road_minor');
84564             var residentialPreset = context.presets().item('highway/residential');
84565             var woodRoadID = 'w525';
84566             var woodRoadEndID = 'n2862';
84567             var woodRoadAddNode = [-85.62390110349587, 41.95397111462291];
84568             var woodRoadDragEndpoint = [-85.623867390213, 41.95466987786487];
84569             var woodRoadDragMidpoint = [-85.62386254803509, 41.95430395953872];
84570             var washingtonStreetID = 'w522';
84571             var twelfthAvenueID = 'w1';
84572             var eleventhAvenueEndID = 'n3550';
84573             var twelfthAvenueEndID = 'n5';
84574             var _washingtonSegmentID = null;
84575             var eleventhAvenueEnd = context.entity(eleventhAvenueEndID).loc;
84576             var twelfthAvenueEnd = context.entity(twelfthAvenueEndID).loc;
84577             var deleteLinesLoc = [-85.6219395542764, 41.95228033922477];
84578             var twelfthAvenue = [-85.62219310052491, 41.952505413152956];
84579
84580
84581             var chapter = {
84582                 title: 'intro.lines.title'
84583             };
84584
84585
84586             function timeout(f, t) {
84587                 timeouts.push(window.setTimeout(f, t));
84588             }
84589
84590
84591             function eventCancel() {
84592                 event.stopPropagation();
84593                 event.preventDefault();
84594             }
84595
84596
84597             function revealEditMenu(loc, text, options) {
84598                 var rect = context.surfaceRect();
84599                 var point = context.curtainProjection(loc);
84600                 var pad = 40;
84601                 var width = 250 + (2 * pad);
84602                 var height = 350;
84603                 var startX = rect.left + point[0];
84604                 var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
84605                 var box = {
84606                     left: left,
84607                     top: point[1] + rect.top - 60,
84608                     width: width,
84609                     height: height
84610                 };
84611                 reveal(box, text, options);
84612             }
84613
84614
84615             function addLine() {
84616                 context.enter(modeBrowse(context));
84617                 context.history().reset('initial');
84618
84619                 var msec = transitionTime(tulipRoadStart, context.map().center());
84620                 if (msec) { reveal(null, null, { duration: 0 }); }
84621                 context.map().centerZoomEase(tulipRoadStart, 18.5, msec);
84622
84623                 timeout(function() {
84624                     var tooltip = reveal('button.add-line',
84625                         t('intro.lines.add_line', { button: icon('#iD-icon-line', 'pre-text') }));
84626
84627                     tooltip.selectAll('.tooltip-inner')
84628                         .insert('svg', 'span')
84629                         .attr('class', 'tooltip-illustration')
84630                         .append('use')
84631                         .attr('xlink:href', '#iD-graphic-lines');
84632
84633                     context.on('enter.intro', function(mode) {
84634                         if (mode.id !== 'add-line') return;
84635                         continueTo(startLine);
84636                     });
84637                 }, msec + 100);
84638
84639                 function continueTo(nextStep) {
84640                     context.on('enter.intro', null);
84641                     nextStep();
84642                 }
84643             }
84644
84645
84646             function startLine() {
84647                 if (context.mode().id !== 'add-line') return chapter.restart();
84648
84649                 _tulipRoadID = null;
84650
84651                 var padding = 70 * Math.pow(2, context.map().zoom() - 18);
84652                 var box = pad$2(tulipRoadStart, padding, context);
84653                 box.height = box.height + 100;
84654                 reveal(box, t('intro.lines.start_line'));
84655
84656                 context.map().on('move.intro drawn.intro', function() {
84657                     padding = 70 * Math.pow(2, context.map().zoom() - 18);
84658                     box = pad$2(tulipRoadStart, padding, context);
84659                     box.height = box.height + 100;
84660                     reveal(box, t('intro.lines.start_line'), { duration: 0 });
84661                 });
84662
84663                 context.on('enter.intro', function(mode) {
84664                     if (mode.id !== 'draw-line') return chapter.restart();
84665                     continueTo(drawLine);
84666                 });
84667
84668                 function continueTo(nextStep) {
84669                     context.map().on('move.intro drawn.intro', null);
84670                     context.on('enter.intro', null);
84671                     nextStep();
84672                 }
84673             }
84674
84675
84676             function drawLine() {
84677                 if (context.mode().id !== 'draw-line') return chapter.restart();
84678
84679                 _tulipRoadID = context.mode().selectedIDs()[0];
84680                 context.map().centerEase(tulipRoadMidpoint, 500);
84681
84682                 timeout(function() {
84683                     var padding = 200 * Math.pow(2, context.map().zoom() - 18.5);
84684                     var box = pad$2(tulipRoadMidpoint, padding, context);
84685                     box.height = box.height * 2;
84686                     reveal(box,
84687                         t('intro.lines.intersect', { name: t('intro.graph.name.flower-street') })
84688                     );
84689
84690                     context.map().on('move.intro drawn.intro', function() {
84691                         padding = 200 * Math.pow(2, context.map().zoom() - 18.5);
84692                         box = pad$2(tulipRoadMidpoint, padding, context);
84693                         box.height = box.height * 2;
84694                         reveal(box,
84695                             t('intro.lines.intersect', { name: t('intro.graph.name.flower-street') }),
84696                             { duration: 0 }
84697                         );
84698                     });
84699                 }, 550);  // after easing..
84700
84701                 context.history().on('change.intro', function() {
84702                     if (isLineConnected()) {
84703                         continueTo(continueLine);
84704                     }
84705                 });
84706
84707                 context.on('enter.intro', function(mode) {
84708                     if (mode.id === 'draw-line') {
84709                         return;
84710                     } else if (mode.id === 'select') {
84711                         continueTo(retryIntersect);
84712                         return;
84713                     } else {
84714                         return chapter.restart();
84715                     }
84716                 });
84717
84718                 function continueTo(nextStep) {
84719                     context.map().on('move.intro drawn.intro', null);
84720                     context.history().on('change.intro', null);
84721                     context.on('enter.intro', null);
84722                     nextStep();
84723                 }
84724             }
84725
84726
84727             function isLineConnected() {
84728                 var entity = _tulipRoadID && context.hasEntity(_tulipRoadID);
84729                 if (!entity) return false;
84730
84731                 var drawNodes = context.graph().childNodes(entity);
84732                 return drawNodes.some(function(node) {
84733                     return context.graph().parentWays(node).some(function(parent) {
84734                         return parent.id === flowerRoadID;
84735                     });
84736                 });
84737             }
84738
84739
84740             function retryIntersect() {
84741                 d3_select(window).on('mousedown.intro', eventCancel, true);
84742
84743                 var box = pad$2(tulipRoadIntersection, 80, context);
84744                 reveal(box,
84745                     t('intro.lines.retry_intersect', { name: t('intro.graph.name.flower-street') })
84746                 );
84747
84748                 timeout(chapter.restart, 3000);
84749             }
84750
84751
84752             function continueLine() {
84753                 if (context.mode().id !== 'draw-line') return chapter.restart();
84754                 var entity = _tulipRoadID && context.hasEntity(_tulipRoadID);
84755                 if (!entity) return chapter.restart();
84756
84757                 context.map().centerEase(tulipRoadIntersection, 500);
84758
84759                 reveal('#surface', t('intro.lines.continue_line'));
84760
84761                 context.on('enter.intro', function(mode) {
84762                     if (mode.id === 'draw-line')
84763                         return;
84764                     else if (mode.id === 'select')
84765                         return continueTo(chooseCategoryRoad);
84766                     else
84767                         return chapter.restart();
84768                 });
84769
84770                 function continueTo(nextStep) {
84771                     context.on('enter.intro', null);
84772                     nextStep();
84773                 }
84774             }
84775
84776
84777             function chooseCategoryRoad() {
84778                 if (context.mode().id !== 'select') return chapter.restart();
84779
84780                 context.on('exit.intro', function() {
84781                     return chapter.restart();
84782                 });
84783
84784                 var button = d3_select('.preset-category-road_minor .preset-list-button');
84785                 if (button.empty()) return chapter.restart();
84786
84787                 // disallow scrolling
84788                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
84789
84790                 timeout(function() {
84791                     // reset pane, in case user somehow happened to change it..
84792                     d3_select('.inspector-wrap .panewrap').style('right', '-100%');
84793
84794                     reveal(button.node(),
84795                         t('intro.lines.choose_category_road', { category: roadCategory.name() })
84796                     );
84797
84798                     button.on('click.intro', function() {
84799                         continueTo(choosePresetResidential);
84800                     });
84801
84802                 }, 400);  // after editor pane visible
84803
84804                 function continueTo(nextStep) {
84805                     d3_select('.inspector-wrap').on('wheel.intro', null);
84806                     d3_select('.preset-list-button').on('click.intro', null);
84807                     context.on('exit.intro', null);
84808                     nextStep();
84809                 }
84810             }
84811
84812
84813             function choosePresetResidential() {
84814                 if (context.mode().id !== 'select') return chapter.restart();
84815
84816                 context.on('exit.intro', function() {
84817                     return chapter.restart();
84818                 });
84819
84820                 var subgrid = d3_select('.preset-category-road_minor .subgrid');
84821                 if (subgrid.empty()) return chapter.restart();
84822
84823                 subgrid.selectAll(':not(.preset-highway-residential) .preset-list-button')
84824                     .on('click.intro', function() {
84825                         continueTo(retryPresetResidential);
84826                     });
84827
84828                 subgrid.selectAll('.preset-highway-residential .preset-list-button')
84829                     .on('click.intro', function() {
84830                         continueTo(nameRoad);
84831                     });
84832
84833                 timeout(function() {
84834                     reveal(subgrid.node(),
84835                         t('intro.lines.choose_preset_residential', { preset: residentialPreset.name() }),
84836                         { tooltipBox: '.preset-highway-residential .preset-list-button', duration: 300 }
84837                     );
84838                 }, 300);
84839
84840                 function continueTo(nextStep) {
84841                     d3_select('.preset-list-button').on('click.intro', null);
84842                     context.on('exit.intro', null);
84843                     nextStep();
84844                 }
84845             }
84846
84847
84848             // selected wrong road type
84849             function retryPresetResidential() {
84850                 if (context.mode().id !== 'select') return chapter.restart();
84851
84852                 context.on('exit.intro', function() {
84853                     return chapter.restart();
84854                 });
84855
84856                 // disallow scrolling
84857                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
84858
84859                 timeout(function() {
84860                     var button = d3_select('.entity-editor-pane .preset-list-button');
84861
84862                     reveal(button.node(),
84863                         t('intro.lines.retry_preset_residential', { preset: residentialPreset.name() })
84864                     );
84865
84866                     button.on('click.intro', function() {
84867                         continueTo(chooseCategoryRoad);
84868                     });
84869
84870                 }, 500);
84871
84872                 function continueTo(nextStep) {
84873                     d3_select('.inspector-wrap').on('wheel.intro', null);
84874                     d3_select('.preset-list-button').on('click.intro', null);
84875                     context.on('exit.intro', null);
84876                     nextStep();
84877                 }
84878             }
84879
84880
84881             function nameRoad() {
84882                 context.on('exit.intro', function() {
84883                     continueTo(didNameRoad);
84884                 });
84885
84886                 timeout(function() {
84887                     reveal('.entity-editor-pane',
84888                         t('intro.lines.name_road', { button: icon('#iD-icon-apply', 'pre-text') }),
84889                         { tooltipClass: 'intro-lines-name_road' }
84890                     );
84891                 }, 500);
84892
84893                 function continueTo(nextStep) {
84894                     context.on('exit.intro', null);
84895                     nextStep();
84896                 }
84897             }
84898
84899
84900             function didNameRoad() {
84901                 context.history().checkpoint('doneAddLine');
84902
84903                 timeout(function() {
84904                     reveal('#surface', t('intro.lines.did_name_road'), {
84905                         buttonText: t('intro.ok'),
84906                         buttonCallback: function() { continueTo(updateLine); }
84907                     });
84908                 }, 500);
84909
84910                 function continueTo(nextStep) {
84911                     nextStep();
84912                 }
84913             }
84914
84915
84916             function updateLine() {
84917                 context.history().reset('doneAddLine');
84918                 if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
84919                     return chapter.restart();
84920                 }
84921
84922                 var msec = transitionTime(woodRoadDragMidpoint, context.map().center());
84923                 if (msec) { reveal(null, null, { duration: 0 }); }
84924                 context.map().centerZoomEase(woodRoadDragMidpoint, 19, msec);
84925
84926                 timeout(function() {
84927                     var padding = 250 * Math.pow(2, context.map().zoom() - 19);
84928                     var box = pad$2(woodRoadDragMidpoint, padding, context);
84929                     var advance = function() { continueTo(addNode); };
84930
84931                     reveal(box, t('intro.lines.update_line'),
84932                         { buttonText: t('intro.ok'), buttonCallback: advance }
84933                     );
84934
84935                     context.map().on('move.intro drawn.intro', function() {
84936                         var padding = 250 * Math.pow(2, context.map().zoom() - 19);
84937                         var box = pad$2(woodRoadDragMidpoint, padding, context);
84938                         reveal(box, t('intro.lines.update_line'),
84939                             { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
84940                         );
84941                     });
84942                 }, msec + 100);
84943
84944                 function continueTo(nextStep) {
84945                     context.map().on('move.intro drawn.intro', null);
84946                     nextStep();
84947                 }
84948             }
84949
84950
84951             function addNode() {
84952                 context.history().reset('doneAddLine');
84953                 if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
84954                     return chapter.restart();
84955                 }
84956
84957                 var padding = 40 * Math.pow(2, context.map().zoom() - 19);
84958                 var box = pad$2(woodRoadAddNode, padding, context);
84959                 reveal(box, t('intro.lines.add_node'));
84960
84961                 context.map().on('move.intro drawn.intro', function() {
84962                     var padding = 40 * Math.pow(2, context.map().zoom() - 19);
84963                     var box = pad$2(woodRoadAddNode, padding, context);
84964                     reveal(box, t('intro.lines.add_node'), { duration: 0 });
84965                 });
84966
84967                 context.history().on('change.intro', function(changed) {
84968                     if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
84969                         return continueTo(updateLine);
84970                     }
84971                     if (changed.created().length === 1) {
84972                         timeout(function() { continueTo(startDragEndpoint); }, 500);
84973                     }
84974                 });
84975
84976                 context.on('enter.intro', function(mode) {
84977                     if (mode.id !== 'select') {
84978                         continueTo(updateLine);
84979                     }
84980                 });
84981
84982                 function continueTo(nextStep) {
84983                     context.map().on('move.intro drawn.intro', null);
84984                     context.history().on('change.intro', null);
84985                     context.on('enter.intro', null);
84986                     nextStep();
84987                 }
84988             }
84989
84990
84991             function startDragEndpoint() {
84992                 if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
84993                     return continueTo(updateLine);
84994                 }
84995                 var padding = 100 * Math.pow(2, context.map().zoom() - 19);
84996                 var box = pad$2(woodRoadDragEndpoint, padding, context);
84997                 reveal(box, t('intro.lines.start_drag_endpoint'));
84998
84999                 context.map().on('move.intro drawn.intro', function() {
85000                     if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
85001                         return continueTo(updateLine);
85002                     }
85003                     var padding = 100 * Math.pow(2, context.map().zoom() - 19);
85004                     var box = pad$2(woodRoadDragEndpoint, padding, context);
85005                     reveal(box, t('intro.lines.start_drag_endpoint'), { duration: 0 });
85006
85007                     var entity = context.entity(woodRoadEndID);
85008                     if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) <= 4) {
85009                         continueTo(finishDragEndpoint);
85010                     }
85011                 });
85012
85013                 function continueTo(nextStep) {
85014                     context.map().on('move.intro drawn.intro', null);
85015                     nextStep();
85016                 }
85017             }
85018
85019
85020             function finishDragEndpoint() {
85021                 if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
85022                     return continueTo(updateLine);
85023                 }
85024
85025                 var padding = 100 * Math.pow(2, context.map().zoom() - 19);
85026                 var box = pad$2(woodRoadDragEndpoint, padding, context);
85027                 reveal(box, t('intro.lines.finish_drag_endpoint'));
85028
85029                 context.map().on('move.intro drawn.intro', function() {
85030                     if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
85031                         return continueTo(updateLine);
85032                     }
85033                     var padding = 100 * Math.pow(2, context.map().zoom() - 19);
85034                     var box = pad$2(woodRoadDragEndpoint, padding, context);
85035                     reveal(box, t('intro.lines.finish_drag_endpoint'), { duration: 0 });
85036
85037                     var entity = context.entity(woodRoadEndID);
85038                     if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) > 4) {
85039                         continueTo(startDragEndpoint);
85040                     }
85041                 });
85042
85043                 context.on('enter.intro', function() {
85044                     continueTo(startDragMidpoint);
85045                 });
85046
85047                 function continueTo(nextStep) {
85048                     context.map().on('move.intro drawn.intro', null);
85049                     context.on('enter.intro', null);
85050                     nextStep();
85051                 }
85052             }
85053
85054
85055             function startDragMidpoint() {
85056                 if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
85057                     return continueTo(updateLine);
85058                 }
85059                 if (context.selectedIDs().indexOf(woodRoadID) === -1) {
85060                     context.enter(modeSelect(context, [woodRoadID]));
85061                 }
85062
85063                 var padding = 80 * Math.pow(2, context.map().zoom() - 19);
85064                 var box = pad$2(woodRoadDragMidpoint, padding, context);
85065                 reveal(box, t('intro.lines.start_drag_midpoint'));
85066
85067                 context.map().on('move.intro drawn.intro', function() {
85068                     if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
85069                         return continueTo(updateLine);
85070                     }
85071                     var padding = 80 * Math.pow(2, context.map().zoom() - 19);
85072                     var box = pad$2(woodRoadDragMidpoint, padding, context);
85073                     reveal(box, t('intro.lines.start_drag_midpoint'), { duration: 0 });
85074                 });
85075
85076                 context.history().on('change.intro', function(changed) {
85077                     if (changed.created().length === 1) {
85078                         continueTo(continueDragMidpoint);
85079                     }
85080                 });
85081
85082                 context.on('enter.intro', function(mode) {
85083                     if (mode.id !== 'select') {
85084                         // keep Wood Road selected so midpoint triangles are drawn..
85085                         context.enter(modeSelect(context, [woodRoadID]));
85086                     }
85087                 });
85088
85089                 function continueTo(nextStep) {
85090                     context.map().on('move.intro drawn.intro', null);
85091                     context.history().on('change.intro', null);
85092                     context.on('enter.intro', null);
85093                     nextStep();
85094                 }
85095             }
85096
85097
85098             function continueDragMidpoint() {
85099                 if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
85100                     return continueTo(updateLine);
85101                 }
85102
85103                 var padding = 100 * Math.pow(2, context.map().zoom() - 19);
85104                 var box = pad$2(woodRoadDragEndpoint, padding, context);
85105                 box.height += 400;
85106
85107                 var advance = function() {
85108                     context.history().checkpoint('doneUpdateLine');
85109                     continueTo(deleteLines);
85110                 };
85111
85112                 reveal(box, t('intro.lines.continue_drag_midpoint'),
85113                     { buttonText: t('intro.ok'), buttonCallback: advance }
85114                 );
85115
85116                 context.map().on('move.intro drawn.intro', function() {
85117                     if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
85118                         return continueTo(updateLine);
85119                     }
85120                     var padding = 100 * Math.pow(2, context.map().zoom() - 19);
85121                     var box = pad$2(woodRoadDragEndpoint, padding, context);
85122                     box.height += 400;
85123                     reveal(box, t('intro.lines.continue_drag_midpoint'),
85124                         { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
85125                     );
85126                 });
85127
85128                 function continueTo(nextStep) {
85129                     context.map().on('move.intro drawn.intro', null);
85130                     nextStep();
85131                 }
85132             }
85133
85134
85135             function deleteLines() {
85136                 context.history().reset('doneUpdateLine');
85137                 context.enter(modeBrowse(context));
85138
85139                 if (!context.hasEntity(washingtonStreetID) ||
85140                     !context.hasEntity(twelfthAvenueID) ||
85141                     !context.hasEntity(eleventhAvenueEndID)) {
85142                     return chapter.restart();
85143                 }
85144
85145                 var msec = transitionTime(deleteLinesLoc, context.map().center());
85146                 if (msec) { reveal(null, null, { duration: 0 }); }
85147                 context.map().centerZoomEase(deleteLinesLoc, 18, msec);
85148
85149                 timeout(function() {
85150                     var padding = 200 * Math.pow(2, context.map().zoom() - 18);
85151                     var box = pad$2(deleteLinesLoc, padding, context);
85152                     box.top -= 200;
85153                     box.height += 400;
85154                     var advance = function() { continueTo(rightClickIntersection); };
85155
85156                     reveal(box, t('intro.lines.delete_lines', { street: t('intro.graph.name.12th-avenue') }),
85157                         { buttonText: t('intro.ok'), buttonCallback: advance }
85158                     );
85159
85160                     context.map().on('move.intro drawn.intro', function() {
85161                         var padding = 200 * Math.pow(2, context.map().zoom() - 18);
85162                         var box = pad$2(deleteLinesLoc, padding, context);
85163                         box.top -= 200;
85164                         box.height += 400;
85165                         reveal(box, t('intro.lines.delete_lines', { street: t('intro.graph.name.12th-avenue') }),
85166                             { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
85167                         );
85168                     });
85169
85170                     context.history().on('change.intro', function() {
85171                         timeout(function() {
85172                             continueTo(deleteLines);
85173                         }, 500);  // after any transition (e.g. if user deleted intersection)
85174                     });
85175
85176                 }, msec + 100);
85177
85178                 function continueTo(nextStep) {
85179                     context.map().on('move.intro drawn.intro', null);
85180                     context.history().on('change.intro', null);
85181                     nextStep();
85182                 }
85183             }
85184
85185
85186             function rightClickIntersection() {
85187                 context.history().reset('doneUpdateLine');
85188                 context.enter(modeBrowse(context));
85189
85190                 context.map().centerZoomEase(eleventhAvenueEnd, 18, 500);
85191
85192                 timeout(function() {
85193                     var padding = 60 * Math.pow(2, context.map().zoom() - 18);
85194                     var box = pad$2(eleventhAvenueEnd, padding, context);
85195                     reveal(box, t('intro.lines.rightclick_intersection',
85196                         { street1: t('intro.graph.name.11th-avenue'), street2: t('intro.graph.name.washington-street') })
85197                     );
85198
85199                     context.map().on('move.intro drawn.intro', function() {
85200                         var padding = 60 * Math.pow(2, context.map().zoom() - 18);
85201                         var box = pad$2(eleventhAvenueEnd, padding, context);
85202                         reveal(box, t('intro.lines.rightclick_intersection',
85203                             { street1: t('intro.graph.name.11th-avenue'), street2: t('intro.graph.name.washington-street') }),
85204                             { duration: 0 }
85205                         );
85206                     });
85207
85208                     context.on('enter.intro', function(mode) {
85209                         if (mode.id !== 'select') return;
85210                         var ids = context.selectedIDs();
85211                         if (ids.length !== 1 || ids[0] !== eleventhAvenueEndID) return;
85212
85213                         timeout(function() {
85214                             var node = selectMenuItem('split').node();
85215                             if (!node) return;
85216                             continueTo(splitIntersection);
85217                         }, 300);  // after menu visible
85218                     });
85219
85220                     context.history().on('change.intro', function() {
85221                         timeout(function() {
85222                             continueTo(deleteLines);
85223                         }, 300);  // after any transition (e.g. if user deleted intersection)
85224                     });
85225
85226                 }, 600);
85227
85228                 function continueTo(nextStep) {
85229                     context.map().on('move.intro drawn.intro', null);
85230                     context.on('enter.intro', null);
85231                     context.history().on('change.intro', null);
85232                     nextStep();
85233                 }
85234             }
85235
85236
85237             function splitIntersection() {
85238                 if (!context.hasEntity(washingtonStreetID) ||
85239                     !context.hasEntity(twelfthAvenueID) ||
85240                     !context.hasEntity(eleventhAvenueEndID)) {
85241                     return continueTo(deleteLines);
85242                 }
85243
85244                 var node = selectMenuItem('split').node();
85245                 if (!node) { return continueTo(rightClickIntersection); }
85246
85247                 var wasChanged = false;
85248                 var menuCoords = context.map().mouseCoordinates();
85249                 _washingtonSegmentID = null;
85250
85251                 revealEditMenu(menuCoords, t('intro.lines.split_intersection',
85252                     { button: icon('#iD-operation-split', 'pre-text'), street: t('intro.graph.name.washington-street') })
85253                 );
85254
85255                 context.map().on('move.intro drawn.intro', function() {
85256                     var node = selectMenuItem('split').node();
85257                     if (!wasChanged && !node) { return continueTo(rightClickIntersection); }
85258
85259                     revealEditMenu(menuCoords, t('intro.lines.split_intersection',
85260                         { button: icon('#iD-operation-split', 'pre-text'), street: t('intro.graph.name.washington-street') }),
85261                         { duration: 0 }
85262                     );
85263                 });
85264
85265                 context.history().on('change.intro', function(changed) {
85266                     wasChanged = true;
85267                     timeout(function() {
85268                         if (context.history().undoAnnotation() === t('operations.split.annotation.line')) {
85269                             _washingtonSegmentID = changed.created()[0].id;
85270                             continueTo(didSplit);
85271                         } else {
85272                             _washingtonSegmentID = null;
85273                             continueTo(retrySplit);
85274                         }
85275                     }, 300);  // after any transition (e.g. if user deleted intersection)
85276                 });
85277
85278                 function continueTo(nextStep) {
85279                     context.map().on('move.intro drawn.intro', null);
85280                     context.history().on('change.intro', null);
85281                     nextStep();
85282                 }
85283             }
85284
85285
85286             function retrySplit() {
85287                 context.enter(modeBrowse(context));
85288                 context.map().centerZoomEase(eleventhAvenueEnd, 18, 500);
85289                 var advance = function() { continueTo(rightClickIntersection); };
85290
85291                 var padding = 60 * Math.pow(2, context.map().zoom() - 18);
85292                 var box = pad$2(eleventhAvenueEnd, padding, context);
85293                 reveal(box, t('intro.lines.retry_split'),
85294                     { buttonText: t('intro.ok'), buttonCallback: advance }
85295                 );
85296
85297                 context.map().on('move.intro drawn.intro', function() {
85298                     var padding = 60 * Math.pow(2, context.map().zoom() - 18);
85299                     var box = pad$2(eleventhAvenueEnd, padding, context);
85300                     reveal(box, t('intro.lines.retry_split'),
85301                         { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
85302                     );
85303                 });
85304
85305                 function continueTo(nextStep) {
85306                     context.map().on('move.intro drawn.intro', null);
85307                     nextStep();
85308                 }
85309             }
85310
85311
85312             function didSplit() {
85313                 if (!_washingtonSegmentID ||
85314                     !context.hasEntity(_washingtonSegmentID) ||
85315                     !context.hasEntity(washingtonStreetID) ||
85316                     !context.hasEntity(twelfthAvenueID) ||
85317                     !context.hasEntity(eleventhAvenueEndID)) {
85318                     return continueTo(rightClickIntersection);
85319                 }
85320
85321                 var ids = context.selectedIDs();
85322                 var string = 'intro.lines.did_split_' + (ids.length > 1 ? 'multi' : 'single');
85323                 var street = t('intro.graph.name.washington-street');
85324
85325                 var padding = 200 * Math.pow(2, context.map().zoom() - 18);
85326                 var box = pad$2(twelfthAvenue, padding, context);
85327                 box.width = box.width / 2;
85328                 reveal(box, t(string, { street1: street, street2: street }),
85329                     { duration: 500 }
85330                 );
85331
85332                 timeout(function() {
85333                     context.map().centerZoomEase(twelfthAvenue, 18, 500);
85334
85335                     context.map().on('move.intro drawn.intro', function() {
85336                         var padding = 200 * Math.pow(2, context.map().zoom() - 18);
85337                         var box = pad$2(twelfthAvenue, padding, context);
85338                         box.width = box.width / 2;
85339                         reveal(box, t(string, { street1: street, street2: street }),
85340                             { duration: 0 }
85341                         );
85342                     });
85343                 }, 600);  // after initial reveal and curtain cut
85344
85345                 context.on('enter.intro', function() {
85346                     var ids = context.selectedIDs();
85347                     if (ids.length === 1 && ids[0] === _washingtonSegmentID) {
85348                         continueTo(multiSelect);
85349                     }
85350                 });
85351
85352                 context.history().on('change.intro', function() {
85353                     if (!_washingtonSegmentID ||
85354                         !context.hasEntity(_washingtonSegmentID) ||
85355                         !context.hasEntity(washingtonStreetID) ||
85356                         !context.hasEntity(twelfthAvenueID) ||
85357                         !context.hasEntity(eleventhAvenueEndID)) {
85358                         return continueTo(rightClickIntersection);
85359                     }
85360                 });
85361
85362                 function continueTo(nextStep) {
85363                     context.map().on('move.intro drawn.intro', null);
85364                     context.on('enter.intro', null);
85365                     context.history().on('change.intro', null);
85366                     nextStep();
85367                 }
85368             }
85369
85370
85371             function multiSelect() {
85372                 if (!_washingtonSegmentID ||
85373                     !context.hasEntity(_washingtonSegmentID) ||
85374                     !context.hasEntity(washingtonStreetID) ||
85375                     !context.hasEntity(twelfthAvenueID) ||
85376                     !context.hasEntity(eleventhAvenueEndID)) {
85377                     return continueTo(rightClickIntersection);
85378                 }
85379
85380                 var ids = context.selectedIDs();
85381                 var hasWashington = ids.indexOf(_washingtonSegmentID) !== -1;
85382                 var hasTwelfth = ids.indexOf(twelfthAvenueID) !== -1;
85383
85384                 if (hasWashington && hasTwelfth) {
85385                     return continueTo(multiRightClick);
85386                 } else if (!hasWashington && !hasTwelfth) {
85387                     return continueTo(didSplit);
85388                 }
85389
85390                 context.map().centerZoomEase(twelfthAvenue, 18, 500);
85391
85392                 timeout(function() {
85393                     var selected, other, padding, box;
85394                     if (hasWashington) {
85395                         selected = t('intro.graph.name.washington-street');
85396                         other = t('intro.graph.name.12th-avenue');
85397                         padding = 60 * Math.pow(2, context.map().zoom() - 18);
85398                         box = pad$2(twelfthAvenueEnd, padding, context);
85399                         box.width *= 3;
85400                     } else {
85401                         selected = t('intro.graph.name.12th-avenue');
85402                         other = t('intro.graph.name.washington-street');
85403                         padding = 200 * Math.pow(2, context.map().zoom() - 18);
85404                         box = pad$2(twelfthAvenue, padding, context);
85405                         box.width /= 2;
85406                     }
85407
85408                     reveal(box,
85409                         t('intro.lines.multi_select', { selected: selected, other1: other, other2: other })
85410                     );
85411
85412                     context.map().on('move.intro drawn.intro', function() {
85413                         if (hasWashington) {
85414                             selected = t('intro.graph.name.washington-street');
85415                             other = t('intro.graph.name.12th-avenue');
85416                             padding = 60 * Math.pow(2, context.map().zoom() - 18);
85417                             box = pad$2(twelfthAvenueEnd, padding, context);
85418                             box.width *= 3;
85419                         } else {
85420                             selected = t('intro.graph.name.12th-avenue');
85421                             other = t('intro.graph.name.washington-street');
85422                             padding = 200 * Math.pow(2, context.map().zoom() - 18);
85423                             box = pad$2(twelfthAvenue, padding, context);
85424                             box.width /= 2;
85425                         }
85426
85427                         reveal(box,
85428                             t('intro.lines.multi_select', { selected: selected, other1: other, other2: other }),
85429                             { duration: 0 }
85430                         );
85431                     });
85432
85433                     context.on('enter.intro', function() {
85434                         continueTo(multiSelect);
85435                     });
85436
85437                     context.history().on('change.intro', function() {
85438                         if (!_washingtonSegmentID ||
85439                             !context.hasEntity(_washingtonSegmentID) ||
85440                             !context.hasEntity(washingtonStreetID) ||
85441                             !context.hasEntity(twelfthAvenueID) ||
85442                             !context.hasEntity(eleventhAvenueEndID)) {
85443                             return continueTo(rightClickIntersection);
85444                         }
85445                     });
85446                 }, 600);
85447
85448                 function continueTo(nextStep) {
85449                     context.map().on('move.intro drawn.intro', null);
85450                     context.on('enter.intro', null);
85451                     context.history().on('change.intro', null);
85452                     nextStep();
85453                 }
85454             }
85455
85456
85457             function multiRightClick() {
85458                 if (!_washingtonSegmentID ||
85459                     !context.hasEntity(_washingtonSegmentID) ||
85460                     !context.hasEntity(washingtonStreetID) ||
85461                     !context.hasEntity(twelfthAvenueID) ||
85462                     !context.hasEntity(eleventhAvenueEndID)) {
85463                     return continueTo(rightClickIntersection);
85464                 }
85465
85466                 var padding = 200 * Math.pow(2, context.map().zoom() - 18);
85467                 var box = pad$2(twelfthAvenue, padding, context);
85468                 reveal(box, t('intro.lines.multi_rightclick'));
85469
85470                 context.map().on('move.intro drawn.intro', function() {
85471                     var padding = 200 * Math.pow(2, context.map().zoom() - 18);
85472                     var box = pad$2(twelfthAvenue, padding, context);
85473                     reveal(box, t('intro.lines.multi_rightclick'), { duration: 0 });
85474                 });
85475
85476                 d3_select(window).on('click.intro contextmenu.intro', function() {
85477                     timeout(function() {
85478                         var ids = context.selectedIDs();
85479                         if (ids.length === 2 &&
85480                             ids.indexOf(twelfthAvenueID) !== -1 &&
85481                             ids.indexOf(_washingtonSegmentID) !== -1) {
85482                                 var node = selectMenuItem('delete').node();
85483                                 if (!node) return;
85484                                 continueTo(multiDelete);
85485                         } else if (ids.length === 1 &&
85486                             ids.indexOf(_washingtonSegmentID) !== -1) {
85487                             return continueTo(multiSelect);
85488                         } else {
85489                             return continueTo(didSplit);
85490                         }
85491                     }, 300);  // after edit menu visible
85492                 }, true);
85493
85494                 context.history().on('change.intro', function() {
85495                     if (!_washingtonSegmentID ||
85496                         !context.hasEntity(_washingtonSegmentID) ||
85497                         !context.hasEntity(washingtonStreetID) ||
85498                         !context.hasEntity(twelfthAvenueID) ||
85499                         !context.hasEntity(eleventhAvenueEndID)) {
85500                         return continueTo(rightClickIntersection);
85501                     }
85502                 });
85503
85504                 function continueTo(nextStep) {
85505                     context.map().on('move.intro drawn.intro', null);
85506                     d3_select(window).on('click.intro contextmenu.intro', null, true);
85507                     context.history().on('change.intro', null);
85508                     nextStep();
85509                 }
85510             }
85511
85512
85513             function multiDelete() {
85514                 if (!_washingtonSegmentID ||
85515                     !context.hasEntity(_washingtonSegmentID) ||
85516                     !context.hasEntity(washingtonStreetID) ||
85517                     !context.hasEntity(twelfthAvenueID) ||
85518                     !context.hasEntity(eleventhAvenueEndID)) {
85519                     return continueTo(rightClickIntersection);
85520                 }
85521
85522                 var node = selectMenuItem('delete').node();
85523                 if (!node) return continueTo(multiRightClick);
85524
85525                 var menuCoords = context.map().mouseCoordinates();
85526                 revealEditMenu(menuCoords,
85527                     t('intro.lines.multi_delete', { button: icon('#iD-operation-delete', 'pre-text') })
85528                 );
85529
85530                 context.map().on('move.intro drawn.intro', function() {
85531                     revealEditMenu(menuCoords,
85532                         t('intro.lines.multi_delete', { button: icon('#iD-operation-delete', 'pre-text') }),
85533                         { duration: 0 }
85534                     );
85535                 });
85536
85537                 context.on('exit.intro', function() {
85538                     if (context.hasEntity(_washingtonSegmentID) || context.hasEntity(twelfthAvenueID)) {
85539                         return continueTo(multiSelect);  // left select mode but roads still exist
85540                     }
85541                 });
85542
85543                 context.history().on('change.intro', function() {
85544                     if (context.hasEntity(_washingtonSegmentID) || context.hasEntity(twelfthAvenueID)) {
85545                         continueTo(retryDelete);         // changed something but roads still exist
85546                     } else {
85547                         continueTo(play);
85548                     }
85549                 });
85550
85551                 function continueTo(nextStep) {
85552                     context.map().on('move.intro drawn.intro', null);
85553                     context.on('exit.intro', null);
85554                     context.history().on('change.intro', null);
85555                     nextStep();
85556                 }
85557             }
85558
85559
85560             function retryDelete() {
85561                 context.enter(modeBrowse(context));
85562
85563                 var padding = 200 * Math.pow(2, context.map().zoom() - 18);
85564                 var box = pad$2(twelfthAvenue, padding, context);
85565                 reveal(box, t('intro.lines.retry_delete'), {
85566                     buttonText: t('intro.ok'),
85567                     buttonCallback: function() { continueTo(multiSelect); }
85568                 });
85569
85570                 function continueTo(nextStep) {
85571                     nextStep();
85572                 }
85573             }
85574
85575
85576             function play() {
85577                 dispatch$1.call('done');
85578                 reveal('#id-container',
85579                     t('intro.lines.play', { next: t('intro.buildings.title') }), {
85580                         tooltipBox: '.intro-nav-wrap .chapter-building',
85581                         buttonText: t('intro.ok'),
85582                         buttonCallback: function() { reveal('#id-container'); }
85583                     }
85584                 );
85585            }
85586
85587
85588             chapter.enter = function() {
85589                 addLine();
85590             };
85591
85592
85593             chapter.exit = function() {
85594                 timeouts.forEach(window.clearTimeout);
85595                 d3_select(window).on('mousedown.intro', null, true);
85596                 context.on('enter.intro exit.intro', null);
85597                 context.map().on('move.intro drawn.intro', null);
85598                 context.history().on('change.intro', null);
85599                 d3_select('.inspector-wrap').on('wheel.intro', null);
85600                 d3_select('.preset-list-button').on('click.intro', null);
85601             };
85602
85603
85604             chapter.restart = function() {
85605                 chapter.exit();
85606                 chapter.enter();
85607             };
85608
85609
85610             return utilRebind(chapter, dispatch$1, 'on');
85611         }
85612
85613         function uiIntroBuilding(context, reveal) {
85614             var dispatch$1 = dispatch('done');
85615             var house = [-85.62815, 41.95638];
85616             var tank = [-85.62732, 41.95347];
85617             var buildingCatetory = context.presets().item('category-building');
85618             var housePreset = context.presets().item('building/house');
85619             var tankPreset = context.presets().item('man_made/storage_tank');
85620             var timeouts = [];
85621             var _houseID = null;
85622             var _tankID = null;
85623
85624
85625             var chapter = {
85626                 title: 'intro.buildings.title'
85627             };
85628
85629
85630             function timeout(f, t) {
85631                 timeouts.push(window.setTimeout(f, t));
85632             }
85633
85634
85635             function eventCancel() {
85636                 event.stopPropagation();
85637                 event.preventDefault();
85638             }
85639
85640
85641             function revealHouse(center, text, options) {
85642                 var padding = 160 * Math.pow(2, context.map().zoom() - 20);
85643                 var box = pad$2(center, padding, context);
85644                 reveal(box, text, options);
85645             }
85646
85647
85648             function revealTank(center, text, options) {
85649                 var padding = 190 * Math.pow(2, context.map().zoom() - 19.5);
85650                 var box = pad$2(center, padding, context);
85651                 reveal(box, text, options);
85652             }
85653
85654
85655             function revealEditMenu(loc, text, options) {
85656                 var rect = context.surfaceRect();
85657                 var point = context.curtainProjection(loc);
85658                 var pad = 40;
85659                 var width = 250 + (2 * pad);
85660                 var height = 350;
85661                 var startX = rect.left + point[0];
85662                 var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
85663                 var box = {
85664                     left: left,
85665                     top: point[1] + rect.top - 60,
85666                     width: width,
85667                     height: height
85668                 };
85669                 reveal(box, text, options);
85670             }
85671
85672
85673             function addHouse() {
85674                 context.enter(modeBrowse(context));
85675                 context.history().reset('initial');
85676                 _houseID = null;
85677
85678                 var msec = transitionTime(house, context.map().center());
85679                 if (msec) { reveal(null, null, { duration: 0 }); }
85680                 context.map().centerZoomEase(house, 19, msec);
85681
85682                 timeout(function() {
85683                     var tooltip = reveal('button.add-area',
85684                         t('intro.buildings.add_building', { button: icon('#iD-icon-area', 'pre-text') }));
85685
85686                     tooltip.selectAll('.tooltip-inner')
85687                         .insert('svg', 'span')
85688                         .attr('class', 'tooltip-illustration')
85689                         .append('use')
85690                         .attr('xlink:href', '#iD-graphic-buildings');
85691
85692                     context.on('enter.intro', function(mode) {
85693                         if (mode.id !== 'add-area') return;
85694                         continueTo(startHouse);
85695                     });
85696                 }, msec + 100);
85697
85698                 function continueTo(nextStep) {
85699                     context.on('enter.intro', null);
85700                     nextStep();
85701                 }
85702             }
85703
85704
85705             function startHouse() {
85706                 if (context.mode().id !== 'add-area') {
85707                     return continueTo(addHouse);
85708                 }
85709
85710                 _houseID = null;
85711                 context.map().zoomEase(20, 500);
85712
85713                 timeout(function() {
85714                     revealHouse(house, t('intro.buildings.start_building'));
85715
85716                     context.map().on('move.intro drawn.intro', function() {
85717                         revealHouse(house, t('intro.buildings.start_building'), { duration: 0 });
85718                     });
85719
85720                     context.on('enter.intro', function(mode) {
85721                         if (mode.id !== 'draw-area') return chapter.restart();
85722                         continueTo(continueHouse);
85723                     });
85724
85725                 }, 550);  // after easing
85726
85727                 function continueTo(nextStep) {
85728                     context.map().on('move.intro drawn.intro', null);
85729                     context.on('enter.intro', null);
85730                     nextStep();
85731                 }
85732             }
85733
85734
85735             function continueHouse() {
85736                 if (context.mode().id !== 'draw-area') {
85737                     return continueTo(addHouse);
85738                 }
85739
85740                 _houseID = null;
85741
85742                 revealHouse(house, t('intro.buildings.continue_building'));
85743
85744                 context.map().on('move.intro drawn.intro', function() {
85745                     revealHouse(house, t('intro.buildings.continue_building'), { duration: 0 });
85746                 });
85747
85748                 context.on('enter.intro', function(mode) {
85749                     if (mode.id === 'draw-area') {
85750                         return;
85751                     } else if (mode.id === 'select') {
85752                         var graph = context.graph();
85753                         var way = context.entity(context.selectedIDs()[0]);
85754                         var nodes = graph.childNodes(way);
85755                         var points = utilArrayUniq(nodes)
85756                             .map(function(n) { return context.projection(n.loc); });
85757
85758                         if (isMostlySquare(points)) {
85759                             _houseID = way.id;
85760                             return continueTo(chooseCategoryBuilding);
85761                         } else {
85762                             return continueTo(retryHouse);
85763                         }
85764
85765                     } else {
85766                         return chapter.restart();
85767                     }
85768                 });
85769
85770                 function continueTo(nextStep) {
85771                     context.map().on('move.intro drawn.intro', null);
85772                     context.on('enter.intro', null);
85773                     nextStep();
85774                 }
85775             }
85776
85777
85778             function retryHouse() {
85779                 var onClick = function() { continueTo(addHouse); };
85780
85781                 revealHouse(house, t('intro.buildings.retry_building'),
85782                     { buttonText: t('intro.ok'), buttonCallback: onClick }
85783                 );
85784
85785                 context.map().on('move.intro drawn.intro', function() {
85786                     revealHouse(house, t('intro.buildings.retry_building'),
85787                         { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
85788                     );
85789                 });
85790
85791                 function continueTo(nextStep) {
85792                     context.map().on('move.intro drawn.intro', null);
85793                     nextStep();
85794                 }
85795             }
85796
85797
85798             function chooseCategoryBuilding() {
85799                 if (!_houseID || !context.hasEntity(_houseID)) {
85800                     return addHouse();
85801                 }
85802                 var ids = context.selectedIDs();
85803                 if (context.mode().id !== 'select' || !ids.length || ids[0] !== _houseID) {
85804                     context.enter(modeSelect(context, [_houseID]));
85805                 }
85806
85807                 // disallow scrolling
85808                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
85809
85810                 timeout(function() {
85811                     // reset pane, in case user somehow happened to change it..
85812                     d3_select('.inspector-wrap .panewrap').style('right', '-100%');
85813
85814                     var button = d3_select('.preset-category-building .preset-list-button');
85815
85816                     reveal(button.node(),
85817                         t('intro.buildings.choose_category_building', { category: buildingCatetory.name() })
85818                     );
85819
85820                     button.on('click.intro', function() {
85821                         button.on('click.intro', null);
85822                         continueTo(choosePresetHouse);
85823                     });
85824
85825                 }, 400);  // after preset list pane visible..
85826
85827
85828                 context.on('enter.intro', function(mode) {
85829                     if (!_houseID || !context.hasEntity(_houseID)) {
85830                         return continueTo(addHouse);
85831                     }
85832                     var ids = context.selectedIDs();
85833                     if (mode.id !== 'select' || !ids.length || ids[0] !== _houseID) {
85834                         return continueTo(chooseCategoryBuilding);
85835                     }
85836                 });
85837
85838                 function continueTo(nextStep) {
85839                     d3_select('.inspector-wrap').on('wheel.intro', null);
85840                     d3_select('.preset-list-button').on('click.intro', null);
85841                     context.on('enter.intro', null);
85842                     nextStep();
85843                 }
85844             }
85845
85846
85847             function choosePresetHouse() {
85848                 if (!_houseID || !context.hasEntity(_houseID)) {
85849                     return addHouse();
85850                 }
85851                 var ids = context.selectedIDs();
85852                 if (context.mode().id !== 'select' || !ids.length || ids[0] !== _houseID) {
85853                     context.enter(modeSelect(context, [_houseID]));
85854                 }
85855
85856                 // disallow scrolling
85857                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
85858
85859                 timeout(function() {
85860                     // reset pane, in case user somehow happened to change it..
85861                     d3_select('.inspector-wrap .panewrap').style('right', '-100%');
85862
85863                     var button = d3_select('.preset-building-house .preset-list-button');
85864
85865                     reveal(button.node(),
85866                         t('intro.buildings.choose_preset_house', { preset: housePreset.name() }),
85867                         { duration: 300 }
85868                     );
85869
85870                     button.on('click.intro', function() {
85871                         button.on('click.intro', null);
85872                         continueTo(closeEditorHouse);
85873                     });
85874
85875                 }, 400);  // after preset list pane visible..
85876
85877                 context.on('enter.intro', function(mode) {
85878                     if (!_houseID || !context.hasEntity(_houseID)) {
85879                         return continueTo(addHouse);
85880                     }
85881                     var ids = context.selectedIDs();
85882                     if (mode.id !== 'select' || !ids.length || ids[0] !== _houseID) {
85883                         return continueTo(chooseCategoryBuilding);
85884                     }
85885                 });
85886
85887                 function continueTo(nextStep) {
85888                     d3_select('.inspector-wrap').on('wheel.intro', null);
85889                     d3_select('.preset-list-button').on('click.intro', null);
85890                     context.on('enter.intro', null);
85891                     nextStep();
85892                 }
85893             }
85894
85895
85896             function closeEditorHouse() {
85897                 if (!_houseID || !context.hasEntity(_houseID)) {
85898                     return addHouse();
85899                 }
85900                 var ids = context.selectedIDs();
85901                 if (context.mode().id !== 'select' || !ids.length || ids[0] !== _houseID) {
85902                     context.enter(modeSelect(context, [_houseID]));
85903                 }
85904
85905                 context.history().checkpoint('hasHouse');
85906
85907                 context.on('exit.intro', function() {
85908                     continueTo(rightClickHouse);
85909                 });
85910
85911                 timeout(function() {
85912                     reveal('.entity-editor-pane',
85913                         t('intro.buildings.close', { button: icon('#iD-icon-apply', 'pre-text') })
85914                     );
85915                 }, 500);
85916
85917                 function continueTo(nextStep) {
85918                     context.on('exit.intro', null);
85919                     nextStep();
85920                 }
85921             }
85922
85923
85924             function rightClickHouse() {
85925                 if (!_houseID) return chapter.restart();
85926
85927                 context.enter(modeBrowse(context));
85928                 context.history().reset('hasHouse');
85929                 var zoom = context.map().zoom();
85930                 if (zoom < 20) {
85931                     zoom = 20;
85932                 }
85933                 context.map().centerZoomEase(house, zoom, 500);
85934
85935                 context.on('enter.intro', function(mode) {
85936                     if (mode.id !== 'select') return;
85937                     var ids = context.selectedIDs();
85938                     if (ids.length !== 1 || ids[0] !== _houseID) return;
85939
85940                     timeout(function() {
85941                         var node = selectMenuItem('orthogonalize').node();
85942                         if (!node) return;
85943                         continueTo(clickSquare);
85944                     }, 300);  // after menu visible
85945                 });
85946
85947                 context.map().on('move.intro drawn.intro', function() {
85948                     revealHouse(house, t('intro.buildings.rightclick_building'), { duration: 0 });
85949                 });
85950
85951                 context.history().on('change.intro', function() {
85952                     continueTo(rightClickHouse);
85953                 });
85954
85955                 function continueTo(nextStep) {
85956                     context.on('enter.intro', null);
85957                     context.map().on('move.intro drawn.intro', null);
85958                     context.history().on('change.intro', null);
85959                     nextStep();
85960                 }
85961             }
85962
85963
85964             function clickSquare() {
85965                 if (!_houseID) return chapter.restart();
85966                 var entity = context.hasEntity(_houseID);
85967                 if (!entity) return continueTo(rightClickHouse);
85968
85969                 var node = selectMenuItem('orthogonalize').node();
85970                 if (!node) { return continueTo(rightClickHouse); }
85971
85972                 var wasChanged = false;
85973                 var menuCoords = context.map().mouseCoordinates();
85974
85975                 revealEditMenu(menuCoords,
85976                     t('intro.buildings.square_building', { button: icon('#iD-operation-orthogonalize', 'pre-text') })
85977                 );
85978
85979                 context.on('enter.intro', function(mode) {
85980                     if (mode.id === 'browse') {
85981                         continueTo(rightClickHouse);
85982                     } else if (mode.id === 'move' || mode.id === 'rotate') {
85983                         continueTo(retryClickSquare);
85984                     }
85985                 });
85986
85987                 context.map().on('move.intro drawn.intro', function() {
85988                     var node = selectMenuItem('orthogonalize').node();
85989                     if (!wasChanged && !node) { return continueTo(rightClickHouse); }
85990
85991                     revealEditMenu(menuCoords,
85992                         t('intro.buildings.square_building', { button: icon('#iD-operation-orthogonalize', 'pre-text') }),
85993                         { duration: 0 }
85994                     );
85995                 });
85996
85997                 context.history().on('change.intro', function() {
85998                     wasChanged = true;
85999                     context.history().on('change.intro', null);
86000
86001                     // Something changed.  Wait for transition to complete and check undo annotation.
86002                     timeout(function() {
86003                         if (context.history().undoAnnotation() === t('operations.orthogonalize.annotation.area')) {
86004                             continueTo(doneSquare);
86005                         } else {
86006                             continueTo(retryClickSquare);
86007                         }
86008                     }, 500);  // after transitioned actions
86009                 });
86010
86011                 function continueTo(nextStep) {
86012                     context.on('enter.intro', null);
86013                     context.map().on('move.intro drawn.intro', null);
86014                     context.history().on('change.intro', null);
86015                     nextStep();
86016                 }
86017             }
86018
86019
86020             function retryClickSquare() {
86021                 context.enter(modeBrowse(context));
86022
86023                 revealHouse(house, t('intro.buildings.retry_square'), {
86024                     buttonText: t('intro.ok'),
86025                     buttonCallback: function() { continueTo(rightClickHouse); }
86026                 });
86027
86028                 function continueTo(nextStep) {
86029                     nextStep();
86030                 }
86031             }
86032
86033
86034             function doneSquare() {
86035                 context.history().checkpoint('doneSquare');
86036
86037                 revealHouse(house, t('intro.buildings.done_square'), {
86038                     buttonText: t('intro.ok'),
86039                     buttonCallback: function() { continueTo(addTank); }
86040                 });
86041
86042                 function continueTo(nextStep) {
86043                     nextStep();
86044                 }
86045             }
86046
86047
86048             function addTank() {
86049                 context.enter(modeBrowse(context));
86050                 context.history().reset('doneSquare');
86051                 _tankID = null;
86052
86053                 var msec = transitionTime(tank, context.map().center());
86054                 if (msec) { reveal(null, null, { duration: 0 }); }
86055                 context.map().centerZoomEase(tank, 19.5, msec);
86056
86057                 timeout(function() {
86058                     reveal('button.add-area',
86059                         t('intro.buildings.add_tank', { button: icon('#iD-icon-area', 'pre-text') })
86060                     );
86061
86062                     context.on('enter.intro', function(mode) {
86063                         if (mode.id !== 'add-area') return;
86064                         continueTo(startTank);
86065                     });
86066                 }, msec + 100);
86067
86068                 function continueTo(nextStep) {
86069                     context.on('enter.intro', null);
86070                     nextStep();
86071                 }
86072             }
86073
86074
86075             function startTank() {
86076                 if (context.mode().id !== 'add-area') {
86077                     return continueTo(addTank);
86078                 }
86079
86080                 _tankID = null;
86081
86082                 timeout(function() {
86083                     revealTank(tank, t('intro.buildings.start_tank'));
86084
86085                     context.map().on('move.intro drawn.intro', function() {
86086                         revealTank(tank, t('intro.buildings.start_tank'), { duration: 0 });
86087                     });
86088
86089                     context.on('enter.intro', function(mode) {
86090                         if (mode.id !== 'draw-area') return chapter.restart();
86091                         continueTo(continueTank);
86092                     });
86093
86094                 }, 550);  // after easing
86095
86096                 function continueTo(nextStep) {
86097                     context.map().on('move.intro drawn.intro', null);
86098                     context.on('enter.intro', null);
86099                     nextStep();
86100                 }
86101             }
86102
86103
86104             function continueTank() {
86105                 if (context.mode().id !== 'draw-area') {
86106                     return continueTo(addTank);
86107                 }
86108
86109                 _tankID = null;
86110
86111                 revealTank(tank, t('intro.buildings.continue_tank'));
86112
86113                 context.map().on('move.intro drawn.intro', function() {
86114                     revealTank(tank, t('intro.buildings.continue_tank'), { duration: 0 });
86115                 });
86116
86117                 context.on('enter.intro', function(mode) {
86118                     if (mode.id === 'draw-area') {
86119                         return;
86120                     } else if (mode.id === 'select') {
86121                         _tankID = context.selectedIDs()[0];
86122                         return continueTo(searchPresetTank);
86123                     } else {
86124                         return continueTo(addTank);
86125                     }
86126                 });
86127
86128                 function continueTo(nextStep) {
86129                     context.map().on('move.intro drawn.intro', null);
86130                     context.on('enter.intro', null);
86131                     nextStep();
86132                 }
86133             }
86134
86135
86136             function searchPresetTank() {
86137                 if (!_tankID || !context.hasEntity(_tankID)) {
86138                     return addTank();
86139                 }
86140                 var ids = context.selectedIDs();
86141                 if (context.mode().id !== 'select' || !ids.length || ids[0] !== _tankID) {
86142                     context.enter(modeSelect(context, [_tankID]));
86143                 }
86144
86145                 // disallow scrolling
86146                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
86147
86148                 timeout(function() {
86149                     // reset pane, in case user somehow happened to change it..
86150                     d3_select('.inspector-wrap .panewrap').style('right', '-100%');
86151
86152                     d3_select('.preset-search-input')
86153                         .on('keydown.intro', null)
86154                         .on('keyup.intro', checkPresetSearch);
86155
86156                     reveal('.preset-search-input',
86157                         t('intro.buildings.search_tank', { preset: tankPreset.name() })
86158                     );
86159                 }, 400);  // after preset list pane visible..
86160
86161                 context.on('enter.intro', function(mode) {
86162                     if (!_tankID || !context.hasEntity(_tankID)) {
86163                         return continueTo(addTank);
86164                     }
86165
86166                     var ids = context.selectedIDs();
86167                     if (mode.id !== 'select' || !ids.length || ids[0] !== _tankID) {
86168                         // keep the user's area selected..
86169                         context.enter(modeSelect(context, [_tankID]));
86170
86171                         // reset pane, in case user somehow happened to change it..
86172                         d3_select('.inspector-wrap .panewrap').style('right', '-100%');
86173                         // disallow scrolling
86174                         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
86175
86176                         d3_select('.preset-search-input')
86177                             .on('keydown.intro', null)
86178                             .on('keyup.intro', checkPresetSearch);
86179
86180                         reveal('.preset-search-input',
86181                             t('intro.buildings.search_tank', { preset: tankPreset.name() })
86182                         );
86183
86184                         context.history().on('change.intro', null);
86185                     }
86186                 });
86187
86188                 function checkPresetSearch() {
86189                     var first = d3_select('.preset-list-item:first-child');
86190
86191                     if (first.classed('preset-man_made-storage_tank')) {
86192                         reveal(first.select('.preset-list-button').node(),
86193                             t('intro.buildings.choose_tank', { preset: tankPreset.name() }),
86194                             { duration: 300 }
86195                         );
86196
86197                         d3_select('.preset-search-input')
86198                             .on('keydown.intro', eventCancel, true)
86199                             .on('keyup.intro', null);
86200
86201                         context.history().on('change.intro', function() {
86202                             continueTo(closeEditorTank);
86203                         });
86204                     }
86205                 }
86206
86207                 function continueTo(nextStep) {
86208                     d3_select('.inspector-wrap').on('wheel.intro', null);
86209                     context.on('enter.intro', null);
86210                     context.history().on('change.intro', null);
86211                     d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
86212                     nextStep();
86213                 }
86214             }
86215
86216
86217             function closeEditorTank() {
86218                 if (!_tankID || !context.hasEntity(_tankID)) {
86219                     return addTank();
86220                 }
86221                 var ids = context.selectedIDs();
86222                 if (context.mode().id !== 'select' || !ids.length || ids[0] !== _tankID) {
86223                     context.enter(modeSelect(context, [_tankID]));
86224                 }
86225
86226                 context.history().checkpoint('hasTank');
86227
86228                 context.on('exit.intro', function() {
86229                     continueTo(rightClickTank);
86230                 });
86231
86232                 timeout(function() {
86233                     reveal('.entity-editor-pane',
86234                         t('intro.buildings.close', { button: icon('#iD-icon-apply', 'pre-text') })
86235                     );
86236                 }, 500);
86237
86238                 function continueTo(nextStep) {
86239                     context.on('exit.intro', null);
86240                     nextStep();
86241                 }
86242             }
86243
86244
86245             function rightClickTank() {
86246                 if (!_tankID) return continueTo(addTank);
86247
86248                 context.enter(modeBrowse(context));
86249                 context.history().reset('hasTank');
86250                 context.map().centerEase(tank, 500);
86251
86252                 timeout(function() {
86253                     context.on('enter.intro', function(mode) {
86254                         if (mode.id !== 'select') return;
86255                         var ids = context.selectedIDs();
86256                         if (ids.length !== 1 || ids[0] !== _tankID) return;
86257
86258                         timeout(function() {
86259                             var node = selectMenuItem('circularize').node();
86260                             if (!node) return;
86261                             continueTo(clickCircle);
86262                         }, 300);  // after menu visible
86263                     });
86264
86265                     revealTank(tank, t('intro.buildings.rightclick_tank'));
86266
86267                     context.map().on('move.intro drawn.intro', function() {
86268                         revealTank(tank, t('intro.buildings.rightclick_tank'), { duration: 0 });
86269                     });
86270
86271                     context.history().on('change.intro', function() {
86272                         continueTo(rightClickTank);
86273                     });
86274
86275                 }, 600);
86276
86277                 function continueTo(nextStep) {
86278                     context.on('enter.intro', null);
86279                     context.map().on('move.intro drawn.intro', null);
86280                     context.history().on('change.intro', null);
86281                     nextStep();
86282                 }
86283             }
86284
86285
86286             function clickCircle() {
86287                 if (!_tankID) return chapter.restart();
86288                 var entity = context.hasEntity(_tankID);
86289                 if (!entity) return continueTo(rightClickTank);
86290
86291                 var node = selectMenuItem('circularize').node();
86292                 if (!node) { return continueTo(rightClickTank); }
86293
86294                 var wasChanged = false;
86295                 var menuCoords = context.map().mouseCoordinates();
86296
86297                 revealEditMenu(menuCoords,
86298                     t('intro.buildings.circle_tank', { button: icon('#iD-operation-circularize', 'pre-text') })
86299                 );
86300
86301                 context.on('enter.intro', function(mode) {
86302                     if (mode.id === 'browse') {
86303                         continueTo(rightClickTank);
86304                     } else if (mode.id === 'move' || mode.id === 'rotate') {
86305                         continueTo(retryClickCircle);
86306                     }
86307                 });
86308
86309                 context.map().on('move.intro drawn.intro', function() {
86310                     var node = selectMenuItem('circularize').node();
86311                     if (!wasChanged && !node) { return continueTo(rightClickTank); }
86312
86313                     revealEditMenu(menuCoords,
86314                         t('intro.buildings.circle_tank', { button: icon('#iD-operation-circularize', 'pre-text') }),
86315                         { duration: 0 }
86316                     );
86317                 });
86318
86319                 context.history().on('change.intro', function() {
86320                     wasChanged = true;
86321                     context.history().on('change.intro', null);
86322
86323                     // Something changed.  Wait for transition to complete and check undo annotation.
86324                     timeout(function() {
86325                         if (context.history().undoAnnotation() === t('operations.circularize.annotation.area')) {
86326                             continueTo(play);
86327                         } else {
86328                             continueTo(retryClickCircle);
86329                         }
86330                     }, 500);  // after transitioned actions
86331                 });
86332
86333                 function continueTo(nextStep) {
86334                     context.on('enter.intro', null);
86335                     context.map().on('move.intro drawn.intro', null);
86336                     context.history().on('change.intro', null);
86337                     nextStep();
86338                 }
86339             }
86340
86341
86342             function retryClickCircle() {
86343                 context.enter(modeBrowse(context));
86344
86345                 revealTank(tank, t('intro.buildings.retry_circle'), {
86346                     buttonText: t('intro.ok'),
86347                     buttonCallback: function() { continueTo(rightClickTank); }
86348                 });
86349
86350                 function continueTo(nextStep) {
86351                     nextStep();
86352                 }
86353             }
86354
86355
86356             function play() {
86357                 dispatch$1.call('done');
86358                 reveal('#id-container',
86359                     t('intro.buildings.play', { next: t('intro.startediting.title') }), {
86360                         tooltipBox: '.intro-nav-wrap .chapter-startEditing',
86361                         buttonText: t('intro.ok'),
86362                         buttonCallback: function() { reveal('#id-container'); }
86363                     }
86364                 );
86365             }
86366
86367
86368             chapter.enter = function() {
86369                 addHouse();
86370             };
86371
86372
86373             chapter.exit = function() {
86374                 timeouts.forEach(window.clearTimeout);
86375                 context.on('enter.intro exit.intro', null);
86376                 context.map().on('move.intro drawn.intro', null);
86377                 context.history().on('change.intro', null);
86378                 d3_select('.inspector-wrap').on('wheel.intro', null);
86379                 d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
86380                 d3_select('.more-fields .combobox-input').on('click.intro', null);
86381             };
86382
86383
86384             chapter.restart = function() {
86385                 chapter.exit();
86386                 chapter.enter();
86387             };
86388
86389
86390             return utilRebind(chapter, dispatch$1, 'on');
86391         }
86392
86393         function uiIntroStartEditing(context, reveal) {
86394             var dispatch$1 = dispatch('done', 'startEditing');
86395             var modalSelection = d3_select(null);
86396
86397
86398             var chapter = {
86399                 title: 'intro.startediting.title'
86400             };
86401
86402             function showHelp() {
86403                 reveal('.map-control.help-control',
86404                     t('intro.startediting.help', { button: icon('#iD-icon-help', 'pre-text'), key: t('help.key') }), {
86405                         buttonText: t('intro.ok'),
86406                         buttonCallback: function() { shortcuts(); }
86407                     }
86408                 );
86409             }
86410
86411             function shortcuts() {
86412                 reveal('.map-control.help-control',
86413                     t('intro.startediting.shortcuts', { key: t('shortcuts.toggle.key') }), {
86414                         buttonText: t('intro.ok'),
86415                         buttonCallback: function() { showSave(); }
86416                     }
86417                 );
86418             }
86419
86420             function showSave() {
86421                 d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
86422                 reveal('#bar button.save',
86423                     t('intro.startediting.save'), {
86424                         buttonText: t('intro.ok'),
86425                         buttonCallback: function() { showStart(); }
86426                     }
86427                 );
86428             }
86429
86430             function showStart() {
86431                 d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
86432
86433                 modalSelection = uiModal(context.container());
86434
86435                 modalSelection.select('.modal')
86436                     .attr('class', 'modal-splash modal col6');
86437
86438                 modalSelection.selectAll('.close').remove();
86439
86440                 var startbutton = modalSelection.select('.content')
86441                     .attr('class', 'fillL')
86442                     .append('button')
86443                         .attr('class', 'modal-section huge-modal-button')
86444                         .on('click', function() {
86445                             modalSelection.remove();
86446                         });
86447
86448                     startbutton
86449                         .append('svg')
86450                         .attr('class', 'illustration')
86451                         .append('use')
86452                         .attr('xlink:href', '#iD-logo-walkthrough');
86453
86454                     startbutton
86455                         .append('h2')
86456                         .text(t('intro.startediting.start'));
86457
86458                 dispatch$1.call('startEditing');
86459             }
86460
86461
86462             chapter.enter = function() {
86463                 showHelp();
86464             };
86465
86466
86467             chapter.exit = function() {
86468                 modalSelection.remove();
86469                 d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
86470             };
86471
86472
86473             return utilRebind(chapter, dispatch$1, 'on');
86474         }
86475
86476         var chapterUi = {
86477             welcome: uiIntroWelcome,
86478             navigation: uiIntroNavigation,
86479             point: uiIntroPoint,
86480             area: uiIntroArea,
86481             line: uiIntroLine,
86482             building: uiIntroBuilding,
86483             startEditing: uiIntroStartEditing
86484         };
86485
86486         var chapterFlow = [
86487             'welcome',
86488             'navigation',
86489             'point',
86490             'area',
86491             'line',
86492             'building',
86493             'startEditing'
86494         ];
86495
86496
86497         function uiIntro(context) {
86498             var INTRO_IMAGERY = 'EsriWorldImageryClarity';
86499             var introGraph = {};
86500             var _currChapter;
86501
86502             // create entities for intro graph and localize names
86503             for (var id in dataIntroGraph) {
86504                 introGraph[id] = osmEntity(localize(dataIntroGraph[id]));
86505             }
86506
86507
86508             function intro(selection) {
86509                 context.enter(modeBrowse(context));
86510
86511                 // Save current map state
86512                 var osm = context.connection();
86513                 var history = context.history().toJSON();
86514                 var hash = window.location.hash;
86515                 var center = context.map().center();
86516                 var zoom = context.map().zoom();
86517                 var background = context.background().baseLayerSource();
86518                 var overlays = context.background().overlayLayerSources();
86519                 var opacity = d3_selectAll('#map .layer-background').style('opacity');
86520                 var caches = osm && osm.caches();
86521                 var baseEntities = context.history().graph().base().entities;
86522                 var countryCode = services$1.geocoder.countryCode;
86523
86524                 // Show sidebar and disable the sidebar resizing button
86525                 // (this needs to be before `context.inIntro(true)`)
86526                 context.ui().sidebar.expand();
86527                 d3_selectAll('button.sidebar-toggle').classed('disabled', true);
86528
86529                 // Block saving
86530                 context.inIntro(true);
86531
86532                 // Load semi-real data used in intro
86533                 if (osm) { osm.toggle(false).reset(); }
86534                 context.history().reset();
86535                 context.history().merge(Object.values(coreGraph().load(introGraph).entities));
86536                 context.history().checkpoint('initial');
86537
86538                 // Setup imagery
86539                 var imagery = context.background().findSource(INTRO_IMAGERY);
86540                 if (imagery) {
86541                     context.background().baseLayerSource(imagery);
86542                 } else {
86543                     context.background().bing();
86544                 }
86545                 overlays.forEach(function(d) {
86546                     context.background().toggleOverlayLayer(d);
86547                 });
86548
86549                 // Setup data layers (only OSM)
86550                 var layers = context.layers();
86551                 layers.all().forEach(function(item) {
86552                     // if the layer has the function `enabled`
86553                     if (typeof item.layer.enabled === 'function') {
86554                         item.layer.enabled(item.id === 'osm');
86555                     }
86556                 });
86557
86558                 // Mock geocoder
86559                 services$1.geocoder.countryCode = function(location, callback) {
86560                     callback(null, t('intro.graph.countrycode'));
86561                 };
86562
86563
86564                 d3_selectAll('#map .layer-background').style('opacity', 1);
86565
86566                 var curtain = uiCurtain();
86567                 selection.call(curtain);
86568
86569                 // Store that the user started the walkthrough..
86570                 context.storage('walkthrough_started', 'yes');
86571
86572                 // Restore previous walkthrough progress..
86573                 var storedProgress = context.storage('walkthrough_progress') || '';
86574                 var progress = storedProgress.split(';').filter(Boolean);
86575
86576                 var chapters = chapterFlow.map(function(chapter, i) {
86577                     var s = chapterUi[chapter](context, curtain.reveal)
86578                         .on('done', function() {
86579                             context.presets().init();  // clear away "recent" presets
86580
86581                             buttons.filter(function(d) {
86582                                 return d.title === s.title;
86583                             }).classed('finished', true);
86584
86585                             if (i < chapterFlow.length - 1) {
86586                                 var next = chapterFlow[i + 1];
86587                                 d3_select('button.chapter-' + next)
86588                                     .classed('next', true);
86589                             }
86590
86591                             // Store walkthrough progress..
86592                             progress.push(chapter);
86593                             context.storage('walkthrough_progress', utilArrayUniq(progress).join(';'));
86594                         });
86595                     return s;
86596                 });
86597
86598                 chapters[chapters.length - 1].on('startEditing', function() {
86599                     // Store walkthrough progress..
86600                     progress.push('startEditing');
86601                     context.storage('walkthrough_progress', utilArrayUniq(progress).join(';'));
86602
86603                     // Store if walkthrough is completed..
86604                     var incomplete = utilArrayDifference(chapterFlow, progress);
86605                     if (!incomplete.length) {
86606                         context.storage('walkthrough_completed', 'yes');
86607                     }
86608
86609                     curtain.remove();
86610                     navwrap.remove();
86611                     d3_selectAll('#map .layer-background').style('opacity', opacity);
86612                     d3_selectAll('button.sidebar-toggle').classed('disabled', false);
86613                     if (osm) { osm.toggle(true).reset().caches(caches); }
86614                     context.history().reset().merge(Object.values(baseEntities));
86615                     context.background().baseLayerSource(background);
86616                     overlays.forEach(function(d) { context.background().toggleOverlayLayer(d); });
86617                     if (history) { context.history().fromJSON(history, false); }
86618                     context.map().centerZoom(center, zoom);
86619                     window.location.replace(hash);
86620                     services$1.geocoder.countryCode = countryCode;
86621                     context.inIntro(false);
86622                 });
86623
86624                 var navwrap = selection
86625                     .append('div')
86626                     .attr('class', 'intro-nav-wrap fillD');
86627
86628                 navwrap
86629                     .append('svg')
86630                     .attr('class', 'intro-nav-wrap-logo')
86631                     .append('use')
86632                     .attr('xlink:href', '#iD-logo-walkthrough');
86633
86634                 var buttonwrap = navwrap
86635                     .append('div')
86636                     .attr('class', 'joined')
86637                     .selectAll('button.chapter');
86638
86639                 var buttons = buttonwrap
86640                     .data(chapters)
86641                     .enter()
86642                     .append('button')
86643                     .attr('class', function(d, i) { return 'chapter chapter-' + chapterFlow[i]; })
86644                     .on('click', enterChapter);
86645
86646                 buttons
86647                     .append('span')
86648                     .text(function(d) { return t(d.title); });
86649
86650                 buttons
86651                     .append('span')
86652                     .attr('class', 'status')
86653                     .call(svgIcon((textDirection === 'rtl' ? '#iD-icon-backward' : '#iD-icon-forward'), 'inline'));
86654
86655                 enterChapter(chapters[0]);
86656
86657
86658                 function enterChapter(newChapter) {
86659                     if (_currChapter) { _currChapter.exit(); }
86660                     context.enter(modeBrowse(context));
86661
86662                     _currChapter = newChapter;
86663                     _currChapter.enter();
86664
86665                     buttons
86666                         .classed('next', false)
86667                         .classed('active', function(d) {
86668                             return d.title === _currChapter.title;
86669                         });
86670                 }
86671             }
86672
86673
86674             return intro;
86675         }
86676
86677         function uiShortcuts(context) {
86678             var detected = utilDetect();
86679             var _activeTab = 0;
86680             var _modalSelection;
86681             var _selection = d3_select(null);
86682
86683
86684             context.keybinding()
86685                 .on([t('shortcuts.toggle.key'), '?'], function () {
86686                     if (d3_selectAll('.modal-shortcuts').size()) {  // already showing
86687                         if (_modalSelection) {
86688                             _modalSelection.close();
86689                             _modalSelection = null;
86690                         }
86691                     } else {
86692                         _modalSelection = uiModal(_selection);
86693                         shortcutsModal(_modalSelection);
86694                     }
86695                 });
86696
86697
86698             function shortcutsModal(_modalSelection) {
86699                 _modalSelection.select('.modal')
86700                     .classed('modal-shortcuts', true);
86701
86702                 var shortcutsModal = _modalSelection.select('.content');
86703
86704                 shortcutsModal
86705                     .append('div')
86706                     .attr('class', 'modal-section')
86707                     .append('h3')
86708                     .text(t('shortcuts.title'));
86709
86710                 shortcutsModal
86711                     .call(render);
86712             }
86713
86714
86715             function render(selection) {
86716                 var wrapper = selection
86717                     .selectAll('.wrapper')
86718                     .data([0]);
86719
86720                 var wrapperEnter = wrapper
86721                     .enter()
86722                     .append('div')
86723                     .attr('class', 'wrapper modal-section');
86724
86725                 var tabsBar = wrapperEnter
86726                     .append('div')
86727                     .attr('class', 'tabs-bar');
86728
86729                 var shortcutsList = wrapperEnter
86730                     .append('div')
86731                     .attr('class', 'shortcuts-list');
86732
86733                 wrapper = wrapper.merge(wrapperEnter);
86734
86735                 var tabs = tabsBar
86736                     .selectAll('.tab')
86737                     .data(dataShortcuts);
86738
86739                 var tabsEnter = tabs
86740                     .enter()
86741                     .append('div')
86742                     .attr('class', 'tab')
86743                     .on('click', function (d, i) {
86744                         _activeTab = i;
86745                         render(selection);
86746                     });
86747
86748                 tabsEnter
86749                     .append('span')
86750                     .text(function (d) { return t(d.text); });
86751
86752                 tabs = tabs
86753                     .merge(tabsEnter);
86754
86755                 // Update
86756                 wrapper.selectAll('.tab')
86757                     .classed('active', function (d, i) {
86758                         return i === _activeTab;
86759                     });
86760
86761
86762                 var shortcuts = shortcutsList
86763                     .selectAll('.shortcut-tab')
86764                     .data(dataShortcuts);
86765
86766                 var shortcutsEnter = shortcuts
86767                     .enter()
86768                     .append('div')
86769                     .attr('class', function(d) { return 'shortcut-tab shortcut-tab-' + d.tab; });
86770
86771                 var columnsEnter = shortcutsEnter
86772                     .selectAll('.shortcut-column')
86773                     .data(function (d) { return d.columns; })
86774                     .enter()
86775                     .append('table')
86776                     .attr('class', 'shortcut-column');
86777
86778                 var rowsEnter = columnsEnter
86779                     .selectAll('.shortcut-row')
86780                     .data(function (d) { return d.rows; })
86781                     .enter()
86782                     .append('tr')
86783                     .attr('class', 'shortcut-row');
86784
86785
86786                 var sectionRows = rowsEnter
86787                     .filter(function (d) { return !d.shortcuts; });
86788
86789                 sectionRows
86790                     .append('td');
86791
86792                 sectionRows
86793                     .append('td')
86794                     .attr('class', 'shortcut-section')
86795                     .append('h3')
86796                     .text(function (d) { return t(d.text); });
86797
86798
86799                 var shortcutRows = rowsEnter
86800                     .filter(function (d) { return d.shortcuts; });
86801
86802                 var shortcutKeys = shortcutRows
86803                     .append('td')
86804                     .attr('class', 'shortcut-keys');
86805
86806                 var modifierKeys = shortcutKeys
86807                     .filter(function (d) { return d.modifiers; });
86808
86809                 modifierKeys
86810                     .selectAll('kbd.modifier')
86811                     .data(function (d) {
86812                         if (detected.os === 'win' && d.text === 'shortcuts.editing.commands.redo') {
86813                             return ['⌘'];
86814                         } else if (detected.os !== 'mac' && d.text === 'shortcuts.browsing.display_options.fullscreen') {
86815                             return [];
86816                         } else {
86817                             return d.modifiers;
86818                         }
86819                     })
86820                     .enter()
86821                     .each(function () {
86822                         var selection = d3_select(this);
86823
86824                         selection
86825                             .append('kbd')
86826                             .attr('class', 'modifier')
86827                             .text(function (d) { return uiCmd.display(d); });
86828
86829                         selection
86830                             .append('span')
86831                             .text('+');
86832                     });
86833
86834
86835                 shortcutKeys
86836                     .selectAll('kbd.shortcut')
86837                     .data(function (d) {
86838                         var arr = d.shortcuts;
86839                         if (detected.os === 'win' && d.text === 'shortcuts.editing.commands.redo') {
86840                             arr = ['Y'];
86841                         } else if (detected.os !== 'mac' && d.text === 'shortcuts.browsing.display_options.fullscreen') {
86842                             arr = ['F11'];
86843                         }
86844
86845                         // replace translations
86846                         arr = arr.map(function(s) {
86847                             return uiCmd.display(s.indexOf('.') !== -1 ? t(s) : s);
86848                         });
86849
86850                         return utilArrayUniq(arr).map(function(s) {
86851                             return {
86852                                 shortcut: s,
86853                                 separator: d.separator,
86854                                 suffix: d.suffix
86855                             };
86856                         });
86857                     })
86858                     .enter()
86859                     .each(function (d, i, nodes) {
86860                         var selection = d3_select(this);
86861                         var click = d.shortcut.toLowerCase().match(/(.*).click/);
86862
86863                         if (click && click[1]) {   // replace "left_click", "right_click" with mouse icon
86864                             selection
86865                                 .call(svgIcon('#iD-walkthrough-mouse', 'mouseclick', click[1]));
86866                         } else {
86867                             selection
86868                                 .append('kbd')
86869                                 .attr('class', 'shortcut')
86870                                 .text(function (d) { return d.shortcut; });
86871                         }
86872
86873                         if (i < nodes.length - 1) {
86874                             selection
86875                                 .append('span')
86876                                 .text(d.separator || '\u00a0' + t('shortcuts.or') + '\u00a0');
86877                         } else if (i === nodes.length - 1 && d.suffix) {
86878                             selection
86879                                 .append('span')
86880                                 .text(d.suffix);
86881                         }
86882                     });
86883
86884
86885                 shortcutKeys
86886                     .filter(function(d) { return d.gesture; })
86887                     .each(function () {
86888                         var selection = d3_select(this);
86889
86890                         selection
86891                             .append('span')
86892                             .text('+');
86893
86894                         selection
86895                             .append('span')
86896                             .attr('class', 'gesture')
86897                             .text(function (d) { return t(d.gesture); });
86898                     });
86899
86900
86901                 shortcutRows
86902                     .append('td')
86903                     .attr('class', 'shortcut-desc')
86904                     .text(function (d) { return d.text ? t(d.text) : '\u00a0'; });
86905
86906
86907                 shortcuts = shortcuts
86908                     .merge(shortcutsEnter);
86909
86910                 // Update
86911                 wrapper.selectAll('.shortcut-tab')
86912                     .style('display', function (d, i) {
86913                         return i === _activeTab ? 'flex' : 'none';
86914                     });
86915             }
86916
86917
86918             return function(selection, show) {
86919                 _selection = selection;
86920                 if (show) {
86921                     _modalSelection = uiModal(selection);
86922                     shortcutsModal(_modalSelection);
86923                 }
86924             };
86925         }
86926
86927         function uiHelp(context) {
86928             var key = t('help.key');
86929
86930             var _pane = d3_select(null), _toggleButton = d3_select(null);
86931
86932             var docKeys = [
86933                 ['help', [
86934                     'welcome',
86935                     'open_data_h',
86936                     'open_data',
86937                     'before_start_h',
86938                     'before_start',
86939                     'open_source_h',
86940                     'open_source',
86941                     'open_source_help'
86942                 ]],
86943                 ['overview', [
86944                     'navigation_h',
86945                     'navigation_drag',
86946                     'navigation_zoom',
86947                     'features_h',
86948                     'features',
86949                     'nodes_ways'
86950                 ]],
86951                 ['editing', [
86952                     'select_h',
86953                     'select_left_click',
86954                     'select_right_click',
86955                     'multiselect_h',
86956                     'multiselect_shift_click',
86957                     'multiselect_lasso',
86958                     'undo_redo_h',
86959                     'undo_redo',
86960                     'save_h',
86961                     'save',
86962                     'save_validation',
86963                     'upload_h',
86964                     'upload',
86965                     'backups_h',
86966                     'backups',
86967                     'keyboard_h',
86968                     'keyboard'
86969                 ]],
86970                 ['feature_editor', [
86971                     'intro',
86972                     'definitions',
86973                     'type_h',
86974                     'type',
86975                     'type_picker',
86976                     'fields_h',
86977                     'fields_all_fields',
86978                     'fields_example',
86979                     'fields_add_field',
86980                     'tags_h',
86981                     'tags_all_tags',
86982                     'tags_resources'
86983                 ]],
86984                 ['points', [
86985                     'intro',
86986                     'add_point_h',
86987                     'add_point',
86988                     'add_point_finish',
86989                     'move_point_h',
86990                     'move_point',
86991                     'delete_point_h',
86992                     'delete_point',
86993                     'delete_point_command'
86994                 ]],
86995                 ['lines', [
86996                     'intro',
86997                     'add_line_h',
86998                     'add_line',
86999                     'add_line_draw',
87000                     'add_line_finish',
87001                     'modify_line_h',
87002                     'modify_line_dragnode',
87003                     'modify_line_addnode',
87004                     'connect_line_h',
87005                     'connect_line',
87006                     'connect_line_display',
87007                     'connect_line_drag',
87008                     'connect_line_tag',
87009                     'disconnect_line_h',
87010                     'disconnect_line_command',
87011                     'move_line_h',
87012                     'move_line_command',
87013                     'move_line_connected',
87014                     'delete_line_h',
87015                     'delete_line',
87016                     'delete_line_command'
87017                 ]],
87018                 ['areas', [
87019                     'intro',
87020                     'point_or_area_h',
87021                     'point_or_area',
87022                     'add_area_h',
87023                     'add_area_command',
87024                     'add_area_draw',
87025                     'add_area_finish',
87026                     'square_area_h',
87027                     'square_area_command',
87028                     'modify_area_h',
87029                     'modify_area_dragnode',
87030                     'modify_area_addnode',
87031                     'delete_area_h',
87032                     'delete_area',
87033                     'delete_area_command'
87034                 ]],
87035                 ['relations', [
87036                     'intro',
87037                     'edit_relation_h',
87038                     'edit_relation',
87039                     'edit_relation_add',
87040                     'edit_relation_delete',
87041                     'maintain_relation_h',
87042                     'maintain_relation',
87043                     'relation_types_h',
87044                     'multipolygon_h',
87045                     'multipolygon',
87046                     'multipolygon_create',
87047                     'multipolygon_merge',
87048                     'turn_restriction_h',
87049                     'turn_restriction',
87050                     'turn_restriction_field',
87051                     'turn_restriction_editing',
87052                     'route_h',
87053                     'route',
87054                     'route_add',
87055                     'boundary_h',
87056                     'boundary',
87057                     'boundary_add'
87058                 ]],
87059                 ['notes', [
87060                     'intro',
87061                     'add_note_h',
87062                     'add_note',
87063                     'move_note',
87064                     'update_note_h',
87065                     'update_note',
87066                     'save_note_h',
87067                     'save_note'
87068                 ]],
87069
87070                 ['imagery', [
87071                     'intro',
87072                     'sources_h',
87073                     'choosing',
87074                     'sources',
87075                     'offsets_h',
87076                     'offset',
87077                     'offset_change'
87078                 ]],
87079                 ['streetlevel', [
87080                     'intro',
87081                     'using_h',
87082                     'using',
87083                     'photos',
87084                     'viewer'
87085                 ]],
87086                 ['gps', [
87087                     'intro',
87088                     'survey',
87089                     'using_h',
87090                     'using',
87091                     'tracing',
87092                     'upload'
87093                 ]],
87094                 ['qa', [
87095                     'intro',
87096                     'tools_h',
87097                     'tools',
87098                     'issues_h',
87099                     'issues'
87100                 ]]
87101             ];
87102
87103             var headings = {
87104                 'help.help.open_data_h': 3,
87105                 'help.help.before_start_h': 3,
87106                 'help.help.open_source_h': 3,
87107                 'help.overview.navigation_h': 3,
87108                 'help.overview.features_h': 3,
87109                 'help.editing.select_h': 3,
87110                 'help.editing.multiselect_h': 3,
87111                 'help.editing.undo_redo_h': 3,
87112                 'help.editing.save_h': 3,
87113                 'help.editing.upload_h': 3,
87114                 'help.editing.backups_h': 3,
87115                 'help.editing.keyboard_h': 3,
87116                 'help.feature_editor.type_h': 3,
87117                 'help.feature_editor.fields_h': 3,
87118                 'help.feature_editor.tags_h': 3,
87119                 'help.points.add_point_h': 3,
87120                 'help.points.move_point_h': 3,
87121                 'help.points.delete_point_h': 3,
87122                 'help.lines.add_line_h': 3,
87123                 'help.lines.modify_line_h': 3,
87124                 'help.lines.connect_line_h': 3,
87125                 'help.lines.disconnect_line_h': 3,
87126                 'help.lines.move_line_h': 3,
87127                 'help.lines.delete_line_h': 3,
87128                 'help.areas.point_or_area_h': 3,
87129                 'help.areas.add_area_h': 3,
87130                 'help.areas.square_area_h': 3,
87131                 'help.areas.modify_area_h': 3,
87132                 'help.areas.delete_area_h': 3,
87133                 'help.relations.edit_relation_h': 3,
87134                 'help.relations.maintain_relation_h': 3,
87135                 'help.relations.relation_types_h': 2,
87136                 'help.relations.multipolygon_h': 3,
87137                 'help.relations.turn_restriction_h': 3,
87138                 'help.relations.route_h': 3,
87139                 'help.relations.boundary_h': 3,
87140                 'help.notes.add_note_h': 3,
87141                 'help.notes.update_note_h': 3,
87142                 'help.notes.save_note_h': 3,
87143                 'help.imagery.sources_h': 3,
87144                 'help.imagery.offsets_h': 3,
87145                 'help.streetlevel.using_h': 3,
87146                 'help.gps.using_h': 3,
87147                 'help.qa.tools_h': 3,
87148                 'help.qa.issues_h': 3
87149             };
87150
87151             var replacements = {
87152                 point: icon('#iD-icon-point', 'pre-text'),
87153                 line: icon('#iD-icon-line', 'pre-text'),
87154                 area: icon('#iD-icon-area', 'pre-text'),
87155                 note: icon('#iD-icon-note', 'pre-text add-note'),
87156                 plus: icon('#iD-icon-plus', 'pre-text'),
87157                 minus: icon('#iD-icon-minus', 'pre-text'),
87158                 orthogonalize: icon('#iD-operation-orthogonalize', 'pre-text'),
87159                 disconnect: icon('#iD-operation-disconnect', 'pre-text'),
87160                 layers: icon('#iD-icon-layers', 'pre-text'),
87161                 data: icon('#iD-icon-data', 'pre-text'),
87162                 inspect: icon('#iD-icon-inspect', 'pre-text'),
87163                 move: icon('#iD-operation-move', 'pre-text'),
87164                 merge: icon('#iD-operation-merge', 'pre-text'),
87165                 delete: icon('#iD-operation-delete', 'pre-text'),
87166                 close: icon('#iD-icon-close', 'pre-text'),
87167                 undo: icon(textDirection === 'rtl' ? '#iD-icon-redo' : '#iD-icon-undo', 'pre-text'),
87168                 redo: icon(textDirection === 'rtl' ? '#iD-icon-undo' : '#iD-icon-redo', 'pre-text'),
87169                 save: icon('#iD-icon-save', 'pre-text'),
87170                 leftclick: icon('#iD-walkthrough-mouse', 'pre-text mouseclick', 'left'),
87171                 rightclick: icon('#iD-walkthrough-mouse', 'pre-text mouseclick', 'right'),
87172                 shift: uiCmd.display('⇧'),
87173                 alt: uiCmd.display('⌥'),
87174                 return: uiCmd.display('↵'),
87175                 version: context.version
87176             };
87177
87178             // For each section, squash all the texts into a single markdown document
87179             var docs = docKeys.map(function(key) {
87180                 var helpkey = 'help.' + key[0];
87181                 var text = key[1].reduce(function(all, part) {
87182                     var subkey = helpkey + '.' + part;
87183                     var depth = headings[subkey];                              // is this subkey a heading?
87184                     var hhh = depth ? Array(depth + 1).join('#') + ' ' : '';   // if so, prepend with some ##'s
87185                     return all + hhh + t(subkey, replacements) + '\n\n';
87186                 }, '');
87187
87188                 return {
87189                     title: t(helpkey + '.title'),
87190                     html: marked(text.trim())
87191                 };
87192             });
87193
87194             var paneTooltip = tooltip()
87195                 .placement((textDirection === 'rtl') ? 'right' : 'left')
87196                 .html(true)
87197                 .title(uiTooltipHtml(t('help.title'), key));
87198
87199             function hidePane() {
87200                 context.ui().togglePanes();
87201             }
87202
87203             uiHelp.togglePane = function() {
87204                 if (event) event.preventDefault();
87205                 paneTooltip.hide(_toggleButton);
87206                 context.ui().togglePanes(!_pane.classed('shown') ? _pane : undefined);
87207             };
87208
87209             uiHelp.renderToggleButton = function(selection) {
87210
87211                 _toggleButton = selection.append('button')
87212                     .attr('tabindex', -1)
87213                     .on('click', uiHelp.togglePane)
87214                     .call(svgIcon('#iD-icon-help', 'light'))
87215                     .call(paneTooltip);
87216             };
87217
87218
87219             uiHelp.renderPane = function(selection) {
87220
87221                 function clickHelp(d, i) {
87222                     var rtl = (textDirection === 'rtl');
87223                     content.property('scrollTop', 0);
87224                     doctitle.html(d.title);
87225
87226                     body.html(d.html);
87227                     body.selectAll('a')
87228                         .attr('target', '_blank');
87229                     menuItems.classed('selected', function(m) {
87230                         return m.title === d.title;
87231                     });
87232
87233                     nav.html('');
87234                     if (rtl) {
87235                         nav.call(drawNext).call(drawPrevious);
87236                     } else {
87237                         nav.call(drawPrevious).call(drawNext);
87238                     }
87239
87240
87241                     function drawNext(selection) {
87242                         if (i < docs.length - 1) {
87243                             var nextLink = selection
87244                                 .append('a')
87245                                 .attr('class', 'next')
87246                                 .on('click', function() {
87247                                     clickHelp(docs[i + 1], i + 1);
87248                                 });
87249
87250                             nextLink
87251                                 .append('span')
87252                                 .text(docs[i + 1].title)
87253                                 .call(svgIcon((rtl ? '#iD-icon-backward' : '#iD-icon-forward'), 'inline'));
87254                         }
87255                     }
87256
87257
87258                     function drawPrevious(selection) {
87259                         if (i > 0) {
87260                             var prevLink = selection
87261                                 .append('a')
87262                                 .attr('class', 'previous')
87263                                 .on('click', function() {
87264                                     clickHelp(docs[i - 1], i - 1);
87265                                 });
87266
87267                             prevLink
87268                                 .call(svgIcon((rtl ? '#iD-icon-forward' : '#iD-icon-backward'), 'inline'))
87269                                 .append('span')
87270                                 .text(docs[i - 1].title);
87271                         }
87272                     }
87273                 }
87274
87275
87276                 function clickWalkthrough() {
87277                     if (context.inIntro()) return;
87278                     context.container().call(uiIntro(context));
87279                     context.ui().togglePanes();
87280                 }
87281
87282
87283                 function clickShortcuts() {
87284                     context.container().call(uiShortcuts(context), true);
87285                 }
87286
87287
87288                 _pane = selection.append('div')
87289                     .attr('class', 'help-wrap map-pane fillL hide')
87290                     .attr('pane', 'help');
87291
87292                 var heading = _pane
87293                     .append('div')
87294                     .attr('class', 'pane-heading');
87295
87296                 var doctitle = heading
87297                     .append('h2')
87298                     .text(t('help.title'));
87299
87300                 heading
87301                     .append('button')
87302                     .on('click', hidePane)
87303                     .call(svgIcon('#iD-icon-close'));
87304
87305
87306                 var content = _pane
87307                     .append('div')
87308                     .attr('class', 'pane-content');
87309
87310                 var toc = content
87311                     .append('ul')
87312                     .attr('class', 'toc');
87313
87314                 var menuItems = toc.selectAll('li')
87315                     .data(docs)
87316                     .enter()
87317                     .append('li')
87318                     .append('a')
87319                     .html(function(d) { return d.title; })
87320                     .on('click', clickHelp);
87321
87322                 var shortcuts = toc
87323                     .append('li')
87324                     .attr('class', 'shortcuts')
87325                     .call(tooltip()
87326                         .html(true)
87327                         .title(uiTooltipHtml(t('shortcuts.tooltip'), '?'))
87328                         .placement('top')
87329                     )
87330                     .append('a')
87331                     .on('click', clickShortcuts);
87332
87333                 shortcuts
87334                     .append('div')
87335                     .text(t('shortcuts.title'));
87336
87337                 var walkthrough = toc
87338                     .append('li')
87339                     .attr('class', 'walkthrough')
87340                     .append('a')
87341                     .on('click', clickWalkthrough);
87342
87343                 walkthrough
87344                     .append('svg')
87345                     .attr('class', 'logo logo-walkthrough')
87346                     .append('use')
87347                     .attr('xlink:href', '#iD-logo-walkthrough');
87348
87349                 walkthrough
87350                     .append('div')
87351                     .text(t('splash.walkthrough'));
87352
87353
87354                 var helpContent = content
87355                     .append('div')
87356                     .attr('class', 'left-content');
87357
87358                 var body = helpContent
87359                     .append('div')
87360                     .attr('class', 'body');
87361
87362                 var nav = helpContent
87363                     .append('div')
87364                     .attr('class', 'nav');
87365
87366                 clickHelp(docs[0], 0);
87367
87368                 context.keybinding()
87369                     .on(key, uiHelp.togglePane);
87370
87371             };
87372
87373             return uiHelp;
87374         }
87375
87376         function uiPanelBackground(context) {
87377             var background = context.background();
87378             var currSourceName = null;
87379             var metadata = {};
87380             var metadataKeys = [
87381                 'zoom', 'vintage', 'source', 'description', 'resolution', 'accuracy'
87382             ];
87383
87384             var debouncedRedraw = debounce(redraw, 250);
87385
87386             function redraw(selection) {
87387                 var source = background.baseLayerSource();
87388                 var isDG = (source.id.match(/^DigitalGlobe/i) !== null);
87389
87390                 if (currSourceName !== source.name()) {
87391                     currSourceName = source.name();
87392                     metadata = {};
87393                 }
87394
87395                 selection.html('');
87396
87397                 var list = selection
87398                     .append('ul')
87399                     .attr('class', 'background-info');
87400
87401                 list
87402                     .append('li')
87403                     .text(currSourceName);
87404
87405                 metadataKeys.forEach(function(k) {
87406                     // DigitalGlobe vintage is available in raster layers for now.
87407                     if (isDG && k === 'vintage') return;
87408
87409                     list
87410                         .append('li')
87411                         .attr('class', 'background-info-list-' + k)
87412                         .classed('hide', !metadata[k])
87413                         .text(t('info_panels.background.' + k) + ':')
87414                         .append('span')
87415                         .attr('class', 'background-info-span-' + k)
87416                         .text(metadata[k]);
87417                 });
87418
87419                 debouncedGetMetadata(selection);
87420
87421                 var toggleTiles = context.getDebug('tile') ? 'hide_tiles' : 'show_tiles';
87422
87423                 selection
87424                     .append('a')
87425                     .text(t('info_panels.background.' + toggleTiles))
87426                     .attr('href', '#')
87427                     .attr('class', 'button button-toggle-tiles')
87428                     .on('click', function() {
87429                         event.preventDefault();
87430                         context.setDebug('tile', !context.getDebug('tile'));
87431                         selection.call(redraw);
87432                     });
87433
87434                 if (isDG) {
87435                     var key = source.id + '-vintage';
87436                     var sourceVintage = context.background().findSource(key);
87437                     var showsVintage = context.background().showsLayer(sourceVintage);
87438                     var toggleVintage = showsVintage ? 'hide_vintage' : 'show_vintage';
87439                     selection
87440                         .append('a')
87441                         .text(t('info_panels.background.' + toggleVintage))
87442                         .attr('href', '#')
87443                         .attr('class', 'button button-toggle-vintage')
87444                         .on('click', function() {
87445                             event.preventDefault();
87446                             context.background().toggleOverlayLayer(sourceVintage);
87447                             selection.call(redraw);
87448                         });
87449                 }
87450
87451                 // disable if necessary
87452                 ['DigitalGlobe-Premium', 'DigitalGlobe-Standard'].forEach(function(layerId) {
87453                     if (source.id !== layerId) {
87454                         var key = layerId + '-vintage';
87455                         var sourceVintage = context.background().findSource(key);
87456                         if (context.background().showsLayer(sourceVintage)) {
87457                             context.background().toggleOverlayLayer(sourceVintage);
87458                         }
87459                     }
87460                 });
87461             }
87462
87463
87464             var debouncedGetMetadata = debounce(getMetadata, 250);
87465
87466             function getMetadata(selection) {
87467                 var tile = d3_select('.layer-background img.tile-center');   // tile near viewport center
87468                 if (tile.empty()) return;
87469
87470                 var sourceName = currSourceName;
87471                 var d = tile.datum();
87472                 var zoom = (d && d.length >= 3 && d[2]) || Math.floor(context.map().zoom());
87473                 var center = context.map().center();
87474
87475                 // update zoom
87476                 metadata.zoom = String(zoom);
87477                 selection.selectAll('.background-info-list-zoom')
87478                     .classed('hide', false)
87479                     .selectAll('.background-info-span-zoom')
87480                     .text(metadata.zoom);
87481
87482                 if (!d || !d.length >= 3) return;
87483
87484                 background.baseLayerSource().getMetadata(center, d, function(err, result) {
87485                     if (err || currSourceName !== sourceName) return;
87486
87487                     // update vintage
87488                     var vintage = result.vintage;
87489                     metadata.vintage = (vintage && vintage.range) || t('info_panels.background.unknown');
87490                     selection.selectAll('.background-info-list-vintage')
87491                         .classed('hide', false)
87492                         .selectAll('.background-info-span-vintage')
87493                         .text(metadata.vintage);
87494
87495                     // update other metdata
87496                     metadataKeys.forEach(function(k) {
87497                         if (k === 'zoom' || k === 'vintage') return;  // done already
87498                         var val = result[k];
87499                         metadata[k] = val;
87500                         selection.selectAll('.background-info-list-' + k)
87501                             .classed('hide', !val)
87502                             .selectAll('.background-info-span-' + k)
87503                             .text(val);
87504                     });
87505                 });
87506             }
87507
87508
87509             var panel = function(selection) {
87510                 selection.call(redraw);
87511
87512                 context.map()
87513                     .on('drawn.info-background', function() {
87514                         selection.call(debouncedRedraw);
87515                     })
87516                     .on('move.info-background', function() {
87517                         selection.call(debouncedGetMetadata);
87518                     });
87519
87520             };
87521
87522             panel.off = function() {
87523                 context.map()
87524                     .on('drawn.info-background', null)
87525                     .on('move.info-background', null);
87526             };
87527
87528             panel.id = 'background';
87529             panel.title = t('info_panels.background.title');
87530             panel.key = t('info_panels.background.key');
87531
87532
87533             return panel;
87534         }
87535
87536         function uiPanelHistory(context) {
87537             var osm;
87538
87539             function displayTimestamp(timestamp) {
87540                 if (!timestamp) return t('info_panels.history.unknown');
87541                 var detected = utilDetect();
87542                 var options = {
87543                     day: 'numeric', month: 'short', year: 'numeric',
87544                     hour: 'numeric', minute: 'numeric', second: 'numeric'
87545                 };
87546                 var d = new Date(timestamp);
87547                 if (isNaN(d.getTime())) return t('info_panels.history.unknown');
87548                 return d.toLocaleString(detected.locale, options);
87549             }
87550
87551
87552             function displayUser(selection, userName) {
87553                 if (!userName) {
87554                     selection
87555                         .append('span')
87556                         .text(t('info_panels.history.unknown'));
87557                     return;
87558                 }
87559
87560                 selection
87561                     .append('span')
87562                     .attr('class', 'user-name')
87563                     .text(userName);
87564
87565                 var links = selection
87566                     .append('div')
87567                     .attr('class', 'links');
87568
87569                 if (osm) {
87570                     links
87571                         .append('a')
87572                         .attr('class', 'user-osm-link')
87573                         .attr('href', osm.userURL(userName))
87574                         .attr('target', '_blank')
87575                         .attr('tabindex', -1)
87576                         .text('OSM');
87577                 }
87578
87579                 links
87580                     .append('a')
87581                     .attr('class', 'user-hdyc-link')
87582                     .attr('href', 'https://hdyc.neis-one.org/?' + userName)
87583                     .attr('target', '_blank')
87584                     .attr('tabindex', -1)
87585                     .text('HDYC');
87586             }
87587
87588
87589             function displayChangeset(selection, changeset) {
87590                 if (!changeset) {
87591                     selection
87592                         .append('span')
87593                         .text(t('info_panels.history.unknown'));
87594                     return;
87595                 }
87596
87597                 selection
87598                     .append('span')
87599                     .attr('class', 'changeset-id')
87600                     .text(changeset);
87601
87602                 var links = selection
87603                     .append('div')
87604                     .attr('class', 'links');
87605
87606                 if (osm) {
87607                     links
87608                         .append('a')
87609                         .attr('class', 'changeset-osm-link')
87610                         .attr('href', osm.changesetURL(changeset))
87611                         .attr('target', '_blank')
87612                         .attr('tabindex', -1)
87613                         .text('OSM');
87614                 }
87615
87616                 links
87617                     .append('a')
87618                     .attr('class', 'changeset-osmcha-link')
87619                     .attr('href', 'https://osmcha.mapbox.com/changesets/' + changeset)
87620                     .attr('target', '_blank')
87621                     .attr('tabindex', -1)
87622                     .text('OSMCha');
87623             }
87624
87625
87626             function redraw(selection) {
87627                 var selectedNoteID = context.selectedNoteID();
87628                 osm = context.connection();
87629
87630                 var selected, note, entity;
87631                 if (selectedNoteID && osm) {       // selected 1 note
87632                     selected = [ t('note.note') + ' ' + selectedNoteID ];
87633                     note = osm.getNote(selectedNoteID);
87634                 } else {                           // selected 1..n entities
87635                     selected = context.selectedIDs()
87636                         .filter(function(e) { return context.hasEntity(e); });
87637                     if (selected.length) {
87638                         entity = context.entity(selected[0]);
87639                     }
87640                 }
87641
87642                 var singular = selected.length === 1 ? selected[0] : null;
87643
87644                 selection.html('');
87645
87646                 selection
87647                     .append('h4')
87648                     .attr('class', 'history-heading')
87649                     .text(singular || t('info_panels.history.selected', { n: selected.length }));
87650
87651                 if (!singular) return;
87652
87653                 if (entity) {
87654                     selection.call(redrawEntity, entity);
87655                 } else if (note) {
87656                     selection.call(redrawNote, note);
87657                 }
87658             }
87659
87660
87661             function redrawNote(selection, note) {
87662                 if (!note || note.isNew()) {
87663                     selection
87664                         .append('div')
87665                         .text(t('info_panels.history.note_no_history'));
87666                     return;
87667                 }
87668
87669                 var list = selection
87670                     .append('ul');
87671
87672                 list
87673                     .append('li')
87674                     .text(t('info_panels.history.note_comments') + ':')
87675                     .append('span')
87676                     .text(note.comments.length);
87677
87678                 if (note.comments.length) {
87679                     list
87680                         .append('li')
87681                         .text(t('info_panels.history.note_created_date') + ':')
87682                         .append('span')
87683                         .text(displayTimestamp(note.comments[0].date));
87684
87685                     list
87686                         .append('li')
87687                         .text(t('info_panels.history.note_created_user') + ':')
87688                         .call(displayUser, note.comments[0].user);
87689                 }
87690
87691                 if (osm) {
87692                     selection
87693                         .append('a')
87694                         .attr('class', 'view-history-on-osm')
87695                         .attr('target', '_blank')
87696                         .attr('tabindex', -1)
87697                         .attr('href', osm.noteURL(note))
87698                         .call(svgIcon('#iD-icon-out-link', 'inline'))
87699                         .append('span')
87700                         .text(t('info_panels.history.note_link_text'));
87701                 }
87702             }
87703
87704
87705             function redrawEntity(selection, entity) {
87706                 if (!entity || entity.isNew()) {
87707                     selection
87708                         .append('div')
87709                         .text(t('info_panels.history.no_history'));
87710                     return;
87711                 }
87712
87713                 var links = selection
87714                     .append('div')
87715                     .attr('class', 'links');
87716
87717                 if (osm) {
87718                     links
87719                         .append('a')
87720                         .attr('class', 'view-history-on-osm')
87721                         .attr('href', osm.historyURL(entity))
87722                         .attr('target', '_blank')
87723                         .attr('tabindex', -1)
87724                         .attr('title', t('info_panels.history.link_text'))
87725                         .text('OSM');
87726                 }
87727                 links
87728                     .append('a')
87729                     .attr('class', 'pewu-history-viewer-link')
87730                     .attr('href', 'https://pewu.github.io/osm-history/#/' + entity.type + '/' + entity.osmId())
87731                     .attr('target', '_blank')
87732                     .attr('tabindex', -1)
87733                     .text('PeWu');
87734
87735                 var list = selection
87736                     .append('ul');
87737
87738                 list
87739                     .append('li')
87740                     .text(t('info_panels.history.version') + ':')
87741                     .append('span')
87742                     .text(entity.version);
87743
87744                 list
87745                     .append('li')
87746                     .text(t('info_panels.history.last_edit') + ':')
87747                     .append('span')
87748                     .text(displayTimestamp(entity.timestamp));
87749
87750                 list
87751                     .append('li')
87752                     .text(t('info_panels.history.edited_by') + ':')
87753                     .call(displayUser, entity.user);
87754
87755                 list
87756                     .append('li')
87757                     .text(t('info_panels.history.changeset') + ':')
87758                     .call(displayChangeset, entity.changeset);
87759             }
87760
87761
87762             var panel = function(selection) {
87763                 selection.call(redraw);
87764
87765                 context.map()
87766                     .on('drawn.info-history', function() {
87767                         selection.call(redraw);
87768                     });
87769
87770                 context
87771                     .on('enter.info-history', function() {
87772                         selection.call(redraw);
87773                     });
87774             };
87775
87776             panel.off = function() {
87777                 context.map().on('drawn.info-history', null);
87778                 context.on('enter.info-history', null);
87779             };
87780
87781             panel.id = 'history';
87782             panel.title = t('info_panels.history.title');
87783             panel.key = t('info_panels.history.key');
87784
87785
87786             return panel;
87787         }
87788
87789         var OSM_PRECISION = 7;
87790         var locale$2 = utilDetect().locale;
87791
87792         /**
87793          * Returns a localized representation of the given length measurement.
87794          *
87795          * @param {Number} m area in meters
87796          * @param {Boolean} isImperial true for U.S. customary units; false for metric
87797          */
87798         function displayLength(m, isImperial) {
87799             var d = m * (isImperial ? 3.28084 : 1);
87800             var unit;
87801
87802             if (isImperial) {
87803                 if (d >= 5280) {
87804                     d /= 5280;
87805                     unit = 'miles';
87806                 } else {
87807                     unit = 'feet';
87808                 }
87809             } else {
87810                 if (d >= 1000) {
87811                     d /= 1000;
87812                     unit = 'kilometers';
87813                 } else {
87814                     unit = 'meters';
87815                 }
87816             }
87817
87818             return t('units.' + unit, {
87819                 quantity: d.toLocaleString(locale$2, {
87820                     maximumSignificantDigits: 4
87821                 })
87822             });
87823         }
87824
87825         /**
87826          * Returns a localized representation of the given area measurement.
87827          *
87828          * @param {Number} m2 area in square meters
87829          * @param {Boolean} isImperial true for U.S. customary units; false for metric
87830          */
87831         function displayArea(m2, isImperial) {
87832             var d = m2 * (isImperial ? 10.7639111056 : 1);
87833             var d1, d2, area;
87834             var unit1 = '';
87835             var unit2 = '';
87836
87837             if (isImperial) {
87838                 if (d >= 6969600) { // > 0.25mi² show mi²
87839                     d1 = d / 27878400;
87840                     unit1 = 'square_miles';
87841                 } else {
87842                     d1 = d;
87843                     unit1 = 'square_feet';
87844                 }
87845
87846                 if (d > 4356 && d < 43560000) { // 0.1 - 1000 acres
87847                     d2 = d / 43560;
87848                     unit2 = 'acres';
87849                 }
87850
87851             } else {
87852                 if (d >= 250000) { // > 0.25km² show km²
87853                     d1 = d / 1000000;
87854                     unit1 = 'square_kilometers';
87855                 } else {
87856                     d1 = d;
87857                     unit1 = 'square_meters';
87858                 }
87859
87860                 if (d > 1000 && d < 10000000) { // 0.1 - 1000 hectares
87861                     d2 = d / 10000;
87862                     unit2 = 'hectares';
87863                 }
87864             }
87865
87866             area = t('units.' + unit1, {
87867                 quantity: d1.toLocaleString(locale$2, {
87868                     maximumSignificantDigits: 4
87869                 })
87870             });
87871
87872             if (d2) {
87873                 return t('units.area_pair', {
87874                     area1: area,
87875                     area2: t('units.' + unit2, {
87876                         quantity: d2.toLocaleString(locale$2, {
87877                             maximumSignificantDigits: 2
87878                         })
87879                     })
87880                 });
87881             } else {
87882                 return area;
87883             }
87884         }
87885
87886         function wrap(x, min, max) {
87887             var d = max - min;
87888             return ((x - min) % d + d) % d + min;
87889         }
87890
87891         function clamp$1(x, min, max) {
87892             return Math.max(min, Math.min(x, max));
87893         }
87894
87895         function displayCoordinate(deg, pos, neg) {
87896             var min = (Math.abs(deg) - Math.floor(Math.abs(deg))) * 60;
87897             var sec = (min - Math.floor(min)) * 60;
87898             var displayDegrees = t('units.arcdegrees', {
87899                 quantity: Math.floor(Math.abs(deg)).toLocaleString(locale$2)
87900             });
87901             var displayCoordinate;
87902
87903             if (Math.floor(sec) > 0) {
87904                 displayCoordinate = displayDegrees +
87905                     t('units.arcminutes', {
87906                         quantity: Math.floor(min).toLocaleString(locale$2)
87907                     }) +
87908                     t('units.arcseconds', {
87909                         quantity: Math.round(sec).toLocaleString(locale$2)
87910                     });
87911             } else if (Math.floor(min) > 0) {
87912                 displayCoordinate = displayDegrees +
87913                     t('units.arcminutes', {
87914                         quantity: Math.round(min).toLocaleString(locale$2)
87915                     });
87916             } else {
87917                 displayCoordinate = t('units.arcdegrees', {
87918                     quantity: Math.round(Math.abs(deg)).toLocaleString(locale$2)
87919                 });
87920             }
87921
87922             if (deg === 0) {
87923                 return displayCoordinate;
87924             } else {
87925                 return t('units.coordinate', {
87926                     coordinate: displayCoordinate,
87927                     direction: t('units.' + (deg > 0 ? pos : neg))
87928                 });
87929             }
87930         }
87931
87932         /**
87933          * Returns given coordinate pair in degree-minute-second format.
87934          *
87935          * @param {Array<Number>} coord longitude and latitude
87936          */
87937         function dmsCoordinatePair(coord) {
87938             return t('units.coordinate_pair', {
87939                 latitude: displayCoordinate(clamp$1(coord[1], -90, 90), 'north', 'south'),
87940                 longitude: displayCoordinate(wrap(coord[0], -180, 180), 'east', 'west')
87941             });
87942         }
87943
87944         /**
87945          * Returns the given coordinate pair in decimal format.
87946          * note: unlocalized to avoid comma ambiguity - see #4765
87947          *
87948          * @param {Array<Number>} coord longitude and latitude
87949          */
87950         function decimalCoordinatePair(coord) {
87951             return t('units.coordinate_pair', {
87952                 latitude: clamp$1(coord[1], -90, 90).toFixed(OSM_PRECISION),
87953                 longitude: wrap(coord[0], -180, 180).toFixed(OSM_PRECISION)
87954             });
87955         }
87956
87957         function uiPanelLocation(context) {
87958             var currLocation = '';
87959
87960
87961             function redraw(selection) {
87962                 selection.html('');
87963
87964                 var list = selection
87965                     .append('ul');
87966
87967                 // Mouse coordinates
87968                 var coord = context.map().mouseCoordinates();
87969                 if (coord.some(isNaN)) {
87970                     coord = context.map().center();
87971                 }
87972
87973                 list
87974                     .append('li')
87975                     .text(dmsCoordinatePair(coord))
87976                     .append('li')
87977                     .text(decimalCoordinatePair(coord));
87978
87979                 // Location Info
87980                 selection
87981                     .append('div')
87982                     .attr('class', 'location-info')
87983                     .text(currLocation || ' ');
87984
87985                 debouncedGetLocation(selection, coord);
87986             }
87987
87988
87989             var debouncedGetLocation = debounce(getLocation, 250);
87990             function getLocation(selection, coord) {
87991                 if (!services$1.geocoder) {
87992                     currLocation = t('info_panels.location.unknown_location');
87993                     selection.selectAll('.location-info')
87994                         .text(currLocation);
87995                 } else {
87996                     services$1.geocoder.reverse(coord, function(err, result) {
87997                         currLocation = result ? result.display_name : t('info_panels.location.unknown_location');
87998                         selection.selectAll('.location-info')
87999                             .text(currLocation);
88000                     });
88001                 }
88002             }
88003
88004
88005             var panel = function(selection) {
88006                 selection.call(redraw);
88007
88008                 context.surface()
88009                     .on('mousemove.info-location', function() {
88010                         selection.call(redraw);
88011                     });
88012             };
88013
88014             panel.off = function() {
88015                 context.surface()
88016                     .on('mousemove.info-location', null);
88017             };
88018
88019             panel.id = 'location';
88020             panel.title = t('info_panels.location.title');
88021             panel.key = t('info_panels.location.key');
88022
88023
88024             return panel;
88025         }
88026
88027         function uiPanelMeasurement(context) {
88028             var locale = utilDetect().locale;
88029             var isImperial = (locale.toLowerCase() === 'en-us');
88030
88031
88032             function radiansToMeters(r) {
88033                 // using WGS84 authalic radius (6371007.1809 m)
88034                 return r * 6371007.1809;
88035             }
88036
88037             function steradiansToSqmeters(r) {
88038                 // http://gis.stackexchange.com/a/124857/40446
88039                 return r / (4 * Math.PI) * 510065621724000;
88040             }
88041
88042
88043             function toLineString(feature) {
88044                 if (feature.type === 'LineString') return feature;
88045
88046                 var result = { type: 'LineString', coordinates: [] };
88047                 if (feature.type === 'Polygon') {
88048                     result.coordinates = feature.coordinates[0];
88049                 } else if (feature.type === 'MultiPolygon') {
88050                     result.coordinates = feature.coordinates[0][0];
88051                 }
88052
88053                 return result;
88054             }
88055
88056
88057             function nodeCount(feature) {
88058               if (feature.type === 'LineString') return feature.coordinates.length;
88059               if (feature.type === 'Polygon') return feature.coordinates[0].length - 1;
88060             }
88061
88062
88063             function redraw(selection) {
88064                 var resolver = context.graph();
88065                 var selectedNoteID = context.selectedNoteID();
88066                 var osm = services$1.osm;
88067
88068                 var selected, center, entity, note, geometry;
88069
88070                 if (selectedNoteID && osm) {       // selected 1 note
88071                     selected = [ t('note.note') + ' ' + selectedNoteID ];
88072                     note = osm.getNote(selectedNoteID);
88073                     center = note.loc;
88074                     geometry = 'note';
88075
88076                 } else {                           // selected 1..n entities
88077                     var extent = geoExtent();
88078                     selected = context.selectedIDs()
88079                         .filter(function(e) { return context.hasEntity(e); });
88080                     if (selected.length) {
88081                         for (var i = 0; i < selected.length; i++) {
88082                             entity = context.entity(selected[i]);
88083                             extent._extend(entity.extent(resolver));
88084                         }
88085                         center = extent.center();
88086                         geometry = entity.geometry(resolver);
88087                     }
88088                 }
88089
88090                 var singular = selected.length === 1 ? selected[0] : null;
88091
88092                 selection.html('');
88093
88094                 selection
88095                     .append('h4')
88096                     .attr('class', 'measurement-heading')
88097                     .text(singular || t('info_panels.measurement.selected', { n: selected.length.toLocaleString(locale) }));
88098
88099                 if (!selected.length) return;
88100
88101
88102                 var list = selection
88103                     .append('ul');
88104                 var coordItem;
88105
88106                 // multiple selected features, just display extent center..
88107                 if (!singular) {
88108                     coordItem = list
88109                         .append('li')
88110                         .text(t('info_panels.measurement.center') + ':');
88111                     coordItem.append('span')
88112                         .text(dmsCoordinatePair(center));
88113                     coordItem.append('span')
88114                         .text(decimalCoordinatePair(center));
88115                     return;
88116                 }
88117
88118                 // single selected feature, display details..
88119                 if (geometry === 'line' || geometry === 'area') {
88120                     var closed = (entity.type === 'relation') || (entity.isClosed() && !entity.isDegenerate());
88121                     var feature = entity.asGeoJSON(resolver);
88122                     var length = radiansToMeters(d3_geoLength(toLineString(feature)));
88123                     var lengthLabel = t('info_panels.measurement.' + (closed ? 'perimeter' : 'length'));
88124                     var centroid = d3_geoCentroid(feature);
88125
88126                     list
88127                         .append('li')
88128                         .text(t('info_panels.measurement.geometry') + ':')
88129                         .append('span')
88130                         .text(
88131                             closed ? t('info_panels.measurement.closed_' + geometry) : t('geometry.' + geometry)
88132                         );
88133
88134                     if (entity.type !== 'relation') {
88135                         list
88136                             .append('li')
88137                             .text(t('info_panels.measurement.node_count') + ':')
88138                             .append('span')
88139                             .text(nodeCount(feature).toLocaleString(locale));
88140                     }
88141
88142                     if (closed) {
88143                         var area = steradiansToSqmeters(entity.area(resolver));
88144                         list
88145                             .append('li')
88146                             .text(t('info_panels.measurement.area') + ':')
88147                             .append('span')
88148                             .text(displayArea(area, isImperial));
88149                     }
88150
88151
88152                     list
88153                         .append('li')
88154                         .text(lengthLabel + ':')
88155                         .append('span')
88156                         .text(displayLength(length, isImperial));
88157
88158                     coordItem = list
88159                         .append('li')
88160                         .text(t('info_panels.measurement.centroid') + ':');
88161                     coordItem.append('span')
88162                         .text(dmsCoordinatePair(centroid));
88163                     coordItem.append('span')
88164                         .text(decimalCoordinatePair(centroid));
88165
88166                     var toggle  = isImperial ? 'imperial' : 'metric';
88167
88168                     selection
88169                         .append('a')
88170                         .text(t('info_panels.measurement.' + toggle))
88171                         .attr('href', '#')
88172                         .attr('class', 'button button-toggle-units')
88173                         .on('click', function() {
88174                             event.preventDefault();
88175                             isImperial = !isImperial;
88176                             selection.call(redraw);
88177                         });
88178
88179                 } else {
88180                     var centerLabel = t('info_panels.measurement.' +
88181                         (note || entity.type === 'node' ? 'location' : 'center'));
88182
88183                     list
88184                         .append('li')
88185                         .text(t('info_panels.measurement.geometry') + ':')
88186                         .append('span')
88187                         .text(t('geometry.' + geometry));
88188
88189                     coordItem = list
88190                         .append('li')
88191                         .text(centerLabel + ':');
88192                     coordItem.append('span')
88193                         .text(dmsCoordinatePair(center));
88194                     coordItem.append('span')
88195                         .text(decimalCoordinatePair(center));
88196                 }
88197             }
88198
88199
88200             var panel = function(selection) {
88201                 selection.call(redraw);
88202
88203                 context.map()
88204                     .on('drawn.info-measurement', function() {
88205                         selection.call(redraw);
88206                     });
88207
88208                 context
88209                     .on('enter.info-measurement', function() {
88210                         selection.call(redraw);
88211                     });
88212             };
88213
88214             panel.off = function() {
88215                 context.map().on('drawn.info-measurement', null);
88216                 context.on('enter.info-measurement', null);
88217             };
88218
88219             panel.id = 'measurement';
88220             panel.title = t('info_panels.measurement.title');
88221             panel.key = t('info_panels.measurement.key');
88222
88223
88224             return panel;
88225         }
88226
88227         var uiInfoPanels = {
88228             background: uiPanelBackground,
88229             history: uiPanelHistory,
88230             location: uiPanelLocation,
88231             measurement: uiPanelMeasurement,
88232         };
88233
88234         function uiInfo(context) {
88235             var ids = Object.keys(uiInfoPanels);
88236             var wasActive = ['measurement'];
88237             var panels = {};
88238             var active = {};
88239
88240             // create panels
88241             ids.forEach(function(k) {
88242                 if (!panels[k]) {
88243                     panels[k] = uiInfoPanels[k](context);
88244                     active[k] = false;
88245                 }
88246             });
88247
88248
88249             function info(selection) {
88250
88251                 function redraw() {
88252                     var activeids = ids.filter(function(k) { return active[k]; }).sort();
88253
88254                     var containers = infoPanels.selectAll('.panel-container')
88255                         .data(activeids, function(k) { return k; });
88256
88257                     containers.exit()
88258                         .style('opacity', 1)
88259                         .transition()
88260                         .duration(200)
88261                         .style('opacity', 0)
88262                         .on('end', function(d) {
88263                             d3_select(this)
88264                                 .call(panels[d].off)
88265                                 .remove();
88266                         });
88267
88268                     var enter = containers.enter()
88269                         .append('div')
88270                         .attr('class', function(d) { return 'fillD2 panel-container panel-container-' + d; });
88271
88272                     enter
88273                         .style('opacity', 0)
88274                         .transition()
88275                         .duration(200)
88276                         .style('opacity', 1);
88277
88278                     var title = enter
88279                         .append('div')
88280                         .attr('class', 'panel-title fillD2');
88281
88282                     title
88283                         .append('h3')
88284                         .text(function(d) { return panels[d].title; });
88285
88286                     title
88287                         .append('button')
88288                         .attr('class', 'close')
88289                         .on('click', function (d) { toggle(d); })
88290                         .call(svgIcon('#iD-icon-close'));
88291
88292                     enter
88293                         .append('div')
88294                         .attr('class', function(d) { return 'panel-content panel-content-' + d; });
88295
88296
88297                     // redraw the panels
88298                     infoPanels.selectAll('.panel-content')
88299                         .each(function(d) {
88300                             d3_select(this).call(panels[d]);
88301                         });
88302                 }
88303
88304
88305                 function toggle(which) {
88306                     if (event) {
88307                         event.stopImmediatePropagation();
88308                         event.preventDefault();
88309                     }
88310
88311                     var activeids = ids.filter(function(k) { return active[k]; });
88312
88313                     if (which) {  // toggle one
88314                         active[which] = !active[which];
88315                         if (activeids.length === 1 && activeids[0] === which) {  // none active anymore
88316                             wasActive = [which];
88317                         }
88318                     } else {      // toggle all
88319                         if (activeids.length) {
88320                             wasActive = activeids;
88321                             activeids.forEach(function(k) { active[k] = false; });
88322                         } else {
88323                             wasActive.forEach(function(k) { active[k] = true; });
88324                         }
88325                     }
88326
88327                     redraw();
88328                 }
88329
88330
88331                 var infoPanels = selection.selectAll('.info-panels')
88332                     .data([0]);
88333
88334                 infoPanels = infoPanels.enter()
88335                     .append('div')
88336                     .attr('class', 'info-panels')
88337                     .merge(infoPanels);
88338
88339                 redraw();
88340
88341                 context.keybinding()
88342                     .on(uiCmd('⌘' + t('info_panels.key')), toggle);
88343
88344                 ids.forEach(function(k) {
88345                     var key = t('info_panels.' + k + '.key', { default: null });
88346                     if (!key) return;
88347                     context.keybinding()
88348                         .on(uiCmd('⌘⇧' + key), function() { toggle(k); });
88349                 });
88350             }
88351
88352             return info;
88353         }
88354
88355         function uiIssues(context) {
88356             var key = t('issues.key');
88357
88358             var MINSQUARE = 0;
88359             var MAXSQUARE = 20;
88360             var DEFAULTSQUARE = 5;  // see also unsquare_way.js
88361
88362             var _errorsSelection = d3_select(null);
88363             var _warningsSelection = d3_select(null);
88364             var _rulesList = d3_select(null);
88365             var _pane = d3_select(null);
88366             var _toggleButton = d3_select(null);
88367
88368             var _errors = [];
88369             var _warnings = [];
88370             var _options = {
88371                 what: context.storage('validate-what') || 'edited',    // 'all', 'edited'
88372                 where: context.storage('validate-where') || 'all'  // 'all', 'visible'
88373             };
88374
88375             // listeners
88376             context.validator().on('validated.uiIssues',
88377                 function() { window.requestIdleCallback(update); }
88378             );
88379             context.map().on('move.uiIssues',
88380                 debounce(function() { window.requestIdleCallback(update); }, 1000)
88381             );
88382
88383
88384             function addNotificationBadge(selection) {
88385                 var d = 10;
88386                 selection.selectAll('svg.notification-badge')
88387                     .data([0])
88388                     .enter()
88389                     .append('svg')
88390                     .attr('viewbox', '0 0 ' + d + ' ' + d)
88391                     .attr('class', 'notification-badge hide')
88392                     .append('circle')
88393                     .attr('cx', d / 2)
88394                     .attr('cy', d / 2)
88395                     .attr('r', (d / 2) - 1)
88396                     .attr('fill', 'currentColor');
88397             }
88398
88399
88400             function renderErrorsList(selection) {
88401                 _errorsSelection = selection
88402                     .call(drawIssuesList, 'errors', _errors);
88403             }
88404
88405
88406             function renderWarningsList(selection) {
88407                 _warningsSelection = selection
88408                     .call(drawIssuesList, 'warnings', _warnings);
88409             }
88410
88411
88412             function drawIssuesList(selection, which, issues) {
88413                 var list = selection.selectAll('.issues-list')
88414                     .data([0]);
88415
88416                 list = list.enter()
88417                     .append('ul')
88418                     .attr('class', 'layer-list issues-list ' + which + '-list')
88419                     .merge(list);
88420
88421
88422                 var items = list.selectAll('li')
88423                     .data(issues, function(d) { return d.id; });
88424
88425                 // Exit
88426                 items.exit()
88427                     .remove();
88428
88429                 // Enter
88430                 var itemsEnter = items.enter()
88431                     .append('li')
88432                     .attr('class', function (d) { return 'issue severity-' + d.severity; })
88433                     .on('click', function(d) {
88434                         context.validator().focusIssue(d);
88435                     })
88436                     .on('mouseover', function(d) {
88437                         utilHighlightEntities(d.entityIds, true, context);
88438                     })
88439                     .on('mouseout', function(d) {
88440                         utilHighlightEntities(d.entityIds, false, context);
88441                     });
88442
88443
88444                 var labelsEnter = itemsEnter
88445                     .append('div')
88446                     .attr('class', 'issue-label');
88447
88448                 var textEnter = labelsEnter
88449                     .append('span')
88450                     .attr('class', 'issue-text');
88451
88452                 textEnter
88453                     .append('span')
88454                     .attr('class', 'issue-icon')
88455                     .each(function(d) {
88456                         var iconName = '#iD-icon-' + (d.severity === 'warning' ? 'alert' : 'error');
88457                         d3_select(this)
88458                             .call(svgIcon(iconName));
88459                     });
88460
88461                 textEnter
88462                     .append('span')
88463                     .attr('class', 'issue-message');
88464
88465                 /*
88466                 labelsEnter
88467                     .append('span')
88468                     .attr('class', 'issue-autofix')
88469                     .each(function(d) {
88470                         if (!d.autoFix) return;
88471
88472                         d3_select(this)
88473                             .append('button')
88474                             .attr('title', t('issues.fix_one.title'))
88475                             .datum(d.autoFix)  // set button datum to the autofix
88476                             .attr('class', 'autofix action')
88477                             .on('click', function(d) {
88478                                 d3_event.preventDefault();
88479                                 d3_event.stopPropagation();
88480
88481                                 var issuesEntityIDs = d.issue.entityIds;
88482                                 utilHighlightEntities(issuesEntityIDs.concat(d.entityIds), false, context);
88483
88484                                 context.perform.apply(context, d.autoArgs);
88485                                 context.validator().validate();
88486                             })
88487                             .call(svgIcon('#iD-icon-wrench'));
88488                     });
88489                 */
88490
88491                 // Update
88492                 items = items
88493                     .merge(itemsEnter)
88494                     .order();
88495
88496                 items.selectAll('.issue-message')
88497                     .text(function(d) {
88498                         return d.message(context);
88499                     });
88500
88501                 /*
88502                 // autofix
88503                 var canAutoFix = issues.filter(function(issue) { return issue.autoFix; });
88504
88505                 var autoFixAll = selection.selectAll('.autofix-all')
88506                     .data(canAutoFix.length ? [0] : []);
88507
88508                 // exit
88509                 autoFixAll.exit()
88510                     .remove();
88511
88512                 // enter
88513                 var autoFixAllEnter = autoFixAll.enter()
88514                     .insert('div', '.issues-list')
88515                     .attr('class', 'autofix-all');
88516
88517                 var linkEnter = autoFixAllEnter
88518                     .append('a')
88519                     .attr('class', 'autofix-all-link')
88520                     .attr('href', '#');
88521
88522                 linkEnter
88523                     .append('span')
88524                     .attr('class', 'autofix-all-link-text')
88525                     .text(t('issues.fix_all.title'));
88526
88527                 linkEnter
88528                     .append('span')
88529                     .attr('class', 'autofix-all-link-icon')
88530                     .call(svgIcon('#iD-icon-wrench'));
88531
88532                 if (which === 'warnings') {
88533                     renderIgnoredIssuesReset(selection);
88534                 }
88535
88536                 // update
88537                 autoFixAll = autoFixAll
88538                     .merge(autoFixAllEnter);
88539
88540                 autoFixAll.selectAll('.autofix-all-link')
88541                     .on('click', function() {
88542                         context.pauseChangeDispatch();
88543                         context.perform(actionNoop());
88544                         canAutoFix.forEach(function(issue) {
88545                             var args = issue.autoFix.autoArgs.slice();  // copy
88546                             if (typeof args[args.length - 1] !== 'function') {
88547                                 args.pop();
88548                             }
88549                             args.push(t('issues.fix_all.annotation'));
88550                             context.replace.apply(context, args);
88551                         });
88552                         context.resumeChangeDispatch();
88553                         context.validator().validate();
88554                     });
88555                 */
88556             }
88557
88558
88559             function updateOptionValue(d, val) {
88560                 if (!val && event && event.target) {
88561                     val = event.target.value;
88562                 }
88563
88564                 _options[d] = val;
88565                 context.storage('validate-' + d, val);
88566                 update();
88567             }
88568
88569
88570             function renderIssuesOptions(selection) {
88571                 var container = selection.selectAll('.issues-options-container')
88572                     .data([0]);
88573
88574                 container = container.enter()
88575                     .append('div')
88576                     .attr('class', 'issues-options-container')
88577                     .merge(container);
88578
88579                 var data = [
88580                     { key: 'what', values: ['edited', 'all'] },
88581                     { key: 'where', values: ['visible', 'all'] }
88582                 ];
88583
88584                 var options = container.selectAll('.issues-option')
88585                     .data(data, function(d) { return d.key; });
88586
88587                 var optionsEnter = options.enter()
88588                     .append('div')
88589                     .attr('class', function(d) { return 'issues-option issues-option-' + d.key; });
88590
88591                 optionsEnter
88592                     .append('div')
88593                     .attr('class', 'issues-option-title')
88594                     .text(function(d) { return t('issues.options.' + d.key + '.title'); });
88595
88596                 var valuesEnter = optionsEnter.selectAll('label')
88597                     .data(function(d) {
88598                         return d.values.map(function(val) { return { value: val, key: d.key }; });
88599                     })
88600                     .enter()
88601                     .append('label');
88602
88603                 valuesEnter
88604                     .append('input')
88605                     .attr('type', 'radio')
88606                     .attr('name', function(d) { return 'issues-option-' + d.key; })
88607                     .attr('value', function(d) { return d.value; })
88608                     .property('checked', function(d) { return _options[d.key] === d.value; })
88609                     .on('change', function(d) { updateOptionValue(d.key, d.value); });
88610
88611                 valuesEnter
88612                     .append('span')
88613                     .text(function(d) { return t('issues.options.' + d.key + '.' + d.value); });
88614             }
88615
88616
88617             function renderNoIssuesBox(selection) {
88618
88619                 var box = selection.append('div')
88620                     .attr('class', 'box');
88621
88622                 box
88623                     .append('div')
88624                     .call(svgIcon('#iD-icon-apply', 'pre-text'));
88625
88626                 var noIssuesMessage = box
88627                     .append('span');
88628
88629                 noIssuesMessage
88630                     .append('strong')
88631                     .attr('class', 'message');
88632
88633                 noIssuesMessage
88634                     .append('br');
88635
88636                 noIssuesMessage
88637                     .append('span')
88638                     .attr('class', 'details');
88639             }
88640
88641             function renderIgnoredIssuesReset(selection) {
88642
88643                 var ignoredIssues = context.validator()
88644                     .getIssues(Object.assign({ includeIgnored: 'only' }, _options));
88645
88646                 var resetIgnored = selection.selectAll('.reset-ignored')
88647                     .data(ignoredIssues.length ? [0] : []);
88648
88649                 // exit
88650                 resetIgnored.exit()
88651                     .remove();
88652
88653                 // enter
88654                 var resetIgnoredEnter = resetIgnored.enter()
88655                     .append('div')
88656                     .attr('class', 'reset-ignored section-footer');
88657
88658                 resetIgnoredEnter
88659                     .append('a')
88660                     .attr('href', '#');
88661
88662                 // update
88663                 resetIgnored = resetIgnored
88664                     .merge(resetIgnoredEnter);
88665
88666                 resetIgnored.select('a')
88667                     .text(t('issues.reset_ignored', { count: ignoredIssues.length.toString() }));
88668
88669                 resetIgnored.on('click', function() {
88670                         context.validator().resetIgnoredIssues();
88671                     });
88672             }
88673
88674
88675             function renderRulesList(selection) {
88676                 var container = selection.selectAll('.issues-rulelist-container')
88677                     .data([0]);
88678
88679                 var containerEnter = container.enter()
88680                     .append('div')
88681                     .attr('class', 'issues-rulelist-container');
88682
88683                 containerEnter
88684                     .append('ul')
88685                     .attr('class', 'layer-list issue-rules-list');
88686
88687                 var ruleLinks = containerEnter
88688                     .append('div')
88689                     .attr('class', 'issue-rules-links section-footer');
88690
88691                 ruleLinks
88692                     .append('a')
88693                     .attr('class', 'issue-rules-link')
88694                     .attr('href', '#')
88695                     .text(t('issues.enable_all'))
88696                     .on('click', function() {
88697                         context.validator().disableRules([]);
88698                     });
88699
88700                 ruleLinks
88701                     .append('a')
88702                     .attr('class', 'issue-rules-link')
88703                     .attr('href', '#')
88704                     .text(t('issues.disable_all'))
88705                     .on('click', function() {
88706                         var keys = context.validator().getRuleKeys();
88707                         context.validator().disableRules(keys);
88708                     });
88709
88710
88711                 // Update
88712                 container = container
88713                     .merge(containerEnter);
88714
88715                 _rulesList = container.selectAll('.issue-rules-list');
88716
88717                 updateRulesList();
88718             }
88719
88720
88721             function updateRulesList() {
88722                 var ruleKeys = context.validator().getRuleKeys();
88723                 _rulesList
88724                     .call(drawListItems, ruleKeys, 'checkbox', 'rule', toggleRule, isRuleEnabled);
88725             }
88726
88727
88728             function isRuleEnabled(d) {
88729                 return context.validator().isRuleEnabled(d);
88730             }
88731
88732
88733             function toggleRule(d) {
88734                 context.validator().toggleRule(d);
88735             }
88736
88737             function setNoIssuesText() {
88738
88739                 function checkForHiddenIssues(cases) {
88740                     for (var type in cases) {
88741                         var opts = cases[type];
88742                         var hiddenIssues = context.validator().getIssues(opts);
88743                         if (hiddenIssues.length) {
88744                             _pane.select('.issues-none .details')
88745                                 .text(t(
88746                                     'issues.no_issues.hidden_issues.' + type,
88747                                     { count: hiddenIssues.length.toString() }
88748                                 ));
88749                             return;
88750                         }
88751                     }
88752                     _pane.select('.issues-none .details')
88753                         .text(t('issues.no_issues.hidden_issues.none'));
88754                 }
88755
88756                 var messageType;
88757
88758                 if (_options.what === 'edited' && _options.where === 'visible') {
88759
88760                     messageType = 'edits_in_view';
88761
88762                     checkForHiddenIssues({
88763                         elsewhere: { what: 'edited', where: 'all' },
88764                         other_features: { what: 'all', where: 'visible' },
88765                         disabled_rules: { what: 'edited', where: 'visible', includeDisabledRules: 'only' },
88766                         other_features_elsewhere: { what: 'all', where: 'all' },
88767                         disabled_rules_elsewhere: { what: 'edited', where: 'all', includeDisabledRules: 'only' },
88768                         ignored_issues: { what: 'edited', where: 'visible', includeIgnored: 'only' },
88769                         ignored_issues_elsewhere: { what: 'edited', where: 'all', includeIgnored: 'only' }
88770                     });
88771
88772                 } else if (_options.what === 'edited' && _options.where === 'all') {
88773
88774                     messageType = 'edits';
88775
88776                     checkForHiddenIssues({
88777                         other_features: { what: 'all', where: 'all' },
88778                         disabled_rules: { what: 'edited', where: 'all', includeDisabledRules: 'only' },
88779                         ignored_issues: { what: 'edited', where: 'all', includeIgnored: 'only' }
88780                     });
88781
88782                 } else if (_options.what === 'all' && _options.where === 'visible') {
88783
88784                     messageType = 'everything_in_view';
88785
88786                     checkForHiddenIssues({
88787                         elsewhere: { what: 'all', where: 'all' },
88788                         disabled_rules: { what: 'all', where: 'visible', includeDisabledRules: 'only' },
88789                         disabled_rules_elsewhere: { what: 'all', where: 'all', includeDisabledRules: 'only' },
88790                         ignored_issues: { what: 'all', where: 'visible', includeIgnored: 'only' },
88791                         ignored_issues_elsewhere: { what: 'all', where: 'all', includeIgnored: 'only' }
88792                     });
88793                 } else if (_options.what === 'all' && _options.where === 'all') {
88794
88795                     messageType = 'everything';
88796
88797                     checkForHiddenIssues({
88798                         disabled_rules: { what: 'all', where: 'all', includeDisabledRules: 'only' },
88799                         ignored_issues: { what: 'all', where: 'all', includeIgnored: 'only' }
88800                     });
88801                 }
88802
88803                 _pane.select('.issues-none .message')
88804                     .text(t('issues.no_issues.message.' + messageType));
88805
88806             }
88807
88808
88809             function update() {
88810                 var issuesBySeverity = context.validator().getIssuesBySeverity(_options);
88811
88812                 // sort issues by distance away from the center of the map
88813                 var center = context.map().center();
88814                 var graph = context.graph();
88815                 _errors = issuesBySeverity.error.map(withDistance).sort(byDistance);
88816                 _warnings = issuesBySeverity.warning.map(withDistance).sort(byDistance);
88817
88818                 // cut off at 1000
88819                 var errorCount = _errors.length > 1000 ? '1000+' : String(_errors.length);
88820                 var warningCount = _warnings.length > 1000 ? '1000+' : String(_warnings.length);
88821                 _errors = _errors.slice(0, 1000);
88822                 _warnings = _warnings.slice(0, 1000);
88823
88824
88825                 _toggleButton.selectAll('.notification-badge')
88826                     .classed('error', (_errors.length > 0))
88827                     .classed('warning', (_errors.length === 0 && _warnings.length > 0))
88828                     .classed('hide', (_errors.length === 0 && _warnings.length === 0));
88829
88830
88831                 _pane.selectAll('.issues-errors')
88832                     .classed('hide', _errors.length === 0);
88833
88834                 if (_errors.length > 0) {
88835                     _pane.selectAll('.hide-toggle-issues_errors .hide-toggle-text')
88836                         .text(t('issues.errors.list_title', { count: errorCount }));
88837                     if (!_pane.select('.disclosure-wrap-issues_errors').classed('hide')) {
88838                         _errorsSelection
88839                             .call(drawIssuesList, 'errors', _errors);
88840                     }
88841                 }
88842
88843                 _pane.selectAll('.issues-warnings')
88844                     .classed('hide', _warnings.length === 0);
88845
88846                 if (_warnings.length > 0) {
88847                     _pane.selectAll('.hide-toggle-issues_warnings .hide-toggle-text')
88848                         .text(t('issues.warnings.list_title', { count: warningCount }));
88849                     if (!_pane.select('.disclosure-wrap-issues_warnings').classed('hide')) {
88850                         _warningsSelection
88851                             .call(drawIssuesList, 'warnings', _warnings);
88852                     }
88853                 }
88854
88855                 var hasIssues = _warnings.length > 0 || _errors.length > 0;
88856
88857                 var issuesNone = _pane.select('.issues-none');
88858                 issuesNone.classed('hide', hasIssues);
88859                 if (!hasIssues) {
88860                     renderIgnoredIssuesReset(issuesNone);
88861                     setNoIssuesText();
88862                 }
88863
88864                 if (!_pane.select('.disclosure-wrap-issues_rules').classed('hide')) {
88865                     updateRulesList();
88866                 }
88867
88868
88869                 function byDistance(a, b) {
88870                     return a.dist - b.dist;
88871                 }
88872
88873                 function withDistance(issue) {
88874                     var extent = issue.extent(graph);
88875                     var dist = extent ? geoSphericalDistance(center, extent.center()) : 0;
88876                     return Object.assign(issue, { dist: dist });
88877                 }
88878             }
88879
88880
88881             function drawListItems(selection, data, type, name, change, active) {
88882                 var items = selection.selectAll('li')
88883                     .data(data);
88884
88885                 // Exit
88886                 items.exit()
88887                     .remove();
88888
88889                 // Enter
88890                 var enter = items.enter()
88891                     .append('li');
88892
88893                 if (name === 'rule') {
88894                     enter
88895                         .call(tooltip()
88896                             .title(function(d) { return t('issues.' + d + '.tip'); })
88897                             .placement('top')
88898                         );
88899                 }
88900
88901                 var label = enter
88902                     .append('label');
88903
88904                 label
88905                     .append('input')
88906                     .attr('type', type)
88907                     .attr('name', name)
88908                     .on('change', change);
88909
88910                 label
88911                     .append('span')
88912                     .html(function(d) {
88913                         var params = {};
88914                         if (d === 'unsquare_way') {
88915                             params.val = '<span class="square-degrees"></span>';
88916                         }
88917                         return t('issues.' + d + '.title', params);
88918                     });
88919
88920                 // Update
88921                 items = items
88922                     .merge(enter);
88923
88924                 items
88925                     .classed('active', active)
88926                     .selectAll('input')
88927                     .property('checked', active)
88928                     .property('indeterminate', false);
88929
88930
88931                 // user-configurable square threshold
88932                 var degStr = context.storage('validate-square-degrees');
88933                 if (degStr === null) {
88934                     degStr = '' + DEFAULTSQUARE;
88935                 }
88936
88937                 var span = items.selectAll('.square-degrees');
88938                 var input = span.selectAll('.square-degrees-input')
88939                     .data([0]);
88940
88941                 // enter / update
88942                 input.enter()
88943                     .append('input')
88944                     .attr('type', 'number')
88945                     .attr('min', '' + MINSQUARE)
88946                     .attr('max', '' + MAXSQUARE)
88947                     .attr('step', '0.5')
88948                     .attr('class', 'square-degrees-input')
88949                     .call(utilNoAuto)
88950                     .on('input', function() {
88951                         this.style.width = (this.value.length + 2.5) + 'ch';   // resize
88952                     })
88953                     .on('click', function () {
88954                         event.preventDefault();
88955                         event.stopPropagation();
88956                         this.select();
88957                     })
88958                     .on('keyup', function () {
88959                         if (event.keyCode === 13) { // enter
88960                             this.blur();
88961                             this.select();
88962                         }
88963                     })
88964                     .on('blur', changeSquare)
88965                     .merge(input)
88966                     .property('value', degStr)
88967                     .style('width', (degStr.length + 2.5) + 'ch');   // resize
88968             }
88969
88970
88971             function changeSquare() {
88972                 var input = d3_select(this);
88973                 var degStr = utilGetSetValue(input).trim();
88974                 var degNum = parseFloat(degStr, 10);
88975
88976                 if (!isFinite(degNum)) {
88977                     degNum = DEFAULTSQUARE;
88978                 } else if (degNum > MAXSQUARE) {
88979                     degNum = MAXSQUARE;
88980                 } else if (degNum < MINSQUARE) {
88981                     degNum = MINSQUARE;
88982                 }
88983
88984                 degNum = Math.round(degNum * 10 ) / 10;   // round to 1 decimal
88985                 degStr = '' + degNum;
88986
88987                 input
88988                     .property('value', degStr)
88989                     .style('width', (degStr.length + 2.5) + 'ch');   // resize
88990
88991                 context.storage('validate-square-degrees', degStr);
88992                 context.validator().changeSquareThreshold(degNum);
88993             }
88994
88995
88996             function hidePane() {
88997                 context.ui().togglePanes();
88998             }
88999
89000
89001
89002             var paneTooltip = tooltip()
89003                 .placement((textDirection === 'rtl') ? 'right' : 'left')
89004                 .html(true)
89005                 .title(uiTooltipHtml(t('issues.title'), key));
89006
89007
89008
89009             uiIssues.togglePane = function() {
89010                 if (event) event.preventDefault();
89011                 paneTooltip.hide(_toggleButton);
89012                 context.ui().togglePanes(!_pane.classed('shown') ? _pane : undefined);
89013             };
89014
89015
89016             uiIssues.renderToggleButton = function(selection) {
89017                 _toggleButton = selection
89018                     .append('button')
89019                     .attr('tabindex', -1)
89020                     .on('click', uiIssues.togglePane)
89021                     .call(svgIcon('#iD-icon-alert', 'light'))
89022                     .call(addNotificationBadge)
89023                     .call(paneTooltip);
89024             };
89025
89026
89027             uiIssues.renderPane = function(selection) {
89028                 _pane = selection
89029                     .append('div')
89030                     .attr('class', 'fillL map-pane issues-pane hide')
89031                     .attr('pane', 'map-issues');
89032
89033                 var heading = _pane
89034                     .append('div')
89035                     .attr('class', 'pane-heading');
89036
89037                 heading
89038                     .append('h2')
89039                     .text(t('issues.title'));
89040
89041                 heading
89042                     .append('button')
89043                     .on('click', hidePane)
89044                     .call(svgIcon('#iD-icon-close'));
89045
89046                 var content = _pane
89047                     .append('div')
89048                     .attr('class', 'pane-content');
89049
89050                 content
89051                     .append('div')
89052                     .attr('class', 'issues-options')
89053                     .call(renderIssuesOptions);
89054
89055                 content
89056                     .append('div')
89057                     .attr('class', 'issues-none')
89058                     .call(renderNoIssuesBox);
89059
89060                 // errors
89061                 content
89062                     .append('div')
89063                     .attr('class', 'issues-errors')
89064                     .call(uiDisclosure(context, 'issues_errors', true)
89065                         .content(renderErrorsList)
89066                     );
89067
89068                 // warnings
89069                 content
89070                     .append('div')
89071                     .attr('class', 'issues-warnings')
89072                     .call(uiDisclosure(context, 'issues_warnings', true)
89073                         .content(renderWarningsList)
89074                     );
89075
89076                 // rules
89077                 content
89078                     .append('div')
89079                     .attr('class', 'issues-rules')
89080                     .call(uiDisclosure(context, 'issues_rules', false)
89081                         .title(t('issues.rules.title'))
89082                         .content(renderRulesList)
89083                     );
89084
89085                 // update();
89086
89087                 context.keybinding()
89088                     .on(key, uiIssues.togglePane);
89089             };
89090
89091             return uiIssues;
89092         }
89093
89094         function uiSettingsCustomData(context) {
89095             var dispatch$1 = dispatch('change');
89096
89097             function render(selection) {
89098                 var dataLayer = context.layers().layer('data');
89099
89100                 // keep separate copies of original and current settings
89101                 var _origSettings = {
89102                     fileList: (dataLayer && dataLayer.fileList()) || null,
89103                     url: context.storage('settings-custom-data-url')
89104                 };
89105                 var _currSettings = {
89106                     fileList: (dataLayer && dataLayer.fileList()) || null,
89107                     url: context.storage('settings-custom-data-url')
89108                 };
89109
89110                 // var example = 'https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png';
89111                 var modal = uiConfirm(selection).okButton();
89112
89113                 modal
89114                     .classed('settings-modal settings-custom-data', true);
89115
89116                 modal.select('.modal-section.header')
89117                     .append('h3')
89118                     .text(t('settings.custom_data.header'));
89119
89120
89121                 var textSection = modal.select('.modal-section.message-text');
89122
89123                 textSection
89124                     .append('pre')
89125                     .attr('class', 'instructions-file')
89126                     .text(t('settings.custom_data.file.instructions'));
89127
89128                 textSection
89129                     .append('input')
89130                     .attr('class', 'field-file')
89131                     .attr('type', 'file')
89132                     .property('files', _currSettings.fileList)  // works for all except IE11
89133                     .on('change', function() {
89134                         var files = event.target.files;
89135                         if (files && files.length) {
89136                             _currSettings.url = '';
89137                             textSection.select('.field-url').property('value', '');
89138                             _currSettings.fileList = files;
89139                         } else {
89140                             _currSettings.fileList = null;
89141                         }
89142                     });
89143
89144                 textSection
89145                     .append('h4')
89146                     .text(t('settings.custom_data.or'));
89147
89148                 textSection
89149                     .append('pre')
89150                     .attr('class', 'instructions-url')
89151                     .text(t('settings.custom_data.url.instructions'));
89152
89153                 textSection
89154                     .append('textarea')
89155                     .attr('class', 'field-url')
89156                     .attr('placeholder', t('settings.custom_data.url.placeholder'))
89157                     .call(utilNoAuto)
89158                     .property('value', _currSettings.url);
89159
89160
89161                 // insert a cancel button
89162                 var buttonSection = modal.select('.modal-section.buttons');
89163
89164                 buttonSection
89165                     .insert('button', '.ok-button')
89166                     .attr('class', 'button cancel-button secondary-action')
89167                     .text(t('confirm.cancel'));
89168
89169
89170                 buttonSection.select('.cancel-button')
89171                     .on('click.cancel', clickCancel);
89172
89173                 buttonSection.select('.ok-button')
89174                     .attr('disabled', isSaveDisabled)
89175                     .on('click.save', clickSave);
89176
89177
89178                 function isSaveDisabled() {
89179                     return null;
89180                 }
89181
89182
89183                 // restore the original url
89184                 function clickCancel() {
89185                     textSection.select('.field-url').property('value', _origSettings.url);
89186                     context.storage('settings-custom-data-url', _origSettings.url);
89187                     this.blur();
89188                     modal.close();
89189                 }
89190
89191                 // accept the current url
89192                 function clickSave() {
89193                     _currSettings.url = textSection.select('.field-url').property('value').trim();
89194
89195                     // one or the other but not both
89196                     if (_currSettings.url) { _currSettings.fileList = null; }
89197                     if (_currSettings.fileList) { _currSettings.url = ''; }
89198
89199                     context.storage('settings-custom-data-url', _currSettings.url);
89200                     this.blur();
89201                     modal.close();
89202                     dispatch$1.call('change', this, _currSettings);
89203                 }
89204             }
89205
89206             return utilRebind(render, dispatch$1, 'on');
89207         }
89208
89209         function uiMapData(context) {
89210             var key = t('map_data.key');
89211             var osmDataToggleKey = uiCmd('⌥' + t('area_fill.wireframe.key'));
89212             var features = context.features().keys();
89213             var layers = context.layers();
89214             var fills = ['wireframe', 'partial', 'full'];
89215
89216             var settingsCustomData = uiSettingsCustomData(context)
89217                 .on('change', customChanged);
89218
89219             var _pane = d3_select(null), _toggleButton = d3_select(null);
89220
89221             var _fillSelected = context.storage('area-fill') || 'partial';
89222             var _dataLayerContainer = d3_select(null);
89223             var _photoOverlayContainer = d3_select(null);
89224             var _fillList = d3_select(null);
89225             var _featureList = d3_select(null);
89226             var _QAList = d3_select(null);
89227
89228
89229             function showsFeature(d) {
89230                 return context.features().enabled(d);
89231             }
89232
89233
89234             function autoHiddenFeature(d) {
89235                 if (d.type === 'kr_error') return context.errors().autoHidden(d);
89236                 return context.features().autoHidden(d);
89237             }
89238
89239
89240             function clickFeature(d) {
89241                 context.features().toggle(d);
89242                 update();
89243             }
89244
89245
89246             function showsQA(d) {
89247                 var QAKeys = [d];
89248                 var QALayers = layers.all().filter(function(obj) { return QAKeys.indexOf(obj.id) !== -1; });
89249                 var data = QALayers.filter(function(obj) { return obj.layer.supported(); });
89250
89251                 function layerSupported(d) {
89252                     return d.layer && d.layer.supported();
89253                 }
89254                 function layerEnabled(d) {
89255                     return layerSupported(d) && d.layer.enabled();
89256                 }
89257
89258                 return layerEnabled(data[0]);
89259             }
89260
89261
89262             function showsFill(d) {
89263                 return _fillSelected === d;
89264             }
89265
89266
89267             function setFill(d) {
89268                 fills.forEach(function(opt) {
89269                     context.surface().classed('fill-' + opt, Boolean(opt === d));
89270                 });
89271
89272                 _fillSelected = d;
89273                 context.storage('area-fill', d);
89274                 if (d !== 'wireframe') {
89275                     context.storage('area-fill-toggle', d);
89276                 }
89277                 update();
89278             }
89279
89280
89281             function showsLayer(which) {
89282                 var layer = layers.layer(which);
89283                 if (layer) {
89284                     return layer.enabled();
89285                 }
89286                 return false;
89287             }
89288
89289
89290             function setLayer(which, enabled) {
89291                 // Don't allow layer changes while drawing - #6584
89292                 var mode = context.mode();
89293                 if (mode && /^draw/.test(mode.id)) return;
89294
89295                 var layer = layers.layer(which);
89296                 if (layer) {
89297                     layer.enabled(enabled);
89298
89299                     if (!enabled && (which === 'osm' || which === 'notes')) {
89300                         context.enter(modeBrowse(context));
89301                     }
89302
89303                     update();
89304                 }
89305             }
89306
89307
89308             function toggleLayer(which) {
89309                 setLayer(which, !showsLayer(which));
89310             }
89311
89312
89313             function drawPhotoItems(selection) {
89314                 var photoKeys = context.photos().overlayLayerIDs();
89315                 var photoLayers = layers.all().filter(function(obj) { return photoKeys.indexOf(obj.id) !== -1; });
89316                 var data = photoLayers.filter(function(obj) { return obj.layer.supported(); });
89317
89318                 function layerSupported(d) {
89319                     return d.layer && d.layer.supported();
89320                 }
89321                 function layerEnabled(d) {
89322                     return layerSupported(d) && d.layer.enabled();
89323                 }
89324
89325                 var ul = selection
89326                     .selectAll('.layer-list-photos')
89327                     .data([0]);
89328
89329                 ul = ul.enter()
89330                     .append('ul')
89331                     .attr('class', 'layer-list layer-list-photos')
89332                     .merge(ul);
89333
89334                 var li = ul.selectAll('.list-item-photos')
89335                     .data(data);
89336
89337                 li.exit()
89338                     .remove();
89339
89340                 var liEnter = li.enter()
89341                     .append('li')
89342                     .attr('class', function(d) {
89343                         var classes = 'list-item-photos list-item-' + d.id;
89344                         if (d.id === 'mapillary-signs') {
89345                             classes += ' indented';
89346                         }
89347                         return classes;
89348                     });
89349
89350                 var labelEnter = liEnter
89351                     .append('label')
89352                     .each(function(d) {
89353                         var titleID;
89354                         if (d.id === 'mapillary-signs') titleID = 'mapillary.signs.tooltip';
89355                         else if (d.id === 'mapillary') titleID = 'mapillary_images.tooltip';
89356                         else if (d.id === 'openstreetcam') titleID = 'openstreetcam_images.tooltip';
89357                         else titleID = d.id.replace('-', '_') + '.tooltip';
89358                         d3_select(this)
89359                             .call(tooltip()
89360                                 .title(t(titleID))
89361                                 .placement('top')
89362                             );
89363                     });
89364
89365                 labelEnter
89366                     .append('input')
89367                     .attr('type', 'checkbox')
89368                     .on('change', function(d) { toggleLayer(d.id); });
89369
89370                 labelEnter
89371                     .append('span')
89372                     .text(function(d) {
89373                         var id = d.id;
89374                         if (id === 'mapillary-signs') id = 'photo_overlays.traffic_signs';
89375                         return t(id.replace('-', '_') + '.title');
89376                     });
89377
89378
89379                 // Update
89380                 li
89381                     .merge(liEnter)
89382                     .classed('active', layerEnabled)
89383                     .selectAll('input')
89384                     .property('checked', layerEnabled);
89385             }
89386
89387             function drawPhotoTypeItems(selection) {
89388                 var data = context.photos().allPhotoTypes();
89389
89390                 function typeEnabled(d) {
89391                     return context.photos().showsPhotoType(d);
89392                 }
89393
89394                 var ul = selection
89395                     .selectAll('.layer-list-photo-types')
89396                     .data(context.photos().shouldFilterByPhotoType() ? [0] : []);
89397
89398                 ul.exit()
89399                     .remove();
89400
89401                 ul = ul.enter()
89402                     .append('ul')
89403                     .attr('class', 'layer-list layer-list-photo-types')
89404                     .merge(ul);
89405
89406                 var li = ul.selectAll('.list-item-photo-types')
89407                     .data(data);
89408
89409                 li.exit()
89410                     .remove();
89411
89412                 var liEnter = li.enter()
89413                     .append('li')
89414                     .attr('class', function(d) {
89415                         return 'list-item-photo-types list-item-' + d;
89416                     });
89417
89418                 var labelEnter = liEnter
89419                     .append('label')
89420                     .each(function(d) {
89421                         d3_select(this)
89422                             .call(tooltip()
89423                                 .title(t('photo_overlays.photo_type.' + d + '.tooltip'))
89424                                 .placement('top')
89425                             );
89426                     });
89427
89428                 labelEnter
89429                     .append('input')
89430                     .attr('type', 'checkbox')
89431                     .on('change', function(d) {
89432                         context.photos().togglePhotoType(d);
89433                         update();
89434                     });
89435
89436                 labelEnter
89437                     .append('span')
89438                     .text(function(d) {
89439                         return t('photo_overlays.photo_type.' + d + '.title');
89440                     });
89441
89442
89443                 // Update
89444                 li
89445                     .merge(liEnter)
89446                     .classed('active', typeEnabled)
89447                     .selectAll('input')
89448                     .property('checked', typeEnabled);
89449             }
89450
89451
89452             function drawOsmItems(selection) {
89453                 var osmKeys = ['osm', 'notes'];
89454                 var osmLayers = layers.all().filter(function(obj) { return osmKeys.indexOf(obj.id) !== -1; });
89455
89456                 var ul = selection
89457                     .selectAll('.layer-list-osm')
89458                     .data([0]);
89459
89460                 ul = ul.enter()
89461                     .append('ul')
89462                     .attr('class', 'layer-list layer-list-osm')
89463                     .merge(ul);
89464
89465                 var li = ul.selectAll('.list-item')
89466                     .data(osmLayers);
89467
89468                 li.exit()
89469                     .remove();
89470
89471                 var liEnter = li.enter()
89472                     .append('li')
89473                     .attr('class', function(d) { return 'list-item list-item-' + d.id; });
89474
89475                 var labelEnter = liEnter
89476                     .append('label')
89477                     .each(function(d) {
89478                         if (d.id === 'osm') {
89479                             d3_select(this)
89480                                 .call(tooltip()
89481                                     .html(true)
89482                                     .title(uiTooltipHtml(t('map_data.layers.' + d.id + '.tooltip'), osmDataToggleKey))
89483                                     .placement('bottom')
89484                                 );
89485                         } else {
89486                             d3_select(this)
89487                                 .call(tooltip()
89488                                     .title(t('map_data.layers.' + d.id + '.tooltip'))
89489                                     .placement('bottom')
89490                                 );
89491                         }
89492                     });
89493
89494                 labelEnter
89495                     .append('input')
89496                     .attr('type', 'checkbox')
89497                     .on('change', function(d) { toggleLayer(d.id); });
89498
89499                 labelEnter
89500                     .append('span')
89501                     .text(function(d) { return t('map_data.layers.' + d.id + '.title'); });
89502
89503
89504                 // Update
89505                 li
89506                     .merge(liEnter)
89507                     .classed('active', function (d) { return d.layer.enabled(); })
89508                     .selectAll('input')
89509                     .property('checked', function (d) { return d.layer.enabled(); });
89510             }
89511
89512
89513             function drawQAItems(selection) {
89514                 var qaKeys = ['keepRight', 'improveOSM'];
89515                 var qaLayers = layers.all().filter(function(obj) { return qaKeys.indexOf(obj.id) !== -1; });
89516
89517                 var ul = selection
89518                     .selectAll('.layer-list-qa')
89519                     .data([0]);
89520
89521                 ul = ul.enter()
89522                     .append('ul')
89523                     .attr('class', 'layer-list layer-list-qa')
89524                     .merge(ul);
89525
89526                 var li = ul.selectAll('.list-item')
89527                     .data(qaLayers);
89528
89529                 li.exit()
89530                     .remove();
89531
89532                 var liEnter = li.enter()
89533                     .append('li')
89534                     .attr('class', function(d) { return 'list-item list-item-' + d.id; });
89535
89536                 var labelEnter = liEnter
89537                     .append('label')
89538                     .each(function(d) {
89539                         d3_select(this)
89540                             .call(tooltip()
89541                                 .title(t('map_data.layers.' + d.id + '.tooltip'))
89542                                 .placement('bottom')
89543                             );
89544                     });
89545
89546                 labelEnter
89547                     .append('input')
89548                     .attr('type', 'checkbox')
89549                     .on('change', function(d) { toggleLayer(d.id); });
89550
89551                 labelEnter
89552                     .append('span')
89553                     .text(function(d) { return t('map_data.layers.' + d.id + '.title'); });
89554
89555
89556                 // Update
89557                 li
89558                     .merge(liEnter)
89559                     .classed('active', function (d) { return d.layer.enabled(); })
89560                     .selectAll('input')
89561                     .property('checked', function (d) { return d.layer.enabled(); });
89562             }
89563
89564
89565             // Beta feature - sample vector layers to support Detroit Mapping Challenge
89566             // https://github.com/osmus/detroit-mapping-challenge
89567             function drawVectorItems(selection) {
89568                 var dataLayer = layers.layer('data');
89569                 var vtData = [
89570                     {
89571                         name: 'Detroit Neighborhoods/Parks',
89572                         src: 'neighborhoods-parks',
89573                         tooltip: 'Neighborhood boundaries and parks as compiled by City of Detroit in concert with community groups.',
89574                         template: 'https://{switch:a,b,c,d}.tiles.mapbox.com/v4/jonahadkins.cjksmur6x34562qp9iv1u3ksf-54hev,jonahadkins.cjksmqxdx33jj2wp90xd9x2md-4e5y2/{z}/{x}/{y}.vector.pbf?access_token=pk.eyJ1Ijoiam9uYWhhZGtpbnMiLCJhIjoiRlVVVkx3VSJ9.9sdVEK_B_VkEXPjssU5MqA'
89575                     }, {
89576                         name: 'Detroit Composite POIs',
89577                         src: 'composite-poi',
89578                         tooltip: 'Fire Inspections, Business Licenses, and other public location data collated from the City of Detroit.',
89579                         template: 'https://{switch:a,b,c,d}.tiles.mapbox.com/v4/jonahadkins.cjksmm6a02sli31myxhsr7zf3-2sw8h/{z}/{x}/{y}.vector.pbf?access_token=pk.eyJ1Ijoiam9uYWhhZGtpbnMiLCJhIjoiRlVVVkx3VSJ9.9sdVEK_B_VkEXPjssU5MqA'
89580                     }, {
89581                         name: 'Detroit All-The-Places POIs',
89582                         src: 'alltheplaces-poi',
89583                         tooltip: 'Public domain business location data created by web scrapers.',
89584                         template: 'https://{switch:a,b,c,d}.tiles.mapbox.com/v4/jonahadkins.cjksmswgk340g2vo06p1w9w0j-8fjjc/{z}/{x}/{y}.vector.pbf?access_token=pk.eyJ1Ijoiam9uYWhhZGtpbnMiLCJhIjoiRlVVVkx3VSJ9.9sdVEK_B_VkEXPjssU5MqA'
89585                     }
89586                 ];
89587
89588                 // Only show this if the map is around Detroit..
89589                 var detroit = geoExtent([-83.5, 42.1], [-82.8, 42.5]);
89590                 var showVectorItems = (context.map().zoom() > 9 && detroit.contains(context.map().center()));
89591
89592                 var container = selection.selectAll('.vectortile-container')
89593                     .data(showVectorItems ? [0] : []);
89594
89595                 container.exit()
89596                     .remove();
89597
89598                 var containerEnter = container.enter()
89599                     .append('div')
89600                     .attr('class', 'vectortile-container');
89601
89602                 containerEnter
89603                     .append('h4')
89604                     .attr('class', 'vectortile-header')
89605                     .text('Detroit Vector Tiles (Beta)');
89606
89607                 containerEnter
89608                     .append('ul')
89609                     .attr('class', 'layer-list layer-list-vectortile');
89610
89611                 containerEnter
89612                     .append('div')
89613                     .attr('class', 'vectortile-footer')
89614                     .append('a')
89615                     .attr('target', '_blank')
89616                     .attr('tabindex', -1)
89617                     .call(svgIcon('#iD-icon-out-link', 'inline'))
89618                     .attr('href', 'https://github.com/osmus/detroit-mapping-challenge')
89619                     .append('span')
89620                     .text('About these layers');
89621
89622                 container = container
89623                     .merge(containerEnter);
89624
89625
89626                 var ul = container.selectAll('.layer-list-vectortile');
89627
89628                 var li = ul.selectAll('.list-item')
89629                     .data(vtData);
89630
89631                 li.exit()
89632                     .remove();
89633
89634                 var liEnter = li.enter()
89635                     .append('li')
89636                     .attr('class', function(d) { return 'list-item list-item-' + d.src; });
89637
89638                 var labelEnter = liEnter
89639                     .append('label')
89640                     .each(function(d) {
89641                         d3_select(this).call(
89642                             tooltip().title(d.tooltip).placement('top')
89643                         );
89644                     });
89645
89646                 labelEnter
89647                     .append('input')
89648                     .attr('type', 'radio')
89649                     .attr('name', 'vectortile')
89650                     .on('change', selectVTLayer);
89651
89652                 labelEnter
89653                     .append('span')
89654                     .text(function(d) { return d.name; });
89655
89656                 // Update
89657                 li
89658                     .merge(liEnter)
89659                     .classed('active', isVTLayerSelected)
89660                     .selectAll('input')
89661                     .property('checked', isVTLayerSelected);
89662
89663
89664                 function isVTLayerSelected(d) {
89665                     return dataLayer && dataLayer.template() === d.template;
89666                 }
89667
89668                 function selectVTLayer(d) {
89669                     context.storage('settings-custom-data-url', d.template);
89670                     if (dataLayer) {
89671                         dataLayer.template(d.template, d.src);
89672                         dataLayer.enabled(true);
89673                     }
89674                 }
89675             }
89676
89677
89678             function drawCustomDataItems(selection) {
89679                 var dataLayer = layers.layer('data');
89680                 var hasData = dataLayer && dataLayer.hasData();
89681                 var showsData = hasData && dataLayer.enabled();
89682
89683                 var ul = selection
89684                     .selectAll('.layer-list-data')
89685                     .data(dataLayer ? [0] : []);
89686
89687                 // Exit
89688                 ul.exit()
89689                     .remove();
89690
89691                 // Enter
89692                 var ulEnter = ul.enter()
89693                     .append('ul')
89694                     .attr('class', 'layer-list layer-list-data');
89695
89696                 var liEnter = ulEnter
89697                     .append('li')
89698                     .attr('class', 'list-item-data');
89699
89700                 liEnter
89701                     .append('button')
89702                     .call(tooltip()
89703                         .title(t('settings.custom_data.tooltip'))
89704                         .placement((textDirection === 'rtl') ? 'right' : 'left')
89705                     )
89706                     .on('click', editCustom)
89707                     .call(svgIcon('#iD-icon-more'));
89708
89709                 liEnter
89710                     .append('button')
89711                     .call(tooltip()
89712                         .title(t('map_data.layers.custom.zoom'))
89713                         .placement((textDirection === 'rtl') ? 'right' : 'left')
89714                     )
89715                     .on('click', function() {
89716                         event.preventDefault();
89717                         event.stopPropagation();
89718                         dataLayer.fitZoom();
89719                     })
89720                     .call(svgIcon('#iD-icon-search'));
89721
89722                 var labelEnter = liEnter
89723                     .append('label')
89724                     .call(tooltip()
89725                         .title(t('map_data.layers.custom.tooltip'))
89726                         .placement('top')
89727                     );
89728
89729                 labelEnter
89730                     .append('input')
89731                     .attr('type', 'checkbox')
89732                     .on('change', function() { toggleLayer('data'); });
89733
89734                 labelEnter
89735                     .append('span')
89736                     .text(t('map_data.layers.custom.title'));
89737
89738                 // Update
89739                 ul = ul
89740                     .merge(ulEnter);
89741
89742                 ul.selectAll('.list-item-data')
89743                     .classed('active', showsData)
89744                     .selectAll('label')
89745                     .classed('deemphasize', !hasData)
89746                     .selectAll('input')
89747                     .property('disabled', !hasData)
89748                     .property('checked', showsData);
89749             }
89750
89751
89752             function editCustom() {
89753                 event.preventDefault();
89754                 context.container()
89755                     .call(settingsCustomData);
89756             }
89757
89758
89759             function customChanged(d) {
89760                 var dataLayer = layers.layer('data');
89761
89762                 if (d && d.url) {
89763                     dataLayer.url(d.url);
89764                 } else if (d && d.fileList) {
89765                     dataLayer.fileList(d.fileList);
89766                 }
89767             }
89768
89769
89770             function drawListItems(selection, data, type, name, change, active) {
89771                 var items = selection.selectAll('li')
89772                     .data(data);
89773
89774                 // Exit
89775                 items.exit()
89776                     .remove();
89777
89778                 // Enter
89779                 var enter = items.enter()
89780                     .append('li')
89781                     .call(tooltip()
89782                         .html(true)
89783                         .title(function(d) {
89784                             var tip = t(name + '.' + d + '.tooltip');
89785                             var key = (d === 'wireframe' ? t('area_fill.wireframe.key') : null);
89786                             if ((name === 'feature' || name === 'keepRight') && autoHiddenFeature(d)) {
89787                                 var msg = showsLayer('osm') ? t('map_data.autohidden') : t('map_data.osmhidden');
89788                                 tip += '<div>' + msg + '</div>';
89789                             }
89790                             return uiTooltipHtml(tip, key);
89791                         })
89792                         .placement('top')
89793                     );
89794
89795                 var label = enter
89796                     .append('label');
89797
89798                 label
89799                     .append('input')
89800                     .attr('type', type)
89801                     .attr('name', name)
89802                     .on('change', change);
89803
89804                 label
89805                     .append('span')
89806                     .text(function(d) { return t(name + '.' + d + '.description'); });
89807
89808                 // Update
89809                 items = items
89810                     .merge(enter);
89811
89812                 items
89813                     .classed('active', active)
89814                     .selectAll('input')
89815                     .property('checked', active)
89816                     .property('indeterminate', function(d) {
89817                         return ((name === 'feature' || name === 'keepRight') && autoHiddenFeature(d));
89818                     });
89819             }
89820
89821
89822             function renderDataLayers(selection) {
89823                 var container = selection.selectAll('.data-layer-container')
89824                     .data([0]);
89825
89826                 _dataLayerContainer = container.enter()
89827                     .append('div')
89828                     .attr('class', 'data-layer-container')
89829                     .merge(container);
89830
89831                 updateDataLayers();
89832             }
89833
89834             function renderPhotoOverlays(selection) {
89835                 var container = selection.selectAll('.photo-overlay-container')
89836                     .data([0]);
89837
89838                 _photoOverlayContainer = container.enter()
89839                     .append('div')
89840                     .attr('class', 'photo-overlay-container')
89841                     .merge(container);
89842
89843                 updatePhotoOverlays();
89844             }
89845
89846
89847             function renderFillList(selection) {
89848                 var container = selection.selectAll('.layer-fill-list')
89849                     .data([0]);
89850
89851                 _fillList = container.enter()
89852                     .append('ul')
89853                     .attr('class', 'layer-list layer-fill-list')
89854                     .merge(container);
89855
89856                 updateFillList();
89857             }
89858
89859
89860             function renderFeatureList(selection) {
89861                 var container = selection.selectAll('.layer-feature-list-container')
89862                     .data([0]);
89863
89864                 var containerEnter = container.enter()
89865                     .append('div')
89866                     .attr('class', 'layer-feature-list-container');
89867
89868                 containerEnter
89869                     .append('ul')
89870                     .attr('class', 'layer-list layer-feature-list');
89871
89872                 var footer = containerEnter
89873                     .append('div')
89874                     .attr('class', 'feature-list-links section-footer');
89875
89876                 footer
89877                     .append('a')
89878                     .attr('class', 'feature-list-link')
89879                     .attr('href', '#')
89880                     .text(t('issues.enable_all'))
89881                     .on('click', function() {
89882                         context.features().enableAll();
89883                     });
89884
89885                 footer
89886                     .append('a')
89887                     .attr('class', 'feature-list-link')
89888                     .attr('href', '#')
89889                     .text(t('issues.disable_all'))
89890                     .on('click', function() {
89891                         context.features().disableAll();
89892                     });
89893
89894                 // Update
89895                 container = container
89896                     .merge(containerEnter);
89897
89898                 _featureList = container.selectAll('.layer-feature-list');
89899
89900                 updateFeatureList();
89901             }
89902
89903             function updatePhotoOverlays() {
89904                 _photoOverlayContainer
89905                     .call(drawPhotoItems)
89906                     .call(drawPhotoTypeItems);
89907             }
89908
89909             function updateDataLayers() {
89910                 _dataLayerContainer
89911                     .call(drawOsmItems)
89912                     .call(drawQAItems)
89913                     .call(drawCustomDataItems)
89914                     .call(drawVectorItems);      // Beta - Detroit mapping challenge
89915             }
89916
89917             function updateFillList() {
89918                 _fillList
89919                     .call(drawListItems, fills, 'radio', 'area_fill', setFill, showsFill);
89920             }
89921
89922             function updateFeatureList() {
89923                 _featureList
89924                     .call(drawListItems, features, 'checkbox', 'feature', clickFeature, showsFeature);
89925             }
89926
89927             function update() {
89928
89929                 if (!_pane.select('.disclosure-wrap-data_layers').classed('hide')) {
89930                     updateDataLayers();
89931                 }
89932                 if (!_pane.select('.disclosure-wrap-photo_overlays').classed('hide')) {
89933                     updatePhotoOverlays();
89934                 }
89935                 if (!_pane.select('.disclosure-wrap-fill_area').classed('hide')) {
89936                     updateFillList();
89937                 }
89938                 if (!_pane.select('.disclosure-wrap-map_features').classed('hide')) {
89939                     updateFeatureList();
89940                 }
89941
89942                 _QAList
89943                     .call(drawListItems, ['keep-right'], 'checkbox', 'QA', function(d) { toggleLayer(d); }, showsQA);
89944             }
89945
89946
89947             function toggleWireframe() {
89948                 if (event) {
89949                     event.preventDefault();
89950                     event.stopPropagation();
89951                 }
89952
89953                 if (_fillSelected === 'wireframe') {
89954                     _fillSelected = context.storage('area-fill-toggle') || 'partial';
89955                 } else {
89956                     _fillSelected = 'wireframe';
89957                 }
89958
89959                 setFill(_fillSelected);
89960                 context.map().pan([0,0]);  // trigger a redraw
89961             }
89962
89963             var paneTooltip = tooltip()
89964                 .placement((textDirection === 'rtl') ? 'right' : 'left')
89965                 .html(true)
89966                 .title(uiTooltipHtml(t('map_data.description'), key));
89967
89968             function hidePane() {
89969                 context.ui().togglePanes();
89970             }
89971
89972             uiMapData.togglePane = function() {
89973                 if (event) event.preventDefault();
89974                 paneTooltip.hide(_toggleButton);
89975                 context.ui().togglePanes(!_pane.classed('shown') ? _pane : undefined);
89976             };
89977
89978             uiMapData.renderToggleButton = function(selection) {
89979
89980                 _toggleButton = selection
89981                     .append('button')
89982                     .attr('tabindex', -1)
89983                     .on('click', uiMapData.togglePane)
89984                     .call(svgIcon('#iD-icon-data', 'light'))
89985                     .call(paneTooltip);
89986             };
89987
89988
89989             uiMapData.renderPane = function(selection) {
89990
89991                 _pane = selection
89992                     .append('div')
89993                     .attr('class', 'fillL map-pane map-data-pane hide')
89994                     .attr('pane', 'map-data');
89995
89996                 var heading = _pane
89997                     .append('div')
89998                     .attr('class', 'pane-heading');
89999
90000                 heading
90001                     .append('h2')
90002                     .text(t('map_data.title'));
90003
90004                 heading
90005                     .append('button')
90006                     .on('click', hidePane)
90007                     .call(svgIcon('#iD-icon-close'));
90008
90009
90010                 var content = _pane
90011                     .append('div')
90012                     .attr('class', 'pane-content');
90013
90014
90015                 // data layers
90016                 content
90017                     .append('div')
90018                     .attr('class', 'map-data-data-layers')
90019                     .call(uiDisclosure(context, 'data_layers', true)
90020                         .title(t('map_data.data_layers'))
90021                         .content(renderDataLayers)
90022                     );
90023
90024                 // photo overlays
90025                 content
90026                     .append('div')
90027                     .attr('class', 'map-data-photo-overlays')
90028                     .call(uiDisclosure(context, 'photo_overlays', false)
90029                         .title(t('photo_overlays.title'))
90030                         .content(renderPhotoOverlays)
90031                     );
90032
90033                 // area fills
90034                 content
90035                     .append('div')
90036                     .attr('class', 'map-data-area-fills')
90037                     .call(uiDisclosure(context, 'fill_area', false)
90038                         .title(t('map_data.fill_area'))
90039                         .content(renderFillList)
90040                     );
90041
90042                 // feature filters
90043                 content
90044                     .append('div')
90045                     .attr('class', 'map-data-feature-filters')
90046                     .call(uiDisclosure(context, 'map_features', false)
90047                         .title(t('map_data.map_features'))
90048                         .content(renderFeatureList)
90049                     );
90050
90051
90052                 // add listeners
90053                 context.features()
90054                     .on('change.map_data-update', update);
90055
90056                 update();
90057                 setFill(_fillSelected);
90058
90059                 context.keybinding()
90060                     .on(key, uiMapData.togglePane)
90061                     .on(t('area_fill.wireframe.key'), toggleWireframe)
90062                     .on(osmDataToggleKey, function() {
90063                         event.preventDefault();
90064                         event.stopPropagation();
90065                         toggleLayer('osm');
90066                     });
90067             };
90068
90069             return uiMapData;
90070         }
90071
90072         function uiNotice(context) {
90073
90074             return function(selection) {
90075                 var div = selection
90076                     .append('div')
90077                     .attr('class', 'notice');
90078
90079                 var button = div
90080                     .append('button')
90081                     .attr('class', 'zoom-to notice fillD')
90082                     .on('click', function() {
90083                         context.map().zoomEase(context.minEditableZoom());
90084                     })
90085                     .on('wheel', function() {   // let wheel events pass through #4482
90086                         var e2 = new WheelEvent(event.type, event);
90087                         context.surface().node().dispatchEvent(e2);
90088                     });
90089
90090                 button
90091                     .call(svgIcon('#iD-icon-plus', 'pre-text'))
90092                     .append('span')
90093                     .attr('class', 'label')
90094                     .text(t('zoom_in_edit'));
90095
90096
90097                 function disableTooHigh() {
90098                     var canEdit = context.map().zoom() >= context.minEditableZoom();
90099                     div.style('display', canEdit ? 'none' : 'block');
90100                 }
90101
90102                 context.map()
90103                     .on('move.notice', debounce(disableTooHigh, 500));
90104
90105                 disableTooHigh();
90106             };
90107         }
90108
90109         function uiPhotoviewer(context) {
90110
90111             var dispatch$1 = dispatch('resize');
90112
90113             function photoviewer(selection) {
90114                 selection
90115                     .append('button')
90116                     .attr('class', 'thumb-hide')
90117                     .on('click', function () {
90118                         if (services$1.streetside) { services$1.streetside.hideViewer(); }
90119                         if (services$1.mapillary) { services$1.mapillary.hideViewer(); }
90120                         if (services$1.openstreetcam) { services$1.openstreetcam.hideViewer(); }
90121                     })
90122                     .append('div')
90123                     .call(svgIcon('#iD-icon-close'));
90124
90125                 selection
90126                     .append('button')
90127                     .attr('class', 'resize-handle-xy')
90128                     .on(
90129                         'mousedown',
90130                         buildResizeListener(selection, 'resize', dispatch$1, { resizeOnX: true, resizeOnY: true })
90131                     );
90132
90133                 selection
90134                     .append('button')
90135                     .attr('class', 'resize-handle-x')
90136                     .on(
90137                         'mousedown',
90138                         buildResizeListener(selection, 'resize', dispatch$1, { resizeOnX: true })
90139                     );
90140
90141                 selection
90142                     .append('button')
90143                     .attr('class', 'resize-handle-y')
90144                     .on(
90145                         'mousedown',
90146                         buildResizeListener(selection, 'resize', dispatch$1, { resizeOnY: true })
90147                     );
90148
90149                 services$1.streetside.loadViewer(context);
90150                 services$1.mapillary.loadViewer(context);
90151                 services$1.openstreetcam.loadViewer(context);
90152
90153                 function buildResizeListener(target, eventName, dispatch, options) {
90154                     var resizeOnX = !!options.resizeOnX;
90155                     var resizeOnY = !!options.resizeOnY;
90156                     var minHeight = options.minHeight || 240;
90157                     var minWidth = options.minWidth || 320;
90158                     var startX;
90159                     var startY;
90160                     var startWidth;
90161                     var startHeight;
90162
90163                     function startResize() {
90164                         var mapSize = context.map().dimensions();
90165
90166                         if (resizeOnX) {
90167                             var maxWidth = mapSize[0];
90168                             var newWidth = clamp((startWidth + event.clientX - startX), minWidth, maxWidth);
90169                             target.style('width', newWidth + 'px');
90170                         }
90171
90172                         if (resizeOnY) {
90173                             var maxHeight = mapSize[1] - 90;  // preserve space at top/bottom of map
90174                             var newHeight = clamp((startHeight + startY - event.clientY), minHeight, maxHeight);
90175                             target.style('height', newHeight + 'px');
90176                         }
90177
90178                         dispatch.call(eventName, target, utilGetDimensions(target, true));
90179                     }
90180
90181                     function clamp(num, min, max) {
90182                         return Math.max(min, Math.min(num, max));
90183                     }
90184
90185                     function stopResize() {
90186                         d3_select(window)
90187                             .on('.' + eventName, null);
90188                     }
90189
90190                     return function initResize() {
90191                         startX = event.clientX;
90192                         startY = event.clientY;
90193                         startWidth = target.node().getBoundingClientRect().width;
90194                         startHeight = target.node().getBoundingClientRect().height;
90195
90196                         d3_select(window)
90197                             .on('mousemove.' + eventName, startResize, false)
90198                             .on('mouseup.' + eventName, stopResize, false);
90199                     };
90200                 }
90201             }
90202
90203             photoviewer.onMapResize = function() {
90204                 var photoviewer = d3_select('#photoviewer');
90205                 var content = d3_select('#content');
90206                 var mapDimensions = utilGetDimensions(content, true);
90207                 // shrink photo viewer if it is too big
90208                 // (-90 preserves space at top and bottom of map used by menus)
90209                 var photoDimensions = utilGetDimensions(photoviewer, true);
90210                 if (photoDimensions[0] > mapDimensions[0] || photoDimensions[1] > (mapDimensions[1] - 90)) {
90211                     var setPhotoDimensions = [
90212                         Math.min(photoDimensions[0], mapDimensions[0]),
90213                         Math.min(photoDimensions[1], mapDimensions[1] - 90),
90214                     ];
90215
90216                     photoviewer
90217                         .style('width', setPhotoDimensions[0] + 'px')
90218                         .style('height', setPhotoDimensions[1] + 'px');
90219
90220                     dispatch$1.call('resize', photoviewer, setPhotoDimensions);
90221                 }
90222             };
90223
90224             return utilRebind(photoviewer, dispatch$1, 'on');
90225         }
90226
90227         function uiRestore(context) {
90228
90229             return function(selection) {
90230                 if (!context.history().lock() || !context.history().restorableChanges())
90231                     return;
90232
90233                 var modalSelection = uiModal(selection, true);
90234
90235                 modalSelection.select('.modal')
90236                     .attr('class', 'modal fillL');
90237
90238                 var introModal = modalSelection.select('.content');
90239
90240                 introModal
90241                     .append('div')
90242                     .attr('class', 'modal-section')
90243                     .append('h3')
90244                     .text(t('restore.heading'));
90245
90246                 introModal
90247                     .append('div')
90248                     .attr('class','modal-section')
90249                     .append('p')
90250                     .text(t('restore.description'));
90251
90252                 var buttonWrap = introModal
90253                     .append('div')
90254                     .attr('class', 'modal-actions');
90255
90256                 var restore = buttonWrap
90257                     .append('button')
90258                     .attr('class', 'restore')
90259                     .on('click', function() {
90260                         context.history().restore();
90261                         modalSelection.remove();
90262                     });
90263
90264                 restore
90265                     .append('svg')
90266                     .attr('class', 'logo logo-restore')
90267                     .append('use')
90268                     .attr('xlink:href', '#iD-logo-restore');
90269
90270                 restore
90271                     .append('div')
90272                     .text(t('restore.restore'));
90273
90274                 var reset = buttonWrap
90275                     .append('button')
90276                     .attr('class', 'reset')
90277                     .on('click', function() {
90278                         context.history().clearSaved();
90279                         modalSelection.remove();
90280                     });
90281
90282                 reset
90283                     .append('svg')
90284                     .attr('class', 'logo logo-reset')
90285                     .append('use')
90286                     .attr('xlink:href', '#iD-logo-reset');
90287
90288                 reset
90289                     .append('div')
90290                     .text(t('restore.reset'));
90291
90292                 restore.node().focus();
90293             };
90294         }
90295
90296         function uiScale(context) {
90297             var projection = context.projection,
90298                 isImperial = (utilDetect().locale.toLowerCase() === 'en-us'),
90299                 maxLength = 180,
90300                 tickHeight = 8;
90301
90302
90303             function scaleDefs(loc1, loc2) {
90304                 var lat = (loc2[1] + loc1[1]) / 2,
90305                     conversion = (isImperial ? 3.28084 : 1),
90306                     dist = geoLonToMeters(loc2[0] - loc1[0], lat) * conversion,
90307                     scale = { dist: 0, px: 0, text: '' },
90308                     buckets, i, val, dLon;
90309
90310                 if (isImperial) {
90311                     buckets = [5280000, 528000, 52800, 5280, 500, 50, 5, 1];
90312                 } else {
90313                     buckets = [5000000, 500000, 50000, 5000, 500, 50, 5, 1];
90314                 }
90315
90316                 // determine a user-friendly endpoint for the scale
90317                 for (i = 0; i < buckets.length; i++) {
90318                     val = buckets[i];
90319                     if (dist >= val) {
90320                         scale.dist = Math.floor(dist / val) * val;
90321                         break;
90322                     } else {
90323                         scale.dist = +dist.toFixed(2);
90324                     }
90325                 }
90326
90327                 dLon = geoMetersToLon(scale.dist / conversion, lat);
90328                 scale.px = Math.round(projection([loc1[0] + dLon, loc1[1]])[0]);
90329
90330                 scale.text = displayLength(scale.dist / conversion, isImperial);
90331
90332                 return scale;
90333             }
90334
90335
90336             function update(selection) {
90337                 // choose loc1, loc2 along bottom of viewport (near where the scale will be drawn)
90338                 var dims = context.map().dimensions(),
90339                     loc1 = projection.invert([0, dims[1]]),
90340                     loc2 = projection.invert([maxLength, dims[1]]),
90341                     scale = scaleDefs(loc1, loc2);
90342
90343                 selection.select('#scale-path')
90344                     .attr('d', 'M0.5,0.5v' + tickHeight + 'h' + scale.px + 'v-' + tickHeight);
90345
90346                 selection.select('#scale-textgroup')
90347                     .attr('transform', 'translate(' + (scale.px + 8) + ',' + tickHeight + ')');
90348
90349                 selection.select('#scale-text')
90350                     .text(scale.text);
90351             }
90352
90353
90354             return function(selection) {
90355                 function switchUnits() {
90356                     isImperial = !isImperial;
90357                     selection.call(update);
90358                 }
90359
90360                 var scalegroup = selection.append('svg')
90361                     .attr('id', 'scale')
90362                     .on('click', switchUnits)
90363                     .append('g')
90364                     .attr('transform', 'translate(10,11)');
90365
90366                 scalegroup
90367                     .append('path')
90368                     .attr('id', 'scale-path');
90369
90370                 scalegroup
90371                     .append('g')
90372                     .attr('id', 'scale-textgroup')
90373                     .append('text')
90374                     .attr('id', 'scale-text');
90375
90376                 selection.call(update);
90377
90378                 context.map().on('move.scale', function() {
90379                     update(selection);
90380                 });
90381             };
90382         }
90383
90384         var pair_1 = pair$1;
90385
90386         function search(x, dims, r) {
90387           if (!dims) dims = 'NSEW';
90388           if (typeof x !== 'string') return { val: null, regex: r };
90389
90390           r = r || /[\s\,]*([NSEW])?\s*([\-|\—|\―]?[0-9.]+)°?\s*(?:([0-9.]+)['’′‘]\s*)?(?:([0-9.]+)(?:''|"|”|″)\s*)?([NSEW])?/gi;
90391
90392           var m = r.exec(x);
90393           if (!m) return { val: null, regex: r };
90394
90395           var dim = m[1] || m[5];
90396           if (dim && dims.indexOf(dim) === -1) return { val: null, regex: r };
90397
90398           return {
90399             val: (((m[2]) ? parseFloat(m[2]) : 0) +
90400                   ((m[3] ? parseFloat(m[3]) / 60 : 0)) +
90401                   ((m[4] ? parseFloat(m[4]) / 3600 : 0))) *
90402                   ((dim === 'S' || dim === 'W') ? -1 : 1),
90403             regex: r,
90404             raw: m[0],
90405             dim: dim
90406           };
90407         }
90408
90409         function pair$1(x, dims) {
90410           x = x.trim();
90411           var one = search(x, dims);
90412           if (one.val === null) return null;
90413           var two = search(x, dims, one.regex);
90414           if (two.val === null) return null;
90415           // null if one/two are not contiguous.
90416           if (one.raw + two.raw !== x) return null;
90417           if (one.dim) {
90418             return swapdim(one.val, two.val, one.dim);
90419           } else {
90420             return [one.val, two.val];
90421           }
90422         }
90423
90424         function swapdim(a, b, dim) {
90425           if (dim === 'N' || dim === 'S') return [a, b];
90426           if (dim === 'W' || dim === 'E') return [b, a];
90427         }
90428
90429         function uiFeatureList(context) {
90430             var _geocodeResults;
90431
90432
90433             function featureList(selection) {
90434                 var header = selection
90435                     .append('div')
90436                     .attr('class', 'header fillL cf');
90437
90438                 header
90439                     .append('h3')
90440                     .text(t('inspector.feature_list'));
90441
90442                 var searchWrap = selection
90443                     .append('div')
90444                     .attr('class', 'search-header');
90445
90446                 var search = searchWrap
90447                     .append('input')
90448                     .attr('placeholder', t('inspector.search'))
90449                     .attr('type', 'search')
90450                     .call(utilNoAuto)
90451                     .on('keypress', keypress)
90452                     .on('keydown', keydown)
90453                     .on('input', inputevent);
90454
90455                 searchWrap
90456                     .call(svgIcon('#iD-icon-search', 'pre-text'));
90457
90458                 var listWrap = selection
90459                     .append('div')
90460                     .attr('class', 'inspector-body');
90461
90462                 var list = listWrap
90463                     .append('div')
90464                     .attr('class', 'feature-list cf');
90465
90466                 context
90467                     .on('exit.feature-list', clearSearch);
90468                 context.map()
90469                     .on('drawn.feature-list', mapDrawn);
90470
90471                 context.keybinding()
90472                     .on(uiCmd('⌘F'), focusSearch);
90473
90474
90475                 function focusSearch() {
90476                     var mode = context.mode() && context.mode().id;
90477                     if (mode !== 'browse') return;
90478
90479                     event.preventDefault();
90480                     search.node().focus();
90481                 }
90482
90483
90484                 function keydown() {
90485                     if (event.keyCode === 27) {  // escape
90486                         search.node().blur();
90487                     }
90488                 }
90489
90490
90491                 function keypress() {
90492                     var q = search.property('value'),
90493                         items = list.selectAll('.feature-list-item');
90494                     if (event.keyCode === 13 && q.length && items.size()) {  // return
90495                         click(items.datum());
90496                     }
90497                 }
90498
90499
90500                 function inputevent() {
90501                     _geocodeResults = undefined;
90502                     drawList();
90503                 }
90504
90505
90506                 function clearSearch() {
90507                     search.property('value', '');
90508                     drawList();
90509                 }
90510
90511
90512                 function mapDrawn(e) {
90513                     if (e.full) {
90514                         drawList();
90515                     }
90516                 }
90517
90518
90519                 function features() {
90520                     var entities = {};
90521                     var result = [];
90522                     var graph = context.graph();
90523                     var q = search.property('value').toLowerCase();
90524
90525                     if (!q) return result;
90526
90527                     var idMatch = q.match(/^([nwr])([0-9]+)$/);
90528
90529                     if (idMatch) {
90530                         result.push({
90531                             id: idMatch[0],
90532                             geometry: idMatch[1] === 'n' ? 'point' : idMatch[1] === 'w' ? 'line' : 'relation',
90533                             type: idMatch[1] === 'n' ? t('inspector.node') : idMatch[1] === 'w' ? t('inspector.way') : t('inspector.relation'),
90534                             name: idMatch[2]
90535                         });
90536                     }
90537
90538                     var locationMatch = pair_1(q.toUpperCase()) || q.match(/^(-?\d+\.?\d*)\s+(-?\d+\.?\d*)$/);
90539
90540                     if (locationMatch) {
90541                         var loc = [parseFloat(locationMatch[0]), parseFloat(locationMatch[1])];
90542                         result.push({
90543                             id: -1,
90544                             geometry: 'point',
90545                             type: t('inspector.location'),
90546                             name: dmsCoordinatePair([loc[1], loc[0]]),
90547                             location: loc
90548                         });
90549                     }
90550
90551                     function addEntity(entity) {
90552                         if (entity.id in entities || result.length > 200)
90553                             return;
90554
90555                         entities[entity.id] = true;
90556
90557                         var name = utilDisplayName(entity) || '';
90558                         if (name.toLowerCase().indexOf(q) >= 0) {
90559                             var matched = context.presets().match(entity, graph);
90560                             var type = (matched && matched.name()) || utilDisplayType(entity.id);
90561
90562                             result.push({
90563                                 id: entity.id,
90564                                 entity: entity,
90565                                 geometry: context.geometry(entity.id),
90566                                 type: type,
90567                                 name: name
90568                             });
90569                         }
90570
90571                         graph.parentRelations(entity).forEach(function(parent) {
90572                             addEntity(parent);
90573                         });
90574                     }
90575
90576                     var visible = context.surface().selectAll('.point, .line, .area').nodes();
90577                     for (var i = 0; i < visible.length && result.length <= 200; i++) {
90578                         var datum = visible[i].__data__;
90579                         var entity = datum && datum.properties && datum.properties.entity;
90580                         if (entity) { addEntity(entity); }
90581                     }
90582
90583                     (_geocodeResults || []).forEach(function(d) {
90584                         if (d.osm_type && d.osm_id) {    // some results may be missing these - #1890
90585
90586                             // Make a temporary osmEntity so we can preset match
90587                             // and better localize the search result - #4725
90588                             var id = osmEntity.id.fromOSM(d.osm_type, d.osm_id);
90589                             var tags = {};
90590                             tags[d.class] = d.type;
90591
90592                             var attrs = { id: id, type: d.osm_type, tags: tags };
90593                             if (d.osm_type === 'way') {   // for ways, add some fake closed nodes
90594                                 attrs.nodes = ['a','a'];  // so that geometry area is possible
90595                             }
90596
90597                             var tempEntity = osmEntity(attrs);
90598                             var tempGraph = coreGraph([tempEntity]);
90599                             var matched = context.presets().match(tempEntity, tempGraph);
90600                             var type = (matched && matched.name()) || utilDisplayType(id);
90601
90602                             result.push({
90603                                 id: tempEntity.id,
90604                                 geometry: tempEntity.geometry(tempGraph),
90605                                 type: type,
90606                                 name: d.display_name,
90607                                 extent: new geoExtent(
90608                                     [parseFloat(d.boundingbox[3]), parseFloat(d.boundingbox[0])],
90609                                     [parseFloat(d.boundingbox[2]), parseFloat(d.boundingbox[1])])
90610                             });
90611                         }
90612                     });
90613
90614                     return result;
90615                 }
90616
90617
90618                 function drawList() {
90619                     var value = search.property('value');
90620                     var results = features();
90621
90622                     list.classed('filtered', value.length);
90623
90624                     var noResultsWorldwide = _geocodeResults && _geocodeResults.length === 0;
90625
90626                     var resultsIndicator = list.selectAll('.no-results-item')
90627                         .data([0])
90628                         .enter()
90629                         .append('button')
90630                         .property('disabled', true)
90631                         .attr('class', 'no-results-item')
90632                         .call(svgIcon('#iD-icon-alert', 'pre-text'));
90633
90634                     resultsIndicator.append('span')
90635                         .attr('class', 'entity-name');
90636
90637                     list.selectAll('.no-results-item .entity-name')
90638                         .text(noResultsWorldwide ? t('geocoder.no_results_worldwide') : t('geocoder.no_results_visible'));
90639
90640                     if (services$1.geocoder) {
90641                       list.selectAll('.geocode-item')
90642                           .data([0])
90643                           .enter()
90644                           .append('button')
90645                           .attr('class', 'geocode-item')
90646                           .on('click', geocoderSearch)
90647                           .append('div')
90648                           .attr('class', 'label')
90649                           .append('span')
90650                           .attr('class', 'entity-name')
90651                           .text(t('geocoder.search'));
90652                     }
90653
90654                     list.selectAll('.no-results-item')
90655                         .style('display', (value.length && !results.length) ? 'block' : 'none');
90656
90657                     list.selectAll('.geocode-item')
90658                         .style('display', (value && _geocodeResults === undefined) ? 'block' : 'none');
90659
90660                     list.selectAll('.feature-list-item')
90661                         .data([-1])
90662                         .remove();
90663
90664                     var items = list.selectAll('.feature-list-item')
90665                         .data(results, function(d) { return d.id; });
90666
90667                     var enter = items.enter()
90668                         .insert('button', '.geocode-item')
90669                         .attr('class', 'feature-list-item')
90670                         .on('mouseover', mouseover)
90671                         .on('mouseout', mouseout)
90672                         .on('click', click);
90673
90674                     var label = enter
90675                         .append('div')
90676                         .attr('class', 'label');
90677
90678                     label
90679                         .each(function(d) {
90680                             d3_select(this)
90681                                 .call(svgIcon('#iD-icon-' + d.geometry, 'pre-text'));
90682                         });
90683
90684                     label
90685                         .append('span')
90686                         .attr('class', 'entity-type')
90687                         .text(function(d) { return d.type; });
90688
90689                     label
90690                         .append('span')
90691                         .attr('class', 'entity-name')
90692                         .text(function(d) { return d.name; });
90693
90694                     enter
90695                         .style('opacity', 0)
90696                         .transition()
90697                         .style('opacity', 1);
90698
90699                     items.order();
90700
90701                     items.exit()
90702                         .remove();
90703                 }
90704
90705
90706                 function mouseover(d) {
90707                     if (d.id === -1) return;
90708
90709                     context.surface().selectAll(utilEntityOrMemberSelector([d.id], context.graph()))
90710                         .classed('hover', true);
90711                 }
90712
90713
90714                 function mouseout() {
90715                     context.surface().selectAll('.hover')
90716                         .classed('hover', false);
90717                 }
90718
90719
90720                 function click(d) {
90721                     event.preventDefault();
90722                     if (d.location) {
90723                         context.map().centerZoomEase([d.location[1], d.location[0]], 19);
90724                     }
90725                     else if (d.entity) {
90726                         if (d.entity.type === 'node') {
90727                             context.map().center(d.entity.loc);
90728                         } else if (d.entity.type === 'way') {
90729                             var center = context.projection(context.map().center());
90730                             var edge = geoChooseEdge(context.childNodes(d.entity), center, context.projection);
90731                             context.map().center(edge.loc);
90732                         }
90733                         context.enter(modeSelect(context, [d.entity.id]));
90734                     } else {
90735                         context.zoomToEntity(d.id);
90736                     }
90737                 }
90738
90739
90740                 function geocoderSearch() {
90741                     services$1.geocoder.search(search.property('value'), function (err, resp) {
90742                         _geocodeResults = resp || [];
90743                         drawList();
90744                     });
90745                 }
90746             }
90747
90748
90749             return featureList;
90750         }
90751
90752         function uiPresetFavoriteButton(preset, geom, context, klass) {
90753
90754             geom = context.presets().fallback(geom).id;
90755
90756             var presetFavorite = {};
90757
90758             var _button = d3_select(null);
90759
90760
90761             presetFavorite.button = function(selection) {
90762
90763                 _button = selection.selectAll('.preset-favorite-button')
90764                     .data( []);
90765
90766                 _button.exit().remove();
90767
90768                 _button = _button.enter()
90769                     .insert('button', '.tag-reference-button')
90770                     .attr('class', 'preset-favorite-button ' + klass)
90771                     .attr('title', t('icons.favorite'))
90772                     .attr('tabindex', -1)
90773                     .call(svgIcon('#iD-icon-favorite'))
90774                     .merge(_button);
90775
90776                 _button
90777                     .on('click', function () {
90778                         event.stopPropagation();
90779                         event.preventDefault();
90780
90781                         context.presets().toggleFavorite(preset, geom);
90782
90783                         update();
90784                     });
90785
90786                 update();
90787             };
90788
90789             function update() {
90790                 _button
90791                     .classed('active', context.presets().favoriteMatching(preset, geom));
90792             }
90793
90794             context.presets().on('favoritePreset.button-' + preset.id.replace(/[^a-zA-Z\d:]/g, '-') + '-' + geom, update);
90795
90796             return presetFavorite;
90797         }
90798
90799         function uiPresetIcon(context) {
90800             var preset, geometry, sizeClass = 'medium';
90801
90802             function isSmall() {
90803                 return sizeClass === 'small';
90804             }
90805
90806
90807             function presetIcon(selection) {
90808                 selection.each(render);
90809             }
90810
90811
90812             function getIcon(p, geom) {
90813                 if (isSmall() && p.isFallback && p.isFallback())
90814                     return 'iD-icon-' + p.id;
90815                 else if (p.icon)
90816                     return p.icon;
90817                 else if (geom === 'line')
90818                     return 'iD-other-line';
90819                 else if (geom === 'vertex')
90820                     return p.isFallback() ? '' : 'temaki-vertex';
90821                 else if (isSmall() && geom === 'point')
90822                     return '';
90823                 else
90824                     return 'maki-marker-stroked';
90825             }
90826
90827             function renderPointBorder(enter) {
90828                 var w = 40, h = 40;
90829                 enter = enter
90830                     .append('svg')
90831                     .attr('class', 'preset-icon-fill preset-icon-point-border')
90832                     .attr('width', w)
90833                     .attr('height', h)
90834                     .attr('viewBox', '0 0 ' + w + ' ' + h);
90835
90836                 enter.append('path')
90837                     .attr('transform', 'translate(11.5, 8)')
90838                     .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');
90839             }
90840
90841             function renderCircleFill(fillEnter) {
90842                 var w = 60, h = 60, d = 40;
90843                 fillEnter = fillEnter
90844                     .append('svg')
90845                     .attr('class', 'preset-icon-fill preset-icon-fill-vertex')
90846                     .attr('width', w)
90847                     .attr('height', h)
90848                     .attr('viewBox', '0 0 ' + w + ' ' + h);
90849
90850                 fillEnter.append('circle')
90851                     .attr('cx', w/2)
90852                     .attr('cy', h/2)
90853                     .attr('r', d/2);
90854             }
90855
90856             function renderSquareFill(fillEnter) {
90857                 var d = isSmall() ? 40 : 60;
90858                 var w = d, h = d, l = d*2/3, c1 = (w-l)/2, c2 = c1 + l;
90859                 fillEnter = fillEnter
90860                     .append('svg')
90861                     .attr('class', 'preset-icon-fill preset-icon-fill-area')
90862                     .attr('width', w)
90863                     .attr('height', h)
90864                     .attr('viewBox', '0 0 ' + w + ' ' + h);
90865
90866                 var data = 'M' + c1 + ' ' + c1 + ' L' + c1 + ' ' + c2 + ' L' + c2 + ' ' + c2 + ' L' + c2 + ' ' + c1 + ' Z';
90867
90868                 fillEnter.append('path')
90869                     .attr('d', data)
90870                     .attr('class', 'line area fill');
90871
90872                 fillEnter.append('path')
90873                     .attr('d', data)
90874                     .attr('class', 'line area stroke');
90875
90876                 var r = 2.5;
90877                 var coordinates = [c1, c2];
90878                 for (var xIndex in coordinates) {
90879                     for (var yIndex in coordinates) {
90880                         fillEnter.append('circle')
90881                             .attr('class', 'vertex')
90882                             .attr('cx', coordinates[xIndex])
90883                             .attr('cy', coordinates[yIndex])
90884                             .attr('r', r);
90885                     }
90886                 }
90887
90888                 if (!isSmall()) {
90889                     var midCoordinates = [[c1, w/2], [c2, w/2], [h/2, c1], [h/2, c2]];
90890                     for (var index in midCoordinates) {
90891                         var loc = midCoordinates[index];
90892                         fillEnter.append('circle')
90893                             .attr('class', 'midpoint')
90894                             .attr('cx', loc[0])
90895                             .attr('cy', loc[1])
90896                             .attr('r', 1.25);
90897                     }
90898                 }
90899
90900             }
90901
90902             function renderLine(lineEnter) {
90903                 var d = isSmall() ? 40 : 60;
90904                 // draw the line parametrically
90905                 var w = d, h = d, y = Math.round(d*0.72), l = Math.round(d*0.6), r = 2.5;
90906                 var x1 = (w - l)/2, x2 = x1 + l;
90907
90908                 lineEnter = lineEnter
90909                     .append('svg')
90910                     .attr('class', 'preset-icon-line')
90911                     .attr('width', w)
90912                     .attr('height', h)
90913                     .attr('viewBox', '0 0 ' + w + ' ' + h);
90914
90915                 ['casing', 'stroke'].forEach(function(klass) {
90916                     lineEnter.append('path')
90917                         .attr('d', 'M' + x1 + ' ' + y + ' L' + x2 + ' ' + y)
90918                         .attr('class', 'line ' + klass);
90919                 });
90920
90921                 [[x1 - 1, y], [x2 + 1, y]].forEach(function(loc) {
90922                     lineEnter.append('circle')
90923                         .attr('class', 'vertex')
90924                         .attr('cx', loc[0])
90925                         .attr('cy', loc[1])
90926                         .attr('r', r);
90927                 });
90928             }
90929
90930             function renderRoute(routeEnter) {
90931                 var d = isSmall() ? 40 : 60;
90932                 // draw the route parametrically
90933                 var w = d,
90934                     h = d,
90935                     y1 = Math.round(d*0.80),
90936                     y2 = Math.round(d*0.68),
90937                     l = Math.round(d*0.6),
90938                     r = 2;
90939                 var x1 = (w - l)/2, x2 = x1 + l/3, x3 = x2 + l/3, x4 = x3 + l/3;
90940
90941                 routeEnter = routeEnter
90942                     .append('svg')
90943                     .attr('class', 'preset-icon-route')
90944                     .attr('width', w)
90945                     .attr('height', h)
90946                     .attr('viewBox', '0 0 ' + w + ' ' + h);
90947
90948                 ['casing', 'stroke'].forEach(function(klass) {
90949                     routeEnter.append('path')
90950                         .attr('d', 'M' + x1 + ' ' + y1 + ' L' + x2 + ' ' + y2)
90951                         .attr('class', 'segment0 line ' + klass);
90952                     routeEnter.append('path')
90953                         .attr('d', 'M' + x2 + ' ' + y2 + ' L' + x3 + ' ' + y1)
90954                         .attr('class', 'segment1 line ' + klass);
90955                     routeEnter.append('path')
90956                         .attr('d', 'M' + x3 + ' ' + y1 + ' L' + x4 + ' ' + y2)
90957                         .attr('class', 'segment2 line ' + klass);
90958                 });
90959
90960                 [[x1, y1], [x2, y2], [x3, y1], [x4, y2]].forEach(function(loc) {
90961                     routeEnter.append('circle')
90962                         .attr('class', 'vertex')
90963                         .attr('cx', loc[0])
90964                         .attr('cy', loc[1])
90965                         .attr('r', r);
90966                 });
90967             }
90968
90969             var routeSegements = {
90970                 bicycle: ['highway/cycleway', 'highway/cycleway', 'highway/cycleway'],
90971                 bus: ['highway/unclassified', 'highway/secondary', 'highway/primary'],
90972                 detour: ['highway/tertiary', 'highway/residential', 'highway/unclassified'],
90973                 ferry: ['route/ferry', 'route/ferry', 'route/ferry'],
90974                 foot: ['highway/footway', 'highway/footway', 'highway/footway'],
90975                 hiking: ['highway/path', 'highway/path', 'highway/path'],
90976                 horse: ['highway/bridleway', 'highway/bridleway', 'highway/bridleway'],
90977                 light_rail: ['railway/light_rail', 'railway/light_rail', 'railway/light_rail'],
90978                 monorail: ['railway/monorail', 'railway/monorail', 'railway/monorail'],
90979                 pipeline: ['man_made/pipeline', 'man_made/pipeline', 'man_made/pipeline'],
90980                 piste: ['piste/downhill', 'piste/hike', 'piste/nordic'],
90981                 power: ['power/line', 'power/line', 'power/line'],
90982                 road: ['highway/secondary', 'highway/primary', 'highway/trunk'],
90983                 subway: ['railway/subway', 'railway/subway', 'railway/subway'],
90984                 train: ['railway/rail', 'railway/rail', 'railway/rail'],
90985                 tram: ['railway/tram', 'railway/tram', 'railway/tram'],
90986                 waterway: ['waterway/stream', 'waterway/stream', 'waterway/stream']
90987             };
90988
90989             function render() {
90990
90991                 var p = preset.apply(this, arguments);
90992                 var isFallback = isSmall() && p.isFallback && p.isFallback();
90993                 var geom = geometry ? geometry.apply(this, arguments) : null;
90994                 if (geom === 'relation' && p.tags && ((p.tags.type === 'route' && p.tags.route && routeSegements[p.tags.route]) || p.tags.type === 'waterway')) {
90995                     geom = 'route';
90996                 }
90997                 var imageURL = p.imageURL;
90998                 var picon = imageURL ? null : getIcon(p, geom);
90999                 var isMaki = picon && /^maki-/.test(picon);
91000                 var isTemaki = picon && /^temaki-/.test(picon);
91001                 var isFa = picon && /^fa[srb]-/.test(picon);
91002                 var isTnp = picon && /^tnp-/.test(picon);
91003                 var isiDIcon = picon && !(isMaki || isTemaki || isFa || isTnp);
91004                 var isCategory = !p.setTags;
91005                 var drawPoint = picon && geom === 'point' && isSmall() && !isFallback;
91006                 var drawVertex = picon !== null && geom === 'vertex' && (!isSmall() || !isFallback);
91007                 var drawLine = picon && geom === 'line' && !isFallback && !isCategory;
91008                 var drawArea = picon && geom === 'area' && !isFallback;
91009                 var drawRoute = picon && geom === 'route';
91010                 var isFramed = (drawVertex || drawArea || drawLine || drawRoute);
91011
91012                 var tags = !isCategory ? p.setTags({}, geom) : {};
91013                 for (var k in tags) {
91014                     if (tags[k] === '*') {
91015                         tags[k] = 'yes';
91016                     }
91017                 }
91018                 var tagClasses = svgTagClasses().getClassesString(tags, '');
91019
91020                 var selection = d3_select(this);
91021
91022                 var container = selection.selectAll('.preset-icon-container')
91023                     .data([0]);
91024
91025                 container = container.enter()
91026                     .append('div')
91027                     .attr('class', 'preset-icon-container ' + sizeClass)
91028                     .merge(container);
91029
91030                 container.classed('fallback', isFallback);
91031
91032                 var imageIcon = container.selectAll('img.image-icon')
91033                     .data(imageURL ? [0] : []);
91034
91035                 imageIcon.exit()
91036                     .remove();
91037
91038                 imageIcon = imageIcon.enter()
91039                     .append('img')
91040                     .attr('class', 'image-icon')
91041                     .merge(imageIcon);
91042
91043                 imageIcon
91044                     .attr('src', imageURL);
91045
91046                 var pointBorder = container.selectAll('.preset-icon-point-border')
91047                     .data(drawPoint ? [0] : []);
91048
91049                 pointBorder.exit()
91050                     .remove();
91051
91052                 var pointBorderEnter = pointBorder.enter();
91053                 renderPointBorder(pointBorderEnter);
91054                 pointBorder = pointBorderEnter.merge(pointBorder);
91055
91056
91057                 var vertexFill = container.selectAll('.preset-icon-fill-vertex')
91058                     .data(drawVertex ? [0] : []);
91059
91060                 vertexFill.exit()
91061                     .remove();
91062
91063                 var vertexFillEnter = vertexFill.enter();
91064                 renderCircleFill(vertexFillEnter);
91065                 vertexFill = vertexFillEnter.merge(vertexFill);
91066
91067
91068                 var fill = container.selectAll('.preset-icon-fill-area')
91069                     .data(drawArea ? [0] : []);
91070
91071                 fill.exit()
91072                     .remove();
91073
91074                 var fillEnter = fill.enter();
91075                 renderSquareFill(fillEnter);
91076                 fill = fillEnter.merge(fill);
91077
91078                 fill.selectAll('path.stroke')
91079                     .attr('class', 'area stroke ' + tagClasses);
91080                 fill.selectAll('path.fill')
91081                     .attr('class', 'area fill ' + tagClasses);
91082
91083
91084                 var line = container.selectAll('.preset-icon-line')
91085                     .data(drawLine ? [0] : []);
91086
91087                 line.exit()
91088                     .remove();
91089
91090                 var lineEnter = line.enter();
91091                 renderLine(lineEnter);
91092
91093                 line = lineEnter.merge(line);
91094
91095                 line.selectAll('path.stroke')
91096                     .attr('class', 'line stroke ' + tagClasses);
91097                 line.selectAll('path.casing')
91098                     .attr('class', 'line casing ' + tagClasses);
91099
91100                 var route = container.selectAll('.preset-icon-route')
91101                     .data(drawRoute ? [0] : []);
91102
91103                 route.exit()
91104                     .remove();
91105
91106                 var routeEnter = route.enter();
91107                 renderRoute(routeEnter);
91108
91109                 route = routeEnter.merge(route);
91110
91111                 if (drawRoute) {
91112                     var routeType = p.tags.type === 'waterway' ? 'waterway' : p.tags.route;
91113                     var segmentPresetIDs = routeSegements[routeType];
91114                     for (var segmentIndex in segmentPresetIDs) {
91115                         var segmentPreset = context.presets().item(segmentPresetIDs[segmentIndex]);
91116                         var segmentTagClasses = svgTagClasses().getClassesString(segmentPreset.tags, '');
91117                         route.selectAll('path.stroke.segment' + segmentIndex)
91118                             .attr('class', 'segment' + segmentIndex + ' line stroke ' + segmentTagClasses);
91119                         route.selectAll('path.casing.segment' + segmentIndex)
91120                             .attr('class', 'segment' + segmentIndex + ' line casing ' + segmentTagClasses);
91121                     }
91122
91123                 }
91124
91125
91126                 var icon = container.selectAll('.preset-icon')
91127                     .data(picon ? [0] : []);
91128
91129                 icon.exit()
91130                     .remove();
91131
91132                 icon = icon.enter()
91133                     .append('div')
91134                     .attr('class', 'preset-icon')
91135                     .call(svgIcon(''))
91136                     .merge(icon);
91137
91138                 icon
91139                     .attr('class', 'preset-icon ' + (geom ? geom + '-geom' : ''))
91140                     .classed('framed', isFramed)
91141                     .classed('preset-icon-iD', isiDIcon);
91142
91143                 icon.selectAll('svg')
91144                     .attr('class', function() {
91145                         return 'icon ' + picon + ' ' + (!isiDIcon && geom !== 'line'  ? '' : tagClasses);
91146                     });
91147
91148                 icon.selectAll('use')
91149                     .attr('href', '#' + picon + (isMaki ? (isSmall() && geom === 'point' ? '-11' : '-15') : ''));
91150
91151             }
91152
91153
91154             presetIcon.preset = function(val) {
91155                 if (!arguments.length) return preset;
91156                 preset = utilFunctor(val);
91157                 return presetIcon;
91158             };
91159
91160
91161             presetIcon.geometry = function(val) {
91162                 if (!arguments.length) return geometry;
91163                 geometry = utilFunctor(val);
91164                 return presetIcon;
91165             };
91166
91167
91168             presetIcon.sizeClass = function(val) {
91169                 if (!arguments.length) return sizeClass;
91170                 sizeClass = val;
91171                 return presetIcon;
91172             };
91173
91174             return presetIcon;
91175         }
91176
91177         function uiRawMemberEditor(context) {
91178             var taginfo = services$1.taginfo;
91179             var _entityID;
91180             var _contentSelection = d3_select(null);
91181             var _maxMembers = 1000;
91182
91183             function downloadMember(d) {
91184                 event.preventDefault();
91185
91186                 // display the loading indicator
91187                 d3_select(this.parentNode).classed('tag-reference-loading', true);
91188                 context.loadEntity(d.id, function() {
91189                     updateDisclosureContent(_contentSelection);
91190                 });
91191             }
91192
91193             function zoomToMember(d) {
91194                 event.preventDefault();
91195
91196                 var entity = context.entity(d.id);
91197                 context.map().zoomTo(entity);
91198
91199                 // highlight the feature in case it wasn't previously on-screen
91200                 utilHighlightEntities([d.id], true, context);
91201             }
91202
91203
91204             function selectMember(d) {
91205                 event.preventDefault();
91206
91207                 // remove the hover-highlight styling
91208                 utilHighlightEntities([d.id], false, context);
91209
91210                 var entity = context.entity(d.id);
91211                 var mapExtent = context.map().extent();
91212                 if (!entity.intersects(mapExtent, context.graph())) {
91213                     // zoom to the entity if its extent is not visible now
91214                     context.map().zoomToEase(entity);
91215                 }
91216
91217                 context.enter(modeSelect(context, [d.id]));
91218             }
91219
91220
91221             function changeRole(d) {
91222                 var oldRole = d.role;
91223                 var newRole = d3_select(this).property('value');
91224
91225                 if (oldRole !== newRole) {
91226                     var member = { id: d.id, type: d.type, role: newRole };
91227                     context.perform(
91228                         actionChangeMember(d.relation.id, member, d.index),
91229                         t('operations.change_role.annotation')
91230                     );
91231                 }
91232             }
91233
91234
91235             function deleteMember(d) {
91236
91237                 // remove the hover-highlight styling
91238                 utilHighlightEntities([d.id], false, context);
91239
91240                 context.perform(
91241                     actionDeleteMember(d.relation.id, d.index),
91242                     t('operations.delete_member.annotation')
91243                 );
91244
91245                 if (!context.hasEntity(d.relation.id)) {
91246                     context.enter(modeBrowse(context));
91247                 }
91248             }
91249
91250             function updateDisclosureContent(selection) {
91251                 _contentSelection = selection;
91252
91253                 var memberships = [];
91254                 var entity = context.entity(_entityID);
91255                 entity.members.slice(0, _maxMembers).forEach(function(member, index) {
91256                     memberships.push({
91257                         index: index,
91258                         id: member.id,
91259                         type: member.type,
91260                         role: member.role,
91261                         relation: entity,
91262                         member: context.hasEntity(member.id)
91263                     });
91264                 });
91265
91266                 var list = selection.selectAll('.member-list')
91267                     .data([0]);
91268
91269                 list = list.enter()
91270                     .append('ul')
91271                     .attr('class', 'member-list')
91272                     .merge(list);
91273
91274
91275                 var items = list.selectAll('li')
91276                     .data(memberships, function(d) {
91277                         return osmEntity.key(d.relation) + ',' + d.index + ',' +
91278                             (d.member ? osmEntity.key(d.member) : 'incomplete');
91279                     });
91280
91281                 items.exit()
91282                     .each(unbind)
91283                     .remove();
91284
91285                 var itemsEnter = items.enter()
91286                     .append('li')
91287                     .attr('class', 'member-row form-field')
91288                     .classed('member-incomplete', function(d) { return !d.member; });
91289
91290                 itemsEnter
91291                     .each(function(d) {
91292                         var item = d3_select(this);
91293
91294                         var label = item
91295                             .append('label')
91296                             .attr('class', 'field-label');
91297
91298                         if (d.member) {
91299                             // highlight the member feature in the map while hovering on the list item
91300                             item
91301                                 .on('mouseover', function() {
91302                                     utilHighlightEntities([d.id], true, context);
91303                                 })
91304                                 .on('mouseout', function() {
91305                                     utilHighlightEntities([d.id], false, context);
91306                                 });
91307
91308                             var labelLink = label
91309                                 .append('span')
91310                                 .attr('class', 'label-text')
91311                                 .append('a')
91312                                 .attr('href', '#')
91313                                 .on('click', selectMember);
91314
91315                             labelLink
91316                                 .append('span')
91317                                 .attr('class', 'member-entity-type')
91318                                 .text(function(d) {
91319                                     var matched = context.presets().match(d.member, context.graph());
91320                                     return (matched && matched.name()) || utilDisplayType(d.member.id);
91321                                 });
91322
91323                             labelLink
91324                                 .append('span')
91325                                 .attr('class', 'member-entity-name')
91326                                 .text(function(d) { return utilDisplayName(d.member); });
91327
91328                             label
91329                                 .append('button')
91330                                 .attr('class', 'member-zoom')
91331                                 .attr('title', t('icons.zoom_to'))
91332                                 .attr('tabindex', -1)
91333                                 .call(svgIcon('#iD-icon-geolocate'))
91334                                 .on('click', zoomToMember);
91335
91336                         } else {
91337                             var labelText = label
91338                                 .append('span')
91339                                 .attr('class', 'label-text');
91340
91341                             labelText
91342                                 .append('span')
91343                                 .attr('class', 'member-entity-type')
91344                                 .text(t('inspector.' + d.type, { id: d.id }));
91345
91346                             labelText
91347                                 .append('span')
91348                                 .attr('class', 'member-entity-name')
91349                                 .text(t('inspector.incomplete', { id: d.id }));
91350
91351                             label
91352                                 .append('button')
91353                                 .attr('class', 'member-download')
91354                                 .attr('title', t('icons.download'))
91355                                 .attr('tabindex', -1)
91356                                 .call(svgIcon('#iD-icon-load'))
91357                                 .on('click', downloadMember);
91358                         }
91359                     });
91360
91361                 var wrapEnter = itemsEnter
91362                     .append('div')
91363                     .attr('class', 'form-field-input-wrap form-field-input-member');
91364
91365                 wrapEnter
91366                     .append('input')
91367                     .attr('class', 'member-role')
91368                     .property('type', 'text')
91369                     .attr('maxlength', 255)
91370                     .attr('placeholder', t('inspector.role'))
91371                     .call(utilNoAuto);
91372
91373                 wrapEnter
91374                     .append('button')
91375                     .attr('tabindex', -1)
91376                     .attr('title', t('icons.remove'))
91377                     .attr('class', 'remove form-field-button member-delete')
91378                     .call(svgIcon('#iD-operation-delete'));
91379
91380                 if (taginfo) {
91381                     wrapEnter.each(bindTypeahead);
91382                 }
91383
91384                 var dragOrigin, targetIndex;
91385
91386                 itemsEnter.call(d3_drag()
91387                     .on('start', function() {
91388                         dragOrigin = {
91389                             x: event.x,
91390                             y: event.y
91391                         };
91392                         targetIndex = null;
91393                     })
91394                     .on('drag', function(d, index) {
91395                         var x = event.x - dragOrigin.x,
91396                             y = event.y - dragOrigin.y;
91397
91398                         if (!d3_select(this).classed('dragging') &&
91399                             // don't display drag until dragging beyond a distance threshold
91400                             Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)) <= 5) return;
91401
91402                         d3_select(this)
91403                             .classed('dragging', true);
91404
91405                         targetIndex = null;
91406
91407                         selection.selectAll('li.member-row')
91408                             .style('transform', function(d2, index2) {
91409                                 var node = d3_select(this).node();
91410                                 if (index === index2) {
91411                                     return 'translate(' + x + 'px, ' + y + 'px)';
91412                                 } else if (index2 > index && event.y > node.offsetTop - node.offsetHeight) {
91413                                     if (targetIndex === null || index2 > targetIndex) {
91414                                         targetIndex = index2;
91415                                     }
91416                                     return 'translateY(-100%)';
91417                                 } else if (index2 < index && event.y < node.offsetTop) {
91418                                     if (targetIndex === null || index2 < targetIndex) {
91419                                         targetIndex = index2;
91420                                     }
91421                                     return 'translateY(100%)';
91422                                 }
91423                                 return null;
91424                             });
91425                     })
91426                     .on('end', function(d, index) {
91427
91428                         if (!d3_select(this).classed('dragging')) {
91429                             return;
91430                         }
91431
91432                         d3_select(this)
91433                             .classed('dragging', false);
91434
91435                         selection.selectAll('li.member-row')
91436                             .style('transform', null);
91437
91438                         if (targetIndex !== null) {
91439                             // dragged to a new position, reorder
91440                             context.perform(
91441                                 actionMoveMember(d.relation.id, index, targetIndex),
91442                                 t('operations.reorder_members.annotation')
91443                             );
91444                         }
91445                     })
91446                 );
91447
91448
91449                 // update
91450                 items = items
91451                     .merge(itemsEnter);
91452
91453                 items.select('input.member-role')
91454                     .property('value', function(d) { return d.role; })
91455                     .on('blur', changeRole)
91456                     .on('change', changeRole);
91457
91458                 items.select('button.member-delete')
91459                     .on('click', deleteMember);
91460
91461
91462
91463                 function bindTypeahead(d) {
91464                     var row = d3_select(this);
91465                     var role = row.selectAll('input.member-role');
91466                     var origValue = role.property('value');
91467
91468                     function sort(value, data) {
91469                         var sameletter = [];
91470                         var other = [];
91471                         for (var i = 0; i < data.length; i++) {
91472                             if (data[i].value.substring(0, value.length) === value) {
91473                                 sameletter.push(data[i]);
91474                             } else {
91475                                 other.push(data[i]);
91476                             }
91477                         }
91478                         return sameletter.concat(other);
91479                     }
91480
91481                     role.call(uiCombobox(context, 'member-role')
91482                         .fetcher(function(role, callback) {
91483                             // The `geometry` param is used in the `taginfo.js` interface for
91484                             // filtering results, as a key into the `tag_members_fractions`
91485                             // object.  If we don't know the geometry because the member is
91486                             // not yet downloaded, it's ok to guess based on type.
91487                             var geometry;
91488                             if (d.member) {
91489                                 geometry = context.geometry(d.member.id);
91490                             } else if (d.type === 'relation') {
91491                                 geometry = 'relation';
91492                             } else if (d.type === 'way') {
91493                                 geometry = 'line';
91494                             } else {
91495                                 geometry = 'point';
91496                             }
91497
91498                             var rtype = entity.tags.type;
91499                             taginfo.roles({
91500                                 debounce: true,
91501                                 rtype: rtype || '',
91502                                 geometry: geometry,
91503                                 query: role
91504                             }, function(err, data) {
91505                                 if (!err) callback(sort(role, data));
91506                             });
91507                         })
91508                         .on('cancel', function() {
91509                             role.property('value', origValue);
91510                         })
91511                     );
91512                 }
91513
91514
91515                 function unbind() {
91516                     var row = d3_select(this);
91517
91518                     row.selectAll('input.member-role')
91519                         .call(uiCombobox.off);
91520                 }
91521             }
91522
91523             function rawMemberEditor(selection) {
91524                 var entity = context.entity(_entityID);
91525
91526                 var gt = entity.members.length > _maxMembers ? '>' : '';
91527                 selection.call(uiDisclosure(context, 'raw_member_editor', true)
91528                     .title(t('inspector.all_members') + ' (' + gt + entity.members.slice(0, _maxMembers).length + ')')
91529                     .expanded(true)
91530                     .updatePreference(false)
91531                     .on('toggled', function(expanded) {
91532                         if (expanded) {
91533                             selection.node().parentNode.scrollTop += 200;
91534                         }
91535                     })
91536                     .content(updateDisclosureContent)
91537                 );
91538             }
91539
91540             rawMemberEditor.entityID = function(val) {
91541                 if (!arguments.length) return _entityID;
91542                 _entityID = val;
91543                 return rawMemberEditor;
91544             };
91545
91546
91547             return rawMemberEditor;
91548         }
91549
91550         function uiRawMembershipEditor(context) {
91551             var taginfo = services$1.taginfo;
91552             var nearbyCombo = uiCombobox(context, 'parent-relation')
91553                 .minItems(1)
91554                 .fetcher(fetchNearbyRelations);
91555             var _inChange = false;
91556             var _entityID;
91557             var _showBlank;
91558
91559
91560             function selectRelation(d) {
91561                 event.preventDefault();
91562
91563                 // remove the hover-highlight styling
91564                 utilHighlightEntities([d.relation.id], false, context);
91565
91566                 context.enter(modeSelect(context, [d.relation.id]));
91567             }
91568
91569
91570             function changeRole(d) {
91571                 if (d === 0) return;    // called on newrow (shoudn't happen)
91572                 if (_inChange) return;  // avoid accidental recursive call #5731
91573
91574                 var oldRole = d.member.role;
91575                 var newRole = d3_select(this).property('value');
91576
91577                 if (oldRole !== newRole) {
91578                     _inChange = true;
91579                     context.perform(
91580                         actionChangeMember(d.relation.id, Object.assign({}, d.member, { role: newRole }), d.index),
91581                         t('operations.change_role.annotation')
91582                     );
91583                 }
91584                 _inChange = false;
91585             }
91586
91587
91588             function addMembership(d, role) {
91589                 this.blur();           // avoid keeping focus on the button
91590                 _showBlank = false;
91591
91592                 var member = { id: _entityID, type: context.entity(_entityID).type, role: role };
91593
91594                 if (d.relation) {
91595                     context.perform(
91596                         actionAddMember(d.relation.id, member),
91597                         t('operations.add_member.annotation')
91598                     );
91599
91600                 } else {
91601                     var relation = osmRelation();
91602                     context.perform(
91603                         actionAddEntity(relation),
91604                         actionAddMember(relation.id, member),
91605                         t('operations.add.annotation.relation')
91606                     );
91607
91608                     context.enter(modeSelect(context, [relation.id]).newFeature(true));
91609                 }
91610             }
91611
91612
91613             function deleteMembership(d) {
91614                 this.blur();           // avoid keeping focus on the button
91615                 if (d === 0) return;   // called on newrow (shoudn't happen)
91616
91617                 // remove the hover-highlight styling
91618                 utilHighlightEntities([d.relation.id], false, context);
91619
91620                 context.perform(
91621                     actionDeleteMember(d.relation.id, d.index),
91622                     t('operations.delete_member.annotation')
91623                 );
91624             }
91625
91626
91627             function fetchNearbyRelations(q, callback) {
91628                 var newRelation = { relation: null, value: t('inspector.new_relation') };
91629                 var result = [];
91630                 var graph = context.graph();
91631
91632                 context.intersects(context.extent()).forEach(function(entity) {
91633                     if (entity.type !== 'relation' || entity.id === _entityID) return;
91634
91635                     var matched = context.presets().match(entity, graph);
91636                     var presetName = (matched && matched.name()) || t('inspector.relation');
91637                     var entityName = utilDisplayName(entity) || '';
91638
91639                     var value = presetName + ' ' + entityName;
91640                     if (q && value.toLowerCase().indexOf(q.toLowerCase()) === -1) return;
91641
91642                     result.push({ relation: entity, value: value });
91643                 });
91644
91645                 result.sort(function(a, b) {
91646                     return osmRelation.creationOrder(a.relation, b.relation);
91647                 });
91648
91649                 // Dedupe identical names by appending relation id - see #2891
91650                 var dupeGroups = Object.values(utilArrayGroupBy(result, 'value'))
91651                     .filter(function(v) { return v.length > 1; });
91652
91653                 dupeGroups.forEach(function(group) {
91654                     group.forEach(function(obj) {
91655                         obj.value += ' ' + obj.relation.id;
91656                     });
91657                 });
91658
91659                 result.forEach(function(obj) {
91660                     obj.title = obj.value;
91661                 });
91662
91663                 result.unshift(newRelation);
91664                 callback(result);
91665             }
91666
91667
91668             function rawMembershipEditor(selection) {
91669                 var entity = context.entity(_entityID);
91670                 var parents = context.graph().parentRelations(entity);
91671                 var memberships = [];
91672
91673                 parents.slice(0, 1000).forEach(function(relation) {
91674                     relation.members.forEach(function(member, index) {
91675                         if (member.id === entity.id) {
91676                             memberships.push({ relation: relation, member: member, index: index });
91677                         }
91678                     });
91679                 });
91680
91681                 var gt = parents.length > 1000 ? '>' : '';
91682                 selection.call(uiDisclosure(context, 'raw_membership_editor', true)
91683                     .title(t('inspector.all_relations') + ' (' + gt + memberships.length + ')')
91684                     .expanded(true)
91685                     .updatePreference(false)
91686                     .on('toggled', function(expanded) {
91687                         if (expanded) { selection.node().parentNode.scrollTop += 200; }
91688                     })
91689                     .content(content)
91690                 );
91691
91692
91693                 function content(selection) {
91694                     var list = selection.selectAll('.member-list')
91695                         .data([0]);
91696
91697                     list = list.enter()
91698                         .append('ul')
91699                         .attr('class', 'member-list')
91700                         .merge(list);
91701
91702
91703                     var items = list.selectAll('li.member-row-normal')
91704                         .data(memberships, function(d) {
91705                             return osmEntity.key(d.relation) + ',' + d.index;
91706                         });
91707
91708                     items.exit()
91709                         .each(unbind)
91710                         .remove();
91711
91712                     // Enter
91713                     var itemsEnter = items.enter()
91714                         .append('li')
91715                         .attr('class', 'member-row member-row-normal form-field');
91716
91717                     // highlight the relation in the map while hovering on the list item
91718                     itemsEnter.on('mouseover', function(d) {
91719                             utilHighlightEntities([d.relation.id], true, context);
91720                         })
91721                         .on('mouseout', function(d) {
91722                             utilHighlightEntities([d.relation.id], false, context);
91723                         });
91724
91725                     var labelEnter = itemsEnter
91726                         .append('label')
91727                         .attr('class', 'field-label')
91728                         .append('span')
91729                         .attr('class', 'label-text')
91730                         .append('a')
91731                         .attr('href', '#')
91732                         .on('click', selectRelation);
91733
91734                     labelEnter
91735                         .append('span')
91736                         .attr('class', 'member-entity-type')
91737                         .text(function(d) {
91738                             var matched = context.presets().match(d.relation, context.graph());
91739                             return (matched && matched.name()) || t('inspector.relation');
91740                         });
91741
91742                     labelEnter
91743                         .append('span')
91744                         .attr('class', 'member-entity-name')
91745                         .text(function(d) { return utilDisplayName(d.relation); });
91746
91747                     var wrapEnter = itemsEnter
91748                         .append('div')
91749                         .attr('class', 'form-field-input-wrap form-field-input-member');
91750
91751                     wrapEnter
91752                         .append('input')
91753                         .attr('class', 'member-role')
91754                         .property('type', 'text')
91755                         .attr('maxlength', 255)
91756                         .attr('placeholder', t('inspector.role'))
91757                         .call(utilNoAuto)
91758                         .property('value', function(d) { return d.member.role; })
91759                         .on('blur', changeRole)
91760                         .on('change', changeRole);
91761
91762                     wrapEnter
91763                         .append('button')
91764                         .attr('tabindex', -1)
91765                         .attr('class', 'remove form-field-button member-delete')
91766                         .call(svgIcon('#iD-operation-delete'))
91767                         .on('click', deleteMembership);
91768
91769                     if (taginfo) {
91770                         wrapEnter.each(bindTypeahead);
91771                     }
91772
91773
91774                     var newMembership = list.selectAll('.member-row-new')
91775                         .data(_showBlank ? [0] : []);
91776
91777                     // Exit
91778                     newMembership.exit()
91779                         .remove();
91780
91781                     // Enter
91782                     var newMembershipEnter = newMembership.enter()
91783                         .append('li')
91784                         .attr('class', 'member-row member-row-new form-field');
91785
91786                     newMembershipEnter
91787                         .append('label')
91788                         .attr('class', 'field-label')
91789                         .append('input')
91790                         .attr('placeholder', t('inspector.choose_relation'))
91791                         .attr('type', 'text')
91792                         .attr('class', 'member-entity-input')
91793                         .call(utilNoAuto);
91794
91795                     var newWrapEnter = newMembershipEnter
91796                         .append('div')
91797                         .attr('class', 'form-field-input-wrap form-field-input-member');
91798
91799                     newWrapEnter
91800                         .append('input')
91801                         .attr('class', 'member-role')
91802                         .property('type', 'text')
91803                         .attr('maxlength', 255)
91804                         .attr('placeholder', t('inspector.role'))
91805                         .call(utilNoAuto);
91806
91807                     newWrapEnter
91808                         .append('button')
91809                         .attr('tabindex', -1)
91810                         .attr('class', 'remove form-field-button member-delete')
91811                         .call(svgIcon('#iD-operation-delete'))
91812                         .on('click', function() {
91813                             list.selectAll('.member-row-new')
91814                                 .remove();
91815                         });
91816
91817                     // Update
91818                     newMembership = newMembership
91819                         .merge(newMembershipEnter);
91820
91821                     newMembership.selectAll('.member-entity-input')
91822                         .on('blur', cancelEntity)   // if it wasn't accepted normally, cancel it
91823                         .call(nearbyCombo
91824                             .on('accept', acceptEntity)
91825                             .on('cancel', cancelEntity)
91826                         );
91827
91828
91829                     // Container for the Add button
91830                     var addRow = selection.selectAll('.add-row')
91831                         .data([0]);
91832
91833                     // enter
91834                     var addRowEnter = addRow.enter()
91835                         .append('div')
91836                         .attr('class', 'add-row');
91837
91838                     var addRelationButton = addRowEnter
91839                         .append('button')
91840                         .attr('class', 'add-relation');
91841
91842                     addRelationButton
91843                         .call(svgIcon('#iD-icon-plus', 'light'));
91844                     addRelationButton
91845                         .call(tooltip().title(t('inspector.add_to_relation')).placement(textDirection === 'ltr' ? 'right' : 'left'));
91846
91847                     addRowEnter
91848                         .append('div')
91849                         .attr('class', 'space-value');   // preserve space
91850
91851                     addRowEnter
91852                         .append('div')
91853                         .attr('class', 'space-buttons');  // preserve space
91854
91855                     // update
91856                     addRow = addRow
91857                         .merge(addRowEnter);
91858
91859                     addRow.select('.add-relation')
91860                         .on('click', function() {
91861                             _showBlank = true;
91862                             content(selection);
91863                             list.selectAll('.member-entity-input').node().focus();
91864                         });
91865
91866
91867                     function acceptEntity(d) {
91868                         if (!d) {
91869                             cancelEntity();
91870                             return;
91871                         }
91872                         var role = list.selectAll('.member-row-new .member-role').property('value');
91873                         addMembership(d, role);
91874                     }
91875
91876
91877                     function cancelEntity() {
91878                         var input = newMembership.selectAll('.member-entity-input');
91879                         input.property('value', '');
91880                     }
91881
91882
91883                     function bindTypeahead(d) {
91884                         var row = d3_select(this);
91885                         var role = row.selectAll('input.member-role');
91886                         var origValue = role.property('value');
91887
91888                         function sort(value, data) {
91889                             var sameletter = [];
91890                             var other = [];
91891                             for (var i = 0; i < data.length; i++) {
91892                                 if (data[i].value.substring(0, value.length) === value) {
91893                                     sameletter.push(data[i]);
91894                                 } else {
91895                                     other.push(data[i]);
91896                                 }
91897                             }
91898                             return sameletter.concat(other);
91899                         }
91900
91901                         role.call(uiCombobox(context, 'member-role')
91902                             .fetcher(function(role, callback) {
91903                                 var rtype = d.relation.tags.type;
91904                                 taginfo.roles({
91905                                     debounce: true,
91906                                     rtype: rtype || '',
91907                                     geometry: context.geometry(_entityID),
91908                                     query: role
91909                                 }, function(err, data) {
91910                                     if (!err) callback(sort(role, data));
91911                                 });
91912                             })
91913                             .on('cancel', function() {
91914                                 role.property('value', origValue);
91915                             })
91916                         );
91917                     }
91918
91919
91920                     function unbind() {
91921                         var row = d3_select(this);
91922
91923                         row.selectAll('input.member-role')
91924                             .call(uiCombobox.off);
91925                     }
91926                 }
91927             }
91928
91929
91930             rawMembershipEditor.entityID = function(val) {
91931                 if (!arguments.length) return _entityID;
91932                 _entityID = val;
91933                 _showBlank = false;
91934                 return rawMembershipEditor;
91935             };
91936
91937
91938             return rawMembershipEditor;
91939         }
91940
91941         // This currently only works with the 'restrictions' field
91942         // It borrows some code from uiHelp
91943
91944         function uiFieldHelp(context, fieldName) {
91945             var fieldHelp = {};
91946             var _inspector = d3_select(null);
91947             var _wrap = d3_select(null);
91948             var _body = d3_select(null);
91949
91950             var fieldHelpKeys = {
91951                 restrictions: [
91952                     ['about',[
91953                         'about',
91954                         'from_via_to',
91955                         'maxdist',
91956                         'maxvia'
91957                     ]],
91958                     ['inspecting',[
91959                         'about',
91960                         'from_shadow',
91961                         'allow_shadow',
91962                         'restrict_shadow',
91963                         'only_shadow',
91964                         'restricted',
91965                         'only'
91966                     ]],
91967                     ['modifying',[
91968                         'about',
91969                         'indicators',
91970                         'allow_turn',
91971                         'restrict_turn',
91972                         'only_turn'
91973                     ]],
91974                     ['tips',[
91975                         'simple',
91976                         'simple_example',
91977                         'indirect',
91978                         'indirect_example',
91979                         'indirect_noedit'
91980                     ]]
91981                 ]
91982             };
91983
91984             var fieldHelpHeadings = {};
91985
91986             var replacements = {
91987                 distField: t('restriction.controls.distance'),
91988                 viaField: t('restriction.controls.via'),
91989                 fromShadow: icon('#iD-turn-shadow', 'pre-text shadow from'),
91990                 allowShadow: icon('#iD-turn-shadow', 'pre-text shadow allow'),
91991                 restrictShadow: icon('#iD-turn-shadow', 'pre-text shadow restrict'),
91992                 onlyShadow: icon('#iD-turn-shadow', 'pre-text shadow only'),
91993                 allowTurn: icon('#iD-turn-yes', 'pre-text turn'),
91994                 restrictTurn: icon('#iD-turn-no', 'pre-text turn'),
91995                 onlyTurn: icon('#iD-turn-only', 'pre-text turn')
91996             };
91997
91998
91999             // For each section, squash all the texts into a single markdown document
92000             var docs = fieldHelpKeys[fieldName].map(function(key) {
92001                 var helpkey = 'help.field.' + fieldName + '.' + key[0];
92002                 var text = key[1].reduce(function(all, part) {
92003                     var subkey = helpkey + '.' + part;
92004                     var depth = fieldHelpHeadings[subkey];                     // is this subkey a heading?
92005                     var hhh = depth ? Array(depth + 1).join('#') + ' ' : '';   // if so, prepend with some ##'s
92006                     return all + hhh + t(subkey, replacements) + '\n\n';
92007                 }, '');
92008
92009                 return {
92010                     key: helpkey,
92011                     title: t(helpkey + '.title'),
92012                     html: marked(text.trim())
92013                 };
92014             });
92015
92016
92017             function show() {
92018                 updatePosition();
92019
92020                 _body
92021                     .classed('hide', false)
92022                     .style('opacity', '0')
92023                     .transition()
92024                     .duration(200)
92025                     .style('opacity', '1');
92026             }
92027
92028
92029             function hide() {
92030                 _body
92031                     .classed('hide', true)
92032                     .transition()
92033                     .duration(200)
92034                     .style('opacity', '0')
92035                     .on('end', function () {
92036                         _body.classed('hide', true);
92037                     });
92038             }
92039
92040
92041             function clickHelp(index) {
92042                 var d = docs[index];
92043                 var tkeys = fieldHelpKeys[fieldName][index][1];
92044
92045                 _body.selectAll('.field-help-nav-item')
92046                     .classed('active', function(d, i) { return i === index; });
92047
92048                 var content = _body.selectAll('.field-help-content')
92049                     .html(d.html);
92050
92051                 // class the paragraphs so we can find and style them
92052                 content.selectAll('p')
92053                     .attr('class', function(d, i) { return tkeys[i]; });
92054
92055                 // insert special content for certain help sections
92056                 if (d.key === 'help.field.restrictions.inspecting') {
92057                     content
92058                         .insert('img', 'p.from_shadow')
92059                         .attr('class', 'field-help-image cf')
92060                         .attr('src', context.imagePath('tr_inspect.gif'));
92061
92062                 } else if (d.key === 'help.field.restrictions.modifying') {
92063                     content
92064                         .insert('img', 'p.allow_turn')
92065                         .attr('class', 'field-help-image cf')
92066                         .attr('src', context.imagePath('tr_modify.gif'));
92067                 }
92068             }
92069
92070
92071             fieldHelp.button = function(selection) {
92072                 if (_body.empty()) return;
92073
92074                 var button = selection.selectAll('.field-help-button')
92075                     .data([0]);
92076
92077                 // enter/update
92078                 button.enter()
92079                     .append('button')
92080                     .attr('class', 'field-help-button')
92081                     .attr('tabindex', -1)
92082                     .call(svgIcon('#iD-icon-help'))
92083                     .merge(button)
92084                     .on('click', function () {
92085                         event.stopPropagation();
92086                         event.preventDefault();
92087                         if (_body.classed('hide')) {
92088                             show();
92089                         } else {
92090                             hide();
92091                         }
92092                     });
92093             };
92094
92095
92096             function updatePosition() {
92097                 var wrap = _wrap.node();
92098                 var inspector = _inspector.node();
92099                 var wRect = wrap.getBoundingClientRect();
92100                 var iRect = inspector.getBoundingClientRect();
92101
92102                 _body
92103                     .style('top', wRect.top + inspector.scrollTop - iRect.top + 'px');
92104             }
92105
92106
92107             fieldHelp.body = function(selection) {
92108                 // This control expects the field to have a form-field-input-wrap div
92109                 _wrap = selection.selectAll('.form-field-input-wrap');
92110                 if (_wrap.empty()) return;
92111
92112                 // absolute position relative to the inspector, so it "floats" above the fields
92113                 _inspector = d3_select('#sidebar .entity-editor-pane .inspector-body');
92114                 if (_inspector.empty()) return;
92115
92116                 _body = _inspector.selectAll('.field-help-body')
92117                     .data([0]);
92118
92119                 var enter = _body.enter()
92120                     .append('div')
92121                     .attr('class', 'field-help-body hide');   // initially hidden
92122
92123                 var titleEnter = enter
92124                     .append('div')
92125                     .attr('class', 'field-help-title cf');
92126
92127                 titleEnter
92128                     .append('h2')
92129                     .attr('class', ((textDirection === 'rtl') ? 'fr' : 'fl'))
92130                     .text(t('help.field.' + fieldName + '.title'));
92131
92132                 titleEnter
92133                     .append('button')
92134                     .attr('class', 'fr close')
92135                     .on('click', function() {
92136                         event.stopPropagation();
92137                         event.preventDefault();
92138                         hide();
92139                     })
92140                     .call(svgIcon('#iD-icon-close'));
92141
92142                 var navEnter = enter
92143                     .append('div')
92144                     .attr('class', 'field-help-nav cf');
92145
92146                 var titles = docs.map(function(d) { return d.title; });
92147                 navEnter.selectAll('.field-help-nav-item')
92148                     .data(titles)
92149                     .enter()
92150                     .append('div')
92151                     .attr('class', 'field-help-nav-item')
92152                     .text(function(d) { return d; })
92153                     .on('click', function(d, i) {
92154                         event.stopPropagation();
92155                         event.preventDefault();
92156                         clickHelp(i);
92157                     });
92158
92159                 enter
92160                     .append('div')
92161                     .attr('class', 'field-help-content');
92162
92163                 _body = _body
92164                     .merge(enter);
92165
92166                 clickHelp(0);
92167             };
92168
92169
92170             return fieldHelp;
92171         }
92172
92173         function uiFieldCheck(field, context) {
92174             var dispatch$1 = dispatch('change');
92175             var options = field.strings && field.strings.options;
92176             var values = [];
92177             var texts = [];
92178
92179             var input = d3_select(null);
92180             var text = d3_select(null);
92181             var label = d3_select(null);
92182             var reverser = d3_select(null);
92183
92184             var _impliedYes;
92185             var _entityID;
92186             var _value;
92187
92188
92189             if (options) {
92190                 for (var k in options) {
92191                     values.push(k === 'undefined' ? undefined : k);
92192                     texts.push(field.t('options.' + k, { 'default': options[k] }));
92193                 }
92194             } else {
92195                 values = [undefined, 'yes'];
92196                 texts = [t('inspector.unknown'), t('inspector.check.yes')];
92197                 if (field.type !== 'defaultCheck') {
92198                     values.push('no');
92199                     texts.push(t('inspector.check.no'));
92200                 }
92201             }
92202
92203
92204             // Checks tags to see whether an undefined value is "Assumed to be Yes"
92205             function checkImpliedYes() {
92206                 _impliedYes = (field.id === 'oneway_yes');
92207
92208                 // hack: pretend `oneway` field is a `oneway_yes` field
92209                 // where implied oneway tag exists (e.g. `junction=roundabout`) #2220, #1841
92210                 if (field.id === 'oneway') {
92211                     var entity = context.entity(_entityID);
92212                     for (var key in entity.tags) {
92213                         if (key in osmOneWayTags && (entity.tags[key] in osmOneWayTags[key])) {
92214                             _impliedYes = true;
92215                             texts[0] = t('presets.fields.oneway_yes.options.undefined');
92216                             break;
92217                         }
92218                     }
92219                 }
92220             }
92221
92222
92223             function reverserHidden() {
92224                 if (!d3_select('div.inspector-hover').empty()) return true;
92225                 return !(_value === 'yes' || (_impliedYes && !_value));
92226             }
92227
92228
92229             function reverserSetText(selection) {
92230                 var entity = context.hasEntity(_entityID);
92231                 if (reverserHidden() || !entity) return selection;
92232
92233                 var first = entity.first();
92234                 var last = entity.isClosed() ? entity.nodes[entity.nodes.length - 2] : entity.last();
92235                 var pseudoDirection = first < last;
92236                 var icon = pseudoDirection ? '#iD-icon-forward' : '#iD-icon-backward';
92237
92238                 selection.selectAll('.reverser-span')
92239                     .text(t('inspector.check.reverser'))
92240                     .call(svgIcon(icon, 'inline'));
92241
92242                 return selection;
92243             }
92244
92245
92246             var check = function(selection) {
92247                 checkImpliedYes();
92248
92249                 label = selection.selectAll('.form-field-input-wrap')
92250                     .data([0]);
92251
92252                 var enter = label.enter()
92253                     .append('label')
92254                     .attr('class', 'form-field-input-wrap form-field-input-check');
92255
92256                 enter
92257                     .append('input')
92258                     .property('indeterminate', field.type !== 'defaultCheck')
92259                     .attr('type', 'checkbox')
92260                     .attr('id', 'preset-input-' + field.safeid);
92261
92262                 enter
92263                     .append('span')
92264                     .text(texts[0])
92265                     .attr('class', 'value');
92266
92267                 if (field.type === 'onewayCheck') {
92268                     enter
92269                         .append('a')
92270                         .attr('id', 'preset-input-' + field.safeid + '-reverser')
92271                         .attr('class', 'reverser button' + (reverserHidden() ? ' hide' : ''))
92272                         .attr('href', '#')
92273                         .append('span')
92274                         .attr('class', 'reverser-span');
92275                 }
92276
92277                 label = label.merge(enter);
92278                 input = label.selectAll('input');
92279                 text = label.selectAll('span.value');
92280
92281                 input
92282                     .on('click', function() {
92283                         event.stopPropagation();
92284                         var t = {};
92285                         t[field.key] = values[(values.indexOf(_value) + 1) % values.length];
92286
92287                         // Don't cycle through `alternating` or `reversible` states - #4970
92288                         // (They are supported as translated strings, but should not toggle with clicks)
92289                         if (t[field.key] === 'reversible' || t[field.key] === 'alternating') {
92290                             t[field.key] = values[0];
92291                         }
92292
92293                         dispatch$1.call('change', this, t);
92294                     });
92295
92296                 if (field.type === 'onewayCheck') {
92297                     reverser = label.selectAll('.reverser');
92298
92299                     reverser
92300                         .call(reverserSetText)
92301                         .on('click', function() {
92302                             event.preventDefault();
92303                             event.stopPropagation();
92304                             context.perform(
92305                                 actionReverse(_entityID),
92306                                 t('operations.reverse.annotation')
92307                             );
92308                             d3_select(this)
92309                                 .call(reverserSetText);
92310                         });
92311                 }
92312             };
92313
92314
92315             check.entity = function(_) {
92316                 if (!arguments.length) return context.hasEntity(_entityID);
92317                 _entityID = _.id;
92318                 return check;
92319             };
92320
92321
92322             check.tags = function(tags) {
92323
92324                 function isChecked(val) {
92325                     return val !== 'no' && val !== '' && val !== undefined && val !== null;
92326                 }
92327
92328                 function textFor(val) {
92329                     if (val === '') val = undefined;
92330                     var index = values.indexOf(val);
92331                     return (index !== -1 ? texts[index] : ('"' + val + '"'));
92332                 }
92333
92334                 checkImpliedYes();
92335                 _value = tags[field.key] && tags[field.key].toLowerCase();
92336
92337                 if (field.type === 'onewayCheck' && (_value === '1' || _value === '-1')) {
92338                     _value = 'yes';
92339                 }
92340
92341                 input
92342                     .property('indeterminate', field.type !== 'defaultCheck' && !_value)
92343                     .property('checked', isChecked(_value));
92344
92345                 text
92346                     .text(textFor(_value));
92347
92348                 label
92349                     .classed('set', !!_value);
92350
92351                 if (field.type === 'onewayCheck') {
92352                     reverser
92353                         .classed('hide', reverserHidden())
92354                         .call(reverserSetText);
92355                 }
92356             };
92357
92358
92359             check.focus = function() {
92360                 input.node().focus();
92361             };
92362
92363             return utilRebind(check, dispatch$1, 'on');
92364         }
92365
92366         function uiFieldCombo(field, context) {
92367             var dispatch$1 = dispatch('change');
92368             var nominatim = services$1.geocoder;
92369             var taginfo = services$1.taginfo;
92370             var isMulti = (field.type === 'multiCombo');
92371             var isNetwork = (field.type === 'networkCombo');
92372             var isSemi = (field.type === 'semiCombo');
92373             var optstrings = field.strings && field.strings.options;
92374             var optarray = field.options;
92375             var snake_case = (field.snake_case || (field.snake_case === undefined));
92376             var caseSensitive = field.caseSensitive;
92377             var combobox = uiCombobox(context, 'combo-' + field.safeid)
92378                 .caseSensitive(caseSensitive)
92379                 .minItems(isMulti || isSemi ? 1 : 2);
92380             var container = d3_select(null);
92381             var inputWrap = d3_select(null);
92382             var input = d3_select(null);
92383             var _comboData = [];
92384             var _multiData = [];
92385             var _entity;
92386             var _country;
92387
92388             // ensure multiCombo field.key ends with a ':'
92389             if (isMulti && /[^:]$/.test(field.key)) {
92390                 field.key += ':';
92391             }
92392
92393
92394             function snake(s) {
92395                 return s.replace(/\s+/g, '_');
92396             }
92397
92398             function unsnake(s) {
92399                 return s.replace(/_+/g, ' ');
92400             }
92401
92402             function clean(s) {
92403                 return s.split(';')
92404                     .map(function(s) { return s.trim(); })
92405                     .join(';');
92406             }
92407
92408
92409             // returns the tag value for a display value
92410             // (for multiCombo, dval should be the key suffix, not the entire key)
92411             function tagValue(dval) {
92412                 dval = clean(dval || '');
92413
92414                 if (optstrings) {
92415                     var found = _comboData.find(function(o) {
92416                         return o.key && clean(o.value) === dval;
92417                     });
92418                     if (found) {
92419                         return found.key;
92420                     }
92421                 }
92422
92423                 if (field.type === 'typeCombo' && !dval) {
92424                     return 'yes';
92425                 }
92426
92427                 return (snake_case ? snake(dval) : dval) || undefined;
92428             }
92429
92430
92431             // returns the display value for a tag value
92432             // (for multiCombo, tval should be the key suffix, not the entire key)
92433             function displayValue(tval) {
92434                 tval = tval || '';
92435
92436                 if (optstrings) {
92437                     var found = _comboData.find(function(o) {
92438                         return o.key === tval && o.value;
92439                     });
92440                     if (found) {
92441                         return found.value;
92442                     }
92443                 }
92444
92445                 if (field.type === 'typeCombo' && tval.toLowerCase() === 'yes') {
92446                     return '';
92447                 }
92448
92449                 return snake_case ? unsnake(tval) : tval;
92450             }
92451
92452
92453             // Compute the difference between arrays of objects by `value` property
92454             //
92455             // objectDifference([{value:1}, {value:2}, {value:3}], [{value:2}])
92456             // > [{value:1}, {value:3}]
92457             //
92458             function objectDifference(a, b) {
92459                 return a.filter(function(d1) {
92460                     return !b.some(function(d2) { return d1.value === d2.value; });
92461                 });
92462             }
92463
92464
92465             function initCombo(selection, attachTo) {
92466                 if (optstrings) {
92467                     selection.attr('readonly', 'readonly');
92468                     selection.call(combobox, attachTo);
92469                     setStaticValues(setPlaceholder);
92470
92471                 } else if (optarray) {
92472                     selection.call(combobox, attachTo);
92473                     setStaticValues(setPlaceholder);
92474
92475                 } else if (taginfo) {
92476                     selection.call(combobox.fetcher(setTaginfoValues), attachTo);
92477                     setTaginfoValues('', setPlaceholder);
92478                 }
92479             }
92480
92481
92482             function setStaticValues(callback) {
92483                 if (!(optstrings || optarray)) return;
92484
92485                 if (optstrings) {
92486                     _comboData = Object.keys(optstrings).map(function(k) {
92487                         var v = field.t('options.' + k, { 'default': optstrings[k] });
92488                         return {
92489                             key: k,
92490                             value: v,
92491                             title: v
92492                         };
92493                     });
92494
92495                 } else if (optarray) {
92496                     _comboData = optarray.map(function(k) {
92497                         var v = snake_case ? unsnake(k) : k;
92498                         return {
92499                             key: k,
92500                             value: v,
92501                             title: v
92502                         };
92503                     });
92504                 }
92505
92506                 combobox.data(objectDifference(_comboData, _multiData));
92507                 if (callback) callback(_comboData);
92508             }
92509
92510
92511             function setTaginfoValues(q, callback) {
92512                 var fn = isMulti ? 'multikeys' : 'values';
92513                 var query = (isMulti ? field.key : '') + q;
92514                 var hasCountryPrefix = isNetwork && _country && _country.indexOf(q.toLowerCase()) === 0;
92515                 if (hasCountryPrefix) {
92516                     query = _country + ':';
92517                 }
92518
92519                 var params = {
92520                     debounce: (q !== ''),
92521                     key: field.key,
92522                     query: query
92523                 };
92524
92525                 if (_entity) {
92526                     params.geometry = context.geometry(_entity.id);
92527                 }
92528
92529                 taginfo[fn](params, function(err, data) {
92530                     if (err) return;
92531
92532                     var deprecatedValues = osmEntity.deprecatedTagValuesByKey()[field.key];
92533                     if (deprecatedValues) {
92534                         // don't suggest deprecated tag values
92535                         data = data.filter(function(d) {
92536                             return deprecatedValues.indexOf(d.value) === -1;
92537                         });
92538                     }
92539
92540                     if (hasCountryPrefix) {
92541                         data = data.filter(function(d) {
92542                             return d.value.toLowerCase().indexOf(_country + ':') === 0;
92543                         });
92544                     }
92545
92546                     // hide the caret if there are no suggestions
92547                     container.classed('empty-combobox', data.length === 0);
92548
92549                     _comboData = data.map(function(d) {
92550                         var k = d.value;
92551                         if (isMulti) k = k.replace(field.key, '');
92552                         var v = snake_case ? unsnake(k) : k;
92553                         return {
92554                             key: k,
92555                             value: v,
92556                             title: isMulti ? v : d.title
92557                         };
92558                     });
92559
92560                     _comboData = objectDifference(_comboData, _multiData);
92561                     if (callback) callback(_comboData);
92562                 });
92563             }
92564
92565
92566             function setPlaceholder(values) {
92567                 var ph;
92568
92569                 if (isMulti || isSemi) {
92570                     ph = field.placeholder() || t('inspector.add');
92571                 } else {
92572                     var vals = values
92573                         .map(function(d) { return d.value; })
92574                         .filter(function(s) { return s.length < 20; });
92575
92576                     var placeholders = vals.length > 1 ? vals : values.map(function(d) { return d.key; });
92577                     ph = field.placeholder() || placeholders.slice(0, 3).join(', ');
92578                 }
92579
92580                 if (!/(…|\.\.\.)$/.test(ph)) {
92581                     ph += '…';
92582                 }
92583
92584                 container.selectAll('input')
92585                     .attr('placeholder', ph);
92586             }
92587
92588
92589             function change() {
92590                 var t = {};
92591                 var val;
92592
92593                 if (isMulti || isSemi) {
92594                     val = tagValue(utilGetSetValue(input).replace(/,/g, ';')) || '';
92595                     container.classed('active', false);
92596                     utilGetSetValue(input, '');
92597
92598                     var vals = val.split(';').filter(Boolean);
92599                     if (!vals.length) return;
92600
92601                     if (isMulti) {
92602                         utilArrayUniq(vals).forEach(function(v) {
92603                             var key = field.key + v;
92604                             if (_entity) {
92605                                 // don't set a multicombo value to 'yes' if it already has a non-'no' value
92606                                 // e.g. `language:de=main`
92607                                 var old = _entity.tags[key] || '';
92608                                 if (old && old.toLowerCase() !== 'no') return;
92609                             }
92610                             field.keys.push(key);
92611                             t[key] = 'yes';
92612                         });
92613
92614                     } else if (isSemi) {
92615                         var arr = _multiData.map(function(d) { return d.key; });
92616                         arr = arr.concat(vals);
92617                         t[field.key] = utilArrayUniq(arr).filter(Boolean).join(';');
92618                     }
92619
92620                     window.setTimeout(function() { input.node().focus(); }, 10);
92621
92622                 } else {
92623                     val = tagValue(utilGetSetValue(input));
92624                     t[field.key] = val;
92625                 }
92626
92627                 dispatch$1.call('change', this, t);
92628             }
92629
92630
92631             function removeMultikey(d) {
92632                 event.stopPropagation();
92633                 var t = {};
92634                 if (isMulti) {
92635                     t[d.key] = undefined;
92636                 } else if (isSemi) {
92637                     var arr = _multiData.map(function(md) {
92638                         return md.key === d.key ? null : md.key;
92639                     }).filter(Boolean);
92640
92641                     arr = utilArrayUniq(arr);
92642                     t[field.key] = arr.length ? arr.join(';') : undefined;
92643                 }
92644                 dispatch$1.call('change', this, t);
92645             }
92646
92647
92648             function combo(selection) {
92649                 container = selection.selectAll('.form-field-input-wrap')
92650                     .data([0]);
92651
92652                 var type = (isMulti || isSemi) ? 'multicombo': 'combo';
92653                 container = container.enter()
92654                     .append('div')
92655                     .attr('class', 'form-field-input-wrap form-field-input-' + type)
92656                     .merge(container);
92657
92658                 if (isMulti || isSemi) {
92659                     container = container.selectAll('.chiplist')
92660                         .data([0]);
92661
92662                     var listClass = 'chiplist';
92663
92664                     // Use a separate line for each value in the Destinations field
92665                     // to mimic highway exit signs
92666                     if (field.id === 'destination_oneway') {
92667                         listClass += ' full-line-chips';
92668                     }
92669
92670                     container = container.enter()
92671                         .append('ul')
92672                         .attr('class', listClass)
92673                         .on('click', function() {
92674                             window.setTimeout(function() { input.node().focus(); }, 10);
92675                         })
92676                         .merge(container);
92677
92678
92679                     inputWrap = container.selectAll('.input-wrap')
92680                         .data([0]);
92681
92682                     inputWrap = inputWrap.enter()
92683                         .append('li')
92684                         .attr('class', 'input-wrap')
92685                         .merge(inputWrap);
92686
92687                     input = inputWrap.selectAll('input')
92688                         .data([0]);
92689                 } else {
92690                     input = container.selectAll('input')
92691                         .data([0]);
92692                 }
92693
92694                 input = input.enter()
92695                     .append('input')
92696                     .attr('type', 'text')
92697                     .attr('id', 'preset-input-' + field.safeid)
92698                     .call(utilNoAuto)
92699                     .call(initCombo, selection)
92700                     .merge(input);
92701
92702                 if (isNetwork && nominatim && _entity) {
92703                     var center = _entity.extent(context.graph()).center();
92704                     nominatim.countryCode(center, function (err, code) {
92705                         _country = code;
92706                     });
92707                 }
92708
92709                 input
92710                     .on('change', change)
92711                     .on('blur', change);
92712
92713                 input
92714                     .on('keydown.field', function() {
92715                         switch (event.keyCode) {
92716                             case 13: // ↩ Return
92717                                 input.node().blur(); // blurring also enters the value
92718                                 event.stopPropagation();
92719                                 break;
92720                         }
92721                     });
92722
92723                 if (isMulti || isSemi) {
92724                     combobox
92725                         .on('accept', function() {
92726                             input.node().blur();
92727                             input.node().focus();
92728                         });
92729
92730                     input
92731                         .on('focus', function() { container.classed('active', true); });
92732                 }
92733             }
92734
92735
92736             combo.tags = function(tags) {
92737                 if (isMulti || isSemi) {
92738                     _multiData = [];
92739
92740                     if (isMulti) {
92741                         // Build _multiData array containing keys already set..
92742                         for (var k in tags) {
92743                             if (k.indexOf(field.key) !== 0) continue;
92744                             var v = (tags[k] || '').toLowerCase();
92745                             if (v === '' || v === 'no') continue;
92746
92747                             var suffix = k.substring(field.key.length);
92748                             _multiData.push({
92749                                 key: k,
92750                                 value: displayValue(suffix)
92751                             });
92752                         }
92753
92754                         // Set keys for form-field modified (needed for undo and reset buttons)..
92755                         field.keys = _multiData.map(function(d) { return d.key; });
92756
92757                     } else if (isSemi) {
92758                         var arr = utilArrayUniq((tags[field.key] || '').split(';')).filter(Boolean);
92759                         _multiData = arr.map(function(k) {
92760                             return {
92761                                 key: k,
92762                                 value: displayValue(k)
92763                             };
92764                         });
92765                     }
92766
92767                     // Exclude existing multikeys from combo options..
92768                     var available = objectDifference(_comboData, _multiData);
92769                     combobox.data(available);
92770
92771                     // Hide 'Add' button if this field uses fixed set of
92772                     // translateable optstrings and they're all currently used..
92773                     container.selectAll('.combobox-input, .combobox-caret')
92774                         .classed('hide', optstrings && !available.length);
92775
92776
92777                     // Render chips
92778                     var chips = container.selectAll('.chips')
92779                         .data(_multiData);
92780
92781                     chips.exit()
92782                         .remove();
92783
92784                     var enter = chips.enter()
92785                         .insert('li', '.input-wrap')
92786                         .attr('class', 'chips');
92787
92788                     enter.append('span');
92789                     enter.append('a');
92790
92791                     chips = chips.merge(enter);
92792
92793                     chips.select('span')
92794                         .text(function(d) { return d.value; });
92795
92796                     chips.select('a')
92797                         .on('click', removeMultikey)
92798                         .attr('class', 'remove')
92799                         .text('×');
92800
92801                 } else {
92802                     utilGetSetValue(input, displayValue(tags[field.key]));
92803                 }
92804             };
92805
92806
92807             combo.focus = function() {
92808                 input.node().focus();
92809             };
92810
92811
92812             combo.entity = function(val) {
92813                 if (!arguments.length) return _entity;
92814                 _entity = val;
92815                 return combo;
92816             };
92817
92818
92819             return utilRebind(combo, dispatch$1, 'on');
92820         }
92821
92822         function uiFieldText(field, context) {
92823             var dispatch$1 = dispatch('change');
92824             var nominatim = services$1.geocoder;
92825             var input = d3_select(null);
92826             var _entity;
92827
92828             function i(selection) {
92829                 var preset = _entity && context.presets().match(_entity, context.graph());
92830                 var isLocked = preset && preset.suggestion && field.id === 'brand';
92831                 field.locked(isLocked);
92832
92833                 var wrap = selection.selectAll('.form-field-input-wrap')
92834                     .data([0]);
92835
92836                 wrap = wrap.enter()
92837                     .append('div')
92838                     .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
92839                     .merge(wrap);
92840
92841                 var fieldID = 'preset-input-' + field.safeid;
92842
92843                 input = wrap.selectAll('input')
92844                     .data([0]);
92845
92846                 input = input.enter()
92847                     .append('input')
92848                     .attr('type', field.type)
92849                     .attr('id', fieldID)
92850                     .attr('placeholder', field.placeholder() || t('inspector.unknown'))
92851                     .classed(field.type, true)
92852                     .call(utilNoAuto)
92853                     .merge(input);
92854
92855                 input
92856                     .classed('disabled', !!isLocked)
92857                     .attr('readonly', isLocked || null)
92858                     .on('input', change(true))
92859                     .on('blur', change())
92860                     .on('change', change());
92861
92862
92863                 if (field.type === 'tel' && nominatim && _entity) {
92864                     var center = _entity.extent(context.graph()).center();
92865                     nominatim.countryCode(center, function (err, countryCode) {
92866                         if (err || !dataPhoneFormats[countryCode]) return;
92867                         wrap.selectAll('#' + fieldID)
92868                             .attr('placeholder', dataPhoneFormats[countryCode]);
92869                     });
92870
92871                 } else if (field.type === 'number') {
92872                     var rtl = (textDirection === 'rtl');
92873
92874                     input.attr('type', 'text');
92875
92876                     var buttons = wrap.selectAll('.increment, .decrement')
92877                         .data(rtl ? [1, -1] : [-1, 1]);
92878
92879                     buttons.enter()
92880                         .append('button')
92881                         .attr('tabindex', -1)
92882                         .attr('class', function(d) {
92883                             var which = (d === 1 ? 'increment' : 'decrement');
92884                             return 'form-field-button ' + which;
92885                         })
92886                         .merge(buttons)
92887                         .on('click', function(d) {
92888                             event.preventDefault();
92889                             var raw_vals = input.node().value || '0';
92890                             var vals = raw_vals.split(';');
92891                             vals = vals.map(function(v) {
92892                                 var num = parseFloat(v.trim(), 10);
92893                                 return isFinite(num) ? clamped(num + d) : v.trim();
92894                             });
92895                             input.node().value = vals.join(';');
92896                             change()();
92897                         });
92898                 }
92899             }
92900
92901
92902             // clamp number to min/max
92903             function clamped(num) {
92904                 if (field.minValue !== undefined) {
92905                     num = Math.max(num, field.minValue);
92906                 }
92907                 if (field.maxValue !== undefined) {
92908                     num = Math.min(num, field.maxValue);
92909                 }
92910                 return num;
92911             }
92912
92913
92914             function change(onInput) {
92915                 return function() {
92916                     var t = {};
92917                     var val = utilGetSetValue(input).trim() || undefined;
92918
92919                     if (!onInput) {
92920                         if (field.type === 'number' && val !== undefined) {
92921                             var vals = val.split(';');
92922                             vals = vals.map(function(v) {
92923                                 var num = parseFloat(v.trim(), 10);
92924                                 return isFinite(num) ? clamped(num) : v.trim();
92925                             });
92926                             val = vals.join(';');
92927                         }
92928                         utilGetSetValue(input, val || '');
92929                     }
92930                     t[field.key] = val;
92931                     dispatch$1.call('change', this, t, onInput);
92932                 };
92933             }
92934
92935
92936             i.entity = function(val) {
92937                 if (!arguments.length) return _entity;
92938                 _entity = val;
92939                 return i;
92940             };
92941
92942
92943             i.tags = function(tags) {
92944                 utilGetSetValue(input, tags[field.key] || '');
92945             };
92946
92947
92948             i.focus = function() {
92949                 var node = input.node();
92950                 if (node) node.focus();
92951             };
92952
92953             return utilRebind(i, dispatch$1, 'on');
92954         }
92955
92956         function uiFieldAccess(field, context) {
92957             var dispatch$1 = dispatch('change');
92958             var items = d3_select(null);
92959
92960             function access(selection) {
92961                 var wrap = selection.selectAll('.form-field-input-wrap')
92962                     .data([0]);
92963
92964                 wrap = wrap.enter()
92965                     .append('div')
92966                     .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
92967                     .merge(wrap);
92968
92969                 var list = wrap.selectAll('ul')
92970                     .data([0]);
92971
92972                 list = list.enter()
92973                     .append('ul')
92974                     .attr('class', 'rows')
92975                     .merge(list);
92976
92977
92978                 items = list.selectAll('li')
92979                     .data(field.keys);
92980
92981                 // Enter
92982                 var enter = items.enter()
92983                     .append('li')
92984                     .attr('class', function(d) { return 'labeled-input preset-access-' + d; });
92985
92986                 enter
92987                     .append('span')
92988                     .attr('class', 'label preset-label-access')
92989                     .attr('for', function(d) { return 'preset-input-access-' + d; })
92990                     .text(function(d) { return field.t('types.' + d); });
92991
92992                 enter
92993                     .append('div')
92994                     .attr('class', 'preset-input-access-wrap')
92995                     .append('input')
92996                     .attr('type', 'text')
92997                     .attr('class', function(d) { return 'preset-input-access preset-input-access-' + d; })
92998                     .call(utilNoAuto)
92999                     .each(function(d) {
93000                         d3_select(this)
93001                             .call(uiCombobox(context, 'access-' + d)
93002                                 .data(access.options(d))
93003                             );
93004                     });
93005
93006
93007                 // Update
93008                 items = items.merge(enter);
93009
93010                 wrap.selectAll('.preset-input-access')
93011                     .on('change', change)
93012                     .on('blur', change);
93013             }
93014
93015
93016             function change(d) {
93017                 var tag = {};
93018                 tag[d] = utilGetSetValue(d3_select(this)) || undefined;
93019                 dispatch$1.call('change', this, tag);
93020             }
93021
93022
93023             access.options = function(type) {
93024                 var options = ['no', 'permissive', 'private', 'permit', 'destination'];
93025
93026                 if (type !== 'access') {
93027                     options.unshift('yes');
93028                     options.push('designated');
93029
93030                     if (type === 'bicycle') {
93031                         options.push('dismount');
93032                     }
93033                 }
93034
93035                 return options.map(function(option) {
93036                     return {
93037                         title: field.t('options.' + option + '.description'),
93038                         value: option
93039                     };
93040                 });
93041             };
93042
93043
93044             var placeholders = {
93045                 footway: {
93046                     foot: 'designated',
93047                     motor_vehicle: 'no'
93048                 },
93049                 steps: {
93050                     foot: 'yes',
93051                     motor_vehicle: 'no',
93052                     bicycle: 'no',
93053                     horse: 'no'
93054                 },
93055                 pedestrian: {
93056                     foot: 'yes',
93057                     motor_vehicle: 'no'
93058                 },
93059                 cycleway: {
93060                     motor_vehicle: 'no',
93061                     bicycle: 'designated'
93062                 },
93063                 bridleway: {
93064                     motor_vehicle: 'no',
93065                     horse: 'designated'
93066                 },
93067                 path: {
93068                     foot: 'yes',
93069                     motor_vehicle: 'no',
93070                     bicycle: 'yes',
93071                     horse: 'yes'
93072                 },
93073                 motorway: {
93074                     foot: 'no',
93075                     motor_vehicle: 'yes',
93076                     bicycle: 'no',
93077                     horse: 'no'
93078                 },
93079                 trunk: {
93080                     motor_vehicle: 'yes'
93081                 },
93082                 primary: {
93083                     foot: 'yes',
93084                     motor_vehicle: 'yes',
93085                     bicycle: 'yes',
93086                     horse: 'yes'
93087                 },
93088                 secondary: {
93089                     foot: 'yes',
93090                     motor_vehicle: 'yes',
93091                     bicycle: 'yes',
93092                     horse: 'yes'
93093                 },
93094                 tertiary: {
93095                     foot: 'yes',
93096                     motor_vehicle: 'yes',
93097                     bicycle: 'yes',
93098                     horse: 'yes'
93099                 },
93100                 residential: {
93101                     foot: 'yes',
93102                     motor_vehicle: 'yes',
93103                     bicycle: 'yes',
93104                     horse: 'yes'
93105                 },
93106                 unclassified: {
93107                     foot: 'yes',
93108                     motor_vehicle: 'yes',
93109                     bicycle: 'yes',
93110                     horse: 'yes'
93111                 },
93112                 service: {
93113                     foot: 'yes',
93114                     motor_vehicle: 'yes',
93115                     bicycle: 'yes',
93116                     horse: 'yes'
93117                 },
93118                 motorway_link: {
93119                     foot: 'no',
93120                     motor_vehicle: 'yes',
93121                     bicycle: 'no',
93122                     horse: 'no'
93123                 },
93124                 trunk_link: {
93125                     motor_vehicle: 'yes'
93126                 },
93127                 primary_link: {
93128                     foot: 'yes',
93129                     motor_vehicle: 'yes',
93130                     bicycle: 'yes',
93131                     horse: 'yes'
93132                 },
93133                 secondary_link: {
93134                     foot: 'yes',
93135                     motor_vehicle: 'yes',
93136                     bicycle: 'yes',
93137                     horse: 'yes'
93138                 },
93139                 tertiary_link: {
93140                     foot: 'yes',
93141                     motor_vehicle: 'yes',
93142                     bicycle: 'yes',
93143                     horse: 'yes'
93144                 }
93145             };
93146
93147
93148             access.tags = function(tags) {
93149                 utilGetSetValue(items.selectAll('.preset-input-access'),
93150                     function(d) { return tags[d] || ''; })
93151                     .attr('placeholder', function() {
93152                         return tags.access ? tags.access : field.placeholder();
93153                     });
93154
93155                 items.selectAll('.preset-input-access-access')
93156                     .attr('placeholder', 'yes');
93157
93158                 var which = tags.highway;
93159                 if (!placeholders[which]) return;
93160
93161                 var keys = Object.keys(placeholders[which]);
93162                 keys.forEach(function(k) {
93163                     var v = placeholders[which][k];
93164                     items.selectAll('.preset-input-access-' + k)
93165                         .attr('placeholder', tags.access || v);
93166                 });
93167             };
93168
93169
93170             access.focus = function() {
93171                 items.selectAll('.preset-input-access')
93172                     .node().focus();
93173             };
93174
93175
93176             return utilRebind(access, dispatch$1, 'on');
93177         }
93178
93179         function uiFieldAddress(field, context) {
93180             var dispatch$1 = dispatch('init', 'change');
93181             var nominatim = services$1.geocoder;
93182             var wrap = d3_select(null);
93183             var _isInitialized = false;
93184             var _entity;
93185
93186             function getNearStreets() {
93187                 var extent = _entity.extent(context.graph());
93188                 var l = extent.center();
93189                 var box = geoExtent(l).padByMeters(200);
93190
93191                 var streets = context.intersects(box)
93192                     .filter(isAddressable)
93193                     .map(function(d) {
93194                         var loc = context.projection([
93195                             (extent[0][0] + extent[1][0]) / 2,
93196                             (extent[0][1] + extent[1][1]) / 2
93197                         ]);
93198                         var choice = geoChooseEdge(context.childNodes(d), loc, context.projection);
93199
93200                         return {
93201                             title: d.tags.name,
93202                             value: d.tags.name,
93203                             dist: choice.distance
93204                         };
93205                     })
93206                     .sort(function(a, b) {
93207                         return a.dist - b.dist;
93208                     });
93209
93210                 return utilArrayUniqBy(streets, 'value');
93211
93212                 function isAddressable(d) {
93213                     return d.tags.highway && d.tags.name && d.type === 'way';
93214                 }
93215             }
93216
93217
93218             function getNearCities() {
93219                 var extent = _entity.extent(context.graph());
93220                 var l = extent.center();
93221                 var box = geoExtent(l).padByMeters(200);
93222
93223                 var cities = context.intersects(box)
93224                     .filter(isAddressable)
93225                     .map(function(d) {
93226                         return {
93227                             title: d.tags['addr:city'] || d.tags.name,
93228                             value: d.tags['addr:city'] || d.tags.name,
93229                             dist: geoSphericalDistance(d.extent(context.graph()).center(), l)
93230                         };
93231                     })
93232                     .sort(function(a, b) {
93233                         return a.dist - b.dist;
93234                     });
93235
93236                 return utilArrayUniqBy(cities, 'value');
93237
93238
93239                 function isAddressable(d) {
93240                     if (d.tags.name) {
93241                         if (d.tags.admin_level === '8' && d.tags.boundary === 'administrative')
93242                             return true;
93243                         if (d.tags.border_type === 'city')
93244                             return true;
93245                         if (d.tags.place === 'city' || d.tags.place === 'town' || d.tags.place === 'village')
93246                             return true;
93247                     }
93248
93249                     if (d.tags['addr:city'])
93250                         return true;
93251
93252                     return false;
93253                 }
93254             }
93255
93256             function getNearValues(key) {
93257                 var extent = _entity.extent(context.graph());
93258                 var l = extent.center();
93259                 var box = geoExtent(l).padByMeters(200);
93260
93261                 var results = context.intersects(box)
93262                     .filter(function hasTag(d) { return d.id !== _entity.id && d.tags[key]; })
93263                     .map(function(d) {
93264                         return {
93265                             title: d.tags[key],
93266                             value: d.tags[key],
93267                             dist: geoSphericalDistance(d.extent(context.graph()).center(), l)
93268                         };
93269                     })
93270                     .sort(function(a, b) {
93271                         return a.dist - b.dist;
93272                     });
93273
93274                 return utilArrayUniqBy(results, 'value');
93275             }
93276
93277
93278             function countryCallback(err, countryCode) {
93279                 if (err) return;
93280                 countryCode = countryCode.toLowerCase();
93281
93282                 var addressFormat;
93283                 for (var i = 0; i < dataAddressFormats.length; i++) {
93284                     var format = dataAddressFormats[i];
93285                     if (!format.countryCodes) {
93286                         addressFormat = format;   // choose the default format, keep going
93287                     } else if (format.countryCodes.indexOf(countryCode) !== -1) {
93288                         addressFormat = format;   // choose the country format, stop here
93289                         break;
93290                     }
93291                 }
93292
93293                 var dropdowns = addressFormat.dropdowns || [
93294                     'city', 'county', 'country', 'district', 'hamlet',
93295                     'neighbourhood', 'place', 'postcode', 'province',
93296                     'quarter', 'state', 'street', 'subdistrict', 'suburb'
93297                 ];
93298
93299                 var widths = addressFormat.widths || {
93300                     housenumber: 1/3, street: 2/3,
93301                     city: 2/3, state: 1/4, postcode: 1/3
93302                 };
93303
93304                 function row(r) {
93305                     // Normalize widths.
93306                     var total = r.reduce(function(sum, key) {
93307                         return sum + (widths[key] || 0.5);
93308                     }, 0);
93309
93310                     return r.map(function(key) {
93311                         return {
93312                             id: key,
93313                             width: (widths[key] || 0.5) / total
93314                         };
93315                     });
93316                 }
93317
93318                 wrap.selectAll('.addr-row')
93319                     .data(addressFormat.format)
93320                     .enter()
93321                     .append('div')
93322                     .attr('class', 'addr-row')
93323                     .selectAll('input')
93324                     .data(row)
93325                     .enter()
93326                     .append('input')
93327                     .property('type', 'text')
93328                     .attr('placeholder', function (d) {
93329                         var localkey = d.id + '!' + countryCode;
93330                         var tkey = field.strings.placeholders[localkey] ? localkey : d.id;
93331                         return field.t('placeholders.' + tkey);
93332                     })
93333                     .attr('class', function (d) { return 'addr-' + d.id; })
93334                     .call(utilNoAuto)
93335                     .each(addDropdown)
93336                     .style('width', function (d) { return d.width * 100 + '%'; });
93337
93338
93339                 function addDropdown(d) {
93340                     if (dropdowns.indexOf(d.id) === -1) return;  // not a dropdown
93341
93342                     var nearValues = (d.id === 'street') ? getNearStreets
93343                         : (d.id === 'city') ? getNearCities
93344                         : getNearValues;
93345
93346                     d3_select(this)
93347                         .call(uiCombobox(context, 'address-' + d.id)
93348                             .minItems(1)
93349                             .caseSensitive(true)
93350                             .fetcher(function(value, callback) {
93351                                 callback(nearValues('addr:' + d.id));
93352                             })
93353                         );
93354                 }
93355
93356                 wrap.selectAll('input')
93357                     .on('blur', change())
93358                     .on('change', change());
93359
93360                 wrap.selectAll('input:not(.combobox-input)')
93361                     .on('input', change(true));
93362
93363                 dispatch$1.call('init');
93364                 _isInitialized = true;
93365             }
93366
93367
93368             function address(selection) {
93369                 _isInitialized = false;
93370
93371                 wrap = selection.selectAll('.form-field-input-wrap')
93372                     .data([0]);
93373
93374                 wrap = wrap.enter()
93375                     .append('div')
93376                     .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
93377                     .merge(wrap);
93378
93379                 if (nominatim && _entity) {
93380                     var center = _entity.extent(context.graph()).center();
93381                     nominatim.countryCode(center, countryCallback);
93382                 }
93383             }
93384
93385
93386             function change(onInput) {
93387                 return function() {
93388                     var tags = {};
93389
93390                     wrap.selectAll('input')
93391                         .each(function (field) {
93392                             tags['addr:' + field.id] = this.value || undefined;
93393                         });
93394
93395                     dispatch$1.call('change', this, tags, onInput);
93396                 };
93397             }
93398
93399
93400             function updateTags(tags) {
93401                 utilGetSetValue(wrap.selectAll('input'), function (field) {
93402                     return tags['addr:' + field.id] || '';
93403                 });
93404             }
93405
93406
93407             address.entity = function(val) {
93408                 if (!arguments.length) return _entity;
93409                 _entity = val;
93410                 return address;
93411             };
93412
93413
93414             address.tags = function(tags) {
93415                 if (_isInitialized) {
93416                     updateTags(tags);
93417                 } else {
93418                     dispatch$1.on('init', function () {
93419                         dispatch$1.on('init', null);
93420                         updateTags(tags);
93421                     });
93422                 }
93423             };
93424
93425
93426             address.focus = function() {
93427                 var node = wrap.selectAll('input').node();
93428                 if (node) node.focus();
93429             };
93430
93431
93432             return utilRebind(address, dispatch$1, 'on');
93433         }
93434
93435         function uiFieldCycleway(field, context) {
93436             var dispatch$1 = dispatch('change');
93437             var items = d3_select(null);
93438             var wrap = d3_select(null);
93439
93440             function cycleway(selection) {
93441
93442                 function stripcolon(s) {
93443                     return s.replace(':', '');
93444                 }
93445
93446
93447                 wrap = selection.selectAll('.form-field-input-wrap')
93448                     .data([0]);
93449
93450                 wrap = wrap.enter()
93451                     .append('div')
93452                     .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
93453                     .merge(wrap);
93454
93455
93456                 var div = wrap.selectAll('ul')
93457                     .data([0]);
93458
93459                 div = div.enter()
93460                     .append('ul')
93461                     .attr('class', 'rows')
93462                     .merge(div);
93463
93464                 var keys = ['cycleway:left', 'cycleway:right'];
93465
93466                 items = div.selectAll('li')
93467                     .data(keys);
93468
93469                 var enter = items.enter()
93470                     .append('li')
93471                     .attr('class', function(d) { return 'labeled-input preset-cycleway-' + stripcolon(d); });
93472
93473                 enter
93474                     .append('span')
93475                     .attr('class', 'label preset-label-cycleway')
93476                     .attr('for', function(d) { return 'preset-input-cycleway-' + stripcolon(d); })
93477                     .text(function(d) { return field.t('types.' + d); });
93478
93479                 enter
93480                     .append('div')
93481                     .attr('class', 'preset-input-cycleway-wrap')
93482                     .append('input')
93483                     .attr('type', 'text')
93484                     .attr('class', function(d) { return 'preset-input-cycleway preset-input-' + stripcolon(d); })
93485                     .call(utilNoAuto)
93486                     .each(function(d) {
93487                         d3_select(this)
93488                             .call(uiCombobox(context, 'cycleway-' + stripcolon(d))
93489                                 .data(cycleway.options(d))
93490                             );
93491                     });
93492
93493
93494                 // Update
93495                 wrap.selectAll('.preset-input-cycleway')
93496                     .on('change', change)
93497                     .on('blur', change);
93498             }
93499
93500
93501             function change() {
93502                 var left = utilGetSetValue(d3_select('.preset-input-cyclewayleft'));
93503                 var right = utilGetSetValue(d3_select('.preset-input-cyclewayright'));
93504                 var tag = {};
93505
93506                 if (left === 'none' || left === '') { left = undefined; }
93507                 if (right === 'none' || right === '') { right = undefined; }
93508
93509                 // Always set both left and right as changing one can affect the other
93510                 tag = {
93511                     cycleway: undefined,
93512                     'cycleway:left': left,
93513                     'cycleway:right': right
93514                 };
93515
93516                 // If the left and right tags match, use the cycleway tag to tag both
93517                 // sides the same way
93518                 if (left === right) {
93519                     tag = {
93520                         cycleway: left,
93521                         'cycleway:left': undefined,
93522                         'cycleway:right': undefined
93523                     };
93524                 }
93525
93526                 dispatch$1.call('change', this, tag);
93527             }
93528
93529
93530             cycleway.options = function() {
93531                 return Object.keys(field.strings.options).map(function(option) {
93532                     return {
93533                         title: field.t('options.' + option + '.description'),
93534                         value: option
93535                     };
93536                 });
93537             };
93538
93539
93540             cycleway.tags = function(tags) {
93541                 utilGetSetValue(items.selectAll('.preset-input-cycleway'), function(d) {
93542                         // If cycleway is set, always return that
93543                         if (tags.cycleway) {
93544                             return tags.cycleway;
93545                         }
93546                         return tags[d] || '';
93547                     })
93548                     .attr('placeholder', field.placeholder());
93549             };
93550
93551
93552             cycleway.focus = function() {
93553                 var node = wrap.selectAll('input').node();
93554                 if (node) node.focus();
93555             };
93556
93557
93558             return utilRebind(cycleway, dispatch$1, 'on');
93559         }
93560
93561         function uiFieldLanes(field, context) {
93562             var dispatch$1 = dispatch('change');
93563             var LANE_WIDTH = 40;
93564             var LANE_HEIGHT = 200;
93565             var _entityID;
93566
93567             function lanes(selection) {
93568                 var lanesData = context.entity(_entityID).lanes();
93569
93570                 if (!d3_select('.inspector-wrap.inspector-hidden').empty() || !selection.node().parentNode) {
93571                     selection.call(lanes.off);
93572                     return;
93573                 }
93574
93575                 var wrap = selection.selectAll('.form-field-input-wrap')
93576                     .data([0]);
93577
93578                 wrap = wrap.enter()
93579                     .append('div')
93580                     .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
93581                     .merge(wrap);
93582
93583                 var surface =  wrap.selectAll('.surface')
93584                     .data([0]);
93585
93586                 var d = utilGetDimensions(wrap);
93587                 var freeSpace = d[0] - lanesData.lanes.length * LANE_WIDTH * 1.5 + LANE_WIDTH * 0.5;
93588
93589                 surface = surface.enter()
93590                     .append('svg')
93591                     .attr('width', d[0])
93592                     .attr('height', 300)
93593                     .attr('class', 'surface')
93594                     .merge(surface);
93595
93596
93597                 var lanesSelection = surface.selectAll('.lanes')
93598                     .data([0]);
93599
93600                 lanesSelection = lanesSelection.enter()
93601                     .append('g')
93602                     .attr('class', 'lanes')
93603                     .merge(lanesSelection);
93604
93605                 lanesSelection
93606                     .attr('transform', function () {
93607                         return 'translate(' + (freeSpace / 2) + ', 0)';
93608                     });
93609
93610
93611                 var lane = lanesSelection.selectAll('.lane')
93612                    .data(lanesData.lanes);
93613
93614                 lane.exit()
93615                     .remove();
93616
93617                 var enter = lane.enter()
93618                     .append('g')
93619                     .attr('class', 'lane');
93620
93621                 enter
93622                     .append('g')
93623                     .append('rect')
93624                     .attr('y', 50)
93625                     .attr('width', LANE_WIDTH)
93626                     .attr('height', LANE_HEIGHT);
93627
93628                 enter
93629                     .append('g')
93630                     .attr('class', 'forward')
93631                     .append('text')
93632                     .attr('y', 40)
93633                     .attr('x', 14)
93634                     .text('▲');
93635
93636                 enter
93637                     .append('g')
93638                     .attr('class', 'bothways')
93639                     .append('text')
93640                     .attr('y', 40)
93641                     .attr('x', 14)
93642                     .text('▲▼');
93643
93644                 enter
93645                     .append('g')
93646                     .attr('class', 'backward')
93647                     .append('text')
93648                     .attr('y', 40)
93649                     .attr('x', 14)
93650                     .text('▼');
93651
93652
93653                 lane = lane
93654                     .merge(enter);
93655
93656                 lane
93657                     .attr('transform', function(d) {
93658                         return 'translate(' + (LANE_WIDTH * d.index * 1.5) + ', 0)';
93659                     });
93660
93661                 lane.select('.forward')
93662                     .style('visibility', function(d) {
93663                         return d.direction === 'forward' ? 'visible' : 'hidden';
93664                     });
93665
93666                 lane.select('.bothways')
93667                     .style('visibility', function(d) {
93668                         return d.direction === 'bothways' ? 'visible' : 'hidden';
93669                     });
93670
93671                 lane.select('.backward')
93672                     .style('visibility', function(d) {
93673                         return d.direction === 'backward' ? 'visible' : 'hidden';
93674                     });
93675             }
93676
93677
93678             lanes.entity = function(val) {
93679                 if (!_entityID || _entityID !== val.id) {
93680                     _entityID = val.id;
93681                 }
93682             };
93683
93684             lanes.tags = function() {};
93685             lanes.focus = function() {};
93686             lanes.off = function() {};
93687
93688             return utilRebind(lanes, dispatch$1, 'on');
93689         }
93690
93691         function uiFieldLocalized(field, context) {
93692             var dispatch$1 = dispatch('change', 'input');
93693             var wikipedia = services$1.wikipedia;
93694             var input = d3_select(null);
93695             var localizedInputs = d3_select(null);
93696
93697             var allSuggestions = context.presets().collection.filter(function(p) {
93698                 return p.suggestion === true;
93699             });
93700
93701             // reuse these combos
93702             var langCombo = uiCombobox(context, 'localized-lang')
93703                 .fetcher(fetchLanguages)
93704                 .minItems(0);
93705
93706             var brandCombo = uiCombobox(context, 'localized-brand')
93707                 .canAutocomplete(false)
93708                 .minItems(1);
93709
93710             var _selection = d3_select(null);
93711             var _multilingual = [];
93712             var _buttonTip = tooltip()
93713                 .title(t('translate.translate'))
93714                 .placement('left');
93715             var _wikiTitles;
93716             var _entity;
93717
93718
93719             function calcLocked() {
93720                 if (!_entity) {    // the original entity
93721                     field.locked(false);
93722                     return;
93723                 }
93724
93725                 var latest = context.hasEntity(_entity.id);
93726                 if (!latest) {    // get current entity, possibly edited
93727                     field.locked(false);
93728                     return;
93729                 }
93730
93731                 var hasOriginalName = (latest.tags.name && latest.tags.name === _entity.tags.name);
93732                 var hasWikidata = latest.tags.wikidata;
93733                 var preset = context.presets().match(latest, context.graph());
93734                 var isSuggestion = preset && preset.suggestion;
93735                 var showsBrand = preset && preset.fields
93736                     .filter(function(d) { return d.id === 'brand'; }).length;
93737
93738                 var isLocked = !!(field.id === 'name' && hasOriginalName &&
93739                     (hasWikidata || (isSuggestion && !showsBrand)));
93740
93741                 field.locked(isLocked);
93742             }
93743
93744
93745             function calcMultilingual(tags) {
93746                 _multilingual = [];
93747                 for (var k in tags) {
93748                     var m = k.match(/^(.*):([a-zA-Z_-]+)$/);
93749                     if (m && m[1] === field.key && m[2]) {
93750                         _multilingual.push({ lang: m[2], value: tags[k] });
93751                     }
93752                 }
93753                 _multilingual.reverse();
93754             }
93755
93756
93757             function localized(selection) {
93758                 _selection = selection;
93759                 calcLocked();
93760                 var isLocked = field.locked();
93761                 var entity = _entity && context.hasEntity(_entity.id);  // get latest
93762                 var preset = entity && context.presets().match(entity, context.graph());
93763
93764                 var wrap = selection.selectAll('.form-field-input-wrap')
93765                     .data([0]);
93766
93767                 // enter/update
93768                 wrap = wrap.enter()
93769                     .append('div')
93770                     .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
93771                     .merge(wrap);
93772
93773                 input = wrap.selectAll('.localized-main')
93774                     .data([0]);
93775
93776                 // enter/update
93777                 input = input.enter()
93778                     .append('input')
93779                     .attr('type', 'text')
93780                     .attr('id', 'preset-input-' + field.safeid)
93781                     .attr('class', 'localized-main')
93782                     .attr('placeholder', field.placeholder())
93783                     .call(utilNoAuto)
93784                     .merge(input);
93785
93786                 if (preset && field.id === 'name') {
93787                     var pTag = preset.id.split('/', 2);
93788                     var pKey = pTag[0];
93789                     var pValue = pTag[1];
93790
93791                     if (!preset.suggestion) {
93792                         // Not a suggestion preset - Add a suggestions dropdown if it makes sense to.
93793                         // This code attempts to determine if the matched preset is the
93794                         // kind of preset that even can benefit from name suggestions..
93795                         // - true = shops, cafes, hotels, etc. (also generic and fallback presets)
93796                         // - false = churches, parks, hospitals, etc. (things not in the index)
93797                         var isFallback = preset.isFallback();
93798                         var goodSuggestions = allSuggestions.filter(function(s) {
93799                             if (isFallback) return true;
93800                             var sTag = s.id.split('/', 2);
93801                             var sKey = sTag[0];
93802                             var sValue = sTag[1];
93803                             return pKey === sKey && (!pValue || pValue === sValue);
93804                         });
93805
93806                         // Show the suggestions.. If the user picks one, change the tags..
93807                         if (allSuggestions.length && goodSuggestions.length) {
93808                             input
93809                                 .on('blur.localized', checkBrandOnBlur)
93810                                 .call(brandCombo
93811                                     .fetcher(fetchBrandNames(preset, allSuggestions))
93812                                     .on('accept', acceptBrand)
93813                                     .on('cancel', cancelBrand)
93814                                 );
93815                         }
93816                     }
93817                 }
93818
93819                 input
93820                     .classed('disabled', !!isLocked)
93821                     .attr('readonly', isLocked || null)
93822                     .on('input', change(true))
93823                     .on('blur', change())
93824                     .on('change', change());
93825
93826
93827                 var translateButton = wrap.selectAll('.localized-add')
93828                     .data([0]);
93829
93830                 translateButton = translateButton.enter()
93831                     .append('button')
93832                     .attr('class', 'localized-add form-field-button')
93833                     .attr('tabindex', -1)
93834                     .call(svgIcon('#iD-icon-plus'))
93835                     .merge(translateButton);
93836
93837                 translateButton
93838                     .classed('disabled', !!isLocked)
93839                     .call(isLocked ? _buttonTip.destroy : _buttonTip)
93840                     .on('click', addNew);
93841
93842
93843                 if (entity && !_multilingual.length) {
93844                     calcMultilingual(entity.tags);
93845                 }
93846
93847                 localizedInputs = selection.selectAll('.localized-multilingual')
93848                     .data([0]);
93849
93850                 localizedInputs = localizedInputs.enter()
93851                     .append('div')
93852                     .attr('class', 'localized-multilingual')
93853                     .merge(localizedInputs);
93854
93855                 localizedInputs
93856                     .call(renderMultilingual);
93857
93858                 localizedInputs.selectAll('button, input')
93859                     .classed('disabled', !!isLocked)
93860                     .attr('readonly', isLocked || null);
93861
93862
93863
93864                 // We are not guaranteed to get an `accept` or `cancel` when blurring the field.
93865                 // (This can happen if the user actives the combo, arrows down, and then clicks off to blur)
93866                 // So compare the current field value against the suggestions one last time.
93867                 function checkBrandOnBlur() {
93868                     var latest = context.hasEntity(_entity.id);
93869                     if (!latest) return;   // deleting the entity blurred the field?
93870
93871                     var preset = context.presets().match(latest, context.graph());
93872                     if (preset && preset.suggestion) return;   // already accepted
93873
93874                     // note: here we are testing against "decorated" names, i.e. 'Starbucks – Cafe'
93875                     var name = utilGetSetValue(input).trim();
93876                     var matched = allSuggestions.filter(function(s) { return name === s.name(); });
93877
93878                     if (matched.length === 1) {
93879                         acceptBrand({ suggestion: matched[0] });
93880                     } else {
93881                         cancelBrand();
93882                     }
93883                 }
93884
93885
93886                 function acceptBrand(d) {
93887                     if (!d) {
93888                         cancelBrand();
93889                         return;
93890                     }
93891
93892                     var entity = context.entity(_entity.id);  // get latest
93893                     var tags = entity.tags;
93894                     var geometry = entity.geometry(context.graph());
93895                     var removed = preset.unsetTags(tags, geometry);
93896                     for (var k in tags) {
93897                         tags[k] = removed[k];  // set removed tags to `undefined`
93898                     }
93899                     tags = d.suggestion.setTags(tags, geometry);
93900                     utilGetSetValue(input, tags.name);
93901                     dispatch$1.call('change', this, tags);
93902                 }
93903
93904
93905                 // user hit escape, clean whatever preset name appears after the last ' – '
93906                 function cancelBrand() {
93907                     var name = utilGetSetValue(input);
93908                     var clean = cleanName(name);
93909                     if (clean !== name) {
93910                         utilGetSetValue(input, clean);
93911                         dispatch$1.call('change', this, { name: clean });
93912                     }
93913                 }
93914
93915                 // Remove whatever is after the last ' – '
93916                 // NOTE: split/join on en-dash, not a hypen (to avoid conflict with fr - nl names in Brussels etc)
93917                 function cleanName(name) {
93918                     var parts = name.split(' – ');
93919                     if (parts.length > 1) {
93920                         parts.pop();
93921                         name = parts.join(' – ');
93922                     }
93923                     return name;
93924                 }
93925
93926
93927                 function fetchBrandNames(preset, suggestions) {
93928                     var pTag = preset.id.split('/', 2);
93929                     var pKey = pTag[0];
93930                     var pValue = pTag[1];
93931
93932                     return function(value, callback) {
93933                         var results = [];
93934                         if (value && value.length > 2) {
93935                             for (var i = 0; i < suggestions.length; i++) {
93936                                 var s = suggestions[i];
93937                                 var sTag = s.id.split('/', 2);
93938                                 var sKey = sTag[0];
93939                                 var sValue = sTag[1];
93940                                 var name = s.name();
93941                                 var dist = utilEditDistance(value, name.substring(0, value.length));
93942                                 var matchesPreset = (pKey === sKey && (!pValue || pValue === sValue));
93943
93944                                 if (dist < 1 || (matchesPreset && dist < 3)) {
93945                                     var obj = {
93946                                         title: name,
93947                                         value: name,
93948                                         suggestion: s,
93949                                         dist: dist + (matchesPreset ? 0 : 1)  // penalize if not matched preset
93950                                     };
93951                                     results.push(obj);
93952                                 }
93953                             }
93954                             results.sort(function(a, b) { return a.dist - b.dist; });
93955                         }
93956                         results = results.slice(0, 10);
93957                         callback(results);
93958                     };
93959                 }
93960
93961
93962                 function addNew() {
93963                     event.preventDefault();
93964                     if (field.locked()) return;
93965
93966                     var defaultLang = utilDetect().locale.toLowerCase().split('-')[0];
93967                     var langExists = _multilingual.find(function(datum) { return datum.lang === defaultLang; });
93968                     var isLangEn = defaultLang.indexOf('en') > -1;
93969                     if (isLangEn || langExists) {
93970                         defaultLang = '';
93971                     }
93972                     _multilingual.push({ lang: defaultLang, value: '' });
93973
93974                     localizedInputs
93975                         .call(renderMultilingual);
93976                 }
93977
93978
93979                 function change(onInput) {
93980                     return function() {
93981                         if (field.locked()) {
93982                             event.preventDefault();
93983                             return;
93984                         }
93985                         var t = {};
93986                         t[field.key] = utilGetSetValue(d3_select(this)) || undefined;
93987                         dispatch$1.call('change', this, t, onInput);
93988                     };
93989                 }
93990             }
93991
93992
93993             function key(lang) {
93994                 return field.key + ':' + lang;
93995             }
93996
93997
93998             function changeLang(d) {
93999                 var lang = utilGetSetValue(d3_select(this));
94000                 var t = {};
94001                 var language = wikipedia$2.find(function(d) {
94002                     return d[0].toLowerCase() === lang.toLowerCase() ||
94003                         d[1].toLowerCase() === lang.toLowerCase();
94004                 });
94005
94006                 if (language) lang = language[2];
94007
94008                 if (d.lang && d.lang !== lang) {
94009                     t[key(d.lang)] = undefined;
94010                 }
94011
94012                 var value = utilGetSetValue(d3_select(this.parentNode)
94013                     .selectAll('.localized-value'));
94014
94015                 if (lang && value) {
94016                     t[key(lang)] = value;
94017                 } else if (lang && _wikiTitles && _wikiTitles[d.lang]) {
94018                     t[key(lang)] = _wikiTitles[d.lang];
94019                 }
94020
94021                 d.lang = lang;
94022                 dispatch$1.call('change', this, t);
94023             }
94024
94025
94026             function changeValue(d) {
94027                 if (!d.lang) return;
94028                 var t = {};
94029                 t[key(d.lang)] = utilGetSetValue(d3_select(this)) || undefined;
94030                 dispatch$1.call('change', this, t);
94031             }
94032
94033
94034             function fetchLanguages(value, cb) {
94035                 var v = value.toLowerCase();
94036
94037                 cb(wikipedia$2.filter(function(d) {
94038                     return d[0].toLowerCase().indexOf(v) >= 0 ||
94039                     d[1].toLowerCase().indexOf(v) >= 0 ||
94040                     d[2].toLowerCase().indexOf(v) >= 0;
94041                 }).map(function(d) {
94042                     return { value: d[1] };
94043                 }));
94044             }
94045
94046
94047             function renderMultilingual(selection) {
94048                 var wraps = selection.selectAll('div.entry')
94049                     .data(_multilingual, function(d) { return d.lang; });
94050
94051                 wraps.exit()
94052                     .transition()
94053                     .duration(200)
94054                     .style('max-height', '0px')
94055                     .style('opacity', '0')
94056                     .style('top', '-10px')
94057                     .remove();
94058
94059                 var innerWrap = wraps.enter()
94060                     .insert('div', ':first-child');
94061
94062                 innerWrap
94063                     .attr('class', 'entry')
94064                     .each(function() {
94065                         var wrap = d3_select(this);
94066
94067                         var label = wrap
94068                             .append('label')
94069                             .attr('class', 'field-label');
94070
94071                         var text = label
94072                             .append('span')
94073                             .attr('class', 'label-text');
94074
94075                         text
94076                             .append('span')
94077                             .attr('class', 'label-textvalue')
94078                             .text(t('translate.localized_translation_label'));
94079
94080                         text
94081                             .append('span')
94082                             .attr('class', 'label-textannotation');
94083
94084                         label
94085                             .append('button')
94086                             .attr('class', 'remove-icon-multilingual')
94087                             .on('click', function(d){
94088                                 if (field.locked()) return;
94089                                 event.preventDefault();
94090                                 var t = {};
94091                                 t[key(d.lang)] = undefined;
94092                                 dispatch$1.call('change', this, t);
94093                                 d3_select(this.parentNode.parentNode.parentNode)
94094                                     .style('top', '0')
94095                                     .style('max-height', '240px')
94096                                     .transition()
94097                                     .style('opacity', '0')
94098                                     .style('max-height', '0px')
94099                                     .remove();
94100                             })
94101                             .call(svgIcon('#iD-operation-delete'));
94102
94103                         wrap
94104                             .append('input')
94105                             .attr('class', 'localized-lang')
94106                             .attr('type', 'text')
94107                             .attr('placeholder', t('translate.localized_translation_language'))
94108                             .on('blur', changeLang)
94109                             .on('change', changeLang)
94110                             .call(langCombo);
94111
94112                         wrap
94113                             .append('input')
94114                             .attr('type', 'text')
94115                             .attr('placeholder', t('translate.localized_translation_name'))
94116                             .attr('class', 'localized-value')
94117                             .on('blur', changeValue)
94118                             .on('change', changeValue);
94119                     });
94120
94121                 innerWrap
94122                     .style('margin-top', '0px')
94123                     .style('max-height', '0px')
94124                     .style('opacity', '0')
94125                     .transition()
94126                     .duration(200)
94127                     .style('margin-top', '10px')
94128                     .style('max-height', '240px')
94129                     .style('opacity', '1')
94130                     .on('end', function() {
94131                         d3_select(this)
94132                             .style('max-height', '')
94133                             .style('overflow', 'visible');
94134                     });
94135
94136
94137                 var entry = selection.selectAll('.entry');
94138
94139                 utilGetSetValue(entry.select('.localized-lang'), function(d) {
94140                     var lang = wikipedia$2.find(function(lang) { return lang[2] === d.lang; });
94141                     return lang ? lang[1] : d.lang;
94142                 });
94143
94144                 utilGetSetValue(entry.select('.localized-value'),
94145                     function(d) { return d.value; });
94146             }
94147
94148
94149             localized.tags = function(tags) {
94150                 // Fetch translations from wikipedia
94151                 if (tags.wikipedia && !_wikiTitles) {
94152                     _wikiTitles = {};
94153                     var wm = tags.wikipedia.match(/([^:]+):(.+)/);
94154                     if (wm && wm[0] && wm[1]) {
94155                         wikipedia.translations(wm[1], wm[2], function(err, d) {
94156                             if (err || !d) return;
94157                             _wikiTitles = d;
94158                         });
94159                     }
94160                 }
94161
94162                 utilGetSetValue(input, tags[field.key] || '');
94163
94164                 calcMultilingual(tags);
94165
94166                 _selection
94167                     .call(localized);
94168             };
94169
94170
94171             localized.focus = function() {
94172                 input.node().focus();
94173             };
94174
94175
94176             localized.entity = function(val) {
94177                 if (!arguments.length) return _entity;
94178                 _entity = val;
94179                 _multilingual = [];
94180                 return localized;
94181             };
94182
94183             return utilRebind(localized, dispatch$1, 'on');
94184         }
94185
94186         function uiFieldMaxspeed(field, context) {
94187             var dispatch$1 = dispatch('change');
94188             var unitInput = d3_select(null);
94189             var input = d3_select(null);
94190             var _entity;
94191             var _isImperial;
94192
94193             var speedCombo = uiCombobox(context, 'maxspeed');
94194             var unitCombo = uiCombobox(context, 'maxspeed-unit')
94195                     .data(['km/h', 'mph'].map(comboValues));
94196
94197             var metricValues = [20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120];
94198             var imperialValues = [5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80];
94199
94200
94201             function maxspeed(selection) {
94202
94203                 var wrap = selection.selectAll('.form-field-input-wrap')
94204                     .data([0]);
94205
94206                 wrap = wrap.enter()
94207                     .append('div')
94208                     .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
94209                     .merge(wrap);
94210
94211
94212                 input = wrap.selectAll('#preset-input-' + field.safeid)
94213                     .data([0]);
94214
94215                 input = input.enter()
94216                     .append('input')
94217                     .attr('type', 'text')
94218                     .attr('id', 'preset-input-' + field.safeid)
94219                     .attr('placeholder', field.placeholder())
94220                     .call(utilNoAuto)
94221                     .call(speedCombo)
94222                     .merge(input);
94223
94224                 input
94225                     .on('change', change)
94226                     .on('blur', change);
94227
94228                 var loc;
94229                 if (_entity.type === 'node') {
94230                     loc = _entity.loc;
94231                 } else {
94232                     var childNodes = context.graph().childNodes(context.entity(_entity.id));
94233                     loc = childNodes[~~(childNodes.length/2)].loc;
94234                 }
94235
94236                 _isImperial = dataImperial.features.some(function(f) {
94237                     return f.geometry.coordinates.some(function(d) {
94238                         return geoPointInPolygon(loc, d);
94239                     });
94240                 });
94241
94242                 unitInput = wrap.selectAll('input.maxspeed-unit')
94243                     .data([0]);
94244
94245                 unitInput = unitInput.enter()
94246                     .append('input')
94247                     .attr('type', 'text')
94248                     .attr('class', 'maxspeed-unit')
94249                     .call(unitCombo)
94250                     .merge(unitInput);
94251
94252                 unitInput
94253                     .on('blur', changeUnits)
94254                     .on('change', changeUnits);
94255
94256
94257                 function changeUnits() {
94258                     _isImperial = utilGetSetValue(unitInput) === 'mph';
94259                     utilGetSetValue(unitInput, _isImperial ? 'mph' : 'km/h');
94260                     setSuggestions();
94261                     change();
94262                 }
94263             }
94264
94265
94266             function setSuggestions() {
94267                 speedCombo.data((_isImperial ? imperialValues : metricValues).map(comboValues));
94268                 utilGetSetValue(unitInput, _isImperial ? 'mph' : 'km/h');
94269             }
94270
94271
94272             function comboValues(d) {
94273                 return {
94274                     value: d.toString(),
94275                     title: d.toString()
94276                 };
94277             }
94278
94279
94280             function change() {
94281                 var tag = {};
94282                 var value = utilGetSetValue(input);
94283
94284                 if (!value) {
94285                     tag[field.key] = undefined;
94286                 } else if (isNaN(value) || !_isImperial) {
94287                     tag[field.key] = value;
94288                 } else {
94289                     tag[field.key] = value + ' mph';
94290                 }
94291
94292                 dispatch$1.call('change', this, tag);
94293             }
94294
94295
94296             maxspeed.tags = function(tags) {
94297                 var value = tags[field.key];
94298
94299                 if (value && value.indexOf('mph') >= 0) {
94300                     value = parseInt(value, 10);
94301                     _isImperial = true;
94302                 } else if (value) {
94303                     _isImperial = false;
94304                 }
94305
94306                 setSuggestions();
94307                 utilGetSetValue(input, value || '');
94308             };
94309
94310
94311             maxspeed.focus = function() {
94312                 input.node().focus();
94313             };
94314
94315
94316             maxspeed.entity = function(val) {
94317                 _entity = val;
94318             };
94319
94320
94321             return utilRebind(maxspeed, dispatch$1, 'on');
94322         }
94323
94324         function uiFieldRadio(field, context) {
94325             var dispatch$1 = dispatch('change');
94326             var placeholder = d3_select(null);
94327             var wrap = d3_select(null);
94328             var labels = d3_select(null);
94329             var radios = d3_select(null);
94330             var radioData = (field.options || field.keys).slice();  // shallow copy
94331             var typeField;
94332             var layerField;
94333             var _oldType = {};
94334             var _entity;
94335
94336
94337             function selectedKey() {
94338                 var node = wrap.selectAll('.form-field-input-radio label.active input');
94339                 return !node.empty() && node.datum();
94340             }
94341
94342
94343             function radio(selection) {
94344                 selection.classed('preset-radio', true);
94345
94346                 wrap = selection.selectAll('.form-field-input-wrap')
94347                     .data([0]);
94348
94349                 var enter = wrap.enter()
94350                     .append('div')
94351                     .attr('class', 'form-field-input-wrap form-field-input-radio');
94352
94353                 enter
94354                     .append('span')
94355                     .attr('class', 'placeholder');
94356
94357                 wrap = wrap
94358                     .merge(enter);
94359
94360
94361                 placeholder = wrap.selectAll('.placeholder');
94362
94363                 labels = wrap.selectAll('label')
94364                     .data(radioData);
94365
94366                 enter = labels.enter()
94367                     .append('label');
94368
94369                 enter
94370                     .append('input')
94371                     .attr('type', 'radio')
94372                     .attr('name', field.id)
94373                     .attr('value', function(d) { return field.t('options.' + d, { 'default': d }); })
94374                     .attr('checked', false);
94375
94376                 enter
94377                     .append('span')
94378                     .text(function(d) { return field.t('options.' + d, { 'default': d }); });
94379
94380                 labels = labels
94381                     .merge(enter);
94382
94383                 radios = labels.selectAll('input')
94384                     .on('change', changeRadio);
94385
94386             }
94387
94388
94389             function structureExtras(selection, tags) {
94390                 var selected = selectedKey();
94391                 var type = context.presets().field(selected);
94392                 var layer = context.presets().field('layer');
94393                 var showLayer = (selected === 'bridge' || selected === 'tunnel');
94394
94395
94396                 var extrasWrap = selection.selectAll('.structure-extras-wrap')
94397                     .data(selected ? [0] : []);
94398
94399                 extrasWrap.exit()
94400                     .remove();
94401
94402                 extrasWrap = extrasWrap.enter()
94403                     .append('div')
94404                     .attr('class', 'structure-extras-wrap')
94405                     .merge(extrasWrap);
94406
94407                 var list = extrasWrap.selectAll('ul')
94408                     .data([0]);
94409
94410                 list = list.enter()
94411                     .append('ul')
94412                     .attr('class', 'rows')
94413                     .merge(list);
94414
94415
94416                 // Type
94417                 if (type) {
94418                     if (!typeField || typeField.id !== selected) {
94419                         typeField = uiField(context, type, _entity, { wrap: false })
94420                             .on('change', changeType);
94421                     }
94422                     typeField.tags(tags);
94423                 } else {
94424                     typeField = null;
94425                 }
94426
94427                 var typeItem = list.selectAll('.structure-type-item')
94428                     .data(typeField ? [typeField] : [], function(d) { return d.id; });
94429
94430                 // Exit
94431                 typeItem.exit()
94432                     .remove();
94433
94434                 // Enter
94435                 var typeEnter = typeItem.enter()
94436                     .insert('li', ':first-child')
94437                     .attr('class', 'labeled-input structure-type-item');
94438
94439                 typeEnter
94440                     .append('span')
94441                     .attr('class', 'label structure-label-type')
94442                     .attr('for', 'preset-input-' + selected)
94443                     .text(t('inspector.radio.structure.type'));
94444
94445                 typeEnter
94446                     .append('div')
94447                     .attr('class', 'structure-input-type-wrap');
94448
94449                 // Update
94450                 typeItem = typeItem
94451                     .merge(typeEnter);
94452
94453                 if (typeField) {
94454                     typeItem.selectAll('.structure-input-type-wrap')
94455                         .call(typeField.render);
94456                 }
94457
94458
94459                 // Layer
94460                 if (layer && showLayer) {
94461                     if (!layerField) {
94462                         layerField = uiField(context, layer, _entity, { wrap: false })
94463                             .on('change', changeLayer);
94464                     }
94465                     layerField.tags(tags);
94466                     field.keys = utilArrayUnion(field.keys, ['layer']);
94467                 } else {
94468                     layerField = null;
94469                     field.keys = field.keys.filter(function(k) { return k !== 'layer'; });
94470                 }
94471
94472                 var layerItem = list.selectAll('.structure-layer-item')
94473                     .data(layerField ? [layerField] : []);
94474
94475                 // Exit
94476                 layerItem.exit()
94477                     .remove();
94478
94479                 // Enter
94480                 var layerEnter = layerItem.enter()
94481                     .append('li')
94482                     .attr('class', 'labeled-input structure-layer-item');
94483
94484                 layerEnter
94485                     .append('span')
94486                     .attr('class', 'label structure-label-layer')
94487                     .attr('for', 'preset-input-layer')
94488                     .text(t('inspector.radio.structure.layer'));
94489
94490                 layerEnter
94491                     .append('div')
94492                     .attr('class', 'structure-input-layer-wrap');
94493
94494                 // Update
94495                 layerItem = layerItem
94496                     .merge(layerEnter);
94497
94498                 if (layerField) {
94499                     layerItem.selectAll('.structure-input-layer-wrap')
94500                         .call(layerField.render);
94501                 }
94502             }
94503
94504
94505             function changeType(t, onInput) {
94506                 var key = selectedKey();
94507                 if (!key) return;
94508
94509                 var val = t[key];
94510                 if (val !== 'no') {
94511                     _oldType[key] = val;
94512                 }
94513
94514                 if (field.type === 'structureRadio') {
94515                     // remove layer if it should not be set
94516                     if (val === 'no' ||
94517                         (key !== 'bridge' && key !== 'tunnel') ||
94518                         (key === 'tunnel' && val === 'building_passage')) {
94519                         t.layer = undefined;
94520                     }
94521                     // add layer if it should be set
94522                     if (t.layer === undefined) {
94523                         if (key === 'bridge' && val !== 'no') {
94524                             t.layer = '1';
94525                         }
94526                         if (key === 'tunnel' && val !== 'no' && val !== 'building_passage') {
94527                             t.layer = '-1';
94528                         }
94529                     }
94530                  }
94531
94532                 dispatch$1.call('change', this, t, onInput);
94533             }
94534
94535
94536             function changeLayer(t, onInput) {
94537                 if (t.layer === '0') {
94538                     t.layer = undefined;
94539                 }
94540                 dispatch$1.call('change', this, t, onInput);
94541             }
94542
94543
94544             function changeRadio() {
94545                 var t = {};
94546                 var activeKey;
94547
94548                 if (field.key) {
94549                     t[field.key] = undefined;
94550                 }
94551
94552                 radios.each(function(d) {
94553                     var active = d3_select(this).property('checked');
94554                     if (active) activeKey = d;
94555
94556                     if (field.key) {
94557                         if (active) t[field.key] = d;
94558                     } else {
94559                         var val = _oldType[activeKey] || 'yes';
94560                         t[d] = active ? val : undefined;
94561                     }
94562                 });
94563
94564                 if (field.type === 'structureRadio') {
94565                     if (activeKey === 'bridge') {
94566                         t.layer = '1';
94567                     } else if (activeKey === 'tunnel' && t.tunnel !== 'building_passage') {
94568                         t.layer = '-1';
94569                     } else {
94570                         t.layer = undefined;
94571                     }
94572                 }
94573
94574                 dispatch$1.call('change', this, t);
94575             }
94576
94577
94578             radio.tags = function(tags) {
94579                 function checked(d) {
94580                     if (field.key) {
94581                         return tags[field.key] === d;
94582                     } else {
94583                         return !!(tags[d] && tags[d].toLowerCase() !== 'no');
94584                     }
94585                 }
94586
94587                 labels.classed('active', checked);
94588                 radios.property('checked', checked);
94589
94590                 var selection = radios.filter(function() { return this.checked; });
94591
94592                 if (selection.empty()) {
94593                     placeholder.text(t('inspector.none'));
94594                 } else {
94595                     placeholder.text(selection.attr('value'));
94596                     _oldType[selection.datum()] = tags[selection.datum()];
94597                 }
94598
94599                 if (field.type === 'structureRadio') {
94600                     // For waterways without a tunnel tag, set 'culvert' as
94601                     // the _oldType to default to if the user picks 'tunnel'
94602                     if (!!tags.waterway && !_oldType.tunnel) {
94603                         _oldType.tunnel = 'culvert';
94604                     }
94605
94606                     wrap.call(structureExtras, tags);
94607                 }
94608             };
94609
94610
94611             radio.focus = function() {
94612                 radios.node().focus();
94613             };
94614
94615
94616             radio.entity = function(val) {
94617                 if (!arguments.length) return _entity;
94618                 _entity = val;
94619                 _oldType = {};
94620                 return radio;
94621             };
94622
94623
94624             return utilRebind(radio, dispatch$1, 'on');
94625         }
94626
94627         function uiFieldRestrictions(field, context) {
94628             var dispatch$1 = dispatch('change');
94629             var breathe = behaviorBreathe();
94630             var storedViaWay = context.storage('turn-restriction-via-way');
94631             var storedDistance = context.storage('turn-restriction-distance');
94632
94633             var _maxViaWay = storedViaWay !== null ? (+storedViaWay) : 1;
94634             var _maxDistance = storedDistance ? (+storedDistance) : 30;
94635             var _initialized = false;
94636             var _parent = d3_select(null);       // the entire field
94637             var _container = d3_select(null);    // just the map
94638             var _oldTurns;
94639             var _graph;
94640             var _vertexID;
94641             var _intersection;
94642             var _fromWayID;
94643
94644             var _lastXPos;
94645
94646
94647             function restrictions(selection) {
94648                 _parent = selection;
94649
94650                 // try to reuse the intersection, but always rebuild it if the graph has changed
94651                 if (_vertexID && (context.graph() !== _graph || !_intersection)) {
94652                     _graph = context.graph();
94653                     _intersection = osmIntersection(_graph, _vertexID, _maxDistance);
94654                 }
94655
94656                 // It's possible for there to be no actual intersection here.
94657                 // for example, a vertex of two `highway=path`
94658                 // In this case, hide the field.
94659                 var isOK = (
94660                     _intersection &&
94661                     _intersection.vertices.length &&           // has vertices
94662                     _intersection.vertices                     // has the vertex that the user selected
94663                         .filter(function(vertex) { return vertex.id === _vertexID; }).length &&
94664                     _intersection.ways.length > 2 &&           // has more than 2 ways
94665                     _intersection.ways                         // has more than 1 TO way
94666                         .filter(function(way) { return way.__to; }).length > 1
94667                 );
94668
94669                 // Also hide in the case where
94670                 d3_select(selection.node().parentNode).classed('hide', !isOK);
94671
94672                 // if form field is hidden or has detached from dom, clean up.
94673                 if (!isOK ||
94674                     !d3_select('.inspector-wrap.inspector-hidden').empty() ||
94675                     !selection.node().parentNode ||
94676                     !selection.node().parentNode.parentNode) {
94677                     selection.call(restrictions.off);
94678                     return;
94679                 }
94680
94681
94682                 var wrap = selection.selectAll('.form-field-input-wrap')
94683                     .data([0]);
94684
94685                 wrap = wrap.enter()
94686                     .append('div')
94687                     .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
94688                     .merge(wrap);
94689
94690                 var container = wrap.selectAll('.restriction-container')
94691                     .data([0]);
94692
94693                 // enter
94694                 var containerEnter = container.enter()
94695                     .append('div')
94696                     .attr('class', 'restriction-container');
94697
94698                 containerEnter
94699                     .append('div')
94700                     .attr('class', 'restriction-help');
94701
94702                 // update
94703                 _container = containerEnter
94704                     .merge(container)
94705                     .call(renderViewer);
94706
94707                 var controls = wrap.selectAll('.restriction-controls')
94708                     .data([0]);
94709
94710                 // enter/update
94711                 controls.enter()
94712                     .append('div')
94713                     .attr('class', 'restriction-controls-container')
94714                     .append('div')
94715                     .attr('class', 'restriction-controls')
94716                     .merge(controls)
94717                     .call(renderControls);
94718             }
94719
94720
94721             function renderControls(selection) {
94722                 var distControl = selection.selectAll('.restriction-distance')
94723                     .data([0]);
94724
94725                 distControl.exit()
94726                     .remove();
94727
94728                 var distControlEnter = distControl.enter()
94729                     .append('div')
94730                     .attr('class', 'restriction-control restriction-distance');
94731
94732                 distControlEnter
94733                     .append('span')
94734                     .attr('class', 'restriction-control-label restriction-distance-label')
94735                     .text(t('restriction.controls.distance') + ':');
94736
94737                 distControlEnter
94738                     .append('input')
94739                     .attr('class', 'restriction-distance-input')
94740                     .attr('type', 'range')
94741                     .attr('min', '20')
94742                     .attr('max', '50')
94743                     .attr('step', '5');
94744
94745                 distControlEnter
94746                     .append('span')
94747                     .attr('class', 'restriction-distance-text');
94748
94749                 // update
94750                 selection.selectAll('.restriction-distance-input')
94751                     .property('value', _maxDistance)
94752                     .on('input', function() {
94753                         var val = d3_select(this).property('value');
94754                         _maxDistance = +val;
94755                         _intersection = null;
94756                         _container.selectAll('.layer-osm .layer-turns *').remove();
94757                         context.storage('turn-restriction-distance', _maxDistance);
94758                         _parent.call(restrictions);
94759                     });
94760
94761                 selection.selectAll('.restriction-distance-text')
94762                     .text(displayMaxDistance(_maxDistance));
94763
94764
94765                 var viaControl = selection.selectAll('.restriction-via-way')
94766                     .data([0]);
94767
94768                 viaControl.exit()
94769                     .remove();
94770
94771                 var viaControlEnter = viaControl.enter()
94772                     .append('div')
94773                     .attr('class', 'restriction-control restriction-via-way');
94774
94775                 viaControlEnter
94776                     .append('span')
94777                     .attr('class', 'restriction-control-label restriction-via-way-label')
94778                     .text(t('restriction.controls.via') + ':');
94779
94780                 viaControlEnter
94781                     .append('input')
94782                     .attr('class', 'restriction-via-way-input')
94783                     .attr('type', 'range')
94784                     .attr('min', '0')
94785                     .attr('max', '2')
94786                     .attr('step', '1');
94787
94788                 viaControlEnter
94789                     .append('span')
94790                     .attr('class', 'restriction-via-way-text');
94791
94792                 // update
94793                 selection.selectAll('.restriction-via-way-input')
94794                     .property('value', _maxViaWay)
94795                     .on('input', function() {
94796                         var val = d3_select(this).property('value');
94797                         _maxViaWay = +val;
94798                         _container.selectAll('.layer-osm .layer-turns *').remove();
94799                         context.storage('turn-restriction-via-way', _maxViaWay);
94800                         _parent.call(restrictions);
94801                     });
94802
94803                 selection.selectAll('.restriction-via-way-text')
94804                     .text(displayMaxVia(_maxViaWay));
94805             }
94806
94807
94808             function renderViewer(selection) {
94809                 if (!_intersection) return;
94810
94811                 var vgraph = _intersection.graph;
94812                 var filter = utilFunctor(true);
94813                 var projection = geoRawMercator();
94814
94815                 // Reflow warning: `utilGetDimensions` calls `getBoundingClientRect`
94816                 // Instead of asking the restriction-container for its dimensions,
94817                 //  we can ask the #sidebar, which can have its dimensions cached.
94818                 // width: calc as sidebar - padding
94819                 // height: hardcoded (from `80_app.css`)
94820                 // var d = utilGetDimensions(selection);
94821                 var sdims = utilGetDimensions(d3_select('#sidebar'));
94822                 var d = [ sdims[0] - 50, 370 ];
94823                 var c = geoVecScale(d, 0.5);
94824                 var z = 22;
94825
94826                 projection.scale(geoZoomToScale(z));
94827
94828                 // Calculate extent of all key vertices
94829                 var extent = geoExtent();
94830                 for (var i = 0; i < _intersection.vertices.length; i++) {
94831                     extent._extend(_intersection.vertices[i].extent());
94832                 }
94833
94834                 // If this is a large intersection, adjust zoom to fit extent
94835                 if (_intersection.vertices.length > 1) {
94836                     var padding = 180;   // in z22 pixels
94837                     var tl = projection([extent[0][0], extent[1][1]]);
94838                     var br = projection([extent[1][0], extent[0][1]]);
94839                     var hFactor = (br[0] - tl[0]) / (d[0] - padding);
94840                     var vFactor = (br[1] - tl[1]) / (d[1] - padding);
94841                     var hZoomDiff = Math.log(Math.abs(hFactor)) / Math.LN2;
94842                     var vZoomDiff = Math.log(Math.abs(vFactor)) / Math.LN2;
94843                     z = z - Math.max(hZoomDiff, vZoomDiff);
94844                     projection.scale(geoZoomToScale(z));
94845                 }
94846
94847                 var padTop = 35;   // reserve top space for hint text
94848                 var extentCenter = projection(extent.center());
94849                 extentCenter[1] = extentCenter[1] - padTop;
94850
94851                 projection
94852                     .translate(geoVecSubtract(c, extentCenter))
94853                     .clipExtent([[0, 0], d]);
94854
94855                 var drawLayers = svgLayers(projection, context).only(['osm','touch']).dimensions(d);
94856                 var drawVertices = svgVertices(projection, context);
94857                 var drawLines = svgLines(projection, context);
94858                 var drawTurns = svgTurns(projection, context);
94859
94860                 var firstTime = selection.selectAll('.surface').empty();
94861
94862                 selection
94863                     .call(drawLayers);
94864
94865                 var surface = selection.selectAll('.surface')
94866                     .classed('tr', true);
94867
94868                 if (firstTime) {
94869                     _initialized = true;
94870
94871                     surface
94872                         .call(breathe);
94873                 }
94874
94875                 // This can happen if we've lowered the detail while a FROM way
94876                 // is selected, and that way is no longer part of the intersection.
94877                 if (_fromWayID && !vgraph.hasEntity(_fromWayID)) {
94878                     _fromWayID = null;
94879                     _oldTurns = null;
94880                 }
94881
94882                 surface
94883                     .call(utilSetDimensions, d)
94884                     .call(drawVertices, vgraph, _intersection.vertices, filter, extent, z)
94885                     .call(drawLines, vgraph, _intersection.ways, filter)
94886                     .call(drawTurns, vgraph, _intersection.turns(_fromWayID, _maxViaWay));
94887
94888                 surface
94889                     .on('click.restrictions', click)
94890                     .on('mouseover.restrictions', mouseover);
94891
94892                 surface
94893                     .selectAll('.selected')
94894                     .classed('selected', false);
94895
94896                 surface
94897                     .selectAll('.related')
94898                     .classed('related', false);
94899
94900                 if (_fromWayID) {
94901                     var way = vgraph.entity(_fromWayID);
94902                     surface
94903                         .selectAll('.' + _fromWayID)
94904                         .classed('selected', true)
94905                         .classed('related', true);
94906                 }
94907
94908                 document.addEventListener('resizeWindow', function () {
94909                     utilSetDimensions(_container, null);
94910                     redraw(1);
94911                 }, false);
94912
94913                 updateHints(null);
94914
94915
94916                 function click() {
94917                     surface
94918                         .call(breathe.off)
94919                         .call(breathe);
94920
94921                     var datum = event.target.__data__;
94922                     var entity = datum && datum.properties && datum.properties.entity;
94923                     if (entity) {
94924                         datum = entity;
94925                     }
94926
94927                     if (datum instanceof osmWay && (datum.__from || datum.__via)) {
94928                         _fromWayID = datum.id;
94929                         _oldTurns = null;
94930                         redraw();
94931
94932                     } else if (datum instanceof osmTurn) {
94933                         var actions, extraActions, turns, i;
94934                         var restrictionType = osmInferRestriction(vgraph, datum, projection);
94935
94936                         if (datum.restrictionID && !datum.direct) {
94937                             return;
94938
94939                         } else if (datum.restrictionID && !datum.only) {    // NO -> ONLY
94940                             var seen = {};
94941                             var datumOnly = JSON.parse(JSON.stringify(datum));   // deep clone the datum
94942                             datumOnly.only = true;                               // but change this property
94943                             restrictionType = restrictionType.replace(/^no/, 'only');
94944
94945                             // Adding an ONLY restriction should destroy all other direct restrictions from the FROM towards the VIA.
94946                             // We will remember them in _oldTurns, and restore them if the user clicks again.
94947                             turns = _intersection.turns(_fromWayID, 2);
94948                             extraActions = [];
94949                             _oldTurns = [];
94950                             for (i = 0; i < turns.length; i++) {
94951                                 var turn = turns[i];
94952                                 if (seen[turn.restrictionID]) continue;  // avoid deleting the turn twice (#4968, #4928)
94953
94954                                 if (turn.direct && turn.path[1] === datum.path[1]) {
94955                                     seen[turns[i].restrictionID] = true;
94956                                     turn.restrictionType = osmInferRestriction(vgraph, turn, projection);
94957                                     _oldTurns.push(turn);
94958                                     extraActions.push(actionUnrestrictTurn(turn));
94959                                 }
94960                             }
94961
94962                             actions = _intersection.actions.concat(extraActions, [
94963                                 actionRestrictTurn(datumOnly, restrictionType),
94964                                 t('operations.restriction.annotation.create')
94965                             ]);
94966
94967                         } else if (datum.restrictionID) {   // ONLY -> Allowed
94968                             // Restore whatever restrictions we might have destroyed by cycling thru the ONLY state.
94969                             // This relies on the assumption that the intersection was already split up when we
94970                             // performed the previous action (NO -> ONLY), so the IDs in _oldTurns shouldn't have changed.
94971                             turns = _oldTurns || [];
94972                             extraActions = [];
94973                             for (i = 0; i < turns.length; i++) {
94974                                 if (turns[i].key !== datum.key) {
94975                                     extraActions.push(actionRestrictTurn(turns[i], turns[i].restrictionType));
94976                                 }
94977                             }
94978                             _oldTurns = null;
94979
94980                             actions = _intersection.actions.concat(extraActions, [
94981                                 actionUnrestrictTurn(datum),
94982                                 t('operations.restriction.annotation.delete')
94983                             ]);
94984
94985                         } else {    // Allowed -> NO
94986                             actions = _intersection.actions.concat([
94987                                 actionRestrictTurn(datum, restrictionType),
94988                                 t('operations.restriction.annotation.create')
94989                             ]);
94990                         }
94991
94992                         context.perform.apply(context, actions);
94993
94994                         // At this point the datum will be changed, but will have same key..
94995                         // Refresh it and update the help..
94996                         var s = surface.selectAll('.' + datum.key);
94997                         datum = s.empty() ? null : s.datum();
94998                         updateHints(datum);
94999
95000                     } else {
95001                         _fromWayID = null;
95002                         _oldTurns = null;
95003                         redraw();
95004                     }
95005                 }
95006
95007
95008                 function mouseover() {
95009                     var datum = event.target.__data__;
95010                     updateHints(datum);
95011                 }
95012
95013                 _lastXPos = _lastXPos || sdims[0];
95014
95015                 function redraw(minChange) {
95016                     var xPos = -1;
95017
95018                     if (minChange) {
95019                         xPos = utilGetDimensions(d3_select('#sidebar'))[0];
95020                     }
95021
95022                     if (!minChange || (minChange && Math.abs(xPos - _lastXPos) >= minChange)) {
95023                         if (context.hasEntity(_vertexID)) {
95024                             _lastXPos = xPos;
95025                             _container.call(renderViewer);
95026                         }
95027                     }
95028                 }
95029
95030
95031                 function highlightPathsFrom(wayID) {
95032                     surface.selectAll('.related')
95033                         .classed('related', false)
95034                         .classed('allow', false)
95035                         .classed('restrict', false)
95036                         .classed('only', false);
95037
95038                     surface.selectAll('.' + wayID)
95039                         .classed('related', true);
95040
95041                     if (wayID) {
95042                         var turns = _intersection.turns(wayID, _maxViaWay);
95043                         for (var i = 0; i < turns.length; i++) {
95044                             var turn = turns[i];
95045                             var ids = [turn.to.way];
95046                             var klass = (turn.no ? 'restrict' : (turn.only ? 'only' : 'allow'));
95047
95048                             if (turn.only || turns.length === 1) {
95049                                 if (turn.via.ways) {
95050                                     ids = ids.concat(turn.via.ways);
95051                                 }
95052                             } else if (turn.to.way === wayID) {
95053                                 continue;
95054                             }
95055
95056                             surface.selectAll(utilEntitySelector(ids))
95057                                 .classed('related', true)
95058                                 .classed('allow', (klass === 'allow'))
95059                                 .classed('restrict', (klass === 'restrict'))
95060                                 .classed('only', (klass === 'only'));
95061                         }
95062                     }
95063                 }
95064
95065
95066                 function updateHints(datum) {
95067                     var help = _container.selectAll('.restriction-help').html('');
95068
95069                     var placeholders = {};
95070                     ['from', 'via', 'to'].forEach(function(k) {
95071                         placeholders[k] = '<span class="qualifier">' + t('restriction.help.' + k) + '</span>';
95072                     });
95073
95074                     var entity = datum && datum.properties && datum.properties.entity;
95075                     if (entity) {
95076                         datum = entity;
95077                     }
95078
95079                     if (_fromWayID) {
95080                         way = vgraph.entity(_fromWayID);
95081                         surface
95082                             .selectAll('.' + _fromWayID)
95083                             .classed('selected', true)
95084                             .classed('related', true);
95085                     }
95086
95087                     // Hovering a way
95088                     if (datum instanceof osmWay && datum.__from) {
95089                         way = datum;
95090
95091                         highlightPathsFrom(_fromWayID ? null : way.id);
95092                         surface.selectAll('.' + way.id)
95093                             .classed('related', true);
95094
95095                         var clickSelect = (!_fromWayID || _fromWayID !== way.id);
95096                         help
95097                             .append('div')      // "Click to select FROM {fromName}." / "FROM {fromName}"
95098                             .html(t('restriction.help.' + (clickSelect ? 'select_from_name' : 'from_name'), {
95099                                 from: placeholders.from,
95100                                 fromName: displayName(way.id, vgraph)
95101                             }));
95102
95103
95104                     // Hovering a turn arrow
95105                     } else if (datum instanceof osmTurn) {
95106                         var restrictionType = osmInferRestriction(vgraph, datum, projection);
95107                         var turnType = restrictionType.replace(/^(only|no)\_/, '');
95108                         var indirect = (datum.direct === false ? t('restriction.help.indirect') : '');
95109                         var klass, turnText, nextText;
95110
95111                         if (datum.no) {
95112                             klass = 'restrict';
95113                             turnText = t('restriction.help.turn.no_' + turnType, { indirect: indirect });
95114                             nextText = t('restriction.help.turn.only_' + turnType, { indirect: '' });
95115                         } else if (datum.only) {
95116                             klass = 'only';
95117                             turnText = t('restriction.help.turn.only_' + turnType, { indirect: indirect });
95118                             nextText = t('restriction.help.turn.allowed_' + turnType, { indirect: '' });
95119                         } else {
95120                             klass = 'allow';
95121                             turnText = t('restriction.help.turn.allowed_' + turnType, { indirect: indirect });
95122                             nextText = t('restriction.help.turn.no_' + turnType, { indirect: '' });
95123                         }
95124
95125                         help
95126                             .append('div')      // "NO Right Turn (indirect)"
95127                             .attr('class', 'qualifier ' + klass)
95128                             .text(turnText);
95129
95130                         help
95131                             .append('div')      // "FROM {fromName} TO {toName}"
95132                             .html(t('restriction.help.from_name_to_name', {
95133                                 from: placeholders.from,
95134                                 fromName: displayName(datum.from.way, vgraph),
95135                                 to: placeholders.to,
95136                                 toName: displayName(datum.to.way, vgraph)
95137                             }));
95138
95139                         if (datum.via.ways && datum.via.ways.length) {
95140                             var names = [];
95141                             for (var i = 0; i < datum.via.ways.length; i++) {
95142                                 var prev = names[names.length - 1];
95143                                 var curr = displayName(datum.via.ways[i], vgraph);
95144                                 if (!prev || curr !== prev)   // collapse identical names
95145                                     names.push(curr);
95146                             }
95147
95148                             help
95149                                 .append('div')      // "VIA {viaNames}"
95150                                 .html(t('restriction.help.via_names', {
95151                                     via: placeholders.via,
95152                                     viaNames: names.join(', ')
95153                                 }));
95154                         }
95155
95156                         if (!indirect) {
95157                             help
95158                                 .append('div')      // Click for "No Right Turn"
95159                                 .text(t('restriction.help.toggle', { turn: nextText.trim() }));
95160                         }
95161
95162                         highlightPathsFrom(null);
95163                         var alongIDs = datum.path.slice();
95164                         surface.selectAll(utilEntitySelector(alongIDs))
95165                             .classed('related', true)
95166                             .classed('allow', (klass === 'allow'))
95167                             .classed('restrict', (klass === 'restrict'))
95168                             .classed('only', (klass === 'only'));
95169
95170
95171                     // Hovering empty surface
95172                     } else {
95173                         highlightPathsFrom(null);
95174                         if (_fromWayID) {
95175                             help
95176                                 .append('div')      // "FROM {fromName}"
95177                                 .html(t('restriction.help.from_name', {
95178                                     from: placeholders.from,
95179                                     fromName: displayName(_fromWayID, vgraph)
95180                                 }));
95181
95182                         } else {
95183                             help
95184                                 .append('div')      // "Click to select a FROM segment."
95185                                 .html(t('restriction.help.select_from', {
95186                                     from: placeholders.from
95187                                 }));
95188                         }
95189                     }
95190                 }
95191             }
95192
95193
95194             function displayMaxDistance(maxDist) {
95195                 var isImperial = (utilDetect().locale.toLowerCase() === 'en-us');
95196                 var opts;
95197
95198                 if (isImperial) {
95199                     var distToFeet = {   // imprecise conversion for prettier display
95200                         20: 70, 25: 85, 30: 100, 35: 115, 40: 130, 45: 145, 50: 160
95201                     }[maxDist];
95202                     opts = { distance: t('units.feet', { quantity: distToFeet }) };
95203                 } else {
95204                     opts = { distance: t('units.meters', { quantity: maxDist }) };
95205                 }
95206
95207                 return t('restriction.controls.distance_up_to', opts);
95208             }
95209
95210
95211             function displayMaxVia(maxVia) {
95212                 return maxVia === 0 ? t('restriction.controls.via_node_only')
95213                     : maxVia === 1 ? t('restriction.controls.via_up_to_one')
95214                     : t('restriction.controls.via_up_to_two');
95215             }
95216
95217
95218             function displayName(entityID, graph) {
95219                 var entity = graph.entity(entityID);
95220                 var name = utilDisplayName(entity) || '';
95221                 var matched = context.presets().match(entity, graph);
95222                 var type = (matched && matched.name()) || utilDisplayType(entity.id);
95223                 return name || type;
95224             }
95225
95226
95227             restrictions.entity = function(val) {
95228                 _intersection = null;
95229                 _fromWayID = null;
95230                 _oldTurns = null;
95231                 _vertexID = val.id;
95232             };
95233
95234
95235             restrictions.tags = function() {};
95236             restrictions.focus = function() {};
95237
95238
95239             restrictions.off = function(selection) {
95240                 if (!_initialized) return;
95241
95242                 selection.selectAll('.surface')
95243                     .call(breathe.off)
95244                     .on('click.restrictions', null)
95245                     .on('mouseover.restrictions', null);
95246
95247                 d3_select(window)
95248                     .on('resize.restrictions', null);
95249             };
95250
95251
95252             return utilRebind(restrictions, dispatch$1, 'on');
95253         }
95254
95255         function uiFieldTextarea(field) {
95256             var dispatch$1 = dispatch('change');
95257             var input = d3_select(null);
95258
95259
95260             function textarea(selection) {
95261                 var wrap = selection.selectAll('.form-field-input-wrap')
95262                     .data([0]);
95263
95264                 wrap = wrap.enter()
95265                     .append('div')
95266                     .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
95267                     .merge(wrap);
95268
95269                 input = wrap.selectAll('textarea')
95270                     .data([0]);
95271
95272                 input = input.enter()
95273                     .append('textarea')
95274                     .attr('id', 'preset-input-' + field.safeid)
95275                     .attr('placeholder', field.placeholder() || t('inspector.unknown'))
95276                     .attr('maxlength', 255)
95277                     .call(utilNoAuto)
95278                     .on('input', change(true))
95279                     .on('blur', change())
95280                     .on('change', change())
95281                     .merge(input);
95282             }
95283
95284
95285             function change(onInput) {
95286                 return function() {
95287                     var t = {};
95288                     t[field.key] = utilGetSetValue(input) || undefined;
95289                     dispatch$1.call('change', this, t, onInput);
95290                 };
95291             }
95292
95293
95294             textarea.tags = function(tags) {
95295                 utilGetSetValue(input, tags[field.key] || '');
95296             };
95297
95298
95299             textarea.focus = function() {
95300                 input.node().focus();
95301             };
95302
95303
95304             return utilRebind(textarea, dispatch$1, 'on');
95305         }
95306
95307         function uiFieldWikidata(field, context) {
95308             var wikidata = services$1.wikidata;
95309             var dispatch$1 = dispatch('change');
95310             var searchInput = d3_select(null);
95311             var _qid = null;
95312             var _wikidataEntity = null;
95313             var _wikiURL = '';
95314             var _entity;
95315
95316             var combobox = uiCombobox(context, 'combo-' + field.safeid)
95317                 .caseSensitive(true)
95318                 .minItems(1);
95319
95320             function wiki(selection) {
95321
95322                 var wrap = selection.selectAll('.form-field-input-wrap')
95323                     .data([0]);
95324
95325                 wrap = wrap.enter()
95326                     .append('div')
95327                     .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
95328                     .merge(wrap);
95329
95330
95331                 var list = wrap.selectAll('ul')
95332                     .data([0]);
95333
95334                 list = list.enter()
95335                     .append('ul')
95336                     .attr('class', 'rows')
95337                     .merge(list);
95338
95339                 var searchRow = list.selectAll('li.wikidata-search')
95340                     .data([0]);
95341
95342                 var searchRowEnter = searchRow.enter()
95343                     .append('li')
95344                     .attr('class', 'wikidata-search');
95345
95346                 searchInput = searchRowEnter
95347                     .append('input')
95348                     .attr('type', 'text')
95349                     .style('flex', '1')
95350                     .call(utilNoAuto);
95351
95352                 searchInput
95353                     .on('focus', function() {
95354                         var node = d3_select(this).node();
95355                         node.setSelectionRange(0, node.value.length);
95356                     })
95357                     .on('blur', function() {
95358                         setLabelForEntity();
95359                     })
95360                     .call(combobox.fetcher(fetchWikidataItems));
95361
95362                 combobox.on('accept', function(d) {
95363                     _qid = d.id;
95364                     change();
95365                 }).on('cancel', function() {
95366                     setLabelForEntity();
95367                 });
95368
95369                 searchRowEnter
95370                     .append('button')
95371                     .attr('class', 'form-field-button wiki-link')
95372                     .attr('title', t('icons.open_wikidata'))
95373                     .attr('tabindex', -1)
95374                     .call(svgIcon('#iD-icon-out-link'))
95375                     .on('click', function() {
95376                         event.preventDefault();
95377                         if (_wikiURL) window.open(_wikiURL, '_blank');
95378                     });
95379
95380                 var wikidataProperties = ['description', 'identifier'];
95381
95382                 var items = list.selectAll('li.labeled-input')
95383                     .data(wikidataProperties);
95384
95385                 // Enter
95386                 var enter = items.enter()
95387                     .append('li')
95388                     .attr('class', function(d) { return 'labeled-input preset-wikidata-' + d; });
95389
95390                 enter
95391                     .append('span')
95392                     .attr('class', 'label')
95393                     .attr('for', function(d) { return 'preset-input-wikidata-' + d; })
95394                     .text(function(d) { return t('wikidata.' + d); });
95395
95396                 enter
95397                     .append('input')
95398                     .attr('type', 'text')
95399                     .attr('id', function(d) { return 'preset-input-wikidata-' + d; })
95400                     .call(utilNoAuto)
95401                     .classed('disabled', 'true')
95402                     .attr('readonly', 'true');
95403
95404                 enter
95405                     .append('button')
95406                     .attr('class', 'form-field-button')
95407                     .attr('title', t('icons.copy'))
95408                     .attr('tabindex', -1)
95409                     .call(svgIcon('#iD-operation-copy'))
95410                     .on('click', function() {
95411                         event.preventDefault();
95412                         d3_select(this.parentNode)
95413                             .select('input')
95414                             .node()
95415                             .select();
95416                         document.execCommand('copy');
95417                     });
95418
95419             }
95420
95421             function fetchWikidataItems(q, callback) {
95422
95423                 if (!q && _entity) {
95424                     q = context.entity(_entity.id).tags.name || '';
95425                 }
95426
95427                 wikidata.itemsForSearchQuery(q, function(err, data) {
95428                     if (err) return;
95429
95430                     for (var i in data) {
95431                         data[i].value = data[i].label + ' (' +  data[i].id + ')';
95432                         data[i].title = data[i].description;
95433                     }
95434
95435                     if (callback) callback(data);
95436                 });
95437             }
95438
95439
95440             function change() {
95441                 var syncTags = {};
95442                 syncTags[field.key] = _qid;
95443                 dispatch$1.call('change', this, syncTags);
95444
95445                 // attempt asynchronous update of wikidata tag..
95446                 var initGraph = context.graph();
95447                 var initEntityID = _entity.id;
95448
95449                 wikidata.entityByQID(_qid, function(err, entity) {
95450                     if (err) return;
95451
95452                     // If graph has changed, we can't apply this update.
95453                     if (context.graph() !== initGraph) return;
95454
95455                     if (!entity.sitelinks) return;
95456
95457                     var langs = wikidata.languagesToQuery();
95458                     // use the label and description languages as fallbacks
95459                     ['labels', 'descriptions'].forEach(function(key) {
95460                         if (!entity[key]) return;
95461
95462                         var valueLangs = Object.keys(entity[key]);
95463                         if (valueLangs.length === 0) return;
95464                         var valueLang = valueLangs[0];
95465
95466                         if (langs.indexOf(valueLang) === -1) {
95467                             langs.push(valueLang);
95468                         }
95469                     });
95470
95471                     var currTags = Object.assign({}, context.entity(initEntityID).tags);  // shallow copy
95472
95473                     var foundPreferred;
95474                     for (var i in langs) {
95475                         var lang = langs[i];
95476                         var siteID = lang.replace('-', '_') + 'wiki';
95477                         if (entity.sitelinks[siteID]) {
95478                             foundPreferred = true;
95479                             currTags.wikipedia = lang + ':' + entity.sitelinks[siteID].title;
95480                             // use the first match
95481                             break;
95482                         }
95483                     }
95484
95485                     if (!foundPreferred) {
95486                         // No wikipedia sites available in the user's language or the fallback languages,
95487                         // default to any wikipedia sitelink
95488
95489                         var wikiSiteKeys = Object.keys(entity.sitelinks).filter(function(site) {
95490                             return site.endsWith('wiki');
95491                         });
95492
95493                         if (wikiSiteKeys.length === 0) {
95494                             // if no wikipedia pages are linked to this wikidata entity, delete that tag
95495                             if (currTags.wikipedia) {
95496                                 delete currTags.wikipedia;
95497                             }
95498                         } else {
95499                             var wikiLang = wikiSiteKeys[0].slice(0, -4).replace('_', '-');
95500                             var wikiTitle = entity.sitelinks[wikiSiteKeys[0]].title;
95501                             currTags.wikipedia = wikiLang + ':' + wikiTitle;
95502                         }
95503                     }
95504
95505                     // Coalesce the update of wikidata tag into the previous tag change
95506                     context.overwrite(
95507                         actionChangeTags(initEntityID, currTags),
95508                         context.history().undoAnnotation()
95509                     );
95510
95511                     // do not dispatch.call('change') here, because entity_editor
95512                     // changeTags() is not intended to be called asynchronously
95513
95514                 });
95515             }
95516
95517             function setLabelForEntity() {
95518                 var label = '';
95519                 if (_wikidataEntity) {
95520                     label = entityPropertyForDisplay(_wikidataEntity, 'labels');
95521                     if (label.length === 0) {
95522                         label = _wikidataEntity.id.toString();
95523                     }
95524                 }
95525                 utilGetSetValue(d3_select('li.wikidata-search input'), label);
95526             }
95527
95528
95529             wiki.tags = function(tags) {
95530                 _qid = tags[field.key] || '';
95531
95532                 if (!/^Q[0-9]*$/.test(_qid)) {   // not a proper QID
95533                     unrecognized();
95534                     return;
95535                 }
95536
95537                 // QID value in correct format
95538                 _wikiURL = 'https://wikidata.org/wiki/' + _qid;
95539                 wikidata.entityByQID(_qid, function(err, entity) {
95540                     if (err) {
95541                         unrecognized();
95542                         return;
95543                     }
95544                     _wikidataEntity = entity;
95545
95546                     setLabelForEntity();
95547
95548                     var description = entityPropertyForDisplay(entity, 'descriptions');
95549
95550                     d3_select('.form-field-wikidata button.wiki-link')
95551                         .classed('disabled', false);
95552
95553                     d3_select('.preset-wikidata-description')
95554                         .style('display', function(){
95555                             return description.length > 0 ? 'flex' : 'none';
95556                         })
95557                         .select('input')
95558                         .attr('value', description);
95559
95560                     d3_select('.preset-wikidata-identifier')
95561                         .style('display', function(){
95562                             return entity.id ? 'flex' : 'none';
95563                         })
95564                         .select('input')
95565                         .attr('value', entity.id);
95566                 });
95567
95568
95569                 // not a proper QID
95570                 function unrecognized() {
95571                     _wikidataEntity = null;
95572                     setLabelForEntity();
95573
95574                     d3_select('.preset-wikidata-description')
95575                         .style('display', 'none');
95576                     d3_select('.preset-wikidata-identifier')
95577                         .style('display', 'none');
95578
95579                     d3_select('.form-field-wikidata button.wiki-link')
95580                         .classed('disabled', true);
95581
95582                     if (_qid && _qid !== '') {
95583                         _wikiURL = 'https://wikidata.org/wiki/Special:Search?search=' + _qid;
95584                     } else {
95585                         _wikiURL = '';
95586                     }
95587                 }
95588             };
95589
95590             function entityPropertyForDisplay(wikidataEntity, propKey) {
95591                 if (!wikidataEntity[propKey]) return '';
95592                 var propObj = wikidataEntity[propKey];
95593                 var langKeys = Object.keys(propObj);
95594                 if (langKeys.length === 0) return '';
95595                 // sorted by priority, since we want to show the user's language first if possible
95596                 var langs = wikidata.languagesToQuery();
95597                 for (var i in langs) {
95598                     var lang = langs[i];
95599                     var valueObj = propObj[lang];
95600                     if (valueObj && valueObj.value && valueObj.value.length > 0) return valueObj.value;
95601                 }
95602                 // default to any available value
95603                 return propObj[langKeys[0]].value;
95604             }
95605
95606
95607             wiki.entity = function(val) {
95608                 if (!arguments.length) return _entity;
95609                 _entity = val;
95610                 return wiki;
95611             };
95612
95613
95614             wiki.focus = function() {
95615                 searchInput.node().focus();
95616             };
95617
95618
95619             return utilRebind(wiki, dispatch$1, 'on');
95620         }
95621
95622         function uiFieldWikipedia(field, context) {
95623             var dispatch$1 = dispatch('change');
95624             var wikipedia = services$1.wikipedia;
95625             var wikidata = services$1.wikidata;
95626             var lang = d3_select(null);
95627             var title = d3_select(null);
95628             var _wikiURL = '';
95629             var _entity;
95630
95631             var langCombo = uiCombobox(context, 'wikipedia-lang')
95632                 .fetcher(function(value, cb) {
95633                     var v = value.toLowerCase();
95634
95635                     cb(wikipedia$2.filter(function(d) {
95636                         return d[0].toLowerCase().indexOf(v) >= 0 ||
95637                             d[1].toLowerCase().indexOf(v) >= 0 ||
95638                             d[2].toLowerCase().indexOf(v) >= 0;
95639                     }).map(function(d) {
95640                         return { value: d[1] };
95641                     }));
95642                 });
95643
95644             var titleCombo = uiCombobox(context, 'wikipedia-title')
95645                 .fetcher(function(value, cb) {
95646                     if (!value && _entity) {
95647                         value = context.entity(_entity.id).tags.name || '';
95648                     }
95649
95650                     var searchfn = value.length > 7 ? wikipedia.search : wikipedia.suggestions;
95651                     searchfn(language()[2], value, function(query, data) {
95652                         cb(data.map(function(d) {
95653                             return { value: d };
95654                         }));
95655                     });
95656                 });
95657
95658
95659             function wiki(selection) {
95660                 var wrap = selection.selectAll('.form-field-input-wrap')
95661                     .data([0]);
95662
95663                 wrap = wrap.enter()
95664                     .append('div')
95665                     .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
95666                     .merge(wrap);
95667
95668
95669                 var langRow = wrap.selectAll('.wiki-lang-container')
95670                     .data([0]);
95671
95672                 langRow = langRow.enter()
95673                     .append('div')
95674                     .attr('class', 'wiki-lang-container')
95675                     .merge(langRow);
95676
95677
95678                 lang = langRow.selectAll('input.wiki-lang')
95679                     .data([0]);
95680
95681                 lang = lang.enter()
95682                     .append('input')
95683                     .attr('type', 'text')
95684                     .attr('class', 'wiki-lang')
95685                     .attr('placeholder', t('translate.localized_translation_language'))
95686                     .call(utilNoAuto)
95687                     .call(langCombo)
95688                     .merge(lang);
95689
95690                 utilGetSetValue(lang, language()[1]);
95691
95692                 lang
95693                     .on('blur', changeLang)
95694                     .on('change', changeLang);
95695
95696
95697                 var titleRow = wrap.selectAll('.wiki-title-container')
95698                     .data([0]);
95699
95700                 titleRow = titleRow.enter()
95701                     .append('div')
95702                     .attr('class', 'wiki-title-container')
95703                     .merge(titleRow);
95704
95705                 title = titleRow.selectAll('input.wiki-title')
95706                     .data([0]);
95707
95708                 title = title.enter()
95709                     .append('input')
95710                     .attr('type', 'text')
95711                     .attr('class', 'wiki-title')
95712                     .attr('id', 'preset-input-' + field.safeid)
95713                     .call(utilNoAuto)
95714                     .call(titleCombo)
95715                     .merge(title);
95716
95717                 title
95718                     .on('blur', blur)
95719                     .on('change', change);
95720
95721
95722                 var link = titleRow.selectAll('.wiki-link')
95723                     .data([0]);
95724
95725                 link = link.enter()
95726                     .append('button')
95727                     .attr('class', 'form-field-button wiki-link')
95728                     .attr('tabindex', -1)
95729                     .call(svgIcon('#iD-icon-out-link'))
95730                     .merge(link);
95731
95732                 link
95733                     .on('click', function() {
95734                         event.preventDefault();
95735                         if (_wikiURL) window.open(_wikiURL, '_blank');
95736                     });
95737             }
95738
95739
95740             function language() {
95741                 var value = utilGetSetValue(lang).toLowerCase();
95742                 var locale = utilDetect().locale.toLowerCase();
95743                 var localeLanguage;
95744                 return wikipedia$2.find(function(d) {
95745                     if (d[2] === locale) localeLanguage = d;
95746                     return d[0].toLowerCase() === value ||
95747                         d[1].toLowerCase() === value ||
95748                         d[2] === value;
95749                 }) || localeLanguage || ['English', 'English', 'en'];
95750             }
95751
95752
95753             function changeLang() {
95754                 utilGetSetValue(lang, language()[1]);
95755                 change(true);
95756             }
95757
95758
95759             function blur() {
95760                 change(true);
95761             }
95762
95763
95764             function change(skipWikidata) {
95765                 var value = utilGetSetValue(title);
95766                 var m = value.match(/https?:\/\/([-a-z]+)\.wikipedia\.org\/(?:wiki|\1-[-a-z]+)\/([^#]+)(?:#(.+))?/);
95767                 var l = m && wikipedia$2.find(function(d) { return m[1] === d[2]; });
95768                 var syncTags = {};
95769
95770                 if (l) {
95771                     // Normalize title http://www.mediawiki.org/wiki/API:Query#Title_normalization
95772                     value = decodeURIComponent(m[2]).replace(/_/g, ' ');
95773                     if (m[3]) {
95774                         var anchor;
95775                         // try {
95776                         // leave this out for now - #6232
95777                             // Best-effort `anchordecode:` implementation
95778                             // anchor = decodeURIComponent(m[3].replace(/\.([0-9A-F]{2})/g, '%$1'));
95779                         // } catch (e) {
95780                             anchor = decodeURIComponent(m[3]);
95781                         // }
95782                         value += '#' + anchor.replace(/_/g, ' ');
95783                     }
95784                     value = value.slice(0, 1).toUpperCase() + value.slice(1);
95785                     utilGetSetValue(lang, l[1]);
95786                     utilGetSetValue(title, value);
95787                 }
95788
95789                 if (value) {
95790                     syncTags.wikipedia = language()[2] + ':' + value;
95791                 } else {
95792                     syncTags.wikipedia = undefined;
95793                 }
95794
95795                 dispatch$1.call('change', this, syncTags);
95796
95797
95798                 if (skipWikidata || !value || !language()[2]) return;
95799
95800                 // attempt asynchronous update of wikidata tag..
95801                 var initGraph = context.graph();
95802                 var initEntityID = _entity.id;
95803
95804                 wikidata.itemsByTitle(language()[2], value, function(err, data) {
95805                     if (err) return;
95806
95807                     // If graph has changed, we can't apply this update.
95808                     if (context.graph() !== initGraph) return;
95809
95810                     if (!data || !Object.keys(data).length) return;
95811
95812                     var qids = Object.keys(data);
95813                     var value = qids && qids.find(function(id) { return id.match(/^Q\d+$/); });
95814                     var currTags = Object.assign({}, context.entity(initEntityID).tags);  // shallow copy
95815
95816                     currTags.wikidata = value;
95817
95818                     // Coalesce the update of wikidata tag into the previous tag change
95819                     context.overwrite(
95820                         actionChangeTags(initEntityID, currTags),
95821                         context.history().undoAnnotation()
95822                     );
95823
95824                     // do not dispatch.call('change') here, because entity_editor
95825                     // changeTags() is not intended to be called asynchronously
95826                 });
95827             }
95828
95829
95830             wiki.tags = function(tags) {
95831                 var value = tags[field.key] || '';
95832                 var m = value.match(/([^:]+):([^#]+)(?:#(.+))?/);
95833                 var l = m && wikipedia$2.find(function(d) { return m[1] === d[2]; });
95834                 var anchor = m && m[3];
95835
95836                 // value in correct format
95837                 if (l) {
95838                     utilGetSetValue(lang, l[1]);
95839                     utilGetSetValue(title, m[2] + (anchor ? ('#' + anchor) : ''));
95840                     if (anchor) {
95841                         try {
95842                             // Best-effort `anchorencode:` implementation
95843                             anchor = encodeURIComponent(anchor.replace(/ /g, '_')).replace(/%/g, '.');
95844                         } catch (e) {
95845                             anchor = anchor.replace(/ /g, '_');
95846                         }
95847                     }
95848                     _wikiURL = 'https://' + m[1] + '.wikipedia.org/wiki/' +
95849                         m[2].replace(/ /g, '_') + (anchor ? ('#' + anchor) : '');
95850
95851                 // unrecognized value format
95852                 } else {
95853                     utilGetSetValue(title, value);
95854                     if (value && value !== '') {
95855                         utilGetSetValue(lang, '');
95856                         _wikiURL = 'https://en.wikipedia.org/wiki/Special:Search?search=' + value;
95857                     } else {
95858                         _wikiURL = '';
95859                     }
95860                 }
95861             };
95862
95863
95864             wiki.entity = function(val) {
95865                 if (!arguments.length) return _entity;
95866                 _entity = val;
95867                 return wiki;
95868             };
95869
95870
95871             wiki.focus = function() {
95872                 title.node().focus();
95873             };
95874
95875
95876             return utilRebind(wiki, dispatch$1, 'on');
95877         }
95878
95879         var uiFields = {
95880             access: uiFieldAccess,
95881             address: uiFieldAddress,
95882             check: uiFieldCheck,
95883             combo: uiFieldCombo,
95884             cycleway: uiFieldCycleway,
95885             defaultCheck: uiFieldCheck,
95886             email: uiFieldText,
95887             lanes: uiFieldLanes,
95888             localized: uiFieldLocalized,
95889             maxspeed: uiFieldMaxspeed,
95890             multiCombo: uiFieldCombo,
95891             networkCombo: uiFieldCombo,
95892             number: uiFieldText,
95893             onewayCheck: uiFieldCheck,
95894             radio: uiFieldRadio,
95895             restrictions: uiFieldRestrictions,
95896             semiCombo: uiFieldCombo,
95897             structureRadio: uiFieldRadio,
95898             tel: uiFieldText,
95899             text: uiFieldText,
95900             textarea: uiFieldTextarea,
95901             typeCombo: uiFieldCombo,
95902             url: uiFieldText,
95903             wikidata: uiFieldWikidata,
95904             wikipedia: uiFieldWikipedia
95905         };
95906
95907         function uiField(context, presetField, entity, options) {
95908             options = Object.assign({
95909                 show: true,
95910                 wrap: true,
95911                 remove: true,
95912                 revert: true,
95913                 info: true
95914             }, options);
95915
95916             var dispatch$1 = dispatch('change');
95917             var field = Object.assign({}, presetField);   // shallow copy
95918             var _show = options.show;
95919             var _state = '';
95920             var _tags = {};
95921
95922             var _locked = false;
95923             var _lockedTip = tooltip()
95924                 .title(t('inspector.lock.suggestion', { label: field.label }))
95925                 .placement('bottom');
95926
95927
95928             field.keys = field.keys || [field.key];
95929
95930             // only create the fields that are actually being shown
95931             if (_show && !field.impl) {
95932                 createField();
95933             }
95934
95935             // Creates the field.. This is done lazily,
95936             // once we know that the field will be shown.
95937             function createField() {
95938                 field.impl = uiFields[field.type](field, context)
95939                     .on('change', function(t, onInput) {
95940                         dispatch$1.call('change', field, t, onInput);
95941                     });
95942
95943                 if (entity) {
95944                     field.entityID = entity.id;
95945                     // if this field cares about the entity, pass it along
95946                     if (field.impl.entity) {
95947                         field.impl.entity(entity);
95948                     }
95949                 }
95950             }
95951
95952
95953             function isModified() {
95954                 if (!entity) return false;
95955                 var original = context.graph().base().entities[entity.id];
95956                 return field.keys.some(function(key) {
95957                     return original ? _tags[key] !== original.tags[key] : _tags[key];
95958                 });
95959             }
95960
95961
95962             function isPresent() {
95963                 return field.keys.some(function(key) {
95964                     if (field.type === 'multiCombo') {
95965                         for (var tagKey in _tags) {
95966                             if (tagKey.indexOf(key) === 0) {
95967                                 return true;
95968                             }
95969                         }
95970                         return false;
95971                     }
95972                     return _tags[key] !== undefined;
95973                 });
95974             }
95975
95976
95977             function revert(d) {
95978                 event.stopPropagation();
95979                 event.preventDefault();
95980                 if (!entity || _locked) return;
95981
95982                 var original = context.graph().base().entities[entity.id];
95983                 var t = {};
95984                 d.keys.forEach(function(key) {
95985                     t[key] = original ? original.tags[key] : undefined;
95986                 });
95987
95988                 dispatch$1.call('change', d, t);
95989             }
95990
95991
95992             function remove(d) {
95993                 event.stopPropagation();
95994                 event.preventDefault();
95995                 if (_locked) return;
95996
95997                 var t = {};
95998                 d.keys.forEach(function(key) {
95999                     t[key] = undefined;
96000                 });
96001
96002                 dispatch$1.call('change', d, t);
96003             }
96004
96005
96006             field.render = function(selection) {
96007                 var container = selection.selectAll('.form-field')
96008                     .data([field]);
96009
96010                 // Enter
96011                 var enter = container.enter()
96012                     .append('div')
96013                     .attr('class', function(d) { return 'form-field form-field-' + d.safeid; })
96014                     .classed('nowrap', !options.wrap);
96015
96016                 if (options.wrap) {
96017                     var labelEnter = enter
96018                         .append('label')
96019                         .attr('class', 'field-label')
96020                         .attr('for', function(d) { return 'preset-input-' + d.safeid; });
96021
96022                     var textEnter = labelEnter
96023                         .append('span')
96024                         .attr('class', 'label-text');
96025
96026                     textEnter
96027                         .append('span')
96028                         .attr('class', 'label-textvalue')
96029                         .text(function(d) { return d.label(); });
96030
96031                     textEnter
96032                         .append('span')
96033                         .attr('class', 'label-textannotation');
96034
96035                     if (options.remove) {
96036                         labelEnter
96037                             .append('button')
96038                             .attr('class', 'remove-icon')
96039                             .attr('title', t('icons.remove'))
96040                             .attr('tabindex', -1)
96041                             .call(svgIcon('#iD-operation-delete'));
96042                     }
96043
96044                     if (options.revert) {
96045                         labelEnter
96046                             .append('button')
96047                             .attr('class', 'modified-icon')
96048                             .attr('title', t('icons.undo'))
96049                             .attr('tabindex', -1)
96050                             .call(svgIcon((textDirection === 'rtl') ? '#iD-icon-redo' : '#iD-icon-undo'));
96051                     }
96052                 }
96053
96054
96055                 // Update
96056                 container = container
96057                     .merge(enter);
96058
96059                 container.select('.field-label > .remove-icon')  // propagate bound data
96060                     .on('click', remove);
96061
96062                 container.select('.field-label > .modified-icon')  // propagate bound data
96063                     .on('click', revert);
96064
96065                 container
96066                     .each(function(d) {
96067                         var selection = d3_select(this);
96068
96069                         if (!d.impl) {
96070                             createField();
96071                         }
96072
96073                         var reference, help;
96074
96075                         // instantiate field help
96076                         if (options.wrap && field.type === 'restrictions') {
96077                             help = uiFieldHelp(context, 'restrictions');
96078                         }
96079
96080                         // instantiate tag reference
96081                         if (options.wrap && options.info) {
96082                             var referenceKey = d.key;
96083                             if (d.type === 'multiCombo') {   // lookup key without the trailing ':'
96084                                 referenceKey = referenceKey.replace(/:$/, '');
96085                             }
96086
96087                             reference = uiTagReference(d.reference || { key: referenceKey });
96088                             if (_state === 'hover') {
96089                                 reference.showing(false);
96090                             }
96091                         }
96092
96093                         selection
96094                             .call(d.impl);
96095
96096                         // add field help components
96097                         if (help) {
96098                             selection
96099                                 .call(help.body)
96100                                 .select('.field-label')
96101                                 .call(help.button);
96102                         }
96103
96104                         // add tag reference components
96105                         if (reference) {
96106                             selection
96107                                 .call(reference.body)
96108                                 .select('.field-label')
96109                                 .call(reference.button);
96110                         }
96111
96112                         d.impl.tags(_tags);
96113                     });
96114
96115
96116                     container
96117                         .classed('locked', _locked)
96118                         .classed('modified', isModified())
96119                         .classed('present', isPresent());
96120
96121
96122                     // show a tip and lock icon if the field is locked
96123                     var annotation = container.selectAll('.field-label .label-textannotation');
96124                     var icon = annotation.selectAll('.icon')
96125                         .data(_locked ? [0]: []);
96126
96127                     icon.exit()
96128                         .remove();
96129
96130                     icon.enter()
96131                         .append('svg')
96132                         .attr('class', 'icon')
96133                         .append('use')
96134                         .attr('xlink:href', '#fas-lock');
96135
96136                     container.call(_locked ? _lockedTip : _lockedTip.destroy);
96137             };
96138
96139
96140             field.state = function(val) {
96141                 if (!arguments.length) return _state;
96142                 _state = val;
96143                 return field;
96144             };
96145
96146
96147             field.tags = function(val) {
96148                 if (!arguments.length) return _tags;
96149                 _tags = val;
96150                 return field;
96151             };
96152
96153
96154             field.locked = function(val) {
96155                 if (!arguments.length) return _locked;
96156                 _locked = val;
96157                 return field;
96158             };
96159
96160
96161             field.show = function() {
96162                 _show = true;
96163                 if (!field.impl) {
96164                     createField();
96165                 }
96166                 if (field.default && field.key && _tags[field.key] !== field.default) {
96167                     var t = {};
96168                     t[field.key] = field.default;
96169                     dispatch$1.call('change', this, t);
96170                 }
96171             };
96172
96173             // A shown field has a visible UI, a non-shown field is in the 'Add field' dropdown
96174             field.isShown = function() {
96175                 return _show || isPresent();
96176             };
96177
96178
96179             // An allowed field can appear in the UI or in the 'Add field' dropdown.
96180             // A non-allowed field is hidden from the user altogether
96181             field.isAllowed = function() {
96182                 if (!entity || isPresent()) return true;   // a field with a value should always display
96183
96184                 var latest = context.hasEntity(entity.id);   // check the most current copy of the entity
96185                 if (!latest) return true;
96186
96187                 var require = field.prerequisiteTag;
96188                 if (require && require.key) {
96189                     var value = latest.tags[require.key];
96190                     if (!value) return false;
96191
96192                     if (require.valueNot) {
96193                         return require.valueNot !== value;
96194                     }
96195                     if (require.value) {
96196                         return require.value === value;
96197                     }
96198                     return true;
96199                 }
96200                 return true;
96201             };
96202
96203
96204             field.focus = function() {
96205                 if (field.impl) {
96206                     field.impl.focus();
96207                 }
96208             };
96209
96210
96211             return utilRebind(field, dispatch$1, 'on');
96212         }
96213
96214         function uiFormFields(context) {
96215             var moreCombo = uiCombobox(context, 'more-fields').minItems(1);
96216             var _fieldsArr = [];
96217             var _lastPlaceholder = '';
96218             var _state = '';
96219             var _klass = '';
96220
96221
96222             function formFields(selection) {
96223                 var allowedFields = _fieldsArr.filter(function(field) { return field.isAllowed(); });
96224                 var shown = allowedFields.filter(function(field) { return field.isShown(); });
96225                 var notShown = allowedFields.filter(function(field) { return !field.isShown(); });
96226
96227                 var container = selection.selectAll('.form-fields-container')
96228                     .data([0]);
96229
96230                 container = container.enter()
96231                     .append('div')
96232                     .attr('class', 'form-fields-container ' + (_klass || ''))
96233                     .merge(container);
96234
96235
96236                 var fields = container.selectAll('.wrap-form-field')
96237                     .data(shown, function(d) { return d.id + (d.entityID || ''); });
96238
96239                 fields.exit()
96240                     .remove();
96241
96242                 // Enter
96243                 var enter = fields.enter()
96244                     .append('div')
96245                     .attr('class', function(d) { return 'wrap-form-field wrap-form-field-' + d.safeid; });
96246
96247                 // Update
96248                 fields = fields
96249                     .merge(enter);
96250
96251                 fields
96252                     .order()
96253                     .each(function(d) {
96254                         d3_select(this)
96255                             .call(d.render);
96256                     });
96257
96258
96259                 var titles = [];
96260                 var moreFields = notShown.map(function(field) {
96261                     var label = field.label();
96262                     titles.push(label);
96263                     return {
96264                         title: label,
96265                         value: label,
96266                         field: field
96267                     };
96268                 });
96269
96270                 var placeholder = titles.slice(0,3).join(', ') + ((titles.length > 3) ? '…' : '');
96271
96272
96273                 var more = selection.selectAll('.more-fields')
96274                     .data((_state === 'hover' || moreFields.length === 0) ? [] : [0]);
96275
96276                 more.exit()
96277                     .remove();
96278
96279                 more = more.enter()
96280                     .append('div')
96281                     .attr('class', 'more-fields')
96282                     .append('label')
96283                     .text(t('inspector.add_fields'))
96284                     .merge(more);
96285
96286
96287                 var input = more.selectAll('.value')
96288                     .data([0]);
96289
96290                 input.exit()
96291                     .remove();
96292
96293                 input = input.enter()
96294                     .append('input')
96295                     .attr('class', 'value')
96296                     .attr('type', 'text')
96297                     .attr('placeholder', placeholder)
96298                     .call(utilNoAuto)
96299                     .merge(input);
96300
96301                 input
96302                     .call(utilGetSetValue, '')
96303                     .call(moreCombo
96304                         .data(moreFields)
96305                         .on('accept', function (d) {
96306                             if (!d) return;  // user entered something that was not matched
96307                             var field = d.field;
96308                             field.show();
96309                             selection.call(formFields);  // rerender
96310                             if (field.type !== 'semiCombo' && field.type !== 'multiCombo') {
96311                                 field.focus();
96312                             }
96313                         })
96314                     );
96315
96316                 // avoid updating placeholder excessively (triggers style recalc)
96317                 if (_lastPlaceholder !== placeholder) {
96318                     input.attr('placeholder', placeholder);
96319                     _lastPlaceholder = placeholder;
96320                 }
96321             }
96322
96323
96324             formFields.fieldsArr = function(val) {
96325                 if (!arguments.length) return _fieldsArr;
96326                 _fieldsArr = val || [];
96327                 return formFields;
96328             };
96329
96330             formFields.state = function(val) {
96331                 if (!arguments.length) return _state;
96332                 _state = val;
96333                 return formFields;
96334             };
96335
96336             formFields.klass = function(val) {
96337                 if (!arguments.length) return _klass;
96338                 _klass = val;
96339                 return formFields;
96340             };
96341
96342
96343             return formFields;
96344         }
96345
96346         function uiPresetEditor(context) {
96347             var dispatch$1 = dispatch('change');
96348             var formFields = uiFormFields(context);
96349             var _state;
96350             var _fieldsArr;
96351             var _preset;
96352             var _tags;
96353             var _entityID;
96354
96355
96356             function presetEditor(selection) {
96357                 selection.call(uiDisclosure(context, 'preset_fields', true)
96358                     .title(t('inspector.all_fields'))
96359                     .content(render)
96360                 );
96361             }
96362
96363
96364             function render(selection) {
96365                 if (!_fieldsArr) {
96366                     var entity = context.entity(_entityID);
96367                     var geometry = context.geometry(_entityID);
96368                     var presets = context.presets();
96369
96370                     _fieldsArr = [];
96371
96372                     _preset.fields.forEach(function(field) {
96373                         if (field.matchGeometry(geometry)) {
96374                             _fieldsArr.push(
96375                                 uiField(context, field, entity)
96376                             );
96377                         }
96378                     });
96379
96380                     if (entity.isHighwayIntersection(context.graph()) && presets.field('restrictions')) {
96381                         _fieldsArr.push(
96382                             uiField(context, presets.field('restrictions'), entity)
96383                         );
96384                     }
96385
96386                     var additionalFields = utilArrayUnion(_preset.moreFields, presets.universal());
96387                     additionalFields.sort(function(field1, field2) {
96388                         return field1.label() > field2.label();
96389                     });
96390
96391                     additionalFields.forEach(function(field) {
96392                         if (_preset.fields.indexOf(field) === -1) {
96393                             _fieldsArr.push(
96394                                 uiField(context, field, entity, { show: false })
96395                             );
96396                         }
96397                     });
96398
96399                     _fieldsArr.forEach(function(field) {
96400                         field
96401                             .on('change', function(t, onInput) {
96402                                 dispatch$1.call('change', field, t, onInput);
96403                             });
96404                     });
96405                 }
96406
96407                 _fieldsArr.forEach(function(field) {
96408                     field
96409                         .state(_state)
96410                         .tags(_tags);
96411                 });
96412
96413
96414                 selection
96415                     .call(formFields
96416                         .fieldsArr(_fieldsArr)
96417                         .state(_state)
96418                         .klass('inspector-inner fillL3')
96419                     );
96420
96421
96422                 selection.selectAll('.wrap-form-field input')
96423                     .on('keydown', function() {
96424                         // if user presses enter, and combobox is not active, accept edits..
96425                         if (event.keyCode === 13 && d3_select('.combobox').empty()) {
96426                             context.enter(modeBrowse(context));
96427                         }
96428                     });
96429             }
96430
96431
96432             presetEditor.preset = function(val) {
96433                 if (!arguments.length) return _preset;
96434                 if (_preset && _preset.id === val.id) return presetEditor;
96435                 _preset = val;
96436                 _fieldsArr = null;
96437                 return presetEditor;
96438             };
96439
96440
96441             presetEditor.state = function(val) {
96442                 if (!arguments.length) return _state;
96443                 _state = val;
96444                 return presetEditor;
96445             };
96446
96447
96448             presetEditor.tags = function(val) {
96449                 if (!arguments.length) return _tags;
96450                 _tags = val;
96451                 // Don't reset _fieldsArr here.
96452                 return presetEditor;
96453             };
96454
96455
96456             presetEditor.entityID = function(val) {
96457                 if (!arguments.length) return _entityID;
96458                 if (_entityID === val) return presetEditor;
96459                 _entityID = val;
96460                 _fieldsArr = null;
96461                 return presetEditor;
96462             };
96463
96464
96465             return utilRebind(presetEditor, dispatch$1, 'on');
96466         }
96467
96468         function uiEntityIssues(context) {
96469             var _selection = d3_select(null);
96470             var _activeIssueID;
96471             var _entityID;
96472
96473             // Refresh on validated events
96474             context.validator()
96475                 .on('validated.entity_issues', function() {
96476                      _selection.selectAll('.disclosure-wrap-entity_issues')
96477                          .call(render);
96478
96479                     update();
96480                 })
96481                 .on('focusedIssue.entity_issues', function(issue) {
96482                      makeActiveIssue(issue.id);
96483                 });
96484
96485
96486             function entityIssues(selection) {
96487                 _selection = selection;
96488
96489                 selection
96490                     .call(uiDisclosure(context, 'entity_issues', true)
96491                         .content(render)
96492                     );
96493
96494                 update();
96495             }
96496
96497             function getIssues() {
96498                 return context.validator().getEntityIssues(_entityID, { includeDisabledRules: true });
96499             }
96500
96501             function makeActiveIssue(issueID) {
96502                 _activeIssueID = issueID;
96503                 _selection.selectAll('.issue-container')
96504                     .classed('active', function(d) { return d.id === _activeIssueID; });
96505             }
96506
96507             function update() {
96508
96509                 var issues = getIssues();
96510
96511                 _selection
96512                     .classed('hide', issues.length === 0);
96513
96514                 _selection.selectAll('.hide-toggle-entity_issues span')
96515                     .text(t('issues.list_title', { count: issues.length }));
96516             }
96517
96518
96519             function render(selection) {
96520                 var issues = getIssues();
96521                 _activeIssueID = issues.length > 0 ? issues[0].id : null;
96522
96523
96524                 var containers = selection.selectAll('.issue-container')
96525                     .data(issues, function(d) { return d.id; });
96526
96527                 // Exit
96528                 containers.exit()
96529                     .remove();
96530
96531                 // Enter
96532                 var containersEnter = containers.enter()
96533                     .append('div')
96534                     .attr('class', 'issue-container');
96535
96536
96537                 var itemsEnter = containersEnter
96538                     .append('div')
96539                     .attr('class', function(d) { return 'issue severity-' + d.severity; })
96540                     .on('mouseover.highlight', function(d) {
96541                         // don't hover-highlight the selected entity
96542                         var ids = d.entityIds
96543                             .filter(function(e) { return e !== _entityID; });
96544
96545                         utilHighlightEntities(ids, true, context);
96546                     })
96547                     .on('mouseout.highlight', function(d) {
96548                         var ids = d.entityIds
96549                             .filter(function(e) { return e !== _entityID; });
96550
96551                         utilHighlightEntities(ids, false, context);
96552                     });
96553
96554                 var labelsEnter = itemsEnter
96555                     .append('div')
96556                     .attr('class', 'issue-label')
96557                     .on('click', function(d) {
96558
96559                         makeActiveIssue(d.id); // expand only the clicked item
96560
96561                         var extent = d.extent(context.graph());
96562                         if (extent) {
96563                             var setZoom = Math.max(context.map().zoom(), 19);
96564                             context.map().unobscuredCenterZoomEase(extent.center(), setZoom);
96565                         }
96566                     });
96567
96568                 var textEnter = labelsEnter
96569                     .append('span')
96570                     .attr('class', 'issue-text');
96571
96572                 textEnter
96573                     .append('span')
96574                     .attr('class', 'issue-icon')
96575                     .each(function(d) {
96576                         var iconName = '#iD-icon-' + (d.severity === 'warning' ? 'alert' : 'error');
96577                         d3_select(this)
96578                             .call(svgIcon(iconName));
96579                     });
96580
96581                 textEnter
96582                     .append('span')
96583                     .attr('class', 'issue-message');
96584
96585
96586                 var infoButton = labelsEnter
96587                     .append('button')
96588                     .attr('class', 'issue-info-button')
96589                     .attr('title', t('icons.information'))
96590                     .attr('tabindex', -1)
96591                     .call(svgIcon('#iD-icon-inspect'));
96592
96593                 infoButton
96594                     .on('click', function () {
96595                         event.stopPropagation();
96596                         event.preventDefault();
96597                         this.blur();    // avoid keeping focus on the button - #4641
96598
96599                         var container = d3_select(this.parentNode.parentNode.parentNode);
96600                         var info = container.selectAll('.issue-info');
96601                         var isExpanded = info.classed('expanded');
96602
96603                         if (isExpanded) {
96604                             info
96605                                 .transition()
96606                                 .duration(200)
96607                                 .style('max-height', '0px')
96608                                 .style('opacity', '0')
96609                                 .on('end', function () {
96610                                     info.classed('expanded', false);
96611                                 });
96612                         } else {
96613                             info
96614                                 .classed('expanded', true)
96615                                 .transition()
96616                                 .duration(200)
96617                                 .style('max-height', '200px')
96618                                 .style('opacity', '1')
96619                                 .on('end', function () {
96620                                     info.style('max-height', null);
96621                                 });
96622                         }
96623                     });
96624
96625                 itemsEnter
96626                     .append('ul')
96627                     .attr('class', 'issue-fix-list');
96628
96629                 containersEnter
96630                     .append('div')
96631                     .attr('class', 'issue-info')
96632                     .style('max-height', '0')
96633                     .style('opacity', '0')
96634                     .each(function(d) {
96635                         if (typeof d.reference === 'function') {
96636                             d3_select(this)
96637                                 .call(d.reference);
96638                         } else {
96639                             d3_select(this)
96640                                 .text(t('inspector.no_documentation_key'));
96641                         }
96642                     });
96643
96644
96645                 // Update
96646                 containers = containers
96647                     .merge(containersEnter)
96648                     .classed('active', function(d) { return d.id === _activeIssueID; });
96649
96650                 containers.selectAll('.issue-message')
96651                     .text(function(d) {
96652                         return d.message(context);
96653                     });
96654
96655                 // fixes
96656                 var fixLists = containers.selectAll('.issue-fix-list');
96657
96658                 var fixes = fixLists.selectAll('.issue-fix-item')
96659                     .data(function(d) { return d.fixes ? d.fixes : []; });
96660
96661                 var fixesEnter = fixes.enter()
96662                     .append('li')
96663                     .attr('class', function(d) {
96664                         return 'issue-fix-item ' + (d.onClick ? 'actionable' : '');
96665                     })
96666                     .on('click', function(d) {
96667                         // not all fixes are actionable
96668                         if (!d.onClick) return;
96669
96670                         // Don't run another fix for this issue within a second of running one
96671                         // (Necessary for "Select a feature type" fix. Most fixes should only ever run once)
96672                         if (d.issue.dateLastRanFix && new Date() - d.issue.dateLastRanFix < 1000) return;
96673                         d.issue.dateLastRanFix = new Date();
96674
96675                         // remove hover-highlighting
96676                         utilHighlightEntities(d.issue.entityIds.concat(d.entityIds), false, context);
96677
96678                         new Promise(function(resolve, reject) {
96679                             d.onClick(context, resolve, reject);
96680                             if (d.onClick.length <= 1) {
96681                                 // if the fix doesn't take any completion parameters then consider it resolved
96682                                 resolve();
96683                             }
96684                         })
96685                         .then(function() {
96686                             // revalidate whenever the fix has finished running successfully
96687                             context.validator().validate();
96688                         });
96689                     })
96690                     .on('mouseover.highlight', function(d) {
96691                         utilHighlightEntities(d.entityIds, true, context);
96692                     })
96693                     .on('mouseout.highlight', function(d) {
96694                         utilHighlightEntities(d.entityIds, false, context);
96695                     });
96696
96697                 fixesEnter
96698                     .append('span')
96699                     .attr('class', 'fix-icon')
96700                     .each(function(d) {
96701                         var iconName = d.icon || 'iD-icon-wrench';
96702                         if (iconName.startsWith('maki')) {
96703                             iconName += '-15';
96704                         }
96705                         d3_select(this).call(svgIcon('#' + iconName));
96706                     });
96707
96708                 fixesEnter
96709                     .append('span')
96710                     .attr('class', 'fix-message')
96711                     .text(function(d) { return d.title; });
96712             }
96713
96714
96715             entityIssues.entityID = function(val) {
96716                 if (!arguments.length) return _entityID;
96717                 if (_entityID !== val) {
96718                     _entityID = val;
96719                     _activeIssueID = null;
96720                 }
96721                 return entityIssues;
96722             };
96723
96724
96725             return entityIssues;
96726         }
96727
96728         function uiEntityEditor(context) {
96729             var dispatch$1 = dispatch('choose');
96730             var _state = 'select';
96731             var _coalesceChanges = false;
96732             var _modified = false;
96733             var _scrolled = false;
96734             var _base;
96735             var _entityID;
96736             var _activePreset;
96737             var _tagReference;
96738             var _presetFavorite;
96739
96740             var entityIssues = uiEntityIssues(context);
96741             var quickLinks = uiQuickLinks();
96742             var presetEditor = uiPresetEditor(context).on('change', changeTags);
96743             var rawTagEditor = uiRawTagEditor(context).on('change', changeTags);
96744             var rawMemberEditor = uiRawMemberEditor(context);
96745             var rawMembershipEditor = uiRawMembershipEditor(context);
96746
96747             function entityEditor(selection) {
96748                 var entity = context.entity(_entityID);
96749                 var tags = Object.assign({}, entity.tags);  // shallow copy
96750
96751                 // Header
96752                 var header = selection.selectAll('.header')
96753                     .data([0]);
96754
96755                 // Enter
96756                 var headerEnter = header.enter()
96757                     .append('div')
96758                     .attr('class', 'header fillL cf');
96759
96760                 headerEnter
96761                     .append('button')
96762                     .attr('class', 'fl preset-reset preset-choose')
96763                     .call(svgIcon((textDirection === 'rtl') ? '#iD-icon-forward' : '#iD-icon-backward'));
96764
96765                 headerEnter
96766                     .append('button')
96767                     .attr('class', 'fr preset-close')
96768                     .on('click', function() { context.enter(modeBrowse(context)); })
96769                     .call(svgIcon(_modified ? '#iD-icon-apply' : '#iD-icon-close'));
96770
96771                 headerEnter
96772                     .append('h3')
96773                     .text(t('inspector.edit'));
96774
96775                 // Update
96776                 header = header
96777                     .merge(headerEnter);
96778
96779                 header.selectAll('.preset-reset')
96780                     .on('click', function() {
96781                         dispatch$1.call('choose', this, _activePreset);
96782                     });
96783
96784
96785                 // Body
96786                 var body = selection.selectAll('.inspector-body')
96787                     .data([0]);
96788
96789                 // Enter
96790                 var bodyEnter = body.enter()
96791                     .append('div')
96792                     .attr('class', 'inspector-body')
96793                     .on('scroll.entity-editor', function() { _scrolled = true; });
96794
96795                 bodyEnter
96796                     .append('div')
96797                     .attr('class', 'preset-list-item inspector-inner')
96798                     .append('div')
96799                     .attr('class', 'preset-list-button-wrap')
96800                     .append('button')
96801                     .attr('class', 'preset-list-button preset-reset')
96802                     .call(tooltip().title(t('inspector.back_tooltip')).placement('bottom'))
96803                     .append('div')
96804                     .attr('class', 'label')
96805                     .append('div')
96806                     .attr('class', 'label-inner');
96807
96808                 bodyEnter
96809                     .append('div')
96810                     .attr('class', 'preset-quick-links');
96811
96812                 bodyEnter
96813                     .append('div')
96814                     .attr('class', 'entity-issues');
96815
96816                 bodyEnter
96817                     .append('div')
96818                     .attr('class', 'preset-editor');
96819
96820                 bodyEnter
96821                     .append('div')
96822                     .attr('class', 'raw-tag-editor inspector-inner');
96823
96824                 bodyEnter
96825                     .append('div')
96826                     .attr('class', 'raw-member-editor inspector-inner');
96827
96828                 bodyEnter
96829                     .append('div')
96830                     .attr('class', 'raw-membership-editor inspector-inner');
96831
96832                 bodyEnter
96833                     .append('input')
96834                     .attr('type', 'text')
96835                     .attr('class', 'key-trap');
96836
96837
96838                 // Update
96839                 body = body
96840                     .merge(bodyEnter);
96841
96842                 if (_presetFavorite) {
96843                     body.selectAll('.preset-list-button-wrap')
96844                         .call(_presetFavorite.button);
96845                 }
96846
96847                 // update header
96848                 if (_tagReference) {
96849                     body.selectAll('.preset-list-button-wrap')
96850                         .call(_tagReference.button);
96851
96852                     body.selectAll('.preset-list-item')
96853                         .call(_tagReference.body);
96854                 }
96855
96856                 body.selectAll('.preset-reset')
96857                     .on('click', function() {
96858                         dispatch$1.call('choose', this, _activePreset);
96859                     });
96860
96861                 body.select('.preset-list-item button')
96862                     .call(uiPresetIcon(context)
96863                         .geometry(context.geometry(_entityID))
96864                         .preset(_activePreset)
96865                     );
96866
96867                 // NOTE: split on en-dash, not a hypen (to avoid conflict with hyphenated names)
96868                 var label = body.select('.label-inner');
96869                 var nameparts = label.selectAll('.namepart')
96870                     .data(_activePreset.name().split(' – '), function(d) { return d; });
96871
96872                 nameparts.exit()
96873                     .remove();
96874
96875                 nameparts
96876                     .enter()
96877                     .append('div')
96878                     .attr('class', 'namepart')
96879                     .text(function(d) { return d; });
96880
96881                 // update quick links
96882                 var choices = [{
96883                     id: 'zoom_to',
96884                     label: 'inspector.zoom_to.title',
96885                     tooltip: function() {
96886                         return uiTooltipHtml(t('inspector.zoom_to.tooltip_feature'), t('inspector.zoom_to.key'));
96887                     },
96888                     click: function zoomTo() {
96889                         context.mode().zoomToSelected();
96890                     }
96891                 }];
96892
96893                 body.select('.preset-quick-links')
96894                     .call(quickLinks.choices(choices));
96895
96896
96897                 // update editor sections
96898                 body.select('.entity-issues')
96899                     .call(entityIssues
96900                         .entityID(_entityID)
96901                     );
96902
96903                 body.select('.preset-editor')
96904                     .call(presetEditor
96905                         .preset(_activePreset)
96906                         .entityID(_entityID)
96907                         .tags(tags)
96908                         .state(_state)
96909                     );
96910
96911                 body.select('.raw-tag-editor')
96912                     .call(rawTagEditor
96913                         .preset(_activePreset)
96914                         .entityID(_entityID)
96915                         .tags(tags)
96916                         .state(_state)
96917                     );
96918
96919                 if (entity.type === 'relation') {
96920                     body.select('.raw-member-editor')
96921                         .style('display', 'block')
96922                         .call(rawMemberEditor
96923                             .entityID(_entityID)
96924                         );
96925                 } else {
96926                     body.select('.raw-member-editor')
96927                         .style('display', 'none');
96928                 }
96929
96930                 body.select('.raw-membership-editor')
96931                     .call(rawMembershipEditor
96932                         .entityID(_entityID)
96933                     );
96934
96935                 body.select('.key-trap')
96936                     .on('keydown.key-trap', function() {
96937                         // On tabbing, send focus back to the first field on the inspector-body
96938                         // (probably the `name` field) #4159
96939                         if (event.keyCode === 9 && !event.shiftKey) {
96940                             event.preventDefault();
96941                             body.select('input').node().focus();
96942                         }
96943                     });
96944
96945                 context.history()
96946                     .on('change.entity-editor', historyChanged);
96947
96948
96949                 function historyChanged(difference) {
96950                     if (_state === 'hide') return;
96951                     var significant = !difference ||
96952                             difference.didChange.properties ||
96953                             difference.didChange.addition ||
96954                             difference.didChange.deletion;
96955                     if (!significant) return;
96956
96957                     var entity = context.hasEntity(_entityID);
96958                     var graph = context.graph();
96959                     if (!entity) return;
96960
96961                     var match = context.presets().match(entity, graph);
96962                     var activePreset = entityEditor.preset();
96963                     var weakPreset = activePreset &&
96964                         Object.keys(activePreset.addTags || {}).length === 0;
96965
96966                     // A "weak" preset doesn't set any tags. (e.g. "Address")
96967                     // Don't replace a weak preset with a fallback preset (e.g. "Point")
96968                     if (!(weakPreset && match.isFallback())) {
96969                         entityEditor.preset(match);
96970                     }
96971                     entityEditor.modified(_base !== graph);
96972                     entityEditor(selection);
96973                 }
96974             }
96975
96976
96977             // Tag changes that fire on input can all get coalesced into a single
96978             // history operation when the user leaves the field.  #2342
96979             function changeTags(changed, onInput) {
96980                 var entity = context.entity(_entityID);
96981                 var annotation = t('operations.change_tags.annotation');
96982                 var tags = Object.assign({}, entity.tags);   // shallow copy
96983
96984                 for (var k in changed) {
96985                     if (!k) continue;
96986                     var v = changed[k];
96987                     if (v !== undefined || tags.hasOwnProperty(k)) {
96988                         tags[k] = v;
96989                     }
96990                 }
96991
96992                 if (!onInput) {
96993                     tags = utilCleanTags(tags);
96994                 }
96995
96996                 if (!fastDeepEqual(entity.tags, tags)) {
96997                     if (_coalesceChanges) {
96998                         context.overwrite(actionChangeTags(_entityID, tags), annotation);
96999                     } else {
97000                         context.perform(actionChangeTags(_entityID, tags), annotation);
97001                         _coalesceChanges = !!onInput;
97002                     }
97003                 }
97004
97005                 // if leaving field (blur event), rerun validation
97006                 if (!onInput) {
97007                     context.validator().validate();
97008                 }
97009             }
97010
97011
97012             entityEditor.modified = function(val) {
97013                 if (!arguments.length) return _modified;
97014                 _modified = val;
97015                 d3_selectAll('button.preset-close use')
97016                     .attr('xlink:href', (_modified ? '#iD-icon-apply' : '#iD-icon-close'));
97017                 return entityEditor;
97018             };
97019
97020
97021             entityEditor.state = function(val) {
97022                 if (!arguments.length) return _state;
97023                 _state = val;
97024                 return entityEditor;
97025             };
97026
97027
97028             entityEditor.entityID = function(val) {
97029                 if (!arguments.length) return _entityID;
97030                 if (_entityID === val) return entityEditor;  // exit early if no change
97031
97032                 _entityID = val;
97033                 _base = context.graph();
97034                 _coalesceChanges = false;
97035
97036                 // reset the scroll to the top of the inspector (warning: triggers reflow)
97037                 if (_scrolled) {
97038                     window.requestIdleCallback(function() {
97039                         var body = d3_selectAll('.entity-editor-pane .inspector-body');
97040                         if (!body.empty()) {
97041                             _scrolled = false;
97042                             body.node().scrollTop = 0;
97043                         }
97044                     });
97045                 }
97046
97047                 var presetMatch = context.presets().match(context.entity(_entityID), _base);
97048
97049                 return entityEditor
97050                     .preset(presetMatch)
97051                     .modified(false);
97052             };
97053
97054
97055             entityEditor.preset = function(val) {
97056                 if (!arguments.length) return _activePreset;
97057                 if (val !== _activePreset) {
97058                     _activePreset = val;
97059                     _tagReference = uiTagReference(_activePreset.reference(context.geometry(_entityID)))
97060                         .showing(false);
97061                 }
97062                 _presetFavorite = uiPresetFavoriteButton(_activePreset, context.geometry(_entityID), context);
97063                 return entityEditor;
97064             };
97065
97066
97067             return utilRebind(entityEditor, dispatch$1, 'on');
97068         }
97069
97070         function uiPresetList(context) {
97071             var dispatch$1 = dispatch('choose');
97072             var _entityID;
97073             var _currentPreset;
97074             var _autofocus = false;
97075             var geocoder = services$1.geocoder;
97076
97077
97078             function presetList(selection) {
97079                 var entity = context.entity(_entityID);
97080                 var geometry = context.geometry(_entityID);
97081
97082                 // Treat entities on addr:interpolation lines as points, not vertices (#3241)
97083                 if (geometry === 'vertex' && entity.isOnAddressLine(context.graph())) {
97084                     geometry = 'point';
97085                 }
97086
97087                 var presets = context.presets().matchGeometry(geometry);
97088
97089                 selection.html('');
97090
97091                 var messagewrap = selection
97092                     .append('div')
97093                     .attr('class', 'header fillL');
97094
97095                 var message = messagewrap
97096                     .append('h3')
97097                     .text(t('inspector.choose'));
97098
97099                 messagewrap
97100                     .append('button')
97101                     .attr('class', 'preset-choose')
97102                     .on('click', function() { dispatch$1.call('choose', this, _currentPreset); })
97103                     .call(svgIcon((textDirection === 'rtl') ? '#iD-icon-backward' : '#iD-icon-forward'));
97104
97105                 function initialKeydown() {
97106                     // hack to let delete shortcut work when search is autofocused
97107                     if (search.property('value').length === 0 &&
97108                         (event.keyCode === utilKeybinding.keyCodes['⌫'] ||
97109                          event.keyCode === utilKeybinding.keyCodes['⌦'])) {
97110                         event.preventDefault();
97111                         event.stopPropagation();
97112                         operationDelete([_entityID], context)();
97113
97114                     // hack to let undo work when search is autofocused
97115                     } else if (search.property('value').length === 0 &&
97116                         (event.ctrlKey || event.metaKey) &&
97117                         event.keyCode === utilKeybinding.keyCodes.z) {
97118                         event.preventDefault();
97119                         event.stopPropagation();
97120                         context.undo();
97121                     } else if (!event.ctrlKey && !event.metaKey) {
97122                         // don't check for delete/undo hack on future keydown events
97123                         d3_select(this).on('keydown', keydown);
97124                         keydown.call(this);
97125                     }
97126                 }
97127
97128                 function keydown() {
97129                     // down arrow
97130                     if (event.keyCode === utilKeybinding.keyCodes['↓'] &&
97131                         // if insertion point is at the end of the string
97132                         search.node().selectionStart === search.property('value').length) {
97133                         event.preventDefault();
97134                         event.stopPropagation();
97135                         // move focus to the first item in the preset list
97136                         var buttons = list.selectAll('.preset-list-button');
97137                         if (!buttons.empty()) buttons.nodes()[0].focus();
97138                     }
97139                 }
97140
97141                 function keypress() {
97142                     // enter
97143                     var value = search.property('value');
97144                     if (event.keyCode === 13 && value.length) {
97145                         list.selectAll('.preset-list-item:first-child')
97146                             .each(function(d) { d.choose.call(this); });
97147                     }
97148                 }
97149
97150                 function inputevent() {
97151                     var value = search.property('value');
97152                     list.classed('filtered', value.length);
97153                     if (value.length) {
97154                         var entity = context.entity(_entityID);
97155                         if (geocoder && entity) {
97156                             var center = entity.extent(context.graph()).center();
97157                             geocoder.countryCode(center, function countryCallback(err, countryCode) {
97158                                 // get the input value again because it may have changed
97159                                 var currentValue = search.property('value');
97160
97161                                 if (!currentValue.length) return;
97162
97163                                 var results;
97164                                 if (!err && countryCode) {
97165                                     countryCode = countryCode.toLowerCase();
97166                                     results = presets.search(currentValue, geometry, countryCode);
97167                                 } else {
97168                                     results = presets.search(currentValue, geometry);
97169                                 }
97170                                 message.text(t('inspector.results', {
97171                                     n: results.collection.length,
97172                                     search: currentValue
97173                                 }));
97174                                 list.call(drawList, results);
97175                             });
97176                         }
97177                     } else {
97178                         list.call(drawList, context.presets().defaults(geometry, 36));
97179                         message.text(t('inspector.choose'));
97180                     }
97181                 }
97182
97183                 var searchWrap = selection
97184                     .append('div')
97185                     .attr('class', 'search-header');
97186
97187                 var search = searchWrap
97188                     .append('input')
97189                     .attr('class', 'preset-search-input')
97190                     .attr('placeholder', t('inspector.search'))
97191                     .attr('type', 'search')
97192                     .call(utilNoAuto)
97193                     .on('keydown', initialKeydown)
97194                     .on('keypress', keypress)
97195                     .on('input', inputevent);
97196
97197                 searchWrap
97198                     .call(svgIcon('#iD-icon-search', 'pre-text'));
97199
97200                 if (_autofocus) {
97201                     search.node().focus();
97202                 }
97203
97204                 var listWrap = selection
97205                     .append('div')
97206                     .attr('class', 'inspector-body');
97207
97208                 var list = listWrap
97209                     .append('div')
97210                     .attr('class', 'preset-list fillL cf')
97211                     .call(drawList, context.presets().defaults(geometry, 36));
97212
97213                 context.features().on('change.preset-list', updateForFeatureHiddenState);
97214             }
97215
97216
97217             function drawList(list, presets) {
97218                 var collection = presets.collection.reduce(function(collection, preset) {
97219                     if (preset.members) {
97220                         if (preset.members.collection.filter(function(preset) {
97221                             return preset.visible();
97222                         }).length > 1) {
97223                             collection.push(CategoryItem(preset));
97224                         }
97225                     } else if (preset.visible()) {
97226                         collection.push(PresetItem(preset));
97227                     }
97228                     return collection;
97229                 }, []);
97230
97231                 var items = list.selectAll('.preset-list-item')
97232                     .data(collection, function(d) { return d.preset.id; });
97233
97234                 items.order();
97235
97236                 items.exit()
97237                     .remove();
97238
97239                 items.enter()
97240                     .append('div')
97241                     .attr('class', function(item) { return 'preset-list-item preset-' + item.preset.id.replace('/', '-'); })
97242                     .classed('current', function(item) { return item.preset === _currentPreset; })
97243                     .each(function(item) { d3_select(this).call(item); })
97244                     .style('opacity', 0)
97245                     .transition()
97246                     .style('opacity', 1);
97247
97248                 updateForFeatureHiddenState();
97249             }
97250
97251             function itemKeydown(){
97252                 // the actively focused item
97253                 var item = d3_select(this.closest('.preset-list-item'));
97254                 var parentItem = d3_select(item.node().parentNode.closest('.preset-list-item'));
97255
97256                 // arrow down, move focus to the next, lower item
97257                 if (event.keyCode === utilKeybinding.keyCodes['↓']) {
97258                     event.preventDefault();
97259                     event.stopPropagation();
97260                     // the next item in the list at the same level
97261                     var nextItem = d3_select(item.node().nextElementSibling);
97262                     // if there is no next item in this list
97263                     if (nextItem.empty()) {
97264                         // if there is a parent item
97265                         if (!parentItem.empty()) {
97266                             // the item is the last item of a sublist,
97267                             // select the next item at the parent level
97268                             nextItem = d3_select(parentItem.node().nextElementSibling);
97269                         }
97270                     // if the focused item is expanded
97271                     } else if (d3_select(this).classed('expanded')) {
97272                         // select the first subitem instead
97273                         nextItem = item.select('.subgrid .preset-list-item:first-child');
97274                     }
97275                     if (!nextItem.empty()) {
97276                         // focus on the next item
97277                         nextItem.select('.preset-list-button').node().focus();
97278                     }
97279
97280                 // arrow up, move focus to the previous, higher item
97281                 } else if (event.keyCode === utilKeybinding.keyCodes['↑']) {
97282                     event.preventDefault();
97283                     event.stopPropagation();
97284                     // the previous item in the list at the same level
97285                     var previousItem = d3_select(item.node().previousElementSibling);
97286
97287                     // if there is no previous item in this list
97288                     if (previousItem.empty()) {
97289                         // if there is a parent item
97290                         if (!parentItem.empty()) {
97291                             // the item is the first subitem of a sublist select the parent item
97292                             previousItem = parentItem;
97293                         }
97294                     // if the previous item is expanded
97295                     } else if (previousItem.select('.preset-list-button').classed('expanded')) {
97296                         // select the last subitem of the sublist of the previous item
97297                         previousItem = previousItem.select('.subgrid .preset-list-item:last-child');
97298                     }
97299
97300                     if (!previousItem.empty()) {
97301                         // focus on the previous item
97302                         previousItem.select('.preset-list-button').node().focus();
97303                     } else {
97304                         // the focus is at the top of the list, move focus back to the search field
97305                         var search = d3_select(this.closest('.preset-list-pane')).select('.preset-search-input');
97306                         search.node().focus();
97307                     }
97308
97309                 // arrow left, move focus to the parent item if there is one
97310                 } else if (event.keyCode === utilKeybinding.keyCodes[(textDirection === 'rtl') ? '→' : '←']) {
97311                     event.preventDefault();
97312                     event.stopPropagation();
97313                     // if there is a parent item, focus on the parent item
97314                     if (!parentItem.empty()) {
97315                         parentItem.select('.preset-list-button').node().focus();
97316                     }
97317
97318                 // arrow right, choose this item
97319                 } else if (event.keyCode === utilKeybinding.keyCodes[(textDirection === 'rtl') ? '←' : '→']) {
97320                     event.preventDefault();
97321                     event.stopPropagation();
97322                     item.datum().choose.call(d3_select(this).node());
97323                 }
97324             }
97325
97326
97327             function CategoryItem(preset) {
97328                 var box, sublist, shown = false;
97329
97330                 function item(selection) {
97331                     var wrap = selection.append('div')
97332                         .attr('class', 'preset-list-button-wrap category');
97333
97334                     function click() {
97335                         var isExpanded = d3_select(this).classed('expanded');
97336                         var iconName = isExpanded ?
97337                             (textDirection === 'rtl' ? '#iD-icon-backward' : '#iD-icon-forward') : '#iD-icon-down';
97338                         d3_select(this)
97339                             .classed('expanded', !isExpanded);
97340                         d3_select(this).selectAll('div.label-inner svg.icon use')
97341                             .attr('href', iconName);
97342                         item.choose();
97343                     }
97344
97345                     var button = wrap
97346                         .append('button')
97347                         .attr('class', 'preset-list-button')
97348                         .classed('expanded', false)
97349                         .call(uiPresetIcon(context)
97350                             .geometry(context.geometry(_entityID))
97351                             .preset(preset))
97352                         .on('click', click)
97353                         .on('keydown', function() {
97354                             // right arrow, expand the focused item
97355                             if (event.keyCode === utilKeybinding.keyCodes[(textDirection === 'rtl') ? '←' : '→']) {
97356                                 event.preventDefault();
97357                                 event.stopPropagation();
97358                                 // if the item isn't expanded
97359                                 if (!d3_select(this).classed('expanded')) {
97360                                     // toggle expansion (expand the item)
97361                                     click.call(this);
97362                                 }
97363                             // left arrow, collapse the focused item
97364                             } else if (event.keyCode === utilKeybinding.keyCodes[(textDirection === 'rtl') ? '→' : '←']) {
97365                                 event.preventDefault();
97366                                 event.stopPropagation();
97367                                 // if the item is expanded
97368                                 if (d3_select(this).classed('expanded')) {
97369                                     // toggle expansion (collapse the item)
97370                                     click.call(this);
97371                                 }
97372                             } else {
97373                                 itemKeydown.call(this);
97374                             }
97375                         });
97376
97377                     var label = button
97378                         .append('div')
97379                         .attr('class', 'label')
97380                         .append('div')
97381                         .attr('class', 'label-inner');
97382
97383                     label
97384                         .append('div')
97385                         .attr('class', 'namepart')
97386                         .call(svgIcon((textDirection === 'rtl' ? '#iD-icon-backward' : '#iD-icon-forward'), 'inline'))
97387                         .append('span')
97388                         .html(function() { return preset.name() + '&hellip;'; });
97389
97390                     box = selection.append('div')
97391                         .attr('class', 'subgrid')
97392                         .style('max-height', '0px')
97393                         .style('opacity', 0);
97394
97395                     box.append('div')
97396                         .attr('class', 'arrow');
97397
97398                     sublist = box.append('div')
97399                         .attr('class', 'preset-list fillL3');
97400                 }
97401
97402
97403                 item.choose = function() {
97404                     if (!box || !sublist) return;
97405
97406                     if (shown) {
97407                         shown = false;
97408                         box.transition()
97409                             .duration(200)
97410                             .style('opacity', '0')
97411                             .style('max-height', '0px')
97412                             .style('padding-bottom', '0px');
97413                     } else {
97414                         shown = true;
97415                         var members = preset.members.matchGeometry(context.geometry(_entityID));
97416                         sublist.call(drawList, members);
97417                         box.transition()
97418                             .duration(200)
97419                             .style('opacity', '1')
97420                             .style('max-height', 200 + members.collection.length * 190 + 'px')
97421                             .style('padding-bottom', '10px');
97422                     }
97423                 };
97424
97425                 item.preset = preset;
97426                 return item;
97427             }
97428
97429
97430             function PresetItem(preset) {
97431                 function item(selection) {
97432                     var wrap = selection.append('div')
97433                         .attr('class', 'preset-list-button-wrap');
97434
97435                     var button = wrap.append('button')
97436                         .attr('class', 'preset-list-button')
97437                         .call(uiPresetIcon(context)
97438                             .geometry(context.geometry(_entityID))
97439                             .preset(preset))
97440                         .on('click', item.choose)
97441                         .on('keydown', itemKeydown);
97442
97443                     var label = button
97444                         .append('div')
97445                         .attr('class', 'label')
97446                         .append('div')
97447                         .attr('class', 'label-inner');
97448
97449                     // NOTE: split/join on en-dash, not a hypen (to avoid conflict with fr - nl names in Brussels etc)
97450                     label.selectAll('.namepart')
97451                         .data(preset.name().split(' – '))
97452                         .enter()
97453                         .append('div')
97454                         .attr('class', 'namepart')
97455                         .text(function(d) { return d; });
97456
97457                     wrap.call(item.reference.button);
97458                     selection.call(item.reference.body);
97459                 }
97460
97461                 item.choose = function() {
97462                     if (d3_select(this).classed('disabled')) return;
97463
97464                     context.presets().setMostRecent(preset, context.geometry(_entityID));
97465                     context.perform(
97466                         actionChangePreset(_entityID, _currentPreset, preset),
97467                         t('operations.change_tags.annotation')
97468                     );
97469
97470                     context.validator().validate();  // rerun validation
97471                     dispatch$1.call('choose', this, preset);
97472                 };
97473
97474                 item.help = function() {
97475                     event.stopPropagation();
97476                     item.reference.toggle();
97477                 };
97478
97479                 item.preset = preset;
97480                 item.reference = uiTagReference(preset.reference(context.geometry(_entityID)));
97481
97482                 return item;
97483             }
97484
97485
97486             function updateForFeatureHiddenState() {
97487                 if (!context.hasEntity(_entityID)) return;
97488
97489                 var geometry = context.geometry(_entityID);
97490                 var button = d3_selectAll('.preset-list .preset-list-button');
97491
97492                 // remove existing tooltips
97493                 button.call(tooltip().destroyAny);
97494
97495                 button.each(function(item, index) {
97496                     var hiddenPresetFeaturesId = context.features().isHiddenPreset(item.preset, geometry);
97497                     var isHiddenPreset = !!hiddenPresetFeaturesId && item.preset !== _currentPreset;
97498
97499                     d3_select(this)
97500                         .classed('disabled', isHiddenPreset);
97501
97502                     if (isHiddenPreset) {
97503                         var isAutoHidden = context.features().autoHidden(hiddenPresetFeaturesId);
97504                         var tooltipIdSuffix = isAutoHidden ? 'zoom' : 'manual';
97505                         var tooltipObj = { features: t('feature.' + hiddenPresetFeaturesId + '.description') };
97506                         d3_select(this).call(tooltip()
97507                             .title(t('inspector.hidden_preset.' + tooltipIdSuffix, tooltipObj))
97508                             .placement(index < 2 ? 'bottom' : 'top')
97509                         );
97510                     }
97511                 });
97512             }
97513
97514             presetList.autofocus = function(val) {
97515                 if (!arguments.length) return _autofocus;
97516                 _autofocus = val;
97517                 return presetList;
97518             };
97519
97520
97521             presetList.entityID = function(val) {
97522                 if (!arguments.length) return _entityID;
97523                 _entityID = val;
97524                 presetList.preset(context.presets().match(context.entity(_entityID), context.graph()));
97525                 return presetList;
97526             };
97527
97528
97529             presetList.preset = function(val) {
97530                 if (!arguments.length) return _currentPreset;
97531                 _currentPreset = val;
97532                 return presetList;
97533             };
97534
97535
97536             return utilRebind(presetList, dispatch$1, 'on');
97537         }
97538
97539         function uiInspector(context) {
97540             var presetList = uiPresetList(context);
97541             var entityEditor = uiEntityEditor(context);
97542             var wrap = d3_select(null),
97543                 presetPane = d3_select(null),
97544                 editorPane = d3_select(null);
97545             var _state = 'select';
97546             var _entityID;
97547             var _newFeature = false;
97548
97549
97550             function inspector(selection, newFeature) {
97551                 presetList
97552                     .entityID(_entityID)
97553                     .autofocus(_newFeature)
97554                     .on('choose', inspector.setPreset);
97555
97556                 entityEditor
97557                     .state(_state)
97558                     .entityID(_entityID)
97559                     .on('choose', inspector.showList);
97560
97561                 wrap = selection.selectAll('.panewrap')
97562                     .data([0]);
97563
97564                 var enter = wrap.enter()
97565                     .append('div')
97566                     .attr('class', 'panewrap');
97567
97568                 enter
97569                     .append('div')
97570                     .attr('class', 'preset-list-pane pane');
97571
97572                 enter
97573                     .append('div')
97574                     .attr('class', 'entity-editor-pane pane');
97575
97576                 wrap = wrap.merge(enter);
97577                 presetPane = wrap.selectAll('.preset-list-pane');
97578                 editorPane = wrap.selectAll('.entity-editor-pane');
97579
97580                 var entity = context.entity(_entityID);
97581
97582                 var hasNonGeometryTags = entity.hasNonGeometryTags();
97583                 var isTaglessOrIntersectionVertex = entity.geometry(context.graph()) === 'vertex' &&
97584                     (!hasNonGeometryTags && !entity.isHighwayIntersection(context.graph()));
97585                 var issues = context.validator().getEntityIssues(_entityID);
97586                 // start with the preset list if the feature is new and untagged or is an uninteresting vertex
97587                 var showPresetList = (newFeature && !hasNonGeometryTags) || (isTaglessOrIntersectionVertex && !issues.length);
97588
97589                 if (showPresetList) {
97590                     wrap.style('right', '-100%');
97591                     presetPane.call(presetList);
97592                 } else {
97593                     wrap.style('right', '0%');
97594                     editorPane.call(entityEditor);
97595                 }
97596
97597                 var footer = selection.selectAll('.footer')
97598                     .data([0]);
97599
97600                 footer = footer.enter()
97601                     .append('div')
97602                     .attr('class', 'footer')
97603                     .merge(footer);
97604
97605                 footer
97606                     .call(uiViewOnOSM(context)
97607                         .what(context.hasEntity(_entityID))
97608                     );
97609             }
97610
97611             inspector.showList = function(preset) {
97612                 wrap.transition()
97613                     .styleTween('right', function() { return d3_interpolate('0%', '-100%'); });
97614
97615                 presetPane
97616                     .call(presetList.preset(preset).autofocus(true));
97617             };
97618
97619             inspector.setPreset = function(preset) {
97620
97621                 // upon setting multipolygon, go to the area preset list instead of the editor
97622                 if (preset.id === 'type/multipolygon') {
97623                     presetPane
97624                         .call(presetList.preset(preset).autofocus(true));
97625
97626                 } else {
97627                     wrap.transition()
97628                         .styleTween('right', function() { return d3_interpolate('-100%', '0%'); });
97629
97630                     editorPane
97631                         .call(entityEditor.preset(preset));
97632                 }
97633
97634             };
97635
97636             inspector.state = function(val) {
97637                 if (!arguments.length) return _state;
97638                 _state = val;
97639                 entityEditor.state(_state);
97640
97641                 // remove any old field help overlay that might have gotten attached to the inspector
97642                 d3_selectAll('.field-help-body').remove();
97643
97644                 return inspector;
97645             };
97646
97647
97648             inspector.entityID = function(val) {
97649                 if (!arguments.length) return _entityID;
97650                 _entityID = val;
97651                 return inspector;
97652             };
97653
97654
97655             inspector.newFeature = function(val) {
97656                 if (!arguments.length) return _newFeature;
97657                 _newFeature = val;
97658                 return inspector;
97659             };
97660
97661
97662             return inspector;
97663         }
97664
97665         function uiSidebar(context) {
97666             var inspector = uiInspector(context);
97667             var dataEditor = uiDataEditor(context);
97668             var noteEditor = uiNoteEditor(context);
97669             var improveOsmEditor = uiImproveOsmEditor(context);
97670             var keepRightEditor = uiKeepRightEditor(context);
97671             var _current;
97672             var _wasData = false;
97673             var _wasNote = false;
97674             var _wasQAError = false;
97675
97676
97677             function sidebar(selection) {
97678                 var container = d3_select('#id-container');
97679                 var minWidth = 280;
97680                 var sidebarWidth;
97681                 var containerWidth;
97682                 var dragOffset;
97683
97684                 var resizer = selection
97685                     .append('div')
97686                     .attr('id', 'sidebar-resizer');
97687
97688                 // Set the initial width constraints
97689                 selection
97690                     .style('min-width', minWidth + 'px')
97691                     .style('max-width', '400px')
97692                     .style('width', '33.3333%');
97693
97694                 resizer.call(d3_drag()
97695                     .container(container.node())
97696                     .on('start', function() {
97697                         // offset from edge of sidebar-resizer
97698                         dragOffset = event.sourceEvent.offsetX - 1;
97699
97700                         sidebarWidth = selection.node().getBoundingClientRect().width;
97701                         containerWidth = container.node().getBoundingClientRect().width;
97702                         var widthPct = (sidebarWidth / containerWidth) * 100;
97703                         selection
97704                             .style('width', widthPct + '%')    // lock in current width
97705                             .style('max-width', '85%');        // but allow larger widths
97706
97707                         resizer.classed('dragging', true);
97708                     })
97709                     .on('drag', function() {
97710                         var isRTL = (textDirection === 'rtl');
97711                         var scaleX = isRTL ? 0 : 1;
97712                         var xMarginProperty = isRTL ? 'margin-right' : 'margin-left';
97713
97714                         var x = event.x - dragOffset;
97715                         sidebarWidth = isRTL ? containerWidth - x : x;
97716
97717                         var isCollapsed = selection.classed('collapsed');
97718                         var shouldCollapse = sidebarWidth < minWidth;
97719
97720                         selection.classed('collapsed', shouldCollapse);
97721
97722                         if (shouldCollapse) {
97723                             if (!isCollapsed) {
97724                                 selection
97725                                     .style(xMarginProperty, '-400px')
97726                                     .style('width', '400px');
97727
97728                                 context.ui().onResize([(sidebarWidth - event.dx) * scaleX, 0]);
97729                             }
97730
97731                         } else {
97732                             var widthPct = (sidebarWidth / containerWidth) * 100;
97733                             selection
97734                                 .style(xMarginProperty, null)
97735                                 .style('width', widthPct + '%');
97736
97737                             if (isCollapsed) {
97738                                 context.ui().onResize([-sidebarWidth * scaleX, 0]);
97739                             } else {
97740                                 context.ui().onResize([-event.dx * scaleX, 0]);
97741                             }
97742                         }
97743                     })
97744                     .on('end', function() {
97745                         resizer.classed('dragging', false);
97746                     })
97747                 );
97748
97749                 var featureListWrap = selection
97750                     .append('div')
97751                     .attr('class', 'feature-list-pane')
97752                     .call(uiFeatureList(context));
97753
97754                 var inspectorWrap = selection
97755                     .append('div')
97756                     .attr('class', 'inspector-hidden inspector-wrap fr');
97757
97758
97759                 function hover(datum) {
97760                     if (datum && datum.__featurehash__) {   // hovering on data
97761                         _wasData = true;
97762                         sidebar
97763                             .show(dataEditor.datum(datum));
97764
97765                         selection.selectAll('.sidebar-component')
97766                             .classed('inspector-hover', true);
97767
97768                     } else if (datum instanceof osmNote) {
97769                         if (context.mode().id === 'drag-note') return;
97770                         _wasNote = true;
97771
97772                         var osm = services$1.osm;
97773                         if (osm) {
97774                             datum = osm.getNote(datum.id);   // marker may contain stale data - get latest
97775                         }
97776
97777                         sidebar
97778                             .show(noteEditor.note(datum));
97779
97780                         selection.selectAll('.sidebar-component')
97781                             .classed('inspector-hover', true);
97782
97783                     } else if (datum instanceof qaError) {
97784                         _wasQAError = true;
97785
97786                         var errService = services$1[datum.service];
97787                         if (errService) {
97788                             // marker may contain stale data - get latest
97789                             datum = errService.getError(datum.id);
97790                         }
97791
97792                         // Temporary solution while only two services
97793                         var errEditor = (datum.service === 'keepRight') ? keepRightEditor : improveOsmEditor;
97794
97795                         d3_selectAll('.qa_error.' + datum.service)
97796                             .classed('hover', function(d) { return d.id === datum.id; });
97797
97798                         sidebar
97799                             .show(errEditor.error(datum));
97800
97801                         selection.selectAll('.sidebar-component')
97802                             .classed('inspector-hover', true);
97803
97804                     } else if (!_current && (datum instanceof osmEntity)) {
97805                         featureListWrap
97806                             .classed('inspector-hidden', true);
97807
97808                         inspectorWrap
97809                             .classed('inspector-hidden', false)
97810                             .classed('inspector-hover', true);
97811
97812                         if (inspector.entityID() !== datum.id || inspector.state() !== 'hover') {
97813                             inspector
97814                                 .state('hover')
97815                                 .entityID(datum.id);
97816
97817                             inspectorWrap
97818                                 .call(inspector);
97819                         }
97820
97821                     } else if (!_current) {
97822                         featureListWrap
97823                             .classed('inspector-hidden', false);
97824                         inspectorWrap
97825                             .classed('inspector-hidden', true);
97826                         inspector
97827                             .state('hide');
97828
97829                     } else if (_wasData || _wasNote || _wasQAError) {
97830                         _wasNote = false;
97831                         _wasData = false;
97832                         _wasQAError = false;
97833                         d3_selectAll('.note').classed('hover', false);
97834                         d3_selectAll('.qa_error').classed('hover', false);
97835                         sidebar.hide();
97836                     }
97837                 }
97838
97839                 sidebar.hover = throttle(hover, 200);
97840
97841
97842                 sidebar.intersects = function(extent) {
97843                     var rect = selection.node().getBoundingClientRect();
97844                     return extent.intersects([
97845                         context.projection.invert([0, rect.height]),
97846                         context.projection.invert([rect.width, 0])
97847                     ]);
97848                 };
97849
97850
97851                 sidebar.select = function(id, newFeature) {
97852                     sidebar.hide();
97853
97854                     if (id) {
97855                         var entity = context.entity(id);
97856                         // uncollapse the sidebar
97857                         if (selection.classed('collapsed')) {
97858                             if (newFeature) {
97859                                 var extent = entity.extent(context.graph());
97860                                 sidebar.expand(sidebar.intersects(extent));
97861                             }
97862                         }
97863
97864                         featureListWrap
97865                             .classed('inspector-hidden', true);
97866
97867                         inspectorWrap
97868                             .classed('inspector-hidden', false)
97869                             .classed('inspector-hover', false);
97870
97871                         if (inspector.entityID() !== id || inspector.state() !== 'select') {
97872                             inspector
97873                                 .state('select')
97874                                 .entityID(id)
97875                                 .newFeature(newFeature);
97876
97877                             inspectorWrap
97878                                 .call(inspector, newFeature);
97879                         }
97880
97881                         sidebar.showPresetList = function() {
97882                             inspector.showList(context.presets().match(entity, context.graph()));
97883                         };
97884
97885                     } else {
97886                         inspector
97887                             .state('hide');
97888                     }
97889                 };
97890
97891
97892                 sidebar.show = function(component, element) {
97893                     featureListWrap
97894                         .classed('inspector-hidden', true);
97895                     inspectorWrap
97896                         .classed('inspector-hidden', true);
97897
97898                     if (_current) _current.remove();
97899                     _current = selection
97900                         .append('div')
97901                         .attr('class', 'sidebar-component')
97902                         .call(component, element);
97903                 };
97904
97905
97906                 sidebar.hide = function() {
97907                     featureListWrap
97908                         .classed('inspector-hidden', false);
97909                     inspectorWrap
97910                         .classed('inspector-hidden', true);
97911
97912                     if (_current) _current.remove();
97913                     _current = null;
97914                 };
97915
97916
97917                 sidebar.expand = function(moveMap) {
97918                     if (selection.classed('collapsed')) {
97919                         sidebar.toggle(moveMap);
97920                     }
97921                 };
97922
97923
97924                 sidebar.collapse = function(moveMap) {
97925                     if (!selection.classed('collapsed')) {
97926                         sidebar.toggle(moveMap);
97927                     }
97928                 };
97929
97930
97931                 sidebar.toggle = function(moveMap) {
97932                     var e = event;
97933                     if (e && e.sourceEvent) {
97934                         e.sourceEvent.preventDefault();
97935                     } else if (e) {
97936                         e.preventDefault();
97937                     }
97938
97939                     // Don't allow sidebar to toggle when the user is in the walkthrough.
97940                     if (context.inIntro()) return;
97941
97942                     var isCollapsed = selection.classed('collapsed');
97943                     var isCollapsing = !isCollapsed;
97944                     var isRTL = (textDirection === 'rtl');
97945                     var scaleX = isRTL ? 0 : 1;
97946                     var xMarginProperty = isRTL ? 'margin-right' : 'margin-left';
97947
97948                     sidebarWidth = selection.node().getBoundingClientRect().width;
97949
97950                     // switch from % to px
97951                     selection.style('width', sidebarWidth + 'px');
97952
97953                     var startMargin, endMargin, lastMargin;
97954                     if (isCollapsing) {
97955                         startMargin = lastMargin = 0;
97956                         endMargin = -sidebarWidth;
97957                     } else {
97958                         startMargin = lastMargin = -sidebarWidth;
97959                         endMargin = 0;
97960                     }
97961
97962                     selection.transition()
97963                         .style(xMarginProperty, endMargin + 'px')
97964                         .tween('panner', function() {
97965                             var i = d3_interpolateNumber(startMargin, endMargin);
97966                             return function(t) {
97967                                 var dx = lastMargin - Math.round(i(t));
97968                                 lastMargin = lastMargin - dx;
97969                                 context.ui().onResize(moveMap ? undefined : [dx * scaleX, 0]);
97970                             };
97971                         })
97972                         .on('end', function() {
97973                             selection.classed('collapsed', isCollapsing);
97974
97975                             // switch back from px to %
97976                             if (!isCollapsing) {
97977                                 var containerWidth = container.node().getBoundingClientRect().width;
97978                                 var widthPct = (sidebarWidth / containerWidth) * 100;
97979                                 selection
97980                                     .style(xMarginProperty, null)
97981                                     .style('width', widthPct + '%');
97982                             }
97983                         });
97984                 };
97985
97986                 // toggle the sidebar collapse when double-clicking the resizer
97987                 resizer.on('dblclick', sidebar.toggle);
97988             }
97989
97990             sidebar.showPresetList = function() {};
97991             sidebar.hover = function() {};
97992             sidebar.hover.cancel = function() {};
97993             sidebar.intersects = function() {};
97994             sidebar.select = function() {};
97995             sidebar.show = function() {};
97996             sidebar.hide = function() {};
97997             sidebar.expand = function() {};
97998             sidebar.collapse = function() {};
97999             sidebar.toggle = function() {};
98000
98001             return sidebar;
98002         }
98003
98004         function uiSpinner(context) {
98005             var osm = context.connection();
98006
98007
98008             return function(selection) {
98009                 var img = selection
98010                     .append('img')
98011                     .attr('src', context.imagePath('loader-black.gif'))
98012                     .style('opacity', 0);
98013
98014                 if (osm) {
98015                     osm
98016                         .on('loading.spinner', function() {
98017                             img.transition()
98018                                 .style('opacity', 1);
98019                         })
98020                         .on('loaded.spinner', function() {
98021                             img.transition()
98022                                 .style('opacity', 0);
98023                         });
98024                 }
98025             };
98026         }
98027
98028         function uiSplash(context) {
98029
98030             return function(selection) {
98031                 if (context.storage('sawSplash'))
98032                      return;
98033
98034                 context.storage('sawSplash', true);
98035
98036                 var modalSelection = uiModal(selection);
98037
98038                 modalSelection.select('.modal')
98039                     .attr('class', 'modal-splash modal');
98040
98041                 var introModal = modalSelection.select('.content')
98042                     .append('div')
98043                     .attr('class', 'fillL');
98044
98045                 introModal
98046                     .append('div')
98047                     .attr('class','modal-section')
98048                     .append('h3').text(t('splash.welcome'));
98049
98050                 introModal
98051                     .append('div')
98052                     .attr('class','modal-section')
98053                     .append('p')
98054                     .html(t('splash.text', {
98055                         version: context.version,
98056                         website: '<a href="http://ideditor.com/">ideditor.com</a>',
98057                         github: '<a href="https://github.com/openstreetmap/iD">github.com</a>'
98058                     }));
98059
98060                 var buttonWrap = introModal
98061                     .append('div')
98062                     .attr('class', 'modal-actions');
98063
98064                 var walkthrough = buttonWrap
98065                     .append('button')
98066                     .attr('class', 'walkthrough')
98067                     .on('click', function() {
98068                         context.container().call(uiIntro(context));
98069                         modalSelection.close();
98070                     });
98071
98072                 walkthrough
98073                     .append('svg')
98074                     .attr('class', 'logo logo-walkthrough')
98075                     .append('use')
98076                     .attr('xlink:href', '#iD-logo-walkthrough');
98077
98078                 walkthrough
98079                     .append('div')
98080                     .text(t('splash.walkthrough'));
98081
98082                 var startEditing = buttonWrap
98083                     .append('button')
98084                     .attr('class', 'start-editing')
98085                     .on('click', modalSelection.close);
98086
98087                 startEditing
98088                     .append('svg')
98089                     .attr('class', 'logo logo-features')
98090                     .append('use')
98091                     .attr('xlink:href', '#iD-logo-features');
98092
98093                 startEditing
98094                     .append('div')
98095                     .text(t('splash.start'));
98096
98097
98098                 modalSelection.select('button.close')
98099                     .attr('class','hide');
98100
98101             };
98102         }
98103
98104         function uiStatus(context) {
98105             var osm = context.connection();
98106
98107
98108             return function(selection) {
98109                 if (!osm) return;
98110
98111                 function update() {
98112                     osm.status(function(err, apiStatus) {
98113                         selection.html('');
98114
98115                         if (err) {
98116                             if (apiStatus === 'connectionSwitched') {
98117                                 // if the connection was just switched, we can't rely on
98118                                 // the status (we're getting the status of the previous api)
98119                                 return;
98120
98121                             } else if (apiStatus === 'rateLimited') {
98122                                 selection
98123                                     .text(t('status.rateLimit'))
98124                                     .append('a')
98125                                     .attr('class', 'api-status-login')
98126                                     .attr('target', '_blank')
98127                                     .call(svgIcon('#iD-icon-out-link', 'inline'))
98128                                     .append('span')
98129                                     .text(t('login'))
98130                                     .on('click.login', function() {
98131                                         event.preventDefault();
98132                                         osm.authenticate();
98133                                     });
98134                             } else {
98135                                 // eslint-disable-next-line no-warning-comments
98136                                 // TODO: nice messages for different error types
98137                                 selection.text(t('status.error'));
98138                             }
98139
98140                         } else if (apiStatus === 'readonly') {
98141                             selection.text(t('status.readonly'));
98142                         } else if (apiStatus === 'offline') {
98143                             selection.text(t('status.offline'));
98144                         }
98145
98146                         selection.attr('class', 'api-status ' + (err ? 'error' : apiStatus));
98147                     });
98148                 }
98149
98150                 osm.on('change', function() { update(); });
98151
98152                 window.setInterval(update, 90000);
98153                 update();
98154             };
98155         }
98156
98157         function modeDrawArea(context, wayID, startGraph, baselineGraph, button) {
98158             var mode = {
98159                 button: button,
98160                 id: 'draw-area'
98161             };
98162
98163             var behavior;
98164
98165             mode.wayID = wayID;
98166
98167             mode.enter = function() {
98168                 var way = context.entity(wayID);
98169
98170                 behavior = behaviorDrawWay(context, wayID, undefined, mode, startGraph, baselineGraph)
98171                     .tail(t('modes.draw_area.tail'));
98172
98173                 var addNode = behavior.addNode;
98174
98175                 behavior.addNode = function(node, d) {
98176                     var length = way.nodes.length;
98177                     var penultimate = length > 2 ? way.nodes[length - 2] : null;
98178
98179                     if (node.id === way.first() || node.id === penultimate) {
98180                         behavior.finish();
98181                     } else {
98182                         addNode(node, d);
98183                     }
98184                 };
98185
98186                 context.install(behavior);
98187             };
98188
98189
98190             mode.exit = function() {
98191                 context.uninstall(behavior);
98192             };
98193
98194
98195             mode.selectedIDs = function() {
98196                 return [wayID];
98197             };
98198
98199
98200             mode.activeID = function() {
98201                 return (behavior && behavior.activeID()) || [];
98202             };
98203
98204
98205             return mode;
98206         }
98207
98208         function modeAddArea(context, mode) {
98209             mode.id = 'add-area';
98210
98211             var behavior = behaviorAddWay(context)
98212                 .tail(t('modes.add_area.tail'))
98213                 .on('start', start)
98214                 .on('startFromWay', startFromWay)
98215                 .on('startFromNode', startFromNode);
98216
98217             var defaultTags = { area: 'yes' };
98218             if (mode.preset) defaultTags = mode.preset.setTags(defaultTags, 'area');
98219
98220
98221             function actionClose(wayId) {
98222                 return function (graph) {
98223                     return graph.replace(graph.entity(wayId).close());
98224                 };
98225             }
98226
98227
98228             function start(loc) {
98229                 var startGraph = context.graph();
98230                 var node = osmNode({ loc: loc });
98231                 var way = osmWay({ tags: defaultTags });
98232
98233                 context.perform(
98234                     actionAddEntity(node),
98235                     actionAddEntity(way),
98236                     actionAddVertex(way.id, node.id),
98237                     actionClose(way.id)
98238                 );
98239
98240                 context.enter(modeDrawArea(context, way.id, startGraph, context.graph(), mode.button));
98241             }
98242
98243
98244             function startFromWay(loc, edge) {
98245                 var startGraph = context.graph();
98246                 var node = osmNode({ loc: loc });
98247                 var way = osmWay({ tags: defaultTags });
98248
98249                 context.perform(
98250                     actionAddEntity(node),
98251                     actionAddEntity(way),
98252                     actionAddVertex(way.id, node.id),
98253                     actionClose(way.id),
98254                     actionAddMidpoint({ loc: loc, edge: edge }, node)
98255                 );
98256
98257                 context.enter(modeDrawArea(context, way.id, startGraph, context.graph(), mode.button));
98258             }
98259
98260
98261             function startFromNode(node) {
98262                 var startGraph = context.graph();
98263                 var way = osmWay({ tags: defaultTags });
98264
98265                 context.perform(
98266                     actionAddEntity(way),
98267                     actionAddVertex(way.id, node.id),
98268                     actionClose(way.id)
98269                 );
98270
98271                 context.enter(modeDrawArea(context, way.id, startGraph, context.graph(), mode.button));
98272             }
98273
98274
98275             mode.enter = function() {
98276                 context.install(behavior);
98277             };
98278
98279
98280             mode.exit = function() {
98281                 context.uninstall(behavior);
98282             };
98283
98284
98285             return mode;
98286         }
98287
98288         function modeAddLine(context, mode) {
98289             mode.id = 'add-line';
98290
98291             var behavior = behaviorAddWay(context)
98292                 .tail(t('modes.add_line.tail'))
98293                 .on('start', start)
98294                 .on('startFromWay', startFromWay)
98295                 .on('startFromNode', startFromNode);
98296
98297             var defaultTags = {};
98298             if (mode.preset) defaultTags = mode.preset.setTags(defaultTags, 'line');
98299
98300
98301             function start(loc) {
98302                 var startGraph = context.graph();
98303                 var node = osmNode({ loc: loc });
98304                 var way = osmWay({ tags: defaultTags });
98305
98306                 context.perform(
98307                     actionAddEntity(node),
98308                     actionAddEntity(way),
98309                     actionAddVertex(way.id, node.id)
98310                 );
98311
98312                 context.enter(modeDrawLine(context, way.id, startGraph, context.graph(), mode.button));
98313             }
98314
98315
98316             function startFromWay(loc, edge) {
98317                 var startGraph = context.graph();
98318                 var node = osmNode({ loc: loc });
98319                 var way = osmWay({ tags: defaultTags });
98320
98321                 context.perform(
98322                     actionAddEntity(node),
98323                     actionAddEntity(way),
98324                     actionAddVertex(way.id, node.id),
98325                     actionAddMidpoint({ loc: loc, edge: edge }, node)
98326                 );
98327
98328                 context.enter(modeDrawLine(context, way.id, startGraph, context.graph(), mode.button));
98329             }
98330
98331
98332             function startFromNode(node) {
98333                 var startGraph = context.graph();
98334                 var way = osmWay({ tags: defaultTags });
98335
98336                 context.perform(
98337                     actionAddEntity(way),
98338                     actionAddVertex(way.id, node.id)
98339                 );
98340
98341                 context.enter(modeDrawLine(context, way.id, startGraph, context.graph(), mode.button));
98342             }
98343
98344
98345             mode.enter = function() {
98346                 context.install(behavior);
98347             };
98348
98349
98350             mode.exit = function() {
98351                 context.uninstall(behavior);
98352             };
98353
98354             return mode;
98355         }
98356
98357         function modeAddPoint(context, mode) {
98358
98359             mode.id = 'add-point';
98360
98361             var behavior = behaviorDraw(context)
98362                 .tail(t('modes.add_point.tail'))
98363                 .on('click', add)
98364                 .on('clickWay', addWay)
98365                 .on('clickNode', addNode)
98366                 .on('cancel', cancel)
98367                 .on('finish', cancel);
98368
98369             var defaultTags = {};
98370             if (mode.preset) defaultTags = mode.preset.setTags(defaultTags, 'point');
98371
98372
98373             function add(loc) {
98374                 var node = osmNode({ loc: loc, tags: defaultTags });
98375
98376                 context.perform(
98377                     actionAddEntity(node),
98378                     t('operations.add.annotation.point')
98379                 );
98380
98381                 enterSelectMode(node);
98382             }
98383
98384
98385             function addWay(loc, edge) {
98386                 var node = osmNode({ tags: defaultTags });
98387
98388                 context.perform(
98389                     actionAddMidpoint({loc: loc, edge: edge}, node),
98390                     t('operations.add.annotation.vertex')
98391                 );
98392
98393                 enterSelectMode(node);
98394             }
98395
98396             function enterSelectMode(node) {
98397                 context.enter(
98398                     modeSelect(context, [node.id]).newFeature(true)
98399                 );
98400             }
98401
98402
98403             function addNode(node) {
98404                 if (Object.keys(defaultTags).length === 0) {
98405                     enterSelectMode(node);
98406                     return;
98407                 }
98408
98409                 var tags = Object.assign({}, node.tags);  // shallow copy
98410                 for (var key in defaultTags) {
98411                     tags[key] = defaultTags[key];
98412                 }
98413
98414                 context.perform(
98415                     actionChangeTags(node.id, tags),
98416                     t('operations.add.annotation.point')
98417                 );
98418
98419                 enterSelectMode(node);
98420             }
98421
98422
98423             function cancel() {
98424                 context.enter(modeBrowse(context));
98425             }
98426
98427
98428             mode.enter = function() {
98429                 context.install(behavior);
98430             };
98431
98432
98433             mode.exit = function() {
98434                 context.uninstall(behavior);
98435             };
98436
98437
98438             return mode;
98439         }
98440
98441         function modeAddNote(context) {
98442             var mode = {
98443                 id: 'add-note',
98444                 button: 'note',
98445                 title: t('modes.add_note.title'),
98446                 description: t('modes.add_note.description'),
98447                 key: t('modes.add_note.key')
98448             };
98449
98450             var behavior = behaviorDraw(context)
98451                 .tail(t('modes.add_note.tail'))
98452                 .on('click', add)
98453                 .on('cancel', cancel)
98454                 .on('finish', cancel);
98455
98456
98457             function add(loc) {
98458                 var osm = services$1.osm;
98459                 if (!osm) return;
98460
98461                 var note = osmNote({ loc: loc, status: 'open', comments: [] });
98462                 osm.replaceNote(note);
98463
98464                 // force a reraw (there is no history change that would otherwise do this)
98465                 context.pan([0,0]);
98466
98467                 context
98468                     .selectedNoteID(note.id)
98469                     .enter(modeSelectNote(context, note.id).newFeature(true));
98470             }
98471
98472
98473             function cancel() {
98474                 context.enter(modeBrowse(context));
98475             }
98476
98477
98478             mode.enter = function() {
98479                 context.install(behavior);
98480             };
98481
98482
98483             mode.exit = function() {
98484                 context.uninstall(behavior);
98485             };
98486
98487
98488             return mode;
98489         }
98490
98491         function uiConflicts(context) {
98492             var dispatch$1 = dispatch('cancel', 'save');
98493             var keybinding = utilKeybinding('conflicts');
98494             var _origChanges;
98495             var _conflictList;
98496
98497
98498             function keybindingOn() {
98499                 d3_select(document)
98500                     .call(keybinding.on('⎋', cancel, true));
98501             }
98502
98503             function keybindingOff() {
98504                 d3_select(document)
98505                     .call(keybinding.unbind);
98506             }
98507
98508             function tryAgain() {
98509                 keybindingOff();
98510                 dispatch$1.call('save');
98511             }
98512
98513             function cancel() {
98514                 keybindingOff();
98515                 dispatch$1.call('cancel');
98516             }
98517
98518
98519             function conflicts(selection) {
98520                 keybindingOn();
98521
98522                 var headerEnter = selection.selectAll('.header')
98523                     .data([0])
98524                     .enter()
98525                     .append('div')
98526                     .attr('class', 'header fillL');
98527
98528                 headerEnter
98529                     .append('button')
98530                     .attr('class', 'fr')
98531                     .on('click', cancel)
98532                     .call(svgIcon('#iD-icon-close'));
98533
98534                 headerEnter
98535                     .append('h3')
98536                     .text(t('save.conflict.header'));
98537
98538                 var bodyEnter = selection.selectAll('.body')
98539                     .data([0])
98540                     .enter()
98541                     .append('div')
98542                     .attr('class', 'body fillL');
98543
98544                 var conflictsHelpEnter = bodyEnter
98545                     .append('div')
98546                     .attr('class', 'conflicts-help')
98547                     .text(t('save.conflict.help'));
98548
98549
98550                 // Download changes link
98551                 var detected = utilDetect();
98552                 var changeset = new osmChangeset();
98553
98554                 delete changeset.id;  // Export without changeset_id
98555
98556                 var data = JXON.stringify(changeset.osmChangeJXON(_origChanges));
98557                 var blob = new Blob([data], { type: 'text/xml;charset=utf-8;' });
98558                 var fileName = 'changes.osc';
98559
98560                 var linkEnter = conflictsHelpEnter.selectAll('.download-changes')
98561                     .append('a')
98562                     .attr('class', 'download-changes');
98563
98564                 if (detected.download) {      // All except IE11 and Edge
98565                     linkEnter                 // download the data as a file
98566                         .attr('href', window.URL.createObjectURL(blob))
98567                         .attr('download', fileName);
98568
98569                 } else {                      // IE11 and Edge
98570                     linkEnter                 // open data uri in a new tab
98571                         .attr('target', '_blank')
98572                         .on('click.download', function() {
98573                             navigator.msSaveBlob(blob, fileName);
98574                         });
98575                 }
98576
98577                 linkEnter
98578                     .call(svgIcon('#iD-icon-load', 'inline'))
98579                     .append('span')
98580                     .text(t('save.conflict.download_changes'));
98581
98582
98583                 bodyEnter
98584                     .append('div')
98585                     .attr('class', 'conflict-container fillL3')
98586                     .call(showConflict, 0);
98587
98588                 bodyEnter
98589                     .append('div')
98590                     .attr('class', 'conflicts-done')
98591                     .attr('opacity', 0)
98592                     .style('display', 'none')
98593                     .text(t('save.conflict.done'));
98594
98595                 var buttonsEnter = bodyEnter
98596                     .append('div')
98597                     .attr('class','buttons col12 joined conflicts-buttons');
98598
98599                 buttonsEnter
98600                     .append('button')
98601                     .attr('disabled', _conflictList.length > 1)
98602                     .attr('class', 'action conflicts-button col6')
98603                     .text(t('save.title'))
98604                     .on('click.try_again', tryAgain);
98605
98606                 buttonsEnter
98607                     .append('button')
98608                     .attr('class', 'secondary-action conflicts-button col6')
98609                     .text(t('confirm.cancel'))
98610                     .on('click.cancel', cancel);
98611             }
98612
98613
98614             function showConflict(selection, index) {
98615                 index = utilWrap(index, _conflictList.length);
98616
98617                 var parent = d3_select(selection.node().parentNode);
98618
98619                 // enable save button if this is the last conflict being reviewed..
98620                 if (index === _conflictList.length - 1) {
98621                     window.setTimeout(function() {
98622                         parent.select('.conflicts-button')
98623                             .attr('disabled', null);
98624
98625                         parent.select('.conflicts-done')
98626                             .transition()
98627                             .attr('opacity', 1)
98628                             .style('display', 'block');
98629                     }, 250);
98630                 }
98631
98632                 var conflict = selection
98633                     .selectAll('.conflict')
98634                     .data([_conflictList[index]]);
98635
98636                 conflict.exit()
98637                     .remove();
98638
98639                 var conflictEnter = conflict.enter()
98640                     .append('div')
98641                     .attr('class', 'conflict');
98642
98643                 conflictEnter
98644                     .append('h4')
98645                     .attr('class', 'conflict-count')
98646                     .text(t('save.conflict.count', { num: index + 1, total: _conflictList.length }));
98647
98648                 conflictEnter
98649                     .append('a')
98650                     .attr('class', 'conflict-description')
98651                     .attr('href', '#')
98652                     .text(function(d) { return d.name; })
98653                     .on('click', function(d) {
98654                         event.preventDefault();
98655                         zoomToEntity(d.id);
98656                     });
98657
98658                 var details = conflictEnter
98659                     .append('div')
98660                     .attr('class', 'conflict-detail-container');
98661
98662                 details
98663                     .append('ul')
98664                     .attr('class', 'conflict-detail-list')
98665                     .selectAll('li')
98666                     .data(function(d) { return d.details || []; })
98667                     .enter()
98668                     .append('li')
98669                     .attr('class', 'conflict-detail-item')
98670                     .html(function(d) { return d; });
98671
98672                 details
98673                     .append('div')
98674                     .attr('class', 'conflict-choices')
98675                     .call(addChoices);
98676
98677                 details
98678                     .append('div')
98679                     .attr('class', 'conflict-nav-buttons joined cf')
98680                     .selectAll('button')
98681                     .data(['previous', 'next'])
98682                     .enter()
98683                     .append('button')
98684                     .text(function(d) { return t('save.conflict.' + d); })
98685                     .attr('class', 'conflict-nav-button action col6')
98686                     .attr('disabled', function(d, i) {
98687                         return (i === 0 && index === 0) ||
98688                             (i === 1 && index === _conflictList.length - 1) || null;
98689                     })
98690                     .on('click', function(d, i) {
98691                         event.preventDefault();
98692
98693                         var container = parent.selectAll('.conflict-container');
98694                         var sign = (i === 0 ? -1 : 1);
98695
98696                         container
98697                             .selectAll('.conflict')
98698                             .remove();
98699
98700                         container
98701                             .call(showConflict, index + sign);
98702                     });
98703
98704             }
98705
98706
98707             function addChoices(selection) {
98708                 var choices = selection
98709                     .append('ul')
98710                     .attr('class', 'layer-list')
98711                     .selectAll('li')
98712                     .data(function(d) { return d.choices || []; });
98713
98714                 // enter
98715                 var choicesEnter = choices.enter()
98716                     .append('li')
98717                     .attr('class', 'layer');
98718
98719                 var labelEnter = choicesEnter
98720                     .append('label');
98721
98722                 labelEnter
98723                     .append('input')
98724                     .attr('type', 'radio')
98725                     .attr('name', function(d) { return d.id; })
98726                     .on('change', function(d, i) {
98727                         var ul = this.parentNode.parentNode.parentNode;
98728                         ul.__data__.chosen = i;
98729                         choose(ul, d);
98730                     });
98731
98732                 labelEnter
98733                     .append('span')
98734                     .text(function(d) { return d.text; });
98735
98736                 // update
98737                 choicesEnter
98738                     .merge(choices)
98739                     .each(function(d, i) {
98740                         var ul = this.parentNode;
98741                         if (ul.__data__.chosen === i) {
98742                             choose(ul, d);
98743                         }
98744                     });
98745             }
98746
98747
98748             function choose(ul, datum) {
98749                 if (event) event.preventDefault();
98750
98751                 d3_select(ul)
98752                     .selectAll('li')
98753                     .classed('active', function(d) { return d === datum; })
98754                     .selectAll('input')
98755                     .property('checked', function(d) { return d === datum; });
98756
98757                 var extent = geoExtent();
98758                 var entity;
98759
98760                 entity = context.graph().hasEntity(datum.id);
98761                 if (entity) extent._extend(entity.extent(context.graph()));
98762
98763                 datum.action();
98764
98765                 entity = context.graph().hasEntity(datum.id);
98766                 if (entity) extent._extend(entity.extent(context.graph()));
98767
98768                 zoomToEntity(datum.id, extent);
98769             }
98770
98771
98772             function zoomToEntity(id, extent) {
98773                 context.surface().selectAll('.hover')
98774                     .classed('hover', false);
98775
98776                 var entity = context.graph().hasEntity(id);
98777                 if (entity) {
98778                     if (extent) {
98779                         context.map().trimmedExtent(extent);
98780                     } else {
98781                         context.map().zoomToEase(entity);
98782                     }
98783                     context.surface().selectAll(utilEntityOrMemberSelector([entity.id], context.graph()))
98784                         .classed('hover', true);
98785                 }
98786             }
98787
98788
98789             // The conflict list should be an array of objects like:
98790             // {
98791             //     id: id,
98792             //     name: entityName(local),
98793             //     details: merge.conflicts(),
98794             //     chosen: 1,
98795             //     choices: [
98796             //         choice(id, keepMine, forceLocal),
98797             //         choice(id, keepTheirs, forceRemote)
98798             //     ]
98799             // }
98800             conflicts.conflictList = function(_) {
98801                 if (!arguments.length) return _conflictList;
98802                 _conflictList = _;
98803                 return conflicts;
98804             };
98805
98806
98807             conflicts.origChanges = function(_) {
98808                 if (!arguments.length) return _origChanges;
98809                 _origChanges = _;
98810                 return conflicts;
98811             };
98812
98813
98814             return utilRebind(conflicts, dispatch$1, 'on');
98815         }
98816
98817         function uiChangesetEditor(context) {
98818             var dispatch$1 = dispatch('change');
98819             var formFields = uiFormFields(context);
98820             var commentCombo = uiCombobox(context, 'comment').caseSensitive(true);
98821             var _fieldsArr;
98822             var _tags;
98823             var _changesetID;
98824
98825
98826             function changesetEditor(selection) {
98827                 render(selection);
98828             }
98829
98830
98831             function render(selection) {
98832                 var initial = false;
98833
98834                 if (!_fieldsArr) {
98835                     initial = true;
98836                     var presets = context.presets();
98837
98838                     _fieldsArr = [
98839                         uiField(context, presets.field('comment'), null, { show: true, revert: false }),
98840                         uiField(context, presets.field('source'), null, { show: false, revert: false }),
98841                         uiField(context, presets.field('hashtags'), null, { show: false, revert: false }),
98842                     ];
98843
98844                     _fieldsArr.forEach(function(field) {
98845                         field
98846                             .on('change', function(t, onInput) {
98847                                 dispatch$1.call('change', field, t, onInput);
98848                             });
98849                     });
98850                 }
98851
98852                 _fieldsArr.forEach(function(field) {
98853                     field
98854                         .tags(_tags);
98855                 });
98856
98857
98858                 selection
98859                     .call(formFields.fieldsArr(_fieldsArr));
98860
98861
98862                 if (initial) {
98863                     var commentField = selection.select('#preset-input-comment');
98864                     var commentNode = commentField.node();
98865
98866                     if (commentNode) {
98867                         commentNode.focus();
98868                         commentNode.select();
98869                     }
98870
98871                     // trigger a 'blur' event so that comment field can be cleaned
98872                     // and checked for hashtags, even if retrieved from localstorage
98873                     utilTriggerEvent(commentField, 'blur');
98874
98875                     var osm = context.connection();
98876                     if (osm) {
98877                         osm.userChangesets(function (err, changesets) {
98878                             if (err) return;
98879
98880                             var comments = changesets.map(function(changeset) {
98881                                 var comment = changeset.tags.comment;
98882                                 return comment ? { title: comment, value: comment } : null;
98883                             }).filter(Boolean);
98884
98885                             commentField
98886                                 .call(commentCombo
98887                                     .data(utilArrayUniqBy(comments, 'title'))
98888                                 );
98889                         });
98890                     }
98891                 }
98892
98893                 // Add warning if comment mentions Google
98894                 var hasGoogle = _tags.comment.match(/google/i);
98895                 var commentWarning = selection.select('.form-field-comment').selectAll('.comment-warning')
98896                     .data(hasGoogle ? [0] : []);
98897
98898                 commentWarning.exit()
98899                     .transition()
98900                     .duration(200)
98901                     .style('opacity', 0)
98902                     .remove();
98903
98904                 var commentEnter = commentWarning.enter()
98905                     .insert('div', '.tag-reference-body')
98906                     .attr('class', 'field-warning comment-warning')
98907                     .style('opacity', 0);
98908
98909                 commentEnter
98910                     .append('a')
98911                     .attr('target', '_blank')
98912                     .attr('tabindex', -1)
98913                     .call(svgIcon('#iD-icon-alert', 'inline'))
98914                     .attr('href', t('commit.google_warning_link'))
98915                     .append('span')
98916                     .text(t('commit.google_warning'));
98917
98918                 commentEnter
98919                     .transition()
98920                     .duration(200)
98921                     .style('opacity', 1);
98922             }
98923
98924
98925             changesetEditor.tags = function(_) {
98926                 if (!arguments.length) return _tags;
98927                 _tags = _;
98928                 // Don't reset _fieldsArr here.
98929                 return changesetEditor;
98930             };
98931
98932
98933             changesetEditor.changesetID = function(_) {
98934                 if (!arguments.length) return _changesetID;
98935                 if (_changesetID === _) return changesetEditor;
98936                 _changesetID = _;
98937                 _fieldsArr = null;
98938                 return changesetEditor;
98939             };
98940
98941
98942             return utilRebind(changesetEditor, dispatch$1, 'on');
98943         }
98944
98945         function uiCommitChanges(context) {
98946             var detected = utilDetect();
98947             var _entityID;
98948
98949
98950             function commitChanges(selection) {
98951                 var history = context.history();
98952                 var summary = history.difference().summary();
98953
98954                 var container = selection.selectAll('.modal-section.commit-section')
98955                     .data([0]);
98956
98957                 var containerEnter = container.enter()
98958                     .append('div')
98959                     .attr('class', 'commit-section modal-section fillL2');
98960
98961                 containerEnter
98962                     .append('h3')
98963                     .text(t('commit.changes', { count: summary.length }));
98964
98965                 containerEnter
98966                     .append('ul')
98967                     .attr('class', 'changeset-list');
98968
98969                 container = containerEnter
98970                     .merge(container);
98971
98972
98973                 var items = container.select('ul').selectAll('li')
98974                     .data(summary);
98975
98976                 var itemsEnter = items.enter()
98977                     .append('li')
98978                     .attr('class', 'change-item');
98979
98980                 itemsEnter
98981                     .each(function(d) {
98982                         d3_select(this)
98983                             .call(svgIcon('#iD-icon-' + d.entity.geometry(d.graph), 'pre-text ' + d.changeType));
98984                     });
98985
98986                 itemsEnter
98987                     .append('span')
98988                     .attr('class', 'change-type')
98989                     .text(function(d) { return t('commit.' + d.changeType) + ' '; });
98990
98991                 itemsEnter
98992                     .append('strong')
98993                     .attr('class', 'entity-type')
98994                     .text(function(d) {
98995                         var matched = context.presets().match(d.entity, d.graph);
98996                         return (matched && matched.name()) || utilDisplayType(d.entity.id);
98997                     });
98998
98999                 itemsEnter
99000                     .append('span')
99001                     .attr('class', 'entity-name')
99002                     .text(function(d) {
99003                         var name = utilDisplayName(d.entity) || '',
99004                             string = '';
99005                         if (name !== '') {
99006                             string += ':';
99007                         }
99008                         return string += ' ' + name;
99009                     });
99010
99011                 itemsEnter
99012                     .style('opacity', 0)
99013                     .transition()
99014                     .style('opacity', 1);
99015
99016                 items = itemsEnter
99017                     .merge(items);
99018
99019                 items
99020                     .on('mouseover', mouseover)
99021                     .on('mouseout', mouseout)
99022                     .on('click', click);
99023
99024
99025                 // Download changeset link
99026                 var changeset = new osmChangeset().update({ id: undefined });
99027                 var changes = history.changes(actionDiscardTags(history.difference()));
99028
99029                 delete changeset.id;  // Export without chnageset_id
99030
99031                 var data = JXON.stringify(changeset.osmChangeJXON(changes));
99032                 var blob = new Blob([data], {type: 'text/xml;charset=utf-8;'});
99033                 var fileName = 'changes.osc';
99034
99035                 var linkEnter = container.selectAll('.download-changes')
99036                     .data([0])
99037                     .enter()
99038                     .append('a')
99039                     .attr('class', 'download-changes');
99040
99041                 if (detected.download) {      // All except IE11 and Edge
99042                     linkEnter                 // download the data as a file
99043                         .attr('href', window.URL.createObjectURL(blob))
99044                         .attr('download', fileName);
99045
99046                 } else {                      // IE11 and Edge
99047                     linkEnter                 // open data uri in a new tab
99048                         .attr('target', '_blank')
99049                         .on('click.download', function() {
99050                             navigator.msSaveBlob(blob, fileName);
99051                         });
99052                 }
99053
99054                 linkEnter
99055                     .call(svgIcon('#iD-icon-load', 'inline'))
99056                     .append('span')
99057                     .text(t('commit.download_changes'));
99058
99059
99060                 function mouseover(d) {
99061                     if (d.entity) {
99062                         context.surface().selectAll(
99063                             utilEntityOrMemberSelector([d.entity.id], context.graph())
99064                         ).classed('hover', true);
99065                     }
99066                 }
99067
99068
99069                 function mouseout() {
99070                     context.surface().selectAll('.hover')
99071                         .classed('hover', false);
99072                 }
99073
99074
99075                 function click(change) {
99076                     if (change.changeType === 'deleted') {
99077                         _entityID = null;
99078                     } else {
99079                         var entity = change.entity;
99080                         _entityID = change.entity.id;
99081                         context.map().zoomToEase(entity);
99082                         context.surface().selectAll(utilEntityOrMemberSelector([_entityID], context.graph()))
99083                             .classed('hover', true);
99084                     }
99085                 }
99086             }
99087
99088
99089             commitChanges.entityID = function(_) {
99090                 if (!arguments.length) return _entityID;
99091                 _entityID = _;
99092                 return commitChanges;
99093             };
99094
99095
99096             return commitChanges;
99097         }
99098
99099         function uiCommitWarnings(context) {
99100
99101             function commitWarnings(selection) {
99102                 var issuesBySeverity = context.validator()
99103                     .getIssuesBySeverity({ what: 'edited', where: 'all', includeDisabledRules: true });
99104
99105                 for (var severity in issuesBySeverity) {
99106                     var issues = issuesBySeverity[severity];
99107                     var section = severity + '-section';
99108                     var issueItem = severity + '-item';
99109
99110                     var container = selection.selectAll('.' + section)
99111                         .data(issues.length ? [0] : []);
99112
99113                     container.exit()
99114                         .remove();
99115
99116                     var containerEnter = container.enter()
99117                         .append('div')
99118                         .attr('class', 'modal-section ' + section + ' fillL2');
99119
99120                     containerEnter
99121                         .append('h3')
99122                         .text(severity === 'warning' ? t('commit.warnings') : t('commit.errors'));
99123
99124                     containerEnter
99125                         .append('ul')
99126                         .attr('class', 'changeset-list');
99127
99128                     container = containerEnter
99129                         .merge(container);
99130
99131
99132                     var items = container.select('ul').selectAll('li')
99133                         .data(issues, function(d) { return d.id; });
99134
99135                     items.exit()
99136                         .remove();
99137
99138                     var itemsEnter = items.enter()
99139                         .append('li')
99140                         .attr('class', issueItem);
99141
99142                     itemsEnter
99143                         .call(svgIcon('#iD-icon-alert', 'pre-text'));
99144
99145                     itemsEnter
99146                         .append('strong')
99147                         .attr('class', 'issue-message');
99148
99149                     itemsEnter.filter(function(d) { return d.tooltip; })
99150                         .call(tooltip()
99151                             .title(function(d) { return d.tooltip; })
99152                             .placement('top')
99153                         );
99154
99155                     items = itemsEnter
99156                         .merge(items);
99157
99158                     items.selectAll('.issue-message')
99159                         .text(function(d) {
99160                             return d.message(context);
99161                         });
99162
99163                     items
99164                         .on('mouseover', function(d) {
99165                             if (d.entityIds) {
99166                                 context.surface().selectAll(
99167                                     utilEntityOrMemberSelector(
99168                                         d.entityIds,
99169                                         context.graph()
99170                                     )
99171                                 ).classed('hover', true);
99172                             }
99173                         })
99174                         .on('mouseout', function() {
99175                             context.surface().selectAll('.hover')
99176                                 .classed('hover', false);
99177                         })
99178                         .on('click', function(d) {
99179                             context.validator().focusIssue(d);
99180                         });
99181                 }
99182             }
99183
99184
99185             return commitWarnings;
99186         }
99187
99188         var _changeset$1;
99189         var readOnlyTags = [
99190             /^changesets_count$/,
99191             /^created_by$/,
99192             /^ideditor:/,
99193             /^imagery_used$/,
99194             /^host$/,
99195             /^locale$/,
99196             /^warnings:/
99197         ];
99198
99199         // treat most punctuation (except -, _, +, &) as hashtag delimiters - #4398
99200         // from https://stackoverflow.com/a/25575009
99201         var hashtagRegex = /(#[^\u2000-\u206F\u2E00-\u2E7F\s\\'!"#$%()*,.\/:;<=>?@\[\]^`{|}~]+)/g;
99202
99203
99204         function uiCommit(context) {
99205             var dispatch$1 = dispatch('cancel', 'save');
99206             var _userDetails;
99207             var _selection;
99208
99209             var changesetEditor = uiChangesetEditor(context)
99210                 .on('change', changeTags);
99211             var rawTagEditor = uiRawTagEditor(context)
99212                 .on('change', changeTags);
99213             var commitChanges = uiCommitChanges(context);
99214             var commitWarnings = uiCommitWarnings(context);
99215
99216
99217             function commit(selection) {
99218                 _selection = selection;
99219
99220                 var osm = context.connection();
99221                 if (!osm) return;
99222
99223                 // expire stored comment, hashtags, source after cutoff datetime - #3947 #4899
99224                 var commentDate = +context.storage('commentDate') || 0;
99225                 var currDate = Date.now();
99226                 var cutoff = 2 * 86400 * 1000;   // 2 days
99227                 if (commentDate > currDate || currDate - commentDate > cutoff) {
99228                     context.storage('comment', null);
99229                     context.storage('hashtags', null);
99230                     context.storage('source', null);
99231                 }
99232
99233                 var tags;
99234                 // Initialize changeset if one does not exist yet.
99235                 // Also pull values from local storage.
99236                 if (!_changeset$1) {
99237                     var detected = utilDetect();
99238                     tags = {
99239                         comment: context.storage('comment') || '',
99240                         created_by: ('iD ' + context.version).substr(0, 255),
99241                         host: detected.host.substr(0, 255),
99242                         locale: detected.locale.substr(0, 255)
99243                     };
99244
99245                     // call findHashtags initially - this will remove stored
99246                     // hashtags if any hashtags are found in the comment - #4304
99247                     findHashtags(tags, true);
99248
99249                     var hashtags = context.storage('hashtags');
99250                     if (hashtags) {
99251                         tags.hashtags = hashtags;
99252                     }
99253
99254                     var source = context.storage('source');
99255                     if (source) {
99256                         tags.source = source;
99257                     }
99258                     var photoOverlaysUsed = context.history().photoOverlaysUsed();
99259                     if (photoOverlaysUsed.length) {
99260                         var sources = (tags.source || '').split(';');
99261
99262                         // include this tag for any photo layer
99263                         if (sources.indexOf('streetlevel imagery') === -1) {
99264                             sources.push('streetlevel imagery');
99265                         }
99266                         
99267                         // add the photo overlays used during editing as sources
99268                         photoOverlaysUsed.forEach(function(photoOverlay) {
99269                             if (sources.indexOf(photoOverlay) === -1) {
99270                                 sources.push(photoOverlay);
99271                             }
99272                         });
99273
99274                         tags.source = sources.join(';').substr(0, 255);
99275                     }
99276
99277                     _changeset$1 = new osmChangeset({ tags: tags });
99278                 }
99279
99280                 tags = Object.assign({}, _changeset$1.tags);   // shallow copy
99281
99282                 // assign tags for imagery used
99283                 var imageryUsed = context.history().imageryUsed().join(';').substr(0, 255);
99284                 tags.imagery_used = imageryUsed || 'None';
99285
99286                 // assign tags for closed issues and notes
99287                 var osmClosed = osm.getClosedIDs();
99288                 if (osmClosed.length) {
99289                     tags['closed:note'] = osmClosed.join(';').substr(0, 255);
99290                 }
99291                 if (services$1.keepRight) {
99292                     var krClosed = services$1.keepRight.getClosedIDs();
99293                     if (krClosed.length) {
99294                         tags['closed:keepright'] = krClosed.join(';').substr(0, 255);
99295                     }
99296                 }
99297                 if (services$1.improveOSM) {
99298                     var iOsmClosed = services$1.improveOSM.getClosedIDs();
99299                     if (iOsmClosed.length) {
99300                         tags['closed:improveosm'] = iOsmClosed.join(';').substr(0, 255);
99301                     }
99302                 }
99303
99304                 // remove existing warning counts
99305                 for (var key in tags) {
99306                     if (key.match(/^warnings:/)) {
99307                         delete tags[key];
99308                     }
99309                 }
99310
99311                 // add counts of warnings generated by the user's edits
99312                 var warnings = context.validator()
99313                     .getIssuesBySeverity({ what: 'edited', where: 'all', includeIgnored: true, includeDisabledRules: true }).warning;
99314
99315                 var warningsByType = utilArrayGroupBy(warnings, 'type');
99316                 for (var warningType in warningsByType) {
99317                     var warningsOfType = warningsByType[warningType];
99318                     if (warningsOfType[0].subtype) {
99319                         var warningsBySubtype = utilArrayGroupBy(warningsOfType, 'subtype');
99320                         for (var warningSubtype in warningsBySubtype) {
99321                             var warningsOfSubtype = warningsBySubtype[warningSubtype];
99322                             tags['warnings:' + warningType + ':' + warningSubtype] = warningsOfSubtype.length.toString();
99323                         }
99324                     } else {
99325                         tags['warnings:' + warningType] = warningsOfType.length.toString();
99326                     }
99327                 }
99328
99329
99330                 _changeset$1 = _changeset$1.update({ tags: tags });
99331
99332                 var header = selection.selectAll('.header')
99333                     .data([0]);
99334
99335                 var headerTitle = header.enter()
99336                     .append('div')
99337                     .attr('class', 'header fillL header-container');
99338
99339                 headerTitle
99340                     .append('div')
99341                     .attr('class', 'header-block header-block-outer');
99342
99343                 headerTitle
99344                     .append('div')
99345                     .attr('class', 'header-block')
99346                     .append('h3')
99347                     .text(t('commit.title'));
99348
99349                 headerTitle
99350                     .append('div')
99351                     .attr('class', 'header-block header-block-outer header-block-close')
99352                     .append('button')
99353                     .attr('class', 'close')
99354                     .on('click', function() { context.enter(modeBrowse(context)); })
99355                     .call(svgIcon('#iD-icon-close'));
99356
99357                 var body = selection.selectAll('.body')
99358                     .data([0]);
99359
99360                 body = body.enter()
99361                     .append('div')
99362                     .attr('class', 'body')
99363                     .merge(body);
99364
99365
99366                 // Changeset Section
99367                 var changesetSection = body.selectAll('.changeset-editor')
99368                     .data([0]);
99369
99370                 changesetSection = changesetSection.enter()
99371                     .append('div')
99372                     .attr('class', 'modal-section changeset-editor')
99373                     .merge(changesetSection);
99374
99375                 changesetSection
99376                     .call(changesetEditor
99377                         .changesetID(_changeset$1.id)
99378                         .tags(tags)
99379                     );
99380
99381
99382                 // Warnings
99383                 body.call(commitWarnings);
99384
99385
99386                 // Upload Explanation
99387                 var saveSection = body.selectAll('.save-section')
99388                     .data([0]);
99389
99390                 saveSection = saveSection.enter()
99391                     .append('div')
99392                     .attr('class','modal-section save-section fillL cf')
99393                     .merge(saveSection);
99394
99395                 var prose = saveSection.selectAll('.commit-info')
99396                     .data([0]);
99397
99398                 if (prose.enter().size()) {   // first time, make sure to update user details in prose
99399                     _userDetails = null;
99400                 }
99401
99402                 prose = prose.enter()
99403                     .append('p')
99404                     .attr('class', 'commit-info')
99405                     .text(t('commit.upload_explanation'))
99406                     .merge(prose);
99407
99408                 // always check if this has changed, but only update prose.html()
99409                 // if needed, because it can trigger a style recalculation
99410                 osm.userDetails(function(err, user) {
99411                     if (err) return;
99412
99413                     if (_userDetails === user) return;  // no change
99414                     _userDetails = user;
99415
99416                     var userLink = d3_select(document.createElement('div'));
99417
99418                     if (user.image_url) {
99419                         userLink
99420                             .append('img')
99421                             .attr('src', user.image_url)
99422                             .attr('class', 'icon pre-text user-icon');
99423                     }
99424
99425                     userLink
99426                         .append('a')
99427                         .attr('class', 'user-info')
99428                         .text(user.display_name)
99429                         .attr('href', osm.userURL(user.display_name))
99430                         .attr('tabindex', -1)
99431                         .attr('target', '_blank');
99432
99433                     prose
99434                         .html(t('commit.upload_explanation_with_user', { user: userLink.html() }));
99435                 });
99436
99437
99438                 // Request Review
99439                 var requestReview = saveSection.selectAll('.request-review')
99440                     .data([0]);
99441
99442                 // Enter
99443                 var requestReviewEnter = requestReview.enter()
99444                     .append('div')
99445                     .attr('class', 'request-review');
99446
99447                 var labelEnter = requestReviewEnter
99448                     .append('label')
99449                     .attr('for', 'commit-input-request-review');
99450
99451                 labelEnter
99452                     .append('input')
99453                     .attr('type', 'checkbox')
99454                     .attr('id', 'commit-input-request-review');
99455
99456                 labelEnter
99457                     .append('span')
99458                     .text(t('commit.request_review'));
99459
99460                 // Update
99461                 requestReview = requestReview
99462                     .merge(requestReviewEnter);
99463
99464                 var requestReviewInput = requestReview.selectAll('input')
99465                     .property('checked', isReviewRequested(_changeset$1.tags))
99466                     .on('change', toggleRequestReview);
99467
99468
99469                 // Buttons
99470                 var buttonSection = saveSection.selectAll('.buttons')
99471                     .data([0]);
99472
99473                 // enter
99474                 var buttonEnter = buttonSection.enter()
99475                     .append('div')
99476                     .attr('class', 'buttons fillL cf');
99477
99478                 buttonEnter
99479                     .append('button')
99480                     .attr('class', 'secondary-action button cancel-button')
99481                     .append('span')
99482                     .attr('class', 'label')
99483                     .text(t('commit.cancel'));
99484
99485                 var uploadButton = buttonEnter
99486                     .append('button')
99487                     .attr('class', 'action button save-button');
99488
99489                 uploadButton.append('span')
99490                     .attr('class', 'label')
99491                     .text(t('commit.save'));
99492
99493                 var uploadBlockerTooltipText = getUploadBlockerMessage();
99494
99495                 // update
99496                 buttonSection = buttonSection
99497                     .merge(buttonEnter);
99498
99499                 buttonSection.selectAll('.cancel-button')
99500                     .on('click.cancel', function() {
99501                         var selectedID = commitChanges.entityID();
99502                         dispatch$1.call('cancel', this, selectedID);
99503                     });
99504
99505                 buttonSection.selectAll('.save-button')
99506                     .classed('disabled', uploadBlockerTooltipText !== null)
99507                     .on('click.save', function() {
99508                         if (!d3_select(this).classed('disabled')) {
99509                             this.blur();    // avoid keeping focus on the button - #4641
99510                             dispatch$1.call('save', this, _changeset$1);
99511                         }
99512                     });
99513
99514                 // remove any existing tooltip
99515                 tooltip().destroyAny(buttonSection.selectAll('.save-button'));
99516
99517                 if (uploadBlockerTooltipText) {
99518                     buttonSection.selectAll('.save-button')
99519                         .call(tooltip().title(uploadBlockerTooltipText).placement('top'));
99520                 }
99521
99522                 // Raw Tag Editor
99523                 var tagSection = body.selectAll('.tag-section.raw-tag-editor')
99524                     .data([0]);
99525
99526                 tagSection = tagSection.enter()
99527                     .append('div')
99528                     .attr('class', 'modal-section tag-section raw-tag-editor')
99529                     .merge(tagSection);
99530
99531                 var expanded = !tagSection.selectAll('a.hide-toggle.expanded').empty();
99532                 tagSection
99533                     .call(rawTagEditor
99534                         .expanded(expanded)
99535                         .readOnlyTags(readOnlyTags)
99536                         .tags(Object.assign({}, _changeset$1.tags))   // shallow copy
99537                     );
99538
99539
99540                 // Change summary
99541                 body.call(commitChanges);
99542
99543
99544                 function toggleRequestReview() {
99545                     var rr = requestReviewInput.property('checked');
99546                     updateChangeset({ review_requested: (rr ? 'yes' : undefined) });
99547
99548                     var expanded = !tagSection.selectAll('a.hide-toggle.expanded').empty();
99549                     tagSection
99550                         .call(rawTagEditor
99551                             .expanded(expanded)
99552                             .readOnlyTags(readOnlyTags)
99553                             .tags(Object.assign({}, _changeset$1.tags))   // shallow copy
99554                         );
99555                 }
99556             }
99557
99558
99559             function getUploadBlockerMessage() {
99560                 var errors = context.validator()
99561                     .getIssuesBySeverity({ what: 'edited', where: 'all' }).error;
99562
99563                 if (errors.length) {
99564                     return t('commit.outstanding_errors_message', { count: errors.length });
99565
99566                 } else {
99567                     var n = d3_select('#preset-input-comment').node();
99568                     var hasChangesetComment = n && n.value.length > 0;
99569                     if (!hasChangesetComment) {
99570                         return t('commit.comment_needed_message');
99571                     }
99572                 }
99573                 return null;
99574             }
99575
99576
99577             function changeTags(changed, onInput) {
99578                 if (changed.hasOwnProperty('comment')) {
99579                     if (changed.comment === undefined) {
99580                         changed.comment = '';
99581                     }
99582                     if (!onInput) {
99583                         context.storage('comment', changed.comment);
99584                         context.storage('commentDate', Date.now());
99585                     }
99586                 }
99587                 if (changed.hasOwnProperty('source')) {
99588                     if (changed.source === undefined) {
99589                         context.storage('source', null);
99590                     } else if (!onInput) {
99591                         context.storage('source', changed.source);
99592                         context.storage('commentDate', Date.now());
99593                     }
99594                 }
99595
99596                 updateChangeset(changed, onInput);
99597
99598                 if (_selection) {
99599                     _selection.call(commit);
99600                 }
99601             }
99602
99603
99604             function findHashtags(tags, commentOnly) {
99605                 var inComment = commentTags();
99606                 var inHashTags = hashTags();
99607
99608                 if (inComment !== null) {                    // when hashtags are detected in comment...
99609                     context.storage('hashtags', null);       // always remove stored hashtags - #4304
99610                     if (commentOnly) { inHashTags = []; }    // optionally override hashtags field
99611                 }
99612
99613                 // keep only one copy of the tags
99614                 var all = new Set();
99615                 var keepTags = [];
99616                 inComment.forEach(checkTag);
99617                 inHashTags.forEach(checkTag);
99618                 return keepTags;
99619
99620                 // Compare tags as lowercase strings, but keep original case tags
99621                 function checkTag(s) {
99622                     var compare = s.toLowerCase();
99623                     if (!all.has(compare)) {
99624                         all.add(compare);
99625                         keepTags.push(s);
99626                     }
99627                 }
99628
99629                 // Extract hashtags from `comment`
99630                 function commentTags() {
99631                     var matches = (tags.comment || '')
99632                         .replace(/http\S*/g, '')  // drop anything that looks like a URL - #4289
99633                         .match(hashtagRegex);
99634
99635                     return (matches || []);
99636                 }
99637
99638                 // Extract and clean hashtags from `hashtags`
99639                 function hashTags() {
99640                     var matches = (tags.hashtags || '')
99641                         .split(/[,;\s]+/)
99642                         .map(function (s) {
99643                             if (s[0] !== '#') { s = '#' + s; }    // prepend '#'
99644                             var matched = s.match(hashtagRegex);
99645                             return matched && matched[0];
99646                         }).filter(Boolean);                       // exclude falsy
99647
99648                     return (matches || []);
99649                 }
99650             }
99651
99652
99653             function isReviewRequested(tags) {
99654                 var rr = tags.review_requested;
99655                 if (rr === undefined) return false;
99656                 rr = rr.trim().toLowerCase();
99657                 return !(rr === '' || rr === 'no');
99658             }
99659
99660
99661             function updateChangeset(changed, onInput) {
99662                 var tags = Object.assign({}, _changeset$1.tags);   // shallow copy
99663
99664                 Object.keys(changed).forEach(function(k) {
99665                     var v = changed[k];
99666                     k = k.trim().substr(0, 255);
99667                     if (readOnlyTags.indexOf(k) !== -1) return;
99668
99669                     if (k !== '' && v !== undefined) {
99670                         if (onInput) {
99671                             tags[k] = v;
99672                         } else {
99673                             tags[k] = v.trim().substr(0, 255);
99674                         }
99675                     } else {
99676                         delete tags[k];
99677                     }
99678                 });
99679
99680                 if (!onInput) {
99681                     // when changing the comment, override hashtags with any found in comment.
99682                     var commentOnly = changed.hasOwnProperty('comment') && (changed.comment !== '');
99683                     var arr = findHashtags(tags, commentOnly);
99684                     if (arr.length) {
99685                         tags.hashtags = arr.join(';').substr(0, 255);
99686                         context.storage('hashtags', tags.hashtags);
99687                     } else {
99688                         delete tags.hashtags;
99689                         context.storage('hashtags', null);
99690                     }
99691                 }
99692
99693                 // always update userdetails, just in case user reauthenticates as someone else
99694                 if (_userDetails && _userDetails.changesets_count !== undefined) {
99695                     var changesetsCount = parseInt(_userDetails.changesets_count, 10) + 1;  // #4283
99696                     tags.changesets_count = String(changesetsCount);
99697
99698                     // first 100 edits - new user
99699                     if (changesetsCount <= 100) {
99700                         var s;
99701                         s = context.storage('walkthrough_completed');
99702                         if (s) {
99703                             tags['ideditor:walkthrough_completed'] = s;
99704                         }
99705
99706                         s = context.storage('walkthrough_progress');
99707                         if (s) {
99708                             tags['ideditor:walkthrough_progress'] = s;
99709                         }
99710
99711                         s = context.storage('walkthrough_started');
99712                         if (s) {
99713                             tags['ideditor:walkthrough_started'] = s;
99714                         }
99715                     }
99716                 } else {
99717                     delete tags.changesets_count;
99718                 }
99719
99720                 if (!fastDeepEqual(_changeset$1.tags, tags)) {
99721                     _changeset$1 = _changeset$1.update({ tags: tags });
99722                 }
99723             }
99724
99725
99726             commit.reset = function() {
99727                 _changeset$1 = null;
99728             };
99729
99730
99731             return utilRebind(commit, dispatch$1, 'on');
99732         }
99733
99734         function uiSuccess(context) {
99735             var MAXEVENTS = 2;
99736
99737             // All else being equal, rank more "social" communities higher
99738             // (anything not in this list receives no adjustment)
99739             var COMMUNITYRANK = {
99740                 'meetup': +5,
99741                 'slack': +4,
99742                 'facebook': +3,
99743                 'reddit': +2,
99744                 'forum': -2,
99745                 'mailinglist': -3,
99746                 'irc': -4
99747             };
99748
99749             var detected = utilDetect();
99750             var dispatch$1 = dispatch('cancel');
99751             var _changeset;
99752             var _location;
99753
99754
99755             // string-to-date parsing in JavaScript is weird
99756             function parseEventDate(when) {
99757                 if (!when) return;
99758
99759                 var raw = when.trim();
99760                 if (!raw) return;
99761
99762                 if (!/Z$/.test(raw)) {    // if no trailing 'Z', add one
99763                     raw += 'Z';           // this forces date to be parsed as a UTC date
99764                 }
99765
99766                 var parsed = new Date(raw);
99767                 return new Date(parsed.toUTCString().substr(0, 25));  // convert to local timezone
99768             }
99769
99770
99771             function success(selection) {
99772                 var header = selection
99773                     .append('div')
99774                     .attr('class', 'header fillL');
99775
99776                 header
99777                     .append('button')
99778                     .attr('class', 'fr')
99779                     .on('click', function() { dispatch$1.call('cancel'); })
99780                     .call(svgIcon('#iD-icon-close'));
99781
99782                 header
99783                     .append('h3')
99784                     .text(t('success.just_edited'));
99785
99786                 var body = selection
99787                     .append('div')
99788                     .attr('class', 'body save-success fillL');
99789
99790                 var summary = body
99791                     .append('div')
99792                     .attr('class', 'save-summary');
99793
99794                 summary
99795                     .append('h3')
99796                     .text(t('success.thank_you' + (_location ? '_location' : ''), { where: _location }));
99797
99798                 summary
99799                     .append('p')
99800                     .text(t('success.help_html'))
99801                     .append('a')
99802                     .attr('class', 'link-out')
99803                     .attr('target', '_blank')
99804                     .attr('tabindex', -1)
99805                     .attr('href', t('success.help_link_url'))
99806                     .call(svgIcon('#iD-icon-out-link', 'inline'))
99807                     .append('span')
99808                     .text(t('success.help_link_text'));
99809
99810                 var osm = context.connection();
99811                 if (!osm) return;
99812
99813                 var changesetURL = osm.changesetURL(_changeset.id);
99814
99815                 var table = summary
99816                     .append('table')
99817                     .attr('class', 'summary-table');
99818
99819                 var row = table
99820                     .append('tr')
99821                     .attr('class', 'summary-row');
99822
99823                 row
99824                     .append('td')
99825                     .attr('class', 'cell-icon summary-icon')
99826                     .append('a')
99827                     .attr('target', '_blank')
99828                     .attr('href', changesetURL)
99829                     .append('svg')
99830                     .attr('class', 'logo-small')
99831                     .append('use')
99832                     .attr('xlink:href', '#iD-logo-osm');
99833
99834                 var summaryDetail = row
99835                     .append('td')
99836                     .attr('class', 'cell-detail summary-detail');
99837
99838                 summaryDetail
99839                     .append('a')
99840                     .attr('class', 'cell-detail summary-view-on-osm')
99841                     .attr('target', '_blank')
99842                     .attr('href', changesetURL)
99843                     .text(t('success.view_on_osm'));
99844
99845                 summaryDetail
99846                     .append('div')
99847                     .text(t('success.changeset_id', { changeset_id: _changeset.id }));
99848
99849
99850                 // Gather community polygon IDs intersecting the map..
99851                 var matchFeatures = data.community.query(context.map().center(), true) || [];
99852                 var matchIDs = matchFeatures.map(function(feature) { return feature.id; });
99853
99854                 // Gather community resources that are either global or match a polygon.
99855                 var matchResources = Object.values(data.community.resources)
99856                     .filter(function(v) { return !v.featureId || matchIDs.indexOf(v.featureId) !== -1; });
99857
99858                 if (matchResources.length) {
99859                     // sort by size ascending, then by community rank
99860                     matchResources.sort(function(a, b) {
99861                         var aSize = Infinity;
99862                         var bSize = Infinity;
99863                         var aRank = COMMUNITYRANK[a.type] || 0;
99864                         var bRank = COMMUNITYRANK[b.type] || 0;
99865
99866                         if (a.featureId) {
99867                             aSize = data.community.features[a.featureId].properties.area;
99868                         }
99869                         if (b.featureId) {
99870                             bSize = data.community.features[b.featureId].properties.area;
99871                         }
99872
99873                         return aSize < bSize ? -1 : aSize > bSize ? 1 : bRank - aRank;
99874                     });
99875
99876                     body
99877                         .call(showCommunityLinks, matchResources);
99878                 }
99879             }
99880
99881
99882             function showCommunityLinks(selection, matchResources) {
99883                 var communityLinks = selection
99884                     .append('div')
99885                     .attr('class', 'save-communityLinks');
99886
99887                 communityLinks
99888                     .append('h3')
99889                     .text(t('success.like_osm'));
99890
99891                 var table = communityLinks
99892                     .append('table')
99893                     .attr('class', 'community-table');
99894
99895                 var row = table.selectAll('.community-row')
99896                     .data(matchResources);
99897
99898                 var rowEnter = row.enter()
99899                     .append('tr')
99900                     .attr('class', 'community-row');
99901
99902                 rowEnter
99903                     .append('td')
99904                     .attr('class', 'cell-icon community-icon')
99905                     .append('a')
99906                     .attr('target', '_blank')
99907                     .attr('href', function(d) { return d.url; })
99908                     .append('svg')
99909                     .attr('class', 'logo-small')
99910                     .append('use')
99911                     .attr('xlink:href', function(d) { return '#community-' + d.type; });
99912
99913                 var communityDetail = rowEnter
99914                     .append('td')
99915                     .attr('class', 'cell-detail community-detail');
99916
99917                 communityDetail
99918                     .each(showCommunityDetails);
99919
99920                 communityLinks
99921                     .append('div')
99922                     .attr('class', 'community-missing')
99923                     .text(t('success.missing'))
99924                     .append('a')
99925                     .attr('class', 'link-out')
99926                     .attr('target', '_blank')
99927                     .attr('tabindex', -1)
99928                     .call(svgIcon('#iD-icon-out-link', 'inline'))
99929                     .attr('href', 'https://github.com/osmlab/osm-community-index/issues')
99930                     .append('span')
99931                     .text(t('success.tell_us'));
99932             }
99933
99934
99935             function showCommunityDetails(d) {
99936                 var selection = d3_select(this);
99937                 var communityID = d.id;
99938                 var replacements = {
99939                     url: linkify(d.url),
99940                     signupUrl: linkify(d.signupUrl || d.url)
99941                 };
99942
99943                 selection
99944                     .append('div')
99945                     .attr('class', 'community-name')
99946                     .append('a')
99947                     .attr('target', '_blank')
99948                     .attr('href', d.url)
99949                     .text(t('community.' + d.id + '.name'));
99950
99951                 var descriptionHTML = t('community.' + d.id + '.description', replacements);
99952
99953                 if (d.type === 'reddit') {   // linkify subreddits  #4997
99954                     descriptionHTML = descriptionHTML
99955                         .replace(/(\/r\/\w*\/*)/i, function(match) { return linkify(d.url, match); });
99956                 }
99957
99958                 selection
99959                     .append('div')
99960                     .attr('class', 'community-description')
99961                     .html(descriptionHTML);
99962
99963                 if (d.extendedDescription || (d.languageCodes && d.languageCodes.length)) {
99964                     selection
99965                         .append('div')
99966                         .call(uiDisclosure(context, 'community-more-' + d.id, false)
99967                             .expanded(false)
99968                             .updatePreference(false)
99969                             .title(t('success.more'))
99970                             .content(showMore)
99971                         );
99972                 }
99973
99974                 var nextEvents = (d.events || [])
99975                     .map(function(event) {
99976                         event.date = parseEventDate(event.when);
99977                         return event;
99978                     })
99979                     .filter(function(event) {               // date is valid and future (or today)
99980                         var t = event.date.getTime();
99981                         var now = (new Date()).setHours(0,0,0,0);
99982                         return !isNaN(t) && t >= now;
99983                     })
99984                     .sort(function(a, b) {                  // sort by date ascending
99985                         return a.date < b.date ? -1 : a.date > b.date ? 1 : 0;
99986                     })
99987                     .slice(0, MAXEVENTS);                   // limit number of events shown
99988
99989                 if (nextEvents.length) {
99990                     selection
99991                         .append('div')
99992                         .call(uiDisclosure(context, 'community-events-' + d.id, false)
99993                             .expanded(false)
99994                             .updatePreference(false)
99995                             .title(t('success.events'))
99996                             .content(showNextEvents)
99997                         )
99998                         .select('.hide-toggle')
99999                         .append('span')
100000                         .attr('class', 'badge-text')
100001                         .text(nextEvents.length);
100002                 }
100003
100004
100005                 function showMore(selection) {
100006                     var more = selection.selectAll('.community-more')
100007                         .data([0]);
100008
100009                     var moreEnter = more.enter()
100010                         .append('div')
100011                         .attr('class', 'community-more');
100012
100013                     if (d.extendedDescription) {
100014                         moreEnter
100015                             .append('div')
100016                             .attr('class', 'community-extended-description')
100017                             .html(t('community.' + d.id + '.extendedDescription', replacements));
100018                     }
100019
100020                     if (d.languageCodes && d.languageCodes.length) {
100021                         moreEnter
100022                             .append('div')
100023                             .attr('class', 'community-languages')
100024                             .text(t('success.languages', { languages: d.languageCodes.join(', ') }));
100025                     }
100026                 }
100027
100028
100029                 function showNextEvents(selection) {
100030                     var events = selection
100031                         .append('div')
100032                         .attr('class', 'community-events');
100033
100034                     var item = events.selectAll('.community-event')
100035                         .data(nextEvents);
100036
100037                     var itemEnter = item.enter()
100038                         .append('div')
100039                         .attr('class', 'community-event');
100040
100041                     itemEnter
100042                         .append('div')
100043                         .attr('class', 'community-event-name')
100044                         .append('a')
100045                         .attr('target', '_blank')
100046                         .attr('href', function(d) { return d.url; })
100047                         .text(function(d) {
100048                             var name = d.name;
100049                             if (d.i18n && d.id) {
100050                                 name = t('community.' + communityID + '.events.' + d.id + '.name', { default: name });
100051                             }
100052                             return name;
100053                         });
100054
100055                     itemEnter
100056                         .append('div')
100057                         .attr('class', 'community-event-when')
100058                         .text(function(d) {
100059                             var options = {
100060                                 weekday: 'short', day: 'numeric', month: 'short', year: 'numeric'
100061                             };
100062                             if (d.date.getHours() || d.date.getMinutes()) {   // include time if it has one
100063                                 options.hour = 'numeric';
100064                                 options.minute = 'numeric';
100065                             }
100066                             return d.date.toLocaleString(detected.locale, options);
100067                         });
100068
100069                     itemEnter
100070                         .append('div')
100071                         .attr('class', 'community-event-where')
100072                         .text(function(d) {
100073                             var where = d.where;
100074                             if (d.i18n && d.id) {
100075                                 where = t('community.' + communityID + '.events.' + d.id + '.where', { default: where });
100076                             }
100077                             return where;
100078                         });
100079
100080                     itemEnter
100081                         .append('div')
100082                         .attr('class', 'community-event-description')
100083                         .text(function(d) {
100084                             var description = d.description;
100085                             if (d.i18n && d.id) {
100086                                 description = t('community.' + communityID + '.events.' + d.id + '.description', { default: description });
100087                             }
100088                             return description;
100089                         });
100090                 }
100091
100092
100093                 function linkify(url, text) {
100094                     text = text || url;
100095                     return '<a target="_blank" href="' + url + '">' + text + '</a>';
100096                 }
100097             }
100098
100099
100100             success.changeset = function(_) {
100101                 if (!arguments.length) return _changeset;
100102                 _changeset = _;
100103                 return success;
100104             };
100105
100106
100107             success.location = function(_) {
100108                 if (!arguments.length) return _location;
100109                 _location = _;
100110                 return success;
100111             };
100112
100113
100114             return utilRebind(success, dispatch$1, 'on');
100115         }
100116
100117         var _isSaving = false;
100118
100119
100120         function modeSave(context) {
100121             var mode = { id: 'save' };
100122             var keybinding = utilKeybinding('modeSave');
100123
100124             var loading = uiLoading(context)
100125                 .message(t('save.uploading'))
100126                 .blocking(true);
100127
100128             var commit = uiCommit(context)
100129                 .on('cancel', cancel)
100130                 .on('save', save);
100131
100132             var _toCheck = [];
100133             var _toLoad = [];
100134             var _loaded = {};
100135             var _toLoadCount = 0;
100136             var _toLoadTotal = 0;
100137
100138             var _conflicts = [];
100139             var _errors = [];
100140             var _origChanges;
100141             var _location;
100142
100143
100144             function cancel(selectedID) {
100145                 if (selectedID) {
100146                     context.enter(modeSelect(context, [selectedID]));
100147                 } else {
100148                     context.enter(modeBrowse(context));
100149                 }
100150             }
100151
100152
100153             function save(changeset, tryAgain, checkConflicts) {
100154                 // Guard against accidentally entering save code twice - #4641
100155                 if (_isSaving && !tryAgain) {
100156                     return;
100157                 }
100158
100159                 var osm = context.connection();
100160                 if (!osm) {
100161                     cancel();
100162                     return;
100163                 }
100164
100165                 // If user somehow got logged out mid-save, try to reauthenticate..
100166                 // This can happen if they were logged in from before, but the tokens are no longer valid.
100167                 if (!osm.authenticated()) {
100168                     osm.authenticate(function(err) {
100169                         if (err) {
100170                             cancel();   // quit save mode..
100171                         } else {
100172                             save(changeset, tryAgain, checkConflicts);  // continue where we left off..
100173                         }
100174                     });
100175                     return;
100176                 }
100177
100178                 if (!_isSaving) {
100179                     keybindingOff();
100180                     context.container().call(loading);  // block input
100181                     _isSaving = true;
100182                 }
100183
100184                 var history = context.history();
100185                 var localGraph = context.graph();
100186                 var remoteGraph = coreGraph(history.base(), true);
100187
100188                 _conflicts = [];
100189                 _errors = [];
100190
100191                 // Store original changes, in case user wants to download them as an .osc file
100192                 _origChanges = history.changes(actionDiscardTags(history.difference()));
100193
100194                 // First time, `history.perform` a no-op action.
100195                 // Any conflict resolutions will be done as `history.replace`
100196                 if (!tryAgain) {
100197                     history.perform(actionNoop());
100198                 }
100199
100200                 // Attempt a fast upload.. If there are conflicts, re-enter with `checkConflicts = true`
100201                 if (!checkConflicts) {
100202                     upload(changeset);
100203
100204                 // Do the full (slow) conflict check..
100205                 } else {
100206                     var summary = history.difference().summary();
100207                     _toCheck = [];
100208                     for (var i = 0; i < summary.length; i++) {
100209                         var item = summary[i];
100210                         if (item.changeType === 'modified') {
100211                             _toCheck.push(item.entity.id);
100212                         }
100213                     }
100214
100215                     _toLoad = withChildNodes(_toCheck, localGraph);
100216                     _loaded = {};
100217                     _toLoadCount = 0;
100218                     _toLoadTotal = _toLoad.length;
100219
100220                     if (_toCheck.length) {
100221                         showProgress(_toLoadCount, _toLoadTotal);
100222                         _toLoad.forEach(function(id) { _loaded[id] = false; });
100223                         osm.loadMultiple(_toLoad, loaded);
100224                     } else {
100225                         upload(changeset);
100226                     }
100227                 }
100228
100229                 return;
100230
100231
100232                 function withChildNodes(ids, graph) {
100233                     var s = new Set(ids);
100234                     ids.forEach(function(id) {
100235                         var entity = graph.entity(id);
100236                         if (entity.type !== 'way') return;
100237
100238                         graph.childNodes(entity).forEach(function(child) {
100239                             if (child.version !== undefined) {
100240                                 s.add(child.id);
100241                             }
100242                         });
100243                     });
100244
100245                     return Array.from(s);
100246                 }
100247
100248
100249                 // Reload modified entities into an alternate graph and check for conflicts..
100250                 function loaded(err, result) {
100251                     if (_errors.length) return;
100252
100253                     if (err) {
100254                         _errors.push({
100255                             msg: err.message || err.responseText,
100256                             details: [ t('save.status_code', { code: err.status }) ]
100257                         });
100258                         showErrors();
100259
100260                     } else {
100261                         var loadMore = [];
100262
100263                         result.data.forEach(function(entity) {
100264                             remoteGraph.replace(entity);
100265                             _loaded[entity.id] = true;
100266                             _toLoad = _toLoad.filter(function(val) { return val !== entity.id; });
100267
100268                             if (!entity.visible) return;
100269
100270                             // Because loadMultiple doesn't download /full like loadEntity,
100271                             // need to also load children that aren't already being checked..
100272                             var i, id;
100273                             if (entity.type === 'way') {
100274                                 for (i = 0; i < entity.nodes.length; i++) {
100275                                     id = entity.nodes[i];
100276                                     if (_loaded[id] === undefined) {
100277                                         _loaded[id] = false;
100278                                         loadMore.push(id);
100279                                     }
100280                                 }
100281                             } else if (entity.type === 'relation' && entity.isMultipolygon()) {
100282                                 for (i = 0; i < entity.members.length; i++) {
100283                                     id = entity.members[i].id;
100284                                     if (_loaded[id] === undefined) {
100285                                         _loaded[id] = false;
100286                                         loadMore.push(id);
100287                                     }
100288                                 }
100289                             }
100290                         });
100291
100292                         _toLoadCount += result.data.length;
100293                         _toLoadTotal += loadMore.length;
100294                         showProgress(_toLoadCount, _toLoadTotal);
100295
100296                         if (loadMore.length) {
100297                             _toLoad.push.apply(_toLoad, loadMore);
100298                             osm.loadMultiple(loadMore, loaded);
100299                         }
100300
100301                         if (!_toLoad.length) {
100302                             detectConflicts();
100303                         }
100304                     }
100305                 }
100306
100307
100308                 function detectConflicts() {
100309                     function choice(id, text, action) {
100310                         return { id: id, text: text, action: function() { history.replace(action); } };
100311                     }
100312                     function formatUser(d) {
100313                         return '<a href="' + osm.userURL(d) + '" target="_blank">' + d + '</a>';
100314                     }
100315                     function entityName(entity) {
100316                         return utilDisplayName(entity) || (utilDisplayType(entity.id) + ' ' + entity.id);
100317                     }
100318
100319                     function sameVersions(local, remote) {
100320                         if (local.version !== remote.version) return false;
100321
100322                         if (local.type === 'way') {
100323                             var children = utilArrayUnion(local.nodes, remote.nodes);
100324                             for (var i = 0; i < children.length; i++) {
100325                                 var a = localGraph.hasEntity(children[i]);
100326                                 var b = remoteGraph.hasEntity(children[i]);
100327                                 if (a && b && a.version !== b.version) return false;
100328                             }
100329                         }
100330
100331                         return true;
100332                     }
100333
100334                     _toCheck.forEach(function(id) {
100335                         var local = localGraph.entity(id);
100336                         var remote = remoteGraph.entity(id);
100337
100338                         if (sameVersions(local, remote)) return;
100339
100340                         var action = actionMergeRemoteChanges;
100341                         var merge = action(id, localGraph, remoteGraph, formatUser);
100342
100343                         history.replace(merge);
100344
100345                         var mergeConflicts = merge.conflicts();
100346                         if (!mergeConflicts.length) return;  // merged safely
100347
100348                         var forceLocal = action(id, localGraph, remoteGraph).withOption('force_local');
100349                         var forceRemote = action(id, localGraph, remoteGraph).withOption('force_remote');
100350                         var keepMine = t('save.conflict.' + (remote.visible ? 'keep_local' : 'restore'));
100351                         var keepTheirs = t('save.conflict.' + (remote.visible ? 'keep_remote' : 'delete'));
100352
100353                         _conflicts.push({
100354                             id: id,
100355                             name: entityName(local),
100356                             details: mergeConflicts,
100357                             chosen: 1,
100358                             choices: [
100359                                 choice(id, keepMine, forceLocal),
100360                                 choice(id, keepTheirs, forceRemote)
100361                             ]
100362                         });
100363                     });
100364
100365                     upload(changeset);
100366                 }
100367             }
100368
100369
100370             function upload(changeset) {
100371                 var osm = context.connection();
100372                 if (!osm) {
100373                     _errors.push({ msg: 'No OSM Service' });
100374                 }
100375
100376                 if (_conflicts.length) {
100377                     _conflicts.sort(function(a, b) { return b.id.localeCompare(a.id); });
100378                     showConflicts(changeset);
100379
100380                 } else if (_errors.length) {
100381                     showErrors();
100382
100383                 } else {
100384                     var history = context.history();
100385                     var changes = history.changes(actionDiscardTags(history.difference()));
100386                     if (changes.modified.length || changes.created.length || changes.deleted.length) {
100387                         loadLocation();  // so it is ready when we display the save screen
100388                         osm.putChangeset(changeset, changes, uploadCallback);
100389                     } else {        // changes were insignificant or reverted by user
100390                         d3_select('.inspector-wrap *').remove();
100391                         loading.close();
100392                         _isSaving = false;
100393                         context.flush();
100394                         cancel();
100395                     }
100396                 }
100397             }
100398
100399
100400             function uploadCallback(err, changeset) {
100401                 if (err) {
100402                     if (err.status === 409) {          // 409 Conflict
100403                         save(changeset, true, true);   // tryAgain = true, checkConflicts = true
100404                     } else {
100405                         _errors.push({
100406                             msg: err.message || err.responseText,
100407                             details: [ t('save.status_code', { code: err.status }) ]
100408                         });
100409                         showErrors();
100410                     }
100411
100412                 } else {
100413                     context.history().clearSaved();
100414                     success(changeset);
100415                     // Add delay to allow for postgres replication #1646 #2678
100416                     window.setTimeout(function() {
100417                         d3_select('.inspector-wrap *').remove();
100418                         loading.close();
100419                         _isSaving = false;
100420                         context.flush();
100421                     }, 2500);
100422                 }
100423             }
100424
100425
100426             function showProgress(num, total) {
100427                 var modal = context.container().select('.loading-modal .modal-section');
100428                 var progress = modal.selectAll('.progress')
100429                     .data([0]);
100430
100431                 // enter/update
100432                 progress.enter()
100433                     .append('div')
100434                     .attr('class', 'progress')
100435                     .merge(progress)
100436                     .text(t('save.conflict_progress', { num: num, total: total }));
100437             }
100438
100439
100440             function showConflicts(changeset) {
100441                 var history = context.history();
100442                 var selection = context.container()
100443                     .select('#sidebar')
100444                     .append('div')
100445                     .attr('class','sidebar-component');
100446
100447                 loading.close();
100448                 _isSaving = false;
100449
100450                 var ui = uiConflicts(context)
100451                     .conflictList(_conflicts)
100452                     .origChanges(_origChanges)
100453                     .on('cancel', function() {
100454                         history.pop();
100455                         selection.remove();
100456                         keybindingOn();
100457                     })
100458                     .on('save', function() {
100459                         for (var i = 0; i < _conflicts.length; i++) {
100460                             if (_conflicts[i].chosen === 1) {  // user chose "keep theirs"
100461                                 var entity = context.hasEntity(_conflicts[i].id);
100462                                 if (entity && entity.type === 'way') {
100463                                     var children = utilArrayUniq(entity.nodes);
100464                                     for (var j = 0; j < children.length; j++) {
100465                                         history.replace(actionRevert(children[j]));
100466                                     }
100467                                 }
100468                                 history.replace(actionRevert(_conflicts[i].id));
100469                             }
100470                         }
100471
100472                         selection.remove();
100473                         save(changeset, true, false);  // tryAgain = true, checkConflicts = false
100474                     });
100475
100476                 selection.call(ui);
100477             }
100478
100479
100480             function showErrors() {
100481                 keybindingOn();
100482                 context.history().pop();
100483                 loading.close();
100484                 _isSaving = false;
100485
100486                 var selection = uiConfirm(context.container());
100487                 selection
100488                     .select('.modal-section.header')
100489                     .append('h3')
100490                     .text(t('save.error'));
100491
100492                 addErrors(selection, _errors);
100493                 selection.okButton();
100494             }
100495
100496
100497             function addErrors(selection, data) {
100498                 var message = selection
100499                     .select('.modal-section.message-text');
100500
100501                 var items = message
100502                     .selectAll('.error-container')
100503                     .data(data);
100504
100505                 var enter = items.enter()
100506                     .append('div')
100507                     .attr('class', 'error-container');
100508
100509                 enter
100510                     .append('a')
100511                     .attr('class', 'error-description')
100512                     .attr('href', '#')
100513                     .classed('hide-toggle', true)
100514                     .text(function(d) { return d.msg || t('save.unknown_error_details'); })
100515                     .on('click', function() {
100516                         event.preventDefault();
100517
100518                         var error = d3_select(this);
100519                         var detail = d3_select(this.nextElementSibling);
100520                         var exp = error.classed('expanded');
100521
100522                         detail.style('display', exp ? 'none' : 'block');
100523                         error.classed('expanded', !exp);
100524                     });
100525
100526                 var details = enter
100527                     .append('div')
100528                     .attr('class', 'error-detail-container')
100529                     .style('display', 'none');
100530
100531                 details
100532                     .append('ul')
100533                     .attr('class', 'error-detail-list')
100534                     .selectAll('li')
100535                     .data(function(d) { return d.details || []; })
100536                     .enter()
100537                     .append('li')
100538                     .attr('class', 'error-detail-item')
100539                     .text(function(d) { return d; });
100540
100541                 items.exit()
100542                     .remove();
100543             }
100544
100545
100546             function success(changeset) {
100547                 commit.reset();
100548
100549                 var ui = uiSuccess(context)
100550                     .changeset(changeset)
100551                     .location(_location)
100552                     .on('cancel', function() { context.ui().sidebar.hide(); });
100553
100554                 context.enter(modeBrowse(context).sidebar(ui));
100555             }
100556
100557
100558             function keybindingOn() {
100559                 d3_select(document)
100560                     .call(keybinding.on('⎋', cancel, true));
100561             }
100562
100563
100564             function keybindingOff() {
100565                 d3_select(document)
100566                     .call(keybinding.unbind);
100567             }
100568
100569
100570             // Reverse geocode current map location so we can display a message on
100571             // the success screen like "Thank you for editing around place, region."
100572             function loadLocation() {
100573                 _location = null;
100574                 if (!services$1.geocoder) return;
100575
100576                 services$1.geocoder.reverse(context.map().center(), function(err, result) {
100577                     if (err || !result || !result.address) return;
100578
100579                     var addr = result.address;
100580                     var place = (addr && (addr.town || addr.city || addr.county)) || '';
100581                     var region = (addr && (addr.state || addr.country)) || '';
100582                     var separator = (place && region) ? t('success.thank_you_where.separator') : '';
100583
100584                     _location = t('success.thank_you_where.format',
100585                         { place: place, separator: separator, region: region }
100586                     );
100587                 });
100588             }
100589
100590
100591             mode.enter = function() {
100592                 // Show sidebar
100593                 context.ui().sidebar.expand();
100594
100595                 function done() {
100596                     context.ui().sidebar.show(commit);
100597                 }
100598
100599                 keybindingOn();
100600
100601                 context.container().selectAll('#content')
100602                     .attr('class', 'inactive');
100603
100604                 var osm = context.connection();
100605                 if (!osm) {
100606                     cancel();
100607                     return;
100608                 }
100609
100610                 if (osm.authenticated()) {
100611                     done();
100612                 } else {
100613                     osm.authenticate(function(err) {
100614                         if (err) {
100615                             cancel();
100616                         } else {
100617                             done();
100618                         }
100619                     });
100620                 }
100621             };
100622
100623
100624             mode.exit = function() {
100625                 _isSaving = false;
100626
100627                 keybindingOff();
100628
100629                 context.container().selectAll('#content')
100630                     .attr('class', 'active');
100631
100632                 context.ui().sidebar.hide();
100633             };
100634
100635             return mode;
100636         }
100637
100638         function uiToolOldDrawModes(context) {
100639
100640             var tool = {
100641                 id: 'old_modes',
100642                 label: t('toolbar.add_feature')
100643             };
100644
100645             var modes = [
100646                 modeAddPoint(context, {
100647                     title: t('modes.add_point.title'),
100648                     button: 'point',
100649                     description: t('modes.add_point.description'),
100650                     preset: context.presets().item('point'),
100651                     key: '1'
100652                 }),
100653                 modeAddLine(context, {
100654                     title: t('modes.add_line.title'),
100655                     button: 'line',
100656                     description: t('modes.add_line.description'),
100657                     preset: context.presets().item('line'),
100658                     key: '2'
100659                 }),
100660                 modeAddArea(context, {
100661                     title: t('modes.add_area.title'),
100662                     button: 'area',
100663                     description: t('modes.add_area.description'),
100664                     preset: context.presets().item('area'),
100665                     key: '3'
100666                 })
100667             ];
100668
100669
100670             function enabled() {
100671                 return osmEditable();
100672             }
100673
100674             function osmEditable() {
100675                 var mode = context.mode();
100676                 return context.editable() && mode && mode.id !== 'save';
100677             }
100678
100679             modes.forEach(function(mode) {
100680                 context.keybinding().on(mode.key, function() {
100681                     if (!enabled()) return;
100682
100683                     if (mode.id === context.mode().id) {
100684                         context.enter(modeBrowse(context));
100685                     } else {
100686                         context.enter(mode);
100687                     }
100688                 });
100689             });
100690
100691             tool.render = function(selection) {
100692
100693                 var wrap = selection
100694                     .append('div')
100695                     .attr('class', 'joined')
100696                     .style('display', 'flex');
100697
100698                 context
100699                     .on('enter.editor', function(entered) {
100700                         selection.selectAll('button.add-button')
100701                             .classed('active', function(mode) { return entered.button === mode.button; });
100702                         context.container()
100703                             .classed('mode-' + entered.id, true);
100704                     });
100705
100706                 context
100707                     .on('exit.editor', function(exited) {
100708                         context.container()
100709                             .classed('mode-' + exited.id, false);
100710                     });
100711
100712
100713                 var debouncedUpdate = debounce(update, 500, { leading: true, trailing: true });
100714
100715                 context.map()
100716                     .on('move.modes', debouncedUpdate)
100717                     .on('drawn.modes', debouncedUpdate);
100718
100719                 context
100720                     .on('enter.modes', update);
100721
100722                 update();
100723
100724
100725                 function update() {
100726
100727                     var buttons = wrap.selectAll('button.add-button')
100728                         .data(modes, function(d) { return d.id; });
100729
100730                     // exit
100731                     buttons.exit()
100732                         .remove();
100733
100734                     // enter
100735                     var buttonsEnter = buttons.enter()
100736                         .append('button')
100737                         .attr('tabindex', -1)
100738                         .attr('class', function(d) { return d.id + ' add-button bar-button'; })
100739                         .on('click.mode-buttons', function(d) {
100740                             if (!enabled()) return;
100741
100742                             // When drawing, ignore accidental clicks on mode buttons - #4042
100743                             var currMode = context.mode().id;
100744                             if (/^draw/.test(currMode)) return;
100745
100746                             if (d.id === currMode) {
100747                                 context.enter(modeBrowse(context));
100748                             } else {
100749                                 context.enter(d);
100750                             }
100751                         })
100752                         .call(tooltip()
100753                             .placement('bottom')
100754                             .html(true)
100755                             .title(function(d) { return uiTooltipHtml(d.description, d.key); })
100756                         );
100757
100758                     buttonsEnter
100759                         .each(function(d) {
100760                             d3_select(this)
100761                                 .call(svgIcon('#iD-icon-' + d.button));
100762                         });
100763
100764                     buttonsEnter
100765                         .append('span')
100766                         .attr('class', 'label')
100767                         .text(function(mode) { return mode.title; });
100768
100769                     // if we are adding/removing the buttons, check if toolbar has overflowed
100770                     if (buttons.enter().size() || buttons.exit().size()) {
100771                         context.ui().checkOverflow('#bar', true);
100772                     }
100773
100774                     // update
100775                     buttons = buttons
100776                         .merge(buttonsEnter)
100777                         .classed('disabled', function(d) { return !enabled(); });
100778                 }
100779             };
100780
100781             return tool;
100782         }
100783
100784         function uiToolNotes(context) {
100785
100786             var tool = {
100787                 id: 'notes',
100788                 label: t('modes.add_note.label')
100789             };
100790
100791             var mode = modeAddNote(context);
100792
100793             function enabled() {
100794                 return notesEnabled() && notesEditable();
100795             }
100796
100797             function notesEnabled() {
100798                 var noteLayer = context.layers().layer('notes');
100799                 return noteLayer && noteLayer.enabled();
100800             }
100801
100802             function notesEditable() {
100803                 var mode = context.mode();
100804                 return context.map().notesEditable() && mode && mode.id !== 'save';
100805             }
100806
100807             context.keybinding().on(mode.key, function() {
100808                 if (!enabled()) return;
100809
100810                 if (mode.id === context.mode().id) {
100811                     context.enter(modeBrowse(context));
100812                 } else {
100813                     context.enter(mode);
100814                 }
100815             });
100816
100817             tool.render = function(selection) {
100818
100819                 context
100820                     .on('enter.editor.notes', function(entered) {
100821                         selection.selectAll('button.add-button')
100822                             .classed('active', function(mode) { return entered.button === mode.button; });
100823                         context.container()
100824                             .classed('mode-' + entered.id, true);
100825                     });
100826
100827                 context
100828                     .on('exit.editor.notes', function(exited) {
100829                         context.container()
100830                             .classed('mode-' + exited.id, false);
100831                     });
100832
100833
100834                 var debouncedUpdate = debounce(update, 500, { leading: true, trailing: true });
100835
100836                 context.map()
100837                     .on('move.notes', debouncedUpdate)
100838                     .on('drawn.notes', debouncedUpdate);
100839
100840                 context
100841                     .on('enter.notes', update);
100842
100843                 update();
100844
100845
100846                 function update() {
100847                     var showNotes = notesEnabled();
100848                     var data = showNotes ? [mode] : [];
100849
100850                     var buttons = selection.selectAll('button.add-button')
100851                         .data(data, function(d) { return d.id; });
100852
100853                     // exit
100854                     buttons.exit()
100855                         .remove();
100856
100857                     // enter
100858                     var buttonsEnter = buttons.enter()
100859                         .append('button')
100860                         .attr('tabindex', -1)
100861                         .attr('class', function(d) { return d.id + ' add-button bar-button'; })
100862                         .on('click.notes', function(d) {
100863                             if (!enabled()) return;
100864
100865                             // When drawing, ignore accidental clicks on mode buttons - #4042
100866                             var currMode = context.mode().id;
100867                             if (/^draw/.test(currMode)) return;
100868
100869                             if (d.id === currMode) {
100870                                 context.enter(modeBrowse(context));
100871                             } else {
100872                                 context.enter(d);
100873                             }
100874                         })
100875                         .call(tooltip()
100876                             .placement('bottom')
100877                             .html(true)
100878                             .title(function(d) { return uiTooltipHtml(d.description, d.key); })
100879                         );
100880
100881                     buttonsEnter
100882                         .each(function(d) {
100883                             d3_select(this)
100884                                 .call(svgIcon(d.icon || '#iD-icon-' + d.button));
100885                         });
100886
100887                     // if we are adding/removing the buttons, check if toolbar has overflowed
100888                     if (buttons.enter().size() || buttons.exit().size()) {
100889                         context.ui().checkOverflow('#bar', true);
100890                     }
100891
100892                     // update
100893                     buttons = buttons
100894                         .merge(buttonsEnter)
100895                         .classed('disabled', function(d) { return !enabled(); });
100896                 }
100897             };
100898
100899             tool.uninstall = function() {
100900                 context
100901                     .on('enter.editor.notes', null)
100902                     .on('exit.editor.notes', null)
100903                     .on('enter.notes', null);
100904
100905                 context.map()
100906                     .on('move.notes', null)
100907                     .on('drawn.notes', null);
100908             };
100909
100910             return tool;
100911         }
100912
100913         function uiToolSave(context) {
100914
100915             var tool = {
100916                 id: 'save',
100917                 label: t('save.title')
100918             };
100919
100920             var button = null;
100921             var tooltipBehavior = null;
100922             var history = context.history();
100923             var key = uiCmd('⌘S');
100924             var _numChanges = 0;
100925
100926             function isSaving() {
100927                 var mode = context.mode();
100928                 return mode && mode.id === 'save';
100929             }
100930
100931             function isDisabled() {
100932                 return _numChanges === 0 || isSaving();
100933             }
100934
100935             function save() {
100936                 event.preventDefault();
100937                 if (!context.inIntro() && !isSaving() && history.hasChanges()) {
100938                     context.enter(modeSave(context));
100939                 }
100940             }
100941
100942             function bgColor() {
100943                 var step;
100944                 if (_numChanges === 0) {
100945                     return null;
100946                 } else if (_numChanges <= 50) {
100947                     step = _numChanges / 50;
100948                     return d3_interpolateRgb('#fff', '#ff8')(step);  // white -> yellow
100949                 } else {
100950                     step = Math.min((_numChanges - 50) / 50, 1.0);
100951                     return d3_interpolateRgb('#ff8', '#f88')(step);  // yellow -> red
100952                 }
100953             }
100954
100955
100956             function updateCount() {
100957                 var val = history.difference().summary().length;
100958                 if (val === _numChanges) return;
100959                 _numChanges = val;
100960
100961                 if (tooltipBehavior) {
100962                     tooltipBehavior
100963                         .title(uiTooltipHtml(
100964                             t(_numChanges > 0 ? 'save.help' : 'save.no_changes'), key)
100965                         );
100966                 }
100967
100968                 if (button) {
100969                     button
100970                         .classed('disabled', isDisabled())
100971                         .style('background', bgColor());
100972
100973                     button.select('span.count')
100974                         .text(_numChanges);
100975                 }
100976             }
100977
100978
100979             tool.render = function(selection) {
100980                 tooltipBehavior = tooltip()
100981                     .placement('bottom')
100982                     .html(true)
100983                     .title(uiTooltipHtml(t('save.no_changes'), key));
100984
100985                 button = selection
100986                     .append('button')
100987                     .attr('class', 'save disabled bar-button')
100988                     .attr('tabindex', -1)
100989                     .on('click', save)
100990                     .call(tooltipBehavior);
100991
100992                 button
100993                     .call(svgIcon('#iD-icon-save'));
100994
100995                 button
100996                     .append('span')
100997                     .attr('class', 'count')
100998                     .text('0');
100999
101000                 updateCount();
101001
101002
101003                 context.keybinding()
101004                     .on(key, save, true);
101005
101006
101007                 context.history()
101008                     .on('change.save', updateCount);
101009
101010                 context
101011                     .on('enter.save', function() {
101012                         if (button) {
101013                             button
101014                                 .classed('disabled', isDisabled());
101015
101016                             if (isSaving()) {
101017                                 button.call(tooltipBehavior.hide);
101018                             }
101019                         }
101020                     });
101021             };
101022
101023
101024             tool.uninstall = function() {
101025                 context.keybinding()
101026                     .off(key, true);
101027
101028                 context.history()
101029                     .on('change.save', null);
101030
101031                 context
101032                     .on('enter.save', null);
101033
101034                 button = null;
101035                 tooltipBehavior = null;
101036             };
101037
101038             return tool;
101039         }
101040
101041         function uiToolSidebarToggle(context) {
101042
101043             var tool = {
101044                 id: 'sidebar_toggle',
101045                 label: t('toolbar.inspect')
101046             };
101047
101048             tool.render = function(selection) {
101049                 selection
101050                     .append('button')
101051                     .attr('class', 'bar-button')
101052                     .attr('tabindex', -1)
101053                     .on('click', function() {
101054                         context.ui().sidebar.toggle();
101055                     })
101056                     .call(tooltip()
101057                         .placement('bottom')
101058                         .html(true)
101059                         .title(uiTooltipHtml(t('sidebar.tooltip'), t('sidebar.key')))
101060                     )
101061                     .call(svgIcon('#iD-icon-sidebar-' + (textDirection === 'rtl' ? 'right' : 'left')));
101062             };
101063
101064             return tool;
101065         }
101066
101067         function uiToolUndoRedo(context) {
101068
101069             var tool = {
101070                 id: 'undo_redo',
101071                 label: t('toolbar.undo_redo')
101072             };
101073
101074             var commands = [{
101075                 id: 'undo',
101076                 cmd: uiCmd('⌘Z'),
101077                 action: function() { if (editable()) context.undo(); },
101078                 annotation: function() { return context.history().undoAnnotation(); }
101079             }, {
101080                 id: 'redo',
101081                 cmd: uiCmd('⌘⇧Z'),
101082                 action: function() { if (editable()) context.redo(); },
101083                 annotation: function() { return context.history().redoAnnotation(); }
101084             }];
101085
101086
101087             function editable() {
101088                 var mode = context.mode();
101089                 return context.editable() && mode && mode.id !== 'save';
101090             }
101091
101092
101093             tool.render = function(selection) {
101094                 var tooltipBehavior = tooltip()
101095                     .placement('bottom')
101096                     .html(true)
101097                     .title(function (d) {
101098                         return uiTooltipHtml(d.annotation() ?
101099                             t(d.id + '.tooltip', {action: d.annotation()}) :
101100                             t(d.id + '.nothing'), d.cmd);
101101                     });
101102
101103                 var buttons = selection.selectAll('button')
101104                     .data(commands)
101105                     .enter()
101106                     .append('button')
101107                     .attr('class', function(d) { return 'disabled ' + d.id + '-button bar-button'; })
101108                     .on('click', function(d) { return d.action(); })
101109                     .call(tooltipBehavior);
101110
101111                 buttons.each(function(d) {
101112                     var iconName = d.id;
101113                     if (textDirection === 'rtl') {
101114                         if (iconName === 'undo') {
101115                             iconName = 'redo';
101116                         } else if (iconName === 'redo') {
101117                             iconName = 'undo';
101118                         }
101119                     }
101120                     d3_select(this)
101121                         .call(svgIcon('#iD-icon-' + iconName));
101122                 });
101123
101124                 context.keybinding()
101125                     .on(commands[0].cmd, function() { event.preventDefault(); commands[0].action(); })
101126                     .on(commands[1].cmd, function() { event.preventDefault(); commands[1].action(); });
101127
101128
101129                 var debouncedUpdate = debounce(update, 500, { leading: true, trailing: true });
101130
101131                 context.map()
101132                     .on('move.undo_redo', debouncedUpdate)
101133                     .on('drawn.undo_redo', debouncedUpdate);
101134
101135                 context.history()
101136                     .on('change.undo_redo', function(difference) {
101137                         if (difference) update();
101138                     });
101139
101140                 context
101141                     .on('enter.undo_redo', update);
101142
101143
101144                 function update() {
101145                     buttons
101146                         .property('disabled', !editable())
101147                         .classed('disabled', function(d) {
101148                             return !editable() || !d.annotation();
101149                         })
101150                         .each(function() {
101151                             var selection = d3_select(this);
101152                             if (selection.property('tooltipVisible')) {
101153                                 selection.call(tooltipBehavior.show);
101154                             }
101155                         });
101156                 }
101157             };
101158
101159             tool.uninstall = function() {
101160                 context.keybinding()
101161                     .off(commands[0].cmd)
101162                     .off(commands[1].cmd);
101163
101164                 context.map()
101165                     .on('move.undo_redo', null)
101166                     .on('drawn.undo_redo', null);
101167
101168                 context.history()
101169                     .on('change.undo_redo', null);
101170
101171                 context
101172                     .on('enter.undo_redo', null);
101173             };
101174
101175             return tool;
101176         }
101177
101178         function uiTopToolbar(context) {
101179
101180             var sidebarToggle = uiToolSidebarToggle(context),
101181                 modes = uiToolOldDrawModes(context),
101182                 //searchAdd = uiToolSearchAdd(context),
101183                 //addFavorite = uiToolAddFavorite(context),
101184                 //addRecent = uiToolAddRecent(context),
101185                 notes = uiToolNotes(context),
101186                 undoRedo = uiToolUndoRedo(context),
101187                 save = uiToolSave(context);
101188
101189             function notesEnabled() {
101190                 var noteLayer = context.layers().layer('notes');
101191                 return noteLayer && noteLayer.enabled();
101192             }
101193
101194             function topToolbar(bar) {
101195
101196                 var debouncedUpdate = debounce(update, 500, { leading: true, trailing: true });
101197                 context.layers()
101198                     .on('change.topToolbar', debouncedUpdate);
101199
101200                 context.presets()
101201                     .on('favoritePreset.topToolbar', update)
101202                     .on('recentsChange.topToolbar', update);
101203
101204                 update();
101205
101206                 function update() {
101207
101208                     var tools = [
101209                         sidebarToggle,
101210                         'spacer',
101211                         modes
101212                     //    searchAdd
101213                     ];
101214                     /*
101215                     if (context.presets().getFavorites().length > 0) {
101216                         tools.push(addFavorite);
101217                     }
101218
101219                     if (addRecent.shouldShow()) {
101220                         tools.push(addRecent);
101221                     }*/
101222
101223                     tools.push('spacer');
101224
101225                     if (notesEnabled()) {
101226                         tools = tools.concat([notes, 'spacer']);
101227                     }
101228
101229                     tools = tools.concat([undoRedo, save]);
101230
101231                     var toolbarItems = bar.selectAll('.toolbar-item')
101232                         .data(tools, function(d) {
101233                             return d.id || d;
101234                         });
101235
101236                     toolbarItems.exit()
101237                         .each(function(d) {
101238                             if (d.uninstall) {
101239                                 d.uninstall();
101240                             }
101241                         })
101242                         .remove();
101243
101244                     var itemsEnter = toolbarItems
101245                         .enter()
101246                         .append('div')
101247                         .attr('class', function(d) {
101248                             var classes = 'toolbar-item ' + (d.id || d).replace('_', '-');
101249                             if (d.klass) classes += ' ' + d.klass;
101250                             return classes;
101251                         });
101252
101253                     var actionableItems = itemsEnter.filter(function(d) { return d !== 'spacer'; });
101254
101255                     actionableItems
101256                         .append('div')
101257                         .attr('class', 'item-content')
101258                         .each(function(d) {
101259                             d3_select(this).call(d.render, bar);
101260                         });
101261
101262                     actionableItems
101263                         .append('div')
101264                         .attr('class', 'item-label')
101265                         .text(function(d) {
101266                             return d.label;
101267                         });
101268                 }
101269
101270             }
101271
101272             return topToolbar;
101273         }
101274
101275         // these are module variables so they are preserved through a ui.restart()
101276         var sawVersion = null;
101277         var isNewVersion = false;
101278         var isNewUser = false;
101279
101280
101281         function uiVersion(context) {
101282
101283             var currVersion = context.version;
101284             var matchedVersion = currVersion.match(/\d+\.\d+\.\d+.*/);
101285
101286             if (sawVersion === null && matchedVersion !== null) {
101287                 isNewVersion = (context.storage('sawVersion') !== currVersion);
101288                 isNewUser = !context.storage('sawSplash');
101289                 context.storage('sawVersion', currVersion);
101290                 sawVersion = currVersion;
101291             }
101292
101293             return function(selection) {
101294                 selection
101295                     .append('a')
101296                     .attr('target', '_blank')
101297                     .attr('tabindex', -1)
101298                     .attr('href', 'https://github.com/openstreetmap/iD')
101299                     .text(currVersion);
101300
101301                 // only show new version indicator to users that have used iD before
101302                 if (isNewVersion && !isNewUser) {
101303                     selection
101304                         .append('div')
101305                         .attr('class', 'badge')
101306                         .append('a')
101307                         .attr('target', '_blank')
101308                         .attr('tabindex', -1)
101309                         .attr('href', 'https://github.com/openstreetmap/iD/blob/master/CHANGELOG.md#whats-new')
101310                         .call(svgIcon('#maki-gift-11'))
101311                         .call(tooltip()
101312                             .title(t('version.whats_new', { version: currVersion }))
101313                             .placement('top')
101314                         );
101315                 }
101316             };
101317         }
101318
101319         function uiZoom(context) {
101320             var zooms = [{
101321                 id: 'zoom-in',
101322                 icon: 'plus',
101323                 title: t('zoom.in'),
101324                 action: context.zoomIn,
101325                 key: '+'
101326             }, {
101327                 id: 'zoom-out',
101328                 icon: 'minus',
101329                 title: t('zoom.out'),
101330                 action: context.zoomOut,
101331                 key: '-'
101332             }];
101333
101334
101335             function zoomIn() {
101336                 event.preventDefault();
101337                 context.zoomIn();
101338             }
101339
101340
101341             function zoomOut() {
101342                 event.preventDefault();
101343                 context.zoomOut();
101344             }
101345
101346
101347             function zoomInFurther() {
101348                 event.preventDefault();
101349                 context.zoomInFurther();
101350             }
101351
101352
101353             function zoomOutFurther() {
101354                 event.preventDefault();
101355                 context.zoomOutFurther();
101356             }
101357
101358
101359             return function(selection) {
101360                 var button = selection.selectAll('button')
101361                     .data(zooms)
101362                     .enter()
101363                     .append('button')
101364                     .attr('tabindex', -1)
101365                     .attr('class', function(d) { return d.id; })
101366                     .on('click.editor', function(d) { d.action(); })
101367                     .call(tooltip()
101368                         .placement((textDirection === 'rtl') ? 'right' : 'left')
101369                         .html(true)
101370                         .title(function(d) {
101371                             return uiTooltipHtml(d.title, d.key);
101372                         })
101373                     );
101374
101375                 button.each(function(d) {
101376                     d3_select(this)
101377                         .call(svgIcon('#iD-icon-' + d.icon, 'light'));
101378                 });
101379
101380                 ['plus', 'ffplus', '=', 'ffequals'].forEach(function(key) {
101381                     context.keybinding().on([key], zoomIn);
101382                     context.keybinding().on([uiCmd('⌘' + key)], zoomInFurther);
101383                 });
101384
101385                 ['_', '-', 'ffminus', 'dash'].forEach(function(key) {
101386                     context.keybinding().on([key], zoomOut);
101387                     context.keybinding().on([uiCmd('⌘' + key)], zoomOutFurther);
101388                 });
101389             };
101390         }
101391
101392         function uiInit(context) {
101393             var _initCounter = 0;
101394             var _initCallback;
101395             var _needWidth = {};
101396
101397
101398             function render(container) {
101399                 container
101400                     .attr('dir', textDirection);
101401
101402                 // setup fullscreen keybindings (no button shown at this time)
101403                 container
101404                     .call(uiFullScreen(context));
101405
101406                 var map = context.map();
101407                 map.redrawEnable(false);  // don't draw until we've set zoom/lat/long
101408
101409                 container
101410                     .append('svg')
101411                     .attr('id', 'defs')
101412                     .call(svgDefs(context));
101413
101414                 container
101415                     .append('div')
101416                     .attr('id', 'sidebar')
101417                     .call(ui.sidebar);
101418
101419                 var content = container
101420                     .append('div')
101421                     .attr('id', 'content')
101422                     .attr('class', 'active');
101423
101424                 // Top toolbar
101425                 content
101426                     .append('div')
101427                     .attr('id', 'bar')
101428                     .attr('class', 'fillD')
101429                     .call(uiTopToolbar(context));
101430
101431                 content
101432                     .append('div')
101433                     .attr('id', 'map')
101434                     .attr('dir', 'ltr')
101435                     .call(map);
101436
101437
101438                 // Map controls
101439                 var controls = content
101440                     .append('div')
101441                     .attr('class', 'map-controls');
101442
101443                 controls
101444                     .append('div')
101445                     .attr('class', 'map-control zoombuttons')
101446                     .call(uiZoom(context));
101447
101448                 controls
101449                     .append('div')
101450                     .attr('class', 'map-control geolocate-control')
101451                     .call(uiGeolocate(context));
101452
101453                 var background = uiBackground(context);
101454                 controls
101455                     .append('div')
101456                     .attr('class', 'map-control background-control')
101457                     .call(background.renderToggleButton);
101458
101459                 var mapData = uiMapData(context);
101460                 controls
101461                     .append('div')
101462                     .attr('class', 'map-control map-data-control')
101463                     .call(mapData.renderToggleButton);
101464
101465                 var issues = uiIssues(context);
101466                 controls
101467                     .append('div')
101468                     .attr('class', 'map-control map-issues-control')
101469                     .call(issues.renderToggleButton);
101470
101471                 var help = uiHelp(context);
101472                 controls
101473                     .append('div')
101474                     .attr('class', 'map-control help-control')
101475                     .call(help.renderToggleButton);
101476
101477                 content
101478                     .append('div')
101479                     .attr('class', 'spinner')
101480                     .call(uiSpinner(context));
101481
101482                 // Add attribution and footer
101483                 var about = content
101484                     .append('div')
101485                     .attr('id', 'about');
101486
101487                 about
101488                     .append('div')
101489                     .attr('id', 'attrib')
101490                     .attr('dir', 'ltr')
101491                     .call(uiAttribution(context));
101492
101493                 about
101494                     .append('div')
101495                     .attr('class', 'api-status')
101496                     .call(uiStatus(context));
101497
101498
101499                 var footer = about
101500                     .append('div')
101501                     .attr('id', 'footer')
101502                     .attr('class', 'fillD');
101503
101504                 footer
101505                     .append('div')
101506                     .attr('id', 'flash-wrap')
101507                     .attr('class', 'footer-hide');
101508
101509                 var footerWrap = footer
101510                     .append('div')
101511                     .attr('id', 'footer-wrap')
101512                     .attr('class', 'footer-show');
101513
101514                 footerWrap
101515                     .append('div')
101516                     .attr('id', 'scale-block')
101517                     .call(uiScale(context));
101518
101519                 var aboutList = footerWrap
101520                     .append('div')
101521                     .attr('id', 'info-block')
101522                     .append('ul')
101523                     .attr('id', 'about-list');
101524
101525                 if (!context.embed()) {
101526                     aboutList
101527                         .call(uiAccount(context));
101528                 }
101529
101530                 aboutList
101531                     .append('li')
101532                     .attr('class', 'version')
101533                     .call(uiVersion(context));
101534
101535                 var issueLinks = aboutList
101536                     .append('li');
101537
101538                 issueLinks
101539                     .append('a')
101540                     .attr('target', '_blank')
101541                     .attr('tabindex', -1)
101542                     .attr('href', 'https://github.com/openstreetmap/iD/issues')
101543                     .call(svgIcon('#iD-icon-bug', 'light'))
101544                     .call(tooltip().title(t('report_a_bug')).placement('top'));
101545
101546                 issueLinks
101547                     .append('a')
101548                     .attr('target', '_blank')
101549                     .attr('tabindex', -1)
101550                     .attr('href', 'https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating')
101551                     .call(svgIcon('#iD-icon-translate', 'light'))
101552                     .call(tooltip().title(t('help_translate')).placement('top'));
101553
101554                 aboutList
101555                     .append('li')
101556                     .attr('class', 'feature-warning')
101557                     .attr('tabindex', -1)
101558                     .call(uiFeatureInfo(context));
101559
101560                 aboutList
101561                     .append('li')
101562                     .attr('class', 'user-list')
101563                     .attr('tabindex', -1)
101564                     .call(uiContributors(context));
101565
101566
101567                 // Setup map dimensions and move map to initial center/zoom.
101568                 // This should happen after #content and toolbars exist.
101569                 ui.onResize();
101570                 map.redrawEnable(true);
101571
101572                 var hash = behaviorHash(context);
101573                 hash();
101574                 if (!hash.hadHash) {
101575                     map.centerZoom([0, 0], 2);
101576                 }
101577
101578
101579                 var overMap = content
101580                     .append('div')
101581                     .attr('class', 'over-map');
101582
101583                 // Add panes
101584                 // This should happen after map is initialized, as some require surface()
101585                 var panes = overMap
101586                     .append('div')
101587                     .attr('class', 'map-panes');
101588
101589                 panes
101590                     .call(background.renderPane)
101591                     .call(mapData.renderPane)
101592                     .call(issues.renderPane)
101593                     .call(help.renderPane);
101594
101595                 // Add absolutely-positioned elements that sit on top of the map
101596                 // This should happen after the map is ready (center/zoom)
101597                 overMap
101598                     .call(uiMapInMap(context))
101599                     .call(uiInfo(context))
101600                     .call(uiNotice(context));
101601
101602
101603                 overMap
101604                     .append('div')
101605                     .attr('id', 'photoviewer')
101606                     .classed('al', true)       // 'al'=left,  'ar'=right
101607                     .classed('hide', true)
101608                     .call(ui.photoviewer);
101609
101610
101611                 // Bind events
101612                 window.onbeforeunload = function() {
101613                     return context.save();
101614                 };
101615                 window.onunload = function() {
101616                     context.history().unlock();
101617                 };
101618
101619                 d3_select(window)
101620                     .on('gesturestart.editor', eventCancel)
101621                     .on('gesturechange.editor', eventCancel)
101622                     .on('gestureend.editor', eventCancel)
101623                     .on('resize.editor', ui.onResize);
101624
101625
101626                 var panPixels = 80;
101627                 context.keybinding()
101628                     .on('⌫', function() { event.preventDefault(); })
101629                     .on([t('sidebar.key'), '`', '²'], ui.sidebar.toggle)   // #5663 - common QWERTY, AZERTY
101630                     .on('←', pan([panPixels, 0]))
101631                     .on('↑', pan([0, panPixels]))
101632                     .on('→', pan([-panPixels, 0]))
101633                     .on('↓', pan([0, -panPixels]))
101634                     .on(['⇧←', uiCmd('⌘←')], pan([map.dimensions()[0], 0]))
101635                     .on(['⇧↑', uiCmd('⌘↑')], pan([0, map.dimensions()[1]]))
101636                     .on(['⇧→', uiCmd('⌘→')], pan([-map.dimensions()[0], 0]))
101637                     .on(['⇧↓', uiCmd('⌘↓')], pan([0, -map.dimensions()[1]]));
101638
101639                 context.enter(modeBrowse(context));
101640
101641                 if (!_initCounter++) {
101642                     if (!hash.startWalkthrough) {
101643                         context.container()
101644                             .call(uiSplash(context))
101645                             .call(uiRestore(context));
101646                     }
101647
101648                     context.container()
101649                         .call(uiShortcuts(context));
101650                 }
101651
101652                 var osm = context.connection();
101653                 var auth = uiLoading(context).message(t('loading_auth')).blocking(true);
101654
101655                 if (osm && auth) {
101656                     osm
101657                         .on('authLoading.ui', function() {
101658                             context.container()
101659                                 .call(auth);
101660                         })
101661                         .on('authDone.ui', function() {
101662                             auth.close();
101663                         });
101664                 }
101665
101666                 _initCounter++;
101667
101668                 if (hash.startWalkthrough) {
101669                     hash.startWalkthrough = false;
101670                     context.container().call(uiIntro(context));
101671                 }
101672
101673
101674                 function pan(d) {
101675                     return function() {
101676                         if (d3_select('.combobox').size()) return;
101677                         event.preventDefault();
101678                         context.pan(d, 100);
101679                     };
101680                 }
101681
101682                 function eventCancel() {
101683                     event.preventDefault();
101684                 }
101685             }
101686
101687
101688             function ui(node, callback) {
101689                 _initCallback = callback;
101690                 var container = d3_select(node);
101691                 context.container(container);
101692                 context.loadLocale(function(err) {
101693                     if (!err) {
101694                         render(container);
101695                     }
101696                     if (callback) {
101697                         callback(err);
101698                     }
101699                 });
101700             }
101701
101702
101703             ui.restart = function(arg) {
101704                 context.keybinding().clear();
101705                 context.locale(arg);
101706                 context.loadLocale(function(err) {
101707                     if (!err) {
101708                         context.container().selectAll('*').remove();
101709                         render(context.container());
101710                         if (_initCallback) _initCallback();
101711                     }
101712                 });
101713             };
101714
101715
101716             ui.sidebar = uiSidebar(context);
101717
101718             ui.photoviewer = uiPhotoviewer(context);
101719
101720             ui.onResize = function(withPan) {
101721                 var map = context.map();
101722
101723                 // Recalc dimensions of map and sidebar.. (`true` = force recalc)
101724                 // This will call `getBoundingClientRect` and trigger reflow,
101725                 //  but the values will be cached for later use.
101726                 var mapDimensions = utilGetDimensions(d3_select('#content'), true);
101727                 utilGetDimensions(d3_select('#sidebar'), true);
101728
101729                 if (withPan !== undefined) {
101730                     map.redrawEnable(false);
101731                     map.pan(withPan);
101732                     map.redrawEnable(true);
101733                 }
101734                 map.dimensions(mapDimensions);
101735
101736                 ui.photoviewer.onMapResize();
101737
101738                 // check if header or footer have overflowed
101739                 ui.checkOverflow('#bar');
101740                 ui.checkOverflow('#footer');
101741
101742                 // Use outdated code so it works on Explorer
101743                 var resizeWindowEvent = document.createEvent('Event');
101744
101745                 resizeWindowEvent.initEvent('resizeWindow', true, true);
101746
101747                 document.dispatchEvent(resizeWindowEvent);
101748             };
101749
101750
101751             // Call checkOverflow when resizing or whenever the contents change.
101752             ui.checkOverflow = function(selector, reset) {
101753                 if (reset) {
101754                     delete _needWidth[selector];
101755                 }
101756
101757                 var element = d3_select(selector);
101758                 var scrollWidth = element.property('scrollWidth');
101759                 var clientWidth = element.property('clientWidth');
101760                 var needed = _needWidth[selector] || scrollWidth;
101761
101762                 if (scrollWidth > clientWidth) {    // overflow happening
101763                     element.classed('narrow', true);
101764                     if (!_needWidth[selector]) {
101765                         _needWidth[selector] = scrollWidth;
101766                     }
101767
101768                 } else if (scrollWidth >= needed) {
101769                     element.classed('narrow', false);
101770                 }
101771             };
101772
101773             ui.togglePanes = function(showPane) {
101774                 var shownPanes = d3_selectAll('.map-pane.shown');
101775
101776                 var side = textDirection === 'ltr' ? 'right' : 'left';
101777
101778                 shownPanes
101779                     .classed('shown', false);
101780
101781                 d3_selectAll('.map-control button')
101782                     .classed('active', false);
101783
101784                 if (showPane) {
101785                     shownPanes
101786                         .style('display', 'none')
101787                         .style(side, '-500px');
101788
101789                     d3_selectAll('.' + showPane.attr('pane') + '-control button')
101790                         .classed('active', true);
101791
101792                     showPane
101793                         .classed('shown', true)
101794                         .style('display', 'block');
101795                     if (shownPanes.empty()) {
101796                         showPane
101797                             .style('display', 'block')
101798                             .style(side, '-500px')
101799                             .transition()
101800                             .duration(200)
101801                             .style(side, '0px');
101802                     } else {
101803                         showPane
101804                             .style(side, '0px');
101805                     }
101806                 } else {
101807                     shownPanes
101808                         .style('display', 'block')
101809                         .style(side, '0px')
101810                         .transition()
101811                         .duration(200)
101812                         .style(side, '-500px')
101813                         .on('end', function() {
101814                             d3_select(this).style('display', 'none');
101815                         });
101816                 }
101817             };
101818
101819             return ui;
101820         }
101821
101822         function coreContext() {
101823             var dispatch$1 = dispatch('enter', 'exit', 'change');
101824             var context = utilRebind({}, dispatch$1, 'on');
101825             var _deferred = new Set();
101826
101827             context.version = '2.15.3';
101828
101829             // create a special translation that contains the keys in place of the strings
101830             var tkeys = JSON.parse(JSON.stringify(en));  // clone deep
101831             var parents = [];
101832
101833             function traverser(v, k, obj) {
101834                 parents.push(k);
101835                 if (typeof v === 'object') {
101836                     forOwn(v, traverser);
101837                 } else if (typeof v === 'string') {
101838                     obj[k] = parents.join('.');
101839                 }
101840                 parents.pop();
101841             }
101842
101843             function forOwn(obj, fn) {
101844                 Object.keys(obj).forEach(function(k) { fn(obj[k], k, obj); });
101845             }
101846
101847             forOwn(tkeys, traverser);
101848             addTranslation('_tkeys_', tkeys);
101849
101850             addTranslation('en', en);
101851             setLocale('en');
101852
101853
101854             // https://github.com/openstreetmap/iD/issues/772
101855             // http://mathiasbynens.be/notes/localstorage-pattern#comment-9
101856             var storage;
101857             try { storage = localStorage; } catch (e) {}  // eslint-disable-line no-empty
101858             storage = storage || (function() {
101859                 var s = {};
101860                 return {
101861                     getItem: function(k) { return s[k]; },
101862                     setItem: function(k, v) { s[k] = v; },
101863                     removeItem: function(k) { delete s[k]; }
101864                 };
101865             })();
101866
101867             context.storage = function(k, v) {
101868                 try {
101869                     if (arguments.length === 1) return storage.getItem(k);
101870                     else if (v === null) storage.removeItem(k);
101871                     else storage.setItem(k, v);
101872                 } catch (e) {
101873                     // localstorage quota exceeded
101874                     /* eslint-disable no-console */
101875                     if (typeof console !== 'undefined') console.error('localStorage quota exceeded');
101876                     /* eslint-enable no-console */
101877                 }
101878             };
101879
101880
101881             /* User interface and keybinding */
101882             var ui;
101883             context.ui = function() { return ui; };
101884
101885             var keybinding = utilKeybinding('context');
101886             context.keybinding = function() { return keybinding; };
101887             d3_select(document).call(keybinding);
101888
101889
101890             /* Straight accessors. Avoid using these if you can. */
101891             var connection, history, validator;
101892             context.connection = function() { return connection; };
101893             context.history = function() { return history; };
101894             context.validator = function() { return validator; };
101895
101896             /* Connection */
101897             context.preauth = function(options) {
101898                 if (connection) {
101899                     connection.switch(options);
101900                 }
101901                 return context;
101902             };
101903
101904
101905             function afterLoad(cid, callback) {
101906                 return function(err, result) {
101907                     if (err) {
101908                         // 400 Bad Request, 401 Unauthorized, 403 Forbidden..
101909                         if (err.status === 400 || err.status === 401 || err.status === 403) {
101910                             if (connection) {
101911                                 connection.logout();
101912                             }
101913                         }
101914                         if (typeof callback === 'function') {
101915                             callback(err);
101916                         }
101917                         return;
101918
101919                     } else if (connection && connection.getConnectionId() !== cid) {
101920                         if (typeof callback === 'function') {
101921                             callback({ message: 'Connection Switched', status: -1 });
101922                         }
101923                         return;
101924
101925                     } else {
101926                         history.merge(result.data, result.extent);
101927                         if (typeof callback === 'function') {
101928                             callback(err, result);
101929                         }
101930                         return;
101931                     }
101932                 };
101933             }
101934
101935
101936             context.loadTiles = function(projection, callback) {
101937                 var handle = window.requestIdleCallback(function() {
101938                     _deferred.delete(handle);
101939                     if (connection && context.editable()) {
101940                         var cid = connection.getConnectionId();
101941                         connection.loadTiles(projection, afterLoad(cid, callback));
101942                     }
101943                 });
101944                 _deferred.add(handle);
101945             };
101946
101947             context.loadTileAtLoc = function(loc, callback) {
101948                 var handle = window.requestIdleCallback(function() {
101949                     _deferred.delete(handle);
101950                     if (connection && context.editable()) {
101951                         var cid = connection.getConnectionId();
101952                         connection.loadTileAtLoc(loc, afterLoad(cid, callback));
101953                     }
101954                 });
101955                 _deferred.add(handle);
101956             };
101957
101958             context.loadEntity = function(entityID, callback) {
101959                 if (connection) {
101960                     var cid = connection.getConnectionId();
101961                     connection.loadEntity(entityID, afterLoad(cid, callback));
101962                 }
101963             };
101964
101965             context.zoomToEntity = function(entityID, zoomTo) {
101966                 if (zoomTo !== false) {
101967                     this.loadEntity(entityID, function(err, result) {
101968                         if (err) return;
101969                         var entity = result.data.find(function(e) { return e.id === entityID; });
101970                         if (entity) {
101971                             map.zoomTo(entity);
101972                         }
101973                     });
101974                 }
101975
101976                 map.on('drawn.zoomToEntity', function() {
101977                     if (!context.hasEntity(entityID)) return;
101978                     map.on('drawn.zoomToEntity', null);
101979                     context.on('enter.zoomToEntity', null);
101980                     context.enter(modeSelect(context, [entityID]));
101981                 });
101982
101983                 context.on('enter.zoomToEntity', function() {
101984                     if (mode.id !== 'browse') {
101985                         map.on('drawn.zoomToEntity', null);
101986                         context.on('enter.zoomToEntity', null);
101987                     }
101988                 });
101989             };
101990
101991             var minEditableZoom = 16;
101992             context.minEditableZoom = function(val) {
101993                 if (!arguments.length) return minEditableZoom;
101994                 minEditableZoom = val;
101995                 if (connection) {
101996                     connection.tileZoom(val);
101997                 }
101998                 return context;
101999             };
102000
102001
102002             /* History */
102003             var inIntro = false;
102004             context.inIntro = function(val) {
102005                 if (!arguments.length) return inIntro;
102006                 inIntro = val;
102007                 return context;
102008             };
102009
102010             context.save = function() {
102011                 // no history save, no message onbeforeunload
102012                 if (inIntro || d3_select('.modal').size()) return;
102013
102014                 var canSave;
102015                 if (mode && mode.id === 'save') {
102016                     canSave = false;
102017
102018                     // Attempt to prevent user from creating duplicate changes - see #5200
102019                     if (services$1.osm && services$1.osm.isChangesetInflight()) {
102020                         history.clearSaved();
102021                         return;
102022                     }
102023
102024                 } else {
102025                     canSave = context.selectedIDs().every(function(id) {
102026                         var entity = context.hasEntity(id);
102027                         return entity && !entity.isDegenerate();
102028                     });
102029                 }
102030
102031                 if (canSave) {
102032                     history.save();
102033                 }
102034                 if (history.hasChanges()) {
102035                     return t('save.unsaved_changes');
102036                 }
102037             };
102038
102039
102040             /* Graph */
102041             context.hasEntity = function(id) {
102042                 return history.graph().hasEntity(id);
102043             };
102044             context.entity = function(id) {
102045                 return history.graph().entity(id);
102046             };
102047             context.childNodes = function(way) {
102048                 return history.graph().childNodes(way);
102049             };
102050             context.geometry = function(id) {
102051                 return context.entity(id).geometry(history.graph());
102052             };
102053
102054
102055             /* Modes */
102056             var mode;
102057             context.mode = function() {
102058                 return mode;
102059             };
102060             context.enter = function(newMode) {
102061                 if (mode) {
102062                     mode.exit();
102063                     dispatch$1.call('exit', this, mode);
102064                 }
102065
102066                 mode = newMode;
102067                 mode.enter();
102068                 dispatch$1.call('enter', this, mode);
102069             };
102070
102071             context.selectedIDs = function() {
102072                 if (mode && mode.selectedIDs) {
102073                     return mode.selectedIDs();
102074                 } else {
102075                     return [];
102076                 }
102077             };
102078
102079             context.activeID = function() {
102080                 return mode && mode.activeID && mode.activeID();
102081             };
102082
102083             var _selectedNoteID;
102084             context.selectedNoteID = function(noteID) {
102085                 if (!arguments.length) return _selectedNoteID;
102086                 _selectedNoteID = noteID;
102087                 return context;
102088             };
102089
102090             var _selectedErrorID;
102091             context.selectedErrorID = function(errorID) {
102092                 if (!arguments.length) return _selectedErrorID;
102093                 _selectedErrorID = errorID;
102094                 return context;
102095             };
102096
102097
102098             /* Behaviors */
102099             context.install = function(behavior) {
102100                 context.surface().call(behavior);
102101             };
102102             context.uninstall = function(behavior) {
102103                 context.surface().call(behavior.off);
102104             };
102105
102106
102107             /* Copy/Paste */
102108             var copyIDs = [], copyGraph;
102109             context.copyGraph = function() { return copyGraph; };
102110             context.copyIDs = function(val) {
102111                 if (!arguments.length) return copyIDs;
102112                 copyIDs = val;
102113                 copyGraph = history.graph();
102114                 return context;
102115             };
102116
102117
102118             /* Background */
102119             var background;
102120             context.background = function() { return background; };
102121
102122
102123             /* Features */
102124             var features;
102125             context.features = function() { return features; };
102126             context.hasHiddenConnections = function(id) {
102127                 var graph = history.graph();
102128                 var entity = graph.entity(id);
102129                 return features.hasHiddenConnections(entity, graph);
102130             };
102131
102132
102133             /* Photos */
102134             var photos;
102135             context.photos = function() { return photos; };
102136
102137
102138             /* Presets */
102139             var presets;
102140             context.presets = function() { return presets; };
102141
102142
102143             /* Map */
102144             var map;
102145             context.map = function() { return map; };
102146             context.layers = function() { return map.layers; };
102147             context.surface = function() { return map.surface; };
102148             context.editable = function() { return map.editable(); };
102149             context.surfaceRect = function() {
102150                 return map.surface.node().getBoundingClientRect();
102151             };
102152
102153
102154             /* Debug */
102155             var debugFlags = {
102156                 tile: false,        // tile boundaries
102157                 collision: false,   // label collision bounding boxes
102158                 imagery: false,     // imagery bounding polygons
102159                 community: false,   // community bounding polygons
102160                 imperial: false,    // imperial (not metric) bounding polygons
102161                 driveLeft: false,   // driveLeft bounding polygons
102162                 target: false,      // touch targets
102163                 downloaded: false   // downloaded data from osm
102164             };
102165             context.debugFlags = function() {
102166                 return debugFlags;
102167             };
102168             context.setDebug = function(flag, val) {
102169                 if (arguments.length === 1) val = true;
102170                 debugFlags[flag] = val;
102171                 dispatch$1.call('change');
102172                 return context;
102173             };
102174             context.getDebug = function(flag) {
102175                 return flag && debugFlags[flag];
102176             };
102177
102178
102179             /* Container */
102180             var container = d3_select(document.body);
102181             context.container = function(val) {
102182                 if (!arguments.length) return container;
102183                 container = val;
102184                 container.classed('id-container', true);
102185                 return context;
102186             };
102187             var embed;
102188             context.embed = function(val) {
102189                 if (!arguments.length) return embed;
102190                 embed = val;
102191                 return context;
102192             };
102193
102194
102195             /* Assets */
102196             var assetPath = '';
102197             context.assetPath = function(val) {
102198                 if (!arguments.length) return assetPath;
102199                 assetPath = val;
102200                 return context;
102201             };
102202
102203             var assetMap = {};
102204             context.assetMap = function(val) {
102205                 if (!arguments.length) return assetMap;
102206                 assetMap = val;
102207                 return context;
102208             };
102209
102210             context.asset = function(val) {
102211                 var filename = assetPath + val;
102212                 return assetMap[filename] || filename;
102213             };
102214
102215             context.imagePath = function(val) {
102216                 return context.asset('img/' + val);
102217             };
102218
102219
102220             /* locales */
102221             // `locale` variable contains a "requested locale".
102222             // It won't become the `currentLocale` until after loadLocale() is called.
102223             var locale, localePath;
102224
102225             context.locale = function(loc, path) {
102226                 if (!arguments.length) return currentLocale;
102227                 locale = loc;
102228                 localePath = path;
102229                 return context;
102230             };
102231
102232             context.loadLocale = function(callback) {
102233                 if (locale && locale !== 'en' && dataLocales.hasOwnProperty(locale)) {
102234                     localePath = localePath || context.asset('locales/' + locale + '.json');
102235                     d3_json(localePath)
102236                         .then(function(result) {
102237                             addTranslation(locale, result[locale]);
102238                             setLocale(locale);
102239                             utilDetect(true);
102240                             if (callback) callback();
102241                         })
102242                         .catch(function(err) {
102243                             if (callback) callback(err.message);
102244                         });
102245                 } else {
102246                     if (locale) {
102247                         setLocale(locale);
102248                         utilDetect(true);
102249                     }
102250                     if (callback) {
102251                         callback();
102252                     }
102253                 }
102254             };
102255
102256
102257             /* reset (aka flush) */
102258             context.reset = context.flush = function() {
102259                 context.debouncedSave.cancel();
102260
102261                 Array.from(_deferred).forEach(function(handle) {
102262                     window.cancelIdleCallback(handle);
102263                     _deferred.delete(handle);
102264                 });
102265
102266                 Object.values(services$1).forEach(function(service) {
102267                     if (service && typeof service.reset === 'function') {
102268                         service.reset(context);
102269                     }
102270                 });
102271
102272                 validator.reset();
102273                 features.reset();
102274                 history.reset();
102275
102276                 return context;
102277             };
102278
102279
102280             /* Init */
102281
102282             context.projection = geoRawMercator();
102283             context.curtainProjection = geoRawMercator();
102284
102285             locale = utilDetect().locale;
102286             if (locale && !dataLocales.hasOwnProperty(locale)) {
102287                 locale = locale.split('-')[0];
102288             }
102289
102290             history = coreHistory(context);
102291             validator = coreValidator(context);
102292
102293             context.graph = history.graph;
102294             context.changes = history.changes;
102295             context.intersects = history.intersects;
102296             context.pauseChangeDispatch = history.pauseChangeDispatch;
102297             context.resumeChangeDispatch = history.resumeChangeDispatch;
102298
102299             // Debounce save, since it's a synchronous localStorage write,
102300             // and history changes can happen frequently (e.g. when dragging).
102301             context.debouncedSave = debounce(context.save, 350);
102302             function withDebouncedSave(fn) {
102303                 return function() {
102304                     var result = fn.apply(history, arguments);
102305                     context.debouncedSave();
102306                     return result;
102307                 };
102308             }
102309
102310             context.perform = withDebouncedSave(history.perform);
102311             context.replace = withDebouncedSave(history.replace);
102312             context.pop = withDebouncedSave(history.pop);
102313             context.overwrite = withDebouncedSave(history.overwrite);
102314             context.undo = withDebouncedSave(history.undo);
102315             context.redo = withDebouncedSave(history.redo);
102316
102317             ui = uiInit(context);
102318
102319             connection = services$1.osm;
102320             background = rendererBackground(context);
102321             features = rendererFeatures(context);
102322             photos = rendererPhotos(context);
102323             presets = presetIndex(context);
102324
102325             if (services$1.maprules && utilStringQs(window.location.hash).maprules) {
102326                 var maprules = utilStringQs(window.location.hash).maprules;
102327                 d3_json(maprules)
102328                     .then(function(mapcss) {
102329                         services$1.maprules.init();
102330                         mapcss.forEach(function(mapcssSelector) {
102331                             return services$1.maprules.addRule(mapcssSelector);
102332                         });
102333                     })
102334                     .catch(function() {
102335                         /* ignore */
102336                     });
102337             }
102338
102339             map = rendererMap(context);
102340             context.mouse = map.mouse;
102341             context.extent = map.extent;
102342             context.pan = map.pan;
102343             context.zoomIn = map.zoomIn;
102344             context.zoomOut = map.zoomOut;
102345             context.zoomInFurther = map.zoomInFurther;
102346             context.zoomOutFurther = map.zoomOutFurther;
102347             context.redrawEnable = map.redrawEnable;
102348
102349             Object.values(services$1).forEach(function(service) {
102350                 if (service && typeof service.init === 'function') {
102351                     service.init(context);
102352                 }
102353             });
102354
102355             validator.init();
102356             background.init();
102357             features.init();
102358             photos.init();
102359
102360             var presetsParameter = utilStringQs(window.location.hash).presets;
102361             if (presetsParameter && presetsParameter.indexOf('://') !== -1) {
102362                 // assume URL of external presets file
102363
102364                 presets.fromExternal(external, function(externalPresets) {
102365                     context.presets = function() { return externalPresets; }; // default + external presets...
102366                     osmSetAreaKeys(presets.areaKeys());
102367                     osmSetPointTags(presets.pointTags());
102368                     osmSetVertexTags(presets.vertexTags());
102369                 });
102370             } else {
102371                 var isVisible;
102372                 if (presetsParameter) {
102373                     // assume list of allowed preset IDs
102374                     var visiblePresetIDs = new Set(presetsParameter.split(','));
102375                     isVisible = function(presetID) {
102376                         return visiblePresetIDs.has(presetID);
102377                     };
102378                 }
102379                 presets.init(isVisible);
102380                 osmSetAreaKeys(presets.areaKeys());
102381                 osmSetPointTags(presets.pointTags());
102382                 osmSetVertexTags(presets.vertexTags());
102383             }
102384
102385             return context;
102386         }
102387
102388         function uiSourceSwitch(context) {
102389             var keys;
102390
102391
102392             function click() {
102393                 event.preventDefault();
102394
102395                 var osm = context.connection();
102396                 if (!osm) return;
102397
102398                 if (context.inIntro()) return;
102399
102400                 if (context.history().hasChanges() &&
102401                     !window.confirm(t('source_switch.lose_changes'))) return;
102402
102403                 var isLive = d3_select(this)
102404                     .classed('live');
102405
102406                 isLive = !isLive;
102407                 context.enter(modeBrowse(context));
102408                 context.history().clearSaved();          // remove saved history
102409                 context.flush();                         // remove stored data
102410
102411                 d3_select(this)
102412                     .text(isLive ? t('source_switch.live') : t('source_switch.dev'))
102413                     .classed('live', isLive);
102414
102415                 osm.switch(isLive ? keys[0] : keys[1]);  // switch connection (warning: dispatches 'change' event)
102416             }
102417
102418             var sourceSwitch = function(selection) {
102419                 selection
102420                     .append('a')
102421                     .attr('href', '#')
102422                     .text(t('source_switch.live'))
102423                     .classed('live', true)
102424                     .attr('tabindex', -1)
102425                     .on('click', click);
102426             };
102427
102428
102429             sourceSwitch.keys = function(_) {
102430                 if (!arguments.length) return keys;
102431                 keys = _;
102432                 return sourceSwitch;
102433             };
102434
102435
102436             return sourceSwitch;
102437         }
102438
102439         var Connection = services$1.osm;
102440
102441         var debug = false;
102442
102443         var iD = /*#__PURE__*/Object.freeze({
102444                 Connection: Connection,
102445                 debug: debug,
102446                 d3: index$3,
102447                 Context: coreContext,
102448                 setAreaKeys: osmSetAreaKeys,
102449                 get areaKeys () { return osmAreaKeys; },
102450                 Difference: coreDifference,
102451                 Graph: coreGraph,
102452                 History: coreHistory,
102453                 Tree: coreTree,
102454                 geoCross: geoVecCross,
102455                 geoInterp: geoVecInterp,
102456                 geoRoundCoordinates: geoVecFloor,
102457                 geoEuclideanDistance: geoVecLength,
102458                 Entity: osmEntity,
102459                 Node: osmNode,
102460                 Relation: osmRelation,
102461                 Way: osmWay,
102462                 BackgroundSource: rendererBackgroundSource,
102463                 Background: rendererBackground,
102464                 Features: rendererFeatures,
102465                 Map: rendererMap,
102466                 TileLayer: rendererTileLayer,
102467                 Detect: utilDetect,
102468                 uiPreset: uiPresetEditor,
102469                 rendererBackgroundSource: rendererBackgroundSource,
102470                 rendererBackground: rendererBackground,
102471                 rendererFeatures: rendererFeatures,
102472                 rendererMap: rendererMap,
102473                 rendererPhotos: rendererPhotos,
102474                 rendererTileLayer: rendererTileLayer,
102475                 actionAddEntity: actionAddEntity,
102476                 actionAddMember: actionAddMember,
102477                 actionAddMidpoint: actionAddMidpoint,
102478                 actionAddVertex: actionAddVertex,
102479                 actionChangeMember: actionChangeMember,
102480                 actionChangePreset: actionChangePreset,
102481                 actionChangeTags: actionChangeTags,
102482                 actionCircularize: actionCircularize,
102483                 actionConnect: actionConnect,
102484                 actionCopyEntities: actionCopyEntities,
102485                 actionDeleteMember: actionDeleteMember,
102486                 actionDeleteMultiple: actionDeleteMultiple,
102487                 actionDeleteNode: actionDeleteNode,
102488                 actionDeleteRelation: actionDeleteRelation,
102489                 actionDeleteWay: actionDeleteWay,
102490                 actionDiscardTags: actionDiscardTags,
102491                 actionDisconnect: actionDisconnect,
102492                 actionExtract: actionExtract,
102493                 actionJoin: actionJoin,
102494                 actionMerge: actionMerge,
102495                 actionMergeNodes: actionMergeNodes,
102496                 actionMergePolygon: actionMergePolygon,
102497                 actionMergeRemoteChanges: actionMergeRemoteChanges,
102498                 actionMove: actionMove,
102499                 actionMoveMember: actionMoveMember,
102500                 actionMoveNode: actionMoveNode,
102501                 actionNoop: actionNoop,
102502                 actionOrthogonalize: actionOrthogonalize,
102503                 actionRestrictTurn: actionRestrictTurn,
102504                 actionReverse: actionReverse,
102505                 actionRevert: actionRevert,
102506                 actionRotate: actionRotate,
102507                 actionSplit: actionSplit,
102508                 actionStraightenNodes: actionStraightenNodes,
102509                 actionStraightenWay: actionStraightenWay,
102510                 actionUnrestrictTurn: actionUnrestrictTurn,
102511                 actionReflect: actionReflect,
102512                 actionUpgradeTags: actionUpgradeTags,
102513                 coreContext: coreContext,
102514                 coreDifference: coreDifference,
102515                 coreGraph: coreGraph,
102516                 coreHistory: coreHistory,
102517                 coreTree: coreTree,
102518                 coreValidator: coreValidator,
102519                 data: data,
102520                 dataWikipedia: wikipedia$2,
102521                 dataAddressFormats: dataAddressFormats,
102522                 dataDeprecated: dataDeprecated,
102523                 dataDiscarded: dataDiscarded,
102524                 dataLocales: dataLocales,
102525                 dataPhoneFormats: dataPhoneFormats,
102526                 dataShortcuts: dataShortcuts,
102527                 dataImperial: dataImperial,
102528                 dataDriveLeft: dataDriveLeft,
102529                 dataEn: en,
102530                 geoExtent: geoExtent,
102531                 geoLatToMeters: geoLatToMeters,
102532                 geoLonToMeters: geoLonToMeters,
102533                 geoMetersToLat: geoMetersToLat,
102534                 geoMetersToLon: geoMetersToLon,
102535                 geoMetersToOffset: geoMetersToOffset,
102536                 geoOffsetToMeters: geoOffsetToMeters,
102537                 geoScaleToZoom: geoScaleToZoom,
102538                 geoSphericalClosestNode: geoSphericalClosestNode,
102539                 geoSphericalDistance: geoSphericalDistance,
102540                 geoZoomToScale: geoZoomToScale,
102541                 geoAngle: geoAngle,
102542                 geoChooseEdge: geoChooseEdge,
102543                 geoEdgeEqual: geoEdgeEqual,
102544                 geoGetSmallestSurroundingRectangle: geoGetSmallestSurroundingRectangle,
102545                 geoHasLineIntersections: geoHasLineIntersections,
102546                 geoHasSelfIntersections: geoHasSelfIntersections,
102547                 geoRotate: geoRotate,
102548                 geoLineIntersection: geoLineIntersection,
102549                 geoPathHasIntersections: geoPathHasIntersections,
102550                 geoPathIntersections: geoPathIntersections,
102551                 geoPathLength: geoPathLength,
102552                 geoPointInPolygon: geoPointInPolygon,
102553                 geoPolygonContainsPolygon: geoPolygonContainsPolygon,
102554                 geoPolygonIntersectsPolygon: geoPolygonIntersectsPolygon,
102555                 geoViewportEdge: geoViewportEdge,
102556                 geoRawMercator: geoRawMercator,
102557                 geoVecAdd: geoVecAdd,
102558                 geoVecAngle: geoVecAngle,
102559                 geoVecCross: geoVecCross,
102560                 geoVecDot: geoVecDot,
102561                 geoVecEqual: geoVecEqual,
102562                 geoVecFloor: geoVecFloor,
102563                 geoVecInterp: geoVecInterp,
102564                 geoVecLength: geoVecLength,
102565                 geoVecNormalize: geoVecNormalize,
102566                 geoVecNormalizedDot: geoVecNormalizedDot,
102567                 geoVecProject: geoVecProject,
102568                 geoVecSubtract: geoVecSubtract,
102569                 geoVecScale: geoVecScale,
102570                 geoOrthoNormalizedDotProduct: geoOrthoNormalizedDotProduct,
102571                 geoOrthoCalcScore: geoOrthoCalcScore,
102572                 geoOrthoMaxOffsetAngle: geoOrthoMaxOffsetAngle,
102573                 geoOrthoCanOrthogonalize: geoOrthoCanOrthogonalize,
102574                 modeAddArea: modeAddArea,
102575                 modeAddLine: modeAddLine,
102576                 modeAddPoint: modeAddPoint,
102577                 modeAddNote: modeAddNote,
102578                 modeBrowse: modeBrowse,
102579                 modeDragNode: modeDragNode,
102580                 modeDragNote: modeDragNote,
102581                 modeDrawArea: modeDrawArea,
102582                 modeDrawLine: modeDrawLine,
102583                 modeMove: modeMove,
102584                 modeRotate: modeRotate,
102585                 modeSave: modeSave,
102586                 modeSelect: modeSelect,
102587                 modeSelectData: modeSelectData,
102588                 modeSelectError: modeSelectError,
102589                 modeSelectNote: modeSelectNote,
102590                 operationCircularize: operationCircularize,
102591                 operationContinue: operationContinue,
102592                 operationDelete: operationDelete,
102593                 operationDisconnect: operationDisconnect,
102594                 operationDowngrade: operationDowngrade,
102595                 operationExtract: operationExtract,
102596                 operationMerge: operationMerge,
102597                 operationMove: operationMove,
102598                 operationOrthogonalize: operationOrthogonalize,
102599                 operationReflectShort: operationReflectShort,
102600                 operationReflectLong: operationReflectLong,
102601                 operationReverse: operationReverse,
102602                 operationRotate: operationRotate,
102603                 operationSplit: operationSplit,
102604                 operationStraighten: operationStraighten,
102605                 osmChangeset: osmChangeset,
102606                 osmEntity: osmEntity,
102607                 osmNode: osmNode,
102608                 osmNote: osmNote,
102609                 osmRelation: osmRelation,
102610                 osmWay: osmWay,
102611                 qaError: qaError,
102612                 osmIntersection: osmIntersection,
102613                 osmTurn: osmTurn,
102614                 osmInferRestriction: osmInferRestriction,
102615                 osmLanes: osmLanes,
102616                 osmOldMultipolygonOuterMemberOfRelation: osmOldMultipolygonOuterMemberOfRelation,
102617                 osmIsOldMultipolygonOuterMember: osmIsOldMultipolygonOuterMember,
102618                 osmOldMultipolygonOuterMember: osmOldMultipolygonOuterMember,
102619                 osmJoinWays: osmJoinWays,
102620                 get osmAreaKeys () { return osmAreaKeys; },
102621                 osmSetAreaKeys: osmSetAreaKeys,
102622                 get osmPointTags () { return osmPointTags; },
102623                 osmSetPointTags: osmSetPointTags,
102624                 get osmVertexTags () { return osmVertexTags; },
102625                 osmSetVertexTags: osmSetVertexTags,
102626                 osmNodeGeometriesForTags: osmNodeGeometriesForTags,
102627                 osmOneWayTags: osmOneWayTags,
102628                 osmPavedTags: osmPavedTags,
102629                 osmIsInterestingTag: osmIsInterestingTag,
102630                 osmRoutableHighwayTagValues: osmRoutableHighwayTagValues,
102631                 osmFlowingWaterwayTagValues: osmFlowingWaterwayTagValues,
102632                 osmRailwayTrackTagValues: osmRailwayTrackTagValues,
102633                 presetCategory: presetCategory,
102634                 presetCollection: presetCollection,
102635                 presetField: presetField,
102636                 presetPreset: presetPreset,
102637                 presetIndex: presetIndex,
102638                 behaviorAddWay: behaviorAddWay,
102639                 behaviorBreathe: behaviorBreathe,
102640                 behaviorCopy: behaviorCopy,
102641                 behaviorDrag: behaviorDrag,
102642                 behaviorDrawWay: behaviorDrawWay,
102643                 behaviorDraw: behaviorDraw,
102644                 behaviorEdit: behaviorEdit,
102645                 behaviorHash: behaviorHash,
102646                 behaviorHover: behaviorHover,
102647                 behaviorLasso: behaviorLasso,
102648                 behaviorOperation: behaviorOperation,
102649                 behaviorPaste: behaviorPaste,
102650                 behaviorSelect: behaviorSelect,
102651                 behaviorTail: behaviorTail,
102652                 services: services$1,
102653                 serviceKeepRight: serviceKeepRight,
102654                 serviceImproveOSM: serviceImproveOSM,
102655                 serviceMapillary: serviceMapillary,
102656                 serviceMapRules: serviceMapRules,
102657                 serviceNominatim: serviceNominatim,
102658                 serviceOpenstreetcam: serviceOpenstreetcam,
102659                 serviceOsm: serviceOsm,
102660                 serviceOsmWikibase: serviceOsmWikibase,
102661                 serviceStreetside: serviceStreetside,
102662                 serviceTaginfo: serviceTaginfo,
102663                 serviceVectorTile: serviceVectorTile,
102664                 serviceWikidata: serviceWikidata,
102665                 serviceWikipedia: serviceWikipedia,
102666                 svgAreas: svgAreas,
102667                 svgData: svgData,
102668                 svgDebug: svgDebug,
102669                 svgDefs: svgDefs,
102670                 svgKeepRight: svgKeepRight,
102671                 svgIcon: svgIcon,
102672                 svgGeolocate: svgGeolocate,
102673                 svgLabels: svgLabels,
102674                 svgLayers: svgLayers,
102675                 svgLines: svgLines,
102676                 svgMapillaryImages: svgMapillaryImages,
102677                 svgMapillarySigns: svgMapillarySigns,
102678                 svgMidpoints: svgMidpoints,
102679                 svgNotes: svgNotes,
102680                 svgMarkerSegments: svgMarkerSegments,
102681                 svgOpenstreetcamImages: svgOpenstreetcamImages,
102682                 svgOsm: svgOsm,
102683                 svgPassiveVertex: svgPassiveVertex,
102684                 svgPath: svgPath,
102685                 svgPointTransform: svgPointTransform,
102686                 svgPoints: svgPoints,
102687                 svgRelationMemberTags: svgRelationMemberTags,
102688                 svgSegmentWay: svgSegmentWay,
102689                 svgStreetside: svgStreetside,
102690                 svgTagClasses: svgTagClasses,
102691                 svgTouch: svgTouch,
102692                 svgTurns: svgTurns,
102693                 svgVertices: svgVertices,
102694                 uiFields: uiFields,
102695                 uiFieldLocalized: uiFieldLocalized,
102696                 uiFieldDefaultCheck: uiFieldCheck,
102697                 uiFieldOnewayCheck: uiFieldCheck,
102698                 uiFieldCheck: uiFieldCheck,
102699                 uiFieldUrl: uiFieldText,
102700                 uiFieldNumber: uiFieldText,
102701                 uiFieldTel: uiFieldText,
102702                 uiFieldEmail: uiFieldText,
102703                 uiFieldText: uiFieldText,
102704                 uiFieldAccess: uiFieldAccess,
102705                 uiFieldAddress: uiFieldAddress,
102706                 uiFieldCycleway: uiFieldCycleway,
102707                 uiFieldLanes: uiFieldLanes,
102708                 uiFieldMultiCombo: uiFieldCombo,
102709                 uiFieldNetworkCombo: uiFieldCombo,
102710                 uiFieldSemiCombo: uiFieldCombo,
102711                 uiFieldTypeCombo: uiFieldCombo,
102712                 uiFieldCombo: uiFieldCombo,
102713                 uiFieldMaxspeed: uiFieldMaxspeed,
102714                 uiFieldStructureRadio: uiFieldRadio,
102715                 uiFieldRadio: uiFieldRadio,
102716                 uiFieldRestrictions: uiFieldRestrictions,
102717                 uiFieldTextarea: uiFieldTextarea,
102718                 uiFieldWikidata: uiFieldWikidata,
102719                 uiFieldWikipedia: uiFieldWikipedia,
102720                 uiIntro: uiIntro,
102721                 uiInfoPanels: uiInfoPanels,
102722                 uiPanelBackground: uiPanelBackground,
102723                 uiPanelHistory: uiPanelHistory,
102724                 uiPanelLocation: uiPanelLocation,
102725                 uiPanelMeasurement: uiPanelMeasurement,
102726                 uiSettingsCustomBackground: uiSettingsCustomBackground,
102727                 uiSettingsCustomData: uiSettingsCustomData,
102728                 uiInit: uiInit,
102729                 uiAccount: uiAccount,
102730                 uiAttribution: uiAttribution,
102731                 uiBackground: uiBackground,
102732                 uiBackgroundDisplayOptions: uiBackgroundDisplayOptions,
102733                 uiBackgroundOffset: uiBackgroundOffset,
102734                 uiChangesetEditor: uiChangesetEditor,
102735                 uiCmd: uiCmd,
102736                 uiCombobox: uiCombobox,
102737                 uiCommit: uiCommit,
102738                 uiCommitChanges: uiCommitChanges,
102739                 uiCommitWarnings: uiCommitWarnings,
102740                 uiConfirm: uiConfirm,
102741                 uiConflicts: uiConflicts,
102742                 uiContributors: uiContributors,
102743                 uiCurtain: uiCurtain,
102744                 uiDataEditor: uiDataEditor,
102745                 uiDataHeader: uiDataHeader,
102746                 uiDisclosure: uiDisclosure,
102747                 uiEditMenu: uiEditMenu,
102748                 uiEntityEditor: uiEntityEditor,
102749                 uiFeatureInfo: uiFeatureInfo,
102750                 uiFeatureList: uiFeatureList,
102751                 uiField: uiField,
102752                 uiFieldHelp: uiFieldHelp,
102753                 uiFlash: uiFlash,
102754                 uiFormFields: uiFormFields,
102755                 uiFullScreen: uiFullScreen,
102756                 uiGeolocate: uiGeolocate,
102757                 uiHelp: uiHelp,
102758                 uiImproveOsmComments: uiImproveOsmComments,
102759                 uiImproveOsmDetails: uiImproveOsmDetails,
102760                 uiImproveOsmEditor: uiImproveOsmEditor,
102761                 uiImproveOsmHeader: uiImproveOsmHeader,
102762                 uiInfo: uiInfo,
102763                 uiInspector: uiInspector,
102764                 uiKeepRightDetails: uiKeepRightDetails,
102765                 uiKeepRightEditor: uiKeepRightEditor,
102766                 uiKeepRightHeader: uiKeepRightHeader,
102767                 uiLasso: uiLasso,
102768                 uiLoading: uiLoading,
102769                 uiMapData: uiMapData,
102770                 uiMapInMap: uiMapInMap,
102771                 uiModal: uiModal,
102772                 uiNotice: uiNotice,
102773                 uiNoteComments: uiNoteComments,
102774                 uiNoteEditor: uiNoteEditor,
102775                 uiNoteHeader: uiNoteHeader,
102776                 uiNoteReport: uiNoteReport,
102777                 uiPresetEditor: uiPresetEditor,
102778                 uiPresetIcon: uiPresetIcon,
102779                 uiPresetList: uiPresetList,
102780                 uiQuickLinks: uiQuickLinks,
102781                 uiRadialMenu: uiRadialMenu,
102782                 uiRawMemberEditor: uiRawMemberEditor,
102783                 uiRawMembershipEditor: uiRawMembershipEditor,
102784                 uiRawTagEditor: uiRawTagEditor,
102785                 uiRestore: uiRestore,
102786                 uiScale: uiScale,
102787                 uiSelectionList: uiSelectionList,
102788                 uiSidebar: uiSidebar,
102789                 uiSourceSwitch: uiSourceSwitch,
102790                 uiSpinner: uiSpinner,
102791                 uiSplash: uiSplash,
102792                 uiStatus: uiStatus,
102793                 uiSuccess: uiSuccess,
102794                 uiTagReference: uiTagReference,
102795                 uiToggle: uiToggle,
102796                 uiTooltipHtml: uiTooltipHtml,
102797                 uiVersion: uiVersion,
102798                 uiViewOnOSM: uiViewOnOSM,
102799                 uiViewOnKeepRight: uiViewOnKeepRight,
102800                 uiZoom: uiZoom,
102801                 utilArrayChunk: utilArrayChunk,
102802                 utilArrayDifference: utilArrayDifference,
102803                 utilArrayFlatten: utilArrayFlatten,
102804                 utilArrayGroupBy: utilArrayGroupBy,
102805                 utilArrayIntersection: utilArrayIntersection,
102806                 utilArrayUnion: utilArrayUnion,
102807                 utilArrayUniq: utilArrayUniq,
102808                 utilArrayUniqBy: utilArrayUniqBy,
102809                 utilAsyncMap: utilAsyncMap,
102810                 utilCleanTags: utilCleanTags,
102811                 utilDetect: utilDetect,
102812                 utilDisplayName: utilDisplayName,
102813                 utilDisplayNameForPath: utilDisplayNameForPath,
102814                 utilDisplayType: utilDisplayType,
102815                 utilDisplayLabel: utilDisplayLabel,
102816                 utilEntityRoot: utilEntityRoot,
102817                 utilEditDistance: utilEditDistance,
102818                 utilEntitySelector: utilEntitySelector,
102819                 utilEntityOrMemberSelector: utilEntityOrMemberSelector,
102820                 utilEntityOrDeepMemberSelector: utilEntityOrDeepMemberSelector,
102821                 utilFastMouse: utilFastMouse,
102822                 utilFunctor: utilFunctor,
102823                 utilGetAllNodes: utilGetAllNodes,
102824                 utilGetSetValue: utilGetSetValue,
102825                 utilHashcode: utilHashcode,
102826                 utilHighlightEntities: utilHighlightEntities,
102827                 utilKeybinding: utilKeybinding,
102828                 utilNoAuto: utilNoAuto,
102829                 utilObjectOmit: utilObjectOmit,
102830                 utilPrefixCSSProperty: utilPrefixCSSProperty,
102831                 utilPrefixDOMProperty: utilPrefixDOMProperty,
102832                 utilPreset: utilPreset,
102833                 utilQsString: utilQsString,
102834                 utilRebind: utilRebind,
102835                 utilSetTransform: utilSetTransform,
102836                 utilSessionMutex: utilSessionMutex,
102837                 utilStringQs: utilStringQs,
102838                 utilTagDiff: utilTagDiff,
102839                 utilTagText: utilTagText,
102840                 utilTiler: utilTiler,
102841                 utilTriggerEvent: utilTriggerEvent,
102842                 utilWrap: utilWrap,
102843                 validationAlmostJunction: validationAlmostJunction,
102844                 validationCloseNodes: validationCloseNodes,
102845                 validationCrossingWays: validationCrossingWays,
102846                 validationDisconnectedWay: validationDisconnectedWay,
102847                 validationFixmeTag: validationFixmeTag,
102848                 validationGenericName: validationGenericName,
102849                 validationImpossibleOneway: validationImpossibleOneway,
102850                 validationIncompatibleSource: validationIncompatibleSource,
102851                 validationFormatting: validationFormatting,
102852                 validationMaprules: validationMaprules,
102853                 validationMissingRole: validationMissingRole,
102854                 validationMissingTag: validationMissingTag,
102855                 validationOutdatedTags: validationOutdatedTags,
102856                 validationPrivateData: validationPrivateData,
102857                 validationTagSuggestsArea: validationTagSuggestsArea,
102858                 validationUnsquareWay: validationUnsquareWay
102859         });
102860
102861         // polyfill requestIdleCallback
102862         window.requestIdleCallback = window.requestIdleCallback ||
102863             function(cb) {
102864                 var start = Date.now();
102865                 return window.requestAnimationFrame(function() {
102866                     cb({
102867                         didTimeout: false,
102868                         timeRemaining: function() {
102869                             return Math.max(0, 50 - (Date.now() - start));
102870                         }
102871                     });
102872                 });
102873             };
102874
102875         window.cancelIdleCallback = window.cancelIdleCallback ||
102876             function(id) {
102877                 window.cancelAnimationFrame(id);
102878             };
102879         window.iD = iD;
102880
102881 }());
102882 //# sourceMappingURL=iD.js.map